# HG changeset patch # User Thierry Florac # Date 1495121028 -7200 # Node ID c73bb834ccbeb1f91b110f5623d37186ab1c5b2d First release diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,62 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +from fanstatic import Library, Resource +from pyams_utils.fanstatic import ExternalResource + + +from pyramid.i18n import TranslationStringFactory +_ = TranslationStringFactory('pyams_gis') + + +library = Library('pyams_gis', 'resources') + +leaflet_css = Resource(library, 'css/leaflet-1.0.3.css', + minified='css/leaflet-1.0.3.min.css') + +leaflet = Resource(library, 'js/leaflet-1.0.3.js', + minified='js/leaflet-1.0.3.min.js', + depends=[leaflet_css, ], + bottom=True) + +leaflet_gp = Resource(library, 'js/leaflet-gp-3.0.2.js', + minified='js/leaflet-gp-3.0.2.min.js', + depends=[leaflet, ], + bottom=True) + +leaflet_esri = Resource(library, 'js/leaflet-esri-2.0.8.js', + minified='js/leaflet-esri-2.0.8.min.js', + depends=[leaflet, ], + bottom=True) + +leaflet_google = ExternalResource(library, 'https://maps.googleapis.com/maps/api/js', + bottom=True) + +leaflet_google_mutant = Resource(library, 'js/leaflet-google-mutant.js', + minified='js/leaflet-google-mutant.min.js', + depends=[leaflet, ], + bottom=True) + +pyams_gis = Resource(library, 'js/pyams_gis.js', + minified='js/pyams_gis.min.js', + depends=[leaflet, ], + bottom=True) + + +def includeme(config): + """Pyramid include""" + + from .include import include_package + include_package(config) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/area.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/area.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +try: + from osgeo.osr import SpatialReference, CoordinateTransformation + have_gdal = True +except ImportError: + have_gdal = False +from persistent import Persistent + +# import interfaces +from pyams_gis.interfaces import WGS84, IGeoArea + +# import packages +from zope.interface import implementer +from zope.schema.fieldproperty import FieldProperty + + +@implementer(IGeoArea) +class GeoArea(Persistent): + """GeoArea attribute object""" + + x1 = FieldProperty(IGeoArea['x1']) + y1 = FieldProperty(IGeoArea['y1']) + x2 = FieldProperty(IGeoArea['x2']) + y2 = FieldProperty(IGeoArea['y2']) + projection = FieldProperty(IGeoArea['projection']) + + def __bool__(self): + return bool(self.x1 and self.y1 and self.x2 and self.y2) + + def get_coordinates(self, projection=WGS84): + if projection == self.projection: + return (self.x1, self.y1), (self.x2, self.y2) + if (not have_gdal) or not self: + return None, None + source = SpatialReference() + source.ImportFromEPSG(self.projection) + destination = SpatialReference() + destination.ImportFromEPSG(projection) + transformation = CoordinateTransformation(source, destination) + return transformation.TransformPoint(float(self.x1), float(self.y1))[0:2], \ + transformation.TransformPoint(float(self.x2), float(self.y2))[0:2] + + @property + def wgs_coordinates(self): + return self.get_coordinates(WGS84) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/configuration.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/configuration.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,95 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.configuration import IMapConfiguration, IMapConfigurationTarget +from zope.annotation.interfaces import IAnnotations + +# import packages +from persistent import Persistent +from pyams_utils.adapter import adapter_config +from pyramid.threadlocal import get_current_registry +from zope.container.contained import Contained +from zope.interface import implementer +from zope.lifecycleevent import ObjectCreatedEvent +from zope.location import locate +from zope.schema.fieldproperty import FieldProperty + + +@implementer(IMapConfiguration) +class MapConfiguration(Persistent, Contained): + """Map configuration persistent class""" + + crs = FieldProperty(IMapConfiguration['crs']) + layers = FieldProperty(IMapConfiguration['layers']) + attribution_control = FieldProperty(IMapConfiguration['attribution_control']) + zoom_control = FieldProperty(IMapConfiguration['zoom_control']) + layer_control = FieldProperty(IMapConfiguration['layer_control']) + initial_center = FieldProperty(IMapConfiguration['initial_center']) + zoom_level = FieldProperty(IMapConfiguration['zoom_level']) + initial_bounds = FieldProperty(IMapConfiguration['initial_bounds']) + keyboard = FieldProperty(IMapConfiguration['keyboard']) + scroll_wheel_zoom = FieldProperty(IMapConfiguration['scroll_wheel_zoom']) + + def get_configuration(self): + result = { + 'crs': self.crs, + 'attributionControl': self.attribution_control, + 'zoomControl': self.zoom_control, + 'layerControl': self.layer_control, + 'keyboard': self.keyboard, + 'scrollWheelZoom': self.scroll_wheel_zoom + } + if self.initial_center: + gps_location = self.initial_center.wgs_coordinates + result['center'] = {'lat': float(gps_location[1]), + 'lon': float(gps_location[0])} + result['zoom'] = self.zoom_level + elif self.initial_bounds: + point1, point2 = self.initial_bounds.wgs_coordinates + result['bounds'] = [{'lat': float(point1[1]), + 'lon': float(point1[0])}, + {'lat': float(point2[1]), + 'lon': float(point2[0])}] + else: + # Near center default location + result['center'] = {'lat': 45, + 'lon': 5.0} + result['zoom'] = 2 + if self.layers: + layers = [] + for name in self.layers: + layer = self.__parent__.get(name) + if layer is not None: + layers.append(layer.get_configuration()) + result['layers'] = layers + return result + + +MAP_CONFIGURATION_KEY = 'pyams_gis.map.configuration' + + +@adapter_config(context=IMapConfigurationTarget, provides=IMapConfiguration) +def MapConfigurationFactory(context): + """Map configuration factory""" + annotations = IAnnotations(context) + configuration = annotations.get(MAP_CONFIGURATION_KEY) + if configuration is None: + configuration = annotations[MAP_CONFIGURATION_KEY] = MapConfiguration() + get_current_registry().notify(ObjectCreatedEvent(configuration)) + locate(configuration, context) + return configuration diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/doctests/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/doctests/README.txt Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,3 @@ +================= +pyams_gis package +================= diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/include.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/include.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,38 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces + +# import packages + + +def include_package(config): + """Pyramid include""" + + # add translations + config.add_translation_dirs('pyams_gis:locales') + + # define JSON-RPC endpoint + config.add_jsonrpc_endpoint('gis', '/api/gis/json') + + # load registry components + try: + import pyams_zmi + except ImportError: + config.scan(ignore='pyams_gis.zmi') + else: + config.scan() diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/interfaces/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/interfaces/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,126 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces + +# import packages +from pyams_utils.schema import DottedDecimalField +from zope.interface import invariant, Interface, Invalid, Attribute +from zope.schema import Choice +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm + +from pyams_gis import _ + + +WGS84 = 4326 +WGS84WM = 3857 +RGF93 = 2154 +LAMBERT_IIE = 27572 +UTM_20N = 4559 +UTM_22N = 2972 +UTM_38S = 4471 +UTM_40S = 2975 + +COORDINATES_PROJECTIONS = {WGS84: _("WGS84 (GPS)"), + WGS84WM: _("WGS84 Web Mercator"), + RGF93: _("Lambert 93 (Metropolitan France)"), + LAMBERT_IIE: _("Extended Lambert II (Metropolitan France)"), + UTM_20N: _("UTM Zone 20N (Martinique, Guadeloupe)"), + UTM_22N: _("UTM Zone 22N (Guyane)"), + UTM_38S: _("UTM Zone 38S (Mayotte)"), + UTM_40S: _("UTM Zone 40S (La Réunion)")} + +COORDINATES_PROJECTION_VOCABULARY = SimpleVocabulary(sorted([SimpleTerm(v, title=t) + for v, t in COORDINATES_PROJECTIONS.items()], + key=lambda x: x.title)) + +LAYER_CRS = {WGS84: 'L.CRS.EPSG4326', + WGS84WM: 'L.CRS.EPSG3857', + RGF93: 'L.geoportalCRS.EPSG2154', + LAMBERT_IIE: 'L.geoportalCRS.EPSG27572'} + +LAYER_CRS_VOCABULARY = SimpleVocabulary([SimpleTerm(t, title=COORDINATES_PROJECTIONS[v]) + for v, t in LAYER_CRS.items()]) + + +class IGeoPoint(Interface): + """GeoPoint attribute interface""" + + longitude = DottedDecimalField(title=_("Longitude"), + required=False) + + latitude = DottedDecimalField(title=_("Latitude"), + required=False) + + projection = Choice(title=_("Projection system"), + vocabulary=COORDINATES_PROJECTION_VOCABULARY, + default=WGS84, + required=False) + + @invariant + def check_coordinates(self): + data = set(map(bool, (self.longitude, self.latitude))) + if len(data) == 2: + raise Invalid(_("You must set longitude and latitude, or None!")) + if self.longitude and not self.projection: + raise Invalid(_("You can't set coordinates without setting projection!")) + + def get_coordinates(self, projection=WGS84): + """Get coordinates translated to given projection""" + + wgs_coordinates = Attribute("Coordinates tuple in WGS84 projection") + + +class IGeoPointZ(IGeoPoint): + """GeoPointZ attribute interface""" + + altitude = DottedDecimalField(title=_("Altitude"), + required=False) + + +class IGeoArea(Interface): + """Geographic area defined by a rectangle""" + + x1 = DottedDecimalField(title=_("West limit"), + required=False) + + y1 = DottedDecimalField(title=_("South limit"), + required=False) + + x2 = DottedDecimalField(title=_("East limit"), + required=False) + + y2 = DottedDecimalField(title=_("North limit"), + required=False) + + projection = Choice(title=_("Projection system"), + vocabulary=COORDINATES_PROJECTION_VOCABULARY, + default=WGS84, + required=False) + + @invariant + def check_coordinates(self): + data = set(map(bool, (self.x1, self.x2, self.y1, self.y2))) + if len(data) == 2: + raise Invalid(_("You must set all coordinates or None!")) + if self.x1 and not self.projection: + raise Invalid(_("You can't set coordinates without setting projection!")) + + def get_coordinates(self, projection=WGS84): + """Get coordinates translated to given projection""" + + wgs_coordinates = Attribute("Coordinates in WGS84 projection") diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/interfaces/configuration.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/interfaces/configuration.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,88 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces import LAYER_CRS, LAYER_CRS_VOCABULARY, WGS84WM + +# import packages +from pyams_gis.schema import GeoPointField, GeoAreaField +from zope.interface import Interface +from zope.schema import Choice, Bool, Int, List + +from pyams_gis import _ + + +class IMapConfiguration(Interface): + """Map configuration interface""" + + crs = Choice(title=_("CRS"), + description=_("Coordinates reference system to use for the map"), + vocabulary=LAYER_CRS_VOCABULARY, + default=LAYER_CRS[WGS84WM], + required=True) + + layers = List(title=_("Layers list"), + description=_("List of available layers displayed into this map"), + value_type=Choice(vocabulary='PyAMS map layers'), + required=False) + + attribution_control = Bool(title=_("Attribution control?"), + description=_("If 'yes', an attribution control is added to map"), + required=True, + default=True) + + zoom_control = Bool(title=_("Zoom control?"), + description=_("If 'yes', a zoom control is added to map"), + required=True, + default=True) + + layer_control = Bool(title=_("Layers control?"), + description=_("If 'yes', a layer selection control is added to map"), + required=True, + default=False) + + initial_center = GeoPointField(title=_("Initial center"), + description=_("Initial map location center"), + required=False) + + zoom_level = Int(title=_("Initial zoom level"), + description=_("Zoom level at which to display map"), + min=0, + max=18, + required=False) + + initial_bounds = GeoAreaField(title=_("Initial bounds"), + description=_("Initial map location bounds"), + required=False) + + keyboard = Bool(title=_("Keyboard navigation?"), + description=_("If 'yes', makes the map focusable and allows users to navigate with " + "keyboard arrows and +/- keys"), + required=True, + default=True) + + scroll_wheel_zoom = Bool(title=_("Scroll wheel zoom?"), + description=_("If 'yes', the map can be zoomed using the mouse wheel"), + required=True, + default=True) + + def get_configuration(self): + """Get map layers configuration""" + + +class IMapConfigurationTarget(Interface): + """Map configuration target marker interface""" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/interfaces/layer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/interfaces/layer.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,181 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces import LAYER_CRS_VOCABULARY +from zope.annotation.interfaces import IAttributeAnnotatable +from zope.location.interfaces import IContained + +# import packages +from pyams_gis.schema import GeoAreaField +from pyams_i18n.schema import I18nTextLineField +from zope.interface import Attribute +from zope.schema import Bool, Choice, Int, TextLine +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm + +from pyams_gis import _ + + +# +# Leaflet map layers interfaces +# + +class IMapLayer(IContained, IAttributeAnnotatable): + """Base map layer interface""" + + factory = Attribute(_("Layer factory name")) + + depends = Attribute(_("List of layer factory dependent objects")) + + name = TextLine(title=_("Layer name"), + required=True) + + layer_type = Attribute(_("Layer type")) + + title = I18nTextLineField(title=_("Layer title"), + description=_("Full layer title"), + required=True) + + min_zoom = Int(title=_("Minimum zoom level"), + description=_("Minimum zoom level at which layer is displayed"), + default=0, + required=True) + + max_zoom = Int(title=_("Maximum zoom level"), + description=_("Maximum zoom level at which layer is displayed"), + default=18, + required=True) + + def get_configuration(self): + """Get layer configuration mapping""" + + +class IBaseTileMapLayer(IMapLayer): + """Base tile map layer interface""" + + attribution = TextLine(title=_("Layer attribution"), + description=_("String used by the attribution control"), + required=False) + + bounds = GeoAreaField(title=_("Layer bounds"), + description=_("Geographical bounds into which layer tiles are displayed"), + required=False) + + +class ITileMapLayer(IBaseTileMapLayer): + """Tile map layer interface""" + + url = TextLine(title=_("URL template"), + description=_("URL template used to get layer tiles (see leaflet.js docs)"), + default='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + required=True) + + +class IWMSMapLayer(ITileMapLayer): + """WMS map layer interface""" + + crs = Choice(title=_("CRS"), + description=_("Coordinates reference system to use for map requests; defaults to map request"), + vocabulary=LAYER_CRS_VOCABULARY, + required=False) + + layers = TextLine(title=_("Layers"), + description=_("Comma-separated list of WMS layers to show"), + required=False) + + styles = TextLine(title=_("Styles"), + description=_("Comma-separated list of WMS styles"), + required=False) + + format = TextLine(title=_("Layer format"), + description=_("WMS image format; use 'image/png' for layers with transparency"), + required=True, + default='image/png') + + transparent = Bool(title=_("Transparent?"), + description=_("If 'yes', the WMS services will return images with transparency"), + required=True, + default=False) + + version = TextLine(title=_("Version"), + description=_("Version of the WMS service to use"), + required=True, + default='1.1.1') + + uppercase = Bool(title=_("Uppercase?"), + description=_("If 'yes', WMS request parameters keys will be uppercase"), + required=True, + default=False) + + +class IGeoportalMapLayer(IBaseTileMapLayer): + """French IGN map layer interface""" + + api_key = TextLine(title=_("API key"), + description=_("Key used to access layer data"), + required=True) + + layer_name = TextLine(title=_("IGN layer name"), + description=_("Name of layer in IGN format"), + required=True) + + crs = Choice(title=_("CRS"), + description=_("Coordinates reference system to use for map requests; defaults to map request"), + vocabulary=LAYER_CRS_VOCABULARY, + required=False) + + +class IEsriBaseMapLayer(ITileMapLayer): + """ESRI map layer interface""" + + +class IEsriFeatureMapLayer(IMapLayer): + """ESRI feature layer interface""" + + url = TextLine(title=_("Layer URL"), + description=_("URL used to get the feature layer"), + required=True) + + token = TextLine(title=_("Token"), + description=_("Token used in all service requests"), + required=False) + + where = TextLine(title=_("Where condition"), + description=_("Optional expression used to filter features"), + required=False) + + +GOOGLE_MAP_TYPES = {'roadmap': _("Roads map"), + 'satellite': _("Satellite"), + 'hybrid': _("Hybrid"), + 'terrain': _("Terrain")} + +GOOGLE_MAP_TYPES_VOCABULARY = SimpleVocabulary([SimpleTerm(v, title=t) for v, t in GOOGLE_MAP_TYPES.items()]) + + +class IGoogleMapLayer(IMapLayer): + """Google Maps layer""" + + api_key = TextLine(title=_("API key"), + description=_("Google API key used to access maps data"), + required=True) + + type = Choice(title=_("Map type"), + description=_("Type of GoogleMaps layer type"), + vocabulary=GOOGLE_MAP_TYPES_VOCABULARY, + default='roadmap', + required=True) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/interfaces/utility.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/interfaces/utility.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,31 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.layer import IMapLayer +from zope.annotation import IAttributeAnnotatable +from zope.container.interfaces import IContainer + +# import packages +from zope.container.constraints import contains + + +class IMapManager(IContainer, IAttributeAnnotatable): + """Map manager interface""" + + contains(IMapLayer) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/interfaces/widget.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/interfaces/widget.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from z3c.form.interfaces import IObjectWidget + + +# import packages + + +class IGeoPointWidget(IObjectWidget): + """GeoPoint widget interface""" + + +class IGeoPointZWidget(IObjectWidget): + """GeoPointZ widget interface""" + + +class IGeoAreaWidget(IObjectWidget): + """GeoArea widget interface""" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/layer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/layer.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,177 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.layer import IMapLayer, IBaseTileMapLayer, ITileMapLayer, IWMSMapLayer, IGeoportalMapLayer, \ + IEsriFeatureMapLayer, IGoogleMapLayer +from pyams_i18n.interfaces import II18n + +# import packages +from persistent import Persistent +from pyams_gis import leaflet_gp, leaflet_esri, leaflet_google_mutant +from pyams_utils.dict import update_dict +from pyams_utils.fanstatic import get_resource_path +from zope.container.contained import Contained +from zope.interface import implementer +from zope.schema.fieldproperty import FieldProperty + +from pyams_gis import _ + + +class MapLayer(Persistent, Contained): + """Base tile map layer persistent class""" + + factory = None + depends = {} + layer_type = None + + name = FieldProperty(IMapLayer['name']) + title = FieldProperty(IMapLayer['title']) + min_zoom = FieldProperty(IMapLayer['min_zoom']) + max_zoom = FieldProperty(IMapLayer['max_zoom']) + + def get_configuration(self): + """Get configuration mapping""" + result = {'name': self.name, + 'title': II18n(self).query_attribute('title')} + update_dict(result, 'factory', self.factory) + update_dict(result, 'minZoom', self.min_zoom) + update_dict(result, 'maxZoom', self.max_zoom) + if self.depends: + depends = {} + for name, resource in self.depends.items(): + depends[name] = get_resource_path(resource) + update_dict(result, 'dependsOn', depends) + return result + + +class BaseTileMapLayer(MapLayer): + """Base tile map layer""" + + attribution = FieldProperty(IBaseTileMapLayer['attribution']) + bounds = FieldProperty(IBaseTileMapLayer['bounds']) + + def get_configuration(self): + result = super(BaseTileMapLayer, self).get_configuration() + update_dict(result, 'attribution', self.attribution) + if self.bounds: + point1, point2 = self.bounds.wgs_coordinates + result['bounds'] = [{'lat': float(point1[1]), + 'lon': float(point1[0])}, + {'lat': float(point2[1]), + 'lon': float(point2[0])}] + return result + + +@implementer(ITileMapLayer) +class TileMapLayer(BaseTileMapLayer): + """Base tile map layer persistent class""" + + factory = 'PyAMS_GIS.factory.TileLayer' + layer_type = _("Tile") + + url = FieldProperty(ITileMapLayer['url']) + + def get_configuration(self): + result = super(TileMapLayer, self).get_configuration() + update_dict(result, 'url', self.url) + return result + + +@implementer(IWMSMapLayer) +class WMSMapLayer(TileMapLayer): + """WMS map mayer persistent class""" + + factory = 'PyAMS_GIS.factory.WMS' + layer_type = _("WMS") + + crs = FieldProperty(IWMSMapLayer['crs']) + layers = FieldProperty(IWMSMapLayer['layers']) + styles = FieldProperty(IWMSMapLayer['styles']) + format = FieldProperty(IWMSMapLayer['format']) + transparent = FieldProperty(IWMSMapLayer['transparent']) + version = FieldProperty(IWMSMapLayer['version']) + uppercase = FieldProperty(IWMSMapLayer['uppercase']) + + def get_configuration(self): + result = super(WMSMapLayer, self).get_configuration() + update_dict(result, 'crs', self.crs) + update_dict(result, 'layers', self.layers) + update_dict(result, 'styles', self.styles) + update_dict(result, 'format', self.format) + update_dict(result, 'transparent', self.transparent) + update_dict(result, 'version', self.version) + update_dict(result, 'uppercase', self.uppercase) + return result + + +@implementer(IGeoportalMapLayer) +class GeoportalMapLayer(BaseTileMapLayer): + """Geoportal map layer persistent class""" + + factory = 'PyAMS_GIS.factory.Geoportal.WMS' + depends = {'L.geoportalLayer.WMS': leaflet_gp} + layer_type = _("Geoportal") + + api_key = FieldProperty(IGeoportalMapLayer['api_key']) + layer_name = FieldProperty(IGeoportalMapLayer['layer_name']) + crs = FieldProperty(IGeoportalMapLayer['crs']) + + def get_configuration(self): + result = super(GeoportalMapLayer, self).get_configuration() + update_dict(result, 'apiKey', self.api_key) + update_dict(result, 'layer', self.layer_name) + update_dict(result, 'crs', self.crs) + return result + + +@implementer(IEsriFeatureMapLayer) +class EsriFeatureMapLayer(MapLayer): + """ESRI feature map layer""" + + factory = 'PyAMS_GIS.factory.ESRI.Feature' + depends = {'L.esri.featureLayer': leaflet_esri} + layer_type = _("ESRI Features") + + url = FieldProperty(IEsriFeatureMapLayer['url']) + token = FieldProperty(IEsriFeatureMapLayer['token']) + where = FieldProperty(IEsriFeatureMapLayer['where']) + + def get_configuration(self): + result = super(EsriFeatureMapLayer, self).get_configuration() + update_dict(result, 'url', self.url) + update_dict(result, 'token', self.token) + update_dict(result, 'where', self.where) + return result + + +@implementer(IGoogleMapLayer) +class GoogleMapLayer(MapLayer): + """Google maps layer""" + + factory = 'PyAMS_GIS.factory.Google' + depends = {'L.gridLayer.googleMutant': leaflet_google_mutant} + layer_type = _("Google") + + api_key = FieldProperty(IGoogleMapLayer['api_key']) + type = FieldProperty(IGoogleMapLayer['type']) + + def get_configuration(self): + result = super(GoogleMapLayer, self).get_configuration() + update_dict(result, 'apiKey', self.api_key) + update_dict(result, 'type', self.type) + return result diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.mo Binary file src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.mo has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/locales/fr/LC_MESSAGES/pyams_gis.po Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,516 @@ +# +# French translations for PACKAGE package +# This file is distributed under the same license as the PACKAGE package. +# Thierry Florac , 2017. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE 1.0\n" +"POT-Creation-Date: 2017-05-18 15:57+0200\n" +"PO-Revision-Date: 2017-05-18 14:39+0200\n" +"Last-Translator: Thierry Florac \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Lingua 3.8\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: src/pyams_gis/layer.py:85 +msgid "Tile" +msgstr "Tuiles" + +#: src/pyams_gis/layer.py:100 +msgid "WMS" +msgstr "WMS" + +#: src/pyams_gis/layer.py:128 +msgid "Geoportal" +msgstr "Géoportail" + +#: src/pyams_gis/layer.py:148 +msgid "ESRI Features" +msgstr "Feature ESRI" + +#: src/pyams_gis/layer.py:172 +msgid "Google" +msgstr "Google" + +#: src/pyams_gis/widget/templates/geoarea-input.pt:7 +msgid "Remove area settings" +msgstr "Supprimer l'emprise" + +#: src/pyams_gis/widget/templates/geoarea-input.pt:13 +msgid "Select area from map" +msgstr "Sélectionner l'emprise à partir d'une carte" + +#: src/pyams_gis/widget/templates/geoarea-input.pt:33 +msgid "Select map area" +msgstr "Sélection d'une emprise cartographique" + +#: src/pyams_gis/widget/templates/geopoint-input.pt:7 +msgid "Remove position settings" +msgstr "Supprimer la position" + +#: src/pyams_gis/widget/templates/geopoint-input.pt:13 +msgid "Select location from map" +msgstr "Sélectionner la position à partir d'une carte" + +#: src/pyams_gis/widget/templates/geopoint-input.pt:33 +msgid "Select marker position" +msgstr "Sélection d'une position" + +#: src/pyams_gis/zmi/layer.py:68 +msgid "Add tile layer..." +msgstr "Ajouter une couche tuilée..." + +#: src/pyams_gis/zmi/layer.py:80 src/pyams_gis/zmi/layer.py:157 +#: src/pyams_gis/zmi/layer.py:234 src/pyams_gis/zmi/layer.py:311 +#: src/pyams_gis/zmi/layer.py:388 src/pyams_gis/zmi/utility.py:76 +#: src/pyams_gis/zmi/utility.py:165 src/pyams_gis/zmi/utility.py:186 +msgid "Maps manager" +msgstr "Gestionnaire de cartes" + +#: src/pyams_gis/zmi/layer.py:81 +msgid "Add tile layer" +msgstr "Ajout d'une couche tuilée" + +#: src/pyams_gis/zmi/layer.py:115 src/pyams_gis/zmi/layer.py:192 +#: src/pyams_gis/zmi/layer.py:269 src/pyams_gis/zmi/layer.py:346 +#: src/pyams_gis/zmi/layer.py:423 +msgid "Edit layer properties" +msgstr "Propriétés d'une couche" + +#: src/pyams_gis/zmi/layer.py:145 +msgid "Add WMS layer..." +msgstr "Ajouter une couche WMS..." + +#: src/pyams_gis/zmi/layer.py:158 +msgid "Add WMS layer" +msgstr "Ajout d'une couche WMS" + +#: src/pyams_gis/zmi/layer.py:222 +msgid "Add Geoportal WMS layer..." +msgstr "Ajouter une couche WMS du Géoportail..." + +#: src/pyams_gis/zmi/layer.py:235 +msgid "Add IGN Geoportal layer" +msgstr "Ajout d'une couche WMS du Géoportail" + +#: src/pyams_gis/zmi/layer.py:299 +msgid "Add ESRI feature layer..." +msgstr "Ajouter une FeatureLayer ESRI..." + +#: src/pyams_gis/zmi/layer.py:312 +msgid "Add ESRI feature layer" +msgstr "Ajout d'une FeatureLayer ESRI" + +#: src/pyams_gis/zmi/layer.py:376 +msgid "Add Google Maps layer..." +msgstr "Ajouter une couche Google Maps..." + +#: src/pyams_gis/zmi/layer.py:389 +msgid "Add Google Maps layer" +msgstr "Ajout d'une couche Google Maps" + +#: src/pyams_gis/zmi/layer.py:55 +msgid "Specified layer name already exists!" +msgstr "Le nom indiqué pour cette couche existe déjà !" + +#: src/pyams_gis/zmi/utility.py:85 +msgid "Map manager layers" +msgstr "Couches du gestionnaire de cartes" + +#: src/pyams_gis/zmi/utility.py:104 +msgid "Name" +msgstr "Nom" + +#: src/pyams_gis/zmi/utility.py:113 +msgid "Type" +msgstr "Type" + +#: src/pyams_gis/zmi/utility.py:125 +msgid "Title" +msgstr "Titre" + +#: src/pyams_gis/zmi/utility.py:135 +msgid "Delete layer" +msgstr "Supprimer la couche" + +#: src/pyams_gis/zmi/utility.py:164 +msgid "Control panel" +msgstr "Panneau de configuration" + +#: src/pyams_gis/zmi/utility.py:173 +msgid "Configuration..." +msgstr "Configuration..." + +#: src/pyams_gis/zmi/utility.py:187 +msgid "Default map configuration" +msgstr "Configuration des cartes par défaut" + +#: src/pyams_gis/zmi/utility.py:215 +msgid "No provided object_name argument!" +msgstr "L'argument 'object_name' n'a pas été fourni !" + +#: src/pyams_gis/zmi/utility.py:219 +msgid "Given layer name doesn't exist!" +msgstr "Le nom de couche indiqué n'existe pas !" + +#: src/pyams_gis/interfaces/configuration.py:32 +#: src/pyams_gis/interfaces/layer.py:91 src/pyams_gis/interfaces/layer.py:136 +msgid "CRS" +msgstr "CRS" + +#: src/pyams_gis/interfaces/configuration.py:33 +msgid "Coordinates reference system to use for the map" +msgstr "Système de coordonnées de référence à utiliser pour cette carte" + +#: src/pyams_gis/interfaces/configuration.py:38 +msgid "Layers list" +msgstr "Liste des couches" + +#: src/pyams_gis/interfaces/configuration.py:39 +msgid "List of available layers displayed into this map" +msgstr "Liste des couches dispopnibles à intégrer dans cette carte" + +#: src/pyams_gis/interfaces/configuration.py:43 +msgid "Attribution control?" +msgstr "Attribution ?" + +#: src/pyams_gis/interfaces/configuration.py:44 +msgid "If 'yes', an attribution control is added to map" +msgstr "Si 'oui', un contrôle d'attribution sera ajouté à la carte" + +#: src/pyams_gis/interfaces/configuration.py:48 +msgid "Zoom control?" +msgstr "Contrôle de zoom ?" + +#: src/pyams_gis/interfaces/configuration.py:49 +msgid "If 'yes', a zoom control is added to map" +msgstr "Si 'oui', un contrôle de zoom sera ajouté à la carte" + +#: src/pyams_gis/interfaces/configuration.py:53 +msgid "Layers control?" +msgstr "Sélecteur de couches ?" + +#: src/pyams_gis/interfaces/configuration.py:54 +msgid "If 'yes', a layer selection control is added to map" +msgstr "Si 'oui', un sélecteur de couches sera ajouté à la carte" + +#: src/pyams_gis/interfaces/configuration.py:58 +msgid "Initial center" +msgstr "Position initiale" + +#: src/pyams_gis/interfaces/configuration.py:59 +msgid "Initial map location center" +msgstr "Localisation initiale du centre de la carte" + +#: src/pyams_gis/interfaces/configuration.py:62 +msgid "Initial zoom level" +msgstr "Niveau de zoom" + +#: src/pyams_gis/interfaces/configuration.py:63 +msgid "Zoom level at which to display map" +msgstr "Niveau de zoom initial auquel sera affichée la carte" + +#: src/pyams_gis/interfaces/configuration.py:68 +msgid "Initial bounds" +msgstr "Emprise initiale" + +#: src/pyams_gis/interfaces/configuration.py:69 +msgid "Initial map location bounds" +msgstr "Emprise initiale de la carte" + +#: src/pyams_gis/interfaces/configuration.py:72 +msgid "Keyboard navigation?" +msgstr "Navigation au clavier ?" + +#: src/pyams_gis/interfaces/configuration.py:73 +msgid "" +"If 'yes', makes the map focusable and allows users to navigate with keyboard " +"arrows and +/- keys" +msgstr "" +"Si 'oui', la carte peut prendre le focus et l'utilisateur peut naviguer dans " +"la carte au clavier à l'aide des flèches de direction et des touches +/-" + +#: src/pyams_gis/interfaces/configuration.py:78 +msgid "Scroll wheel zoom?" +msgstr "Zoom à la molette ?" + +#: src/pyams_gis/interfaces/configuration.py:79 +msgid "If 'yes', the map can be zoomed using the mouse wheel" +msgstr "" +"Si 'oui', le niveau de zoom de la carte peut être modifié en utilisant la " +"molette de la souris" + +#: src/pyams_gis/interfaces/layer.py:172 +msgid "Roads map" +msgstr "Carte des routes" + +#: src/pyams_gis/interfaces/layer.py:173 +msgid "Satellite" +msgstr "Image satellite" + +#: src/pyams_gis/interfaces/layer.py:174 +msgid "Hybrid" +msgstr "Vue hybride" + +#: src/pyams_gis/interfaces/layer.py:175 +msgid "Terrain" +msgstr "Vue topographique" + +#: src/pyams_gis/interfaces/layer.py:40 +msgid "Layer factory name" +msgstr "Nom de la fabrique de la couche" + +#: src/pyams_gis/interfaces/layer.py:42 +msgid "List of layer factory dependent objects" +msgstr "Liste des ressources dont dépend la couche" + +#: src/pyams_gis/interfaces/layer.py:47 +msgid "Layer type" +msgstr "Type de couche" + +#: src/pyams_gis/interfaces/layer.py:44 +msgid "Layer name" +msgstr "Nom de la couche" + +#: src/pyams_gis/interfaces/layer.py:49 +msgid "Layer title" +msgstr "Libellé de la couche" + +#: src/pyams_gis/interfaces/layer.py:50 +msgid "Full layer title" +msgstr "Désignation complète de la couche" + +#: src/pyams_gis/interfaces/layer.py:60 +msgid "Layer attribution" +msgstr "Attribution de la couche" + +#: src/pyams_gis/interfaces/layer.py:61 +msgid "String used by the attribution control" +msgstr "Texte affiché par le contrôle d'attribution de la carte" + +#: src/pyams_gis/interfaces/layer.py:64 src/pyams_gis/interfaces/layer.py:161 +msgid "Minimum zoom level" +msgstr "Zoom minimum" + +#: src/pyams_gis/interfaces/layer.py:65 src/pyams_gis/interfaces/layer.py:162 +msgid "Minimum zoom level at which layer is displayed" +msgstr "Niveau de zoom minimum auquel la carte est affichée" + +#: src/pyams_gis/interfaces/layer.py:69 src/pyams_gis/interfaces/layer.py:166 +msgid "Maximum zoom level" +msgstr "Zoom maximum" + +#: src/pyams_gis/interfaces/layer.py:70 src/pyams_gis/interfaces/layer.py:167 +msgid "Maximum zoom level at which layer is displayed" +msgstr "Niveau de zoom maximum auquel la carte est affichée" + +#: src/pyams_gis/interfaces/layer.py:74 +msgid "Layer bounds" +msgstr "Emprise de la couche" + +#: src/pyams_gis/interfaces/layer.py:75 +msgid "Geographical bounds into which layer tiles are displayed" +msgstr "" +"Emprise géographique au sein de laquelle les tuiles de la couche sont " +"affichées" + +#: src/pyams_gis/interfaces/layer.py:82 +msgid "URL template" +msgstr "Modèle d'URL" + +#: src/pyams_gis/interfaces/layer.py:83 +msgid "URL template used to get layer tiles (see leaflet.js docs)" +msgstr "" +"Modèle d'URL utilisée pour accéder aux tuiles (voir la documentation de " +"Leaflet)" + +#: src/pyams_gis/interfaces/layer.py:92 src/pyams_gis/interfaces/layer.py:137 +msgid "" +"Coordinates reference system to use for map requests; defaults to map request" +msgstr "" +"Système de coordonnées de référence à utiliser pour les requêtes effectuées " +"sur cette couche ; par défaut le même que celui de la carte" + +#: src/pyams_gis/interfaces/layer.py:96 +msgid "Layers" +msgstr "Couches" + +#: src/pyams_gis/interfaces/layer.py:97 +msgid "Comma-separated list of WMS layers to show" +msgstr "Liste des couches WMS à afficher, séparées par des points-virgules" + +#: src/pyams_gis/interfaces/layer.py:100 +msgid "Styles" +msgstr "Styles" + +#: src/pyams_gis/interfaces/layer.py:101 +msgid "Comma-separated list of WMS styles" +msgstr "Liste des styles WMS, séparés par des points-virgules" + +#: src/pyams_gis/interfaces/layer.py:104 +msgid "Layer format" +msgstr "Format d'image" + +#: src/pyams_gis/interfaces/layer.py:105 +msgid "WMS image format; use 'image/png' for layers with transparency" +msgstr "" +"Format d'image WMS ; utiliser 'image/png' pour les couches avec transparence" + +#: src/pyams_gis/interfaces/layer.py:109 +msgid "Transparent?" +msgstr "Transparence ?" + +#: src/pyams_gis/interfaces/layer.py:110 +msgid "If 'yes', the WMS services will return images with transparency" +msgstr "Si 'oui', le service WMS fournira des images avec transparence" + +#: src/pyams_gis/interfaces/layer.py:114 +msgid "Version" +msgstr "Version" + +#: src/pyams_gis/interfaces/layer.py:115 +msgid "Version of the WMS service to use" +msgstr "Version du service WMS à utiliser" + +#: src/pyams_gis/interfaces/layer.py:119 +msgid "Uppercase?" +msgstr "Majuscules ?" + +#: src/pyams_gis/interfaces/layer.py:120 +msgid "If 'yes', WMS request parameters keys will be uppercase" +msgstr "Si 'oui', les paramètres des requêtes WMS seront fournis en majuscules" + +#: src/pyams_gis/interfaces/layer.py:128 src/pyams_gis/interfaces/layer.py:183 +msgid "API key" +msgstr "Clé d'API" + +#: src/pyams_gis/interfaces/layer.py:129 +msgid "Key used to access layer data" +msgstr "Clé utilisée pour accéder aux données de la couche" + +#: src/pyams_gis/interfaces/layer.py:132 +msgid "IGN layer name" +msgstr "Nom IGN" + +#: src/pyams_gis/interfaces/layer.py:133 +msgid "Name of layer in IGN format" +msgstr "Nom de la couche au format IGN" + +#: src/pyams_gis/interfaces/layer.py:149 +msgid "Layer URL" +msgstr "URL" + +#: src/pyams_gis/interfaces/layer.py:150 +msgid "URL used to get the feature layer" +msgstr "URL utilisée pour accéder à la couche" + +#: src/pyams_gis/interfaces/layer.py:153 +msgid "Token" +msgstr "Jeton" + +#: src/pyams_gis/interfaces/layer.py:154 +msgid "Token used in all service requests" +msgstr "Jeton d'authentification utilisé pour tous les accès au service" + +#: src/pyams_gis/interfaces/layer.py:157 +msgid "Where condition" +msgstr "Condition SQL" + +#: src/pyams_gis/interfaces/layer.py:158 +msgid "Optional expression used to filter features" +msgstr "Expression SQL facultative utilisée pour filtrer les éléments affichés" + +#: src/pyams_gis/interfaces/layer.py:184 +msgid "Google API key used to access maps data" +msgstr "Clé d'API Google utilisée pour accéder aux données de la carte" + +#: src/pyams_gis/interfaces/layer.py:187 +msgid "Map type" +msgstr "Type de couche" + +#: src/pyams_gis/interfaces/layer.py:188 +msgid "Type of GoogleMaps layer type" +msgstr "Type de couche Google Maps" + +#: src/pyams_gis/interfaces/__init__.py:38 +msgid "WGS84 (GPS)" +msgstr "WGS84 (GPS)" + +#: src/pyams_gis/interfaces/__init__.py:39 +msgid "WGS84 Web Mercator" +msgstr "WGS84 Web Mercator" + +#: src/pyams_gis/interfaces/__init__.py:40 +msgid "Lambert 93 (Metropolitan France)" +msgstr "Lambert 93 (France métropolitaine)" + +#: src/pyams_gis/interfaces/__init__.py:41 +msgid "Extended Lambert II (Metropolitan France)" +msgstr "Lambret II étendu (France métropolitaine)" + +#: src/pyams_gis/interfaces/__init__.py:42 +msgid "UTM Zone 20N (Martinique, Guadeloupe)" +msgstr "UTM Zone 20N (Martinique, Guadeloupe)" + +#: src/pyams_gis/interfaces/__init__.py:43 +msgid "UTM Zone 22N (Guyane)" +msgstr "UTM ZOne 22N (Guyane)" + +#: src/pyams_gis/interfaces/__init__.py:44 +msgid "UTM Zone 38S (Mayotte)" +msgstr "UTM Zone 38S (Mayotte)" + +#: src/pyams_gis/interfaces/__init__.py:45 +msgid "UTM Zone 40S (La Réunion)" +msgstr "UTM Zone 40S (La Réunion)" + +#: src/pyams_gis/interfaces/__init__.py:63 +msgid "Longitude" +msgstr "Longitude" + +#: src/pyams_gis/interfaces/__init__.py:66 +msgid "Latitude" +msgstr "Latitude" + +#: src/pyams_gis/interfaces/__init__.py:69 +#: src/pyams_gis/interfaces/__init__.py:110 +msgid "Projection system" +msgstr "Système de projection" + +#: src/pyams_gis/interfaces/__init__.py:91 +msgid "Altitude" +msgstr "Altitude" + +#: src/pyams_gis/interfaces/__init__.py:98 +msgid "West limit" +msgstr "Limite ouest" + +#: src/pyams_gis/interfaces/__init__.py:101 +msgid "South limit" +msgstr "Limite sud" + +#: src/pyams_gis/interfaces/__init__.py:104 +msgid "East limit" +msgstr "Limite est" + +#: src/pyams_gis/interfaces/__init__.py:107 +msgid "North limit" +msgstr "Limite nord" + +#: src/pyams_gis/interfaces/__init__.py:78 +msgid "You must set longitude and latitude, or None!" +msgstr "Vous devez indiquer la longitude ET la latitude, ou aucun des deux !" + +#: src/pyams_gis/interfaces/__init__.py:80 +#: src/pyams_gis/interfaces/__init__.py:121 +msgid "You can't set coordinates without setting projection!" +msgstr "" +"Vous ne pouvez pas spécifier de coordonnées sans indiquer la projection !" + +#: src/pyams_gis/interfaces/__init__.py:119 +msgid "You must set all coordinates or None!" +msgstr "Vous devez indiquer toutes les coordonnées, ou aucune !" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/locales/pyams_gis.pot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/locales/pyams_gis.pot Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,511 @@ +# +# SOME DESCRIPTIVE TITLE +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , 2017. +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE 1.0\n" +"POT-Creation-Date: 2017-05-18 15:57+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Lingua 3.8\n" + +#: ./src/pyams_gis/layer.py:85 +msgid "Tile" +msgstr "" + +#: ./src/pyams_gis/layer.py:100 +msgid "WMS" +msgstr "" + +#: ./src/pyams_gis/layer.py:128 +msgid "Geoportal" +msgstr "" + +#: ./src/pyams_gis/layer.py:148 +msgid "ESRI Features" +msgstr "" + +#: ./src/pyams_gis/layer.py:172 +msgid "Google" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geoarea-input.pt:7 +msgid "Remove area settings" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geoarea-input.pt:13 +msgid "Select area from map" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geoarea-input.pt:33 +msgid "Select map area" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geopoint-input.pt:7 +msgid "Remove position settings" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geopoint-input.pt:13 +msgid "Select location from map" +msgstr "" + +#: ./src/pyams_gis/widget/templates/geopoint-input.pt:33 +msgid "Select marker position" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:68 +msgid "Add tile layer..." +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:80 ./src/pyams_gis/zmi/layer.py:157 +#: ./src/pyams_gis/zmi/layer.py:234 ./src/pyams_gis/zmi/layer.py:311 +#: ./src/pyams_gis/zmi/layer.py:388 ./src/pyams_gis/zmi/utility.py:76 +#: ./src/pyams_gis/zmi/utility.py:165 ./src/pyams_gis/zmi/utility.py:186 +msgid "Maps manager" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:81 +msgid "Add tile layer" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:115 ./src/pyams_gis/zmi/layer.py:192 +#: ./src/pyams_gis/zmi/layer.py:269 ./src/pyams_gis/zmi/layer.py:346 +#: ./src/pyams_gis/zmi/layer.py:423 +msgid "Edit layer properties" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:145 +msgid "Add WMS layer..." +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:158 +msgid "Add WMS layer" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:222 +msgid "Add Geoportal WMS layer..." +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:235 +msgid "Add IGN Geoportal layer" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:299 +msgid "Add ESRI feature layer..." +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:312 +msgid "Add ESRI feature layer" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:376 +msgid "Add Google Maps layer..." +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:389 +msgid "Add Google Maps layer" +msgstr "" + +#: ./src/pyams_gis/zmi/layer.py:55 +msgid "Specified layer name already exists!" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:85 +msgid "Map manager layers" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:104 +msgid "Name" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:113 +msgid "Type" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:125 +msgid "Title" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:135 +msgid "Delete layer" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:164 +msgid "Control panel" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:173 +msgid "Configuration..." +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:187 +msgid "Default map configuration" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:215 +msgid "No provided object_name argument!" +msgstr "" + +#: ./src/pyams_gis/zmi/utility.py:219 +msgid "Given layer name doesn't exist!" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:32 +#: ./src/pyams_gis/interfaces/layer.py:91 +#: ./src/pyams_gis/interfaces/layer.py:136 +msgid "CRS" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:33 +msgid "Coordinates reference system to use for the map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:38 +msgid "Layers list" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:39 +msgid "List of available layers displayed into this map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:43 +msgid "Attribution control?" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:44 +msgid "If 'yes', an attribution control is added to map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:48 +msgid "Zoom control?" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:49 +msgid "If 'yes', a zoom control is added to map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:53 +msgid "Layers control?" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:54 +msgid "If 'yes', a layer selection control is added to map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:58 +msgid "Initial center" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:59 +msgid "Initial map location center" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:62 +msgid "Initial zoom level" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:63 +msgid "Zoom level at which to display map" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:68 +msgid "Initial bounds" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:69 +msgid "Initial map location bounds" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:72 +msgid "Keyboard navigation?" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:73 +msgid "" +"If 'yes', makes the map focusable and allows users to navigate with keyboard " +"arrows and +/- keys" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:78 +msgid "Scroll wheel zoom?" +msgstr "" + +#: ./src/pyams_gis/interfaces/configuration.py:79 +msgid "If 'yes', the map can be zoomed using the mouse wheel" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:172 +msgid "Roads map" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:173 +msgid "Satellite" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:174 +msgid "Hybrid" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:175 +msgid "Terrain" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:40 +msgid "Layer factory name" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:42 +msgid "List of layer factory dependent objects" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:47 +msgid "Layer type" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:44 +msgid "Layer name" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:49 +msgid "Layer title" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:50 +msgid "Full layer title" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:60 +msgid "Layer attribution" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:61 +msgid "String used by the attribution control" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:64 +#: ./src/pyams_gis/interfaces/layer.py:161 +msgid "Minimum zoom level" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:65 +#: ./src/pyams_gis/interfaces/layer.py:162 +msgid "Minimum zoom level at which layer is displayed" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:69 +#: ./src/pyams_gis/interfaces/layer.py:166 +msgid "Maximum zoom level" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:70 +#: ./src/pyams_gis/interfaces/layer.py:167 +msgid "Maximum zoom level at which layer is displayed" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:74 +msgid "Layer bounds" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:75 +msgid "Geographical bounds into which layer tiles are displayed" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:82 +msgid "URL template" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:83 +msgid "URL template used to get layer tiles (see leaflet.js docs)" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:92 +#: ./src/pyams_gis/interfaces/layer.py:137 +msgid "" +"Coordinates reference system to use for map requests; defaults to map request" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:96 +msgid "Layers" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:97 +msgid "Comma-separated list of WMS layers to show" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:100 +msgid "Styles" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:101 +msgid "Comma-separated list of WMS styles" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:104 +msgid "Layer format" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:105 +msgid "WMS image format; use 'image/png' for layers with transparency" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:109 +msgid "Transparent?" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:110 +msgid "If 'yes', the WMS services will return images with transparency" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:114 +msgid "Version" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:115 +msgid "Version of the WMS service to use" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:119 +msgid "Uppercase?" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:120 +msgid "If 'yes', WMS request parameters keys will be uppercase" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:128 +#: ./src/pyams_gis/interfaces/layer.py:183 +msgid "API key" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:129 +msgid "Key used to access layer data" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:132 +msgid "IGN layer name" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:133 +msgid "Name of layer in IGN format" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:149 +msgid "Layer URL" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:150 +msgid "URL used to get the feature layer" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:153 +msgid "Token" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:154 +msgid "Token used in all service requests" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:157 +msgid "Where condition" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:158 +msgid "Optional expression used to filter features" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:184 +msgid "Google API key used to access maps data" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:187 +msgid "Map type" +msgstr "" + +#: ./src/pyams_gis/interfaces/layer.py:188 +msgid "Type of GoogleMaps layer type" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:38 +msgid "WGS84 (GPS)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:39 +msgid "WGS84 Web Mercator" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:40 +msgid "Lambert 93 (Metropolitan France)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:41 +msgid "Extended Lambert II (Metropolitan France)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:42 +msgid "UTM Zone 20N (Martinique, Guadeloupe)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:43 +msgid "UTM Zone 22N (Guyane)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:44 +msgid "UTM Zone 38S (Mayotte)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:45 +msgid "UTM Zone 40S (La Réunion)" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:63 +msgid "Longitude" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:66 +msgid "Latitude" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:69 +#: ./src/pyams_gis/interfaces/__init__.py:110 +msgid "Projection system" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:91 +msgid "Altitude" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:98 +msgid "West limit" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:101 +msgid "South limit" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:104 +msgid "East limit" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:107 +msgid "North limit" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:78 +msgid "You must set longitude and latitude, or None!" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:80 +#: ./src/pyams_gis/interfaces/__init__.py:121 +msgid "You can't set coordinates without setting projection!" +msgstr "" + +#: ./src/pyams_gis/interfaces/__init__.py:119 +msgid "You must set all coordinates or None!" +msgstr "" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/point.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/point.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,64 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +try: + from osgeo.osr import SpatialReference, CoordinateTransformation + have_gdal = True +except ImportError: + have_gdal = False +from persistent import Persistent + +# import interfaces +from pyams_gis.interfaces import IGeoPoint, IGeoPointZ, WGS84 + +# import packages +from zope.interface import implementer +from zope.schema.fieldproperty import FieldProperty + + +@implementer(IGeoPoint) +class GeoPoint(Persistent): + """GeoPoint attribute object""" + + longitude = FieldProperty(IGeoPoint['longitude']) + latitude = FieldProperty(IGeoPoint['latitude']) + projection = FieldProperty(IGeoPoint['projection']) + + def __bool__(self): + return bool(self.longitude and self.latitude) + + def get_coordinates(self, projection=WGS84): + if projection == self.projection: + return self.longitude, self.latitude + if (not have_gdal) or not self: + return None, None + source = SpatialReference() + source.ImportFromEPSG(self.projection) + destination = SpatialReference() + destination.ImportFromEPSG(projection) + transformation = CoordinateTransformation(source, destination) + return transformation.TransformPoint(float(self.longitude), float(self.latitude))[0:2] + + @property + def wgs_coordinates(self): + return self.get_coordinates(WGS84) + + +@implementer(IGeoPointZ) +class GeoPointZ(GeoPoint): + """GeoPointZ attribute object""" + + altitude = FieldProperty(IGeoPointZ['altitude']) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-1.0.3.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-1.0.3.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,624 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer { + max-width: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + } +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } + + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } +.leaflet-control-zoom-out { + font-size: 20px; + } + +.leaflet-touch .leaflet-control-zoom-in { + font-size: 22px; + } +.leaflet-touch .leaflet-control-zoom-out { + font-size: 24px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(/--static--/pyams_gis/img/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(/--static--/pyams_gis/img/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-1.0.3.min.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-1.0.3.min.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,0.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,0.25,1);-o-transition:-o-transform .25s cubic-bezier(0,0,0.25,1);transition:transform .25s cubic-bezier(0,0,0.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,0.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,0.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:black}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:0}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-control-zoom-out{font-size:20px}.leaflet-touch .leaflet-control-zoom-in{font-size:22px}.leaflet-touch .leaflet-control-zoom-out{font-size:24px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,0.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(/--static--/pyams_gis/img/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(/--static--/pyams_gis/img/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,0.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:0;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,0.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:0;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,0.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:white;color:#333;box-shadow:0 3px 14px rgba(0,0,0,0.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:0;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:bold;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,0.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff} \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-draw.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-draw.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,317 @@ +/* ================================================================== */ +/* Toolbars +/* ================================================================== */ + +.leaflet-draw-section { + position: relative; +} + +.leaflet-draw-toolbar { + margin-top: 12px; +} + +.leaflet-draw-toolbar-top { + margin-top: 0; +} + +.leaflet-draw-toolbar-notop a:first-child { + border-top-right-radius: 0; +} + +.leaflet-draw-toolbar-nobottom a:last-child { + border-bottom-right-radius: 0; +} + +.leaflet-draw-toolbar a { + background-image: url('images/spritesheet.png'); + background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg'); + background-repeat: no-repeat; + background-size: 270px 30px; + background-clip: padding-box; +} + +.leaflet-retina .leaflet-draw-toolbar a { + background-image: url('images/spritesheet-2x.png'); + background-image: linear-gradient(transparent, transparent), url('images/spritesheet.svg'); +} + +.leaflet-draw a { + display: block; + text-align: center; + text-decoration: none; +} + +.leaflet-draw a .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +/* ================================================================== */ +/* Toolbar actions menu +/* ================================================================== */ + +.leaflet-draw-actions { + display: none; + list-style: none; + margin: 0; + padding: 0; + position: absolute; + left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */ + top: 0; + white-space: nowrap; +} + +.leaflet-touch .leaflet-draw-actions { + left: 32px; +} + +.leaflet-right .leaflet-draw-actions { + right: 26px; + left: auto; +} + +.leaflet-touch .leaflet-right .leaflet-draw-actions { + right: 32px; + left: auto; +} + +.leaflet-draw-actions li { + display: inline-block; +} + +.leaflet-draw-actions li:first-child a { + border-left: none; +} + +.leaflet-draw-actions li:last-child a { + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.leaflet-right .leaflet-draw-actions li:last-child a { + -webkit-border-radius: 0; + border-radius: 0; +} + +.leaflet-right .leaflet-draw-actions li:first-child a { + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.leaflet-draw-actions a { + background-color: #919187; + border-left: 1px solid #AAA; + color: #FFF; + font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif; + line-height: 28px; + text-decoration: none; + padding-left: 10px; + padding-right: 10px; + height: 28px; +} + +.leaflet-touch .leaflet-draw-actions a { + font-size: 12px; + line-height: 30px; + height: 30px; +} + +.leaflet-draw-actions-bottom { + margin-top: 0; +} + +.leaflet-draw-actions-top { + margin-top: 1px; +} + +.leaflet-draw-actions-top a, +.leaflet-draw-actions-bottom a { + height: 27px; + line-height: 27px; +} + +.leaflet-draw-actions a:hover { + background-color: #A0A098; +} + +.leaflet-draw-actions-top.leaflet-draw-actions-bottom a { + height: 26px; + line-height: 26px; +} + +/* ================================================================== */ +/* Draw toolbar +/* ================================================================== */ + +.leaflet-draw-toolbar .leaflet-draw-draw-polyline { + background-position: -2px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline { + background-position: 0 -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-polygon { + background-position: -31px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon { + background-position: -29px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-rectangle { + background-position: -62px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle { + background-position: -60px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-circle { + background-position: -92px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle { + background-position: -90px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-marker { + background-position: -122px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker { + background-position: -120px -1px; +} + +/* ================================================================== */ +/* Edit toolbar +/* ================================================================== */ + +.leaflet-draw-toolbar .leaflet-draw-edit-edit { + background-position: -152px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit { + background-position: -150px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-remove { + background-position: -182px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove { + background-position: -180px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { + background-position: -212px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { + background-position: -210px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { + background-position: -242px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { + background-position: -240px -2px; +} + +/* ================================================================== */ +/* Drawing styles +/* ================================================================== */ + +.leaflet-mouse-marker { + background-color: #fff; + cursor: crosshair; +} + +.leaflet-draw-tooltip { + background: rgb(54, 54, 54); + background: rgba(0, 0, 0, 0.5); + border: 1px solid transparent; + -webkit-border-radius: 4px; + border-radius: 4px; + color: #fff; + font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif; + margin-left: 20px; + margin-top: -21px; + padding: 4px 8px; + position: absolute; + visibility: hidden; + white-space: nowrap; + z-index: 6; +} + +.leaflet-draw-tooltip:before { + border-right: 6px solid black; + border-right-color: rgba(0, 0, 0, 0.5); + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + content: ""; + position: absolute; + top: 7px; + left: -7px; +} + +.leaflet-error-draw-tooltip { + background-color: #F2DEDE; + border: 1px solid #E6B6BD; + color: #B94A48; +} + +.leaflet-error-draw-tooltip:before { + border-right-color: #E6B6BD; +} + +.leaflet-draw-tooltip-single { + margin-top: -12px +} + +.leaflet-draw-tooltip-subtext { + color: #f8d5e4; +} + +.leaflet-draw-guide-dash { + font-size: 1%; + opacity: 0.6; + position: absolute; + width: 5px; + height: 5px; +} + +/* ================================================================== */ +/* Edit styles +/* ================================================================== */ + +.leaflet-edit-marker-selected { + background-color: rgba(254, 87, 161, 0.1); + border: 4px dashed rgba(254, 87, 161, 0.6); + -webkit-border-radius: 4px; + border-radius: 4px; + box-sizing: content-box; +} + +.leaflet-edit-move { + cursor: move; +} + +.leaflet-edit-resize { + cursor: pointer; +} + +/* ================================================================== */ +/* Old IE styles +/* ================================================================== */ + +.leaflet-oldie .leaflet-draw-toolbar { + border: 1px solid #999; +} \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-draw.min.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-draw.min.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('images/spritesheet.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg');background-repeat:no-repeat;background-size:270px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('images/spritesheet-2x.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg')}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999} \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-esri-geocoder.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,162 @@ +.geocoder-control-input { + position: absolute; + left: 0; + top: 0; + background-color: white; + background-repeat: no-repeat; + background-image: url("../esri/search.png"); + background-size: 26px; + border: none; + padding: 0; + text-indent: 6px; + font-size: 13px; + line-height: normal; + height: auto; + padding-top: 5px; + padding-bottom: 5px; + width: 100%; + background-position: right center; + cursor: pointer; + box-sizing: border-box +} + +.geocoder-control-input-disabled { + background-color: #f4f4f4; + background-image: url("../img/esri/search-disabled.png") +} + +.geocoder-control { + width: 26px; + height: 26px; + -webkit-transition: width .175s ease-in; + -moz-transition: width .175s ease-in; + -ms-transition: width .175s ease-in; + -o-transition: width .175s ease-in; + transition: width .175s ease-in +} + +.geocoder-control-expanded, .leaflet-touch .geocoder-control-expanded { + width: 275px +} + +.geocoder-control-input.geocoder-control-loading { + background-image: url("../img/esri/loading.gif"); + background-size: 26px +} + +@media only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2 / 1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) { + .geocoder-control-input { + background-image: url("../img/esri/search@2x.png") + } + + .geocoder-control-input-disabled { + background-image: url("../img/esri/search@2x-disabled.png") + } + + .geocoder-control-input.geocoder-control-loading { + background-image: url("../img/esri/loading@2x.gif") + } +} + +.geocoder-control-input:focus { + outline: none; + cursor: text +} + +.geocoder-control-input::-ms-clear { + display: none +} + +.geocoder-control-suggestions { + width: 100%; + position: absolute; + top: 26px; + left: 0; + margin-top: 10px; + overflow: auto; + display: none +} + +.geocoder-control-list + .geocoder-control-header { + border-top: 1px solid #d5d5d5 +} + +.geocoder-control-header { + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #444; + background: #F2F2F2; + border-bottom: 1px solid #d5d5d5; + display: block; + padding: .5em +} + +.geocoder-control-list { + list-style: none; + margin: 0; + padding: 0 +} + +.geocoder-control-suggestions .geocoder-control-suggestion { + font-size: 13px; + padding: 7px; + background: white; + border-top: 1px solid #f1f1f1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer +} + +.geocoder-control-suggestions .geocoder-control-suggestion:first-child { + border: none +} + +.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected, .geocoder-control-suggestions .geocoder-control-suggestion:hover { + background: #7FDFFF; + border-color: #7FDFFF +} + +.leaflet-right .geocoder-control-suggestions { + left: auto; + right: 0 +} + +.leaflet-right .geocoder-control-input { + left: auto; + right: 0 +} + +.leaflet-touch .geocoder-control { + width: 34px +} + +.leaflet-touch .geocoder-control.geocoder-control-expanded { + width: 275px +} + +.leaflet-touch .geocoder-control-input { + height: 34px; + line-height: 30px; + background-size: 30px +} + +.leaflet-touch .geocoder-control-suggestions { + top: 30px; + width: 271px +} + +.leaflet-oldie .geocoder-control-input { + width: 28px; + height: 28px +} + +.leaflet-oldie .geocoder-control-expanded .geocoder-control-input { + width: auto +} + +.leaflet-oldie .geocoder-control-input, .leaflet-oldie .geocoder-control-suggestions { + border: 1px solid #999 +} diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-esri-geocoder.min.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +.geocoder-control-input{position:absolute;left:0;top:0;background-color:white;background-repeat:no-repeat;background-image:url("../esri/search.png");background-size:26px;border:0;padding:0;text-indent:6px;font-size:13px;line-height:normal;height:auto;padding-top:5px;padding-bottom:5px;width:100%;background-position:right center;cursor:pointer;box-sizing:border-box}.geocoder-control-input-disabled{background-color:#f4f4f4;background-image:url("../img/esri/search-disabled.png")}.geocoder-control{width:26px;height:26px;-webkit-transition:width .175s ease-in;-moz-transition:width .175s ease-in;-ms-transition:width .175s ease-in;-o-transition:width .175s ease-in;transition:width .175s ease-in}.geocoder-control-expanded,.leaflet-touch .geocoder-control-expanded{width:275px}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading.gif");background-size:26px}@media only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2 / 1),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.geocoder-control-input{background-image:url("../img/esri/search@2x.png")}.geocoder-control-input-disabled{background-image:url("../img/esri/search@2x-disabled.png")}.geocoder-control-input.geocoder-control-loading{background-image:url("../img/esri/loading@2x.gif")}}.geocoder-control-input:focus{outline:0;cursor:text}.geocoder-control-input::-ms-clear{display:none}.geocoder-control-suggestions{width:100%;position:absolute;top:26px;left:0;margin-top:10px;overflow:auto;display:none}.geocoder-control-list+.geocoder-control-header{border-top:1px solid #d5d5d5}.geocoder-control-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#444;background:#f2f2f2;border-bottom:1px solid #d5d5d5;display:block;padding:.5em}.geocoder-control-list{list-style:none;margin:0;padding:0}.geocoder-control-suggestions .geocoder-control-suggestion{font-size:13px;padding:7px;background:white;border-top:1px solid #f1f1f1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.geocoder-control-suggestions .geocoder-control-suggestion:first-child{border:0}.geocoder-control-suggestions .geocoder-control-suggestion.geocoder-control-selected,.geocoder-control-suggestions .geocoder-control-suggestion:hover{background:#7fdfff;border-color:#7fdfff}.leaflet-right .geocoder-control-suggestions{left:auto;right:0}.leaflet-right .geocoder-control-input{left:auto;right:0}.leaflet-touch .geocoder-control{width:34px}.leaflet-touch .geocoder-control.geocoder-control-expanded{width:275px}.leaflet-touch .geocoder-control-input{height:34px;line-height:30px;background-size:30px}.leaflet-touch .geocoder-control-suggestions{top:30px;width:271px}.leaflet-oldie .geocoder-control-input{width:28px;height:28px}.leaflet-oldie .geocoder-control-expanded .geocoder-control-input{width:auto}.leaflet-oldie .geocoder-control-input,.leaflet-oldie .geocoder-control-suggestions{border:1px solid #999} \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-gp-3.0.2.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-gp-3.0.2.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,3190 @@ +/*! + * @brief Geoportal Extension for Leaflet + * + * This software is released under the licence CeCILL-B (Free BSD compatible) + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt + * @see http://www.cecill.info/ + * + * copyright CeCILL-B + * copyright IGN + * @author IGN + * @version 0.8.1 + * @date 2016-12-02 + * + */ +/* MOUSE POSITION */ + +/* Showing/hiding drawing panel */ + +label[id^=GPshowDrawingPicto-] { + display: inline-block; +} + +input[id^=GPshowDrawing-] + label { + display: block; +} + +input[id^=GPshowDrawing-]:checked + label { + display: none; +} + +input[id^=GPshowDrawing-] + label + div { + display: none; +} + +input[id^=GPshowDrawing-]:checked + label + div { + display: block; +} + +/* General panels */ + +div[^=GPdrawingPanel-] { + width: 240px; + overflow: hidden; +} + +/* Basic infos */ + +div[^=GPdrawingBasicPanel-] { + padding: 10px 15px; +} + +.GPdrawingLabel, +.GPdrawingCoords { + display: inline-block; + line-height: 20px; +} + +.GPdrawingLabel { + width: 80px; + font-weight: bold; +} + +.GPdrawingCoords { + width: 110px; +} + +/* markers selector */ +.marker-input-radio { + display : none ; +} + +input.marker-input-radio:checked + label { + border: 1px solid red; +} + + +/* Calc waiting */ + +.GPelevationPathCalcWaitingContainerVisible, +.GPelevationPathCalcWaitingContainerHidden { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255,255,255,0.9); + font-size: 1.5em; + font-weight: bold; + overflow: hidden; +} + +.GPelevationPathCalcWaitingContainerVisible { + display: -webkit-flex; + display: flex; +} + +.GPelevationPathCalcWaitingContainerHidden { + display: none; +} + +.GPelevationPathCalcWaiting { + margin: auto; +} + +.GPelevationPathCalcWaitingContainerVisible, +.GPelevationPathCalcWaitingContainerHidden { + border-radius: 5px; +} + +/* CSS : Raw */ + +#profileElevationRaw { + resize: none; + padding: unset; +} + +/* CSS : default */ + +/* suppression des puces sur les listes */ +div#profileElevationByDefault { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + flex-direction: column; + /*flex-flow: row wrap;*/ + height: inherit; + width: inherit; +} + +div#profileElevationByDefault > * { + -webkit-flex: 1; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 100%; +} + +ul#data-default { + list-style: none; + box-sizing: border-box; + padding: 0px; + position : relative; + margin : 10px; + margin-top: auto; + margin-bottom: auto; + height: 100px; + /*width: 100%*/ +} + +.z-title-vertical { + align-self: flex-start; + padding-left: 10px; + /*position: absolute;*/ + /*transform: rotate(-90deg);*/ +} + +.x-title-horizontal { + align-self: flex-end; + padding-right: 10px; + /*position: absolute;*/ + /*transform: translate(120px, -30px);*/ +} + +.z-axis { + border-right: none; + border-left: solid 2px; + cursor: default; +} + +.x-axis { + border-top: none; + border-bottom: solid 2px; + cursor: default; +} + +ul#data-default li.percent { + display: inline-block; + vertical-align: bottom; + background-color: #C77A04; + opacity : 0.3; + border-top: solid 1px; + border-radius: 2px; + cursor: pointer; +} + +li.axe span.bottom-axis { + vertical-align: bottom; +} + +ul#data-default .percent:hover { + display: inline-block; + /*vertical-align: bottom;*/ + background-color: #f00; +} + +.v0 { height: 0%; } +.v1 { height: 1%; } +.v2 { height: 2%; } +.v3 { height: 3%; } +.v4 { height: 4%; } +.v5 { height: 5%; } +.v6 { height: 6%; } +.v7 { height: 7%; } +.v8 { height: 8%; } +.v9 { height: 9%; } +.v10 { height: 10%; } +.v11 { height: 11%; } +.v12 { height: 12%; } +.v13 { height: 13%; } +.v14 { height: 14%; } +.v15 { height: 15%; } +.v16 { height: 16%; } +.v17 { height: 17%; } +.v18 { height: 18%; } +.v19 { height: 19%; } +.v20 { height: 20%; } +.v21 { height: 21%; } +.v22 { height: 22%; } +.v23 { height: 23%; } +.v24 { height: 24%; } +.v25 { height: 25%; } +.v26 { height: 26%; } +.v27 { height: 27%; } +.v28 { height: 28%; } +.v29 { height: 29%; } +.v30 { height: 30%; } +.v31 { height: 31%; } +.v32 { height: 32%; } +.v33 { height: 33%; } +.v34 { height: 34%; } +.v35 { height: 35%; } +.v36 { height: 36%; } +.v37 { height: 37%; } +.v38 { height: 38%; } +.v39 { height: 39%; } +.v40 { height: 40%; } +.v41 { height: 41%; } +.v42 { height: 42%; } +.v43 { height: 43%; } +.v44 { height: 44%; } +.v45 { height: 45%; } +.v46 { height: 46%; } +.v47 { height: 47%; } +.v48 { height: 48%; } +.v49 { height: 49%; } +.v50 { height: 50%; } +.v51 { height: 51%; } +.v52 { height: 52%; } +.v53 { height: 53%; } +.v54 { height: 54%; } +.v55 { height: 55%; } +.v56 { height: 56%; } +.v57 { height: 57%; } +.v58 { height: 58%; } +.v59 { height: 59%; } +.v60 { height: 60%; } +.v61 { height: 61%; } +.v62 { height: 62%; } +.v63 { height: 63%; } +.v64 { height: 64%; } +.v65 { height: 65%; } +.v66 { height: 66%; } +.v67 { height: 67%; } +.v68 { height: 68%; } +.v69 { height: 69%; } +.v70 { height: 70%; } +.v71 { height: 71%; } +.v72 { height: 72%; } +.v73 { height: 73%; } +.v74 { height: 74%; } +.v75 { height: 75%; } +.v76 { height: 76%; } +.v77 { height: 77%; } +.v78 { height: 78%; } +.v79 { height: 79%; } +.v80 { height: 80%; } +.v81 { height: 81%; } +.v82 { height: 82%; } +.v83 { height: 83%; } +.v84 { height: 84%; } +.v85 { height: 85%; } +.v86 { height: 86%; } +.v87 { height: 87%; } +.v88 { height: 88%; } +.v89 { height: 89%; } +.v90 { height: 90%; } +.v91 { height: 91%; } +.v92 { height: 92%; } +.v93 { height: 93%; } +.v94 { height: 94%; } +.v95 { height: 95%; } +.v96 { height: 96%; } +.v97 { height: 97%; } +.v98 { height: 98%; } +.v99 { height: 99%; } +.v100 { height: 100%; } + +/* CSS : D3 */ + +text { + fill: rgb(94, 94, 94); + font-family: Verdana; + font-size: 10px; + opacity: 1; + text-anchor: end; +} + +.axis-d3 { + fill: none; + stroke: #5E5E5E; + stroke-width: 1; + shape-rendering: crispEdges; +} + +.area-d3 { + fill: #C77A04; + stroke: #5E5E5E; + stroke-width: 0; + fill-opacity: 0.4; +} + +.line-d3 { + fill: none; + stroke: #C77A04; + stroke-width: 1px; +} + +.grid-d3 .tick { + stroke: lightgrey; + opacity: 0.7; +} + +.grid-d3 path { + stroke-width: 0; +} + +.grid-d3 .tick { + stroke: lightgrey; + opacity: 0.7; +} + +.grid-d3 path { + stroke-width: 0; +} + +.overlay-d3 { + fill: none; + pointer-events: all; +} + +.focusLine-d3 { + fill: none; + stroke: #C77A04; + stroke-width: 0.5px; +} + +.focusCircle-d3 { + fill: #C77A04; +} + +div.tooltip-d3 { + position: inherit;; + text-align: left; + width: 80px; + height: 35px; + padding: 2px; + font: 8px sans-serif; + background: lightsteelblue; + border: 0px; + border-radius: 8px; + pointer-events: none; +} + +/* Widgets : general */ + +.GPwidget { + position: absolute; + font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; + font-size: 13px; + color: #333; +} + +.GPwidget input[type='text'], +.GPwidget input[type='button'] { + -webkit-appearance: none; + color: #333333; +} + +.GPwidget input[type="checkbox"] { + display: none; +} + +.GPwidget select { + padding-left: 3px; + border-radius: 3px; +} + +.GPwidget form { + margin-bottom: 0; +} + +.GPwidget * { + box-sizing: border-box; + background-repeat: no-repeat; +} + +/* waiting */ + +.GPwaiting { + background-image : url("../img/gp/waiting.gif"); + background-position : center center; + background-repeat : no-repeat; +} + +/* General panels */ + +.GPpanel { + background-color: #FFF; +} + +.GPpanelHeader { + position: relative; + width: 100%; +} + +.GPpanelTitle { + width: 100%; + height: 100%; + text-align: center; + font-weight: bold; +} + +.GPpanelClose, .GPpanelReduce { + position: absolute; + cursor: pointer; +} + +/* Showing/hiding advanced panels */ + +.GPshowAdvancedToolPicto { + position: relative; + box-sizing: border-box; + cursor: pointer; +} + +.GPshowAdvancedToolOpen { + position: absolute; + display: block; + box-sizing: border-box; +} + +/* Flex inputs */ + +.GPflexInput { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + transition: max-height 0.3s ease-out, opacity 0.3s ease-out; +} + +.GPflexInput > * { + display: block; + height: 28px; + line-height: 26px; + border: 1px solid #999; + border-radius: 0; +} + +.GPflexInput *:not(:last-child) { + border-right:none; +} + +.GPflexInput *:first-child { + border-radius: 3px 0 0 3px; +} + +.GPflexInput *:last-child { + border-radius: 0 3px 3px 0; +} + +.GPflexInput > *:not(input) { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.GPflexInput > input { + -webkit-flex: 1; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 5px; + min-width: 0; +} + +.GPflexInput > select { + -webkit-flex: 1; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 7px; +} + +.GPflexInput > label { + background-color: #F2F2F2; + color: #666; + padding-left: 7px; + padding-right: 9px; + cursor: pointer; +} + +/* Particular inputs */ + +.GPinputSelect { + display: block; + height: 28px; + line-height: 26px; + margin: auto; + border: 1px solid #999; + color: #333; + cursor: pointer; +} + +input.GPinputSubmit { + display: block; + width: 80px; + margin: auto; + height: 28px; + line-height: 26px; + padding: 0; + background: none; + border: none; + border-radius: 3px; + font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; + color: #FFF; + font-weight: bold; + opacity: 0.8; + transition: opacity 0.2s ease-out; + cursor: pointer; +} + +input.GPinputSubmit:hover { + opacity: 1; +} + +/* Autocomplete/geocode results */ + +.GPautoCompleteList, +.GPadvancedAutoCompleteList { + z-index: 2; + display: none; + position: absolute; + max-height: 140px; + background-color: #FFF; + border: 1px solid #999; + overflow-y: hidden; +} + +.GPadvancedAutoCompleteList { + width: calc(100% - 28px); + border-top: none; + font-size: 0.9em; +} + +.GPautoCompleteProposal { + width: 100%; + height: 28px; + line-height: 16px; + padding: 6px 10px; + color: #5E5E5E; + font-size: 1.0em; + overflow: hidden; + white-space: nowrap; + text-overflow:ellipsis; + cursor: pointer; +} + +.GPautoCompleteProposal:hover { + color: #000000; + background-color: #CEDBEF +} + +/* Showing additional hidden options */ + +.GPshowMoreOptions { + display: block; + position: absolute; + width: 28px; + height: 28px; + cursor: pointer; + transition: all 0.5s ease-out 0s; +} + +input[type="checkbox"]:checked + .GPshowMoreOptions { + -webkit-transform: rotateX(180deg); + transform: rotateX(180deg); +} + +/* ISOCHRON */ + +div[id^=GPisochron-] { + top: 140px; +} + +/* Showing/hiding mouse position panel */ + +label[id^=GPshowIsochronPicto] { + display: inline-block; +} + +input[id^=GPshowIsochron-] + label { + display: block; +} + +input[id^=GPshowIsochron-]:checked + label { + display: none; +} + +input[id^=GPshowIsochron-] + label + div { + display: none; +} + +input[id^=GPshowIsochron-]:checked + label + div { + display: block; +} + +/* General panels */ + +div[id^=GPisochronPanel-] { + width: 280px; +} + +/* Calc waiting */ + +.GPisochronCalcWaitingContainerVisible, +.GPisochronCalcWaitingContainerHidden { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255,255,255,0.9); + font-size: 1.5em; + font-weight: bold; + overflow: hidden; +} + +.GPisochronCalcWaitingContainerVisible { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; +} + +.GPisochronCalcWaitingContainerHidden { + display: none; +} + +.GPisochronCalcWaiting { + margin: auto; +} + +/* Isochron form */ + +form[id^=GPisochronForm] { + padding: 15px; +} + +.GPisochronFormMini { + max-height: 58px; + overflow: hidden; +} + +.GPisochronFormMini div[id^="GPisochronReset-"], +.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"] { + display: none; +} + +.GPisochronOriginVisible { + display: block; +} + +.GPisochronOriginHidden { + display: none; +} + +.GPisochronOriginPointerImg { + width: 28px; + background-color: #F2F2F2; + cursor: pointer; +} + +input[id^="GPisochronOriginPointer"] + .GPisochronOriginPointerImg { + background-position: -1px -1px; +} + +input[id^="GPisochronOriginPointer"]:checked + .GPisochronOriginPointerImg { + background-position: -29px -1px; +} + +input[id^=GPisochronSubmit] { + margin-top: 5px; +} + +/* Alternative choice */ + +div[id^=GPisochronChoice] { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + width: 160px; + -webkit-justify-content: space-between; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin: auto; + margin-top: 15px; + margin-bottom: 5px; +} + +.GPisochronChoiceAlt input { + display: none; +} + +.GPisochronChoiceAltImg { + display: block; + width: 28px; + height: 28px; + margin: auto; + cursor: pointer; +} + +input[id^=GPisochronChoiceAltChron] + .GPisochronChoiceAltImg { + background-position: -56px 0; +} + +input[id^=GPisochronChoiceAltChron]:checked + .GPisochronChoiceAltImg { + background-position: -84px 0; +} + +input[id^=GPisochronChoiceAltDist] + .GPisochronChoiceAltImg { + background-position: -112px 0; +} + +input[id^=GPisochronChoiceAltDist]:checked + .GPisochronChoiceAltImg { + background-position: -140px 0; +} + +.GPisochronChoiceAlt span { + cursor: pointer; + display:block; + color: #999; +} + +.GPisochronValueHidden { + display: none; +} + +div[id^=GPisochronValueChron], +div[id^=GPisochronValueDist] { + width: 220px; + margin: auto; +} + +/* Mode choice */ + +div[id^=GPisochronModeChoice] { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -webkit-justify-content: space-between; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin: 15px 0; +} + +.GPisochronModeLabel { + display: block; + text-align: center; + margin-bottom: 5px; +} + +div[id^=GPisochronTransportChoice] input { + display: none; +} + +.GPisochronTransportImg { + display: inline-block; + width: 28px; + height: 28px; + cursor: pointer; +} + +.GPisochronTransportImg:first-of-type { + margin-left: 18px; + margin-right: 10px; +} + +input[id^=GPisochronTransportCar] + .GPisochronTransportImg { + background-position: -168px 0; +} + +input[id^=GPisochronTransportCar]:checked + .GPisochronTransportImg { + background-position: -196px 0; +} + +input[id^=GPisochronTransportPedestrian] + .GPisochronTransportImg { + background-position: -224px 0; +} + +input[id^=GPisochronTransportPedestrian]:checked + .GPisochronTransportImg { + background-position: -252px 0; +} + +select[id^=GPisochronDirectionSelect] { + width: 80px; +} + +/* Showing/hiding exclusions */ + +input[id^=GPshowIsoExclusions] { + display: none; +} + +.GPshowIsoExclusionsPicto { + top: 250px; + right: 0; + transition: all 0.5s ease-out 0s; +} + +input[id^=GPshowIsoExclusions] + label + div[id^=GPisoExclusions] { + max-height: 0; + opacity: 0; + margin-bottom: 0; +} + +input[id^=GPshowIsoExclusions]:checked + label + div[id^=GPisoExclusions] { + display: block; + max-height: 60px; + opacity: 1; + margin-bottom: 15px; +} + +/* Exclusions */ + +div[id^=GPisoExclusions] { + transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s; + overflow: hidden; +} + +.GPisoExclusionsLabel { + display: block; + text-align: center; + margin-bottom: 10px; + font-weight: bold; + line-height: 16px; +} + +.GPisoExclusionsOptions { + display: -webkit-flex; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; +} + +.GPisoExclusionsOption { + display: block; + height: 28px; + line-height: 26px; + color: #A77; + background-color: #FEE; + padding-left: 28px; + padding-right: 5px; + border: 1px solid #A77; + border-radius: 3px; + cursor: pointer; +} + +input:checked + .GPisoExclusionsOption { + background-color: #EFE; + background-position: 0 -28px; + color: #797; + border: 1px solid #797; +} + +/* Reset picto */ +div[id^=GPisochronReset] { + position: absolute; + margin-top: 5px; + width: 28px; + height: 28px; + border-radius: 3px; + opacity: 0.8; + background-position: -281px 0; + transition: opacity 0.2s ease-out; + cursor: pointer; +} + +div[id^=GPisochronReset]:hover { + opacity: 1; +} + +/* LAYER SWITCHER */ + +#GPlayerSwitcher { + font-size: 11px; +} + +#GPlayerSwitcher [draggable] { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + user-select: none; + /* Required to make elements draggable in old WebKit */ + -khtml-user-drag: element; + -webkit-user-drag: element; +} + +/* Manage opening of the components through hiden checkboxes */ + +#GPlayerSwitcher input[type="checkbox"] + div, +#GPlayerSwitcher input[type="checkbox"] + label + div { + max-height: 0px; +} + +#GPlayerSwitcher label { + display: block; +} + +/* Showing/hiding layers list */ + +#GPshowLayersListPicto { + position: relative; + float: right; + display: block; + opacity: 1; + transition: opacity 0.5s ease-out 0s, box-shadow 0.5s ease-out 0s, border 0.5s ease-out 0s, border-radius 0.5s ease-out 0s; + cursor: pointer; +} + +#GPshowLayersListOpen, +#GPshowLayersListClose { + position: absolute; + display: block; + transition: border-radius 0.5s ease-out 0s, opacity 0.5s ease-out 0s; +} + +#GPshowLayersListOpen { + background-position: 0 0; + opacity: 1; +} + +#GPshowLayersListClose { + opacity: 0; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListClose { + opacity: 1; +} + +/* Layers list */ + +#GPlayersList { + position: relative; + width: 180px; + border-bottom-right-radius: 0; + opacity: 0; + overflow: auto; + transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0.25s; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + #GPlayersList { + max-height: 232px; + opacity: 1; + transition: max-height 0.5s ease-in 0s, opacity 0.25s ease-in 0s; +} + +/* Layer : general */ + +.GPlayerSwitcher_layer { + position: relative; + top: 0; + background-color: #FFF; + border-bottom: 1px dotted #CCC; + overflow: hidden; +} + +#GPlayersList .GPlayerSwitcher_layer:last-child { + border-bottom: none; +} + +.GPlayerBasicTools, +.GPlayerAdvancedTools { + position: relative; + width: 100%; + height: 28px; +} + +.GPlayerVisibility, +.GPlayerInfo, +.GPlayerInfoOpened, +.GPlayerRemove { + width: 28px; + height: 28px; + cursor: pointer; +} + +.GPlayerVisibility, +.GPlayerName, +.GPlayerInfo, +.GPlayerInfoOpened, +.GPlayerRemove, +.GPlayerOpacity, +.GPlayerOpacityValue { + position: absolute; + top: 0; +} + +.GPghostLayer { + opacity: 0; +} + +/* Layer basic tools */ + +.GPlayerBasicTools { + background-color: #FFF; +} + +.GPlayerVisibility { + left: 0; + background-position: -28px 0; +} + +input[type="checkbox"]:checked + .GPlayerVisibility { + background-position: 0 0; +} + +.GPlayerName { + left: 28px; + width: calc(100% - 56px); + line-height: 28px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding-left: 4px; + cursor: move; +} + +.outOfRange .GPlayerName { + color: #AAA; +} + +/* Showing layer advanced tools */ + +.GPshowLayerAdvancedTools { + top: 0; + right: 0; + background-position: -112px 0; +} + +.GPlayerAdvancedTools { + display: block; + max-height: 0; + opacity: 0; + transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + label + .GPlayerAdvancedTools { + max-height: 28px; + opacity: 1; +} + +/* Layer advanced tools */ + +.GPlayerInfo { + left: 0; + background-position: -55px 0; +} + +.GPlayerInfoOpened { + left: 0; + background-position: -83px 0; +} + +.GPlayerOpacity { + left: 28px; + width: calc(100% - 100px); + height: 28px; + padding-left: 8px; +} + +.GPlayerOpacityValue { + width: 32px; + left: calc(100% - 60px); + line-height: 28px; + font-size: 10px; + font-style: italic; + cursor: default; +} + +.GPlayerRemove { + right: 0; + background-position: -140px 0; +} + +/* Opacity slider : general */ + +.GPlayerOpacity input { + -webkit-appearance: none; + -moz-appearance: none; + background: none; + display: block; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; + cursor: pointer; +} + +.GPlayerOpacity input[type="range"]:focus { + box-shadow: none; + outline: none; +} + +/* Opacity slider : Chrome, Safari, Opera */ + +.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track { + -webkit-appearance: none; + height: 3px; +} + +.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before { + position: absolute; + top: 0; + right: 50%; + left: -200px; + height: 3px; + pointer-events: none; +} + +.GPlayerOpacity input[type="range"]::-webkit-slider-thumb { + width: 9px; + height: 17px; + -webkit-appearance: none; + border: 2px solid #FFF; + background-color: #505050; + position: relative; + top: -7px; +} + +/* Opacity slider : Firefox */ + +.GPlayerOpacity input[type="range"]::-moz-range-track { + width: 80px; + height: 3px; +} + +.GPlayerOpacity input[type="range"]::-moz-range-thumb { + width: 5px; + height: 13px; + border: 2px solid #FFF; + border-radius: 0; + box-shadow: 0; + background-color: #505050; + position: relative; +} + +/* Opacity slider : IE */ + +.GPlayerOpacity input[type="range"]::-ms-track { + border: 0; + border-color: transparent; + border-radius: 0; + border-width: 0; + color: transparent; + height: 3px; + width: 80px; +} + +.GPlayerOpacity input[type="range"]::-ms-fill-lower, +.GPlayerOpacity input[type="range"]::-ms-fill-upper { + background: transparent; + border-radius: 0; +} + +.GPlayerOpacity input[type="range"]::-ms-thumb { + width: 5px; + height: 13px; + border: 2px solid #FFF; + background-color: #505050; +} + +.GPlayerOpacity input[type="range"]::-ms-tooltip { + display: none; +} + +/* Layer info panel */ + +#GPlayerInfoPanel { + position: absolute; + top: 0; + overflow-y: hidden; + padding-top: 10px; + padding-bottom: 10px; +} + +.GPlayerInfoPanelOpened { + display: block; +} + +.GPlayerInfoPanelClosed { + display: none; +} + +#GPlayerInfoContent { + position: relative; + width: 280px; + max-height: 200px; + overflow-y: auto; + padding-left: 10px; + padding-right: 10px; +} + +#GPlayerInfoTitle { + width: calc(100% - 52px); + margin: auto; + margin-bottom: 10px; + padding-bottom: 5px; + text-align: center; + font-size: 1.1em; + font-weight: bold; +} + +#GPlayerInfoQuicklook { + position: absolute; + top: -2px; + left: 10px; + width: 20px; + height: 20px; + cursor: pointer; +} + +#GPlayerInfoClose { + position: absolute; + top: -8px; + right: 10px; + width: 28px; + height: 28px; + cursor: pointer; +} + +#GPlayerInfoDescription { + font-size: 0.9em; +} + +.GPlayerInfoSubtitle { + padding-left: 35px; + font-weight: bold; + margin-top: 10px; + margin-bottom: 4px; +} + +.GPlayerInfoLink, +.GPlayerInfoPopup { + line-height: 20px; + padding-left: 23px; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + color: #999999; + background-repeat: no-repeat; + cursor: pointer; +} + +.GPlayerInfoLink { + background-position: 0 -20px; +} + +.GPlayerInfoLink:hover, +.GPlayerInfoPopup:hover { + color: #333; +} + +.GPlayerInfoLink a, +.GPlayerInfoLink a:visited +.GPlayerInfoLink a:focus +.GPlayerInfoLink a:hover { + text-decoration: none; + color: inherit; +} +/* Location */ + +/* Location form */ + +.GPlocationStageFlexInput { + max-height: 28px; + opacity: 1; +} + +.GPlocationStageFlexInputHidden { + max-height: 0; + opacity: 0; + overflow: hidden; +} + +.GPlocationOriginVisible { + display: block; +} + +.GPlocationOriginHidden { + display: none; +} + +label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"] { + width: 28px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + border-right: 1px solid #999; +} + +input[id*="GPlocationOriginPointer"] + .GPlocationOriginPointerImg { + background-position: -1px -1px; +} + +input[id*="GPlocationOriginPointer"]:checked + .GPlocationOriginPointerImg { + background-position: -29px -1px; +} + +.GPlocationStageRemove, +div[id^=GPlocationStageAdd] { + width: 28px; + border: none; + cursor: pointer; +} + +.GPlocationStageRemove { + background-position: -84px 0; +} + +div[id^=GPlocationStageAdd] { + background-position: -56px 0; +} + +/* Showing/hiding drawing panel */ + +label[id^=GPshowMeasureAreaPicto-] { + display: inline-block; +} + +input[id^=GPshowMeasureArea-] + label { + display: block; +} + +input[id^=GPshowMeasureArea-]:checked + label { + display: block; + background-color: rgba(0,60,136,0.5); +} + +input[id^=GPshowMeasureArea-] + label + div { + display: block; +} + +input[id^=GPshowMeasureArea-]:checked + label + div { + display: block; +} + +/* Showing/hiding drawing panel */ + +label[id^=GPshowMeasureAzimuthPicto-] { + display: inline-block; +} + +input[id^=GPshowMeasureAzimuth-] + label { + display: block; +} + +input[id^=GPshowMeasureAzimuth-]:checked + label { + display: block; + background-color: rgba(0,60,136,0.5); +} + +input[id^=GPshowMeasureAzimuth-] + label + div { + display: block; +} + +input[id^=GPshowMeasureAzimuth-]:checked + label + div { + display: block; +} + +/* Showing/hiding drawing panel */ + +label[id^=GPshowMeasureLengthPicto-] { + display: inline-block; +} + +input[id^=GPshowMeasureLength-] + label { + display: block; +} + +input[id^=GPshowMeasureLength-]:checked + label { + display: block; + background-color: rgba(0,60,136,0.5); +} + +input[id^=GPshowMeasureLength-] + label + div { + display: block; +} + +input[id^=GPshowMeasureLength-]:checked + label + div { + display: block; +} + +/* MEASURE TOOL */ + +.tooltip { + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 4px; + color: white; + padding: 4px 8px; + white-space: nowrap; +} + +.tooltip-measure { + font-weight: bold; +} + +.tooltip-info { + font-size: 0.75em; + text-align: center; +} + +.tooltip-static { + background-color: #ffcc33; + color: black; + border: 1px solid white; +} + +.tooltip-hidden { + display: none; +} + +.tooltip-measure::before, +.tooltip-info::before, +.tooltip-static::before { + border-top: 6px solid rgba(0, 0, 0, 0.5); + border-right: 6px solid transparent; + border-left: 6px solid transparent; + content: ""; + position: absolute; + bottom: -6px; + margin-left: -7px; + left: 50%; +} + +.tooltip-static::before { + border-top-color: #ffcc33; +} + +/* MOUSE POSITION */ + +/* Showing/hiding mouse position panel */ + +label[id^=GPshowMousePositionPicto] { + display: inline-block; +} + +input[id^=GPshowMousePosition-] + label { + display: block; +} + +input[id^=GPshowMousePosition-]:checked + label { + display: none; +} + +input[id^=GPshowMousePosition-] + label + div { + display: none; +} + +input[id^=GPshowMousePosition-]:checked + label + div { + display: block; +} + +/* General panels */ + +div[id^=GPmousePositionPanel-] { + width: 240px; + overflow: hidden; +} + +/* Basic infos */ + +div[id^=GPmousePositionBasicPanel] { + padding: 10px 15px; +} + +.GPmousePositionLabel, +.GPmousePositionCoords { + display: inline-block; + line-height: 20px; +} + +.GPmousePositionLabel { + width: 80px; + font-weight: bold; +} + +.GPmousePositionCoords { + width: 110px; +} + +/* Showing settings */ + +.GPshowMousePositionSettingsPicto { + bottom: 5px; + right: 0; + transition: all 0.5s ease-out 0s; +} + +div[id^=GPmousePosition-] input[type="checkbox"]:checked + .GPshowMousePositionSettingsPicto { + bottom: 100px; +} + +div[id^=GPmousePositionSettings-] { + display: block; + max-height: 0; + opacity: 0; + transition: max-height 0.5s ease-out 0s, opacity 0.5s ease-out 0s; +} + +div[id^=GPmousePosition-] input[type="checkbox"]:checked + label + div[id^=GPmousePositionSettings-] { + max-height: 95px; + opacity: 1; +} + +/* Settings */ + +div[id^=GPmousePositionSettings-] { + height: 95px; + padding-left: 0 15px; + overflow: hidden; +} + +.GPmousePositionSettingsLabel { + display: block; + margin: auto; + text-align: center; + font-weight: bold; + line-height: 16px; +} + +.GPmousePositionSettingsSelect { + width: 180px; + margin-top: 5px; +} + +/* Map center localisation */ + +#GPmapCenter { + display: none; + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + margin-top: -25px; + margin-left: -25px; +} + +#GPmapCenter.GPmapCenterVisible { + display: block; +} + +/* REVERSE GEOCODING */ + +[id^="GPreverseGeocoding-"] { + top: 180px; +} + +/* Showing/hiding reverse geocoding panel */ + +[id^="GPshowReverseGeocodingPicto-"] { + display: inline-block; +} + +[id^="GPshowReverseGeocoding-"] + label { + display: block; +} + +[id^="GPshowReverseGeocoding-"]:checked + label { + display: none; +} + +[id^="GPshowReverseGeocoding-"] + label + div { + display: none; +} + +[id^="GPshowReverseGeocoding-"]:checked + label + div { + display: block; +} + +/* General panels */ + +div[id^=GPreverseGeocodingResultsClose] { + top: 0; + right: 0; + width: 30px; + height: 32px; + /*background-position: -26px 0;*/ +} + +[id^="GPreverseGeocodingPanel-"] { + width: 280px; +} + +.GPreverseGeocodingComponentHidden { + display: none; +} + +div[id^="GPreverseGeocodingReturnPicto-"] { + position: absolute; + width: 26px; + height: 26px; + border-radius: 3px; + opacity: 1; + background-position: 0 0; + cursor: pointer; +} + +.GPreverseGeocodingReturnPictoHidden { + display: none; +} + +/* Calc waiting */ + +.GPreverseGeocodingCalcWaitingContainerVisible, +.GPreverseGeocodingCalcWaitingContainerHidden { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255,255,255,0.9); + font-size: 1.5em; + font-weight: bold; + overflow: hidden; +} + +.GPreverseGeocodingCalcWaitingContainerVisible { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; +} + +.GPreverseGeocodingCalcWaitingContainerHidden { + display: none; +} + +.GPreverseGeocodingCalcWaiting { + margin: auto; +} + +/* Search panel */ + +[id^="GPreverseGeocodingForm-"] { + position: relative; + max-height: 270px; + overflow-y: auto; + padding-left: 15px; + padding-right: 15px; + padding-top: 10px; +} + +.GPreverseGeocodingCodeLabel, +.GPreverseGeocodingFilterLabel { + max-width: 105px; +} + +.GPreverseGeocodingCodeLabel, +.GPreverseGeocodingCode { + margin-top: 5px; + margin-bottom: 0; +} + +.GPreverseGeocodingFilterLabel, +.GPreverseGeocodingFilterInput { + margin-bottom: 5px; +} + +input[id^="GPreverseGeocodingSubmit-"] { + margin-top: 5px; + margin-bottom: 15px; + width: 100px; +} + +/* Calc waiting */ + +.GPreverseGeocodingCalcWaitingContainerVisible, +.GPreverseGeocodingCalcWaitingContainerHidden { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255,255,255,0.9); + font-size: 1.5em; + font-weight: bold; + overflow: hidden; +} + +.GPreverseGeocodingCalcWaitingContainerVisible { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; +} + +.GPreverseGeocodingCalcWaitingContainerHidden { + display: none; +} + +.GPreverseGeocodingCalcWaiting { + margin: auto; +} + +/* Result panel */ + +div[id^=GPreverseGeocodingResultsList-] { + position: relative; + max-height: 210px; + overflow-y: auto; +} + +/* ROUTE */ + +div[id^=GProute-] { + top: 100px; +} + +/* Showing/hiding route panel */ + +label[id^=GPshowRoutePicto] { + display: inline-block; +} + +input[id^=GPshowRoute-] + label { + display: block; +} + +input[id^=GPshowRoute-]:checked + label { + display: none; +} + +input[id^=GPshowRoute-] + label + div { + display: none; +} + +input[id^=GPshowRoute-]:checked + label + div { + display: block; +} + +/* General panels */ + +div[id^=GProutePanel-] { + width: 320px; +} + +.GProuteComponentHidden { + display: none; +} + +/* Calc waiting */ + +.GProuteCalcWaitingContainerVisible, +.GProuteCalcWaitingContainerHidden { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255,255,255,0.9); + font-size: 1.5em; + font-weight: bold; + overflow: hidden; +} + +.GProuteCalcWaitingContainerVisible { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; +} + +.GProuteCalcWaitingContainerHidden { + display: none; +} + +.GProuteCalcWaiting { + margin: auto; +} + +/* Route form */ + +form[id^=GProuteForm] { + padding: 15px; +} + +.GProuteFormMini { + max-height: 58px; + overflow: hidden; + -webkit-transform: translateY(-5px); + transform: translateY(-5px); +} + +.GProuteStageFlexInput { + max-height: 28px; + opacity: 1; +} + +.GProuteStageFlexInputHidden { + max-height: 0; + opacity: 0; + overflow: hidden; +} + +form[id^=GProuteForm] > .GPlocationStageFlexInput { + margin-top: 5px; +} + +form[id^=GProuteForm] > .GPlocationStageFlexInputHidden { + margin-top: 0; +} + +form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child { + margin-top: 5px; +} + +.GProuteOriginVisible { + display: block; +} + +.GProuteOriginHidden { + display: none; +} + +label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"] { + width: 28px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + border-right: 1px solid #999; +} + +input[id*="GProuteOriginPointer"] + .GProuteOriginPointerImg { + background-position: -1px -1px; +} + +input[id*="GProuteOriginPointer"]:checked + .GProuteOriginPointerImg { + background-position: -29px -1px; +} + +.GProuteStageRemove, +div[id^=GProuteStageAdd] { + width: 28px; + border: none; + cursor: pointer; +} + +.GProuteFormMini .GProuteStageRemove, +.GProuteFormMini div[id^=GProuteStageAdd] { + display: none; +} + +.GProuteStageRemove { + background-position: -84px 0; +} + +div[id^=GProuteStageAdd] { + background-position: -56px 0; +} + +/* Mode choice */ + +div[id^=GProuteModeChoice] { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; + margin: 15px 0; +} + +.GProuteModeLabel { + display: block; + text-align: center; + margin-bottom: 5px; +} + +div[id^=GProuteTransportChoice] input { + display: none; +} + +.GProuteTransportImg { + display: inline-block; + width: 28px; + height: 28px; + cursor: pointer; +} + +.GProuteTransportImg:first-of-type { + margin-left: 18px; + margin-right: 10px; +} + +input[id^=GProuteTransportCar] + .GProuteTransportImg { + background-position: -112px 0; +} + +input[id^=GProuteTransportCar]:checked + .GProuteTransportImg { + background-position: -140px 0; +} + +input[id^=GProuteTransportPedestrian] + .GProuteTransportImg { + background-position: -168px 0; +} + +input[id^=GProuteTransportPedestrian]:checked + .GProuteTransportImg { + background-position: -196px 0; +} + +select[id^=GProuteComputationSelect] { + width: 100px; +} + +/* Showing/hiding exclusions */ + +input[id^=GPshowRouteExclusions] { + display: none; +} + +.GPshowRouteExclusionsPicto { + top: 185px; + right: 0; + transition: all 0.3s ease-out 0s; +} + +input[id^=GPshowRouteExclusions] + label + div[id^=GProuteExclusions] { + max-height: 0; + opacity: 0; + margin-bottom: 0; +} + +input[id^=GPshowRouteExclusions]:checked + label + div[id^=GProuteExclusions] { + display: block; + max-height: 60px; + opacity: 1; + margin-bottom: 15px; +} + +/* Exclusions */ + +div[id^=GProuteExclusions] { + transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s, margin 0.3s ease-in-out 0.25s; + overflow: hidden; +} + +.GProuteExclusionsLabel { + display: block; + text-align: center; + margin-bottom: 10px; + font-weight: bold; + line-height: 16px; +} + +.GProuteExclusionsOptions { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; +} + +.GProuteExclusionsOption { + display: block; + height: 28px; + line-height: 26px; + color: #A77; + background-color: #FEE; + padding-left: 28px; + padding-right: 5px; + border: 1px solid #A77; + border-radius: 3px; + cursor: pointer; +} + +input:checked + .GProuteExclusionsOption { + background-color: #EFE; + background-position: 0 -28px; + color: #797; + border: 1px solid #797; +} + +/* Reset picto */ +div[id^=GProuteReset] { + position: absolute; + width: 28px; + height: 28px; + border-radius: 3px; + opacity: 0.8; + background-position: -224px 0; + transition: opacity 0.2s ease-out; + cursor: pointer; +} + +div[id^=GProuteReset]:hover { + opacity: 1; +} + +/* Result panel */ + +div[id^=GProuteResultsPanel] { + padding: 15px; +} + +.GProuteResultStage { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; +} + +div[id^=GProuteResultsStages] { + margin-bottom: 15px; +} + +.GProuteResultStageLabel, +.GProuteResultStageValue, +.GProuteResultsValueLabel, +div[id^=GProuteResultsValueDist], +div[id^=GProuteResultsValueTime] { + display: inline-block; + line-height: 18px; +} + +.GProuteResultStageLabel, +.GProuteResultsValueLabel { + color: #666; +} + +.GProuteResultStageLabel { + width: 60px; +} + +.GProuteResultsValueLabel { + width: 65px; +} + +.GProuteResultStageValue { + -webkit-flex: 1; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +div[id^=GProuteResultsValueDist], +div[id^=GProuteResultsValueTime] { + width: 80px; + font-weight: bold; +} + +div[id^=GProuteResults-] { + display: -webkit-flex; + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -webkit-justify-content: space-between; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 10px; +} + +select[id^=GProuteResultsComputationSelect] { + width: 100px; +} + +div[id^=GProuteResultsNew] { + width: 28px; + height: 28px; + border-radius: 3px; + opacity: 0.8; + background-position: -224px 0; + transition: opacity 0.2s ease-out; + cursor: pointer; +} + +div[id^=GProuteResultsNew]:hover { + opacity: 1; +} + +/* Results details header */ + +.GPfakeBorder { + display: inline-block; + height: 14px; + width: 60px; + border-bottom: 1px solid #999; +} + +.GPfakeBorderLeft { + margin-left:15px; +} + +input[id^=GProuteResultsShowDetails] + label, +input[id^=GProuteResultsShowDetails] + label + label { + width: 130px; + line-height: 28px; + vertical-align: top; + text-align: center; + font-weight: bold; + cursor: pointer; + transition: color 0.2s ease-out; +} + +input[id^=GProuteResultsShowDetails] + label, +input[id^=GProuteResultsShowDetails]:checked + label + label { + display: inline-block; +} + +input[id^=GProuteResultsShowDetails]:checked + label, +input[id^=GProuteResultsShowDetails] + label + label { + display: none; +} + +input[id^=GProuteResultsShowDetails] + label + label + div + div[id^=GProuteResultsDetails] { + max-height: 0; + opacity: 0; +} + +input[id^=GProuteResultsShowDetails]:checked + label + label + div + div[id^=GProuteResultsDetails] { + max-height: 200px; + opacity: 1; +} + +div[id^=GProuteResultsDetails] { + overflow-y: auto; + transition: max-height 0.5s ease-in-out 0.25s, opacity 0.5s ease-in-out 0.25s; +} + +.GProuteResultsDetailsNumber, +.GProuteResultsDetailsInstruction { + display: inline-block; + margin-top: 4px; + line-height: 16px; + color: #666; +} + +.GProuteResultsDetailsNumber { + font-weight: bold; + width: 22px; + text-align: right; + vertical-align: top; +} + +.GProuteResultsDetailsInstruction { + width: calc(100% - 30px); + padding-left: 5px; +} + +/* SEARCH ENGINE */ + +input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] { + max-width: 0px; +} + +#GPlayerSwitcher label { /* FIXME !? */ + display: block; +} + +/* Showing/hiding search engine input */ + +input[id^=GPshowSearchEngine-] { + display: none; +} + +label[id^=GPshowSearchEnginePicto] { + display: inline-block; + transition: border-radius 0s ease-out 0s; + transition-delay: 0.5s; +} + +input[id^=GPshowSearchEngine-]:checked + label { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + transition-delay: 0s; +} + +input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] { + max-width: 0px; + border: none; + transition: max-width 0.5s ease-out 0s; +} + +input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] { + max-width: 280px; +} + +input[id^=GPshowSearchEngine-] + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] { + display: none; +} + +input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPshowAdvancedSearch] { + display: inline-block; +} + +div[id^=GPautoCompleteList] { + display: none; +} + +input[id^=GPshowSearchEngine-]:checked + label + form[id^=GPsearchInput-] + div[id^=GPautoCompleteList] { + display: block; +} + +/* Simple search input */ + +form[id^=GPsearchInput-] { + display: inline-block; + position: relative; + left: -3px; + width: 280px; + overflow: hidden; +} + +form[id^=GPsearchInput-] input { + display: block; + width: 100%; + height: 100%; + border: 1px solid #999; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + padding: 0; + padding-right: 30px; + padding-left: 5px; + color: #333; + font-size: 1.0em; +} + +form[id^=GPsearchInput-] input:disabled { + background-color: #DDD; + color: #999; +} + +div[id^=GPsearchInputReset] { + position: absolute; + top: 0; + right: 0; + width: 30px; + height: 32px; + background-position: -30px 0; + cursor: pointer; +} + +/* General panels */ + +div[id^=GPgeocodeResultsClose], +div[id^=GPadvancedSearchClose] { + top: 0; + right: 0; + width: 30px; + height: 32px; +} + +div[id^=GPgeocodeResultsClose] { + background-position: 0 0; +} + +div[id^=GPadvancedSearchClose] { + background-repeat: no-repeat; +} + +/* Advanced search picto */ + +div[id^=GPshowAdvancedSearch] { + transition: border-radius 0s ease-out 0s; + transition-delay: 0.5s; +} + +/* Advanced search panel */ + +div[id^=GPadvancedSearchPanel] { + display: none; + width: 280px; + vertical-align: top; + overflow: hidden; +} + +form[id^=GPadvancedSearchForm] { + max-height: 220px; + overflow-y: auto; + padding-left: 15px; + padding-right: 15px; +} + +.GPadvancedSearchCodeLabel, +.GPadvancedSearchFilterLabel { + max-width: 105px; +} + +.GPadvancedSearchCodeLabel, +.GPadvancedSearchCode, + div[id^=GPadvancedSearchFilters] { + margin-top: 15px; +} + +.GPadvancedSearchFilterLabel, +.GPadvancedSearchFilterInput { + margin-bottom: 5px; +} + +input[id^=GPadvancedSearchSubmit] { + margin-top: 10px; + margin-bottom: 15px; +} + +/* Autocomplete list / geocode results */ + +div[id^=GPautoCompleteList], +div[id^=GPgeocodeResultsList] { + width: 280px; +} + +div[id^=GPautoCompleteList] { + top: 35px; +} + +div[id^=GPgeocodeResultsList] { + display: none; + position: absolute; + top: 40px; + border-radius: 4px; + overflow: hidden; +} + +div[id^=GPgeocodeResults-] { + background-color: #FFF; + max-height: 140px; + overflow-y: auto; +} + + +.GPwidget { + position: relative; /* overwritten */ +} + + +#GPadvancedToolsPanel { + position: initial; /* overwritten */ +} + +/* General panels */ + +.GPpanel { + box-shadow: 0 1px 5px #000; + border-radius: 5px; +} + +.GPpanelHeader { + height: 32px; + background-color: #FFF; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.GPpanelTitle { + width: calc(100% - 60px); + margin: auto; + line-height: 32px; + color: #C77A04; + border-bottom: 1px solid #C77A04; +} + +.GPpanelClose { + top: 0; + right: 0; + width: 30px; + height: 32px; + background-position: -30px 1px; +} + +.GPpanelReduce { + top: 0; + right: 30px; + width: 30px; + height: 32px; + background-position: -60px 1px; +} + +/* Showing/hiding advanced panel */ + +.GPshowAdvancedToolPicto { + width: 30px; + height: 30px; + box-shadow: 0 1px 5px #000; + background-color: #FFF; + border-radius: 5px; +} + +.GPshowAdvancedToolPicto:hover { + background-color: #F4F4F4; +} + +.GPshowAdvancedToolOpen { + width: 100%; + height: 100%; +} + +/* Submit inputs */ + +input.GPinputSubmit { + background-color: #C77A04; +} + +/* Showing additional hidden options */ + +.GPshowMoreOptions { + background-image: url("../img/gp/GPshowMoreOptions.png"); +} + +div[id^=GPelevationPath-] { + top: 0; /*overwritten*/ +} + +/* Showing/hiding elevationPath panel */ + +label[id^=GPshowElevationPathPicto] { + display: inline-block; +} + +input[id^=GPshowElevationPath-] + label { + display: block; +} + +input[id^=GPshowElevationPath-]:checked + label { + /* display: none; */ +} + +input[id^=GPshowElevationPath-] + label + div { + display: none; +} + +input[id^=GPshowElevationPath-]:checked + label + div { + display: block; +} + +span[id^=GPshowElevationPathOpen] { + background-image: url("../img/gp/GPshowElevationPath.png"); +} + +/* Panel */ + +[id^=GPelevationPathPanelClose] { + background-image: url("../img/gp/GPshowElevationPath.png"); +} + +div[id^=GPelevationPathPanelReduce] { + background-image: url("../img/gp/GPshowElevationPath.png"); +} + +[id^=GPelevationPathPanel-] { + width: 280px; +} + +/* ELEVATION PATH DISPLAY */ + +[id^=GPelevationPathProfil] { + height: 150px; + width: inherit; + line-height: normal; /* surcharge leaflet container */ +} + +/*.GPpanelHeader { + padding: unset; +}*/ + +/* +@media (min-width:720px) and (min-height:720px) { + +[id^=GPelevationPathPanel] { +top: 15px; +left: 15px; +} + +} + +@media (min-width:720px) and (min-height:520px) { + +[id^=GPelevationPathPanel] { +width: 460px; +} + +[id^=GPelevationPathProfil] { +height: 220px; +} + +} + +@media (max-width:560px), (max-height:340px) { + +[id^=GPelevationPathPanel] { +display: none !important; +} + +} +*/ + +/* ISOCHRON */ + +div[id^=GPisochron-] { + /* left: 10px; */ + top: 0; /*overwritten*/ +} + +/* Showing/hiding isochron panel */ + +span[id^=GPshowIsochronOpen] { + background-image: url("../img/gp/GPisochronOpen.png"); +} + +/* General panels */ + +div[id^=GPisochronPanel-] { + left: 10px; +} + +div[id^=GPisochronPanelClose] { + background-image: url("../img/gp/GPisochronOpen.png"); +} + +div[id^=GPisochronPanelReduce] { + background-image: url("../img/gp/GPisochronOpen.png"); +} + +/* Calc waiting */ + +.GPisochronCalcWaitingContainerVisible, +.GPisochronCalcWaitingContainerHidden { + border-radius: 5px; +} + +/* Isochron form */ + +.GPisochronChoiceAlt input:checked + label + span { + color: #C77A04; +} + +.GPisochronOriginPointerImg, +.GPisochronChoiceAltImg, +.GPisochronTransportImg { + background-image: url("../img/gp/GPisochronOptions.png"); +} + +.GPisoExclusionsOption { + background-image: url("../img/gp/GPisochronCheck.png"); +} + +/* Reset picto */ +div[id^=GPisochronReset] { + background-color: #C77A04; + background-image: url("../img/gp/GPisochronOptions.png"); +} + +/* LAYER SWITCHER LEAFLET */ + +#GPlayerSwitcher { + top: 10px; + right: 10px; +} + +/* Showing/hiding layers list */ + +#GPshowLayersListPicto { + width: 36px; + height: 36px; +} + +#GPshowLayersListOpen, +#GPshowLayersListClose { + background-image: url("../img/gp/GPshowLayersList.png"); +} + +#GPshowLayersListClose { + background-position: -36px 0; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto { + box-shadow: 0 2px 2px #000; + border-top: 1px solid #CCC; +} + +#GPlayerSwitcher input[type="checkbox"]:checked + div + #GPshowLayersListPicto #GPshowLayersListOpen { + opacity: 0.4; +} + +/* Layers list */ + +.GPlayerVisibility, +.GPshowLayerAdvancedTools, +.GPlayerInfo, +.GPlayerInfoOpened, +.GPlayerRemove { + background-image: url("../img/gp/GPlayerTools.png"); +} + +/* Opacity slider : Chrome, Safari, Opera */ + +.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track { + background: url("../img/gp/GPopacitySlider.png"); +} + +/* Opacity slider : Firefox */ + +.GPlayerOpacity input[type="range"]::-moz-range-track { + background: url("../img/gp/GPopacitySlider.png"); +} + +/* Opacity slider : IE */ + +.GPlayerOpacity input[type="range"]::-ms-track { + background: url("../img/gp/GPopacitySlider.png"); +} + +/* Layer info panel */ + +#GPlayerInfoPanel { + right: 190px; +} + +#GPlayerInfoTitle { + color: #C77A04; + border-bottom: 1px solid #C77A04; +} + +#GPlayerInfoQuicklook { + background-image: url("../img/gp/GPlayerInfo.png"); +} + +#GPlayerInfoClose { + background-image: url("../img/gp/GPlayerInfoClose.png"); +} + +.GPlayerInfoLink, +.GPlayerInfoPopup { + background-image: url("../img/gp/GPlayerInfo.png"); +} + +/* Location */ + +.GPlocationStageFlexInput { + margin-bottom: 5px; /*overwritten*/ +} + +/* Location form */ + +.GPlocationOriginPointerImg, +.GPlocationStageRemove, +div[id^=GPlocationStageAdd], +.GPlocationTransportImg { + background-image: url("../img/gp/GPlocationOptions.png"); +} + +/* MOUSE POSITION */ + +div[id^=GPmousePosition-] { + /* bottom: 10px; */ + /* left: 10px; */ +} + +/* Showing/hiding mouse position panel */ + +span[id^=GPshowMousePositionOpen] { + background-image: url("../img/gp/GPmousePositionOpen.png"); +} + +/* General panels */ + +div[id^=GPmousePositionPanelClose] { + background-image: url("../img/gp/GPmousePositionOpen.png"); +} + +/* Map center localisation */ + +#GPmapCenter { + background-image: url("../img/gp/GPmapCenter.png"); +} + +/* REVERSE GEOCODING */ + +[id^="GPreverseGeocoding-"] { + /*left: 10px;*/ + top: 0; /*overwritten*/ +} + +/* Showing/hiding reverse geocoding panel */ + +[id^="GPshowReverseGeocodingOpen-"] { + background-image: url("../img/gp/GPreverseGeocodingOpen.png"); +} + +/* General panels */ + +[id^="GPreverseGeocodingPanel-"] { + left: 10px; +} + +[id^="GPreverseGeocodingPanelClose-"] { + background-image: url("../img/gp/GPreverseGeocodingOpen.png"); +} + +/* Calc waiting */ + +.GPreverseGeocodingCalcWaitingContainerVisible, +.GPreverseGeocodingCalcWaitingContainerHidden { + border-radius: 5px; +} + +/* Results panel */ + +[id^="GPreverseGeocodingReturnPicto-"] { + width: 30px !important; + height: 30px !important; + background-color: #C77A04; + background-image: url("../img/gp/GPreturn.png"); +} + +.GPreverseGeocodedLocationHighlight { + background-color: rgba(255,200,0,0.25); + color: #222; +} + +/* ROUTE */ + +div[id^=GProute-] { + /* left: 10px; */ + top: 0; /*overwritten*/ +} + +.GProuteStageFlexInput { + margin-bottom: 5px; /*overwritten*/ +} + +/* Showing/hiding route panel */ + +span[id^=GPshowRouteOpen] { + background-image: url("../img/gp/GProuteOpen.png"); +} + +/* General panels */ + +div[id^=GProutePanel-] { + left: 10px; +} + +div[id^=GProutePanelClose] { + background-image: url("../img/gp/GProuteOpen.png"); +} + +/* Calc waiting */ + +.GProuteCalcWaitingContainerVisible, +.GProuteCalcWaitingContainerHidden { + border-radius: 5px; +} + +/* Route form */ + +.GProuteOriginPointerImg, +.GProuteStageRemove, +div[id^=GProuteStageAdd], +.GProuteTransportImg { + background-image: url("../img/gp/GProuteOptions.png"); +} + +.GProuteExclusionsOption { + background-image: url("../img/gp/GProuteCheck.png"); +} + +/* Results panel */ + +div[id^=GProuteResultsValueDist], +div[id^=GProuteResultsValueTime] { + color: #C77A04; +} + +div[id^=GProuteResultsNew] { + background-color: #C77A04; + background-image: url("../img/gp/GProuteOptions.png"); +} + +input[id^=GProuteResultsShowDetails] + label:hover, +input[id^=GProuteResultsShowDetails] + label + label:hover { + color: #C77A04; +} + +.GProuteResultsDetailsHighlight { + background-color: rgba(255,200,0,0.25); + color: #222; +} + +/* SEARCH ENGINE */ + +div[id^=GPsearchEngine-] { + /* top: 10px; */ + /* left: 46px; */ +} + +/* Showing/hiding search engine input */ + +span[id^=GPshowSearchEngineOpen] { + background-image: url("../img/gp/GPsearchEngineOpen.png"); +} + +/* Simple search input */ + +form[id^=GPsearchInput-] { + height: 30px; +} + +div[id^=GPsearchInputReset] { + background-image: url("../img/gp/GPsearchEngineClose.png"); +} + +/* General panels */ + +div[id^=GPgeocodeResultsClose] { + background-image: url("../img/gp/GPsearchEngineClose.png"); +} + +div[id^=GPadvancedSearchClose] { + background-image: url("../img/gp/GPsearchEngineOpen.png"); + background-position: -60px 0; +} + +/* Advanced search picto */ + +span[id^=GPshowAdvancedSearchOpen] { + background-image: url("../img/gp/GPsearchEngineOpen.png"); + background-position: -30px 0; +} + +/* Autocomplete list / geocode results */ + +div[id^=GPautoCompleteList], +div[id^=GPgeocodeResultsList] { + margin-left: 27px; + box-shadow: 0 1px 5px #000; +} + +div[id^=GPgeocodeResultsList] { + top: 38px; + border-radius: 5px; +} + +/* ================================================================== */ +/* Toolbars +/* ================================================================== */ + +.leaflet-draw-section { + position: relative; +} + +.leaflet-draw-toolbar { + margin-top: 12px; +} + +.leaflet-draw-toolbar-top { + margin-top: 0; +} + +.leaflet-draw-toolbar-notop a:first-child { + border-top-right-radius: 0; +} + +.leaflet-draw-toolbar-nobottom a:last-child { + border-bottom-right-radius: 0; +} + +.leaflet-draw-toolbar a { + background-image: url('../img/gp/spritesheet.png'); + background-repeat: no-repeat; +} + +.leaflet-retina .leaflet-draw-toolbar a { + background-image: url('../img/gp/spritesheet-2x.png'); + background-size: 270px 30px; +} + +.leaflet-draw a { + display: block; + text-align: center; + text-decoration: none; +} + +/* ================================================================== */ +/* Toolbar actions menu +/* ================================================================== */ + +.leaflet-draw-actions { + display: none; + list-style: none; + margin: 0; + padding: 0; + position: absolute; + left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */ + top: 0; + white-space: nowrap; +} + +.leaflet-touch .leaflet-draw-actions { + left: 32px; +} + +.leaflet-right .leaflet-draw-actions { + right:26px; + left:auto; +} + +.leaflet-touch .leaflet-right .leaflet-draw-actions { + right:32px; + left:auto; +} + +.leaflet-draw-actions li { + display: inline-block; +} + +.leaflet-draw-actions li:first-child a { + border-left: none; +} + +.leaflet-draw-actions li:last-child a { + -webkit-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.leaflet-right .leaflet-draw-actions li:last-child a { + -webkit-border-radius: 0; + border-radius: 0; +} + +.leaflet-right .leaflet-draw-actions li:first-child a { + -webkit-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.leaflet-draw-actions a { + background-color: #919187; + border-left: 1px solid #AAA; + color: #FFF; + font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif; + line-height: 28px; + text-decoration: none; + padding-left: 10px; + padding-right: 10px; + height: 28px; +} + +.leaflet-touch .leaflet-draw-actions a { + font-size: 12px; + line-height: 30px; + height: 30px; +} + +.leaflet-draw-actions-bottom { + margin-top: 0; +} + +.leaflet-draw-actions-top { + margin-top: 1px; +} + +.leaflet-draw-actions-top a, +.leaflet-draw-actions-bottom a { + height: 27px; + line-height: 27px; +} + +.leaflet-draw-actions a:hover { + background-color: #A0A098; +} + +.leaflet-draw-actions-top.leaflet-draw-actions-bottom a { + height: 26px; + line-height: 26px; +} + +/* ================================================================== */ +/* Draw toolbar +/* ================================================================== */ + +.leaflet-draw-toolbar .leaflet-draw-draw-polyline { + background-position: -2px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline { + background-position: 0 -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-polygon { + background-position: -31px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon { + background-position: -29px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-rectangle { + background-position: -62px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle { + background-position: -60px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-circle { + background-position: -92px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle { + background-position: -90px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-draw-marker { + background-position: -122px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker { + background-position: -120px -1px; +} + +/* ================================================================== */ +/* Edit toolbar +/* ================================================================== */ + +.leaflet-draw-toolbar .leaflet-draw-edit-edit { + background-position: -152px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit { + background-position: -150px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-remove { + background-position: -182px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove { + background-position: -180px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { + background-position: -212px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { + background-position: -210px -1px; +} + +.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { + background-position: -242px -2px; +} + +.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { + background-position: -240px -2px; +} + +/* ================================================================== */ +/* Drawing styles +/* ================================================================== */ + +.leaflet-mouse-marker { + background-color: #fff; + cursor: crosshair; +} + +.leaflet-draw-tooltip { + background: rgb(54, 54, 54); + background: rgba(0, 0, 0, 0.5); + border: 1px solid transparent; + -webkit-border-radius: 4px; + border-radius: 4px; + color: #fff; + font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif; + margin-left: 20px; + margin-top: -21px; + padding: 4px 8px; + position: absolute; + visibility: hidden; + white-space: nowrap; + z-index: 6; +} + +.leaflet-draw-tooltip:before { + border-right: 6px solid black; + border-right-color: rgba(0, 0, 0, 0.5); + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + content: ""; + position: absolute; + top: 7px; + left: -7px; +} + +.leaflet-error-draw-tooltip { + background-color: #F2DEDE; + border: 1px solid #E6B6BD; + color: #B94A48; +} + +.leaflet-error-draw-tooltip:before { + border-right-color: #E6B6BD; +} + +.leaflet-draw-tooltip-single { + margin-top: -12px +} + +.leaflet-draw-tooltip-subtext { + color: #f8d5e4; +} + +.leaflet-draw-guide-dash { + font-size: 1%; + opacity: 0.6; + position: absolute; + width: 5px; + height: 5px; +} + +/* ================================================================== */ +/* Edit styles +/* ================================================================== */ + +.leaflet-edit-marker-selected { + background: rgba(254, 87, 161, 0.1); + border: 4px dashed rgba(254, 87, 161, 0.6); + -webkit-border-radius: 4px; + border-radius: 4px; + box-sizing: content-box; +} + +.leaflet-edit-move { + cursor: move; +} + +.leaflet-edit-resize { + cursor: pointer; +} + +/* ================================================================== */ +/* Old IE styles +/* ================================================================== */ + +.leaflet-oldie .leaflet-draw-toolbar { + border: 1px solid #999; +} diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/css/leaflet-gp-3.0.2.min.css Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,15 @@ +/*! + * @brief Geoportal Extension for Leaflet + * + * This software is released under the licence CeCILL-B (Free BSD compatible) + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt + * @see http://www.cecill.info/ + * + * copyright CeCILL-B + * copyright IGN + * @author IGN + * @version 0.8.1 + * @date 2016-12-02 + * + */label[id^=GPshowDrawingPicto-]{display:inline-block}input[id^=GPshowDrawing-]+label{display:block}input[id^=GPshowDrawing-]:checked+label{display:none}input[id^=GPshowDrawing-]+label+div{display:none}input[id^=GPshowDrawing-]:checked+label+div{display:block}div[^=GPdrawingPanel-]{width:240px;overflow:hidden}div[^=GPdrawingBasicPanel-]{padding:10px 15px}.GPdrawingLabel,.GPdrawingCoords{display:inline-block;line-height:20px}.GPdrawingLabel{width:80px;font-weight:bold}.GPdrawingCoords{width:110px}.marker-input-radio{display:none}input.marker-input-radio:checked+label{border:1px solid red}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPelevationPathCalcWaitingContainerVisible{display:-webkit-flex;display:flex}.GPelevationPathCalcWaitingContainerHidden{display:none}.GPelevationPathCalcWaiting{margin:auto}.GPelevationPathCalcWaitingContainerVisible,.GPelevationPathCalcWaitingContainerHidden{border-radius:5px}#profileElevationRaw{resize:none;padding:unset}div#profileElevationByDefault{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;flex-direction:column;height:inherit;width:inherit}div#profileElevationByDefault>*{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1 100%}ul#data-default{list-style:none;box-sizing:border-box;padding:0;position:relative;margin:10px;margin-top:auto;margin-bottom:auto;height:100px}.z-title-vertical{align-self:flex-start;padding-left:10px}.x-title-horizontal{align-self:flex-end;padding-right:10px}.z-axis{border-right:0;border-left:solid 2px;cursor:default}.x-axis{border-top:0;border-bottom:solid 2px;cursor:default}ul#data-default li.percent{display:inline-block;vertical-align:bottom;background-color:#c77a04;opacity:.3;border-top:solid 1px;border-radius:2px;cursor:pointer}li.axe span.bottom-axis{vertical-align:bottom}ul#data-default .percent:hover{display:inline-block;background-color:#f00}.v0{height:0}.v1{height:1%}.v2{height:2%}.v3{height:3%}.v4{height:4%}.v5{height:5%}.v6{height:6%}.v7{height:7%}.v8{height:8%}.v9{height:9%}.v10{height:10%}.v11{height:11%}.v12{height:12%}.v13{height:13%}.v14{height:14%}.v15{height:15%}.v16{height:16%}.v17{height:17%}.v18{height:18%}.v19{height:19%}.v20{height:20%}.v21{height:21%}.v22{height:22%}.v23{height:23%}.v24{height:24%}.v25{height:25%}.v26{height:26%}.v27{height:27%}.v28{height:28%}.v29{height:29%}.v30{height:30%}.v31{height:31%}.v32{height:32%}.v33{height:33%}.v34{height:34%}.v35{height:35%}.v36{height:36%}.v37{height:37%}.v38{height:38%}.v39{height:39%}.v40{height:40%}.v41{height:41%}.v42{height:42%}.v43{height:43%}.v44{height:44%}.v45{height:45%}.v46{height:46%}.v47{height:47%}.v48{height:48%}.v49{height:49%}.v50{height:50%}.v51{height:51%}.v52{height:52%}.v53{height:53%}.v54{height:54%}.v55{height:55%}.v56{height:56%}.v57{height:57%}.v58{height:58%}.v59{height:59%}.v60{height:60%}.v61{height:61%}.v62{height:62%}.v63{height:63%}.v64{height:64%}.v65{height:65%}.v66{height:66%}.v67{height:67%}.v68{height:68%}.v69{height:69%}.v70{height:70%}.v71{height:71%}.v72{height:72%}.v73{height:73%}.v74{height:74%}.v75{height:75%}.v76{height:76%}.v77{height:77%}.v78{height:78%}.v79{height:79%}.v80{height:80%}.v81{height:81%}.v82{height:82%}.v83{height:83%}.v84{height:84%}.v85{height:85%}.v86{height:86%}.v87{height:87%}.v88{height:88%}.v89{height:89%}.v90{height:90%}.v91{height:91%}.v92{height:92%}.v93{height:93%}.v94{height:94%}.v95{height:95%}.v96{height:96%}.v97{height:97%}.v98{height:98%}.v99{height:99%}.v100{height:100%}text{fill:#5e5e5e;font-family:Verdana;font-size:10px;opacity:1;text-anchor:end}.axis-d3{fill:none;stroke:#5e5e5e;stroke-width:1;shape-rendering:crispEdges}.area-d3{fill:#c77a04;stroke:#5e5e5e;stroke-width:0;fill-opacity:.4}.line-d3{fill:none;stroke:#c77a04;stroke-width:1px}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.grid-d3 .tick{stroke:lightgrey;opacity:.7}.grid-d3 path{stroke-width:0}.overlay-d3{fill:none;pointer-events:all}.focusLine-d3{fill:none;stroke:#c77a04;stroke-width:.5px}.focusCircle-d3{fill:#c77a04}div.tooltip-d3{position:inherit;text-align:left;width:80px;height:35px;padding:2px;font:8px sans-serif;background:lightsteelblue;border:0;border-radius:8px;pointer-events:none}.GPwidget{position:absolute;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;font-size:13px;color:#333}.GPwidget input[type='text'],.GPwidget input[type='button']{-webkit-appearance:none;color:#333}.GPwidget input[type="checkbox"]{display:none}.GPwidget select{padding-left:3px;border-radius:3px}.GPwidget form{margin-bottom:0}.GPwidget *{box-sizing:border-box;background-repeat:no-repeat}.GPwaiting{background-image:url("../img/gp/waiting.gif");background-position:center center;background-repeat:no-repeat}.GPpanel{background-color:#FFF}.GPpanelHeader{position:relative;width:100%}.GPpanelTitle{width:100%;height:100%;text-align:center;font-weight:bold}.GPpanelClose,.GPpanelReduce{position:absolute;cursor:pointer}.GPshowAdvancedToolPicto{position:relative;box-sizing:border-box;cursor:pointer}.GPshowAdvancedToolOpen{position:absolute;display:block;box-sizing:border-box}.GPflexInput{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;transition:max-height .3s ease-out,opacity .3s ease-out}.GPflexInput>*{display:block;height:28px;line-height:26px;border:1px solid #999;border-radius:0}.GPflexInput *:not(:last-child){border-right:0}.GPflexInput *:first-child{border-radius:3px 0 0 3px}.GPflexInput *:last-child{border-radius:0 3px 3px 0}.GPflexInput>*:not(input){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.GPflexInput>input{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 5px;min-width:0}.GPflexInput>select{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;padding-right:7px}.GPflexInput>label{background-color:#f2f2f2;color:#666;padding-left:7px;padding-right:9px;cursor:pointer}.GPinputSelect{display:block;height:28px;line-height:26px;margin:auto;border:1px solid #999;color:#333;cursor:pointer}input.GPinputSubmit{display:block;width:80px;margin:auto;height:28px;line-height:26px;padding:0;background:0;border:0;border-radius:3px;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#FFF;font-weight:bold;opacity:.8;transition:opacity .2s ease-out;cursor:pointer}input.GPinputSubmit:hover{opacity:1}.GPautoCompleteList,.GPadvancedAutoCompleteList{z-index:2;display:none;position:absolute;max-height:140px;background-color:#FFF;border:1px solid #999;overflow-y:hidden}.GPadvancedAutoCompleteList{width:calc(100% - 28px);border-top:0;font-size:.9em}.GPautoCompleteProposal{width:100%;height:28px;line-height:16px;padding:6px 10px;color:#5e5e5e;font-size:1.0em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.GPautoCompleteProposal:hover{color:#000;background-color:#cedbef}.GPshowMoreOptions{display:block;position:absolute;width:28px;height:28px;cursor:pointer;transition:all .5s ease-out 0s}input[type="checkbox"]:checked+.GPshowMoreOptions{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}div[id^=GPisochron-]{top:140px}label[id^=GPshowIsochronPicto]{display:inline-block}input[id^=GPshowIsochron-]+label{display:block}input[id^=GPshowIsochron-]:checked+label{display:none}input[id^=GPshowIsochron-]+label+div{display:none}input[id^=GPshowIsochron-]:checked+label+div{display:block}div[id^=GPisochronPanel-]{width:280px}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPisochronCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPisochronCalcWaitingContainerHidden{display:none}.GPisochronCalcWaiting{margin:auto}form[id^=GPisochronForm]{padding:15px}.GPisochronFormMini{max-height:58px;overflow:hidden}.GPisochronFormMini div[id^="GPisochronReset-"],.GPisochronFormMini label[id^="GPshowIsoExclusionsPicto-"]{display:none}.GPisochronOriginVisible{display:block}.GPisochronOriginHidden{display:none}.GPisochronOriginPointerImg{width:28px;background-color:#f2f2f2;cursor:pointer}input[id^="GPisochronOriginPointer"]+.GPisochronOriginPointerImg{background-position:-1px -1px}input[id^="GPisochronOriginPointer"]:checked+.GPisochronOriginPointerImg{background-position:-29px -1px}input[id^=GPisochronSubmit]{margin-top:5px}div[id^=GPisochronChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;width:160px;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:auto;margin-top:15px;margin-bottom:5px}.GPisochronChoiceAlt input{display:none}.GPisochronChoiceAltImg{display:block;width:28px;height:28px;margin:auto;cursor:pointer}input[id^=GPisochronChoiceAltChron]+.GPisochronChoiceAltImg{background-position:-56px 0}input[id^=GPisochronChoiceAltChron]:checked+.GPisochronChoiceAltImg{background-position:-84px 0}input[id^=GPisochronChoiceAltDist]+.GPisochronChoiceAltImg{background-position:-112px 0}input[id^=GPisochronChoiceAltDist]:checked+.GPisochronChoiceAltImg{background-position:-140px 0}.GPisochronChoiceAlt span{cursor:pointer;display:block;color:#999}.GPisochronValueHidden{display:none}div[id^=GPisochronValueChron],div[id^=GPisochronValueDist]{width:220px;margin:auto}div[id^=GPisochronModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:15px 0}.GPisochronModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GPisochronTransportChoice] input{display:none}.GPisochronTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GPisochronTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GPisochronTransportCar]+.GPisochronTransportImg{background-position:-168px 0}input[id^=GPisochronTransportCar]:checked+.GPisochronTransportImg{background-position:-196px 0}input[id^=GPisochronTransportPedestrian]+.GPisochronTransportImg{background-position:-224px 0}input[id^=GPisochronTransportPedestrian]:checked+.GPisochronTransportImg{background-position:-252px 0}select[id^=GPisochronDirectionSelect]{width:80px}input[id^=GPshowIsoExclusions]{display:none}.GPshowIsoExclusionsPicto{top:250px;right:0;transition:all .5s ease-out 0s}input[id^=GPshowIsoExclusions]+label+div[id^=GPisoExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowIsoExclusions]:checked+label+div[id^=GPisoExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GPisoExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GPisoExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GPisoExclusionsOptions{display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GPisoExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GPisoExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GPisochronReset]{position:absolute;margin-top:5px;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-281px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GPisochronReset]:hover{opacity:1}#GPlayerSwitcher{font-size:11px}#GPlayerSwitcher [draggable]{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}#GPlayerSwitcher input[type="checkbox"]+div,#GPlayerSwitcher input[type="checkbox"]+label+div{max-height:0}#GPlayerSwitcher label{display:block}#GPshowLayersListPicto{position:relative;float:right;display:block;opacity:1;transition:opacity .5s ease-out 0s,box-shadow .5s ease-out 0s,border .5s ease-out 0s,border-radius .5s ease-out 0s;cursor:pointer}#GPshowLayersListOpen,#GPshowLayersListClose{position:absolute;display:block;transition:border-radius .5s ease-out 0s,opacity .5s ease-out 0s}#GPshowLayersListOpen{background-position:0 0;opacity:1}#GPshowLayersListClose{opacity:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{border-top-left-radius:0;border-top-right-radius:0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListClose{opacity:1}#GPlayersList{position:relative;width:180px;border-bottom-right-radius:0;opacity:0;overflow:auto;transition:max-height .5s ease-out 0s,opacity .5s ease-out .25s}#GPlayerSwitcher input[type="checkbox"]:checked+#GPlayersList{max-height:232px;opacity:1;transition:max-height .5s ease-in 0s,opacity .25s ease-in 0s}.GPlayerSwitcher_layer{position:relative;top:0;background-color:#FFF;border-bottom:1px dotted #CCC;overflow:hidden}#GPlayersList .GPlayerSwitcher_layer:last-child{border-bottom:0}.GPlayerBasicTools,.GPlayerAdvancedTools{position:relative;width:100%;height:28px}.GPlayerVisibility,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{width:28px;height:28px;cursor:pointer}.GPlayerVisibility,.GPlayerName,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove,.GPlayerOpacity,.GPlayerOpacityValue{position:absolute;top:0}.GPghostLayer{opacity:0}.GPlayerBasicTools{background-color:#FFF}.GPlayerVisibility{left:0;background-position:-28px 0}input[type="checkbox"]:checked+.GPlayerVisibility{background-position:0 0}.GPlayerName{left:28px;width:calc(100% - 56px);line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:4px;cursor:move}.outOfRange .GPlayerName{color:#AAA}.GPshowLayerAdvancedTools{top:0;right:0;background-position:-112px 0}.GPlayerAdvancedTools{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}#GPlayerSwitcher input[type="checkbox"]:checked+label+.GPlayerAdvancedTools{max-height:28px;opacity:1}.GPlayerInfo{left:0;background-position:-55px 0}.GPlayerInfoOpened{left:0;background-position:-83px 0}.GPlayerOpacity{left:28px;width:calc(100% - 100px);height:28px;padding-left:8px}.GPlayerOpacityValue{width:32px;left:calc(100% - 60px);line-height:28px;font-size:10px;font-style:italic;cursor:default}.GPlayerRemove{right:0;background-position:-140px 0}.GPlayerOpacity input{-webkit-appearance:none;-moz-appearance:none;background:0;display:block;width:100%;height:100%;margin:0;padding:0;overflow:hidden;cursor:pointer}.GPlayerOpacity input[type="range"]:focus{box-shadow:none;outline:0}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{-webkit-appearance:none;height:3px}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb:before{position:absolute;top:0;right:50%;left:-200px;height:3px;pointer-events:none}.GPlayerOpacity input[type="range"]::-webkit-slider-thumb{width:9px;height:17px;-webkit-appearance:none;border:2px solid #FFF;background-color:#505050;position:relative;top:-7px}.GPlayerOpacity input[type="range"]::-moz-range-track{width:80px;height:3px}.GPlayerOpacity input[type="range"]::-moz-range-thumb{width:5px;height:13px;border:2px solid #FFF;border-radius:0;box-shadow:0;background-color:#505050;position:relative}.GPlayerOpacity input[type="range"]::-ms-track{border:0;border-color:transparent;border-radius:0;border-width:0;color:transparent;height:3px;width:80px}.GPlayerOpacity input[type="range"]::-ms-fill-lower,.GPlayerOpacity input[type="range"]::-ms-fill-upper{background:transparent;border-radius:0}.GPlayerOpacity input[type="range"]::-ms-thumb{width:5px;height:13px;border:2px solid #FFF;background-color:#505050}.GPlayerOpacity input[type="range"]::-ms-tooltip{display:none}#GPlayerInfoPanel{position:absolute;top:0;overflow-y:hidden;padding-top:10px;padding-bottom:10px}.GPlayerInfoPanelOpened{display:block}.GPlayerInfoPanelClosed{display:none}#GPlayerInfoContent{position:relative;width:280px;max-height:200px;overflow-y:auto;padding-left:10px;padding-right:10px}#GPlayerInfoTitle{width:calc(100% - 52px);margin:auto;margin-bottom:10px;padding-bottom:5px;text-align:center;font-size:1.1em;font-weight:bold}#GPlayerInfoQuicklook{position:absolute;top:-2px;left:10px;width:20px;height:20px;cursor:pointer}#GPlayerInfoClose{position:absolute;top:-8px;right:10px;width:28px;height:28px;cursor:pointer}#GPlayerInfoDescription{font-size:.9em}.GPlayerInfoSubtitle{padding-left:35px;font-weight:bold;margin-top:10px;margin-bottom:4px}.GPlayerInfoLink,.GPlayerInfoPopup{line-height:20px;padding-left:23px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;color:#999;background-repeat:no-repeat;cursor:pointer}.GPlayerInfoLink{background-position:0 -20px}.GPlayerInfoLink:hover,.GPlayerInfoPopup:hover{color:#333}.GPlayerInfoLink a,.GPlayerInfoLink a:visited .GPlayerInfoLink a:focus .GPlayerInfoLink a:hover{text-decoration:none;color:inherit}.GPlocationStageFlexInput{max-height:28px;opacity:1}.GPlocationStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}.GPlocationOriginVisible{display:block}.GPlocationOriginHidden{display:none}label.GPlocationOriginPointerImg[id*="GPlocationOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GPlocationOriginPointer"]+.GPlocationOriginPointerImg{background-position:-1px -1px}input[id*="GPlocationOriginPointer"]:checked+.GPlocationOriginPointerImg{background-position:-29px -1px}.GPlocationStageRemove,div[id^=GPlocationStageAdd]{width:28px;border:0;cursor:pointer}.GPlocationStageRemove{background-position:-84px 0}div[id^=GPlocationStageAdd]{background-position:-56px 0}label[id^=GPshowMeasureAreaPicto-]{display:inline-block}input[id^=GPshowMeasureArea-]+label{display:block}input[id^=GPshowMeasureArea-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureArea-]+label+div{display:block}input[id^=GPshowMeasureArea-]:checked+label+div{display:block}label[id^=GPshowMeasureAzimuthPicto-]{display:inline-block}input[id^=GPshowMeasureAzimuth-]+label{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureAzimuth-]+label+div{display:block}input[id^=GPshowMeasureAzimuth-]:checked+label+div{display:block}label[id^=GPshowMeasureLengthPicto-]{display:inline-block}input[id^=GPshowMeasureLength-]+label{display:block}input[id^=GPshowMeasureLength-]:checked+label{display:block;background-color:rgba(0,60,136,0.5)}input[id^=GPshowMeasureLength-]+label+div{display:block}input[id^=GPshowMeasureLength-]:checked+label+div{display:block}.tooltip{position:relative;background:rgba(0,0,0,0.5);border-radius:4px;color:white;padding:4px 8px;white-space:nowrap}.tooltip-measure{font-weight:bold}.tooltip-info{font-size:.75em;text-align:center}.tooltip-static{background-color:#fc3;color:black;border:1px solid white}.tooltip-hidden{display:none}.tooltip-measure::before,.tooltip-info::before,.tooltip-static::before{border-top:6px solid rgba(0,0,0,0.5);border-right:6px solid transparent;border-left:6px solid transparent;content:"";position:absolute;bottom:-6px;margin-left:-7px;left:50%}.tooltip-static::before{border-top-color:#fc3}label[id^=GPshowMousePositionPicto]{display:inline-block}input[id^=GPshowMousePosition-]+label{display:block}input[id^=GPshowMousePosition-]:checked+label{display:none}input[id^=GPshowMousePosition-]+label+div{display:none}input[id^=GPshowMousePosition-]:checked+label+div{display:block}div[id^=GPmousePositionPanel-]{width:240px;overflow:hidden}div[id^=GPmousePositionBasicPanel]{padding:10px 15px}.GPmousePositionLabel,.GPmousePositionCoords{display:inline-block;line-height:20px}.GPmousePositionLabel{width:80px;font-weight:bold}.GPmousePositionCoords{width:110px}.GPshowMousePositionSettingsPicto{bottom:5px;right:0;transition:all .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+.GPshowMousePositionSettingsPicto{bottom:100px}div[id^=GPmousePositionSettings-]{display:block;max-height:0;opacity:0;transition:max-height .5s ease-out 0s,opacity .5s ease-out 0s}div[id^=GPmousePosition-] input[type="checkbox"]:checked+label+div[id^=GPmousePositionSettings-]{max-height:95px;opacity:1}div[id^=GPmousePositionSettings-]{height:95px;padding-left:0 15px;overflow:hidden}.GPmousePositionSettingsLabel{display:block;margin:auto;text-align:center;font-weight:bold;line-height:16px}.GPmousePositionSettingsSelect{width:180px;margin-top:5px}#GPmapCenter{display:none;position:absolute;top:50%;left:50%;width:50px;height:50px;margin-top:-25px;margin-left:-25px}#GPmapCenter.GPmapCenterVisible{display:block}[id^="GPreverseGeocoding-"]{top:180px}[id^="GPshowReverseGeocodingPicto-"]{display:inline-block}[id^="GPshowReverseGeocoding-"]+label{display:block}[id^="GPshowReverseGeocoding-"]:checked+label{display:none}[id^="GPshowReverseGeocoding-"]+label+div{display:none}[id^="GPshowReverseGeocoding-"]:checked+label+div{display:block}div[id^=GPreverseGeocodingResultsClose]{top:0;right:0;width:30px;height:32px}[id^="GPreverseGeocodingPanel-"]{width:280px}.GPreverseGeocodingComponentHidden{display:none}div[id^="GPreverseGeocodingReturnPicto-"]{position:absolute;width:26px;height:26px;border-radius:3px;opacity:1;background-position:0 0;cursor:pointer}.GPreverseGeocodingReturnPictoHidden{display:none}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}[id^="GPreverseGeocodingForm-"]{position:relative;max-height:270px;overflow-y:auto;padding-left:15px;padding-right:15px;padding-top:10px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingFilterLabel{max-width:105px}.GPreverseGeocodingCodeLabel,.GPreverseGeocodingCode{margin-top:5px;margin-bottom:0}.GPreverseGeocodingFilterLabel,.GPreverseGeocodingFilterInput{margin-bottom:5px}input[id^="GPreverseGeocodingSubmit-"]{margin-top:5px;margin-bottom:15px;width:100px}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GPreverseGeocodingCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GPreverseGeocodingCalcWaitingContainerHidden{display:none}.GPreverseGeocodingCalcWaiting{margin:auto}div[id^=GPreverseGeocodingResultsList-]{position:relative;max-height:210px;overflow-y:auto}div[id^=GProute-]{top:100px}label[id^=GPshowRoutePicto]{display:inline-block}input[id^=GPshowRoute-]+label{display:block}input[id^=GPshowRoute-]:checked+label{display:none}input[id^=GPshowRoute-]+label+div{display:none}input[id^=GPshowRoute-]:checked+label+div{display:block}div[id^=GProutePanel-]{width:320px}.GProuteComponentHidden{display:none}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{position:absolute;top:32px;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0.9);font-size:1.5em;font-weight:bold;overflow:hidden}.GProuteCalcWaitingContainerVisible{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}.GProuteCalcWaitingContainerHidden{display:none}.GProuteCalcWaiting{margin:auto}form[id^=GProuteForm]{padding:15px}.GProuteFormMini{max-height:58px;overflow:hidden;-webkit-transform:translateY(-5px);transform:translateY(-5px)}.GProuteStageFlexInput{max-height:28px;opacity:1}.GProuteStageFlexInputHidden{max-height:0;opacity:0;overflow:hidden}form[id^=GProuteForm]>.GPlocationStageFlexInput{margin-top:5px}form[id^=GProuteForm]>.GPlocationStageFlexInputHidden{margin-top:0}form[id^=GProuteForm].GProuteFormMini .GPlocationStageFlexInput:first-child{margin-top:5px}.GProuteOriginVisible{display:block}.GProuteOriginHidden{display:none}label.GProuteOriginPointerImg[id*="GProuteOriginPointerImg"]{width:28px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-right:1px solid #999}input[id*="GProuteOriginPointer"]+.GProuteOriginPointerImg{background-position:-1px -1px}input[id*="GProuteOriginPointer"]:checked+.GProuteOriginPointerImg{background-position:-29px -1px}.GProuteStageRemove,div[id^=GProuteStageAdd]{width:28px;border:0;cursor:pointer}.GProuteFormMini .GProuteStageRemove,.GProuteFormMini div[id^=GProuteStageAdd]{display:none}.GProuteStageRemove{background-position:-84px 0}div[id^=GProuteStageAdd]{background-position:-56px 0}div[id^=GProuteModeChoice]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:15px 0}.GProuteModeLabel{display:block;text-align:center;margin-bottom:5px}div[id^=GProuteTransportChoice] input{display:none}.GProuteTransportImg{display:inline-block;width:28px;height:28px;cursor:pointer}.GProuteTransportImg:first-of-type{margin-left:18px;margin-right:10px}input[id^=GProuteTransportCar]+.GProuteTransportImg{background-position:-112px 0}input[id^=GProuteTransportCar]:checked+.GProuteTransportImg{background-position:-140px 0}input[id^=GProuteTransportPedestrian]+.GProuteTransportImg{background-position:-168px 0}input[id^=GProuteTransportPedestrian]:checked+.GProuteTransportImg{background-position:-196px 0}select[id^=GProuteComputationSelect]{width:100px}input[id^=GPshowRouteExclusions]{display:none}.GPshowRouteExclusionsPicto{top:185px;right:0;transition:all .3s ease-out 0s}input[id^=GPshowRouteExclusions]+label+div[id^=GProuteExclusions]{max-height:0;opacity:0;margin-bottom:0}input[id^=GPshowRouteExclusions]:checked+label+div[id^=GProuteExclusions]{display:block;max-height:60px;opacity:1;margin-bottom:15px}div[id^=GProuteExclusions]{transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s,margin .3s ease-in-out .25s;overflow:hidden}.GProuteExclusionsLabel{display:block;text-align:center;margin-bottom:10px;font-weight:bold;line-height:16px}.GProuteExclusionsOptions{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.GProuteExclusionsOption{display:block;height:28px;line-height:26px;color:#A77;background-color:#FEE;padding-left:28px;padding-right:5px;border:1px solid #A77;border-radius:3px;cursor:pointer}input:checked+.GProuteExclusionsOption{background-color:#EFE;background-position:0 -28px;color:#797;border:1px solid #797}div[id^=GProuteReset]{position:absolute;width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteReset]:hover{opacity:1}div[id^=GProuteResultsPanel]{padding:15px}.GProuteResultStage{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex}div[id^=GProuteResultsStages]{margin-bottom:15px}.GProuteResultStageLabel,.GProuteResultStageValue,.GProuteResultsValueLabel,div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{display:inline-block;line-height:18px}.GProuteResultStageLabel,.GProuteResultsValueLabel{color:#666}.GProuteResultStageLabel{width:60px}.GProuteResultsValueLabel{width:65px}.GProuteResultStageValue{-webkit-flex:1;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{width:80px;font-weight:bold}div[id^=GProuteResults-]{display:-webkit-flex;display:-ms-flexbox;display:-webkit-box;display:flex;-webkit-justify-content:space-between;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px}select[id^=GProuteResultsComputationSelect]{width:100px}div[id^=GProuteResultsNew]{width:28px;height:28px;border-radius:3px;opacity:.8;background-position:-224px 0;transition:opacity .2s ease-out;cursor:pointer}div[id^=GProuteResultsNew]:hover{opacity:1}.GPfakeBorder{display:inline-block;height:14px;width:60px;border-bottom:1px solid #999}.GPfakeBorderLeft{margin-left:15px}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]+label+label{width:130px;line-height:28px;vertical-align:top;text-align:center;font-weight:bold;cursor:pointer;transition:color .2s ease-out}input[id^=GProuteResultsShowDetails]+label,input[id^=GProuteResultsShowDetails]:checked+label+label{display:inline-block}input[id^=GProuteResultsShowDetails]:checked+label,input[id^=GProuteResultsShowDetails]+label+label{display:none}input[id^=GProuteResultsShowDetails]+label+label+div+div[id^=GProuteResultsDetails]{max-height:0;opacity:0}input[id^=GProuteResultsShowDetails]:checked+label+label+div+div[id^=GProuteResultsDetails]{max-height:200px;opacity:1}div[id^=GProuteResultsDetails]{overflow-y:auto;transition:max-height .5s ease-in-out .25s,opacity .5s ease-in-out .25s}.GProuteResultsDetailsNumber,.GProuteResultsDetailsInstruction{display:inline-block;margin-top:4px;line-height:16px;color:#666}.GProuteResultsDetailsNumber{font-weight:bold;width:22px;text-align:right;vertical-align:top}.GProuteResultsDetailsInstruction{width:calc(100% - 30px);padding-left:5px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0}#GPlayerSwitcher label{display:block}input[id^=GPshowSearchEngine-]{display:none}label[id^=GPshowSearchEnginePicto]{display:inline-block;transition:border-radius 0s ease-out 0s;transition-delay:.5s}input[id^=GPshowSearchEngine-]:checked+label{border-top-right-radius:0;border-bottom-right-radius:0;transition-delay:0s}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]{max-width:0;border:0;transition:max-width .5s ease-out 0s}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]{max-width:280px}input[id^=GPshowSearchEngine-]+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPshowAdvancedSearch]{display:inline-block}div[id^=GPautoCompleteList]{display:none}input[id^=GPshowSearchEngine-]:checked+label+form[id^=GPsearchInput-]+div[id^=GPautoCompleteList]{display:block}form[id^=GPsearchInput-]{display:inline-block;position:relative;left:-3px;width:280px;overflow:hidden}form[id^=GPsearchInput-] input{display:block;width:100%;height:100%;border:1px solid #999;border-top-right-radius:5px;border-bottom-right-radius:5px;padding:0;padding-right:30px;padding-left:5px;color:#333;font-size:1.0em}form[id^=GPsearchInput-] input:disabled{background-color:#DDD;color:#999}div[id^=GPsearchInputReset]{position:absolute;top:0;right:0;width:30px;height:32px;background-position:-30px 0;cursor:pointer}div[id^=GPgeocodeResultsClose],div[id^=GPadvancedSearchClose]{top:0;right:0;width:30px;height:32px}div[id^=GPgeocodeResultsClose]{background-position:0 0}div[id^=GPadvancedSearchClose]{background-repeat:no-repeat}div[id^=GPshowAdvancedSearch]{transition:border-radius 0s ease-out 0s;transition-delay:.5s}div[id^=GPadvancedSearchPanel]{display:none;width:280px;vertical-align:top;overflow:hidden}form[id^=GPadvancedSearchForm]{max-height:220px;overflow-y:auto;padding-left:15px;padding-right:15px}.GPadvancedSearchCodeLabel,.GPadvancedSearchFilterLabel{max-width:105px}.GPadvancedSearchCodeLabel,.GPadvancedSearchCode,div[id^=GPadvancedSearchFilters]{margin-top:15px}.GPadvancedSearchFilterLabel,.GPadvancedSearchFilterInput{margin-bottom:5px}input[id^=GPadvancedSearchSubmit]{margin-top:10px;margin-bottom:15px}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{width:280px}div[id^=GPautoCompleteList]{top:35px}div[id^=GPgeocodeResultsList]{display:none;position:absolute;top:40px;border-radius:4px;overflow:hidden}div[id^=GPgeocodeResults-]{background-color:#FFF;max-height:140px;overflow-y:auto}.GPwidget{position:relative}#GPadvancedToolsPanel{position:initial}.GPpanel{box-shadow:0 1px 5px #000;border-radius:5px}.GPpanelHeader{height:32px;background-color:#FFF;border-top-left-radius:5px;border-top-right-radius:5px}.GPpanelTitle{width:calc(100% - 60px);margin:auto;line-height:32px;color:#c77a04;border-bottom:1px solid #c77a04}.GPpanelClose{top:0;right:0;width:30px;height:32px;background-position:-30px 1px}.GPpanelReduce{top:0;right:30px;width:30px;height:32px;background-position:-60px 1px}.GPshowAdvancedToolPicto{width:30px;height:30px;box-shadow:0 1px 5px #000;background-color:#FFF;border-radius:5px}.GPshowAdvancedToolPicto:hover{background-color:#f4f4f4}.GPshowAdvancedToolOpen{width:100%;height:100%}input.GPinputSubmit{background-color:#c77a04}.GPshowMoreOptions{background-image:url("../img/gp/GPshowMoreOptions.png")}div[id^=GPelevationPath-]{top:0}label[id^=GPshowElevationPathPicto]{display:inline-block}input[id^=GPshowElevationPath-]+label{display:block}input[id^=GPshowElevationPath-]+label+div{display:none}input[id^=GPshowElevationPath-]:checked+label+div{display:block}span[id^=GPshowElevationPathOpen]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanelClose]{background-image:url("../img/gp/GPshowElevationPath.png")}div[id^=GPelevationPathPanelReduce]{background-image:url("../img/gp/GPshowElevationPath.png")}[id^=GPelevationPathPanel-]{width:280px}[id^=GPelevationPathProfil]{height:150px;width:inherit;line-height:normal}div[id^=GPisochron-]{top:0}span[id^=GPshowIsochronOpen]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanel-]{left:10px}div[id^=GPisochronPanelClose]{background-image:url("../img/gp/GPisochronOpen.png")}div[id^=GPisochronPanelReduce]{background-image:url("../img/gp/GPisochronOpen.png")}.GPisochronCalcWaitingContainerVisible,.GPisochronCalcWaitingContainerHidden{border-radius:5px}.GPisochronChoiceAlt input:checked+label+span{color:#c77a04}.GPisochronOriginPointerImg,.GPisochronChoiceAltImg,.GPisochronTransportImg{background-image:url("../img/gp/GPisochronOptions.png")}.GPisoExclusionsOption{background-image:url("../img/gp/GPisochronCheck.png")}div[id^=GPisochronReset]{background-color:#c77a04;background-image:url("../img/gp/GPisochronOptions.png")}#GPlayerSwitcher{top:10px;right:10px}#GPshowLayersListPicto{width:36px;height:36px}#GPshowLayersListOpen,#GPshowLayersListClose{background-image:url("../img/gp/GPshowLayersList.png")}#GPshowLayersListClose{background-position:-36px 0}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto{box-shadow:0 2px 2px #000;border-top:1px solid #CCC}#GPlayerSwitcher input[type="checkbox"]:checked+div+#GPshowLayersListPicto #GPshowLayersListOpen{opacity:.4}.GPlayerVisibility,.GPshowLayerAdvancedTools,.GPlayerInfo,.GPlayerInfoOpened,.GPlayerRemove{background-image:url("../img/gp/GPlayerTools.png")}.GPlayerOpacity input[type="range"]::-webkit-slider-runnable-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-moz-range-track{background:url("../img/gp/GPopacitySlider.png")}.GPlayerOpacity input[type="range"]::-ms-track{background:url("../img/gp/GPopacitySlider.png")}#GPlayerInfoPanel{right:190px}#GPlayerInfoTitle{color:#c77a04;border-bottom:1px solid #c77a04}#GPlayerInfoQuicklook{background-image:url("../img/gp/GPlayerInfo.png")}#GPlayerInfoClose{background-image:url("../img/gp/GPlayerInfoClose.png")}.GPlayerInfoLink,.GPlayerInfoPopup{background-image:url("../img/gp/GPlayerInfo.png")}.GPlocationStageFlexInput{margin-bottom:5px}.GPlocationOriginPointerImg,.GPlocationStageRemove,div[id^=GPlocationStageAdd],.GPlocationTransportImg{background-image:url("../img/gp/GPlocationOptions.png")}span[id^=GPshowMousePositionOpen]{background-image:url("../img/gp/GPmousePositionOpen.png")}div[id^=GPmousePositionPanelClose]{background-image:url("../img/gp/GPmousePositionOpen.png")}#GPmapCenter{background-image:url("../img/gp/GPmapCenter.png")}[id^="GPreverseGeocoding-"]{top:0}[id^="GPshowReverseGeocodingOpen-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}[id^="GPreverseGeocodingPanel-"]{left:10px}[id^="GPreverseGeocodingPanelClose-"]{background-image:url("../img/gp/GPreverseGeocodingOpen.png")}.GPreverseGeocodingCalcWaitingContainerVisible,.GPreverseGeocodingCalcWaitingContainerHidden{border-radius:5px}[id^="GPreverseGeocodingReturnPicto-"]{width:30px!important;height:30px!important;background-color:#c77a04;background-image:url("../img/gp/GPreturn.png")}.GPreverseGeocodedLocationHighlight{background-color:rgba(255,200,0,0.25);color:#222}div[id^=GProute-]{top:0}.GProuteStageFlexInput{margin-bottom:5px}span[id^=GPshowRouteOpen]{background-image:url("../img/gp/GProuteOpen.png")}div[id^=GProutePanel-]{left:10px}div[id^=GProutePanelClose]{background-image:url("../img/gp/GProuteOpen.png")}.GProuteCalcWaitingContainerVisible,.GProuteCalcWaitingContainerHidden{border-radius:5px}.GProuteOriginPointerImg,.GProuteStageRemove,div[id^=GProuteStageAdd],.GProuteTransportImg{background-image:url("../img/gp/GProuteOptions.png")}.GProuteExclusionsOption{background-image:url("../img/gp/GProuteCheck.png")}div[id^=GProuteResultsValueDist],div[id^=GProuteResultsValueTime]{color:#c77a04}div[id^=GProuteResultsNew]{background-color:#c77a04;background-image:url("../img/gp/GProuteOptions.png")}input[id^=GProuteResultsShowDetails]+label:hover,input[id^=GProuteResultsShowDetails]+label+label:hover{color:#c77a04}.GProuteResultsDetailsHighlight{background-color:rgba(255,200,0,0.25);color:#222}span[id^=GPshowSearchEngineOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png")}form[id^=GPsearchInput-]{height:30px}div[id^=GPsearchInputReset]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPgeocodeResultsClose]{background-image:url("../img/gp/GPsearchEngineClose.png")}div[id^=GPadvancedSearchClose]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-60px 0}span[id^=GPshowAdvancedSearchOpen]{background-image:url("../img/gp/GPsearchEngineOpen.png");background-position:-30px 0}div[id^=GPautoCompleteList],div[id^=GPgeocodeResultsList]{margin-left:27px;box-shadow:0 1px 5px #000}div[id^=GPgeocodeResultsList]{top:38px;border-radius:5px}.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet.png');background-repeat:no-repeat}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('../img/gp/spritesheet-2x.png');background-size:270px 30px}.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}.leaflet-draw-actions li:first-child a{border-left:none}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999} \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/loading.gif Binary file src/pyams_gis/resources/img/esri/loading.gif has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/loading@2x.gif Binary file src/pyams_gis/resources/img/esri/loading@2x.gif has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/search-disabled.png Binary file src/pyams_gis/resources/img/esri/search-disabled.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/search.png Binary file src/pyams_gis/resources/img/esri/search.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/search@2x-disabled.png Binary file src/pyams_gis/resources/img/esri/search@2x-disabled.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/esri/search@2x.png Binary file src/pyams_gis/resources/img/esri/search@2x.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPisochronCheck.png Binary file src/pyams_gis/resources/img/gp/GPisochronCheck.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPisochronOpen.png Binary file src/pyams_gis/resources/img/gp/GPisochronOpen.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPisochronOptions.png Binary file src/pyams_gis/resources/img/gp/GPisochronOptions.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPlayerInfo.png Binary file src/pyams_gis/resources/img/gp/GPlayerInfo.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPlayerInfoClose.png Binary file src/pyams_gis/resources/img/gp/GPlayerInfoClose.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPlayerTools.png Binary file src/pyams_gis/resources/img/gp/GPlayerTools.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPlocationOptions.png Binary file src/pyams_gis/resources/img/gp/GPlocationOptions.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPmapCenter.png Binary file src/pyams_gis/resources/img/gp/GPmapCenter.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPmousePositionOpen.png Binary file src/pyams_gis/resources/img/gp/GPmousePositionOpen.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPopacitySlider.png Binary file src/pyams_gis/resources/img/gp/GPopacitySlider.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPreturn.png Binary file src/pyams_gis/resources/img/gp/GPreturn.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPreverseGeocodingOpen.png Binary file src/pyams_gis/resources/img/gp/GPreverseGeocodingOpen.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GProuteCheck.png Binary file src/pyams_gis/resources/img/gp/GProuteCheck.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GProuteOpen.png Binary file src/pyams_gis/resources/img/gp/GProuteOpen.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GProuteOptions.png Binary file src/pyams_gis/resources/img/gp/GProuteOptions.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPsearchEngineClose.png Binary file src/pyams_gis/resources/img/gp/GPsearchEngineClose.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPsearchEngineOpen.png Binary file src/pyams_gis/resources/img/gp/GPsearchEngineOpen.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPshowElevationPath.png Binary file src/pyams_gis/resources/img/gp/GPshowElevationPath.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPshowLayersList.png Binary file src/pyams_gis/resources/img/gp/GPshowLayersList.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/GPshowMoreOptions.png Binary file src/pyams_gis/resources/img/gp/GPshowMoreOptions.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/spritesheet-2x.png Binary file src/pyams_gis/resources/img/gp/spritesheet-2x.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/spritesheet.png Binary file src/pyams_gis/resources/img/gp/spritesheet.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/gp/waiting.gif Binary file src/pyams_gis/resources/img/gp/waiting.gif has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/layers-2x.png Binary file src/pyams_gis/resources/img/layers-2x.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/layers.png Binary file src/pyams_gis/resources/img/layers.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/img/marker-icon.png Binary file src/pyams_gis/resources/img/marker-icon.png has changed diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Circle.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Circle.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,71 @@ +L.Edit = L.Edit || {}; +/** + * @class L.Edit.Circle + * @aka Edit.Circle + * @inherits L.Edit.SimpleShape + */ +L.Edit.Circle = L.Edit.SimpleShape.extend({ + _createMoveMarker: function () { + var center = this._shape.getLatLng(); + + this._moveMarker = this._createMarker(center, this.options.moveIcon); + }, + + _createResizeMarker: function () { + var center = this._shape.getLatLng(), + resizemarkerPoint = this._getResizeMarkerPoint(center); + + this._resizeMarkers = []; + this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon)); + }, + + _getResizeMarkerPoint: function (latlng) { + // From L.shape.getBounds() + var delta = this._shape._radius * Math.cos(Math.PI / 4), + point = this._map.project(latlng); + return this._map.unproject([point.x + delta, point.y - delta]); + }, + + _move: function (latlng) { + var resizemarkerPoint = this._getResizeMarkerPoint(latlng); + + // Move the resize marker + this._resizeMarkers[0].setLatLng(resizemarkerPoint); + + // Move the circle + this._shape.setLatLng(latlng); + + this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape }); + }, + + _resize: function (latlng) { + var moveLatLng = this._moveMarker.getLatLng(), + radius = moveLatLng.distanceTo(latlng); + + this._shape.setRadius(radius); + + this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape }); + } +}); + +L.Circle.addInitHook(function () { + if (L.Edit.Circle) { + this.editing = new L.Edit.Circle(this); + + if (this.options.editable) { + this.editing.enable(); + } + } + + this.on('add', function () { + if (this.editing && this.editing.enabled()) { + this.editing.addHooks(); + } + }); + + this.on('remove', function () { + if (this.editing && this.editing.enabled()) { + this.editing.removeHooks(); + } + }); +}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Circle.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Circle.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Edit=L.Edit||{};L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var a=this._shape.getLatLng();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var a=this._shape.getLatLng(),b=this._getResizeMarkerPoint(a);this._resizeMarkers=[];this._resizeMarkers.push(this._createMarker(b,this.options.resizeIcon))},_getResizeMarkerPoint:function(c){var b=this._shape._radius*Math.cos(Math.PI/4),a=this._map.project(c);return this._map.unproject([a.x+b,a.y-b])},_move:function(b){var a=this._getResizeMarkerPoint(b);this._resizeMarkers[0].setLatLng(a);this._shape.setLatLng(b);this._map.fire(L.Draw.Event.EDITMOVE,{layer:this._shape})},_resize:function(c){var b=this._moveMarker.getLatLng(),a=b.distanceTo(c);this._shape.setRadius(a);this._map.fire(L.Draw.Event.EDITRESIZE,{layer:this._shape})}});L.Circle.addInitHook(function(){if(L.Edit.Circle){this.editing=new L.Edit.Circle(this);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Marker.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Marker.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,84 @@ +L.Edit = L.Edit || {}; + +/** + * @class L.Edit.Marker + * @aka Edit.Marker + */ +L.Edit.Marker = L.Handler.extend({ + // @method initialize(): void + initialize: function (marker, options) { + this._marker = marker; + L.setOptions(this, options); + }, + + // @method addHooks(): void + // Add listener hooks to this handler + addHooks: function () { + var marker = this._marker; + + marker.dragging.enable(); + marker.on('dragend', this._onDragEnd, marker); + this._toggleMarkerHighlight(); + }, + + // @method removeHooks(): void + // Remove listener hooks from this handler + removeHooks: function () { + var marker = this._marker; + + marker.dragging.disable(); + marker.off('dragend', this._onDragEnd, marker); + this._toggleMarkerHighlight(); + }, + + _onDragEnd: function (e) { + var layer = e.target; + layer.edited = true; + this._map.fire(L.Draw.Event.EDITMOVE, { layer: layer }); + }, + + _toggleMarkerHighlight: function () { + var icon = this._marker._icon; + + // Don't do anything if this layer is a marker but doesn't have an icon. Markers + // should usually have icons. If using Leaflet.draw with Leaflet.markercluster there + // is a chance that a marker doesn't. + if (!icon) { + return; + } + + // This is quite naughty, but I don't see another way of doing it. (short of setting a new icon) + icon.style.display = 'none'; + + if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) { + L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected'); + // Offset as the border will make the icon move. + this._offsetMarker(icon, -4); + + } else { + L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected'); + // Offset as the border will make the icon move. + this._offsetMarker(icon, 4); + } + + icon.style.display = ''; + }, + + _offsetMarker: function (icon, offset) { + var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset, + iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset; + + icon.style.marginTop = iconMarginTop + 'px'; + icon.style.marginLeft = iconMarginLeft + 'px'; + } +}); + +L.Marker.addInitHook(function () { + if (L.Edit.Marker) { + this.editing = new L.Edit.Marker(this); + + if (this.options.editable) { + this.editing.enable(); + } + } +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Marker.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Marker.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Edit=L.Edit||{};L.Edit.Marker=L.Handler.extend({initialize:function(a,b){this._marker=a;L.setOptions(this,b)},addHooks:function(){var a=this._marker;a.dragging.enable();a.on("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},removeHooks:function(){var a=this._marker;a.dragging.disable();a.off("dragend",this._onDragEnd,a);this._toggleMarkerHighlight()},_onDragEnd:function(b){var a=b.target;a.edited=true;this._map.fire(L.Draw.Event.EDITMOVE,{layer:a})},_toggleMarkerHighlight:function(){var a=this._marker._icon;if(!a){return}a.style.display="none";if(L.DomUtil.hasClass(a,"leaflet-edit-marker-selected")){L.DomUtil.removeClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,-4)}else{L.DomUtil.addClass(a,"leaflet-edit-marker-selected");this._offsetMarker(a,4)}a.style.display=""},_offsetMarker:function(b,d){var c=parseInt(b.style.marginTop,10)-d,a=parseInt(b.style.marginLeft,10)-d;b.style.marginTop=c+"px";b.style.marginLeft=a+"px"}});L.Marker.addInitHook(function(){if(L.Edit.Marker){this.editing=new L.Edit.Marker(this);if(this.options.editable){this.editing.enable()}}}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Poly.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Poly.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,490 @@ +L.Edit = L.Edit || {}; + +/** + * @class L.Edit.Polyline + * @aka L.Edit.Poly + * @aka Edit.Poly + */ +L.Edit.Poly = L.Handler.extend({ + options: {}, + + // @method initialize(): void + initialize: function (poly, options) { + + this.latlngs = [poly._latlngs]; + if (poly._holes) { + this.latlngs = this.latlngs.concat(poly._holes); + } + + this._poly = poly; + L.setOptions(this, options); + + this._poly.on('revert-edited', this._updateLatLngs, this); + }, + + // Compatibility method to normalize Poly* objects + // between 0.7.x and 1.0+ + _defaultShape: function () { + if (!L.Polyline._flat) { + return this._poly._latlngs; + } + return L.Polyline._flat(this._poly._latlngs) ? this._poly._latlngs : this._poly._latlngs[0]; + }, + + _eachVertexHandler: function (callback) { + for (var i = 0; i < this._verticesHandlers.length; i++) { + callback(this._verticesHandlers[i]); + } + }, + + // @method addHooks(): void + // Add listener hooks to this handler + addHooks: function () { + this._initHandlers(); + this._eachVertexHandler(function (handler) { + handler.addHooks(); + }); + }, + + // @method removeHooks(): void + // Remove listener hooks from this handler + removeHooks: function () { + this._eachVertexHandler(function (handler) { + handler.removeHooks(); + }); + }, + + // @method updateMarkers(): void + // Fire an update for each vertex handler + updateMarkers: function () { + this._eachVertexHandler(function (handler) { + handler.updateMarkers(); + }); + }, + + _initHandlers: function () { + this._verticesHandlers = []; + for (var i = 0; i < this.latlngs.length; i++) { + this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(this._poly, this.latlngs[i], this.options)); + } + }, + + _updateLatLngs: function (e) { + this.latlngs = [e.layer._latlngs]; + if (e.layer._holes) { + this.latlngs = this.latlngs.concat(e.layer._holes); + } + } + +}); + +/** + * @class L.Edit.PolyVerticesEdit + * @aka Edit.PolyVerticesEdit + */ +L.Edit.PolyVerticesEdit = L.Handler.extend({ + options: { + icon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon' + }), + touchIcon: new L.DivIcon({ + iconSize: new L.Point(20, 20), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon' + }), + drawError: { + color: '#b00b00', + timeout: 1000 + } + + + }, + + // @method intialize(): void + initialize: function (poly, latlngs, options) { + // if touch, switch to touch icon + if (L.Browser.touch) { + this.options.icon = this.options.touchIcon; + } + this._poly = poly; + + if (options && options.drawError) { + options.drawError = L.Util.extend({}, this.options.drawError, options.drawError); + } + + this._latlngs = latlngs; + + L.setOptions(this, options); + }, + + // Compatibility method to normalize Poly* objects + // between 0.7.x and 1.0+ + _defaultShape: function () { + if (!L.Polyline._flat) { + return this._latlngs; + } + return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + + // @method addHooks(): void + // Add listener hooks to this handler. + addHooks: function () { + var poly = this._poly; + + if (!(poly instanceof L.Polygon)) { + poly.options.fill = false; + if (poly.options.editing) { + poly.options.editing.fill = false; + } + } + + poly.setStyle(poly.options.editing); + + if (this._poly._map) { + + this._map = this._poly._map; // Set map + + if (!this._markerGroup) { + this._initMarkers(); + } + this._poly._map.addLayer(this._markerGroup); + } + }, + + // @method removeHooks(): void + // Remove listener hooks from this handler. + removeHooks: function () { + var poly = this._poly; + + poly.setStyle(poly.options.original); + + if (poly._map) { + poly._map.removeLayer(this._markerGroup); + delete this._markerGroup; + delete this._markers; + } + }, + + // @method updateMarkers(): void + // Clear markers and update their location + updateMarkers: function () { + this._markerGroup.clearLayers(); + this._initMarkers(); + }, + + _initMarkers: function () { + if (!this._markerGroup) { + this._markerGroup = new L.LayerGroup(); + } + this._markers = []; + + var latlngs = this._defaultShape(), + i, j, len, marker; + + for (i = 0, len = latlngs.length; i < len; i++) { + + marker = this._createMarker(latlngs[i], i); + marker.on('click', this._onMarkerClick, this); + this._markers.push(marker); + } + + var markerLeft, markerRight; + + for (i = 0, j = len - 1; i < len; j = i++) { + if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) { + continue; + } + + markerLeft = this._markers[j]; + markerRight = this._markers[i]; + + this._createMiddleMarker(markerLeft, markerRight); + this._updatePrevNext(markerLeft, markerRight); + } + }, + + _createMarker: function (latlng, index) { + // Extending L.Marker in TouchEvents.js to include touch. + var marker = new L.Marker.Touch(latlng, { + draggable: true, + icon: this.options.icon, + }); + + marker._origLatLng = latlng; + marker._index = index; + + marker + .on('dragstart', this._onMarkerDragStart, this) + .on('drag', this._onMarkerDrag, this) + .on('dragend', this._fireEdit, this) + .on('touchmove', this._onTouchMove, this) + .on('touchend', this._fireEdit, this) + .on('MSPointerMove', this._onTouchMove, this) + .on('MSPointerUp', this._fireEdit, this); + + this._markerGroup.addLayer(marker); + + return marker; + }, + + _onMarkerDragStart: function () { + this._poly.fire('editstart'); + }, + + _spliceLatLngs: function () { + var latlngs = this._defaultShape(); + var removed = [].splice.apply(latlngs, arguments); + this._poly._convertLatLngs(latlngs, true); + this._poly.redraw(); + return removed; + }, + + _removeMarker: function (marker) { + var i = marker._index; + + this._markerGroup.removeLayer(marker); + this._markers.splice(i, 1); + this._spliceLatLngs(i, 1); + this._updateIndexes(i, -1); + + marker + .off('dragstart', this._onMarkerDragStart, this) + .off('drag', this._onMarkerDrag, this) + .off('dragend', this._fireEdit, this) + .off('touchmove', this._onMarkerDrag, this) + .off('touchend', this._fireEdit, this) + .off('click', this._onMarkerClick, this) + .off('MSPointerMove', this._onTouchMove, this) + .off('MSPointerUp', this._fireEdit, this); + }, + + _fireEdit: function () { + this._poly.edited = true; + this._poly.fire('edit'); + this._poly._map.fire(L.Draw.Event.EDITVERTEX, { layers: this._markerGroup, poly: this._poly }); + }, + + _onMarkerDrag: function (e) { + var marker = e.target; + var poly = this._poly; + + L.extend(marker._origLatLng, marker._latlng); + + if (marker._middleLeft) { + marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); + } + if (marker._middleRight) { + marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); + } + + if (poly.options.poly) { + var tooltip = poly._map._editTooltip; // Access the tooltip + + // If we don't allow intersections and the polygon intersects + if (!poly.options.poly.allowIntersection && poly.intersects()) { + + var originalColor = poly.options.color; + poly.setStyle({ color: this.options.drawError.color }); + + // Manually trigger 'dragend' behavior on marker we are about to remove + // WORKAROUND: introduced in 1.0.0-rc2, may be related to #4484 + if (L.version.indexOf('0.7') !== 0) { + marker.dragging._draggable._onUp(e); + } + this._onMarkerClick(e); // Remove violating marker + // FIXME: Reset the marker to it's original position (instead of remove) + + if (tooltip) { + tooltip.updateContent({ + text: L.drawLocal.draw.handlers.polyline.error + }); + } + + // Reset everything back to normal after a second + setTimeout(function () { + poly.setStyle({ color: originalColor }); + if (tooltip) { + tooltip.updateContent({ + text: L.drawLocal.edit.handlers.edit.tooltip.text, + subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext + }); + } + }, 1000); + } + } + + this._poly.redraw(); + this._poly.fire('editdrag'); + }, + + _onMarkerClick: function (e) { + + var minPoints = L.Polygon && (this._poly instanceof L.Polygon) ? 4 : 3, + marker = e.target; + + // If removing this point would create an invalid polyline/polygon don't remove + if (this._defaultShape().length < minPoints) { + return; + } + + // remove the marker + this._removeMarker(marker); + + // update prev/next links of adjacent markers + this._updatePrevNext(marker._prev, marker._next); + + // remove ghost markers near the removed marker + if (marker._middleLeft) { + this._markerGroup.removeLayer(marker._middleLeft); + } + if (marker._middleRight) { + this._markerGroup.removeLayer(marker._middleRight); + } + + // create a ghost marker in place of the removed one + if (marker._prev && marker._next) { + this._createMiddleMarker(marker._prev, marker._next); + + } else if (!marker._prev) { + marker._next._middleLeft = null; + + } else if (!marker._next) { + marker._prev._middleRight = null; + } + + this._fireEdit(); + }, + + _onTouchMove: function (e) { + + var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), + latlng = this._map.layerPointToLatLng(layerPoint), + marker = e.target; + + L.extend(marker._origLatLng, latlng); + + if (marker._middleLeft) { + marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); + } + if (marker._middleRight) { + marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); + } + + this._poly.redraw(); + this.updateMarkers(); + }, + + _updateIndexes: function (index, delta) { + this._markerGroup.eachLayer(function (marker) { + if (marker._index > index) { + marker._index += delta; + } + }); + }, + + _createMiddleMarker: function (marker1, marker2) { + var latlng = this._getMiddleLatLng(marker1, marker2), + marker = this._createMarker(latlng), + onClick, + onDragStart, + onDragEnd; + + marker.setOpacity(0.6); + + marker1._middleRight = marker2._middleLeft = marker; + + onDragStart = function () { + marker.off('touchmove', onDragStart, this); + var i = marker2._index; + + marker._index = i; + + marker + .off('click', onClick, this) + .on('click', this._onMarkerClick, this); + + latlng.lat = marker.getLatLng().lat; + latlng.lng = marker.getLatLng().lng; + this._spliceLatLngs(i, 0, latlng); + this._markers.splice(i, 0, marker); + + marker.setOpacity(1); + + this._updateIndexes(i, 1); + marker2._index++; + this._updatePrevNext(marker1, marker); + this._updatePrevNext(marker, marker2); + + this._poly.fire('editstart'); + }; + + onDragEnd = function () { + marker.off('dragstart', onDragStart, this); + marker.off('dragend', onDragEnd, this); + marker.off('touchmove', onDragStart, this); + + this._createMiddleMarker(marker1, marker); + this._createMiddleMarker(marker, marker2); + }; + + onClick = function () { + onDragStart.call(this); + onDragEnd.call(this); + this._fireEdit(); + }; + + marker + .on('click', onClick, this) + .on('dragstart', onDragStart, this) + .on('dragend', onDragEnd, this) + .on('touchmove', onDragStart, this); + + this._markerGroup.addLayer(marker); + }, + + _updatePrevNext: function (marker1, marker2) { + if (marker1) { + marker1._next = marker2; + } + if (marker2) { + marker2._prev = marker1; + } + }, + + _getMiddleLatLng: function (marker1, marker2) { + var map = this._poly._map, + p1 = map.project(marker1.getLatLng()), + p2 = map.project(marker2.getLatLng()); + + return map.unproject(p1._add(p2)._divideBy(2)); + } +}); + +L.Polyline.addInitHook(function () { + + // Check to see if handler has already been initialized. This is to support versions of Leaflet that still have L.Handler.PolyEdit + if (this.editing) { + return; + } + + if (L.Edit.Poly) { + + this.editing = new L.Edit.Poly(this, this.options.poly); + + if (this.options.editable) { + this.editing.enable(); + } + } + + this.on('add', function () { + if (this.editing && this.editing.enabled()) { + this.editing.addHooks(); + } + }); + + this.on('remove', function () { + if (this.editing && this.editing.enabled()) { + this.editing.removeHooks(); + } + }); +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Poly.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Poly.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Edit=L.Edit||{};L.Edit.Poly=L.Handler.extend({options:{},initialize:function(b,a){this.latlngs=[b._latlngs];if(b._holes){this.latlngs=this.latlngs.concat(b._holes)}this._poly=b;L.setOptions(this,a);this._poly.on("revert-edited",this._updateLatLngs,this)},_defaultShape:function(){if(!L.Polyline._flat){return this._poly._latlngs}return L.Polyline._flat(this._poly._latlngs)?this._poly._latlngs:this._poly._latlngs[0]},_eachVertexHandler:function(b){for(var a=0;aa){c._index+=b}})},_createMiddleMarker:function(f,d){var g=this._getMiddleLatLng(f,d),a=this._createMarker(g),e,c,b;a.setOpacity(0.6);f._middleRight=d._middleLeft=a;c=function(){a.off("touchmove",c,this);var h=d._index;a._index=h;a.off("click",e,this).on("click",this._onMarkerClick,this);g.lat=a.getLatLng().lat;g.lng=a.getLatLng().lng;this._spliceLatLngs(h,0,g);this._markers.splice(h,0,a);a.setOpacity(1);this._updateIndexes(h,1);d._index++;this._updatePrevNext(f,a);this._updatePrevNext(a,d);this._poly.fire("editstart")};b=function(){a.off("dragstart",c,this);a.off("dragend",b,this);a.off("touchmove",c,this);this._createMiddleMarker(f,a);this._createMiddleMarker(a,d)};e=function(){c.call(this);b.call(this);this._fireEdit()};a.on("click",e,this).on("dragstart",c,this).on("dragend",b,this).on("touchmove",c,this);this._markerGroup.addLayer(a)},_updatePrevNext:function(b,a){if(b){b._next=a}if(a){a._prev=b}},_getMiddleLatLng:function(e,c){var b=this._poly._map,d=b.project(e.getLatLng()),a=b.project(c.getLatLng());return b.unproject(d._add(a)._divideBy(2))}});L.Polyline.addInitHook(function(){if(this.editing){return}if(L.Edit.Poly){this.editing=new L.Edit.Poly(this,this.options.poly);if(this.options.editable){this.editing.enable()}}this.on("add",function(){if(this.editing&&this.editing.enabled()){this.editing.addHooks()}});this.on("remove",function(){if(this.editing&&this.editing.enabled()){this.editing.removeHooks()}})}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Rectangle.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Rectangle.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,125 @@ +L.Edit = L.Edit || {}; +/** + * @class L.Edit.Rectangle + * @aka Edit.Rectangle + * @inherits L.Edit.SimpleShape + */ +L.Edit.Rectangle = L.Edit.SimpleShape.extend({ + _createMoveMarker: function () { + var bounds = this._shape.getBounds(), + center = bounds.getCenter(); + + this._moveMarker = this._createMarker(center, this.options.moveIcon); + }, + + _createResizeMarker: function () { + var corners = this._getCorners(); + + this._resizeMarkers = []; + + for (var i = 0, l = corners.length; i < l; i++) { + this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon)); + // Monkey in the corner index as we will need to know this for dragging + this._resizeMarkers[i]._cornerIndex = i; + } + }, + + _onMarkerDragStart: function (e) { + L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e); + + // Save a reference to the opposite point + var corners = this._getCorners(), + marker = e.target, + currentCornerIndex = marker._cornerIndex; + + this._oppositeCorner = corners[(currentCornerIndex + 2) % 4]; + + this._toggleCornerMarkers(0, currentCornerIndex); + }, + + _onMarkerDragEnd: function (e) { + var marker = e.target, + bounds, center; + + // Reset move marker position to the center + if (marker === this._moveMarker) { + bounds = this._shape.getBounds(); + center = bounds.getCenter(); + + marker.setLatLng(center); + } + + this._toggleCornerMarkers(1); + + this._repositionCornerMarkers(); + + L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e); + }, + + _move: function (newCenter) { + var latlngs = this._shape._defaultShape ? this._shape._defaultShape() : this._shape.getLatLngs(), + bounds = this._shape.getBounds(), + center = bounds.getCenter(), + offset, newLatLngs = []; + + // Offset the latlngs to the new center + for (var i = 0, l = latlngs.length; i < l; i++) { + offset = [latlngs[i].lat - center.lat, latlngs[i].lng - center.lng]; + newLatLngs.push([newCenter.lat + offset[0], newCenter.lng + offset[1]]); + } + + this._shape.setLatLngs(newLatLngs); + + // Reposition the resize markers + this._repositionCornerMarkers(); + + this._map.fire(L.Draw.Event.EDITMOVE, { layer: this._shape }); + }, + + _resize: function (latlng) { + var bounds; + + // Update the shape based on the current position of this corner and the opposite point + this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner)); + + // Reposition the move marker + bounds = this._shape.getBounds(); + this._moveMarker.setLatLng(bounds.getCenter()); + + this._map.fire(L.Draw.Event.EDITRESIZE, { layer: this._shape }); + }, + + _getCorners: function () { + var bounds = this._shape.getBounds(), + nw = bounds.getNorthWest(), + ne = bounds.getNorthEast(), + se = bounds.getSouthEast(), + sw = bounds.getSouthWest(); + + return [nw, ne, se, sw]; + }, + + _toggleCornerMarkers: function (opacity) { + for (var i = 0, l = this._resizeMarkers.length; i < l; i++) { + this._resizeMarkers[i].setOpacity(opacity); + } + }, + + _repositionCornerMarkers: function () { + var corners = this._getCorners(); + + for (var i = 0, l = this._resizeMarkers.length; i < l; i++) { + this._resizeMarkers[i].setLatLng(corners[i]); + } + } +}); + +L.Rectangle.addInitHook(function () { + if (L.Edit.Rectangle) { + this.editing = new L.Edit.Rectangle(this); + + if (this.options.editable) { + this.editing.enable(); + } + } +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/Edit.Rectangle.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/Edit.Rectangle.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Edit=L.Edit||{};L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var b=this._shape.getBounds(),a=b.getCenter();this._moveMarker=this._createMarker(a,this.options.moveIcon)},_createResizeMarker:function(){var b=this._getCorners();this._resizeMarkers=[];for(var c=0,a=b.length;c 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { + L.DomEvent.stop(e); + return false; + } + L.DomEvent._lastClick = timeStamp; + return true; + }, + + _onTouchStart: function (e) { + if (!this._map._loaded) { + return; + } + + var type = 'touchstart'; + this._touchEvent(e, type); + + }, + + _onTouchEnd: function (e) { + if (!this._map._loaded) { + return; + } + + var type = 'touchend'; + this._touchEvent(e, type); + }, + + _onTouchCancel: function (e) { + if (!this._map._loaded) { + return; + } + + var type = 'touchcancel'; + if (this._detectIE()) { + type = 'pointercancel'; + } + this._touchEvent(e, type); + }, + + _onTouchLeave: function (e) { + if (!this._map._loaded) { + return; + } + + var type = 'touchleave'; + this._touchEvent(e, type); + }, + + _onTouchMove: function (e) { + if (!this._map._loaded) { + return; + } + + var type = 'touchmove'; + this._touchEvent(e, type); + }, + + _detectIE: function () { + var ua = window.navigator.userAgent; + + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + // IE 10 or older => return version number + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + // IE 11 => return version number + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + // IE 12 => return version number + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + + // other browser + return false; + } +}); + +L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend); + + +/** + * @class L.Marker.Touch + * @aka Marker.Touch + * + * This isn't full Touch support. This is just to get markers to also support dom touch events after creation + * #TODO: find a better way of getting markers to support touch. + */ +L.Marker.Touch = L.Marker.extend({ + + _initInteraction: function () { + if (!this.addInteractiveTarget) { + // 0.7.x support + return this._initInteractionLegacy(); + } + // TODO this may need be updated to re-add touch events for 1.0+ + return L.Marker.prototype._initInteraction.apply(this); + }, + + // This is an exact copy of https://github.com/Leaflet/Leaflet/blob/v0.7/src/layer/marker/Marker.js + // with the addition of the touch events + _initInteractionLegacy: function () { + + if (!this.options.clickable) { + return; + } + + // TODO refactor into something shared with Map/Path/etc. to DRY it up + + var icon = this._icon, + events = ['dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'touchstart', + 'touchend', + 'touchmove']; + if (this._detectIE) { + events.concat(['MSPointerDown', + 'MSPointerUp', + 'MSPointerMove', + 'MSPointerCancel']); + } else { + events.concat(['touchcancel']); + } + + L.DomUtil.addClass(icon, 'leaflet-clickable'); + L.DomEvent.on(icon, 'click', this._onMouseClick, this); + L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); + + for (var i = 0; i < events.length; i++) { + L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); + } + + if (L.Handler.MarkerDrag) { + this.dragging = new L.Handler.MarkerDrag(this); + + if (this.options.draggable) { + this.dragging.enable(); + } + } + }, + + _detectIE: function () { + var ua = window.navigator.userAgent; + + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + // IE 10 or older => return version number + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + // IE 11 => return version number + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + // IE 12 => return version number + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + + // other browser + return false; + } +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/TouchEvents.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/TouchEvents.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Map.mergeOptions({touchExtend:true});L.Map.TouchExtend=L.Handler.extend({initialize:function(a){this._map=a;this._container=a._container;this._pane=a._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this);L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this);L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this);if(this._detectIE()){L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this);L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this);L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this);L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)}else{L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this);L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this)}},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart);L.DomEvent.off(this._container,"touchend",this._onTouchEnd);L.DomEvent.off(this._container,"touchmove",this._onTouchMove);if(this._detectIE()){L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart);L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd);L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove);L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)}else{L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel);L.DomEvent.off(this._container,"touchleave",this._onTouchLeave)}},_touchEvent:function(f,d){var a={};if(typeof f.touches!=="undefined"){if(!f.touches.length){return}a=f.touches[0]}else{if(f.pointerType==="touch"){a=f;if(!this._filterClick(f)){return}}else{return}}var c=this._map.mouseEventToContainerPoint(a),b=this._map.mouseEventToLayerPoint(a),g=this._map.layerPointToLatLng(b);this._map.fire(d,{latlng:g,layerPoint:b,containerPoint:c,pageX:a.pageX,pageY:a.pageY,originalEvent:f})},_filterClick:function(c){var b=(c.timeStamp||c.originalEvent.timeStamp),a=L.DomEvent._lastClick&&(b-L.DomEvent._lastClick);if((a&&a>100&&a<500)||(c.target._simulatedClick&&!c._simulated)){L.DomEvent.stop(c);return false}L.DomEvent._lastClick=b;return true},_onTouchStart:function(b){if(!this._map._loaded){return}var a="touchstart";this._touchEvent(b,a)},_onTouchEnd:function(b){if(!this._map._loaded){return}var a="touchend";this._touchEvent(b,a)},_onTouchCancel:function(b){if(!this._map._loaded){return}var a="touchcancel";if(this._detectIE()){a="pointercancel"}this._touchEvent(b,a)},_onTouchLeave:function(b){if(!this._map._loaded){return}var a="touchleave";this._touchEvent(b,a)},_onTouchMove:function(b){if(!this._map._loaded){return}var a="touchmove";this._touchEvent(b,a)},_detectIE:function(){var c=window.navigator.userAgent;var b=c.indexOf("MSIE ");if(b>0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}});L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend);L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(!this.addInteractiveTarget){return this._initInteractionLegacy()}return L.Marker.prototype._initInteraction.apply(this)},_initInteractionLegacy:function(){if(!this.options.clickable){return}var c=this._icon,b=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];if(this._detectIE){b.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"])}else{b.concat(["touchcancel"])}L.DomUtil.addClass(c,"leaflet-clickable");L.DomEvent.on(c,"click",this._onMouseClick,this);L.DomEvent.on(c,"keypress",this._onKeyPress,this);for(var a=0;a0){return parseInt(c.substring(b+5,c.indexOf(".",b)),10)}var a=c.indexOf("Trident/");if(a>0){var e=c.indexOf("rv:");return parseInt(c.substring(e+3,c.indexOf(".",e)),10)}var d=c.indexOf("Edge/");if(d>0){return parseInt(c.substring(d+5,c.indexOf(".",d)),10)}return false}}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-1.0.3.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-1.0.3.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,13251 @@ +/* + Leaflet 1.0.3+ed36a04, a JS library for interactive maps. http://leafletjs.com + (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade +*/ +(function (window, document, undefined) { +var L = { + version: "1.0.3+ed36a04" +}; + +function expose() { + var oldL = window.L; + + L.noConflict = function () { + window.L = oldL; + return this; + }; + + window.L = L; +} + +// define Leaflet for Node module pattern loaders, including Browserify +if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = L; + +// define Leaflet as an AMD module +} else if (typeof define === 'function' && define.amd) { + define(L); +} + +// define Leaflet as a global L variable, saving the original L to restore later if needed +if (typeof window !== 'undefined') { + expose(); +} + + + +/* + * @namespace Util + * + * Various utility functions, used by Leaflet internally. + */ + +L.Util = { + + // @function extend(dest: Object, src?: Object): Object + // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. + extend: function (dest) { + var i, j, len, src; + + for (j = 1, len = arguments.length; j < len; j++) { + src = arguments[j]; + for (i in src) { + dest[i] = src[i]; + } + } + return dest; + }, + + // @function create(proto: Object, properties?: Object): Object + // Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create) + create: Object.create || (function () { + function F() {} + return function (proto) { + F.prototype = proto; + return new F(); + }; + })(), + + // @function bind(fn: Function, …): Function + // Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). + // Has a `L.bind()` shortcut. + bind: function (fn, obj) { + var slice = Array.prototype.slice; + + if (fn.bind) { + return fn.bind.apply(fn, slice.call(arguments, 1)); + } + + var args = slice.call(arguments, 2); + + return function () { + return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); + }; + }, + + // @function stamp(obj: Object): Number + // Returns the unique ID of an object, assiging it one if it doesn't have it. + stamp: function (obj) { + /*eslint-disable */ + obj._leaflet_id = obj._leaflet_id || ++L.Util.lastId; + return obj._leaflet_id; + /*eslint-enable */ + }, + + // @property lastId: Number + // Last unique ID used by [`stamp()`](#util-stamp) + lastId: 0, + + // @function throttle(fn: Function, time: Number, context: Object): Function + // Returns a function which executes function `fn` with the given scope `context` + // (so that the `this` keyword refers to `context` inside `fn`'s code). The function + // `fn` will be called no more than one time per given amount of `time`. The arguments + // received by the bound function will be any arguments passed when binding the + // function, followed by any arguments passed when invoking the bound function. + // Has an `L.bind` shortcut. + throttle: function (fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; + } + }; + + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; + + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } + }; + + return wrapperFn; + }, + + // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number + // Returns the number `num` modulo `range` in such a way so it lies within + // `range[0]` and `range[1]`. The returned value will be always smaller than + // `range[1]` unless `includeMax` is set to `true`. + wrapNum: function (x, range, includeMax) { + var max = range[1], + min = range[0], + d = max - min; + return x === max && includeMax ? x : ((x - min) % d + d) % d + min; + }, + + // @function falseFn(): Function + // Returns a function which always returns `false`. + falseFn: function () { return false; }, + + // @function formatNum(num: Number, digits?: Number): Number + // Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default. + formatNum: function (num, digits) { + var pow = Math.pow(10, digits || 5); + return Math.round(num * pow) / pow; + }, + + // @function trim(str: String): String + // Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) + trim: function (str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); + }, + + // @function splitWords(str: String): String[] + // Trims and splits the string on whitespace and returns the array of parts. + splitWords: function (str) { + return L.Util.trim(str).split(/\s+/); + }, + + // @function setOptions(obj: Object, options: Object): Object + // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. + setOptions: function (obj, options) { + if (!obj.hasOwnProperty('options')) { + obj.options = obj.options ? L.Util.create(obj.options) : {}; + } + for (var i in options) { + obj.options[i] = options[i]; + } + return obj.options; + }, + + // @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String + // Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}` + // translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will + // be appended at the end. If `uppercase` is `true`, the parameter names will + // be uppercased (e.g. `'?A=foo&B=bar'`) + getParamString: function (obj, existingUrl, uppercase) { + var params = []; + for (var i in obj) { + params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); + } + return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); + }, + + // @function template(str: String, data: Object): String + // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` + // and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string + // `('Hello foo, bar')`. You can also specify functions instead of strings for + // data values — they will be evaluated passing `data` as an argument. + template: function (str, data) { + return str.replace(L.Util.templateRe, function (str, key) { + var value = data[key]; + + if (value === undefined) { + throw new Error('No value provided for variable ' + str); + + } else if (typeof value === 'function') { + value = value(data); + } + return value; + }); + }, + + templateRe: /\{ *([\w_\-]+) *\}/g, + + // @function isArray(obj): Boolean + // Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) + isArray: Array.isArray || function (obj) { + return (Object.prototype.toString.call(obj) === '[object Array]'); + }, + + // @function indexOf(array: Array, el: Object): Number + // Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) + indexOf: function (array, el) { + for (var i = 0; i < array.length; i++) { + if (array[i] === el) { return i; } + } + return -1; + }, + + // @property emptyImageUrl: String + // Data URI string containing a base64-encoded empty GIF image. + // Used as a hack to free memory from unused images on WebKit-powered + // mobile devices (by setting image `src` to this string). + emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' +}; + +(function () { + // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + + function getPrefixed(name) { + return window['webkit' + name] || window['moz' + name] || window['ms' + name]; + } + + var lastTime = 0; + + // fallback for IE 7-8 + function timeoutDefer(fn) { + var time = +new Date(), + timeToCall = Math.max(0, 16 - (time - lastTime)); + + lastTime = time + timeToCall; + return window.setTimeout(fn, timeToCall); + } + + var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer, + cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || + getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; + + + // @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number + // Schedules `fn` to be executed when the browser repaints. `fn` is bound to + // `context` if given. When `immediate` is set, `fn` is called immediately if + // the browser doesn't have native support for + // [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame), + // otherwise it's delayed. Returns a request ID that can be used to cancel the request. + L.Util.requestAnimFrame = function (fn, context, immediate) { + if (immediate && requestFn === timeoutDefer) { + fn.call(context); + } else { + return requestFn.call(window, L.bind(fn, context)); + } + }; + + // @function cancelAnimFrame(id: Number): undefined + // Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame). + L.Util.cancelAnimFrame = function (id) { + if (id) { + cancelFn.call(window, id); + } + }; +})(); + +// shortcuts for most used utility functions +L.extend = L.Util.extend; +L.bind = L.Util.bind; +L.stamp = L.Util.stamp; +L.setOptions = L.Util.setOptions; + + + + +// @class Class +// @aka L.Class + +// @section +// @uninheritable + +// Thanks to John Resig and Dean Edwards for inspiration! + +L.Class = function () {}; + +L.Class.extend = function (props) { + + // @function extend(props: Object): Function + // [Extends the current class](#class-inheritance) given the properties to be included. + // Returns a Javascript function that is a class constructor (to be called with `new`). + var NewClass = function () { + + // call the constructor + if (this.initialize) { + this.initialize.apply(this, arguments); + } + + // call all constructor hooks + this.callInitHooks(); + }; + + var parentProto = NewClass.__super__ = this.prototype; + + var proto = L.Util.create(parentProto); + proto.constructor = NewClass; + + NewClass.prototype = proto; + + // inherit parent's statics + for (var i in this) { + if (this.hasOwnProperty(i) && i !== 'prototype') { + NewClass[i] = this[i]; + } + } + + // mix static properties into the class + if (props.statics) { + L.extend(NewClass, props.statics); + delete props.statics; + } + + // mix includes into the prototype + if (props.includes) { + L.Util.extend.apply(null, [proto].concat(props.includes)); + delete props.includes; + } + + // merge options + if (proto.options) { + props.options = L.Util.extend(L.Util.create(proto.options), props.options); + } + + // mix given properties into the prototype + L.extend(proto, props); + + proto._initHooks = []; + + // add method for calling all hooks + proto.callInitHooks = function () { + + if (this._initHooksCalled) { return; } + + if (parentProto.callInitHooks) { + parentProto.callInitHooks.call(this); + } + + this._initHooksCalled = true; + + for (var i = 0, len = proto._initHooks.length; i < len; i++) { + proto._initHooks[i].call(this); + } + }; + + return NewClass; +}; + + +// @function include(properties: Object): this +// [Includes a mixin](#class-includes) into the current class. +L.Class.include = function (props) { + L.extend(this.prototype, props); + return this; +}; + +// @function mergeOptions(options: Object): this +// [Merges `options`](#class-options) into the defaults of the class. +L.Class.mergeOptions = function (options) { + L.extend(this.prototype.options, options); + return this; +}; + +// @function addInitHook(fn: Function): this +// Adds a [constructor hook](#class-constructor-hooks) to the class. +L.Class.addInitHook = function (fn) { // (Function) || (String, args...) + var args = Array.prototype.slice.call(arguments, 1); + + var init = typeof fn === 'function' ? fn : function () { + this[fn].apply(this, args); + }; + + this.prototype._initHooks = this.prototype._initHooks || []; + this.prototype._initHooks.push(init); + return this; +}; + + + +/* + * @class Evented + * @aka L.Evented + * @inherits Class + * + * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event). + * + * @example + * + * ```js + * map.on('click', function(e) { + * alert(e.latlng); + * } ); + * ``` + * + * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function: + * + * ```js + * function onClick(e) { ... } + * + * map.on('click', onClick); + * map.off('click', onClick); + * ``` + */ + + +L.Evented = L.Class.extend({ + + /* @method on(type: String, fn: Function, context?: Object): this + * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`). + * + * @alternative + * @method on(eventMap: Object): this + * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + */ + on: function (types, fn, context) { + + // types can be a map of types/handlers + if (typeof types === 'object') { + for (var type in types) { + // we don't process space-separated events here for performance; + // it's a hot path since Layer uses the on(obj) syntax + this._on(type, types[type], fn); + } + + } else { + // types can be a string of space-separated words + types = L.Util.splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._on(types[i], fn, context); + } + } + + return this; + }, + + /* @method off(type: String, fn?: Function, context?: Object): this + * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener. + * + * @alternative + * @method off(eventMap: Object): this + * Removes a set of type/listener pairs. + * + * @alternative + * @method off: this + * Removes all listeners to all events on the object. + */ + off: function (types, fn, context) { + + if (!types) { + // clear all listeners if called without arguments + delete this._events; + + } else if (typeof types === 'object') { + for (var type in types) { + this._off(type, types[type], fn); + } + + } else { + types = L.Util.splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._off(types[i], fn, context); + } + } + + return this; + }, + + // attach listener (without syntactic sugar now) + _on: function (type, fn, context) { + this._events = this._events || {}; + + /* get/init listeners for type */ + var typeListeners = this._events[type]; + if (!typeListeners) { + typeListeners = []; + this._events[type] = typeListeners; + } + + if (context === this) { + // Less memory footprint. + context = undefined; + } + var newListener = {fn: fn, ctx: context}, + listeners = typeListeners; + + // check if fn already there + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].fn === fn && listeners[i].ctx === context) { + return; + } + } + + listeners.push(newListener); + }, + + _off: function (type, fn, context) { + var listeners, + i, + len; + + if (!this._events) { return; } + + listeners = this._events[type]; + + if (!listeners) { + return; + } + + if (!fn) { + // Set all removed listeners to noop so they are not called if remove happens in fire + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].fn = L.Util.falseFn; + } + // clear all listeners for a type if function isn't specified + delete this._events[type]; + return; + } + + if (context === this) { + context = undefined; + } + + if (listeners) { + + // find fn and remove it + for (i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + if (l.ctx !== context) { continue; } + if (l.fn === fn) { + + // set the removed listener to noop so that's not called if remove happens in fire + l.fn = L.Util.falseFn; + + if (this._firingCount) { + /* copy array in case events are being fired */ + this._events[type] = listeners = listeners.slice(); + } + listeners.splice(i, 1); + + return; + } + } + } + }, + + // @method fire(type: String, data?: Object, propagate?: Boolean): this + // Fires an event of the specified type. You can optionally provide an data + // object — the first argument of the listener function will contain its + // properties. The event can optionally be propagated to event parents. + fire: function (type, data, propagate) { + if (!this.listens(type, propagate)) { return this; } + + var event = L.Util.extend({}, data, {type: type, target: this}); + + if (this._events) { + var listeners = this._events[type]; + + if (listeners) { + this._firingCount = (this._firingCount + 1) || 1; + for (var i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + l.fn.call(l.ctx || this, event); + } + + this._firingCount--; + } + } + + if (propagate) { + // propagate the event to parents (set with addEventParent) + this._propagateEvent(event); + } + + return this; + }, + + // @method listens(type: String): Boolean + // Returns `true` if a particular event type has any listeners attached to it. + listens: function (type, propagate) { + var listeners = this._events && this._events[type]; + if (listeners && listeners.length) { return true; } + + if (propagate) { + // also check parents for listeners if event propagates + for (var id in this._eventParents) { + if (this._eventParents[id].listens(type, propagate)) { return true; } + } + } + return false; + }, + + // @method once(…): this + // Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed. + once: function (types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + this.once(type, types[type], fn); + } + return this; + } + + var handler = L.bind(function () { + this + .off(types, fn, context) + .off(types, handler, context); + }, this); + + // add a listener that's executed once and removed after that + return this + .on(types, fn, context) + .on(types, handler, context); + }, + + // @method addEventParent(obj: Evented): this + // Adds an event parent - an `Evented` that will receive propagated events + addEventParent: function (obj) { + this._eventParents = this._eventParents || {}; + this._eventParents[L.stamp(obj)] = obj; + return this; + }, + + // @method removeEventParent(obj: Evented): this + // Removes an event parent, so it will stop receiving propagated events + removeEventParent: function (obj) { + if (this._eventParents) { + delete this._eventParents[L.stamp(obj)]; + } + return this; + }, + + _propagateEvent: function (e) { + for (var id in this._eventParents) { + this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true); + } + } +}); + +var proto = L.Evented.prototype; + +// aliases; we should ditch those eventually + +// @method addEventListener(…): this +// Alias to [`on(…)`](#evented-on) +proto.addEventListener = proto.on; + +// @method removeEventListener(…): this +// Alias to [`off(…)`](#evented-off) + +// @method clearAllEventListeners(…): this +// Alias to [`off()`](#evented-off) +proto.removeEventListener = proto.clearAllEventListeners = proto.off; + +// @method addOneTimeEventListener(…): this +// Alias to [`once(…)`](#evented-once) +proto.addOneTimeEventListener = proto.once; + +// @method fireEvent(…): this +// Alias to [`fire(…)`](#evented-fire) +proto.fireEvent = proto.fire; + +// @method hasEventListeners(…): Boolean +// Alias to [`listens(…)`](#evented-listens) +proto.hasEventListeners = proto.listens; + +L.Mixin = {Events: proto}; + + + +/* + * @namespace Browser + * @aka L.Browser + * + * A namespace with static properties for browser/feature detection used by Leaflet internally. + * + * @example + * + * ```js + * if (L.Browser.ielt9) { + * alert('Upgrade your browser, dude!'); + * } + * ``` + */ + +(function () { + + var ua = navigator.userAgent.toLowerCase(), + doc = document.documentElement, + + ie = 'ActiveXObject' in window, + + webkit = ua.indexOf('webkit') !== -1, + phantomjs = ua.indexOf('phantom') !== -1, + android23 = ua.search('android [23]') !== -1, + chrome = ua.indexOf('chrome') !== -1, + gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie, + + win = navigator.platform.indexOf('Win') === 0, + + mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1, + msPointer = !window.PointerEvent && window.MSPointerEvent, + pointer = window.PointerEvent || msPointer, + + ie3d = ie && ('transition' in doc.style), + webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, + gecko3d = 'MozPerspective' in doc.style, + opera12 = 'OTransition' in doc.style; + + + var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch)); + + L.Browser = { + + // @property ie: Boolean + // `true` for all Internet Explorer versions (not Edge). + ie: ie, + + // @property ielt9: Boolean + // `true` for Internet Explorer versions less than 9. + ielt9: ie && !document.addEventListener, + + // @property edge: Boolean + // `true` for the Edge web browser. + edge: 'msLaunchUri' in navigator && !('documentMode' in document), + + // @property webkit: Boolean + // `true` for webkit-based browsers like Chrome and Safari (including mobile versions). + webkit: webkit, + + // @property gecko: Boolean + // `true` for gecko-based browsers like Firefox. + gecko: gecko, + + // @property android: Boolean + // `true` for any browser running on an Android platform. + android: ua.indexOf('android') !== -1, + + // @property android23: Boolean + // `true` for browsers running on Android 2 or Android 3. + android23: android23, + + // @property chrome: Boolean + // `true` for the Chrome browser. + chrome: chrome, + + // @property safari: Boolean + // `true` for the Safari browser. + safari: !chrome && ua.indexOf('safari') !== -1, + + + // @property win: Boolean + // `true` when the browser is running in a Windows platform + win: win, + + + // @property ie3d: Boolean + // `true` for all Internet Explorer versions supporting CSS transforms. + ie3d: ie3d, + + // @property webkit3d: Boolean + // `true` for webkit-based browsers supporting CSS transforms. + webkit3d: webkit3d, + + // @property gecko3d: Boolean + // `true` for gecko-based browsers supporting CSS transforms. + gecko3d: gecko3d, + + // @property opera12: Boolean + // `true` for the Opera browser supporting CSS transforms (version 12 or later). + opera12: opera12, + + // @property any3d: Boolean + // `true` for all browsers supporting CSS transforms. + any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs, + + + // @property mobile: Boolean + // `true` for all browsers running in a mobile device. + mobile: mobile, + + // @property mobileWebkit: Boolean + // `true` for all webkit-based browsers in a mobile device. + mobileWebkit: mobile && webkit, + + // @property mobileWebkit3d: Boolean + // `true` for all webkit-based browsers in a mobile device supporting CSS transforms. + mobileWebkit3d: mobile && webkit3d, + + // @property mobileOpera: Boolean + // `true` for the Opera browser in a mobile device. + mobileOpera: mobile && window.opera, + + // @property mobileGecko: Boolean + // `true` for gecko-based browsers running in a mobile device. + mobileGecko: mobile && gecko, + + + // @property touch: Boolean + // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). + // This does not necessarily mean that the browser is running in a computer with + // a touchscreen, it only means that the browser is capable of understanding + // touch events. + touch: !!touch, + + // @property msPointer: Boolean + // `true` for browsers implementing the Microsoft touch events model (notably IE10). + msPointer: !!msPointer, + + // @property pointer: Boolean + // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). + pointer: !!pointer, + + + // @property retina: Boolean + // `true` for browsers on a high-resolution "retina" screen. + retina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1 + }; + +}()); + + + +/* + * @class Point + * @aka L.Point + * + * Represents a point with `x` and `y` coordinates in pixels. + * + * @example + * + * ```js + * var point = L.point(200, 300); + * ``` + * + * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent: + * + * ```js + * map.panBy([200, 300]); + * map.panBy(L.point(200, 300)); + * ``` + */ + +L.Point = function (x, y, round) { + // @property x: Number; The `x` coordinate of the point + this.x = (round ? Math.round(x) : x); + // @property y: Number; The `y` coordinate of the point + this.y = (round ? Math.round(y) : y); +}; + +L.Point.prototype = { + + // @method clone(): Point + // Returns a copy of the current point. + clone: function () { + return new L.Point(this.x, this.y); + }, + + // @method add(otherPoint: Point): Point + // Returns the result of addition of the current and the given points. + add: function (point) { + // non-destructive, returns a new point + return this.clone()._add(L.point(point)); + }, + + _add: function (point) { + // destructive, used directly for performance in situations where it's safe to modify existing point + this.x += point.x; + this.y += point.y; + return this; + }, + + // @method subtract(otherPoint: Point): Point + // Returns the result of subtraction of the given point from the current. + subtract: function (point) { + return this.clone()._subtract(L.point(point)); + }, + + _subtract: function (point) { + this.x -= point.x; + this.y -= point.y; + return this; + }, + + // @method divideBy(num: Number): Point + // Returns the result of division of the current point by the given number. + divideBy: function (num) { + return this.clone()._divideBy(num); + }, + + _divideBy: function (num) { + this.x /= num; + this.y /= num; + return this; + }, + + // @method multiplyBy(num: Number): Point + // Returns the result of multiplication of the current point by the given number. + multiplyBy: function (num) { + return this.clone()._multiplyBy(num); + }, + + _multiplyBy: function (num) { + this.x *= num; + this.y *= num; + return this; + }, + + // @method scaleBy(scale: Point): Point + // Multiply each coordinate of the current point by each coordinate of + // `scale`. In linear algebra terms, multiply the point by the + // [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation) + // defined by `scale`. + scaleBy: function (point) { + return new L.Point(this.x * point.x, this.y * point.y); + }, + + // @method unscaleBy(scale: Point): Point + // Inverse of `scaleBy`. Divide each coordinate of the current point by + // each coordinate of `scale`. + unscaleBy: function (point) { + return new L.Point(this.x / point.x, this.y / point.y); + }, + + // @method round(): Point + // Returns a copy of the current point with rounded coordinates. + round: function () { + return this.clone()._round(); + }, + + _round: function () { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + }, + + // @method floor(): Point + // Returns a copy of the current point with floored coordinates (rounded down). + floor: function () { + return this.clone()._floor(); + }, + + _floor: function () { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + }, + + // @method ceil(): Point + // Returns a copy of the current point with ceiled coordinates (rounded up). + ceil: function () { + return this.clone()._ceil(); + }, + + _ceil: function () { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + }, + + // @method distanceTo(otherPoint: Point): Number + // Returns the cartesian distance between the current and the given points. + distanceTo: function (point) { + point = L.point(point); + + var x = point.x - this.x, + y = point.y - this.y; + + return Math.sqrt(x * x + y * y); + }, + + // @method equals(otherPoint: Point): Boolean + // Returns `true` if the given point has the same coordinates. + equals: function (point) { + point = L.point(point); + + return point.x === this.x && + point.y === this.y; + }, + + // @method contains(otherPoint: Point): Boolean + // Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + contains: function (point) { + point = L.point(point); + + return Math.abs(point.x) <= Math.abs(this.x) && + Math.abs(point.y) <= Math.abs(this.y); + }, + + // @method toString(): String + // Returns a string representation of the point for debugging purposes. + toString: function () { + return 'Point(' + + L.Util.formatNum(this.x) + ', ' + + L.Util.formatNum(this.y) + ')'; + } +}; + +// @factory L.point(x: Number, y: Number, round?: Boolean) +// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values. + +// @alternative +// @factory L.point(coords: Number[]) +// Expects an array of the form `[x, y]` instead. + +// @alternative +// @factory L.point(coords: Object) +// Expects a plain object of the form `{x: Number, y: Number}` instead. +L.point = function (x, y, round) { + if (x instanceof L.Point) { + return x; + } + if (L.Util.isArray(x)) { + return new L.Point(x[0], x[1]); + } + if (x === undefined || x === null) { + return x; + } + if (typeof x === 'object' && 'x' in x && 'y' in x) { + return new L.Point(x.x, x.y); + } + return new L.Point(x, y, round); +}; + + + +/* + * @class Bounds + * @aka L.Bounds + * + * Represents a rectangular area in pixel coordinates. + * + * @example + * + * ```js + * var p1 = L.point(10, 10), + * p2 = L.point(40, 60), + * bounds = L.bounds(p1, p2); + * ``` + * + * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * otherBounds.intersects([[10, 10], [40, 60]]); + * ``` + */ + +L.Bounds = function (a, b) { + if (!a) { return; } + + var points = b ? [a, b] : a; + + for (var i = 0, len = points.length; i < len; i++) { + this.extend(points[i]); + } +}; + +L.Bounds.prototype = { + // @method extend(point: Point): this + // Extends the bounds to contain the given point. + extend: function (point) { // (Point) + point = L.point(point); + + // @property min: Point + // The top left corner of the rectangle. + // @property max: Point + // The bottom right corner of the rectangle. + if (!this.min && !this.max) { + this.min = point.clone(); + this.max = point.clone(); + } else { + this.min.x = Math.min(point.x, this.min.x); + this.max.x = Math.max(point.x, this.max.x); + this.min.y = Math.min(point.y, this.min.y); + this.max.y = Math.max(point.y, this.max.y); + } + return this; + }, + + // @method getCenter(round?: Boolean): Point + // Returns the center point of the bounds. + getCenter: function (round) { + return new L.Point( + (this.min.x + this.max.x) / 2, + (this.min.y + this.max.y) / 2, round); + }, + + // @method getBottomLeft(): Point + // Returns the bottom-left point of the bounds. + getBottomLeft: function () { + return new L.Point(this.min.x, this.max.y); + }, + + // @method getTopRight(): Point + // Returns the top-right point of the bounds. + getTopRight: function () { // -> Point + return new L.Point(this.max.x, this.min.y); + }, + + // @method getSize(): Point + // Returns the size of the given bounds + getSize: function () { + return this.max.subtract(this.min); + }, + + // @method contains(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle contains the given one. + // @alternative + // @method contains(point: Point): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { + var min, max; + + if (typeof obj[0] === 'number' || obj instanceof L.Point) { + obj = L.point(obj); + } else { + obj = L.bounds(obj); + } + + if (obj instanceof L.Bounds) { + min = obj.min; + max = obj.max; + } else { + min = max = obj; + } + + return (min.x >= this.min.x) && + (max.x <= this.max.x) && + (min.y >= this.min.y) && + (max.y <= this.max.y); + }, + + // @method intersects(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds + // intersect if they have at least one point in common. + intersects: function (bounds) { // (Bounds) -> Boolean + bounds = L.bounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xIntersects = (max2.x >= min.x) && (min2.x <= max.x), + yIntersects = (max2.y >= min.y) && (min2.y <= max.y); + + return xIntersects && yIntersects; + }, + + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds + // overlap if their intersection is an area. + overlaps: function (bounds) { // (Bounds) -> Boolean + bounds = L.bounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xOverlaps = (max2.x > min.x) && (min2.x < max.x), + yOverlaps = (max2.y > min.y) && (min2.y < max.y); + + return xOverlaps && yOverlaps; + }, + + isValid: function () { + return !!(this.min && this.max); + } +}; + + +// @factory L.bounds(topLeft: Point, bottomRight: Point) +// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners). +// @alternative +// @factory L.bounds(points: Point[]) +// Creates a Bounds object from the points it contains +L.bounds = function (a, b) { + if (!a || a instanceof L.Bounds) { + return a; + } + return new L.Bounds(a, b); +}; + + + +/* + * @class Transformation + * @aka L.Transformation + * + * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d` + * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing + * the reverse. Used by Leaflet in its projections code. + * + * @example + * + * ```js + * var transformation = new L.Transformation(2, 5, -1, 10), + * p = L.point(1, 2), + * p2 = transformation.transform(p), // L.point(7, 8) + * p3 = transformation.untransform(p2); // L.point(1, 2) + * ``` + */ + + +// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number) +// Creates a `Transformation` object with the given coefficients. +L.Transformation = function (a, b, c, d) { + this._a = a; + this._b = b; + this._c = c; + this._d = d; +}; + +L.Transformation.prototype = { + // @method transform(point: Point, scale?: Number): Point + // Returns a transformed point, optionally multiplied by the given scale. + // Only accepts actual `L.Point` instances, not arrays. + transform: function (point, scale) { // (Point, Number) -> Point + return this._transform(point.clone(), scale); + }, + + // destructive transform (faster) + _transform: function (point, scale) { + scale = scale || 1; + point.x = scale * (this._a * point.x + this._b); + point.y = scale * (this._c * point.y + this._d); + return point; + }, + + // @method untransform(point: Point, scale?: Number): Point + // Returns the reverse transformation of the given point, optionally divided + // by the given scale. Only accepts actual `L.Point` instances, not arrays. + untransform: function (point, scale) { + scale = scale || 1; + return new L.Point( + (point.x / scale - this._b) / this._a, + (point.y / scale - this._d) / this._c); + } +}; + + + +/* + * @namespace DomUtil + * + * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) + * tree, used by Leaflet internally. + * + * Most functions expecting or returning a `HTMLElement` also work for + * SVG elements. The only difference is that classes refer to CSS classes + * in HTML and SVG classes in SVG. + */ + +L.DomUtil = { + + // @function get(id: String|HTMLElement): HTMLElement + // Returns an element given its DOM id, or returns the element itself + // if it was passed directly. + get: function (id) { + return typeof id === 'string' ? document.getElementById(id) : id; + }, + + // @function getStyle(el: HTMLElement, styleAttrib: String): String + // Returns the value for a certain style attribute on an element, + // including computed values or values set through CSS. + getStyle: function (el, style) { + + var value = el.style[style] || (el.currentStyle && el.currentStyle[style]); + + if ((!value || value === 'auto') && document.defaultView) { + var css = document.defaultView.getComputedStyle(el, null); + value = css ? css[style] : null; + } + + return value === 'auto' ? null : value; + }, + + // @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement + // Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element. + create: function (tagName, className, container) { + + var el = document.createElement(tagName); + el.className = className || ''; + + if (container) { + container.appendChild(el); + } + + return el; + }, + + // @function remove(el: HTMLElement) + // Removes `el` from its parent element + remove: function (el) { + var parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } + }, + + // @function empty(el: HTMLElement) + // Removes all of `el`'s children elements from `el` + empty: function (el) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } + }, + + // @function toFront(el: HTMLElement) + // Makes `el` the last children of its parent, so it renders in front of the other children. + toFront: function (el) { + el.parentNode.appendChild(el); + }, + + // @function toBack(el: HTMLElement) + // Makes `el` the first children of its parent, so it renders back from the other children. + toBack: function (el) { + var parent = el.parentNode; + parent.insertBefore(el, parent.firstChild); + }, + + // @function hasClass(el: HTMLElement, name: String): Boolean + // Returns `true` if the element's class attribute contains `name`. + hasClass: function (el, name) { + if (el.classList !== undefined) { + return el.classList.contains(name); + } + var className = L.DomUtil.getClass(el); + return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); + }, + + // @function addClass(el: HTMLElement, name: String) + // Adds `name` to the element's class attribute. + addClass: function (el, name) { + if (el.classList !== undefined) { + var classes = L.Util.splitWords(name); + for (var i = 0, len = classes.length; i < len; i++) { + el.classList.add(classes[i]); + } + } else if (!L.DomUtil.hasClass(el, name)) { + var className = L.DomUtil.getClass(el); + L.DomUtil.setClass(el, (className ? className + ' ' : '') + name); + } + }, + + // @function removeClass(el: HTMLElement, name: String) + // Removes `name` from the element's class attribute. + removeClass: function (el, name) { + if (el.classList !== undefined) { + el.classList.remove(name); + } else { + L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + } + }, + + // @function setClass(el: HTMLElement, name: String) + // Sets the element's class. + setClass: function (el, name) { + if (el.className.baseVal === undefined) { + el.className = name; + } else { + // in case of SVG element + el.className.baseVal = name; + } + }, + + // @function getClass(el: HTMLElement): String + // Returns the element's class. + getClass: function (el) { + return el.className.baseVal === undefined ? el.className : el.className.baseVal; + }, + + // @function setOpacity(el: HTMLElement, opacity: Number) + // Set the opacity of an element (including old IE support). + // `opacity` must be a number from `0` to `1`. + setOpacity: function (el, value) { + + if ('opacity' in el.style) { + el.style.opacity = value; + + } else if ('filter' in el.style) { + L.DomUtil._setOpacityIE(el, value); + } + }, + + _setOpacityIE: function (el, value) { + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; + + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } + + value = Math.round(value * 100); + + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; + } + }, + + // @function testProp(props: String[]): String|false + // Goes through the array of style names and returns the first name + // that is a valid style name for an element. If no such name is found, + // it returns false. Useful for vendor-prefixed styles like `transform`. + testProp: function (props) { + + var style = document.documentElement.style; + + for (var i = 0; i < props.length; i++) { + if (props[i] in style) { + return props[i]; + } + } + return false; + }, + + // @function setTransform(el: HTMLElement, offset: Point, scale?: Number) + // Resets the 3D CSS transform of `el` so it is translated by `offset` pixels + // and optionally scaled by `scale`. Does not have an effect if the + // browser doesn't support 3D CSS transforms. + setTransform: function (el, offset, scale) { + var pos = offset || new L.Point(0, 0); + + el.style[L.DomUtil.TRANSFORM] = + (L.Browser.ie3d ? + 'translate(' + pos.x + 'px,' + pos.y + 'px)' : + 'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') + + (scale ? ' scale(' + scale + ')' : ''); + }, + + // @function setPosition(el: HTMLElement, position: Point) + // Sets the position of `el` to coordinates specified by `position`, + // using CSS translate or top/left positioning depending on the browser + // (used by Leaflet internally to position its layers). + setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) + + /*eslint-disable */ + el._leaflet_pos = point; + /*eslint-enable */ + + if (L.Browser.any3d) { + L.DomUtil.setTransform(el, point); + } else { + el.style.left = point.x + 'px'; + el.style.top = point.y + 'px'; + } + }, + + // @function getPosition(el: HTMLElement): Point + // Returns the coordinates of an element previously positioned with setPosition. + getPosition: function (el) { + // this method is only used for elements previously positioned using setPosition, + // so it's safe to cache the position for performance + + return el._leaflet_pos || new L.Point(0, 0); + } +}; + + +(function () { + // prefix style property names + + // @property TRANSFORM: String + // Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit). + L.DomUtil.TRANSFORM = L.DomUtil.testProp( + ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + + + // webkitTransition comes first because some browser versions that drop vendor prefix don't do + // the same for the transitionend event, in particular the Android 4.1 stock browser + + // @property TRANSITION: String + // Vendor-prefixed transform style name. + var transition = L.DomUtil.TRANSITION = L.DomUtil.testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + + L.DomUtil.TRANSITION_END = + transition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend'; + + // @function disableTextSelection() + // Prevents the user from generating `selectstart` DOM events, usually generated + // when the user drags the mouse through a page with text. Used internally + // by Leaflet to override the behaviour of any click-and-drag interaction on + // the map. Affects drag interactions on the whole document. + + // @function enableTextSelection() + // Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection). + if ('onselectstart' in document) { + L.DomUtil.disableTextSelection = function () { + L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); + }; + L.DomUtil.enableTextSelection = function () { + L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); + }; + + } else { + var userSelectProperty = L.DomUtil.testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + L.DomUtil.disableTextSelection = function () { + if (userSelectProperty) { + var style = document.documentElement.style; + this._userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }; + L.DomUtil.enableTextSelection = function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = this._userSelect; + delete this._userSelect; + } + }; + } + + // @function disableImageDrag() + // As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but + // for `dragstart` DOM events, usually generated when the user drags an image. + L.DomUtil.disableImageDrag = function () { + L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); + }; + + // @function enableImageDrag() + // Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection). + L.DomUtil.enableImageDrag = function () { + L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); + }; + + // @function preventOutline(el: HTMLElement) + // Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline) + // of the element `el` invisible. Used internally by Leaflet to prevent + // focusable elements from displaying an outline when the user performs a + // drag interaction on them. + L.DomUtil.preventOutline = function (element) { + while (element.tabIndex === -1) { + element = element.parentNode; + } + if (!element || !element.style) { return; } + L.DomUtil.restoreOutline(); + this._outlineElement = element; + this._outlineStyle = element.style.outline; + element.style.outline = 'none'; + L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this); + }; + + // @function restoreOutline() + // Cancels the effects of a previous [`L.DomUtil.preventOutline`](). + L.DomUtil.restoreOutline = function () { + if (!this._outlineElement) { return; } + this._outlineElement.style.outline = this._outlineStyle; + delete this._outlineElement; + delete this._outlineStyle; + L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this); + }; +})(); + + + +/* @class LatLng + * @aka L.LatLng + * + * Represents a geographical point with a certain latitude and longitude. + * + * @example + * + * ``` + * var latlng = L.latLng(50.5, 30.5); + * ``` + * + * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent: + * + * ``` + * map.panTo([50, 30]); + * map.panTo({lon: 30, lat: 50}); + * map.panTo({lat: 50, lng: 30}); + * map.panTo(L.latLng(50, 30)); + * ``` + */ + +L.LatLng = function (lat, lng, alt) { + if (isNaN(lat) || isNaN(lng)) { + throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); + } + + // @property lat: Number + // Latitude in degrees + this.lat = +lat; + + // @property lng: Number + // Longitude in degrees + this.lng = +lng; + + // @property alt: Number + // Altitude in meters (optional) + if (alt !== undefined) { + this.alt = +alt; + } +}; + +L.LatLng.prototype = { + // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean + // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number. + equals: function (obj, maxMargin) { + if (!obj) { return false; } + + obj = L.latLng(obj); + + var margin = Math.max( + Math.abs(this.lat - obj.lat), + Math.abs(this.lng - obj.lng)); + + return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); + }, + + // @method toString(): String + // Returns a string representation of the point (for debugging purposes). + toString: function (precision) { + return 'LatLng(' + + L.Util.formatNum(this.lat, precision) + ', ' + + L.Util.formatNum(this.lng, precision) + ')'; + }, + + // @method distanceTo(otherLatLng: LatLng): Number + // Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula). + distanceTo: function (other) { + return L.CRS.Earth.distance(this, L.latLng(other)); + }, + + // @method wrap(): LatLng + // Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees. + wrap: function () { + return L.CRS.Earth.wrapLatLng(this); + }, + + // @method toBounds(sizeInMeters: Number): LatLngBounds + // Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`. + toBounds: function (sizeInMeters) { + var latAccuracy = 180 * sizeInMeters / 40075017, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); + + return L.latLngBounds( + [this.lat - latAccuracy, this.lng - lngAccuracy], + [this.lat + latAccuracy, this.lng + lngAccuracy]); + }, + + clone: function () { + return new L.LatLng(this.lat, this.lng, this.alt); + } +}; + + + +// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng +// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). + +// @alternative +// @factory L.latLng(coords: Array): LatLng +// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead. + +// @alternative +// @factory L.latLng(coords: Object): LatLng +// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead. + +L.latLng = function (a, b, c) { + if (a instanceof L.LatLng) { + return a; + } + if (L.Util.isArray(a) && typeof a[0] !== 'object') { + if (a.length === 3) { + return new L.LatLng(a[0], a[1], a[2]); + } + if (a.length === 2) { + return new L.LatLng(a[0], a[1]); + } + return null; + } + if (a === undefined || a === null) { + return a; + } + if (typeof a === 'object' && 'lat' in a) { + return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); + } + if (b === undefined) { + return null; + } + return new L.LatLng(a, b, c); +}; + + + +/* + * @class LatLngBounds + * @aka L.LatLngBounds + * + * Represents a rectangular geographical area on a map. + * + * @example + * + * ```js + * var corner1 = L.latLng(40.712, -74.227), + * corner2 = L.latLng(40.774, -74.125), + * bounds = L.latLngBounds(corner1, corner2); + * ``` + * + * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * map.fitBounds([ + * [40.712, -74.227], + * [40.774, -74.125] + * ]); + * ``` + * + * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. + */ + +L.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[]) + if (!corner1) { return; } + + var latlngs = corner2 ? [corner1, corner2] : corner1; + + for (var i = 0, len = latlngs.length; i < len; i++) { + this.extend(latlngs[i]); + } +}; + +L.LatLngBounds.prototype = { + + // @method extend(latlng: LatLng): this + // Extend the bounds to contain the given point + + // @alternative + // @method extend(otherBounds: LatLngBounds): this + // Extend the bounds to contain the given bounds + extend: function (obj) { + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof L.LatLng) { + sw2 = obj; + ne2 = obj; + + } else if (obj instanceof L.LatLngBounds) { + sw2 = obj._southWest; + ne2 = obj._northEast; + + if (!sw2 || !ne2) { return this; } + + } else { + return obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this; + } + + if (!sw && !ne) { + this._southWest = new L.LatLng(sw2.lat, sw2.lng); + this._northEast = new L.LatLng(ne2.lat, ne2.lng); + } else { + sw.lat = Math.min(sw2.lat, sw.lat); + sw.lng = Math.min(sw2.lng, sw.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + } + + return this; + }, + + // @method pad(bufferRatio: Number): LatLngBounds + // Returns bigger bounds created by extending the current bounds by a given percentage in each direction. + pad: function (bufferRatio) { + var sw = this._southWest, + ne = this._northEast, + heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, + widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; + + return new L.LatLngBounds( + new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), + new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); + }, + + // @method getCenter(): LatLng + // Returns the center point of the bounds. + getCenter: function () { + return new L.LatLng( + (this._southWest.lat + this._northEast.lat) / 2, + (this._southWest.lng + this._northEast.lng) / 2); + }, + + // @method getSouthWest(): LatLng + // Returns the south-west point of the bounds. + getSouthWest: function () { + return this._southWest; + }, + + // @method getNorthEast(): LatLng + // Returns the north-east point of the bounds. + getNorthEast: function () { + return this._northEast; + }, + + // @method getNorthWest(): LatLng + // Returns the north-west point of the bounds. + getNorthWest: function () { + return new L.LatLng(this.getNorth(), this.getWest()); + }, + + // @method getSouthEast(): LatLng + // Returns the south-east point of the bounds. + getSouthEast: function () { + return new L.LatLng(this.getSouth(), this.getEast()); + }, + + // @method getWest(): Number + // Returns the west longitude of the bounds + getWest: function () { + return this._southWest.lng; + }, + + // @method getSouth(): Number + // Returns the south latitude of the bounds + getSouth: function () { + return this._southWest.lat; + }, + + // @method getEast(): Number + // Returns the east longitude of the bounds + getEast: function () { + return this._northEast.lng; + }, + + // @method getNorth(): Number + // Returns the north latitude of the bounds + getNorth: function () { + return this._northEast.lat; + }, + + // @method contains(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle contains the given one. + + // @alternative + // @method contains (latlng: LatLng): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean + if (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) { + obj = L.latLng(obj); + } else { + obj = L.latLngBounds(obj); + } + + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof L.LatLngBounds) { + sw2 = obj.getSouthWest(); + ne2 = obj.getNorthEast(); + } else { + sw2 = ne2 = obj; + } + + return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && + (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); + }, + + // @method intersects(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + intersects: function (bounds) { + bounds = L.latLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), + lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); + + return latIntersects && lngIntersects; + }, + + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. + overlaps: function (bounds) { + bounds = L.latLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), + lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); + + return latOverlaps && lngOverlaps; + }, + + // @method toBBoxString(): String + // Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + toBBoxString: function () { + return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); + }, + + // @method equals(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. + equals: function (bounds) { + if (!bounds) { return false; } + + bounds = L.latLngBounds(bounds); + + return this._southWest.equals(bounds.getSouthWest()) && + this._northEast.equals(bounds.getNorthEast()); + }, + + // @method isValid(): Boolean + // Returns `true` if the bounds are properly initialized. + isValid: function () { + return !!(this._southWest && this._northEast); + } +}; + +// TODO International date line? + +// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng) +// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle. + +// @alternative +// @factory L.latLngBounds(latlngs: LatLng[]) +// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds). +L.latLngBounds = function (a, b) { + if (a instanceof L.LatLngBounds) { + return a; + } + return new L.LatLngBounds(a, b); +}; + + + +/* + * @namespace Projection + * @section + * Leaflet comes with a set of already defined Projections out of the box: + * + * @projection L.Projection.LonLat + * + * Equirectangular, or Plate Carree projection — the most simple projection, + * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as + * latitude. Also suitable for flat worlds, e.g. game maps. Used by the + * `EPSG:3395` and `Simple` CRS. + */ + +L.Projection = {}; + +L.Projection.LonLat = { + project: function (latlng) { + return new L.Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new L.LatLng(point.y, point.x); + }, + + bounds: L.bounds([-180, -90], [180, 90]) +}; + + + +/* + * @namespace Projection + * @projection L.Projection.SphericalMercator + * + * Spherical Mercator projection — the most common projection for online maps, + * used by almost all free and commercial tile providers. Assumes that Earth is + * a sphere. Used by the `EPSG:3857` CRS. + */ + +L.Projection.SphericalMercator = { + + R: 6378137, + MAX_LATITUDE: 85.0511287798, + + project: function (latlng) { + var d = Math.PI / 180, + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + sin = Math.sin(lat * d); + + return new L.Point( + this.R * latlng.lng * d, + this.R * Math.log((1 + sin) / (1 - sin)) / 2); + }, + + unproject: function (point) { + var d = 180 / Math.PI; + + return new L.LatLng( + (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d, + point.x * d / this.R); + }, + + bounds: (function () { + var d = 6378137 * Math.PI; + return L.bounds([-d, -d], [d, d]); + })() +}; + + + +/* + * @class CRS + * @aka L.CRS + * Abstract class that defines coordinate reference systems for projecting + * geographical points into pixel (screen) coordinates and back (and to + * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See + * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system). + * + * Leaflet defines the most usual CRSs by default. If you want to use a + * CRS not defined by default, take a look at the + * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. + */ + +L.CRS = { + // @method latLngToPoint(latlng: LatLng, zoom: Number): Point + // Projects geographical coordinates into pixel coordinates for a given zoom. + latLngToPoint: function (latlng, zoom) { + var projectedPoint = this.projection.project(latlng), + scale = this.scale(zoom); + + return this.transformation._transform(projectedPoint, scale); + }, + + // @method pointToLatLng(point: Point, zoom: Number): LatLng + // The inverse of `latLngToPoint`. Projects pixel coordinates on a given + // zoom into geographical coordinates. + pointToLatLng: function (point, zoom) { + var scale = this.scale(zoom), + untransformedPoint = this.transformation.untransform(point, scale); + + return this.projection.unproject(untransformedPoint); + }, + + // @method project(latlng: LatLng): Point + // Projects geographical coordinates into coordinates in units accepted for + // this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). + project: function (latlng) { + return this.projection.project(latlng); + }, + + // @method unproject(point: Point): LatLng + // Given a projected coordinate returns the corresponding LatLng. + // The inverse of `project`. + unproject: function (point) { + return this.projection.unproject(point); + }, + + // @method scale(zoom: Number): Number + // Returns the scale used when transforming projected coordinates into + // pixel coordinates for a particular zoom. For example, it returns + // `256 * 2^zoom` for Mercator-based CRS. + scale: function (zoom) { + return 256 * Math.pow(2, zoom); + }, + + // @method zoom(scale: Number): Number + // Inverse of `scale()`, returns the zoom level corresponding to a scale + // factor of `scale`. + zoom: function (scale) { + return Math.log(scale / 256) / Math.LN2; + }, + + // @method getProjectedBounds(zoom: Number): Bounds + // Returns the projection's bounds scaled and transformed for the provided `zoom`. + getProjectedBounds: function (zoom) { + if (this.infinite) { return null; } + + var b = this.projection.bounds, + s = this.scale(zoom), + min = this.transformation.transform(b.min, s), + max = this.transformation.transform(b.max, s); + + return L.bounds(min, max); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates. + + // @property code: String + // Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`) + // + // @property wrapLng: Number[] + // An array of two numbers defining whether the longitude (horizontal) coordinate + // axis wraps around a given range and how. Defaults to `[-180, 180]` in most + // geographical CRSs. If `undefined`, the longitude axis does not wrap around. + // + // @property wrapLat: Number[] + // Like `wrapLng`, but for the latitude (vertical) axis. + + // wrapLng: [min, max], + // wrapLat: [min, max], + + // @property infinite: Boolean + // If true, the coordinate space will be unbounded (infinite in both axes) + infinite: false, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where lat and lng has been wrapped according to the + // CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds. + // Only accepts actual `L.LatLng` instances, not arrays. + wrapLatLng: function (latlng) { + var lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, + lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, + alt = latlng.alt; + + return L.latLng(lat, lng, alt); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring + // that its center is within the CRS's bounds. + // Only accepts actual `L.LatLngBounds` instances, not arrays. + wrapLatLngBounds: function (bounds) { + var center = bounds.getCenter(), + newCenter = this.wrapLatLng(center), + latShift = center.lat - newCenter.lat, + lngShift = center.lng - newCenter.lng; + + if (latShift === 0 && lngShift === 0) { + return bounds; + } + + var sw = bounds.getSouthWest(), + ne = bounds.getNorthEast(), + newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}), + newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift}); + + return new L.LatLngBounds(newSw, newNe); + } +}; + + + +/* + * @namespace CRS + * @crs L.CRS.Simple + * + * A simple CRS that maps longitude and latitude into `x` and `y` directly. + * May be used for maps of flat surfaces (e.g. game maps). Note that the `y` + * axis should still be inverted (going from bottom to top). `distance()` returns + * simple euclidean distance. + */ + +L.CRS.Simple = L.extend({}, L.CRS, { + projection: L.Projection.LonLat, + transformation: new L.Transformation(1, 0, -1, 0), + + scale: function (zoom) { + return Math.pow(2, zoom); + }, + + zoom: function (scale) { + return Math.log(scale) / Math.LN2; + }, + + distance: function (latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + + return Math.sqrt(dx * dx + dy * dy); + }, + + infinite: true +}); + + + +/* + * @namespace CRS + * @crs L.CRS.Earth + * + * Serves as the base for CRS that are global such that they cover the earth. + * Can only be used as the base for other CRS and cannot be used directly, + * since it does not have a `code`, `projection` or `transformation`. `distance()` returns + * meters. + */ + +L.CRS.Earth = L.extend({}, L.CRS, { + wrapLng: [-180, 180], + + // Mean Earth Radius, as recommended for use by + // the International Union of Geodesy and Geophysics, + // see http://rosettacode.org/wiki/Haversine_formula + R: 6371000, + + // distance between two geographical points using spherical law of cosines approximation + distance: function (latlng1, latlng2) { + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + a = Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); + + return this.R * Math.acos(Math.min(a, 1)); + } +}); + + + +/* + * @namespace CRS + * @crs L.CRS.EPSG3857 + * + * The most common CRS for online maps, used by almost all free and commercial + * tile providers. Uses Spherical Mercator projection. Set in by default in + * Map's `crs` option. + */ + +L.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, { + code: 'EPSG:3857', + projection: L.Projection.SphericalMercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R); + return new L.Transformation(scale, 0.5, -scale, 0.5); + }()) +}); + +L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { + code: 'EPSG:900913' +}); + + + +/* + * @namespace CRS + * @crs L.CRS.EPSG4326 + * + * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. + * + * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic), + * which is a breaking change from 0.7.x behaviour. If you are using a `TileLayer` + * with this CRS, ensure that there are two 256x256 pixel tiles covering the + * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), + * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set. + */ + +L.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, { + code: 'EPSG:4326', + projection: L.Projection.LonLat, + transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5) +}); + + + +/* + * @class Map + * @aka L.Map + * @inherits Evented + * + * The central class of the API — it is used to create a map on a page and manipulate it. + * + * @example + * + * ```js + * // initialize the map on the "map" div with a given center and zoom + * var map = L.map('map', { + * center: [51.505, -0.09], + * zoom: 13 + * }); + * ``` + * + */ + +L.Map = L.Evented.extend({ + + options: { + // @section Map State Options + // @option crs: CRS = L.CRS.EPSG3857 + // The [Coordinate Reference System](#crs) to use. Don't change this if you're not + // sure what it means. + crs: L.CRS.EPSG3857, + + // @option center: LatLng = undefined + // Initial geographic center of the map + center: undefined, + + // @option zoom: Number = undefined + // Initial map zoom level + zoom: undefined, + + // @option minZoom: Number = undefined + // Minimum zoom level of the map. Overrides any `minZoom` option set on map layers. + minZoom: undefined, + + // @option maxZoom: Number = undefined + // Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers. + maxZoom: undefined, + + // @option layers: Layer[] = [] + // Array of layers that will be added to the map initially + layers: [], + + // @option maxBounds: LatLngBounds = null + // When this option is set, the map restricts the view to the given + // geographical bounds, bouncing the user back if the user tries to pan + // outside the view. To set the restriction dynamically, use + // [`setMaxBounds`](#map-setmaxbounds) method. + maxBounds: undefined, + + // @option renderer: Renderer = * + // The default method for drawing vector layers on the map. `L.SVG` + // or `L.Canvas` by default depending on browser support. + renderer: undefined, + + + // @section Animation Options + // @option zoomAnimation: Boolean = true + // Whether the map zoom animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + zoomAnimation: true, + + // @option zoomAnimationThreshold: Number = 4 + // Won't animate zoom if the zoom difference exceeds this value. + zoomAnimationThreshold: 4, + + // @option fadeAnimation: Boolean = true + // Whether the tile fade animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + fadeAnimation: true, + + // @option markerZoomAnimation: Boolean = true + // Whether markers animate their zoom with the zoom animation, if disabled + // they will disappear for the length of the animation. By default it's + // enabled in all browsers that support CSS3 Transitions except Android. + markerZoomAnimation: true, + + // @option transform3DLimit: Number = 2^23 + // Defines the maximum size of a CSS translation transform. The default + // value should not be changed unless a web browser positions layers in + // the wrong place after doing a large `panBy`. + transform3DLimit: 8388608, // Precision limit of a 32-bit float + + // @section Interaction Options + // @option zoomSnap: Number = 1 + // Forces the map's zoom level to always be a multiple of this, particularly + // right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom. + // By default, the zoom level snaps to the nearest integer; lower values + // (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0` + // means the zoom level will not be snapped after `fitBounds` or a pinch-zoom. + zoomSnap: 1, + + // @option zoomDelta: Number = 1 + // Controls how much the map's zoom level will change after a + // [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+` + // or `-` on the keyboard, or using the [zoom controls](#control-zoom). + // Values smaller than `1` (e.g. `0.5`) allow for greater granularity. + zoomDelta: 1, + + // @option trackResize: Boolean = true + // Whether the map automatically handles browser window resize to update itself. + trackResize: true + }, + + initialize: function (id, options) { // (HTMLElement or String, Object) + options = L.setOptions(this, options); + + this._initContainer(id); + this._initLayout(); + + // hack for https://github.com/Leaflet/Leaflet/issues/1980 + this._onResize = L.bind(this._onResize, this); + + this._initEvents(); + + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + + if (options.zoom !== undefined) { + this._zoom = this._limitZoom(options.zoom); + } + + if (options.center && options.zoom !== undefined) { + this.setView(L.latLng(options.center), options.zoom, {reset: true}); + } + + this._handlers = []; + this._layers = {}; + this._zoomBoundLayers = {}; + this._sizeChanged = true; + + this.callInitHooks(); + + // don't animate on browsers without hardware-accelerated transitions or old Android/Opera + this._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera && + this.options.zoomAnimation; + + // zoom transitions run with the same duration for all layers, so if one of transitionend events + // happens after starting zoom animation (propagating to the map pane), we know that it ended globally + if (this._zoomAnimated) { + this._createAnimProxy(); + L.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); + } + + this._addLayers(this.options.layers); + }, + + + // @section Methods for modifying map state + + // @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) with the given + // animation options. + setView: function (center, zoom, options) { + + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); + options = options || {}; + + this._stop(); + + if (this._loaded && !options.reset && options !== true) { + + if (options.animate !== undefined) { + options.zoom = L.extend({animate: options.animate}, options.zoom); + options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan); + } + + // try animating pan or zoom + var moved = (this._zoom !== zoom) ? + this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : + this._tryAnimatedPan(center, options.pan); + + if (moved) { + // prevent resize handler call, the view will refresh after animation anyway + clearTimeout(this._sizeTimer); + return this; + } + } + + // animation didn't start, just reset the map view + this._resetView(center, zoom); + + return this; + }, + + // @method setZoom(zoom: Number, options: Zoom/pan options): this + // Sets the zoom of the map. + setZoom: function (zoom, options) { + if (!this._loaded) { + this._zoom = zoom; + return this; + } + return this.setView(this.getCenter(), zoom, {zoom: options}); + }, + + // @method zoomIn(delta?: Number, options?: Zoom options): this + // Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomIn: function (delta, options) { + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom + delta, options); + }, + + // @method zoomOut(delta?: Number, options?: Zoom options): this + // Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomOut: function (delta, options) { + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom - delta, options); + }, + + // @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified geographical point on the map + // stationary (e.g. used internally for scroll zoom and double-click zoom). + // @alternative + // @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary. + setZoomAround: function (latlng, zoom, options) { + var scale = this.getZoomScale(zoom), + viewHalf = this.getSize().divideBy(2), + containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng), + + centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), + newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); + + return this.setView(newCenter, zoom, {zoom: options}); + }, + + _getBoundsCenterZoom: function (bounds, options) { + + options = options || {}; + bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); + + var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), + + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); + + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; + + var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + + swPoint = this.project(bounds.getSouthWest(), zoom), + nePoint = this.project(bounds.getNorthEast(), zoom), + center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); + + return { + center: center, + zoom: zoom + }; + }, + + // @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets a map view that contains the given geographical bounds with the + // maximum zoom level possible. + fitBounds: function (bounds, options) { + + bounds = L.latLngBounds(bounds); + + if (!bounds.isValid()) { + throw new Error('Bounds are not valid.'); + } + + var target = this._getBoundsCenterZoom(bounds, options); + return this.setView(target.center, target.zoom, options); + }, + + // @method fitWorld(options?: fitBounds options): this + // Sets a map view that mostly contains the whole world with the maximum + // zoom level possible. + fitWorld: function (options) { + return this.fitBounds([[-90, -180], [90, 180]], options); + }, + + // @method panTo(latlng: LatLng, options?: Pan options): this + // Pans the map to a given center. + panTo: function (center, options) { // (LatLng) + return this.setView(center, this._zoom, {pan: options}); + }, + + // @method panBy(offset: Point): this + // Pans the map by a given number of pixels (animated). + panBy: function (offset, options) { + offset = L.point(offset).round(); + options = options || {}; + + if (!offset.x && !offset.y) { + return this.fire('moveend'); + } + // If we pan too far, Chrome gets issues with tiles + // and makes them disappear or appear in the wrong place (slightly offset) #2602 + if (options.animate !== true && !this.getSize().contains(offset)) { + this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + return this; + } + + if (!this._panAnim) { + this._panAnim = new L.PosAnimation(); + + this._panAnim.on({ + 'step': this._onPanTransitionStep, + 'end': this._onPanTransitionEnd + }, this); + } + + // don't fire movestart if animating inertia + if (!options.noMoveStart) { + this.fire('movestart'); + } + + // animate pan unless animate: false specified + if (options.animate !== false) { + L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); + + var newPos = this._getMapPanePos().subtract(offset).round(); + this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); + } else { + this._rawPanBy(offset); + this.fire('move').fire('moveend'); + } + + return this; + }, + + // @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) performing a smooth + // pan-zoom animation. + flyTo: function (targetCenter, targetZoom, options) { + + options = options || {}; + if (options.animate === false || !L.Browser.any3d) { + return this.setView(targetCenter, targetZoom, options); + } + + this._stop(); + + var from = this.project(this.getCenter()), + to = this.project(targetCenter), + size = this.getSize(), + startZoom = this._zoom; + + targetCenter = L.latLng(targetCenter); + targetZoom = targetZoom === undefined ? startZoom : targetZoom; + + var w0 = Math.max(size.x, size.y), + w1 = w0 * this.getZoomScale(startZoom, targetZoom), + u1 = (to.distanceTo(from)) || 1, + rho = 1.42, + rho2 = rho * rho; + + function r(i) { + var s1 = i ? -1 : 1, + s2 = i ? w1 : w0, + t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1, + b1 = 2 * s2 * rho2 * u1, + b = t1 / b1, + sq = Math.sqrt(b * b + 1) - b; + + // workaround for floating point precision bug when sq = 0, log = -Infinite, + // thus triggering an infinite loop in flyTo + var log = sq < 0.000000001 ? -18 : Math.log(sq); + + return log; + } + + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + var r0 = r(0); + + function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } + function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } + + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } + + var start = Date.now(), + S = (r(1) - r0) / rho, + duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8; + + function frame() { + var t = (Date.now() - start) / duration, + s = easeOut(t) * S; + + if (t <= 1) { + this._flyToFrame = L.Util.requestAnimFrame(frame, this); + + this._move( + this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), + this.getScaleZoom(w0 / w(s), startZoom), + {flyTo: true}); + + } else { + this + ._move(targetCenter, targetZoom) + ._moveEnd(true); + } + } + + this._moveStart(true); + + frame.call(this); + return this; + }, + + // @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto), + // but takes a bounds parameter like [`fitBounds`](#map-fitbounds). + flyToBounds: function (bounds, options) { + var target = this._getBoundsCenterZoom(bounds, options); + return this.flyTo(target.center, target.zoom, options); + }, + + // @method setMaxBounds(bounds: Bounds): this + // Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option). + setMaxBounds: function (bounds) { + bounds = L.latLngBounds(bounds); + + if (!bounds.isValid()) { + this.options.maxBounds = null; + return this.off('moveend', this._panInsideMaxBounds); + } else if (this.options.maxBounds) { + this.off('moveend', this._panInsideMaxBounds); + } + + this.options.maxBounds = bounds; + + if (this._loaded) { + this._panInsideMaxBounds(); + } + + return this.on('moveend', this._panInsideMaxBounds); + }, + + // @method setMinZoom(zoom: Number): this + // Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option). + setMinZoom: function (zoom) { + this.options.minZoom = zoom; + + if (this._loaded && this.getZoom() < this.options.minZoom) { + return this.setZoom(zoom); + } + + return this; + }, + + // @method setMaxZoom(zoom: Number): this + // Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option). + setMaxZoom: function (zoom) { + this.options.maxZoom = zoom; + + if (this._loaded && (this.getZoom() > this.options.maxZoom)) { + return this.setZoom(zoom); + } + + return this; + }, + + // @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this + // Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. + panInsideBounds: function (bounds, options) { + this._enforcingBounds = true; + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); + + if (!center.equals(newCenter)) { + this.panTo(newCenter, options); + } + + this._enforcingBounds = false; + return this; + }, + + // @method invalidateSize(options: Zoom/Pan options): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. If `options.pan` is `false`, panning will not occur. + // If `options.debounceMoveend` is `true`, it will delay `moveend` event so + // that it doesn't happen often even if the method is called many + // times in a row. + + // @alternative + // @method invalidateSize(animate: Boolean): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. + invalidateSize: function (options) { + if (!this._loaded) { return this; } + + options = L.extend({ + animate: false, + pan: true + }, options === true ? {animate: true} : options); + + var oldSize = this.getSize(); + this._sizeChanged = true; + this._lastCenter = null; + + var newSize = this.getSize(), + oldCenter = oldSize.divideBy(2).round(), + newCenter = newSize.divideBy(2).round(), + offset = oldCenter.subtract(newCenter); + + if (!offset.x && !offset.y) { return this; } + + if (options.animate && options.pan) { + this.panBy(offset); + + } else { + if (options.pan) { + this._rawPanBy(offset); + } + + this.fire('move'); + + if (options.debounceMoveend) { + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + } else { + this.fire('moveend'); + } + } + + // @section Map state change events + // @event resize: ResizeEvent + // Fired when the map is resized. + return this.fire('resize', { + oldSize: oldSize, + newSize: newSize + }); + }, + + // @section Methods for modifying map state + // @method stop(): this + // Stops the currently running `panTo` or `flyTo` animation, if any. + stop: function () { + this.setZoom(this._limitZoom(this._zoom)); + if (!this.options.zoomSnap) { + this.fire('viewreset'); + } + return this._stop(); + }, + + // @section Geolocation methods + // @method locate(options?: Locate options): this + // Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound) + // event with location data on success or a [`locationerror`](#map-locationerror) event on failure, + // and optionally sets the map view to the user's location with respect to + // detection accuracy (or to the world view if geolocation failed). + // Note that, if your page doesn't use HTTPS, this method will fail in + // modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins)) + // See `Locate options` for more details. + locate: function (options) { + + options = this._locateOptions = L.extend({ + timeout: 10000, + watch: false + // setView: false + // maxZoom: + // maximumAge: 0 + // enableHighAccuracy: false + }, options); + + if (!('geolocation' in navigator)) { + this._handleGeolocationError({ + code: 0, + message: 'Geolocation not supported.' + }); + return this; + } + + var onResponse = L.bind(this._handleGeolocationResponse, this), + onError = L.bind(this._handleGeolocationError, this); + + if (options.watch) { + this._locationWatchId = + navigator.geolocation.watchPosition(onResponse, onError, options); + } else { + navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } + return this; + }, + + // @method stopLocate(): this + // Stops watching location previously initiated by `map.locate({watch: true})` + // and aborts resetting the map view if map.locate was called with + // `{setView: true}`. + stopLocate: function () { + if (navigator.geolocation && navigator.geolocation.clearWatch) { + navigator.geolocation.clearWatch(this._locationWatchId); + } + if (this._locateOptions) { + this._locateOptions.setView = false; + } + return this; + }, + + _handleGeolocationError: function (error) { + var c = error.code, + message = error.message || + (c === 1 ? 'permission denied' : + (c === 2 ? 'position unavailable' : 'timeout')); + + if (this._locateOptions.setView && !this._loaded) { + this.fitWorld(); + } + + // @section Location events + // @event locationerror: ErrorEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) failed. + this.fire('locationerror', { + code: c, + message: 'Geolocation error: ' + message + '.' + }); + }, + + _handleGeolocationResponse: function (pos) { + var lat = pos.coords.latitude, + lng = pos.coords.longitude, + latlng = new L.LatLng(lat, lng), + bounds = latlng.toBounds(pos.coords.accuracy), + options = this._locateOptions; + + if (options.setView) { + var zoom = this.getBoundsZoom(bounds); + this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom); + } + + var data = { + latlng: latlng, + bounds: bounds, + timestamp: pos.timestamp + }; + + for (var i in pos.coords) { + if (typeof pos.coords[i] === 'number') { + data[i] = pos.coords[i]; + } + } + + // @event locationfound: LocationEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) + // went successfully. + this.fire('locationfound', data); + }, + + // TODO handler.addTo + // TODO Appropiate docs section? + // @section Other Methods + // @method addHandler(name: String, HandlerClass: Function): this + // Adds a new `Handler` to the map, given its name and constructor function. + addHandler: function (name, HandlerClass) { + if (!HandlerClass) { return this; } + + var handler = this[name] = new HandlerClass(this); + + this._handlers.push(handler); + + if (this.options[name]) { + handler.enable(); + } + + return this; + }, + + // @method remove(): this + // Destroys the map and clears all related event listeners. + remove: function () { + + this._initEvents(true); + + if (this._containerId !== this._container._leaflet_id) { + throw new Error('Map container is being reused by another instance'); + } + + try { + // throws error in IE6-8 + delete this._container._leaflet_id; + delete this._containerId; + } catch (e) { + /*eslint-disable */ + this._container._leaflet_id = undefined; + /*eslint-enable */ + this._containerId = undefined; + } + + L.DomUtil.remove(this._mapPane); + + if (this._clearControlPos) { + this._clearControlPos(); + } + + this._clearHandlers(); + + if (this._loaded) { + // @section Map state change events + // @event unload: Event + // Fired when the map is destroyed with [remove](#map-remove) method. + this.fire('unload'); + } + + for (var i in this._layers) { + this._layers[i].remove(); + } + + return this; + }, + + // @section Other Methods + // @method createPane(name: String, container?: HTMLElement): HTMLElement + // Creates a new [map pane](#map-pane) with the given name if it doesn't exist already, + // then returns it. The pane is created as a children of `container`, or + // as a children of the main map pane if not set. + createPane: function (name, container) { + var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''), + pane = L.DomUtil.create('div', className, container || this._mapPane); + + if (name) { + this._panes[name] = pane; + } + return pane; + }, + + // @section Methods for Getting Map State + + // @method getCenter(): LatLng + // Returns the geographical center of the map view + getCenter: function () { + this._checkIfLoaded(); + + if (this._lastCenter && !this._moved()) { + return this._lastCenter; + } + return this.layerPointToLatLng(this._getCenterLayerPoint()); + }, + + // @method getZoom(): Number + // Returns the current zoom level of the map view + getZoom: function () { + return this._zoom; + }, + + // @method getBounds(): LatLngBounds + // Returns the geographical bounds visible in the current map view + getBounds: function () { + var bounds = this.getPixelBounds(), + sw = this.unproject(bounds.getBottomLeft()), + ne = this.unproject(bounds.getTopRight()); + + return new L.LatLngBounds(sw, ne); + }, + + // @method getMinZoom(): Number + // Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default. + getMinZoom: function () { + return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom; + }, + + // @method getMaxZoom(): Number + // Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers). + getMaxZoom: function () { + return this.options.maxZoom === undefined ? + (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : + this.options.maxZoom; + }, + + // @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number + // Returns the maximum zoom level on which the given bounds fit to the map + // view in its entirety. If `inside` (optional) is set to `true`, the method + // instead returns the minimum zoom level on which the map view fits into + // the given bounds in its entirety. + getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number + bounds = L.latLngBounds(bounds); + padding = L.point(padding || [0, 0]); + + var zoom = this.getZoom() || 0, + min = this.getMinZoom(), + max = this.getMaxZoom(), + nw = bounds.getNorthWest(), + se = bounds.getSouthEast(), + size = this.getSize().subtract(padding), + boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; + + var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y); + zoom = this.getScaleZoom(scale, zoom); + + if (snap) { + zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; + } + + return Math.max(min, Math.min(max, zoom)); + }, + + // @method getSize(): Point + // Returns the current size of the map container (in pixels). + getSize: function () { + if (!this._size || this._sizeChanged) { + this._size = new L.Point( + this._container.clientWidth || 0, + this._container.clientHeight || 0); + + this._sizeChanged = false; + } + return this._size.clone(); + }, + + // @method getPixelBounds(): Bounds + // Returns the bounds of the current map view in projected pixel + // coordinates (sometimes useful in layer and overlay implementations). + getPixelBounds: function (center, zoom) { + var topLeftPoint = this._getTopLeftPoint(center, zoom); + return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); + }, + + // TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to + // the map pane? "left point of the map layer" can be confusing, specially + // since there can be negative offsets. + // @method getPixelOrigin(): Point + // Returns the projected pixel coordinates of the top left point of + // the map layer (useful in custom layer and overlay implementations). + getPixelOrigin: function () { + this._checkIfLoaded(); + return this._pixelOrigin; + }, + + // @method getPixelWorldBounds(zoom?: Number): Bounds + // Returns the world's bounds in pixel coordinates for zoom level `zoom`. + // If `zoom` is omitted, the map's current zoom level is used. + getPixelWorldBounds: function (zoom) { + return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom); + }, + + // @section Other Methods + + // @method getPane(pane: String|HTMLElement): HTMLElement + // Returns a [map pane](#map-pane), given its name or its HTML element (its identity). + getPane: function (pane) { + return typeof pane === 'string' ? this._panes[pane] : pane; + }, + + // @method getPanes(): Object + // Returns a plain object containing the names of all [panes](#map-pane) as keys and + // the panes as values. + getPanes: function () { + return this._panes; + }, + + // @method getContainer: HTMLElement + // Returns the HTML element that contains the map. + getContainer: function () { + return this._container; + }, + + + // @section Conversion Methods + + // @method getZoomScale(toZoom: Number, fromZoom: Number): Number + // Returns the scale factor to be applied to a map transition from zoom level + // `fromZoom` to `toZoom`. Used internally to help with zoom animations. + getZoomScale: function (toZoom, fromZoom) { + // TODO replace with universal implementation after refactoring projections + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + return crs.scale(toZoom) / crs.scale(fromZoom); + }, + + // @method getScaleZoom(scale: Number, fromZoom: Number): Number + // Returns the zoom level that the map would end up at, if it is at `fromZoom` + // level and everything is scaled by a factor of `scale`. Inverse of + // [`getZoomScale`](#map-getZoomScale). + getScaleZoom: function (scale, fromZoom) { + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + var zoom = crs.zoom(scale * crs.scale(fromZoom)); + return isNaN(zoom) ? Infinity : zoom; + }, + + // @method project(latlng: LatLng, zoom: Number): Point + // Projects a geographical coordinate `LatLng` according to the projection + // of the map's CRS, then scales it according to `zoom` and the CRS's + // `Transformation`. The result is pixel coordinate relative to + // the CRS origin. + project: function (latlng, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); + }, + + // @method unproject(point: Point, zoom: Number): LatLng + // Inverse of [`project`](#map-project). + unproject: function (point, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.pointToLatLng(L.point(point), zoom); + }, + + // @method layerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding geographical coordinate (for the current zoom level). + layerPointToLatLng: function (point) { + var projectedPoint = L.point(point).add(this.getPixelOrigin()); + return this.unproject(projectedPoint); + }, + + // @method latLngToLayerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the [origin pixel](#map-getpixelorigin). + latLngToLayerPoint: function (latlng) { + var projectedPoint = this.project(L.latLng(latlng))._round(); + return projectedPoint._subtract(this.getPixelOrigin()); + }, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where `lat` and `lng` has been wrapped according to the + // map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the + // CRS's bounds. + // By default this means longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees. + wrapLatLng: function (latlng) { + return this.options.crs.wrapLatLng(L.latLng(latlng)); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring that + // its center is within the CRS's bounds. + // By default this means the center longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees, and the majority of the bounds + // overlaps the CRS's bounds. + wrapLatLngBounds: function (latlng) { + return this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng)); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates according to + // the map's CRS. By default this measures distance in meters. + distance: function (latlng1, latlng2) { + return this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2)); + }, + + // @method containerPointToLayerPoint(point: Point): Point + // Given a pixel coordinate relative to the map container, returns the corresponding + // pixel coordinate relative to the [origin pixel](#map-getpixelorigin). + containerPointToLayerPoint: function (point) { // (Point) + return L.point(point).subtract(this._getMapPanePos()); + }, + + // @method layerPointToContainerPoint(point: Point): Point + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding pixel coordinate relative to the map container. + layerPointToContainerPoint: function (point) { // (Point) + return L.point(point).add(this._getMapPanePos()); + }, + + // @method containerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the map container, returns + // the corresponding geographical coordinate (for the current zoom level). + containerPointToLatLng: function (point) { + var layerPoint = this.containerPointToLayerPoint(L.point(point)); + return this.layerPointToLatLng(layerPoint); + }, + + // @method latLngToContainerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the map container. + latLngToContainerPoint: function (latlng) { + return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); + }, + + // @method mouseEventToContainerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to the + // map container where the event took place. + mouseEventToContainerPoint: function (e) { + return L.DomEvent.getMousePosition(e, this._container); + }, + + // @method mouseEventToLayerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to + // the [origin pixel](#map-getpixelorigin) where the event took place. + mouseEventToLayerPoint: function (e) { + return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); + }, + + // @method mouseEventToLatLng(ev: MouseEvent): LatLng + // Given a MouseEvent object, returns geographical coordinate where the + // event took place. + mouseEventToLatLng: function (e) { // (MouseEvent) + return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); + }, + + + // map initialization methods + + _initContainer: function (id) { + var container = this._container = L.DomUtil.get(id); + + if (!container) { + throw new Error('Map container not found.'); + } else if (container._leaflet_id) { + throw new Error('Map container is already initialized.'); + } + + L.DomEvent.addListener(container, 'scroll', this._onScroll, this); + this._containerId = L.Util.stamp(container); + }, + + _initLayout: function () { + var container = this._container; + + this._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d; + + L.DomUtil.addClass(container, 'leaflet-container' + + (L.Browser.touch ? ' leaflet-touch' : '') + + (L.Browser.retina ? ' leaflet-retina' : '') + + (L.Browser.ielt9 ? ' leaflet-oldie' : '') + + (L.Browser.safari ? ' leaflet-safari' : '') + + (this._fadeAnimated ? ' leaflet-fade-anim' : '')); + + var position = L.DomUtil.getStyle(container, 'position'); + + if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { + container.style.position = 'relative'; + } + + this._initPanes(); + + if (this._initControlPos) { + this._initControlPos(); + } + }, + + _initPanes: function () { + var panes = this._panes = {}; + this._paneRenderers = {}; + + // @section + // + // Panes are DOM elements used to control the ordering of layers on the map. You + // can access panes with [`map.getPane`](#map-getpane) or + // [`map.getPanes`](#map-getpanes) methods. New panes can be created with the + // [`map.createPane`](#map-createpane) method. + // + // Every map has the following default panes that differ only in zIndex. + // + // @pane mapPane: HTMLElement = 'auto' + // Pane that contains all other map panes + + this._mapPane = this.createPane('mapPane', this._container); + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); + + // @pane tilePane: HTMLElement = 200 + // Pane for `GridLayer`s and `TileLayer`s + this.createPane('tilePane'); + // @pane overlayPane: HTMLElement = 400 + // Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s + this.createPane('shadowPane'); + // @pane shadowPane: HTMLElement = 500 + // Pane for overlay shadows (e.g. `Marker` shadows) + this.createPane('overlayPane'); + // @pane markerPane: HTMLElement = 600 + // Pane for `Icon`s of `Marker`s + this.createPane('markerPane'); + // @pane tooltipPane: HTMLElement = 650 + // Pane for tooltip. + this.createPane('tooltipPane'); + // @pane popupPane: HTMLElement = 700 + // Pane for `Popup`s. + this.createPane('popupPane'); + + if (!this.options.markerZoomAnimation) { + L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide'); + L.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide'); + } + }, + + + // private methods that modify map state + + // @section Map state change events + _resetView: function (center, zoom) { + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); + + var loading = !this._loaded; + this._loaded = true; + zoom = this._limitZoom(zoom); + + this.fire('viewprereset'); + + var zoomChanged = this._zoom !== zoom; + this + ._moveStart(zoomChanged) + ._move(center, zoom) + ._moveEnd(zoomChanged); + + // @event viewreset: Event + // Fired when the map needs to redraw its content (this usually happens + // on map zoom or load). Very useful for creating custom overlays. + this.fire('viewreset'); + + // @event load: Event + // Fired when the map is initialized (when its center and zoom are set + // for the first time). + if (loading) { + this.fire('load'); + } + }, + + _moveStart: function (zoomChanged) { + // @event zoomstart: Event + // Fired when the map zoom is about to change (e.g. before zoom animation). + // @event movestart: Event + // Fired when the view of the map starts changing (e.g. user starts dragging the map). + if (zoomChanged) { + this.fire('zoomstart'); + } + return this.fire('movestart'); + }, + + _move: function (center, zoom, data) { + if (zoom === undefined) { + zoom = this._zoom; + } + var zoomChanged = this._zoom !== zoom; + + this._zoom = zoom; + this._lastCenter = center; + this._pixelOrigin = this._getNewPixelOrigin(center); + + // @event zoom: Event + // Fired repeatedly during any change in zoom level, including zoom + // and fly animations. + if (zoomChanged || (data && data.pinch)) { // Always fire 'zoom' if pinching because #3530 + this.fire('zoom', data); + } + + // @event move: Event + // Fired repeatedly during any movement of the map, including pan and + // fly animations. + return this.fire('move', data); + }, + + _moveEnd: function (zoomChanged) { + // @event zoomend: Event + // Fired when the map has changed, after any animations. + if (zoomChanged) { + this.fire('zoomend'); + } + + // @event moveend: Event + // Fired when the center of the map stops changing (e.g. user stopped + // dragging the map). + return this.fire('moveend'); + }, + + _stop: function () { + L.Util.cancelAnimFrame(this._flyToFrame); + if (this._panAnim) { + this._panAnim.stop(); + } + return this; + }, + + _rawPanBy: function (offset) { + L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); + }, + + _getZoomSpan: function () { + return this.getMaxZoom() - this.getMinZoom(); + }, + + _panInsideMaxBounds: function () { + if (!this._enforcingBounds) { + this.panInsideBounds(this.options.maxBounds); + } + }, + + _checkIfLoaded: function () { + if (!this._loaded) { + throw new Error('Set map center and zoom first.'); + } + }, + + // DOM event handling + + // @section Interaction events + _initEvents: function (remove) { + if (!L.DomEvent) { return; } + + this._targets = {}; + this._targets[L.stamp(this._container)] = this; + + var onOff = remove ? 'off' : 'on'; + + // @event click: MouseEvent + // Fired when the user clicks (or taps) the map. + // @event dblclick: MouseEvent + // Fired when the user double-clicks (or double-taps) the map. + // @event mousedown: MouseEvent + // Fired when the user pushes the mouse button on the map. + // @event mouseup: MouseEvent + // Fired when the user releases the mouse button on the map. + // @event mouseover: MouseEvent + // Fired when the mouse enters the map. + // @event mouseout: MouseEvent + // Fired when the mouse leaves the map. + // @event mousemove: MouseEvent + // Fired while the mouse moves over the map. + // @event contextmenu: MouseEvent + // Fired when the user pushes the right mouse button on the map, prevents + // default browser context menu from showing if there are listeners on + // this event. Also fired on mobile when the user holds a single touch + // for a second (also called long press). + // @event keypress: KeyboardEvent + // Fired when the user presses a key from the keyboard while the map is focused. + L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this); + + if (this.options.trackResize) { + L.DomEvent[onOff](window, 'resize', this._onResize, this); + } + + if (L.Browser.any3d && this.options.transform3DLimit) { + this[onOff]('moveend', this._onMoveEnd); + } + }, + + _onResize: function () { + L.Util.cancelAnimFrame(this._resizeRequest); + this._resizeRequest = L.Util.requestAnimFrame( + function () { this.invalidateSize({debounceMoveend: true}); }, this); + }, + + _onScroll: function () { + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + }, + + _onMoveEnd: function () { + var pos = this._getMapPanePos(); + if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have + // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + this._resetView(this.getCenter(), this.getZoom()); + } + }, + + _findEventTargets: function (e, type) { + var targets = [], + target, + isHover = type === 'mouseout' || type === 'mouseover', + src = e.target || e.srcElement, + dragging = false; + + while (src) { + target = this._targets[L.stamp(src)]; + if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + // Prevent firing click after you just dragged an object. + dragging = true; + break; + } + if (target && target.listens(type, true)) { + if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; } + targets.push(target); + if (isHover) { break; } + } + if (src === this._container) { break; } + src = src.parentNode; + } + if (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) { + targets = [this]; + } + return targets; + }, + + _handleDOMEvent: function (e) { + if (!this._loaded || L.DomEvent._skipped(e)) { return; } + + var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; + + if (type === 'mousedown') { + // prevents outline when clicking on keyboard-focusable element + L.DomUtil.preventOutline(e.target || e.srcElement); + } + + this._fireDOMEvent(e, type); + }, + + _fireDOMEvent: function (e, type, targets) { + + if (e.type === 'click') { + // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). + // @event preclick: MouseEvent + // Fired before mouse click on the map (sometimes useful when you + // want something to happen on click before any existing click + // handlers start running). + var synth = L.Util.extend({}, e); + synth.type = 'preclick'; + this._fireDOMEvent(synth, synth.type, targets); + } + + if (e._stopped) { return; } + + // Find the layer the event is propagating from and its parents. + targets = (targets || []).concat(this._findEventTargets(e, type)); + + if (!targets.length) { return; } + + var target = targets[0]; + if (type === 'contextmenu' && target.listens(type, true)) { + L.DomEvent.preventDefault(e); + } + + var data = { + originalEvent: e + }; + + if (e.type !== 'keypress') { + var isMarker = target instanceof L.Marker; + data.containerPoint = isMarker ? + this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint); + } + + for (var i = 0; i < targets.length; i++) { + targets[i].fire(type, data, true); + if (data.originalEvent._stopped || + (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; } + } + }, + + _draggableMoved: function (obj) { + obj = obj.dragging && obj.dragging.enabled() ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); + }, + + _clearHandlers: function () { + for (var i = 0, len = this._handlers.length; i < len; i++) { + this._handlers[i].disable(); + } + }, + + // @section Other Methods + + // @method whenReady(fn: Function, context?: Object): this + // Runs the given function `fn` when the map gets initialized with + // a view (center and zoom) and at least one layer, or immediately + // if it's already initialized, optionally passing a function context. + whenReady: function (callback, context) { + if (this._loaded) { + callback.call(context || this, {target: this}); + } else { + this.on('load', callback, context); + } + return this; + }, + + + // private methods for getting map state + + _getMapPanePos: function () { + return L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0); + }, + + _moved: function () { + var pos = this._getMapPanePos(); + return pos && !pos.equals([0, 0]); + }, + + _getTopLeftPoint: function (center, zoom) { + var pixelOrigin = center && zoom !== undefined ? + this._getNewPixelOrigin(center, zoom) : + this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); + }, + + _getNewPixelOrigin: function (center, zoom) { + var viewHalf = this.getSize()._divideBy(2); + return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); + }, + + _latLngToNewLayerPoint: function (latlng, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return this.project(latlng, zoom)._subtract(topLeft); + }, + + _latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return L.bounds([ + this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft) + ]); + }, + + // layer point of the current center + _getCenterLayerPoint: function () { + return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); + }, + + // offset of the specified place to the current center in pixels + _getCenterOffset: function (latlng) { + return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); + }, + + // adjust center for view to get inside bounds + _limitCenter: function (center, zoom, bounds) { + + if (!bounds) { return center; } + + var centerPoint = this.project(center, zoom), + viewHalf = this.getSize().divideBy(2), + viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), + offset = this._getBoundsOffset(viewBounds, bounds, zoom); + + // If offset is less than a pixel, ignore. + // This prevents unstable projections from getting into + // an infinite loop of tiny offsets. + if (offset.round().equals([0, 0])) { + return center; + } + + return this.unproject(centerPoint.add(offset), zoom); + }, + + // adjust offset for view to get inside bounds + _limitOffset: function (offset, bounds) { + if (!bounds) { return offset; } + + var viewBounds = this.getPixelBounds(), + newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); + + return offset.add(this._getBoundsOffset(newBounds, bounds)); + }, + + // returns offset needed for pxBounds to get inside maxBounds at a specified zoom + _getBoundsOffset: function (pxBounds, maxBounds, zoom) { + var projectedMaxBounds = L.bounds( + this.project(maxBounds.getNorthEast(), zoom), + this.project(maxBounds.getSouthWest(), zoom) + ), + minOffset = projectedMaxBounds.min.subtract(pxBounds.min), + maxOffset = projectedMaxBounds.max.subtract(pxBounds.max), + + dx = this._rebound(minOffset.x, -maxOffset.x), + dy = this._rebound(minOffset.y, -maxOffset.y); + + return new L.Point(dx, dy); + }, + + _rebound: function (left, right) { + return left + right > 0 ? + Math.round(left - right) / 2 : + Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); + }, + + _limitZoom: function (zoom) { + var min = this.getMinZoom(), + max = this.getMaxZoom(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; + if (snap) { + zoom = Math.round(zoom / snap) * snap; + } + return Math.max(min, Math.min(max, zoom)); + }, + + _onPanTransitionStep: function () { + this.fire('move'); + }, + + _onPanTransitionEnd: function () { + L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); + this.fire('moveend'); + }, + + _tryAnimatedPan: function (center, options) { + // difference between the new and current centers in pixels + var offset = this._getCenterOffset(center)._floor(); + + // don't animate too far unless animate: true specified in options + if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + + this.panBy(offset, options); + + return true; + }, + + _createAnimProxy: function () { + + var proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated'); + this._panes.mapPane.appendChild(proxy); + + this.on('zoomanim', function (e) { + var prop = L.DomUtil.TRANSFORM, + transform = proxy.style[prop]; + + L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); + + // workaround for case when transform is the same and so transitionend event is not fired + if (transform === proxy.style[prop] && this._animatingZoom) { + this._onZoomTransitionEnd(); + } + }, this); + + this.on('load moveend', function () { + var c = this.getCenter(), + z = this.getZoom(); + L.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1)); + }, this); + }, + + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { + this._onZoomTransitionEnd(); + } + }, + + _nothingToAnimate: function () { + return !this._container.getElementsByClassName('leaflet-zoom-animated').length; + }, + + _tryAnimatedZoom: function (center, zoom, options) { + + if (this._animatingZoom) { return true; } + + options = options || {}; + + // don't animate if disabled, not supported or zoom difference is too large + if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || + Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } + + // offset is the pixel coords of the zoom origin relative to the current center + var scale = this.getZoomScale(zoom), + offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale); + + // don't animate if the zoom origin isn't within one screen from the current center, unless forced + if (options.animate !== true && !this.getSize().contains(offset)) { return false; } + + L.Util.requestAnimFrame(function () { + this + ._moveStart(true) + ._animateZoom(center, zoom, true); + }, this); + + return true; + }, + + _animateZoom: function (center, zoom, startAnim, noUpdate) { + if (startAnim) { + this._animatingZoom = true; + + // remember what center/zoom to set after animation + this._animateToCenter = center; + this._animateToZoom = zoom; + + L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); + } + + // @event zoomanim: ZoomAnimEvent + // Fired on every frame of a zoom animation + this.fire('zoomanim', { + center: center, + zoom: zoom, + noUpdate: noUpdate + }); + + // Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693 + setTimeout(L.bind(this._onZoomTransitionEnd, this), 250); + }, + + _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } + + L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); + + this._animatingZoom = false; + + this._move(this._animateToCenter, this._animateToZoom); + + // This anim frame should prevent an obscure iOS webkit tile loading race condition. + L.Util.requestAnimFrame(function () { + this._moveEnd(true); + }, this); + } +}); + +// @section + +// @factory L.map(id: String, options?: Map options) +// Instantiates a map object given the DOM ID of a `
` element +// and optionally an object literal with `Map options`. +// +// @alternative +// @factory L.map(el: HTMLElement, options?: Map options) +// Instantiates a map object given an instance of a `
` HTML element +// and optionally an object literal with `Map options`. +L.map = function (id, options) { + return new L.Map(id, options); +}; + + + + +/* + * @class Layer + * @inherits Evented + * @aka L.Layer + * @aka ILayer + * + * A set of methods from the Layer base class that all Leaflet layers use. + * Inherits all methods, options and events from `L.Evented`. + * + * @example + * + * ```js + * var layer = L.Marker(latlng).addTo(map); + * layer.addTo(map); + * layer.remove(); + * ``` + * + * @event add: Event + * Fired after the layer is added to a map + * + * @event remove: Event + * Fired after the layer is removed from a map + */ + + +L.Layer = L.Evented.extend({ + + // Classes extending `L.Layer` will inherit the following options: + options: { + // @option pane: String = 'overlayPane' + // By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default. + pane: 'overlayPane', + nonBubblingEvents: [], // Array of events that should not be bubbled to DOM parents (like the map), + + // @option attribution: String = null + // String to be shown in the attribution control, describes the layer data, e.g. "© Mapbox". + attribution: null + }, + + /* @section + * Classes extending `L.Layer` will inherit the following methods: + * + * @method addTo(map: Map): this + * Adds the layer to the given map + */ + addTo: function (map) { + map.addLayer(this); + return this; + }, + + // @method remove: this + // Removes the layer from the map it is currently active on. + remove: function () { + return this.removeFrom(this._map || this._mapToAdd); + }, + + // @method removeFrom(map: Map): this + // Removes the layer from the given map + removeFrom: function (obj) { + if (obj) { + obj.removeLayer(this); + } + return this; + }, + + // @method getPane(name? : String): HTMLElement + // Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer. + getPane: function (name) { + return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); + }, + + addInteractiveTarget: function (targetEl) { + this._map._targets[L.stamp(targetEl)] = this; + return this; + }, + + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[L.stamp(targetEl)]; + return this; + }, + + // @method getAttribution: String + // Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution). + getAttribution: function () { + return this.options.attribution; + }, + + _layerAdd: function (e) { + var map = e.target; + + // check in case layer gets added and then removed before the map is ready + if (!map.hasLayer(this)) { return; } + + this._map = map; + this._zoomAnimated = map._zoomAnimated; + + if (this.getEvents) { + var events = this.getEvents(); + map.on(events, this); + this.once('remove', function () { + map.off(events, this); + }, this); + } + + this.onAdd(map); + + if (this.getAttribution && map.attributionControl) { + map.attributionControl.addAttribution(this.getAttribution()); + } + + this.fire('add'); + map.fire('layeradd', {layer: this}); + } +}); + +/* @section Extension methods + * @uninheritable + * + * Every layer should extend from `L.Layer` and (re-)implement the following methods. + * + * @method onAdd(map: Map): this + * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer). + * + * @method onRemove(map: Map): this + * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer). + * + * @method getEvents(): Object + * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer. + * + * @method getAttribution(): String + * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible. + * + * @method beforeAdd(map: Map): this + * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only. + */ + + +/* @namespace Map + * @section Layer events + * + * @event layeradd: LayerEvent + * Fired when a new layer is added to the map. + * + * @event layerremove: LayerEvent + * Fired when some layer is removed from the map + * + * @section Methods for Layers and Controls + */ +L.Map.include({ + // @method addLayer(layer: Layer): this + // Adds the given layer to the map + addLayer: function (layer) { + var id = L.stamp(layer); + if (this._layers[id]) { return this; } + this._layers[id] = layer; + + layer._mapToAdd = this; + + if (layer.beforeAdd) { + layer.beforeAdd(this); + } + + this.whenReady(layer._layerAdd, layer); + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the map. + removeLayer: function (layer) { + var id = L.stamp(layer); + + if (!this._layers[id]) { return this; } + + if (this._loaded) { + layer.onRemove(this); + } + + if (layer.getAttribution && this.attributionControl) { + this.attributionControl.removeAttribution(layer.getAttribution()); + } + + delete this._layers[id]; + + if (this._loaded) { + this.fire('layerremove', {layer: layer}); + layer.fire('remove'); + } + + layer._map = layer._mapToAdd = null; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the map + hasLayer: function (layer) { + return !!layer && (L.stamp(layer) in this._layers); + }, + + /* @method eachLayer(fn: Function, context?: Object): this + * Iterates over the layers of the map, optionally specifying context of the iterator function. + * ``` + * map.eachLayer(function(layer){ + * layer.bindPopup('Hello'); + * }); + * ``` + */ + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + _addLayers: function (layers) { + layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; + + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + }, + + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[L.stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, + + _removeZoomLimit: function (layer) { + var id = L.stamp(layer); + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + }, + + _updateZoomLevels: function () { + var minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); + + for (var i in this._zoomBoundLayers) { + var options = this._zoomBoundLayers[i].options; + + minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom); + } + + this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom; + this._layersMinZoom = minZoom === Infinity ? undefined : minZoom; + + // @section Map state change events + // @event zoomlevelschange: Event + // Fired when the number of zoomlevels on the map is changed due + // to adding or removing a layer. + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } + + if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) { + this.setZoom(this._layersMaxZoom); + } + if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) { + this.setZoom(this._layersMinZoom); + } + } +}); + + + +/* + * @namespace DomEvent + * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally. + */ + +// Inspired by John Resig, Dean Edwards and YUI addEvent implementations. + + + +var eventsKey = '_leaflet_events'; + +L.DomEvent = { + + // @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Adds a listener function (`fn`) to a particular DOM event type of the + // element `el`. You can optionally specify the context of the listener + // (object the `this` keyword will point to). You can also pass several + // space-separated types (e.g. `'click dblclick'`). + + // @alternative + // @function on(el: HTMLElement, eventMap: Object, context?: Object): this + // Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + on: function (obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + this._on(obj, type, types[type], fn); + } + } else { + types = L.Util.splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._on(obj, types[i], fn, context); + } + } + + return this; + }, + + // @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Removes a previously added listener function. If no function is specified, + // it will remove all the listeners of that particular DOM event from the element. + // Note that if you passed a custom context to on, you must pass the same + // context to `off` in order to remove the listener. + + // @alternative + // @function off(el: HTMLElement, eventMap: Object, context?: Object): this + // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + off: function (obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + this._off(obj, type, types[type], fn); + } + } else { + types = L.Util.splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._off(obj, types[i], fn, context); + } + } + + return this; + }, + + _on: function (obj, type, fn, context) { + var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''); + + if (obj[eventsKey] && obj[eventsKey][id]) { return this; } + + var handler = function (e) { + return fn.call(context || obj, e || window.event); + }; + + var originalHandler = handler; + + if (L.Browser.pointer && type.indexOf('touch') === 0) { + this.addPointerListener(obj, type, handler, id); + + } else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener && + !(L.Browser.pointer && L.Browser.chrome)) { + // Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener + // See #5180 + this.addDoubleTapListener(obj, handler, id); + + } else if ('addEventListener' in obj) { + + if (type === 'mousewheel') { + obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); + + } else if ((type === 'mouseenter') || (type === 'mouseleave')) { + handler = function (e) { + e = e || window.event; + if (L.DomEvent._isExternalTarget(obj, e)) { + originalHandler(e); + } + }; + obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); + + } else { + if (type === 'click' && L.Browser.android) { + handler = function (e) { + return L.DomEvent._filterClick(e, originalHandler); + }; + } + obj.addEventListener(type, handler, false); + } + + } else if ('attachEvent' in obj) { + obj.attachEvent('on' + type, handler); + } + + obj[eventsKey] = obj[eventsKey] || {}; + obj[eventsKey][id] = handler; + + return this; + }, + + _off: function (obj, type, fn, context) { + + var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''), + handler = obj[eventsKey] && obj[eventsKey][id]; + + if (!handler) { return this; } + + if (L.Browser.pointer && type.indexOf('touch') === 0) { + this.removePointerListener(obj, type, id); + + } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { + this.removeDoubleTapListener(obj, id); + + } else if ('removeEventListener' in obj) { + + if (type === 'mousewheel') { + obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); + + } else { + obj.removeEventListener( + type === 'mouseenter' ? 'mouseover' : + type === 'mouseleave' ? 'mouseout' : type, handler, false); + } + + } else if ('detachEvent' in obj) { + obj.detachEvent('on' + type, handler); + } + + obj[eventsKey][id] = null; + + return this; + }, + + // @function stopPropagation(ev: DOMEvent): this + // Stop the given event from propagation to parent elements. Used inside the listener functions: + // ```js + // L.DomEvent.on(div, 'click', function (ev) { + // L.DomEvent.stopPropagation(ev); + // }); + // ``` + stopPropagation: function (e) { + + if (e.stopPropagation) { + e.stopPropagation(); + } else if (e.originalEvent) { // In case of Leaflet event. + e.originalEvent._stopped = true; + } else { + e.cancelBubble = true; + } + L.DomEvent._skipped(e); + + return this; + }, + + // @function disableScrollPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants). + disableScrollPropagation: function (el) { + return L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation); + }, + + // @function disableClickPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`, + // `'mousedown'` and `'touchstart'` events (plus browser variants). + disableClickPropagation: function (el) { + var stop = L.DomEvent.stopPropagation; + + L.DomEvent.on(el, L.Draggable.START.join(' '), stop); + + return L.DomEvent.on(el, { + click: L.DomEvent._fakeStop, + dblclick: stop + }); + }, + + // @function preventDefault(ev: DOMEvent): this + // Prevents the default action of the DOM Event `ev` from happening (such as + // following a link in the href of the a element, or doing a POST request + // with page reload when a `
` is submitted). + // Use it inside listener functions. + preventDefault: function (e) { + + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + return this; + }, + + // @function stop(ev): this + // Does `stopPropagation` and `preventDefault` at the same time. + stop: function (e) { + return L.DomEvent + .preventDefault(e) + .stopPropagation(e); + }, + + // @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point + // Gets normalized mouse position from a DOM event relative to the + // `container` or to the whole page if not specified. + getMousePosition: function (e, container) { + if (!container) { + return new L.Point(e.clientX, e.clientY); + } + + var rect = container.getBoundingClientRect(); + + return new L.Point( + e.clientX - rect.left - container.clientLeft, + e.clientY - rect.top - container.clientTop); + }, + + // Chrome on Win scrolls double the pixels as in other platforms (see #4538), + // and Firefox scrolls device pixels, not CSS pixels + _wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 : + L.Browser.gecko ? window.devicePixelRatio : + 1, + + // @function getWheelDelta(ev: DOMEvent): Number + // Gets normalized wheel delta from a mousewheel DOM event, in vertical + // pixels scrolled (negative if scrolling down). + // Events from pointing devices without precise scrolling are mapped to + // a best guess of 60 pixels. + getWheelDelta: function (e) { + return (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta + (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels + (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines + (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages + (e.deltaX || e.deltaZ) ? 0 : // Skip horizontal/depth wheel events + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels + (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines + e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages + 0; + }, + + _skipEvents: {}, + + _fakeStop: function (e) { + // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) + L.DomEvent._skipEvents[e.type] = true; + }, + + _skipped: function (e) { + var skipped = this._skipEvents[e.type]; + // reset when checking, as it's only used in map container and propagates outside of the map + this._skipEvents[e.type] = false; + return skipped; + }, + + // check if element really left/entered the event target (for mouseenter/mouseleave) + _isExternalTarget: function (el, e) { + + var related = e.relatedTarget; + + if (!related) { return true; } + + try { + while (related && (related !== el)) { + related = related.parentNode; + } + } catch (err) { + return false; + } + return (related !== el); + }, + + // this is a horrible workaround for a bug in Android where a single touch triggers two click events + _filterClick: function (e, handler) { + var timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)), + elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); + + // are they closer together than 500ms yet more than 100ms? + // Android typically triggers them ~300ms apart while multiple listeners + // on the same event should be triggered far faster; + // or check if click is simulated on the element, and if it is, reject any non-simulated events + + if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { + L.DomEvent.stop(e); + return; + } + L.DomEvent._lastClick = timeStamp; + + handler(e); + } +}; + +// @function addListener(…): this +// Alias to [`L.DomEvent.on`](#domevent-on) +L.DomEvent.addListener = L.DomEvent.on; + +// @function removeListener(…): this +// Alias to [`L.DomEvent.off`](#domevent-off) +L.DomEvent.removeListener = L.DomEvent.off; + + + +/* + * @class PosAnimation + * @aka L.PosAnimation + * @inherits Evented + * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9. + * + * @example + * ```js + * var fx = new L.PosAnimation(); + * fx.run(el, [300, 500], 0.5); + * ``` + * + * @constructor L.PosAnimation() + * Creates a `PosAnimation` object. + * + */ + +L.PosAnimation = L.Evented.extend({ + + // @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number) + // Run an animation of a given element to a new position, optionally setting + // duration in seconds (`0.25` by default) and easing linearity factor (3rd + // argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1), + // `0.5` by default). + run: function (el, newPos, duration, easeLinearity) { + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = L.DomUtil.getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + // @event start: Event + // Fired when the animation starts + this.fire('start'); + + this._animate(); + }, + + // @method stop() + // Stops the animation (if currently running). + stop: function () { + if (!this._inProgress) { return; } + + this._step(true); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = L.Util.requestAnimFrame(this._animate, this); + this._step(); + }, + + _step: function (round) { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; + + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration), round); + } else { + this._runFrame(1); + this._complete(); + } + }, + + _runFrame: function (progress, round) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + if (round) { + pos._round(); + } + L.DomUtil.setPosition(this._el, pos); + + // @event step: Event + // Fired continuously during the animation. + this.fire('step'); + }, + + _complete: function () { + L.Util.cancelAnimFrame(this._animId); + + this._inProgress = false; + // @event end: Event + // Fired when the animation ends. + this.fire('end'); + }, + + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } +}); + + + +/* + * @namespace Projection + * @projection L.Projection.Mercator + * + * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS. + */ + +L.Projection.Mercator = { + R: 6378137, + R_MINOR: 6356752.314245179, + + bounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), + + project: function (latlng) { + var d = Math.PI / 180, + r = this.R, + y = latlng.lat * d, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + con = e * Math.sin(y); + + var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2); + y = -r * Math.log(Math.max(ts, 1E-10)); + + return new L.Point(latlng.lng * d * r, y); + }, + + unproject: function (point) { + var d = 180 / Math.PI, + r = this.R, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + ts = Math.exp(-point.y / r), + phi = Math.PI / 2 - 2 * Math.atan(ts); + + for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) { + con = e * Math.sin(phi); + con = Math.pow((1 - con) / (1 + con), e / 2); + dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi; + phi += dphi; + } + + return new L.LatLng(phi * d, point.x * d / r); + } +}; + + + +/* + * @namespace CRS + * @crs L.CRS.EPSG3395 + * + * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection. + */ + +L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, { + code: 'EPSG:3395', + projection: L.Projection.Mercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * L.Projection.Mercator.R); + return new L.Transformation(scale, 0.5, -scale, 0.5); + }()) +}); + + + +/* + * @class GridLayer + * @inherits Layer + * @aka L.GridLayer + * + * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`. + * GridLayer can be extended to create a tiled grid of HTML elements like ``, `` or `
`. GridLayer will handle creating and animating these DOM elements for you. + * + * + * @section Synchronous usage + * @example + * + * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile. + * + * ```js + * var CanvasLayer = L.GridLayer.extend({ + * createTile: function(coords){ + * // create a element for drawing + * var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + * + * // setup tile width and height according to the options + * var size = this.getTileSize(); + * tile.width = size.x; + * tile.height = size.y; + * + * // get a canvas context and draw something on it using coords.x, coords.y and coords.z + * var ctx = tile.getContext('2d'); + * + * // return the tile so it can be rendered on screen + * return tile; + * } + * }); + * ``` + * + * @section Asynchronous usage + * @example + * + * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback. + * + * ```js + * var CanvasLayer = L.GridLayer.extend({ + * createTile: function(coords, done){ + * var error; + * + * // create a element for drawing + * var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + * + * // setup tile width and height according to the options + * var size = this.getTileSize(); + * tile.width = size.x; + * tile.height = size.y; + * + * // draw something asynchronously and pass the tile to the done() callback + * setTimeout(function() { + * done(error, tile); + * }, 1000); + * + * return tile; + * } + * }); + * ``` + * + * @section + */ + + +L.GridLayer = L.Layer.extend({ + + // @section + // @aka GridLayer options + options: { + // @option tileSize: Number|Point = 256 + // Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise. + tileSize: 256, + + // @option opacity: Number = 1.0 + // Opacity of the tiles. Can be used in the `createTile()` function. + opacity: 1, + + // @option updateWhenIdle: Boolean = depends + // If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`. + updateWhenIdle: L.Browser.mobile, + + // @option updateWhenZooming: Boolean = true + // By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends. + updateWhenZooming: true, + + // @option updateInterval: Number = 200 + // Tiles will not update more than once every `updateInterval` milliseconds when panning. + updateInterval: 200, + + // @option zIndex: Number = 1 + // The explicit zIndex of the tile layer. + zIndex: 1, + + // @option bounds: LatLngBounds = undefined + // If set, tiles will only be loaded inside the set `LatLngBounds`. + bounds: null, + + // @option minZoom: Number = 0 + // The minimum zoom level that tiles will be loaded at. By default the entire map. + minZoom: 0, + + // @option maxZoom: Number = undefined + // The maximum zoom level that tiles will be loaded at. + maxZoom: undefined, + + // @option noWrap: Boolean = false + // Whether the layer is wrapped around the antimeridian. If `true`, the + // GridLayer will only be displayed once at low zoom levels. Has no + // effect when the [map CRS](#map-crs) doesn't wrap around. Can be used + // in combination with [`bounds`](#gridlayer-bounds) to prevent requesting + // tiles outside the CRS limits. + noWrap: false, + + // @option pane: String = 'tilePane' + // `Map pane` where the grid layer will be added. + pane: 'tilePane', + + // @option className: String = '' + // A custom class name to assign to the tile layer. Empty by default. + className: '', + + // @option keepBuffer: Number = 2 + // When panning the map, keep this many rows and columns of tiles before unloading them. + keepBuffer: 2 + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + onAdd: function () { + this._initContainer(); + + this._levels = {}; + this._tiles = {}; + + this._resetView(); + this._update(); + }, + + beforeAdd: function (map) { + map._addZoomLimit(this); + }, + + onRemove: function (map) { + this._removeAllTiles(); + L.DomUtil.remove(this._container); + map._removeZoomLimit(this); + this._container = null; + this._tileZoom = null; + }, + + // @method bringToFront: this + // Brings the tile layer to the top of all tile layers. + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); + this._setAutoZIndex(Math.max); + } + return this; + }, + + // @method bringToBack: this + // Brings the tile layer to the bottom of all tile layers. + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); + this._setAutoZIndex(Math.min); + } + return this; + }, + + // @method getContainer: HTMLElement + // Returns the HTML element that contains the tiles for this layer. + getContainer: function () { + return this._container; + }, + + // @method setOpacity(opacity: Number): this + // Changes the [opacity](#gridlayer-opacity) of the grid layer. + setOpacity: function (opacity) { + this.options.opacity = opacity; + this._updateOpacity(); + return this; + }, + + // @method setZIndex(zIndex: Number): this + // Changes the [zIndex](#gridlayer-zindex) of the grid layer. + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); + + return this; + }, + + // @method isLoading: Boolean + // Returns `true` if any tile in the grid layer has not finished loading. + isLoading: function () { + return this._loading; + }, + + // @method redraw: this + // Causes the layer to clear all the tiles and request them again. + redraw: function () { + if (this._map) { + this._removeAllTiles(); + this._update(); + } + return this; + }, + + getEvents: function () { + var events = { + viewprereset: this._invalidateAll, + viewreset: this._resetView, + zoom: this._resetView, + moveend: this._onMoveEnd + }; + + if (!this.options.updateWhenIdle) { + // update tiles on move, but not more often than once per given interval + if (!this._onMove) { + this._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this); + } + + events.move = this._onMove; + } + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + + return events; + }, + + // @section Extension methods + // Layers extending `GridLayer` shall reimplement the following method. + // @method createTile(coords: Object, done?: Function): HTMLElement + // Called only internally, must be overriden by classes extending `GridLayer`. + // Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback + // is specified, it must be called when the tile has finished loading and drawing. + createTile: function () { + return document.createElement('div'); + }, + + // @section + // @method getTileSize: Point + // Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method. + getTileSize: function () { + var s = this.options.tileSize; + return s instanceof L.Point ? s : new L.Point(s, s); + }, + + _updateZIndex: function () { + if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) { + this._container.style.zIndex = this.options.zIndex; + } + }, + + _setAutoZIndex: function (compare) { + // go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back) + + var layers = this.getPane().children, + edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min + + for (var i = 0, len = layers.length, zIndex; i < len; i++) { + + zIndex = layers[i].style.zIndex; + + if (layers[i] !== this._container && zIndex) { + edgeZIndex = compare(edgeZIndex, +zIndex); + } + } + + if (isFinite(edgeZIndex)) { + this.options.zIndex = edgeZIndex + compare(-1, 1); + this._updateZIndex(); + } + }, + + _updateOpacity: function () { + if (!this._map) { return; } + + // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles + if (L.Browser.ielt9) { return; } + + L.DomUtil.setOpacity(this._container, this.options.opacity); + + var now = +new Date(), + nextFrame = false, + willPrune = false; + + for (var key in this._tiles) { + var tile = this._tiles[key]; + if (!tile.current || !tile.loaded) { continue; } + + var fade = Math.min(1, (now - tile.loaded) / 200); + + L.DomUtil.setOpacity(tile.el, fade); + if (fade < 1) { + nextFrame = true; + } else { + if (tile.active) { willPrune = true; } + tile.active = true; + } + } + + if (willPrune && !this._noPrune) { this._pruneTiles(); } + + if (nextFrame) { + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); + } + }, + + _initContainer: function () { + if (this._container) { return; } + + this._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || '')); + this._updateZIndex(); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + + this.getPane().appendChild(this._container); + }, + + _updateLevels: function () { + + var zoom = this._tileZoom, + maxZoom = this.options.maxZoom; + + if (zoom === undefined) { return undefined; } + + for (var z in this._levels) { + if (this._levels[z].el.children.length || z === zoom) { + this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); + } else { + L.DomUtil.remove(this._levels[z].el); + this._removeTilesAtZoom(z); + delete this._levels[z]; + } + } + + var level = this._levels[zoom], + map = this._map; + + if (!level) { + level = this._levels[zoom] = {}; + + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = maxZoom; + + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.zoom = zoom; + + this._setZoomTransform(level, map.getCenter(), map.getZoom()); + + // force the browser to consider the newly added element for transition + L.Util.falseFn(level.el.offsetWidth); + } + + this._level = level; + + return level; + }, + + _pruneTiles: function () { + if (!this._map) { + return; + } + + var key, tile; + + var zoom = this._map.getZoom(); + if (zoom > this.options.maxZoom || + zoom < this.options.minZoom) { + this._removeAllTiles(); + return; + } + + for (key in this._tiles) { + tile = this._tiles[key]; + tile.retain = tile.current; + } + + for (key in this._tiles) { + tile = this._tiles[key]; + if (tile.current && !tile.active) { + var coords = tile.coords; + if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) { + this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2); + } + } + } + + for (key in this._tiles) { + if (!this._tiles[key].retain) { + this._removeTile(key); + } + } + }, + + _removeTilesAtZoom: function (zoom) { + for (var key in this._tiles) { + if (this._tiles[key].coords.z !== zoom) { + continue; + } + this._removeTile(key); + } + }, + + _removeAllTiles: function () { + for (var key in this._tiles) { + this._removeTile(key); + } + }, + + _invalidateAll: function () { + for (var z in this._levels) { + L.DomUtil.remove(this._levels[z].el); + delete this._levels[z]; + } + this._removeAllTiles(); + + this._tileZoom = null; + }, + + _retainParent: function (x, y, z, minZoom) { + var x2 = Math.floor(x / 2), + y2 = Math.floor(y / 2), + z2 = z - 1, + coords2 = new L.Point(+x2, +y2); + coords2.z = +z2; + + var key = this._tileCoordsToKey(coords2), + tile = this._tiles[key]; + + if (tile && tile.active) { + tile.retain = true; + return true; + + } else if (tile && tile.loaded) { + tile.retain = true; + } + + if (z2 > minZoom) { + return this._retainParent(x2, y2, z2, minZoom); + } + + return false; + }, + + _retainChildren: function (x, y, z, maxZoom) { + + for (var i = 2 * x; i < 2 * x + 2; i++) { + for (var j = 2 * y; j < 2 * y + 2; j++) { + + var coords = new L.Point(i, j); + coords.z = z + 1; + + var key = this._tileCoordsToKey(coords), + tile = this._tiles[key]; + + if (tile && tile.active) { + tile.retain = true; + continue; + + } else if (tile && tile.loaded) { + tile.retain = true; + } + + if (z + 1 < maxZoom) { + this._retainChildren(i, j, z + 1, maxZoom); + } + } + } + }, + + _resetView: function (e) { + var animating = e && (e.pinch || e.flyTo); + this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating); + }, + + _animateZoom: function (e) { + this._setView(e.center, e.zoom, true, e.noUpdate); + }, + + _setView: function (center, zoom, noPrune, noUpdate) { + var tileZoom = Math.round(zoom); + if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) || + (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) { + tileZoom = undefined; + } + + var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom); + + if (!noUpdate || tileZoomChanged) { + + this._tileZoom = tileZoom; + + if (this._abortLoading) { + this._abortLoading(); + } + + this._updateLevels(); + this._resetGrid(); + + if (tileZoom !== undefined) { + this._update(center); + } + + if (!noPrune) { + this._pruneTiles(); + } + + // Flag to prevent _updateOpacity from pruning tiles during + // a zoom anim or a pinch gesture + this._noPrune = !!noPrune; + } + + this._setZoomTransforms(center, zoom); + }, + + _setZoomTransforms: function (center, zoom) { + for (var i in this._levels) { + this._setZoomTransform(this._levels[i], center, zoom); + } + }, + + _setZoomTransform: function (level, center, zoom) { + var scale = this._map.getZoomScale(zoom, level.zoom), + translate = level.origin.multiplyBy(scale) + .subtract(this._map._getNewPixelOrigin(center, zoom)).round(); + + if (L.Browser.any3d) { + L.DomUtil.setTransform(level.el, translate, scale); + } else { + L.DomUtil.setPosition(level.el, translate); + } + }, + + _resetGrid: function () { + var map = this._map, + crs = map.options.crs, + tileSize = this._tileSize = this.getTileSize(), + tileZoom = this._tileZoom; + + var bounds = this._map.getPixelWorldBounds(this._tileZoom); + if (bounds) { + this._globalTileRange = this._pxBoundsToTileRange(bounds); + } + + this._wrapX = crs.wrapLng && !this.options.noWrap && [ + Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x), + Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y) + ]; + this._wrapY = crs.wrapLat && !this.options.noWrap && [ + Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x), + Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y) + ]; + }, + + _onMoveEnd: function () { + if (!this._map || this._map._animatingZoom) { return; } + + this._update(); + }, + + _getTiledPixelBounds: function (center) { + var map = this._map, + mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(), + scale = map.getZoomScale(mapZoom, this._tileZoom), + pixelCenter = map.project(center, this._tileZoom).floor(), + halfSize = map.getSize().divideBy(scale * 2); + + return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); + }, + + // Private method to load tiles in the grid's active zoom level according to map bounds + _update: function (center) { + var map = this._map; + if (!map) { return; } + var zoom = map.getZoom(); + + if (center === undefined) { center = map.getCenter(); } + if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom + + var pixelBounds = this._getTiledPixelBounds(center), + tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + queue = [], + margin = this.options.keepBuffer, + noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]), + tileRange.getTopRight().add([margin, -margin])); + + for (var key in this._tiles) { + var c = this._tiles[key].coords; + if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) { + this._tiles[key].current = false; + } + } + + // _update just loads more tiles. If the tile zoom level differs too much + // from the map's, let _setView reset levels and prune old tiles. + if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; } + + // create a queue of coordinates to load tiles from + for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { + for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { + var coords = new L.Point(i, j); + coords.z = this._tileZoom; + + if (!this._isValidTile(coords)) { continue; } + + var tile = this._tiles[this._tileCoordsToKey(coords)]; + if (tile) { + tile.current = true; + } else { + queue.push(coords); + } + } + } + + // sort tile queue to load tiles in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(tileCenter) - b.distanceTo(tileCenter); + }); + + if (queue.length !== 0) { + // if it's the first batch of tiles to load + if (!this._loading) { + this._loading = true; + // @event loading: Event + // Fired when the grid layer starts loading tiles. + this.fire('loading'); + } + + // create DOM fragment to append tiles in one batch + var fragment = document.createDocumentFragment(); + + for (i = 0; i < queue.length; i++) { + this._addTile(queue[i], fragment); + } + + this._level.el.appendChild(fragment); + } + }, + + _isValidTile: function (coords) { + var crs = this._map.options.crs; + + if (!crs.infinite) { + // don't load tile if it's out of bounds and not wrapped + var bounds = this._globalTileRange; + if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || + (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; } + } + + if (!this.options.bounds) { return true; } + + // don't load tile if it doesn't intersect the bounds in options + var tileBounds = this._tileCoordsToBounds(coords); + return L.latLngBounds(this.options.bounds).overlaps(tileBounds); + }, + + _keyToBounds: function (key) { + return this._tileCoordsToBounds(this._keyToTileCoords(key)); + }, + + // converts tile coordinates to its geographical bounds + _tileCoordsToBounds: function (coords) { + + var map = this._map, + tileSize = this.getTileSize(), + + nwPoint = coords.scaleBy(tileSize), + sePoint = nwPoint.add(tileSize), + + nw = map.unproject(nwPoint, coords.z), + se = map.unproject(sePoint, coords.z), + bounds = new L.LatLngBounds(nw, se); + + if (!this.options.noWrap) { + map.wrapLatLngBounds(bounds); + } + + return bounds; + }, + + // converts tile coordinates to key for the tile cache + _tileCoordsToKey: function (coords) { + return coords.x + ':' + coords.y + ':' + coords.z; + }, + + // converts tile cache key to coordinates + _keyToTileCoords: function (key) { + var k = key.split(':'), + coords = new L.Point(+k[0], +k[1]); + coords.z = +k[2]; + return coords; + }, + + _removeTile: function (key) { + var tile = this._tiles[key]; + if (!tile) { return; } + + L.DomUtil.remove(tile.el); + + delete this._tiles[key]; + + // @event tileunload: TileEvent + // Fired when a tile is removed (e.g. when a tile goes off the screen). + this.fire('tileunload', { + tile: tile.el, + coords: this._keyToTileCoords(key) + }); + }, + + _initTile: function (tile) { + L.DomUtil.addClass(tile, 'leaflet-tile'); + + var tileSize = this.getTileSize(); + tile.style.width = tileSize.x + 'px'; + tile.style.height = tileSize.y + 'px'; + + tile.onselectstart = L.Util.falseFn; + tile.onmousemove = L.Util.falseFn; + + // update opacity on tiles in IE7-8 because of filter inheritance problems + if (L.Browser.ielt9 && this.options.opacity < 1) { + L.DomUtil.setOpacity(tile, this.options.opacity); + } + + // without this hack, tiles disappear after zoom on Chrome for Android + // https://github.com/Leaflet/Leaflet/issues/2078 + if (L.Browser.android && !L.Browser.android23) { + tile.style.WebkitBackfaceVisibility = 'hidden'; + } + }, + + _addTile: function (coords, container) { + var tilePos = this._getTilePos(coords), + key = this._tileCoordsToKey(coords); + + var tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords)); + + this._initTile(tile); + + // if createTile is defined with a second argument ("done" callback), + // we know that tile is async and will be ready later; otherwise + if (this.createTile.length < 2) { + // mark tile as ready, but delay one frame for opacity animation to happen + L.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile)); + } + + L.DomUtil.setPosition(tile, tilePos); + + // save tile in cache + this._tiles[key] = { + el: tile, + coords: coords, + current: true + }; + + container.appendChild(tile); + // @event tileloadstart: TileEvent + // Fired when a tile is requested and starts loading. + this.fire('tileloadstart', { + tile: tile, + coords: coords + }); + }, + + _tileReady: function (coords, err, tile) { + if (!this._map) { return; } + + if (err) { + // @event tileerror: TileErrorEvent + // Fired when there is an error loading a tile. + this.fire('tileerror', { + error: err, + tile: tile, + coords: coords + }); + } + + var key = this._tileCoordsToKey(coords); + + tile = this._tiles[key]; + if (!tile) { return; } + + tile.loaded = +new Date(); + if (this._map._fadeAnimated) { + L.DomUtil.setOpacity(tile.el, 0); + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); + } else { + tile.active = true; + this._pruneTiles(); + } + + if (!err) { + L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); + + // @event tileload: TileEvent + // Fired when a tile loads. + this.fire('tileload', { + tile: tile.el, + coords: coords + }); + } + + if (this._noTilesToLoad()) { + this._loading = false; + // @event load: Event + // Fired when the grid layer loaded all visible tiles. + this.fire('load'); + + if (L.Browser.ielt9 || !this._map._fadeAnimated) { + L.Util.requestAnimFrame(this._pruneTiles, this); + } else { + // Wait a bit more than 0.2 secs (the duration of the tile fade-in) + // to trigger a pruning. + setTimeout(L.bind(this._pruneTiles, this), 250); + } + } + }, + + _getTilePos: function (coords) { + return coords.scaleBy(this.getTileSize()).subtract(this._level.origin); + }, + + _wrapCoords: function (coords) { + var newCoords = new L.Point( + this._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x, + this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y); + newCoords.z = coords.z; + return newCoords; + }, + + _pxBoundsToTileRange: function (bounds) { + var tileSize = this.getTileSize(); + return new L.Bounds( + bounds.min.unscaleBy(tileSize).floor(), + bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1])); + }, + + _noTilesToLoad: function () { + for (var key in this._tiles) { + if (!this._tiles[key].loaded) { return false; } + } + return true; + } +}); + +// @factory L.gridLayer(options?: GridLayer options) +// Creates a new instance of GridLayer with the supplied options. +L.gridLayer = function (options) { + return new L.GridLayer(options); +}; + + + +/* + * @class TileLayer + * @inherits GridLayer + * @aka L.TileLayer + * Used to load and display tile layers on the map. Extends `GridLayer`. + * + * @example + * + * ```js + * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map); + * ``` + * + * @section URL template + * @example + * + * A string of the following form: + * + * ``` + * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png' + * ``` + * + * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles. + * + * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this: + * + * ``` + * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'}); + * ``` + */ + + +L.TileLayer = L.GridLayer.extend({ + + // @section + // @aka TileLayer options + options: { + // @option minZoom: Number = 0 + // Minimum zoom number. + minZoom: 0, + + // @option maxZoom: Number = 18 + // Maximum zoom number. + maxZoom: 18, + + // @option maxNativeZoom: Number = null + // Maximum zoom number the tile source has available. If it is specified, + // the tiles on all zoom levels higher than `maxNativeZoom` will be loaded + // from `maxNativeZoom` level and auto-scaled. + maxNativeZoom: null, + + // @option minNativeZoom: Number = null + // Minimum zoom number the tile source has available. If it is specified, + // the tiles on all zoom levels lower than `minNativeZoom` will be loaded + // from `minNativeZoom` level and auto-scaled. + minNativeZoom: null, + + // @option subdomains: String|String[] = 'abc' + // Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings. + subdomains: 'abc', + + // @option errorTileUrl: String = '' + // URL to the tile image to show in place of the tile that failed to load. + errorTileUrl: '', + + // @option zoomOffset: Number = 0 + // The zoom number used in tile URLs will be offset with this value. + zoomOffset: 0, + + // @option tms: Boolean = false + // If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services). + tms: false, + + // @option zoomReverse: Boolean = false + // If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`) + zoomReverse: false, + + // @option detectRetina: Boolean = false + // If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. + detectRetina: false, + + // @option crossOrigin: Boolean = false + // If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data. + crossOrigin: false + }, + + initialize: function (url, options) { + + this._url = url; + + options = L.setOptions(this, options); + + // detecting retina displays, adjusting tileSize and zoom levels + if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { + + options.tileSize = Math.floor(options.tileSize / 2); + + if (!options.zoomReverse) { + options.zoomOffset++; + options.maxZoom--; + } else { + options.zoomOffset--; + options.minZoom++; + } + + options.minZoom = Math.max(0, options.minZoom); + } + + if (typeof options.subdomains === 'string') { + options.subdomains = options.subdomains.split(''); + } + + // for https://github.com/Leaflet/Leaflet/issues/137 + if (!L.Browser.android) { + this.on('tileunload', this._onTileRemove); + } + }, + + // @method setUrl(url: String, noRedraw?: Boolean): this + // Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`). + setUrl: function (url, noRedraw) { + this._url = url; + + if (!noRedraw) { + this.redraw(); + } + return this; + }, + + // @method createTile(coords: Object, done?: Function): HTMLElement + // Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile) + // to return an `` HTML element with the appropiate image URL given `coords`. The `done` + // callback is called when the tile has been loaded. + createTile: function (coords, done) { + var tile = document.createElement('img'); + + L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); + L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); + + if (this.options.crossOrigin) { + tile.crossOrigin = ''; + } + + /* + Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons + http://www.w3.org/TR/WCAG20-TECHS/H67 + */ + tile.alt = ''; + + /* + Set role="presentation" to force screen readers to ignore this + https://www.w3.org/TR/wai-aria/roles#textalternativecomputation + */ + tile.setAttribute('role', 'presentation'); + + tile.src = this.getTileUrl(coords); + + return tile; + }, + + // @section Extension methods + // @uninheritable + // Layers extending `TileLayer` might reimplement the following method. + // @method getTileUrl(coords: Object): String + // Called only internally, returns the URL for a tile given its coordinates. + // Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes. + getTileUrl: function (coords) { + var data = { + r: L.Browser.retina ? '@2x' : '', + s: this._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: this._getZoomForUrl() + }; + if (this._map && !this._map.options.crs.infinite) { + var invertedY = this._globalTileRange.max.y - coords.y; + if (this.options.tms) { + data['y'] = invertedY; + } + data['-y'] = invertedY; + } + + return L.Util.template(this._url, L.extend(data, this.options)); + }, + + _tileOnLoad: function (done, tile) { + // For https://github.com/Leaflet/Leaflet/issues/3332 + if (L.Browser.ielt9) { + setTimeout(L.bind(done, this, null, tile), 0); + } else { + done(null, tile); + } + }, + + _tileOnError: function (done, tile, e) { + var errorUrl = this.options.errorTileUrl; + if (errorUrl && tile.src !== errorUrl) { + tile.src = errorUrl; + } + done(e, tile); + }, + + getTileSize: function () { + var map = this._map, + tileSize = L.GridLayer.prototype.getTileSize.call(this), + zoom = this._tileZoom + this.options.zoomOffset, + minNativeZoom = this.options.minNativeZoom, + maxNativeZoom = this.options.maxNativeZoom; + + // decrease tile size when scaling below minNativeZoom + if (minNativeZoom !== null && zoom < minNativeZoom) { + return tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round(); + } + + // increase tile size when scaling above maxNativeZoom + if (maxNativeZoom !== null && zoom > maxNativeZoom) { + return tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round(); + } + + return tileSize; + }, + + _onTileRemove: function (e) { + e.tile.onload = null; + }, + + _getZoomForUrl: function () { + var zoom = this._tileZoom, + maxZoom = this.options.maxZoom, + zoomReverse = this.options.zoomReverse, + zoomOffset = this.options.zoomOffset, + minNativeZoom = this.options.minNativeZoom, + maxNativeZoom = this.options.maxNativeZoom; + + if (zoomReverse) { + zoom = maxZoom - zoom; + } + + zoom += zoomOffset; + + if (minNativeZoom !== null && zoom < minNativeZoom) { + return minNativeZoom; + } + + if (maxNativeZoom !== null && zoom > maxNativeZoom) { + return maxNativeZoom; + } + + return zoom; + }, + + _getSubdomain: function (tilePoint) { + var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; + return this.options.subdomains[index]; + }, + + // stops loading all tiles in the background layer + _abortLoading: function () { + var i, tile; + for (i in this._tiles) { + if (this._tiles[i].coords.z !== this._tileZoom) { + tile = this._tiles[i].el; + + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; + + if (!tile.complete) { + tile.src = L.Util.emptyImageUrl; + L.DomUtil.remove(tile); + } + } + } + } +}); + + +// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options) +// Instantiates a tile layer object given a `URL template` and optionally an options object. + +L.tileLayer = function (url, options) { + return new L.TileLayer(url, options); +}; + + + +/* + * @class TileLayer.WMS + * @inherits TileLayer + * @aka L.TileLayer.WMS + * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`. + * + * @example + * + * ```js + * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", { + * layers: 'nexrad-n0r-900913', + * format: 'image/png', + * transparent: true, + * attribution: "Weather data © 2012 IEM Nexrad" + * }); + * ``` + */ + +L.TileLayer.WMS = L.TileLayer.extend({ + + // @section + // @aka TileLayer.WMS options + // If any custom options not documented here are used, they will be sent to the + // WMS server as extra parameters in each request URL. This can be useful for + // [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html). + defaultWmsParams: { + service: 'WMS', + request: 'GetMap', + + // @option layers: String = '' + // **(required)** Comma-separated list of WMS layers to show. + layers: '', + + // @option styles: String = '' + // Comma-separated list of WMS styles. + styles: '', + + // @option format: String = 'image/jpeg' + // WMS image format (use `'image/png'` for layers with transparency). + format: 'image/jpeg', + + // @option transparent: Boolean = false + // If `true`, the WMS service will return images with transparency. + transparent: false, + + // @option version: String = '1.1.1' + // Version of the WMS service to use + version: '1.1.1' + }, + + options: { + // @option crs: CRS = null + // Coordinate Reference System to use for the WMS requests, defaults to + // map CRS. Don't change this if you're not sure what it means. + crs: null, + + // @option uppercase: Boolean = false + // If `true`, WMS request parameter keys will be uppercase. + uppercase: false + }, + + initialize: function (url, options) { + + this._url = url; + + var wmsParams = L.extend({}, this.defaultWmsParams); + + // all keys that are not TileLayer options go to WMS params + for (var i in options) { + if (!(i in this.options)) { + wmsParams[i] = options[i]; + } + } + + options = L.setOptions(this, options); + + wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1); + + this.wmsParams = wmsParams; + }, + + onAdd: function (map) { + + this._crs = this.options.crs || map.options.crs; + this._wmsVersion = parseFloat(this.wmsParams.version); + + var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; + this.wmsParams[projectionKey] = this._crs.code; + + L.TileLayer.prototype.onAdd.call(this, map); + }, + + getTileUrl: function (coords) { + + var tileBounds = this._tileCoordsToBounds(coords), + nw = this._crs.project(tileBounds.getNorthWest()), + se = this._crs.project(tileBounds.getSouthEast()), + + bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? + [se.y, nw.x, nw.y, se.x] : + [nw.x, se.y, se.x, nw.y]).join(','), + + url = L.TileLayer.prototype.getTileUrl.call(this, coords); + + return url + + L.Util.getParamString(this.wmsParams, url, this.options.uppercase) + + (this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox; + }, + + // @method setParams(params: Object, noRedraw?: Boolean): this + // Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true). + setParams: function (params, noRedraw) { + + L.extend(this.wmsParams, params); + + if (!noRedraw) { + this.redraw(); + } + + return this; + } +}); + + +// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options) +// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object. +L.tileLayer.wms = function (url, options) { + return new L.TileLayer.WMS(url, options); +}; + + + +/* + * @class ImageOverlay + * @aka L.ImageOverlay + * @inherits Interactive layer + * + * Used to load and display a single image over specific bounds of the map. Extends `Layer`. + * + * @example + * + * ```js + * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', + * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; + * L.imageOverlay(imageUrl, imageBounds).addTo(map); + * ``` + */ + +L.ImageOverlay = L.Layer.extend({ + + // @section + // @aka ImageOverlay options + options: { + // @option opacity: Number = 1.0 + // The opacity of the image overlay. + opacity: 1, + + // @option alt: String = '' + // Text for the `alt` attribute of the image (useful for accessibility). + alt: '', + + // @option interactive: Boolean = false + // If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered. + interactive: false, + + // @option crossOrigin: Boolean = false + // If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data. + crossOrigin: false + }, + + initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) + this._url = url; + this._bounds = L.latLngBounds(bounds); + + L.setOptions(this, options); + }, + + onAdd: function () { + if (!this._image) { + this._initImage(); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + } + + if (this.options.interactive) { + L.DomUtil.addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); + } + + this.getPane().appendChild(this._image); + this._reset(); + }, + + onRemove: function () { + L.DomUtil.remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); + } + }, + + // @method setOpacity(opacity: Number): this + // Sets the opacity of the overlay. + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._image) { + this._updateOpacity(); + } + return this; + }, + + setStyle: function (styleOpts) { + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all overlays. + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._image); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all overlays. + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._image); + } + return this; + }, + + // @method setUrl(url: String): this + // Changes the URL of the image. + setUrl: function (url) { + this._url = url; + + if (this._image) { + this._image.src = url; + } + return this; + }, + + // @method setBounds(bounds: LatLngBounds): this + // Update the bounds that this ImageOverlay covers + setBounds: function (bounds) { + this._bounds = bounds; + + if (this._map) { + this._reset(); + } + return this; + }, + + getEvents: function () { + var events = { + zoom: this._reset, + viewreset: this._reset + }; + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + + return events; + }, + + // @method getBounds(): LatLngBounds + // Get the bounds that this ImageOverlay covers + getBounds: function () { + return this._bounds; + }, + + // @method getElement(): HTMLElement + // Get the img element that represents the ImageOverlay on the map + getElement: function () { + return this._image; + }, + + _initImage: function () { + var img = this._image = L.DomUtil.create('img', + 'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '')); + + img.onselectstart = L.Util.falseFn; + img.onmousemove = L.Util.falseFn; + + img.onload = L.bind(this.fire, this, 'load'); + + if (this.options.crossOrigin) { + img.crossOrigin = ''; + } + + img.src = this._url; + img.alt = this.options.alt; + }, + + _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min; + + L.DomUtil.setTransform(this._image, offset, scale); + }, + + _reset: function () { + var image = this._image, + bounds = new L.Bounds( + this._map.latLngToLayerPoint(this._bounds.getNorthWest()), + this._map.latLngToLayerPoint(this._bounds.getSouthEast())), + size = bounds.getSize(); + + L.DomUtil.setPosition(image, bounds.min); + + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; + }, + + _updateOpacity: function () { + L.DomUtil.setOpacity(this._image, this.options.opacity); + } +}); + +// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options) +// Instantiates an image overlay object given the URL of the image and the +// geographical bounds it is tied to. +L.imageOverlay = function (url, bounds, options) { + return new L.ImageOverlay(url, bounds, options); +}; + + + +/* + * @class Icon + * @aka L.Icon + * @inherits Layer + * + * Represents an icon to provide when creating a marker. + * + * @example + * + * ```js + * var myIcon = L.icon({ + * iconUrl: 'my-icon.png', + * iconRetinaUrl: 'my-icon@2x.png', + * iconSize: [38, 95], + * iconAnchor: [22, 94], + * popupAnchor: [-3, -76], + * shadowUrl: 'my-icon-shadow.png', + * shadowRetinaUrl: 'my-icon-shadow@2x.png', + * shadowSize: [68, 95], + * shadowAnchor: [22, 94] + * }); + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default. + * + */ + +L.Icon = L.Class.extend({ + + /* @section + * @aka Icon options + * + * @option iconUrl: String = null + * **(required)** The URL to the icon image (absolute or relative to your script path). + * + * @option iconRetinaUrl: String = null + * The URL to a retina sized version of the icon image (absolute or relative to your + * script path). Used for Retina screen devices. + * + * @option iconSize: Point = null + * Size of the icon image in pixels. + * + * @option iconAnchor: Point = null + * The coordinates of the "tip" of the icon (relative to its top left corner). The icon + * will be aligned so that this point is at the marker's geographical location. Centered + * by default if size is specified, also can be set in CSS with negative margins. + * + * @option popupAnchor: Point = null + * The coordinates of the point from which popups will "open", relative to the icon anchor. + * + * @option shadowUrl: String = null + * The URL to the icon shadow image. If not specified, no shadow image will be created. + * + * @option shadowRetinaUrl: String = null + * + * @option shadowSize: Point = null + * Size of the shadow image in pixels. + * + * @option shadowAnchor: Point = null + * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same + * as iconAnchor if not specified). + * + * @option className: String = '' + * A custom class name to assign to both icon and shadow images. Empty by default. + */ + + initialize: function (options) { + L.setOptions(this, options); + }, + + // @method createIcon(oldIcon?: HTMLElement): HTMLElement + // Called internally when the icon has to be shown, returns a `` HTML element + // styled according to the options. + createIcon: function (oldIcon) { + return this._createIcon('icon', oldIcon); + }, + + // @method createShadow(oldIcon?: HTMLElement): HTMLElement + // As `createIcon`, but for the shadow beneath it. + createShadow: function (oldIcon) { + return this._createIcon('shadow', oldIcon); + }, + + _createIcon: function (name, oldIcon) { + var src = this._getIconUrl(name); + + if (!src) { + if (name === 'icon') { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + return null; + } + + var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); + this._setIconStyles(img, name); + + return img; + }, + + _setIconStyles: function (img, name) { + var options = this.options; + var sizeOption = options[name + 'Size']; + + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; + } + + var size = L.point(sizeOption), + anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor || + size && size.divideBy(2, true)); + + img.className = 'leaflet-marker-' + name + ' ' + (options.className || ''); + + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; + } + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + }, + + _createImg: function (src, el) { + el = el || document.createElement('img'); + el.src = src; + return el; + }, + + _getIconUrl: function (name) { + return L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; + } +}); + + +// @factory L.icon(options: Icon options) +// Creates an icon instance with the given options. +L.icon = function (options) { + return new L.Icon(options); +}; + + + +/* + * @miniclass Icon.Default (Icon) + * @aka L.Icon.Default + * @section + * + * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when + * no icon is specified. Points to the blue marker image distributed with Leaflet + * releases. + * + * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options` + * (which is a set of `Icon options`). + * + * If you want to _completely_ replace the default icon, override the + * `L.Marker.prototype.options.icon` with your own icon instead. + */ + +L.Icon.Default = L.Icon.extend({ + + options: { + iconUrl: 'marker-icon.png', + iconRetinaUrl: 'marker-icon-2x.png', + shadowUrl: 'marker-shadow.png', + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + tooltipAnchor: [16, -28], + shadowSize: [41, 41] + }, + + _getIconUrl: function (name) { + if (!L.Icon.Default.imagePath) { // Deprecated, backwards-compatibility only + L.Icon.Default.imagePath = this._detectIconPath(); + } + + // @option imagePath: String + // `L.Icon.Default` will try to auto-detect the absolute location of the + // blue icon images. If you are placing these images in a non-standard + // way, set this option to point to the right absolute path. + return (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name); + }, + + _detectIconPath: function () { + var el = L.DomUtil.create('div', 'leaflet-default-icon-path', document.body); + var path = L.DomUtil.getStyle(el, 'background-image') || + L.DomUtil.getStyle(el, 'backgroundImage'); // IE8 + + document.body.removeChild(el); + + return path.indexOf('url') === 0 ? + path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : ''; + } +}); + + + +/* + * @class Marker + * @inherits Interactive layer + * @aka L.Marker + * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`. + * + * @example + * + * ```js + * L.marker([50.5, 30.5]).addTo(map); + * ``` + */ + +L.Marker = L.Layer.extend({ + + // @section + // @aka Marker options + options: { + // @option icon: Icon = * + // Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used. + icon: new L.Icon.Default(), + + // Option inherited from "Interactive layer" abstract class + interactive: true, + + // @option draggable: Boolean = false + // Whether the marker is draggable with mouse/touch or not. + draggable: false, + + // @option keyboard: Boolean = true + // Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. + keyboard: true, + + // @option title: String = '' + // Text for the browser tooltip that appear on marker hover (no tooltip by default). + title: '', + + // @option alt: String = '' + // Text for the `alt` attribute of the icon image (useful for accessibility). + alt: '', + + // @option zIndexOffset: Number = 0 + // By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively). + zIndexOffset: 0, + + // @option opacity: Number = 1.0 + // The opacity of the marker. + opacity: 1, + + // @option riseOnHover: Boolean = false + // If `true`, the marker will get on top of others when you hover the mouse over it. + riseOnHover: false, + + // @option riseOffset: Number = 250 + // The z-index offset used for the `riseOnHover` feature. + riseOffset: 250, + + // @option pane: String = 'markerPane' + // `Map pane` where the markers icon will be added. + pane: 'markerPane', + + // FIXME: shadowPane is no longer a valid option + nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'] + }, + + /* @section + * + * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods: + */ + + initialize: function (latlng, options) { + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + }, + + onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation; + + if (this._zoomAnimated) { + map.on('zoomanim', this._animateZoom, this); + } + + this._initIcon(); + this.update(); + }, + + onRemove: function (map) { + if (this.dragging && this.dragging.enabled()) { + this.options.draggable = true; + this.dragging.removeHooks(); + } + + if (this._zoomAnimated) { + map.off('zoomanim', this._animateZoom, this); + } + + this._removeIcon(); + this._removeShadow(); + }, + + getEvents: function () { + return { + zoom: this.update, + viewreset: this.update + }; + }, + + // @method getLatLng: LatLng + // Returns the current geographical position of the marker. + getLatLng: function () { + return this._latlng; + }, + + // @method setLatLng(latlng: LatLng): this + // Changes the marker position to the given point. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = L.latLng(latlng); + this.update(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); + }, + + // @method setZIndexOffset(offset: Number): this + // Changes the [zIndex offset](#marker-zindexoffset) of the marker. + setZIndexOffset: function (offset) { + this.options.zIndexOffset = offset; + return this.update(); + }, + + // @method setIcon(icon: Icon): this + // Changes the marker icon. + setIcon: function (icon) { + + this.options.icon = icon; + + if (this._map) { + this._initIcon(); + this.update(); + } + + if (this._popup) { + this.bindPopup(this._popup, this._popup.options); + } + + return this; + }, + + getElement: function () { + return this._icon; + }, + + update: function () { + + if (this._icon) { + var pos = this._map.latLngToLayerPoint(this._latlng).round(); + this._setPos(pos); + } + + return this; + }, + + _initIcon: function () { + var options = this.options, + classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + var icon = options.icon.createIcon(this._icon), + addIcon = false; + + // if we're not reusing the icon, remove the old one and init new one + if (icon !== this._icon) { + if (this._icon) { + this._removeIcon(); + } + addIcon = true; + + if (options.title) { + icon.title = options.title; + } + if (options.alt) { + icon.alt = options.alt; + } + } + + L.DomUtil.addClass(icon, classToAdd); + + if (options.keyboard) { + icon.tabIndex = '0'; + } + + this._icon = icon; + + if (options.riseOnHover) { + this.on({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + var newShadow = options.icon.createShadow(this._shadow), + addShadow = false; + + if (newShadow !== this._shadow) { + this._removeShadow(); + addShadow = true; + } + + if (newShadow) { + L.DomUtil.addClass(newShadow, classToAdd); + newShadow.alt = ''; + } + this._shadow = newShadow; + + + if (options.opacity < 1) { + this._updateOpacity(); + } + + + if (addIcon) { + this.getPane().appendChild(this._icon); + } + this._initInteraction(); + if (newShadow && addShadow) { + this.getPane('shadowPane').appendChild(this._shadow); + } + }, + + _removeIcon: function () { + if (this.options.riseOnHover) { + this.off({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + L.DomUtil.remove(this._icon); + this.removeInteractiveTarget(this._icon); + + this._icon = null; + }, + + _removeShadow: function () { + if (this._shadow) { + L.DomUtil.remove(this._shadow); + } + this._shadow = null; + }, + + _setPos: function (pos) { + L.DomUtil.setPosition(this._icon, pos); + + if (this._shadow) { + L.DomUtil.setPosition(this._shadow, pos); + } + + this._zIndex = pos.y + this.options.zIndexOffset; + + this._resetZIndex(); + }, + + _updateZIndex: function (offset) { + this._icon.style.zIndex = this._zIndex + offset; + }, + + _animateZoom: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); + + this._setPos(pos); + }, + + _initInteraction: function () { + + if (!this.options.interactive) { return; } + + L.DomUtil.addClass(this._icon, 'leaflet-interactive'); + + this.addInteractiveTarget(this._icon); + + if (L.Handler.MarkerDrag) { + var draggable = this.options.draggable; + if (this.dragging) { + draggable = this.dragging.enabled(); + this.dragging.disable(); + } + + this.dragging = new L.Handler.MarkerDrag(this); + + if (draggable) { + this.dragging.enable(); + } + } + }, + + // @method setOpacity(opacity: Number): this + // Changes the opacity of the marker. + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._map) { + this._updateOpacity(); + } + + return this; + }, + + _updateOpacity: function () { + var opacity = this.options.opacity; + + L.DomUtil.setOpacity(this._icon, opacity); + + if (this._shadow) { + L.DomUtil.setOpacity(this._shadow, opacity); + } + }, + + _bringToFront: function () { + this._updateZIndex(this.options.riseOffset); + }, + + _resetZIndex: function () { + this._updateZIndex(0); + }, + + _getPopupAnchor: function () { + return this.options.icon.options.popupAnchor || [0, 0]; + }, + + _getTooltipAnchor: function () { + return this.options.icon.options.tooltipAnchor || [0, 0]; + } +}); + + +// factory L.marker(latlng: LatLng, options? : Marker options) + +// @factory L.marker(latlng: LatLng, options? : Marker options) +// Instantiates a Marker object given a geographical point and optionally an options object. +L.marker = function (latlng, options) { + return new L.Marker(latlng, options); +}; + + + +/* + * @class DivIcon + * @aka L.DivIcon + * @inherits Icon + * + * Represents a lightweight icon for markers that uses a simple `
` + * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options. + * + * @example + * ```js + * var myIcon = L.divIcon({className: 'my-div-icon'}); + * // you can set .my-div-icon styles in CSS + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow. + */ + +L.DivIcon = L.Icon.extend({ + options: { + // @section + // @aka DivIcon options + iconSize: [12, 12], // also can be set through CSS + + // iconAnchor: (Point), + // popupAnchor: (Point), + + // @option html: String = '' + // Custom HTML code to put inside the div element, empty by default. + html: false, + + // @option bgPos: Point = [0, 0] + // Optional relative position of the background, in pixels + bgPos: null, + + className: 'leaflet-div-icon' + }, + + createIcon: function (oldIcon) { + var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), + options = this.options; + + div.innerHTML = options.html !== false ? options.html : ''; + + if (options.bgPos) { + var bgPos = L.point(options.bgPos); + div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px'; + } + this._setIconStyles(div, 'icon'); + + return div; + }, + + createShadow: function () { + return null; + } +}); + +// @factory L.divIcon(options: DivIcon options) +// Creates a `DivIcon` instance with the given options. +L.divIcon = function (options) { + return new L.DivIcon(options); +}; + + + +/* + * @class DivOverlay + * @inherits Layer + * @aka L.DivOverlay + * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins. + */ + +// @namespace DivOverlay +L.DivOverlay = L.Layer.extend({ + + // @section + // @aka DivOverlay options + options: { + // @option offset: Point = Point(0, 7) + // The offset of the popup position. Useful to control the anchor + // of the popup when opening it on some overlays. + offset: [0, 7], + + // @option className: String = '' + // A custom CSS class name to assign to the popup. + className: '', + + // @option pane: String = 'popupPane' + // `Map pane` where the popup will be added. + pane: 'popupPane' + }, + + initialize: function (options, source) { + L.setOptions(this, options); + + this._source = source; + }, + + onAdd: function (map) { + this._zoomAnimated = map._zoomAnimated; + + if (!this._container) { + this._initLayout(); + } + + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + } + + clearTimeout(this._removeTimeout); + this.getPane().appendChild(this._container); + this.update(); + + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 1); + } + + this.bringToFront(); + }, + + onRemove: function (map) { + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); + } else { + L.DomUtil.remove(this._container); + } + }, + + // @namespace Popup + // @method getLatLng: LatLng + // Returns the geographical point of popup. + getLatLng: function () { + return this._latlng; + }, + + // @method setLatLng(latlng: LatLng): this + // Sets the geographical point where the popup will open. + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + if (this._map) { + this._updatePosition(); + this._adjustPan(); + } + return this; + }, + + // @method getContent: String|HTMLElement + // Returns the content of the popup. + getContent: function () { + return this._content; + }, + + // @method setContent(htmlContent: String|HTMLElement|Function): this + // Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup. + setContent: function (content) { + this._content = content; + this.update(); + return this; + }, + + // @method getElement: String|HTMLElement + // Alias for [getContent()](#popup-getcontent) + getElement: function () { + return this._container; + }, + + // @method update: null + // Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. + update: function () { + if (!this._map) { return; } + + this._container.style.visibility = 'hidden'; + + this._updateContent(); + this._updateLayout(); + this._updatePosition(); + + this._container.style.visibility = ''; + + this._adjustPan(); + }, + + getEvents: function () { + var events = { + zoom: this._updatePosition, + viewreset: this._updatePosition + }; + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + return events; + }, + + // @method isOpen: Boolean + // Returns `true` when the popup is visible on the map. + isOpen: function () { + return !!this._map && this._map.hasLayer(this); + }, + + // @method bringToFront: this + // Brings this popup in front of other popups (in the same map pane). + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); + } + return this; + }, + + // @method bringToBack: this + // Brings this popup to the back of other popups (in the same map pane). + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); + } + return this; + }, + + _updateContent: function () { + if (!this._content) { return; } + + var node = this._contentNode; + var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content; + + if (typeof content === 'string') { + node.innerHTML = content; + } else { + while (node.hasChildNodes()) { + node.removeChild(node.firstChild); + } + node.appendChild(content); + } + this.fire('contentupdate'); + }, + + _updatePosition: function () { + if (!this._map) { return; } + + var pos = this._map.latLngToLayerPoint(this._latlng), + offset = L.point(this.options.offset), + anchor = this._getAnchor(); + + if (this._zoomAnimated) { + L.DomUtil.setPosition(this._container, pos.add(anchor)); + } else { + offset = offset.add(pos).add(anchor); + } + + var bottom = this._containerBottom = -offset.y, + left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; + + // bottom position the popup in case the height of the popup changes (images loading etc) + this._container.style.bottom = bottom + 'px'; + this._container.style.left = left + 'px'; + }, + + _getAnchor: function () { + return [0, 0]; + } + +}); + + + +/* + * @class Popup + * @inherits DivOverlay + * @aka L.Popup + * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to + * open popups while making sure that only one popup is open at one time + * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want. + * + * @example + * + * If you want to just bind a popup to marker click and then open it, it's really easy: + * + * ```js + * marker.bindPopup(popupContent).openPopup(); + * ``` + * Path overlays like polylines also have a `bindPopup` method. + * Here's a more complicated way to open a popup on a map: + * + * ```js + * var popup = L.popup() + * .setLatLng(latlng) + * .setContent('

Hello world!
This is a nice popup.

') + * .openOn(map); + * ``` + */ + + +// @namespace Popup +L.Popup = L.DivOverlay.extend({ + + // @section + // @aka Popup options + options: { + // @option maxWidth: Number = 300 + // Max width of the popup, in pixels. + maxWidth: 300, + + // @option minWidth: Number = 50 + // Min width of the popup, in pixels. + minWidth: 50, + + // @option maxHeight: Number = null + // If set, creates a scrollable container of the given height + // inside a popup if its content exceeds it. + maxHeight: null, + + // @option autoPan: Boolean = true + // Set it to `false` if you don't want the map to do panning animation + // to fit the opened popup. + autoPan: true, + + // @option autoPanPaddingTopLeft: Point = null + // The margin between the popup and the top left corner of the map + // view after autopanning was performed. + autoPanPaddingTopLeft: null, + + // @option autoPanPaddingBottomRight: Point = null + // The margin between the popup and the bottom right corner of the map + // view after autopanning was performed. + autoPanPaddingBottomRight: null, + + // @option autoPanPadding: Point = Point(5, 5) + // Equivalent of setting both top left and bottom right autopan padding to the same value. + autoPanPadding: [5, 5], + + // @option keepInView: Boolean = false + // Set it to `true` if you want to prevent users from panning the popup + // off of the screen while it is open. + keepInView: false, + + // @option closeButton: Boolean = true + // Controls the presence of a close button in the popup. + closeButton: true, + + // @option autoClose: Boolean = true + // Set it to `false` if you want to override the default behavior of + // the popup closing when user clicks the map (set globally by + // the Map's [closePopupOnClick](#map-closepopuponclick) option). + autoClose: true, + + // @option className: String = '' + // A custom CSS class name to assign to the popup. + className: '' + }, + + // @namespace Popup + // @method openOn(map: Map): this + // Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`. + openOn: function (map) { + map.openPopup(this); + return this; + }, + + onAdd: function (map) { + L.DivOverlay.prototype.onAdd.call(this, map); + + // @namespace Map + // @section Popup events + // @event popupopen: PopupEvent + // Fired when a popup is opened in the map + map.fire('popupopen', {popup: this}); + + if (this._source) { + // @namespace Layer + // @section Popup events + // @event popupopen: PopupEvent + // Fired when a popup bound to this layer is opened + this._source.fire('popupopen', {popup: this}, true); + // For non-path layers, we toggle the popup when clicking + // again the layer, so prevent the map to reopen it. + if (!(this._source instanceof L.Path)) { + this._source.on('preclick', L.DomEvent.stopPropagation); + } + } + }, + + onRemove: function (map) { + L.DivOverlay.prototype.onRemove.call(this, map); + + // @namespace Map + // @section Popup events + // @event popupclose: PopupEvent + // Fired when a popup in the map is closed + map.fire('popupclose', {popup: this}); + + if (this._source) { + // @namespace Layer + // @section Popup events + // @event popupclose: PopupEvent + // Fired when a popup bound to this layer is closed + this._source.fire('popupclose', {popup: this}, true); + if (!(this._source instanceof L.Path)) { + this._source.off('preclick', L.DomEvent.stopPropagation); + } + } + }, + + getEvents: function () { + var events = L.DivOverlay.prototype.getEvents.call(this); + + if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { + events.preclick = this._close; + } + + if (this.options.keepInView) { + events.moveend = this._adjustPan; + } + + return events; + }, + + _close: function () { + if (this._map) { + this._map.closePopup(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-popup', + container = this._container = L.DomUtil.create('div', + prefix + ' ' + (this.options.className || '') + + ' leaflet-zoom-animated'); + + if (this.options.closeButton) { + var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); + closeButton.href = '#close'; + closeButton.innerHTML = '×'; + + L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); + } + + var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container); + this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); + + L.DomEvent + .disableClickPropagation(wrapper) + .disableScrollPropagation(this._contentNode) + .on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); + + this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); + this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); + }, + + _updateLayout: function () { + var container = this._contentNode, + style = container.style; + + style.width = ''; + style.whiteSpace = 'nowrap'; + + var width = container.offsetWidth; + width = Math.min(width, this.options.maxWidth); + width = Math.max(width, this.options.minWidth); + + style.width = (width + 1) + 'px'; + style.whiteSpace = ''; + + style.height = ''; + + var height = container.offsetHeight, + maxHeight = this.options.maxHeight, + scrolledClass = 'leaflet-popup-scrolled'; + + if (maxHeight && height > maxHeight) { + style.height = maxHeight + 'px'; + L.DomUtil.addClass(container, scrolledClass); + } else { + L.DomUtil.removeClass(container, scrolledClass); + } + + this._containerWidth = this._container.offsetWidth; + }, + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center), + anchor = this._getAnchor(); + L.DomUtil.setPosition(this._container, pos.add(anchor)); + }, + + _adjustPan: function () { + if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; } + + var map = this._map, + marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0, + containerHeight = this._container.offsetHeight + marginBottom, + containerWidth = this._containerWidth, + layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); + + layerPos._add(L.DomUtil.getPosition(this._container)); + + var containerPos = map.layerPointToContainerPoint(layerPos), + padding = L.point(this.options.autoPanPadding), + paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), + paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), + size = map.getSize(), + dx = 0, + dy = 0; + + if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right + dx = containerPos.x + containerWidth - size.x + paddingBR.x; + } + if (containerPos.x - dx - paddingTL.x < 0) { // left + dx = containerPos.x - paddingTL.x; + } + if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom + dy = containerPos.y + containerHeight - size.y + paddingBR.y; + } + if (containerPos.y - dy - paddingTL.y < 0) { // top + dy = containerPos.y - paddingTL.y; + } + + // @namespace Map + // @section Popup events + // @event autopanstart: Event + // Fired when the map starts autopanning when opening a popup. + if (dx || dy) { + map + .fire('autopanstart') + .panBy([dx, dy]); + } + }, + + _onCloseButtonClick: function (e) { + this._close(); + L.DomEvent.stop(e); + }, + + _getAnchor: function () { + // Where should we anchor the popup on the source layer? + return L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]); + } + +}); + +// @namespace Popup +// @factory L.popup(options?: Popup options, source?: Layer) +// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers. +L.popup = function (options, source) { + return new L.Popup(options, source); +}; + + +/* @namespace Map + * @section Interaction Options + * @option closePopupOnClick: Boolean = true + * Set it to `false` if you don't want popups to close when user clicks the map. + */ +L.Map.mergeOptions({ + closePopupOnClick: true +}); + + +// @namespace Map +// @section Methods for Layers and Controls +L.Map.include({ + // @method openPopup(popup: Popup): this + // Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). + // @alternative + // @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this + // Creates a popup with the specified content and options and opens it in the given point on a map. + openPopup: function (popup, latlng, options) { + if (!(popup instanceof L.Popup)) { + popup = new L.Popup(options).setContent(popup); + } + + if (latlng) { + popup.setLatLng(latlng); + } + + if (this.hasLayer(popup)) { + return this; + } + + if (this._popup && this._popup.options.autoClose) { + this.closePopup(); + } + + this._popup = popup; + return this.addLayer(popup); + }, + + // @method closePopup(popup?: Popup): this + // Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one). + closePopup: function (popup) { + if (!popup || popup === this._popup) { + popup = this._popup; + this._popup = null; + } + if (popup) { + this.removeLayer(popup); + } + return this; + } +}); + +/* + * @namespace Layer + * @section Popup methods example + * + * All layers share a set of methods convenient for binding popups to it. + * + * ```js + * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map); + * layer.openPopup(); + * layer.closePopup(); + * ``` + * + * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened. + */ + +// @section Popup methods +L.Layer.include({ + + // @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this + // Binds a popup to the layer with the passed `content` and sets up the + // neccessary event listeners. If a `Function` is passed it will receive + // the layer as the first argument and should return a `String` or `HTMLElement`. + bindPopup: function (content, options) { + + if (content instanceof L.Popup) { + L.setOptions(content, options); + this._popup = content; + content._source = this; + } else { + if (!this._popup || options) { + this._popup = new L.Popup(options, this); + } + this._popup.setContent(content); + } + + if (!this._popupHandlersAdded) { + this.on({ + click: this._openPopup, + remove: this.closePopup, + move: this._movePopup + }); + this._popupHandlersAdded = true; + } + + return this; + }, + + // @method unbindPopup(): this + // Removes the popup previously bound with `bindPopup`. + unbindPopup: function () { + if (this._popup) { + this.off({ + click: this._openPopup, + remove: this.closePopup, + move: this._movePopup + }); + this._popupHandlersAdded = false; + this._popup = null; + } + return this; + }, + + // @method openPopup(latlng?: LatLng): this + // Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed. + openPopup: function (layer, latlng) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + + if (layer instanceof L.FeatureGroup) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } + + if (this._popup && this._map) { + // set popup source to this layer + this._popup._source = layer; + + // update the popup (content, layout, ect...) + this._popup.update(); + + // open the popup on the map + this._map.openPopup(this._popup, latlng); + } + + return this; + }, + + // @method closePopup(): this + // Closes the popup bound to this layer if it is open. + closePopup: function () { + if (this._popup) { + this._popup._close(); + } + return this; + }, + + // @method togglePopup(): this + // Opens or closes the popup bound to this layer depending on its current state. + togglePopup: function (target) { + if (this._popup) { + if (this._popup._map) { + this.closePopup(); + } else { + this.openPopup(target); + } + } + return this; + }, + + // @method isPopupOpen(): boolean + // Returns `true` if the popup bound to this layer is currently open. + isPopupOpen: function () { + return (this._popup ? this._popup.isOpen() : false); + }, + + // @method setPopupContent(content: String|HTMLElement|Popup): this + // Sets the content of the popup bound to this layer. + setPopupContent: function (content) { + if (this._popup) { + this._popup.setContent(content); + } + return this; + }, + + // @method getPopup(): Popup + // Returns the popup bound to this layer. + getPopup: function () { + return this._popup; + }, + + _openPopup: function (e) { + var layer = e.layer || e.target; + + if (!this._popup) { + return; + } + + if (!this._map) { + return; + } + + // prevent map click + L.DomEvent.stop(e); + + // if this inherits from Path its a vector and we can just + // open the popup at the new location + if (layer instanceof L.Path) { + this.openPopup(e.layer || e.target, e.latlng); + return; + } + + // otherwise treat it like a marker and figure out + // if we should toggle it open/closed + if (this._map.hasLayer(this._popup) && this._popup._source === layer) { + this.closePopup(); + } else { + this.openPopup(layer, e.latlng); + } + }, + + _movePopup: function (e) { + this._popup.setLatLng(e.latlng); + } +}); + + + +/* + * @class Tooltip + * @inherits DivOverlay + * @aka L.Tooltip + * Used to display small texts on top of map layers. + * + * @example + * + * ```js + * marker.bindTooltip("my tooltip text").openTooltip(); + * ``` + * Note about tooltip offset. Leaflet takes two options in consideration + * for computing tooltip offseting: + * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. + * Add a positive x offset to move the tooltip to the right, and a positive y offset to + * move it to the bottom. Negatives will move to the left and top. + * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You + * should adapt this value if you use a custom icon. + */ + + +// @namespace Tooltip +L.Tooltip = L.DivOverlay.extend({ + + // @section + // @aka Tooltip options + options: { + // @option pane: String = 'tooltipPane' + // `Map pane` where the tooltip will be added. + pane: 'tooltipPane', + + // @option offset: Point = Point(0, 0) + // Optional offset of the tooltip position. + offset: [0, 0], + + // @option direction: String = 'auto' + // Direction where to open the tooltip. Possible values are: `right`, `left`, + // `top`, `bottom`, `center`, `auto`. + // `auto` will dynamicaly switch between `right` and `left` according to the tooltip + // position on the map. + direction: 'auto', + + // @option permanent: Boolean = false + // Whether to open the tooltip permanently or only on mouseover. + permanent: false, + + // @option sticky: Boolean = false + // If true, the tooltip will follow the mouse instead of being fixed at the feature center. + sticky: false, + + // @option interactive: Boolean = false + // If true, the tooltip will listen to the feature events. + interactive: false, + + // @option opacity: Number = 0.9 + // Tooltip container opacity. + opacity: 0.9 + }, + + onAdd: function (map) { + L.DivOverlay.prototype.onAdd.call(this, map); + this.setOpacity(this.options.opacity); + + // @namespace Map + // @section Tooltip events + // @event tooltipopen: TooltipEvent + // Fired when a tooltip is opened in the map. + map.fire('tooltipopen', {tooltip: this}); + + if (this._source) { + // @namespace Layer + // @section Tooltip events + // @event tooltipopen: TooltipEvent + // Fired when a tooltip bound to this layer is opened. + this._source.fire('tooltipopen', {tooltip: this}, true); + } + }, + + onRemove: function (map) { + L.DivOverlay.prototype.onRemove.call(this, map); + + // @namespace Map + // @section Tooltip events + // @event tooltipclose: TooltipEvent + // Fired when a tooltip in the map is closed. + map.fire('tooltipclose', {tooltip: this}); + + if (this._source) { + // @namespace Layer + // @section Tooltip events + // @event tooltipclose: TooltipEvent + // Fired when a tooltip bound to this layer is closed. + this._source.fire('tooltipclose', {tooltip: this}, true); + } + }, + + getEvents: function () { + var events = L.DivOverlay.prototype.getEvents.call(this); + + if (L.Browser.touch && !this.options.permanent) { + events.preclick = this._close; + } + + return events; + }, + + _close: function () { + if (this._map) { + this._map.closeTooltip(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-tooltip', + className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + this._contentNode = this._container = L.DomUtil.create('div', className); + }, + + _updateLayout: function () {}, + + _adjustPan: function () {}, + + _setPosition: function (pos) { + var map = this._map, + container = this._container, + centerPoint = map.latLngToContainerPoint(map.getCenter()), + tooltipPoint = map.layerPointToContainerPoint(pos), + direction = this.options.direction, + tooltipWidth = container.offsetWidth, + tooltipHeight = container.offsetHeight, + offset = L.point(this.options.offset), + anchor = this._getAnchor(); + + if (direction === 'top') { + pos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true)); + } else if (direction === 'bottom') { + pos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true)); + } else if (direction === 'center') { + pos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true)); + } else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) { + direction = 'right'; + pos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true)); + } else { + direction = 'left'; + pos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true)); + } + + L.DomUtil.removeClass(container, 'leaflet-tooltip-right'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-left'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-top'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-bottom'); + L.DomUtil.addClass(container, 'leaflet-tooltip-' + direction); + L.DomUtil.setPosition(container, pos); + }, + + _updatePosition: function () { + var pos = this._map.latLngToLayerPoint(this._latlng); + this._setPosition(pos); + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._container) { + L.DomUtil.setOpacity(this._container, opacity); + } + }, + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); + this._setPosition(pos); + }, + + _getAnchor: function () { + // Where should we anchor the tooltip on the source layer? + return L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]); + } + +}); + +// @namespace Tooltip +// @factory L.tooltip(options?: Tooltip options, source?: Layer) +// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers. +L.tooltip = function (options, source) { + return new L.Tooltip(options, source); +}; + +// @namespace Map +// @section Methods for Layers and Controls +L.Map.include({ + + // @method openTooltip(tooltip: Tooltip): this + // Opens the specified tooltip. + // @alternative + // @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this + // Creates a tooltip with the specified content and options and open it. + openTooltip: function (tooltip, latlng, options) { + if (!(tooltip instanceof L.Tooltip)) { + tooltip = new L.Tooltip(options).setContent(tooltip); + } + + if (latlng) { + tooltip.setLatLng(latlng); + } + + if (this.hasLayer(tooltip)) { + return this; + } + + return this.addLayer(tooltip); + }, + + // @method closeTooltip(tooltip?: Tooltip): this + // Closes the tooltip given as parameter. + closeTooltip: function (tooltip) { + if (tooltip) { + this.removeLayer(tooltip); + } + return this; + } + +}); + +/* + * @namespace Layer + * @section Tooltip methods example + * + * All layers share a set of methods convenient for binding tooltips to it. + * + * ```js + * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map); + * layer.openTooltip(); + * layer.closeTooltip(); + * ``` + */ + +// @section Tooltip methods +L.Layer.include({ + + // @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this + // Binds a tooltip to the layer with the passed `content` and sets up the + // neccessary event listeners. If a `Function` is passed it will receive + // the layer as the first argument and should return a `String` or `HTMLElement`. + bindTooltip: function (content, options) { + + if (content instanceof L.Tooltip) { + L.setOptions(content, options); + this._tooltip = content; + content._source = this; + } else { + if (!this._tooltip || options) { + this._tooltip = L.tooltip(options, this); + } + this._tooltip.setContent(content); + + } + + this._initTooltipInteractions(); + + if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) { + this.openTooltip(); + } + + return this; + }, + + // @method unbindTooltip(): this + // Removes the tooltip previously bound with `bindTooltip`. + unbindTooltip: function () { + if (this._tooltip) { + this._initTooltipInteractions(true); + this.closeTooltip(); + this._tooltip = null; + } + return this; + }, + + _initTooltipInteractions: function (remove) { + if (!remove && this._tooltipHandlersAdded) { return; } + var onOff = remove ? 'off' : 'on', + events = { + remove: this.closeTooltip, + move: this._moveTooltip + }; + if (!this._tooltip.options.permanent) { + events.mouseover = this._openTooltip; + events.mouseout = this.closeTooltip; + if (this._tooltip.options.sticky) { + events.mousemove = this._moveTooltip; + } + if (L.Browser.touch) { + events.click = this._openTooltip; + } + } else { + events.add = this._openTooltip; + } + this[onOff](events); + this._tooltipHandlersAdded = !remove; + }, + + // @method openTooltip(latlng?: LatLng): this + // Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed. + openTooltip: function (layer, latlng) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + + if (layer instanceof L.FeatureGroup) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } + + if (this._tooltip && this._map) { + + // set tooltip source to this layer + this._tooltip._source = layer; + + // update the tooltip (content, layout, ect...) + this._tooltip.update(); + + // open the tooltip on the map + this._map.openTooltip(this._tooltip, latlng); + + // Tooltip container may not be defined if not permanent and never + // opened. + if (this._tooltip.options.interactive && this._tooltip._container) { + L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable'); + this.addInteractiveTarget(this._tooltip._container); + } + } + + return this; + }, + + // @method closeTooltip(): this + // Closes the tooltip bound to this layer if it is open. + closeTooltip: function () { + if (this._tooltip) { + this._tooltip._close(); + if (this._tooltip.options.interactive && this._tooltip._container) { + L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable'); + this.removeInteractiveTarget(this._tooltip._container); + } + } + return this; + }, + + // @method toggleTooltip(): this + // Opens or closes the tooltip bound to this layer depending on its current state. + toggleTooltip: function (target) { + if (this._tooltip) { + if (this._tooltip._map) { + this.closeTooltip(); + } else { + this.openTooltip(target); + } + } + return this; + }, + + // @method isTooltipOpen(): boolean + // Returns `true` if the tooltip bound to this layer is currently open. + isTooltipOpen: function () { + return this._tooltip.isOpen(); + }, + + // @method setTooltipContent(content: String|HTMLElement|Tooltip): this + // Sets the content of the tooltip bound to this layer. + setTooltipContent: function (content) { + if (this._tooltip) { + this._tooltip.setContent(content); + } + return this; + }, + + // @method getTooltip(): Tooltip + // Returns the tooltip bound to this layer. + getTooltip: function () { + return this._tooltip; + }, + + _openTooltip: function (e) { + var layer = e.layer || e.target; + + if (!this._tooltip || !this._map) { + return; + } + this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined); + }, + + _moveTooltip: function (e) { + var latlng = e.latlng, containerPoint, layerPoint; + if (this._tooltip.options.sticky && e.originalEvent) { + containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent); + layerPoint = this._map.containerPointToLayerPoint(containerPoint); + latlng = this._map.layerPointToLatLng(layerPoint); + } + this._tooltip.setLatLng(latlng); + } +}); + + + +/* + * @class LayerGroup + * @aka L.LayerGroup + * @inherits Layer + * + * Used to group several layers and handle them as one. If you add it to the map, + * any layers added or removed from the group will be added/removed on the map as + * well. Extends `Layer`. + * + * @example + * + * ```js + * L.layerGroup([marker1, marker2]) + * .addLayer(polyline) + * .addTo(map); + * ``` + */ + +L.LayerGroup = L.Layer.extend({ + + initialize: function (layers) { + this._layers = {}; + + var i, len; + + if (layers) { + for (i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + } + }, + + // @method addLayer(layer: Layer): this + // Adds the given layer to the group. + addLayer: function (layer) { + var id = this.getLayerId(layer); + + this._layers[id] = layer; + + if (this._map) { + this._map.addLayer(layer); + } + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the group. + // @alternative + // @method removeLayer(id: Number): this + // Removes the layer with the given internal ID from the group. + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the group. + hasLayer: function (layer) { + return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers); + }, + + // @method clearLayers(): this + // Removes all the layers from the group. + clearLayers: function () { + for (var i in this._layers) { + this.removeLayer(this._layers[i]); + } + return this; + }, + + // @method invoke(methodName: String, …): this + // Calls `methodName` on every layer contained in this group, passing any + // additional parameters. Has no effect if the layers contained do not + // implement `methodName`. + invoke: function (methodName) { + var args = Array.prototype.slice.call(arguments, 1), + i, layer; + + for (i in this._layers) { + layer = this._layers[i]; + + if (layer[methodName]) { + layer[methodName].apply(layer, args); + } + } + + return this; + }, + + onAdd: function (map) { + for (var i in this._layers) { + map.addLayer(this._layers[i]); + } + }, + + onRemove: function (map) { + for (var i in this._layers) { + map.removeLayer(this._layers[i]); + } + }, + + // @method eachLayer(fn: Function, context?: Object): this + // Iterates over the layers of the group, optionally specifying context of the iterator function. + // ```js + // group.eachLayer(function (layer) { + // layer.bindPopup('Hello'); + // }); + // ``` + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + // @method getLayer(id: Number): Layer + // Returns the layer with the given internal ID. + getLayer: function (id) { + return this._layers[id]; + }, + + // @method getLayers(): Layer[] + // Returns an array of all the layers added to the group. + getLayers: function () { + var layers = []; + + for (var i in this._layers) { + layers.push(this._layers[i]); + } + return layers; + }, + + // @method setZIndex(zIndex: Number): this + // Calls `setZIndex` on every layer contained in this group, passing the z-index. + setZIndex: function (zIndex) { + return this.invoke('setZIndex', zIndex); + }, + + // @method getLayerId(layer: Layer): Number + // Returns the internal ID for a layer + getLayerId: function (layer) { + return L.stamp(layer); + } +}); + + +// @factory L.layerGroup(layers: Layer[]) +// Create a layer group, optionally given an initial set of layers. +L.layerGroup = function (layers) { + return new L.LayerGroup(layers); +}; + + + +/* + * @class FeatureGroup + * @aka L.FeatureGroup + * @inherits LayerGroup + * + * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers: + * * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip)) + * * Events are propagated to the `FeatureGroup`, so if the group has an event + * handler, it will handle events from any of the layers. This includes mouse events + * and custom events. + * * Has `layeradd` and `layerremove` events + * + * @example + * + * ```js + * L.featureGroup([marker1, marker2, polyline]) + * .bindPopup('Hello world!') + * .on('click', function() { alert('Clicked on a member of the group!'); }) + * .addTo(map); + * ``` + */ + +L.FeatureGroup = L.LayerGroup.extend({ + + addLayer: function (layer) { + if (this.hasLayer(layer)) { + return this; + } + + layer.addEventParent(this); + + L.LayerGroup.prototype.addLayer.call(this, layer); + + // @event layeradd: LayerEvent + // Fired when a layer is added to this `FeatureGroup` + return this.fire('layeradd', {layer: layer}); + }, + + removeLayer: function (layer) { + if (!this.hasLayer(layer)) { + return this; + } + if (layer in this._layers) { + layer = this._layers[layer]; + } + + layer.removeEventParent(this); + + L.LayerGroup.prototype.removeLayer.call(this, layer); + + // @event layerremove: LayerEvent + // Fired when a layer is removed from this `FeatureGroup` + return this.fire('layerremove', {layer: layer}); + }, + + // @method setStyle(style: Path options): this + // Sets the given path options to each layer of the group that has a `setStyle` method. + setStyle: function (style) { + return this.invoke('setStyle', style); + }, + + // @method bringToFront(): this + // Brings the layer group to the top of all other layers + bringToFront: function () { + return this.invoke('bringToFront'); + }, + + // @method bringToBack(): this + // Brings the layer group to the top of all other layers + bringToBack: function () { + return this.invoke('bringToBack'); + }, + + // @method getBounds(): LatLngBounds + // Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). + getBounds: function () { + var bounds = new L.LatLngBounds(); + + for (var id in this._layers) { + var layer = this._layers[id]; + bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); + } + return bounds; + } +}); + +// @factory L.featureGroup(layers: Layer[]) +// Create a feature group, optionally given an initial set of layers. +L.featureGroup = function (layers) { + return new L.FeatureGroup(layers); +}; + + + +/* + * @class Renderer + * @inherits Layer + * @aka L.Renderer + * + * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the + * DOM container of the renderer, its bounds, and its zoom animation. + * + * A `Renderer` works as an implicit layer group for all `Path`s - the renderer + * itself can be added or removed to the map. All paths use a renderer, which can + * be implicit (the map will decide the type of renderer and use it automatically) + * or explicit (using the [`renderer`](#path-renderer) option of the path). + * + * Do not use this class directly, use `SVG` and `Canvas` instead. + * + * @event update: Event + * Fired when the renderer updates its bounds, center and zoom, for example when + * its map has moved + */ + +L.Renderer = L.Layer.extend({ + + // @section + // @aka Renderer options + options: { + // @option padding: Number = 0.1 + // How much to extend the clip area around the map view (relative to its size) + // e.g. 0.1 would be 10% of map view in each direction + padding: 0.1 + }, + + initialize: function (options) { + L.setOptions(this, options); + L.stamp(this); + this._layers = this._layers || {}; + }, + + onAdd: function () { + if (!this._container) { + this._initContainer(); // defined by renderer implementations + + if (this._zoomAnimated) { + L.DomUtil.addClass(this._container, 'leaflet-zoom-animated'); + } + } + + this.getPane().appendChild(this._container); + this._update(); + this.on('update', this._updatePaths, this); + }, + + onRemove: function () { + L.DomUtil.remove(this._container); + this.off('update', this._updatePaths, this); + }, + + getEvents: function () { + var events = { + viewreset: this._reset, + zoom: this._onZoom, + moveend: this._update, + zoomend: this._onZoomEnd + }; + if (this._zoomAnimated) { + events.zoomanim = this._onAnimZoom; + } + return events; + }, + + _onAnimZoom: function (ev) { + this._updateTransform(ev.center, ev.zoom); + }, + + _onZoom: function () { + this._updateTransform(this._map.getCenter(), this._map.getZoom()); + }, + + _updateTransform: function (center, zoom) { + var scale = this._map.getZoomScale(zoom, this._zoom), + position = L.DomUtil.getPosition(this._container), + viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding), + currentCenterPoint = this._map.project(this._center, zoom), + destCenterPoint = this._map.project(center, zoom), + centerOffset = destCenterPoint.subtract(currentCenterPoint), + + topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset); + + if (L.Browser.any3d) { + L.DomUtil.setTransform(this._container, topLeftOffset, scale); + } else { + L.DomUtil.setPosition(this._container, topLeftOffset); + } + }, + + _reset: function () { + this._update(); + this._updateTransform(this._center, this._zoom); + + for (var id in this._layers) { + this._layers[id]._reset(); + } + }, + + _onZoomEnd: function () { + for (var id in this._layers) { + this._layers[id]._project(); + } + }, + + _updatePaths: function () { + for (var id in this._layers) { + this._layers[id]._update(); + } + }, + + _update: function () { + // Update pixel bounds of renderer container (for positioning/sizing/clipping later) + // Subclasses are responsible of firing the 'update' event. + var p = this.options.padding, + size = this._map.getSize(), + min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round(); + + this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round()); + + this._center = this._map.getCenter(); + this._zoom = this._map.getZoom(); + } +}); + + +L.Map.include({ + // @namespace Map; @method getRenderer(layer: Path): Renderer + // Returns the instance of `Renderer` that should be used to render the given + // `Path`. It will ensure that the `renderer` options of the map and paths + // are respected, and that the renderers do exist on the map. + getRenderer: function (layer) { + // @namespace Path; @option renderer: Renderer + // Use this specific instance of `Renderer` for this path. Takes + // precedence over the map's [default renderer](#map-renderer). + var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer; + + if (!renderer) { + // @namespace Map; @option preferCanvas: Boolean = false + // Whether `Path`s should be rendered on a `Canvas` renderer. + // By default, all `Path`s are rendered in a `SVG` renderer. + renderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg(); + } + + if (!this.hasLayer(renderer)) { + this.addLayer(renderer); + } + return renderer; + }, + + _getPaneRenderer: function (name) { + if (name === 'overlayPane' || name === undefined) { + return false; + } + + var renderer = this._paneRenderers[name]; + if (renderer === undefined) { + renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name})); + this._paneRenderers[name] = renderer; + } + return renderer; + } +}); + + + +/* + * @class Path + * @aka L.Path + * @inherits Interactive layer + * + * An abstract class that contains options and constants shared between vector + * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`. + */ + +L.Path = L.Layer.extend({ + + // @section + // @aka Path options + options: { + // @option stroke: Boolean = true + // Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles. + stroke: true, + + // @option color: String = '#3388ff' + // Stroke color + color: '#3388ff', + + // @option weight: Number = 3 + // Stroke width in pixels + weight: 3, + + // @option opacity: Number = 1.0 + // Stroke opacity + opacity: 1, + + // @option lineCap: String= 'round' + // A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke. + lineCap: 'round', + + // @option lineJoin: String = 'round' + // A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke. + lineJoin: 'round', + + // @option dashArray: String = null + // A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashArray: null, + + // @option dashOffset: String = null + // A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashOffset: null, + + // @option fill: Boolean = depends + // Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles. + fill: false, + + // @option fillColor: String = * + // Fill color. Defaults to the value of the [`color`](#path-color) option + fillColor: null, + + // @option fillOpacity: Number = 0.2 + // Fill opacity. + fillOpacity: 0.2, + + // @option fillRule: String = 'evenodd' + // A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined. + fillRule: 'evenodd', + + // className: '', + + // Option inherited from "Interactive layer" abstract class + interactive: true + }, + + beforeAdd: function (map) { + // Renderer is set here because we need to call renderer.getEvents + // before this.getEvents. + this._renderer = map.getRenderer(this); + }, + + onAdd: function () { + this._renderer._initPath(this); + this._reset(); + this._renderer._addPath(this); + }, + + onRemove: function () { + this._renderer._removePath(this); + }, + + // @method redraw(): this + // Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. + redraw: function () { + if (this._map) { + this._renderer._updatePath(this); + } + return this; + }, + + // @method setStyle(style: Path options): this + // Changes the appearance of a Path based on the options in the `Path options` object. + setStyle: function (style) { + L.setOptions(this, style); + if (this._renderer) { + this._renderer._updateStyle(this); + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all path layers. + bringToFront: function () { + if (this._renderer) { + this._renderer._bringToFront(this); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all path layers. + bringToBack: function () { + if (this._renderer) { + this._renderer._bringToBack(this); + } + return this; + }, + + getElement: function () { + return this._path; + }, + + _reset: function () { + // defined in children classes + this._project(); + this._update(); + }, + + _clickTolerance: function () { + // used when doing hit detection for Canvas layers + return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0); + } +}); + + + +/* + * @namespace LineUtil + * + * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast. + */ + +L.LineUtil = { + + // Simplify polyline with vertex reduction and Douglas-Peucker simplification. + // Improves rendering performance dramatically by lessening the number of points to draw. + + // @function simplify(points: Point[], tolerance: Number): Point[] + // Dramatically reduces the number of points in a polyline while retaining + // its shape and returns a new array of simplified points, using the + // [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm). + // Used for a huge performance boost when processing/displaying Leaflet polylines for + // each zoom level and also reducing visual noise. tolerance affects the amount of + // simplification (lesser value means higher quality but slower and with more points). + // Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/). + simplify: function (points, tolerance) { + if (!tolerance || !points.length) { + return points.slice(); + } + + var sqTolerance = tolerance * tolerance; + + // stage 1: vertex reduction + points = this._reducePoints(points, sqTolerance); + + // stage 2: Douglas-Peucker simplification + points = this._simplifyDP(points, sqTolerance); + + return points; + }, + + // @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number + // Returns the distance between point `p` and segment `p1` to `p2`. + pointToSegmentDistance: function (p, p1, p2) { + return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); + }, + + // @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number + // Returns the closest point from a point `p` on a segment `p1` to `p2`. + closestPointOnSegment: function (p, p1, p2) { + return this._sqClosestPointOnSegment(p, p1, p2); + }, + + // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm + _simplifyDP: function (points, sqTolerance) { + + var len = points.length, + ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, + markers = new ArrayConstructor(len); + + markers[0] = markers[len - 1] = 1; + + this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + + var i, + newPoints = []; + + for (i = 0; i < len; i++) { + if (markers[i]) { + newPoints.push(points[i]); + } + } + + return newPoints; + }, + + _simplifyDPStep: function (points, markers, sqTolerance, first, last) { + + var maxSqDist = 0, + index, i, sqDist; + + for (i = first + 1; i <= last - 1; i++) { + sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + markers[index] = 1; + + this._simplifyDPStep(points, markers, sqTolerance, first, index); + this._simplifyDPStep(points, markers, sqTolerance, index, last); + } + }, + + // reduce points that are too close to each other to a single point + _reducePoints: function (points, sqTolerance) { + var reducedPoints = [points[0]]; + + for (var i = 1, prev = 0, len = points.length; i < len; i++) { + if (this._sqDist(points[i], points[prev]) > sqTolerance) { + reducedPoints.push(points[i]); + prev = i; + } + } + if (prev < len - 1) { + reducedPoints.push(points[len - 1]); + } + return reducedPoints; + }, + + + // @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean + // Clips the segment a to b by rectangular bounds with the + // [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm) + // (modifying the segment points directly!). Used by Leaflet to only show polyline + // points that are on the screen or near, increasing performance. + clipSegment: function (a, b, bounds, useLastCode, round) { + var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), + codeB = this._getBitCode(b, bounds), + + codeOut, p, newCode; + + // save 2nd code to avoid calculating it on the next segment + this._lastCode = codeB; + + while (true) { + // if a,b is inside the clip window (trivial accept) + if (!(codeA | codeB)) { + return [a, b]; + } + + // if a,b is outside the clip window (trivial reject) + if (codeA & codeB) { + return false; + } + + // other cases + codeOut = codeA || codeB; + p = this._getEdgeIntersection(a, b, codeOut, bounds, round); + newCode = this._getBitCode(p, bounds); + + if (codeOut === codeA) { + a = p; + codeA = newCode; + } else { + b = p; + codeB = newCode; + } + } + }, + + _getEdgeIntersection: function (a, b, code, bounds, round) { + var dx = b.x - a.x, + dy = b.y - a.y, + min = bounds.min, + max = bounds.max, + x, y; + + if (code & 8) { // top + x = a.x + dx * (max.y - a.y) / dy; + y = max.y; + + } else if (code & 4) { // bottom + x = a.x + dx * (min.y - a.y) / dy; + y = min.y; + + } else if (code & 2) { // right + x = max.x; + y = a.y + dy * (max.x - a.x) / dx; + + } else if (code & 1) { // left + x = min.x; + y = a.y + dy * (min.x - a.x) / dx; + } + + return new L.Point(x, y, round); + }, + + _getBitCode: function (p, bounds) { + var code = 0; + + if (p.x < bounds.min.x) { // left + code |= 1; + } else if (p.x > bounds.max.x) { // right + code |= 2; + } + + if (p.y < bounds.min.y) { // bottom + code |= 4; + } else if (p.y > bounds.max.y) { // top + code |= 8; + } + + return code; + }, + + // square distance (to avoid unnecessary Math.sqrt calls) + _sqDist: function (p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return dx * dx + dy * dy; + }, + + // return closest point on segment or distance to that point + _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { + var x = p1.x, + y = p1.y, + dx = p2.x - x, + dy = p2.y - y, + dot = dx * dx + dy * dy, + t; + + if (dot > 0) { + t = ((p.x - x) * dx + (p.y - y) * dy) / dot; + + if (t > 1) { + x = p2.x; + y = p2.y; + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return sqDist ? dx * dx + dy * dy : new L.Point(x, y); + } +}; + + + +/* + * @class Polyline + * @aka L.Polyline + * @inherits Path + * + * A class for drawing polyline overlays on a map. Extends `Path`. + * + * @example + * + * ```js + * // create a red polyline from an array of LatLng points + * var latlngs = [ + * [45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2] + * ]; + * + * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polyline + * map.fitBounds(polyline.getBounds()); + * ``` + * + * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape: + * + * ```js + * // create a red polyline from an array of arrays of LatLng points + * var latlngs = [ + * [[45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2]], + * [[40.78, -73.91], + * [41.83, -87.62], + * [32.76, -96.72]] + * ]; + * ``` + */ + +L.Polyline = L.Path.extend({ + + // @section + // @aka Polyline options + options: { + // @option smoothFactor: Number = 1.0 + // How much to simplify the polyline on each zoom level. More means + // better performance and smoother look, and less means more accurate representation. + smoothFactor: 1.0, + + // @option noClip: Boolean = false + // Disable polyline clipping. + noClip: false + }, + + initialize: function (latlngs, options) { + L.setOptions(this, options); + this._setLatLngs(latlngs); + }, + + // @method getLatLngs(): LatLng[] + // Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. + getLatLngs: function () { + return this._latlngs; + }, + + // @method setLatLngs(latlngs: LatLng[]): this + // Replaces all the points in the polyline with the given array of geographical points. + setLatLngs: function (latlngs) { + this._setLatLngs(latlngs); + return this.redraw(); + }, + + // @method isEmpty(): Boolean + // Returns `true` if the Polyline has no LatLngs. + isEmpty: function () { + return !this._latlngs.length; + }, + + closestLayerPoint: function (p) { + var minDistance = Infinity, + minPoint = null, + closest = L.LineUtil._sqClosestPointOnSegment, + p1, p2; + + for (var j = 0, jLen = this._parts.length; j < jLen; j++) { + var points = this._parts[j]; + + for (var i = 1, len = points.length; i < len; i++) { + p1 = points[i - 1]; + p2 = points[i]; + + var sqDist = closest(p, p1, p2, true); + + if (sqDist < minDistance) { + minDistance = sqDist; + minPoint = closest(p, p1, p2); + } + } + } + if (minPoint) { + minPoint.distance = Math.sqrt(minDistance); + } + return minPoint; + }, + + // @method getCenter(): LatLng + // Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline. + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, halfDist, segDist, dist, p1, p2, ratio, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polyline centroid algorithm; only uses the first ring if there are multiple + + for (i = 0, halfDist = 0; i < len - 1; i++) { + halfDist += points[i].distanceTo(points[i + 1]) / 2; + } + + // The line is so small in the current view that all points are on the same pixel. + if (halfDist === 0) { + return this._map.layerPointToLatLng(points[0]); + } + + for (i = 0, dist = 0; i < len - 1; i++) { + p1 = points[i]; + p2 = points[i + 1]; + segDist = p1.distanceTo(p2); + dist += segDist; + + if (dist > halfDist) { + ratio = (dist - halfDist) / segDist; + return this._map.layerPointToLatLng([ + p2.x - ratio * (p2.x - p1.x), + p2.y - ratio * (p2.y - p1.y) + ]); + } + } + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + return this._bounds; + }, + + // @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this + // Adds a given point to the polyline. By default, adds to the first ring of + // the polyline in case of a multi-polyline, but can be overridden by passing + // a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)). + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); + latlng = L.latLng(latlng); + latlngs.push(latlng); + this._bounds.extend(latlng); + return this.redraw(); + }, + + _setLatLngs: function (latlngs) { + this._bounds = new L.LatLngBounds(); + this._latlngs = this._convertLatLngs(latlngs); + }, + + _defaultShape: function () { + return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + + // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way + _convertLatLngs: function (latlngs) { + var result = [], + flat = L.Polyline._flat(latlngs); + + for (var i = 0, len = latlngs.length; i < len; i++) { + if (flat) { + result[i] = L.latLng(latlngs[i]); + this._bounds.extend(result[i]); + } else { + result[i] = this._convertLatLngs(latlngs[i]); + } + } + + return result; + }, + + _project: function () { + var pxBounds = new L.Bounds(); + this._rings = []; + this._projectLatlngs(this._latlngs, this._rings, pxBounds); + + var w = this._clickTolerance(), + p = new L.Point(w, w); + + if (this._bounds.isValid() && pxBounds.isValid()) { + pxBounds.min._subtract(p); + pxBounds.max._add(p); + this._pxBounds = pxBounds; + } + }, + + // recursively turns latlngs into a set of rings with projected coordinates + _projectLatlngs: function (latlngs, result, projectedBounds) { + var flat = latlngs[0] instanceof L.LatLng, + len = latlngs.length, + i, ring; + + if (flat) { + ring = []; + for (i = 0; i < len; i++) { + ring[i] = this._map.latLngToLayerPoint(latlngs[i]); + projectedBounds.extend(ring[i]); + } + result.push(ring); + } else { + for (i = 0; i < len; i++) { + this._projectLatlngs(latlngs[i], result, projectedBounds); + } + } + }, + + // clip polyline by renderer bounds so that we have less to render for performance + _clipPoints: function () { + var bounds = this._renderer._bounds; + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + var parts = this._parts, + i, j, k, len, len2, segment, points; + + for (i = 0, k = 0, len = this._rings.length; i < len; i++) { + points = this._rings[i]; + + for (j = 0, len2 = points.length; j < len2 - 1; j++) { + segment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true); + + if (!segment) { continue; } + + parts[k] = parts[k] || []; + parts[k].push(segment[0]); + + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) { + parts[k].push(segment[1]); + k++; + } + } + } + }, + + // simplify each clipped part of the polyline for performance + _simplifyPoints: function () { + var parts = this._parts, + tolerance = this.options.smoothFactor; + + for (var i = 0, len = parts.length; i < len; i++) { + parts[i] = L.LineUtil.simplify(parts[i], tolerance); + } + }, + + _update: function () { + if (!this._map) { return; } + + this._clipPoints(); + this._simplifyPoints(); + this._updatePath(); + }, + + _updatePath: function () { + this._renderer._updatePoly(this); + } +}); + +// @factory L.polyline(latlngs: LatLng[], options?: Polyline options) +// Instantiates a polyline object given an array of geographical points and +// optionally an options object. You can create a `Polyline` object with +// multiple separate lines (`MultiPolyline`) by passing an array of arrays +// of geographic points. +L.polyline = function (latlngs, options) { + return new L.Polyline(latlngs, options); +}; + +L.Polyline._flat = function (latlngs) { + // true if it's a flat array of latlngs; false if nested + return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); +}; + + + +/* + * @namespace PolyUtil + * Various utility functions for polygon geometries. + */ + +L.PolyUtil = {}; + +/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[] + * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)). + * Used by Leaflet to only show polygon points that are on the screen or near, increasing + * performance. Note that polygon points needs different algorithm for clipping + * than polyline, so there's a seperate method for it. + */ +L.PolyUtil.clipPolygon = function (points, bounds, round) { + var clippedPoints, + edges = [1, 4, 2, 8], + i, j, k, + a, b, + len, edge, p, + lu = L.LineUtil; + + for (i = 0, len = points.length; i < len; i++) { + points[i]._code = lu._getBitCode(points[i], bounds); + } + + // for each edge (left, bottom, right, top) + for (k = 0; k < 4; k++) { + edge = edges[k]; + clippedPoints = []; + + for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { + a = points[i]; + b = points[j]; + + // if a is inside the clip window + if (!(a._code & edge)) { + // if b is outside the clip window (a->b goes out of screen) + if (b._code & edge) { + p = lu._getEdgeIntersection(b, a, edge, bounds, round); + p._code = lu._getBitCode(p, bounds); + clippedPoints.push(p); + } + clippedPoints.push(a); + + // else if b is inside the clip window (a->b enters the screen) + } else if (!(b._code & edge)) { + p = lu._getEdgeIntersection(b, a, edge, bounds, round); + p._code = lu._getBitCode(p, bounds); + clippedPoints.push(p); + } + } + points = clippedPoints; + } + + return points; +}; + + + +/* + * @class Polygon + * @aka L.Polygon + * @inherits Polyline + * + * A class for drawing polygon overlays on a map. Extends `Polyline`. + * + * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points. + * + * + * @example + * + * ```js + * // create a red polygon from an array of LatLng points + * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]]; + * + * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polygon + * map.fitBounds(polygon.getBounds()); + * ``` + * + * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape: + * + * ```js + * var latlngs = [ + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ]; + * ``` + * + * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape. + * + * ```js + * var latlngs = [ + * [ // first polygon + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ], + * [ // second polygon + * [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]] + * ] + * ]; + * ``` + */ + +L.Polygon = L.Polyline.extend({ + + options: { + fill: true + }, + + isEmpty: function () { + return !this._latlngs.length || !this._latlngs[0].length; + }, + + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, j, p1, p2, f, area, x, y, center, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polygon centroid algorithm; only uses the first ring if there are multiple + + area = x = y = 0; + + for (i = 0, j = len - 1; i < len; j = i++) { + p1 = points[i]; + p2 = points[j]; + + f = p1.y * p2.x - p2.y * p1.x; + x += (p1.x + p2.x) * f; + y += (p1.y + p2.y) * f; + area += f * 3; + } + + if (area === 0) { + // Polygon is so small that all points are on same pixel. + center = points[0]; + } else { + center = [x / area, y / area]; + } + return this._map.layerPointToLatLng(center); + }, + + _convertLatLngs: function (latlngs) { + var result = L.Polyline.prototype._convertLatLngs.call(this, latlngs), + len = result.length; + + // remove last point if it equals first one + if (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) { + result.pop(); + } + return result; + }, + + _setLatLngs: function (latlngs) { + L.Polyline.prototype._setLatLngs.call(this, latlngs); + if (L.Polyline._flat(this._latlngs)) { + this._latlngs = [this._latlngs]; + } + }, + + _defaultShape: function () { + return L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + + _clipPoints: function () { + // polygons need a different clipping algorithm so we redefine that + + var bounds = this._renderer._bounds, + w = this.options.weight, + p = new L.Point(w, w); + + // increase clip padding by stroke width to avoid stroke on clip edges + bounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p)); + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + for (var i = 0, len = this._rings.length, clipped; i < len; i++) { + clipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true); + if (clipped.length) { + this._parts.push(clipped); + } + } + }, + + _updatePath: function () { + this._renderer._updatePoly(this, true); + } +}); + + +// @factory L.polygon(latlngs: LatLng[], options?: Polyline options) +L.polygon = function (latlngs, options) { + return new L.Polygon(latlngs, options); +}; + + + +/* + * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. + */ + +/* + * @class Rectangle + * @aka L.Retangle + * @inherits Polygon + * + * A class for drawing rectangle overlays on a map. Extends `Polygon`. + * + * @example + * + * ```js + * // define rectangle geographical bounds + * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]]; + * + * // create an orange rectangle + * L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map); + * + * // zoom the map to the rectangle bounds + * map.fitBounds(bounds); + * ``` + * + */ + + +L.Rectangle = L.Polygon.extend({ + initialize: function (latLngBounds, options) { + L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); + }, + + // @method setBounds(latLngBounds: LatLngBounds): this + // Redraws the rectangle with the passed bounds. + setBounds: function (latLngBounds) { + return this.setLatLngs(this._boundsToLatLngs(latLngBounds)); + }, + + _boundsToLatLngs: function (latLngBounds) { + latLngBounds = L.latLngBounds(latLngBounds); + return [ + latLngBounds.getSouthWest(), + latLngBounds.getNorthWest(), + latLngBounds.getNorthEast(), + latLngBounds.getSouthEast() + ]; + } +}); + + +// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options) +L.rectangle = function (latLngBounds, options) { + return new L.Rectangle(latLngBounds, options); +}; + + + +/* + * @class CircleMarker + * @aka L.CircleMarker + * @inherits Path + * + * A circle of a fixed size with radius specified in pixels. Extends `Path`. + */ + +L.CircleMarker = L.Path.extend({ + + // @section + // @aka CircleMarker options + options: { + fill: true, + + // @option radius: Number = 10 + // Radius of the circle marker, in pixels + radius: 10 + }, + + initialize: function (latlng, options) { + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + this._radius = this.options.radius; + }, + + // @method setLatLng(latLng: LatLng): this + // Sets the position of a circle marker to a new location. + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + this.redraw(); + return this.fire('move', {latlng: this._latlng}); + }, + + // @method getLatLng(): LatLng + // Returns the current geographical position of the circle marker + getLatLng: function () { + return this._latlng; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle marker. Units are in pixels. + setRadius: function (radius) { + this.options.radius = this._radius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of the circle + getRadius: function () { + return this._radius; + }, + + setStyle : function (options) { + var radius = options && options.radius || this._radius; + L.Path.prototype.setStyle.call(this, options); + this.setRadius(radius); + return this; + }, + + _project: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + this._updateBounds(); + }, + + _updateBounds: function () { + var r = this._radius, + r2 = this._radiusY || r, + w = this._clickTolerance(), + p = [r + w, r2 + w]; + this._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p)); + }, + + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + _updatePath: function () { + this._renderer._updateCircle(this); + }, + + _empty: function () { + return this._radius && !this._renderer._bounds.intersects(this._pxBounds); + } +}); + + +// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options) +// Instantiates a circle marker object given a geographical point, and an optional options object. +L.circleMarker = function (latlng, options) { + return new L.CircleMarker(latlng, options); +}; + + + +/* + * @class Circle + * @aka L.Circle + * @inherits CircleMarker + * + * A class for drawing circle overlays on a map. Extends `CircleMarker`. + * + * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion). + * + * @example + * + * ```js + * L.circle([50.5, 30.5], {radius: 200}).addTo(map); + * ``` + */ + +L.Circle = L.CircleMarker.extend({ + + initialize: function (latlng, options, legacyOptions) { + if (typeof options === 'number') { + // Backwards compatibility with 0.7.x factory (latlng, radius, options?) + options = L.extend({}, legacyOptions, {radius: options}); + } + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + + if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); } + + // @section + // @aka Circle options + // @option radius: Number; Radius of the circle, in meters. + this._mRadius = this.options.radius; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle. Units are in meters. + setRadius: function (radius) { + this._mRadius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of a circle. Units are in meters. + getRadius: function () { + return this._mRadius; + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + var half = [this._radius, this._radiusY || this._radius]; + + return new L.LatLngBounds( + this._map.layerPointToLatLng(this._point.subtract(half)), + this._map.layerPointToLatLng(this._point.add(half))); + }, + + setStyle: L.Path.prototype.setStyle, + + _project: function () { + + var lng = this._latlng.lng, + lat = this._latlng.lat, + map = this._map, + crs = map.options.crs; + + if (crs.distance === L.CRS.Earth.distance) { + var d = Math.PI / 180, + latR = (this._mRadius / L.CRS.Earth.R) / d, + top = map.project([lat + latR, lng]), + bottom = map.project([lat - latR, lng]), + p = top.add(bottom).divideBy(2), + lat2 = map.unproject(p).lat, + lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / + (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; + + if (isNaN(lngR) || lngR === 0) { + lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425 + } + + this._point = p.subtract(map.getPixelOrigin()); + this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1); + this._radiusY = Math.max(Math.round(p.y - top.y), 1); + + } else { + var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0])); + + this._point = map.latLngToLayerPoint(this._latlng); + this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x; + } + + this._updateBounds(); + } +}); + +// @factory L.circle(latlng: LatLng, options?: Circle options) +// Instantiates a circle object given a geographical point, and an options object +// which contains the circle radius. +// @alternative +// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options) +// Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +// Do not use in new applications or plugins. +L.circle = function (latlng, options, legacyOptions) { + return new L.Circle(latlng, options, legacyOptions); +}; + + + +/* + * @class SVG + * @inherits Renderer + * @aka L.SVG + * + * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG). + * Inherits `Renderer`. + * + * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not + * available in all web browsers, notably Android 2.x and 3.x. + * + * Although SVG is not available on IE7 and IE8, these browsers support + * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language) + * (a now deprecated technology), and the SVG renderer will fall back to VML in + * this case. + * + * @example + * + * Use SVG by default for all paths in the map: + * + * ```js + * var map = L.map('map', { + * renderer: L.svg() + * }); + * ``` + * + * Use a SVG renderer with extra padding for specific vector geometries: + * + * ```js + * var map = L.map('map'); + * var myRenderer = L.svg({ padding: 0.5 }); + * var line = L.polyline( coordinates, { renderer: myRenderer } ); + * var circle = L.circle( center, { renderer: myRenderer } ); + * ``` + */ + +L.SVG = L.Renderer.extend({ + + getEvents: function () { + var events = L.Renderer.prototype.getEvents.call(this); + events.zoomstart = this._onZoomStart; + return events; + }, + + _initContainer: function () { + this._container = L.SVG.create('svg'); + + // makes it possible to click through svg root; we'll reset it back in individual paths + this._container.setAttribute('pointer-events', 'none'); + + this._rootGroup = L.SVG.create('g'); + this._container.appendChild(this._rootGroup); + }, + + _onZoomStart: function () { + // Drag-then-pinch interactions might mess up the center and zoom. + // In this case, the easiest way to prevent this is re-do the renderer + // bounds and padding when the zooming starts. + this._update(); + }, + + _update: function () { + if (this._map._animatingZoom && this._bounds) { return; } + + L.Renderer.prototype._update.call(this); + + var b = this._bounds, + size = b.getSize(), + container = this._container; + + // set size of svg-container if changed + if (!this._svgSize || !this._svgSize.equals(size)) { + this._svgSize = size; + container.setAttribute('width', size.x); + container.setAttribute('height', size.y); + } + + // movement: update container viewBox so that we don't have to change coordinates of individual layers + L.DomUtil.setPosition(container, b.min); + container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' ')); + + this.fire('update'); + }, + + // methods below are called by vector layers implementations + + _initPath: function (layer) { + var path = layer._path = L.SVG.create('path'); + + // @namespace Path + // @option className: String = null + // Custom class name set on an element. Only for SVG renderer. + if (layer.options.className) { + L.DomUtil.addClass(path, layer.options.className); + } + + if (layer.options.interactive) { + L.DomUtil.addClass(path, 'leaflet-interactive'); + } + + this._updateStyle(layer); + this._layers[L.stamp(layer)] = layer; + }, + + _addPath: function (layer) { + this._rootGroup.appendChild(layer._path); + layer.addInteractiveTarget(layer._path); + }, + + _removePath: function (layer) { + L.DomUtil.remove(layer._path); + layer.removeInteractiveTarget(layer._path); + delete this._layers[L.stamp(layer)]; + }, + + _updatePath: function (layer) { + layer._project(); + layer._update(); + }, + + _updateStyle: function (layer) { + var path = layer._path, + options = layer.options; + + if (!path) { return; } + + if (options.stroke) { + path.setAttribute('stroke', options.color); + path.setAttribute('stroke-opacity', options.opacity); + path.setAttribute('stroke-width', options.weight); + path.setAttribute('stroke-linecap', options.lineCap); + path.setAttribute('stroke-linejoin', options.lineJoin); + + if (options.dashArray) { + path.setAttribute('stroke-dasharray', options.dashArray); + } else { + path.removeAttribute('stroke-dasharray'); + } + + if (options.dashOffset) { + path.setAttribute('stroke-dashoffset', options.dashOffset); + } else { + path.removeAttribute('stroke-dashoffset'); + } + } else { + path.setAttribute('stroke', 'none'); + } + + if (options.fill) { + path.setAttribute('fill', options.fillColor || options.color); + path.setAttribute('fill-opacity', options.fillOpacity); + path.setAttribute('fill-rule', options.fillRule || 'evenodd'); + } else { + path.setAttribute('fill', 'none'); + } + }, + + _updatePoly: function (layer, closed) { + this._setPath(layer, L.SVG.pointsToPath(layer._parts, closed)); + }, + + _updateCircle: function (layer) { + var p = layer._point, + r = layer._radius, + r2 = layer._radiusY || r, + arc = 'a' + r + ',' + r2 + ' 0 1,0 '; + + // drawing a circle with two half-arcs + var d = layer._empty() ? 'M0 0' : + 'M' + (p.x - r) + ',' + p.y + + arc + (r * 2) + ',0 ' + + arc + (-r * 2) + ',0 '; + + this._setPath(layer, d); + }, + + _setPath: function (layer, path) { + layer._path.setAttribute('d', path); + }, + + // SVG does not have the concept of zIndex so we resort to changing the DOM order of elements + _bringToFront: function (layer) { + L.DomUtil.toFront(layer._path); + }, + + _bringToBack: function (layer) { + L.DomUtil.toBack(layer._path); + } +}); + + +// @namespace SVG; @section +// There are several static functions which can be called without instantiating L.SVG: +L.extend(L.SVG, { + // @function create(name: String): SVGElement + // Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement), + // corresponding to the class name passed. For example, using 'line' will return + // an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement). + create: function (name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); + }, + + // @function pointsToPath(rings: Point[], closed: Boolean): String + // Generates a SVG path string for multiple rings, with each ring turning + // into "M..L..L.." instructions + pointsToPath: function (rings, closed) { + var str = '', + i, j, len, len2, points, p; + + for (i = 0, len = rings.length; i < len; i++) { + points = rings[i]; + + for (j = 0, len2 = points.length; j < len2; j++) { + p = points[j]; + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } + + // closes the ring for polygons; "x" is VML syntax + str += closed ? (L.Browser.svg ? 'z' : 'x') : ''; + } + + // SVG complains about empty path strings + return str || 'M0 0'; + } +}); + +// @namespace Browser; @property svg: Boolean +// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). +L.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect); + + +// @namespace SVG +// @factory L.svg(options?: Renderer options) +// Creates a SVG renderer with the given options. +L.svg = function (options) { + return L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null; +}; + + + +/* + * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! + */ + +/* + * @class SVG + * + * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case. + * + * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility + * with old versions of Internet Explorer. + */ + +// @namespace Browser; @property vml: Boolean +// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). +L.Browser.vml = !L.Browser.svg && (function () { + try { + var div = document.createElement('div'); + div.innerHTML = ''; + + var shape = div.firstChild; + shape.style.behavior = 'url(#default#VML)'; + + return shape && (typeof shape.adj === 'object'); + + } catch (e) { + return false; + } +}()); + +// redefine some SVG methods to handle VML syntax which is similar but with some differences +L.SVG.include(!L.Browser.vml ? {} : { + + _initContainer: function () { + this._container = L.DomUtil.create('div', 'leaflet-vml-container'); + }, + + _update: function () { + if (this._map._animatingZoom) { return; } + L.Renderer.prototype._update.call(this); + this.fire('update'); + }, + + _initPath: function (layer) { + var container = layer._container = L.SVG.create('shape'); + + L.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || '')); + + container.coordsize = '1 1'; + + layer._path = L.SVG.create('path'); + container.appendChild(layer._path); + + this._updateStyle(layer); + this._layers[L.stamp(layer)] = layer; + }, + + _addPath: function (layer) { + var container = layer._container; + this._container.appendChild(container); + + if (layer.options.interactive) { + layer.addInteractiveTarget(container); + } + }, + + _removePath: function (layer) { + var container = layer._container; + L.DomUtil.remove(container); + layer.removeInteractiveTarget(container); + delete this._layers[L.stamp(layer)]; + }, + + _updateStyle: function (layer) { + var stroke = layer._stroke, + fill = layer._fill, + options = layer.options, + container = layer._container; + + container.stroked = !!options.stroke; + container.filled = !!options.fill; + + if (options.stroke) { + if (!stroke) { + stroke = layer._stroke = L.SVG.create('stroke'); + } + container.appendChild(stroke); + stroke.weight = options.weight + 'px'; + stroke.color = options.color; + stroke.opacity = options.opacity; + + if (options.dashArray) { + stroke.dashStyle = L.Util.isArray(options.dashArray) ? + options.dashArray.join(' ') : + options.dashArray.replace(/( *, *)/g, ' '); + } else { + stroke.dashStyle = ''; + } + stroke.endcap = options.lineCap.replace('butt', 'flat'); + stroke.joinstyle = options.lineJoin; + + } else if (stroke) { + container.removeChild(stroke); + layer._stroke = null; + } + + if (options.fill) { + if (!fill) { + fill = layer._fill = L.SVG.create('fill'); + } + container.appendChild(fill); + fill.color = options.fillColor || options.color; + fill.opacity = options.fillOpacity; + + } else if (fill) { + container.removeChild(fill); + layer._fill = null; + } + }, + + _updateCircle: function (layer) { + var p = layer._point.round(), + r = Math.round(layer._radius), + r2 = Math.round(layer._radiusY || r); + + this._setPath(layer, layer._empty() ? 'M0 0' : + 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360)); + }, + + _setPath: function (layer, path) { + layer._path.v = path; + }, + + _bringToFront: function (layer) { + L.DomUtil.toFront(layer._container); + }, + + _bringToBack: function (layer) { + L.DomUtil.toBack(layer._container); + } +}); + +if (L.Browser.vml) { + L.SVG.create = (function () { + try { + document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); + return function (name) { + return document.createElement(''); + }; + } catch (e) { + return function (name) { + return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); + }; + } + })(); +} + + + +/* + * @class Canvas + * @inherits Renderer + * @aka L.Canvas + * + * Allows vector layers to be displayed with [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). + * Inherits `Renderer`. + * + * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not + * available in all web browsers, notably IE8, and overlapping geometries might + * not display properly in some edge cases. + * + * @example + * + * Use Canvas by default for all paths in the map: + * + * ```js + * var map = L.map('map', { + * renderer: L.canvas() + * }); + * ``` + * + * Use a Canvas renderer with extra padding for specific vector geometries: + * + * ```js + * var map = L.map('map'); + * var myRenderer = L.canvas({ padding: 0.5 }); + * var line = L.polyline( coordinates, { renderer: myRenderer } ); + * var circle = L.circle( center, { renderer: myRenderer } ); + * ``` + */ + +L.Canvas = L.Renderer.extend({ + getEvents: function () { + var events = L.Renderer.prototype.getEvents.call(this); + events.viewprereset = this._onViewPreReset; + return events; + }, + + _onViewPreReset: function () { + // Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once + this._postponeUpdatePaths = true; + }, + + onAdd: function () { + L.Renderer.prototype.onAdd.call(this); + + // Redraw vectors since canvas is cleared upon removal, + // in case of removing the renderer itself from the map. + this._draw(); + }, + + _initContainer: function () { + var container = this._container = document.createElement('canvas'); + + L.DomEvent + .on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this) + .on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this) + .on(container, 'mouseout', this._handleMouseOut, this); + + this._ctx = container.getContext('2d'); + }, + + _updatePaths: function () { + if (this._postponeUpdatePaths) { return; } + + var layer; + this._redrawBounds = null; + for (var id in this._layers) { + layer = this._layers[id]; + layer._update(); + } + this._redraw(); + }, + + _update: function () { + if (this._map._animatingZoom && this._bounds) { return; } + + this._drawnLayers = {}; + + L.Renderer.prototype._update.call(this); + + var b = this._bounds, + container = this._container, + size = b.getSize(), + m = L.Browser.retina ? 2 : 1; + + L.DomUtil.setPosition(container, b.min); + + // set canvas size (also clearing it); use double size on retina + container.width = m * size.x; + container.height = m * size.y; + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; + + if (L.Browser.retina) { + this._ctx.scale(2, 2); + } + + // translate so we use the same path coordinates after canvas element moves + this._ctx.translate(-b.min.x, -b.min.y); + + // Tell paths to redraw themselves + this.fire('update'); + }, + + _reset: function () { + L.Renderer.prototype._reset.call(this); + + if (this._postponeUpdatePaths) { + this._postponeUpdatePaths = false; + this._updatePaths(); + } + }, + + _initPath: function (layer) { + this._updateDashArray(layer); + this._layers[L.stamp(layer)] = layer; + + var order = layer._order = { + layer: layer, + prev: this._drawLast, + next: null + }; + if (this._drawLast) { this._drawLast.next = order; } + this._drawLast = order; + this._drawFirst = this._drawFirst || this._drawLast; + }, + + _addPath: function (layer) { + this._requestRedraw(layer); + }, + + _removePath: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; + + if (next) { + next.prev = prev; + } else { + this._drawLast = prev; + } + if (prev) { + prev.next = next; + } else { + this._drawFirst = next; + } + + delete layer._order; + + delete this._layers[L.stamp(layer)]; + + this._requestRedraw(layer); + }, + + _updatePath: function (layer) { + // Redraw the union of the layer's old pixel + // bounds and the new pixel bounds. + this._extendRedrawBounds(layer); + layer._project(); + layer._update(); + // The redraw will extend the redraw bounds + // with the new pixel bounds. + this._requestRedraw(layer); + }, + + _updateStyle: function (layer) { + this._updateDashArray(layer); + this._requestRedraw(layer); + }, + + _updateDashArray: function (layer) { + if (layer.options.dashArray) { + var parts = layer.options.dashArray.split(','), + dashArray = [], + i; + for (i = 0; i < parts.length; i++) { + dashArray.push(Number(parts[i])); + } + layer.options._dashArray = dashArray; + } + }, + + _requestRedraw: function (layer) { + if (!this._map) { return; } + + this._extendRedrawBounds(layer); + this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this); + }, + + _extendRedrawBounds: function (layer) { + var padding = (layer.options.weight || 0) + 1; + this._redrawBounds = this._redrawBounds || new L.Bounds(); + this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding])); + this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding])); + }, + + _redraw: function () { + this._redrawRequest = null; + + if (this._redrawBounds) { + this._redrawBounds.min._floor(); + this._redrawBounds.max._ceil(); + } + + this._clear(); // clear layers in redraw bounds + this._draw(); // draw layers + + this._redrawBounds = null; + }, + + _clear: function () { + var bounds = this._redrawBounds; + if (bounds) { + var size = bounds.getSize(); + this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y); + } else { + this._ctx.clearRect(0, 0, this._container.width, this._container.height); + } + }, + + _draw: function () { + var layer, bounds = this._redrawBounds; + this._ctx.save(); + if (bounds) { + var size = bounds.getSize(); + this._ctx.beginPath(); + this._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y); + this._ctx.clip(); + } + + this._drawing = true; + + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) { + layer._updatePath(); + } + } + + this._drawing = false; + + this._ctx.restore(); // Restore state before clipping. + }, + + _updatePoly: function (layer, closed) { + if (!this._drawing) { return; } + + var i, j, len2, p, + parts = layer._parts, + len = parts.length, + ctx = this._ctx; + + if (!len) { return; } + + this._drawnLayers[layer._leaflet_id] = layer; + + ctx.beginPath(); + + if (ctx.setLineDash) { + ctx.setLineDash(layer.options && layer.options._dashArray || []); + } + + for (i = 0; i < len; i++) { + for (j = 0, len2 = parts[i].length; j < len2; j++) { + p = parts[i][j]; + ctx[j ? 'lineTo' : 'moveTo'](p.x, p.y); + } + if (closed) { + ctx.closePath(); + } + } + + this._fillStroke(ctx, layer); + + // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature + }, + + _updateCircle: function (layer) { + + if (!this._drawing || layer._empty()) { return; } + + var p = layer._point, + ctx = this._ctx, + r = layer._radius, + s = (layer._radiusY || r) / r; + + this._drawnLayers[layer._leaflet_id] = layer; + + if (s !== 1) { + ctx.save(); + ctx.scale(1, s); + } + + ctx.beginPath(); + ctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false); + + if (s !== 1) { + ctx.restore(); + } + + this._fillStroke(ctx, layer); + }, + + _fillStroke: function (ctx, layer) { + var options = layer.options; + + if (options.fill) { + ctx.globalAlpha = options.fillOpacity; + ctx.fillStyle = options.fillColor || options.color; + ctx.fill(options.fillRule || 'evenodd'); + } + + if (options.stroke && options.weight !== 0) { + ctx.globalAlpha = options.opacity; + ctx.lineWidth = options.weight; + ctx.strokeStyle = options.color; + ctx.lineCap = options.lineCap; + ctx.lineJoin = options.lineJoin; + ctx.stroke(); + } + }, + + // Canvas obviously doesn't have mouse events for individual drawn objects, + // so we emulate that by calculating what's under the mouse on mousemove/click manually + + _onClick: function (e) { + var point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer; + + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } + } + if (clickedLayer) { + L.DomEvent._fakeStop(e); + this._fireEvent([clickedLayer], e); + } + }, + + _onMouseMove: function (e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } + + var point = this._map.mouseEventToLayerPoint(e); + this._handleMouseHover(e, point); + }, + + + _handleMouseOut: function (e) { + var layer = this._hoveredLayer; + if (layer) { + // if we're leaving the layer, fire mouseout + L.DomUtil.removeClass(this._container, 'leaflet-interactive'); + this._fireEvent([layer], e, 'mouseout'); + this._hoveredLayer = null; + } + }, + + _handleMouseHover: function (e, point) { + var layer, candidateHoveredLayer; + + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (layer.options.interactive && layer._containsPoint(point)) { + candidateHoveredLayer = layer; + } + } + + if (candidateHoveredLayer !== this._hoveredLayer) { + this._handleMouseOut(e); + + if (candidateHoveredLayer) { + L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor + this._fireEvent([candidateHoveredLayer], e, 'mouseover'); + this._hoveredLayer = candidateHoveredLayer; + } + } + + if (this._hoveredLayer) { + this._fireEvent([this._hoveredLayer], e); + } + }, + + _fireEvent: function (layers, e, type) { + this._map._fireDOMEvent(e, type || e.type, layers); + }, + + _bringToFront: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; + + if (next) { + next.prev = prev; + } else { + // Already last + return; + } + if (prev) { + prev.next = next; + } else if (next) { + // Update first entry unless this is the + // signle entry + this._drawFirst = next; + } + + order.prev = this._drawLast; + this._drawLast.next = order; + + order.next = null; + this._drawLast = order; + + this._requestRedraw(layer); + }, + + _bringToBack: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; + + if (prev) { + prev.next = next; + } else { + // Already first + return; + } + if (next) { + next.prev = prev; + } else if (prev) { + // Update last entry unless this is the + // signle entry + this._drawLast = prev; + } + + order.prev = null; + + order.next = this._drawFirst; + this._drawFirst.prev = order; + this._drawFirst = order; + + this._requestRedraw(layer); + } +}); + +// @namespace Browser; @property canvas: Boolean +// `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). +L.Browser.canvas = (function () { + return !!document.createElement('canvas').getContext; +}()); + +// @namespace Canvas +// @factory L.canvas(options?: Renderer options) +// Creates a Canvas renderer with the given options. +L.canvas = function (options) { + return L.Browser.canvas ? new L.Canvas(options) : null; +}; + +L.Polyline.prototype._containsPoint = function (p, closed) { + var i, j, k, len, len2, part, + w = this._clickTolerance(); + + if (!this._pxBounds.contains(p)) { return false; } + + // hit detection for polylines + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + if (!closed && (j === 0)) { continue; } + + if (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) { + return true; + } + } + } + return false; +}; + +L.Polygon.prototype._containsPoint = function (p) { + var inside = false, + part, p1, p2, i, j, k, len, len2; + + if (!this._pxBounds.contains(p)) { return false; } + + // ray casting algorithm for detecting if point is in polygon + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + p1 = part[j]; + p2 = part[k]; + + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + inside = !inside; + } + } + } + + // also check if it's on polygon stroke + return inside || L.Polyline.prototype._containsPoint.call(this, p, true); +}; + +L.CircleMarker.prototype._containsPoint = function (p) { + return p.distanceTo(this._point) <= this._radius + this._clickTolerance(); +}; + + + +/* + * @class GeoJSON + * @aka L.GeoJSON + * @inherits FeatureGroup + * + * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse + * GeoJSON data and display it on the map. Extends `FeatureGroup`. + * + * @example + * + * ```js + * L.geoJSON(data, { + * style: function (feature) { + * return {color: feature.properties.color}; + * } + * }).bindPopup(function (layer) { + * return layer.feature.properties.description; + * }).addTo(map); + * ``` + */ + +L.GeoJSON = L.FeatureGroup.extend({ + + /* @section + * @aka GeoJSON options + * + * @option pointToLayer: Function = * + * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally + * called when data is added, passing the GeoJSON point feature and its `LatLng`. + * The default is to spawn a default `Marker`: + * ```js + * function(geoJsonPoint, latlng) { + * return L.marker(latlng); + * } + * ``` + * + * @option style: Function = * + * A `Function` defining the `Path options` for styling GeoJSON lines and polygons, + * called internally when data is added. + * The default value is to not override any defaults: + * ```js + * function (geoJsonFeature) { + * return {} + * } + * ``` + * + * @option onEachFeature: Function = * + * A `Function` that will be called once for each created `Feature`, after it has + * been created and styled. Useful for attaching events and popups to features. + * The default is to do nothing with the newly created layers: + * ```js + * function (feature, layer) {} + * ``` + * + * @option filter: Function = * + * A `Function` that will be used to decide whether to include a feature or not. + * The default is to include all features: + * ```js + * function (geoJsonFeature) { + * return true; + * } + * ``` + * Note: dynamically changing the `filter` option will have effect only on newly + * added data. It will _not_ re-evaluate already included features. + * + * @option coordsToLatLng: Function = * + * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s. + * The default is the `coordsToLatLng` static method. + */ + + initialize: function (geojson, options) { + L.setOptions(this, options); + + this._layers = {}; + + if (geojson) { + this.addData(geojson); + } + }, + + // @method addData( data ): this + // Adds a GeoJSON object to the layer. + addData: function (geojson) { + var features = L.Util.isArray(geojson) ? geojson : geojson.features, + i, len, feature; + + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // only add this if geometry or geometries are set and not null + feature = features[i]; + if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { + this.addData(feature); + } + } + return this; + } + + var options = this.options; + + if (options.filter && !options.filter(geojson)) { return this; } + + var layer = L.GeoJSON.geometryToLayer(geojson, options); + if (!layer) { + return this; + } + layer.feature = L.GeoJSON.asFeature(geojson); + + layer.defaultOptions = layer.options; + this.resetStyle(layer); + + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); + }, + + // @method resetStyle( layer ): this + // Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. + resetStyle: function (layer) { + // reset any custom styles + layer.options = L.Util.extend({}, layer.defaultOptions); + this._setLayerStyle(layer, this.options.style); + return this; + }, + + // @method setStyle( style ): this + // Changes styles of GeoJSON vector layers with the given style function. + setStyle: function (style) { + return this.eachLayer(function (layer) { + this._setLayerStyle(layer, style); + }, this); + }, + + _setLayerStyle: function (layer, style) { + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + } +}); + +// @section +// There are several static functions which can be called without instantiating L.GeoJSON: +L.extend(L.GeoJSON, { + // @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer + // Creates a `Layer` from a given GeoJSON feature. Can use a custom + // [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng) + // functions if provided as options. + geometryToLayer: function (geojson, options) { + + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry ? geometry.coordinates : null, + layers = [], + pointToLayer = options && options.pointToLayer, + coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng, + latlng, latlngs, i, len; + + if (!coords && !geometry) { + return null; + } + + switch (geometry.type) { + case 'Point': + latlng = coordsToLatLng(coords); + return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); + + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = coordsToLatLng(coords[i]); + layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); + } + return new L.FeatureGroup(layers); + + case 'LineString': + case 'MultiLineString': + latlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng); + return new L.Polyline(latlngs, options); + + case 'Polygon': + case 'MultiPolygon': + latlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng); + return new L.Polygon(latlngs, options); + + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + var layer = this.geometryToLayer({ + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties + }, options); + + if (layer) { + layers.push(layer); + } + } + return new L.FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); + } + }, + + // @function coordsToLatLng(coords: Array): LatLng + // Creates a `LatLng` object from an array of 2 numbers (longitude, latitude) + // or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points. + coordsToLatLng: function (coords) { + return new L.LatLng(coords[1], coords[0], coords[2]); + }, + + // @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array + // Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array. + // `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). + // Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function. + coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { + var latlngs = []; + + for (var i = 0, len = coords.length, latlng; i < len; i++) { + latlng = levelsDeep ? + this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : + (coordsToLatLng || this.coordsToLatLng)(coords[i]); + + latlngs.push(latlng); + } + + return latlngs; + }, + + // @function latLngToCoords(latlng: LatLng): Array + // Reverse of [`coordsToLatLng`](#geojson-coordstolatlng) + latLngToCoords: function (latlng) { + return latlng.alt !== undefined ? + [latlng.lng, latlng.lat, latlng.alt] : + [latlng.lng, latlng.lat]; + }, + + // @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array + // Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs) + // `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default. + latLngsToCoords: function (latlngs, levelsDeep, closed) { + var coords = []; + + for (var i = 0, len = latlngs.length; i < len; i++) { + coords.push(levelsDeep ? + L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) : + L.GeoJSON.latLngToCoords(latlngs[i])); + } + + if (!levelsDeep && closed) { + coords.push(coords[0]); + } + + return coords; + }, + + getFeature: function (layer, newGeometry) { + return layer.feature ? + L.extend({}, layer.feature, {geometry: newGeometry}) : + L.GeoJSON.asFeature(newGeometry); + }, + + // @function asFeature(geojson: Object): Object + // Normalize GeoJSON geometries/features into GeoJSON features. + asFeature: function (geojson) { + if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') { + return geojson; + } + + return { + type: 'Feature', + properties: {}, + geometry: geojson + }; + } +}); + +var PointToGeoJSON = { + toGeoJSON: function () { + return L.GeoJSON.getFeature(this, { + type: 'Point', + coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) + }); + } +}; + +// @namespace Marker +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). +L.Marker.include(PointToGeoJSON); + +// @namespace CircleMarker +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). +L.Circle.include(PointToGeoJSON); +L.CircleMarker.include(PointToGeoJSON); + + +// @namespace Polyline +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). +L.Polyline.prototype.toGeoJSON = function () { + var multi = !L.Polyline._flat(this._latlngs); + + var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0); + + return L.GeoJSON.getFeature(this, { + type: (multi ? 'Multi' : '') + 'LineString', + coordinates: coords + }); +}; + +// @namespace Polygon +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). +L.Polygon.prototype.toGeoJSON = function () { + var holes = !L.Polyline._flat(this._latlngs), + multi = holes && !L.Polyline._flat(this._latlngs[0]); + + var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true); + + if (!holes) { + coords = [coords]; + } + + return L.GeoJSON.getFeature(this, { + type: (multi ? 'Multi' : '') + 'Polygon', + coordinates: coords + }); +}; + + +// @namespace LayerGroup +L.LayerGroup.include({ + toMultiPoint: function () { + var coords = []; + + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON().geometry.coordinates); + }); + + return L.GeoJSON.getFeature(this, { + type: 'MultiPoint', + coordinates: coords + }); + }, + + // @method toGeoJSON(): Object + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`). + toGeoJSON: function () { + + var type = this.feature && this.feature.geometry && this.feature.geometry.type; + + if (type === 'MultiPoint') { + return this.toMultiPoint(); + } + + var isGeometryCollection = type === 'GeometryCollection', + jsons = []; + + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + var json = layer.toGeoJSON(); + jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); + } + }); + + if (isGeometryCollection) { + return L.GeoJSON.getFeature(this, { + geometries: jsons, + type: 'GeometryCollection' + }); + } + + return { + type: 'FeatureCollection', + features: jsons + }; + } +}); + +// @namespace GeoJSON +// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options) +// Creates a GeoJSON layer. Optionally accepts an object in +// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map +// (you can alternatively add it later with `addData` method) and an `options` object. +L.geoJSON = function (geojson, options) { + return new L.GeoJSON(geojson, options); +}; +// Backward compatibility. +L.geoJson = L.geoJSON; + + + +/* + * @class Draggable + * @aka L.Draggable + * @inherits Evented + * + * A class for making DOM elements draggable (including touch support). + * Used internally for map and marker dragging. Only works for elements + * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition). + * + * @example + * ```js + * var draggable = new L.Draggable(elementToDrag); + * draggable.enable(); + * ``` + */ + +L.Draggable = L.Evented.extend({ + + options: { + // @option clickTolerance: Number = 3 + // The max number of pixels a user can shift the mouse pointer during a click + // for it to be considered a valid click (as opposed to a mouse drag). + clickTolerance: 3 + }, + + statics: { + START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], + END: { + mousedown: 'mouseup', + touchstart: 'touchend', + pointerdown: 'touchend', + MSPointerDown: 'touchend' + }, + MOVE: { + mousedown: 'mousemove', + touchstart: 'touchmove', + pointerdown: 'touchmove', + MSPointerDown: 'touchmove' + } + }, + + // @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean) + // Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default). + initialize: function (element, dragStartTarget, preventOutline) { + this._element = element; + this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline; + }, + + // @method enable() + // Enables the dragging ability + enable: function () { + if (this._enabled) { return; } + + L.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this); + + this._enabled = true; + }, + + // @method disable() + // Disables the dragging ability + disable: function () { + if (!this._enabled) { return; } + + // If we're currently dragging this draggable, + // disabling it counts as first ending the drag. + if (L.Draggable._dragging === this) { + this.finishDrag(); + } + + L.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this); + + this._enabled = false; + this._moved = false; + }, + + _onDown: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + this._moved = false; + + if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } + + if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + L.Draggable._dragging = this; // Prevent dragging multiple objects at once. + + if (this._preventOutline) { + L.DomUtil.preventOutline(this._element); + } + + L.DomUtil.disableImageDrag(); + L.DomUtil.disableTextSelection(); + + if (this._moving) { return; } + + // @event down: Event + // Fired when a drag is about to start. + this.fire('down'); + + var first = e.touches ? e.touches[0] : e; + + this._startPoint = new L.Point(first.clientX, first.clientY); + + L.DomEvent + .on(document, L.Draggable.MOVE[e.type], this._onMove, this) + .on(document, L.Draggable.END[e.type], this._onUp, this); + }, + + _onMove: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + if (e.touches && e.touches.length > 1) { + this._moved = true; + return; + } + + var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), + newPoint = new L.Point(first.clientX, first.clientY), + offset = newPoint.subtract(this._startPoint); + + if (!offset.x && !offset.y) { return; } + if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; } + + L.DomEvent.preventDefault(e); + + if (!this._moved) { + // @event dragstart: Event + // Fired when a drag starts + this.fire('dragstart'); + + this._moved = true; + this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); + + L.DomUtil.addClass(document.body, 'leaflet-dragging'); + + this._lastTarget = e.target || e.srcElement; + // IE and Edge do not give the element, so fetch it + // if necessary + if ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) { + this._lastTarget = this._lastTarget.correspondingUseElement; + } + L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); + } + + this._newPos = this._startPos.add(offset); + this._moving = true; + + L.Util.cancelAnimFrame(this._animRequest); + this._lastEvent = e; + this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true); + }, + + _updatePosition: function () { + var e = {originalEvent: this._lastEvent}; + + // @event predrag: Event + // Fired continuously during dragging *before* each corresponding + // update of the element's position. + this.fire('predrag', e); + L.DomUtil.setPosition(this._element, this._newPos); + + // @event drag: Event + // Fired continuously during dragging. + this.fire('drag', e); + }, + + _onUp: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + this.finishDrag(); + }, + + finishDrag: function () { + L.DomUtil.removeClass(document.body, 'leaflet-dragging'); + + if (this._lastTarget) { + L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target'); + this._lastTarget = null; + } + + for (var i in L.Draggable.MOVE) { + L.DomEvent + .off(document, L.Draggable.MOVE[i], this._onMove, this) + .off(document, L.Draggable.END[i], this._onUp, this); + } + + L.DomUtil.enableImageDrag(); + L.DomUtil.enableTextSelection(); + + if (this._moved && this._moving) { + // ensure drag is not fired after dragend + L.Util.cancelAnimFrame(this._animRequest); + + // @event dragend: DragEndEvent + // Fired when the drag ends. + this.fire('dragend', { + distance: this._newPos.distanceTo(this._startPos) + }); + } + + this._moving = false; + L.Draggable._dragging = false; + } + +}); + + + +/* + L.Handler is a base class for handler classes that are used internally to inject + interaction features like dragging to classes like Map and Marker. +*/ + +// @class Handler +// @aka L.Handler +// Abstract class for map interaction handlers + +L.Handler = L.Class.extend({ + initialize: function (map) { + this._map = map; + }, + + // @method enable(): this + // Enables the handler + enable: function () { + if (this._enabled) { return this; } + + this._enabled = true; + this.addHooks(); + return this; + }, + + // @method disable(): this + // Disables the handler + disable: function () { + if (!this._enabled) { return this; } + + this._enabled = false; + this.removeHooks(); + return this; + }, + + // @method enabled(): Boolean + // Returns `true` if the handler is enabled + enabled: function () { + return !!this._enabled; + } + + // @section Extension methods + // Classes inheriting from `Handler` must implement the two following methods: + // @method addHooks() + // Called when the handler is enabled, should add event hooks. + // @method removeHooks() + // Called when the handler is disabled, should remove the event hooks added previously. +}); + + + +/* + * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. + */ + +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @option dragging: Boolean = true + // Whether the map be draggable with mouse/touch or not. + dragging: true, + + // @section Panning Inertia Options + // @option inertia: Boolean = * + // If enabled, panning of the map will have an inertia effect where + // the map builds momentum while dragging and continues moving in + // the same direction for some time. Feels especially nice on touch + // devices. Enabled by default unless running on old Android devices. + inertia: !L.Browser.android23, + + // @option inertiaDeceleration: Number = 3000 + // The rate with which the inertial movement slows down, in pixels/second². + inertiaDeceleration: 3400, // px/s^2 + + // @option inertiaMaxSpeed: Number = Infinity + // Max speed of the inertial movement, in pixels/second. + inertiaMaxSpeed: Infinity, // px/s + + // @option easeLinearity: Number = 0.2 + easeLinearity: 0.2, + + // TODO refactor, move to CRS + // @option worldCopyJump: Boolean = false + // With this option enabled, the map tracks when you pan to another "copy" + // of the world and seamlessly jumps to the original one so that all overlays + // like markers and vector layers are still visible. + worldCopyJump: false, + + // @option maxBoundsViscosity: Number = 0.0 + // If `maxBounds` is set, this option will control how solid the bounds + // are when dragging the map around. The default value of `0.0` allows the + // user to drag outside the bounds at normal speed, higher values will + // slow down map dragging outside bounds, and `1.0` makes the bounds fully + // solid, preventing the user from dragging outside the bounds. + maxBoundsViscosity: 0.0 +}); + +L.Map.Drag = L.Handler.extend({ + addHooks: function () { + if (!this._draggable) { + var map = this._map; + + this._draggable = new L.Draggable(map._mapPane, map._container); + + this._draggable.on({ + down: this._onDown, + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this); + + this._draggable.on('predrag', this._onPreDragLimit, this); + if (map.options.worldCopyJump) { + this._draggable.on('predrag', this._onPreDragWrap, this); + map.on('zoomend', this._onZoomEnd, this); + + map.whenReady(this._onZoomEnd, this); + } + } + L.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag'); + this._draggable.enable(); + this._positions = []; + this._times = []; + }, + + removeHooks: function () { + L.DomUtil.removeClass(this._map._container, 'leaflet-grab'); + L.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag'); + this._draggable.disable(); + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + moving: function () { + return this._draggable && this._draggable._moving; + }, + + _onDown: function () { + this._map._stop(); + }, + + _onDragStart: function () { + var map = this._map; + + if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) { + var bounds = L.latLngBounds(this._map.options.maxBounds); + + this._offsetLimit = L.bounds( + this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1), + this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1) + .add(this._map.getSize())); + + this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity)); + } else { + this._offsetLimit = null; + } + + map + .fire('movestart') + .fire('dragstart'); + + if (map.options.inertia) { + this._positions = []; + this._times = []; + } + }, + + _onDrag: function (e) { + if (this._map.options.inertia) { + var time = this._lastTime = +new Date(), + pos = this._lastPos = this._draggable._absPos || this._draggable._newPos; + + this._positions.push(pos); + this._times.push(time); + + if (time - this._times[0] > 50) { + this._positions.shift(); + this._times.shift(); + } + } + + this._map + .fire('move', e) + .fire('drag', e); + }, + + _onZoomEnd: function () { + var pxCenter = this._map.getSize().divideBy(2), + pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); + + this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; + this._worldWidth = this._map.getPixelWorldBounds().getSize().x; + }, + + _viscousLimit: function (value, threshold) { + return value - (value - threshold) * this._viscosity; + }, + + _onPreDragLimit: function () { + if (!this._viscosity || !this._offsetLimit) { return; } + + var offset = this._draggable._newPos.subtract(this._draggable._startPos); + + var limit = this._offsetLimit; + if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); } + if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); } + if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); } + if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); } + + this._draggable._newPos = this._draggable._startPos.add(offset); + }, + + _onPreDragWrap: function () { + // TODO refactor to be able to adjust map pane position after zoom + var worldWidth = this._worldWidth, + halfWidth = Math.round(worldWidth / 2), + dx = this._initialWorldOffset, + x = this._draggable._newPos.x, + newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, + newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, + newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; + + this._draggable._absPos = this._draggable._newPos.clone(); + this._draggable._newPos.x = newX; + }, + + _onDragEnd: function (e) { + var map = this._map, + options = map.options, + + noInertia = !options.inertia || this._times.length < 2; + + map.fire('dragend', e); + + if (noInertia) { + map.fire('moveend'); + + } else { + + var direction = this._lastPos.subtract(this._positions[0]), + duration = (this._lastTime - this._times[0]) / 1000, + ease = options.easeLinearity, + + speedVector = direction.multiplyBy(ease / duration), + speed = speedVector.distanceTo([0, 0]), + + limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), + limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), + + decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), + offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); + + if (!offset.x && !offset.y) { + map.fire('moveend'); + + } else { + offset = map._limitOffset(offset, map.options.maxBounds); + + L.Util.requestAnimFrame(function () { + map.panBy(offset, { + duration: decelerationDuration, + easeLinearity: ease, + noMoveStart: true, + animate: true + }); + }); + } + } + } +}); + +// @section Handlers +// @property dragging: Handler +// Map dragging handler (by both mouse and touch). +L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); + + + +/* + * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. + */ + +// @namespace Map +// @section Interaction Options + +L.Map.mergeOptions({ + // @option doubleClickZoom: Boolean|String = true + // Whether the map can be zoomed in by double clicking on it and + // zoomed out by double clicking while holding shift. If passed + // `'center'`, double-click zoom will zoom to the center of the + // view regardless of where the mouse was. + doubleClickZoom: true +}); + +L.Map.DoubleClickZoom = L.Handler.extend({ + addHooks: function () { + this._map.on('dblclick', this._onDoubleClick, this); + }, + + removeHooks: function () { + this._map.off('dblclick', this._onDoubleClick, this); + }, + + _onDoubleClick: function (e) { + var map = this._map, + oldZoom = map.getZoom(), + delta = map.options.zoomDelta, + zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta; + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } + } +}); + +// @section Handlers +// +// Map properties include interaction handlers that allow you to control +// interaction behavior in runtime, enabling or disabling certain features such +// as dragging or touch zoom (see `Handler` methods). For example: +// +// ```js +// map.doubleClickZoom.disable(); +// ``` +// +// @property doubleClickZoom: Handler +// Double click zoom handler. +L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); + + + +/* + * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. + */ + +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @section Mousewheel options + // @option scrollWheelZoom: Boolean|String = true + // Whether the map can be zoomed by using the mouse wheel. If passed `'center'`, + // it will zoom to the center of the view regardless of where the mouse was. + scrollWheelZoom: true, + + // @option wheelDebounceTime: Number = 40 + // Limits the rate at which a wheel can fire (in milliseconds). By default + // user can't zoom via wheel more often than once per 40 ms. + wheelDebounceTime: 40, + + // @option wheelPxPerZoomLevel: Number = 60 + // How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta)) + // mean a change of one full zoom level. Smaller values will make wheel-zooming + // faster (and vice versa). + wheelPxPerZoomLevel: 60 +}); + +L.Map.ScrollWheelZoom = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); + + this._delta = 0; + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this); + }, + + _onWheelScroll: function (e) { + var delta = L.DomEvent.getWheelDelta(e); + + var debounce = this._map.options.wheelDebounceTime; + + this._delta += delta; + this._lastMousePos = this._map.mouseEventToContainerPoint(e); + + if (!this._startTime) { + this._startTime = +new Date(); + } + + var left = Math.max(debounce - (+new Date() - this._startTime), 0); + + clearTimeout(this._timer); + this._timer = setTimeout(L.bind(this._performZoom, this), left); + + L.DomEvent.stop(e); + }, + + _performZoom: function () { + var map = this._map, + zoom = map.getZoom(), + snap = this._map.options.zoomSnap || 0; + + map._stop(); // stop panning and fly animations if any + + // map the delta with a sigmoid function to -4..4 range leaning on -1..1 + var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4), + d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2, + d4 = snap ? Math.ceil(d3 / snap) * snap : d3, + delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom; + + this._delta = 0; + this._startTime = null; + + if (!delta) { return; } + + if (map.options.scrollWheelZoom === 'center') { + map.setZoom(zoom + delta); + } else { + map.setZoomAround(this._lastMousePos, zoom + delta); + } + } +}); + +// @section Handlers +// @property scrollWheelZoom: Handler +// Scroll wheel zoom handler. +L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); + + + +/* + * Extends the event handling code with double tap support for mobile browsers. + */ + +L.extend(L.DomEvent, { + + _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', + _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', + + // inspired by Zepto touch code by Thomas Fuchs + addDoubleTapListener: function (obj, handler, id) { + var last, touch, + doubleTap = false, + delay = 250; + + function onTouchStart(e) { + var count; + + if (L.Browser.pointer) { + if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; } + count = L.DomEvent._pointersCount; + } else { + count = e.touches.length; + } + + if (count > 1) { return; } + + var now = Date.now(), + delta = now - (last || now); + + touch = e.touches ? e.touches[0] : e; + doubleTap = (delta > 0 && delta <= delay); + last = now; + } + + function onTouchEnd(e) { + if (doubleTap && !touch.cancelBubble) { + if (L.Browser.pointer) { + if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; } + + // work around .type being readonly with MSPointer* events + var newTouch = {}, + prop, i; + + for (i in touch) { + prop = touch[i]; + newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop; + } + touch = newTouch; + } + touch.type = 'dblclick'; + handler(touch); + last = null; + } + } + + var pre = '_leaflet_', + touchstart = this._touchstart, + touchend = this._touchend; + + obj[pre + touchstart + id] = onTouchStart; + obj[pre + touchend + id] = onTouchEnd; + obj[pre + 'dblclick' + id] = handler; + + obj.addEventListener(touchstart, onTouchStart, false); + obj.addEventListener(touchend, onTouchEnd, false); + + // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse), + // the browser doesn't fire touchend/pointerup events but does fire + // native dblclicks. See #4127. + // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180. + obj.addEventListener('dblclick', handler, false); + + return this; + }, + + removeDoubleTapListener: function (obj, id) { + var pre = '_leaflet_', + touchstart = obj[pre + this._touchstart + id], + touchend = obj[pre + this._touchend + id], + dblclick = obj[pre + 'dblclick' + id]; + + obj.removeEventListener(this._touchstart, touchstart, false); + obj.removeEventListener(this._touchend, touchend, false); + if (!L.Browser.edge) { + obj.removeEventListener('dblclick', dblclick, false); + } + + return this; + } +}); + + + +/* + * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. + */ + +L.extend(L.DomEvent, { + + POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', + POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', + POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', + POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', + TAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'], + + _pointers: {}, + _pointersCount: 0, + + // Provides a touch events wrapper for (ms)pointer events. + // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 + + addPointerListener: function (obj, type, handler, id) { + + if (type === 'touchstart') { + this._addPointerStart(obj, handler, id); + + } else if (type === 'touchmove') { + this._addPointerMove(obj, handler, id); + + } else if (type === 'touchend') { + this._addPointerEnd(obj, handler, id); + } + + return this; + }, + + removePointerListener: function (obj, type, id) { + var handler = obj['_leaflet_' + type + id]; + + if (type === 'touchstart') { + obj.removeEventListener(this.POINTER_DOWN, handler, false); + + } else if (type === 'touchmove') { + obj.removeEventListener(this.POINTER_MOVE, handler, false); + + } else if (type === 'touchend') { + obj.removeEventListener(this.POINTER_UP, handler, false); + obj.removeEventListener(this.POINTER_CANCEL, handler, false); + } + + return this; + }, + + _addPointerStart: function (obj, handler, id) { + var onDown = L.bind(function (e) { + if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) { + // In IE11, some touch events needs to fire for form controls, or + // the controls will stop working. We keep a whitelist of tag names that + // need these events. For other target tags, we prevent default on the event. + if (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) { + L.DomEvent.preventDefault(e); + } else { + return; + } + } + + this._handlePointer(e, handler); + }, this); + + obj['_leaflet_touchstart' + id] = onDown; + obj.addEventListener(this.POINTER_DOWN, onDown, false); + + // need to keep track of what pointers and how many are active to provide e.touches emulation + if (!this._pointerDocListener) { + var pointerUp = L.bind(this._globalPointerUp, this); + + // we listen documentElement as any drags that end by moving the touch off the screen get fired there + document.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true); + document.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true); + document.documentElement.addEventListener(this.POINTER_UP, pointerUp, true); + document.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true); + + this._pointerDocListener = true; + } + }, + + _globalPointerDown: function (e) { + this._pointers[e.pointerId] = e; + this._pointersCount++; + }, + + _globalPointerMove: function (e) { + if (this._pointers[e.pointerId]) { + this._pointers[e.pointerId] = e; + } + }, + + _globalPointerUp: function (e) { + delete this._pointers[e.pointerId]; + this._pointersCount--; + }, + + _handlePointer: function (e, handler) { + e.touches = []; + for (var i in this._pointers) { + e.touches.push(this._pointers[i]); + } + e.changedTouches = [e]; + + handler(e); + }, + + _addPointerMove: function (obj, handler, id) { + var onMove = L.bind(function (e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } + + this._handlePointer(e, handler); + }, this); + + obj['_leaflet_touchmove' + id] = onMove; + obj.addEventListener(this.POINTER_MOVE, onMove, false); + }, + + _addPointerEnd: function (obj, handler, id) { + var onUp = L.bind(function (e) { + this._handlePointer(e, handler); + }, this); + + obj['_leaflet_touchend' + id] = onUp; + obj.addEventListener(this.POINTER_UP, onUp, false); + obj.addEventListener(this.POINTER_CANCEL, onUp, false); + } +}); + + + +/* + * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. + */ + +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @section Touch interaction options + // @option touchZoom: Boolean|String = * + // Whether the map can be zoomed by touch-dragging with two fingers. If + // passed `'center'`, it will zoom to the center of the view regardless of + // where the touch events (fingers) were. Enabled for touch-capable web + // browsers except for old Androids. + touchZoom: L.Browser.touch && !L.Browser.android23, + + // @option bounceAtZoomLimits: Boolean = true + // Set it to false if you don't want the map to zoom beyond min/max zoom + // and then bounce back when pinch-zooming. + bounceAtZoomLimits: true +}); + +L.Map.TouchZoom = L.Handler.extend({ + addHooks: function () { + L.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom'); + L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + removeHooks: function () { + L.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom'); + L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + _onTouchStart: function (e) { + var map = this._map; + if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } + + var p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]); + + this._centerPoint = map.getSize()._divideBy(2); + this._startLatLng = map.containerPointToLatLng(this._centerPoint); + if (map.options.touchZoom !== 'center') { + this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2)); + } + + this._startDist = p1.distanceTo(p2); + this._startZoom = map.getZoom(); + + this._moved = false; + this._zooming = true; + + map._stop(); + + L.DomEvent + .on(document, 'touchmove', this._onTouchMove, this) + .on(document, 'touchend', this._onTouchEnd, this); + + L.DomEvent.preventDefault(e); + }, + + _onTouchMove: function (e) { + if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } + + var map = this._map, + p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]), + scale = p1.distanceTo(p2) / this._startDist; + + + this._zoom = map.getScaleZoom(scale, this._startZoom); + + if (!map.options.bounceAtZoomLimits && ( + (this._zoom < map.getMinZoom() && scale < 1) || + (this._zoom > map.getMaxZoom() && scale > 1))) { + this._zoom = map._limitZoom(this._zoom); + } + + if (map.options.touchZoom === 'center') { + this._center = this._startLatLng; + if (scale === 1) { return; } + } else { + // Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng + var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint); + if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } + this._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom); + } + + if (!this._moved) { + map._moveStart(true); + this._moved = true; + } + + L.Util.cancelAnimFrame(this._animRequest); + + var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); + this._animRequest = L.Util.requestAnimFrame(moveFn, this, true); + + L.DomEvent.preventDefault(e); + }, + + _onTouchEnd: function () { + if (!this._moved || !this._zooming) { + this._zooming = false; + return; + } + + this._zooming = false; + L.Util.cancelAnimFrame(this._animRequest); + + L.DomEvent + .off(document, 'touchmove', this._onTouchMove) + .off(document, 'touchend', this._onTouchEnd); + + // Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate. + if (this._map.options.zoomAnimation) { + this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap); + } else { + this._map._resetView(this._center, this._map._limitZoom(this._zoom)); + } + } +}); + +// @section Handlers +// @property touchZoom: Handler +// Touch zoom handler. +L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); + + + +/* + * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. + */ + +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @section Touch interaction options + // @option tap: Boolean = true + // Enables mobile hacks for supporting instant taps (fixing 200ms click + // delay on iOS/Android) and touch holds (fired as `contextmenu` events). + tap: true, + + // @option tapTolerance: Number = 15 + // The max number of pixels a user can shift his finger during touch + // for it to be considered a valid tap. + tapTolerance: 15 +}); + +L.Map.Tap = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); + }, + + _onDown: function (e) { + if (!e.touches) { return; } + + L.DomEvent.preventDefault(e); + + this._fireClick = true; + + // don't simulate click or track longpress if more than 1 touch + if (e.touches.length > 1) { + this._fireClick = false; + clearTimeout(this._holdTimeout); + return; + } + + var first = e.touches[0], + el = first.target; + + this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); + + // if touching a link, highlight it + if (el.tagName && el.tagName.toLowerCase() === 'a') { + L.DomUtil.addClass(el, 'leaflet-active'); + } + + // simulate long hold but setting a timeout + this._holdTimeout = setTimeout(L.bind(function () { + if (this._isTapValid()) { + this._fireClick = false; + this._onUp(); + this._simulateEvent('contextmenu', first); + } + }, this), 1000); + + this._simulateEvent('mousedown', first); + + L.DomEvent.on(document, { + touchmove: this._onMove, + touchend: this._onUp + }, this); + }, + + _onUp: function (e) { + clearTimeout(this._holdTimeout); + + L.DomEvent.off(document, { + touchmove: this._onMove, + touchend: this._onUp + }, this); + + if (this._fireClick && e && e.changedTouches) { + + var first = e.changedTouches[0], + el = first.target; + + if (el && el.tagName && el.tagName.toLowerCase() === 'a') { + L.DomUtil.removeClass(el, 'leaflet-active'); + } + + this._simulateEvent('mouseup', first); + + // simulate click if the touch didn't move too much + if (this._isTapValid()) { + this._simulateEvent('click', first); + } + } + }, + + _isTapValid: function () { + return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; + }, + + _onMove: function (e) { + var first = e.touches[0]; + this._newPos = new L.Point(first.clientX, first.clientY); + this._simulateEvent('mousemove', first); + }, + + _simulateEvent: function (type, e) { + var simulatedEvent = document.createEvent('MouseEvents'); + + simulatedEvent._simulated = true; + e.target._simulatedClick = true; + + simulatedEvent.initMouseEvent( + type, true, true, window, 1, + e.screenX, e.screenY, + e.clientX, e.clientY, + false, false, false, false, 0, null); + + e.target.dispatchEvent(simulatedEvent); + } +}); + +// @section Handlers +// @property tap: Handler +// Mobile touch hacks (quick tap and touch hold) handler. +if (L.Browser.touch && !L.Browser.pointer) { + L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); +} + + + +/* + * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map + * (zoom to a selected bounding box), enabled by default. + */ + +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @option boxZoom: Boolean = true + // Whether the map can be zoomed to a rectangular area specified by + // dragging the mouse while pressing the shift key. + boxZoom: true +}); + +L.Map.BoxZoom = L.Handler.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + }, + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + + moved: function () { + return this._moved; + }, + + _resetState: function () { + this._moved = false; + }, + + _onMouseDown: function (e) { + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } + + this._resetState(); + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + + this._startPoint = this._map.mouseEventToContainerPoint(e); + + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown + }, this); + }, + + _onMouseMove: function (e) { + if (!this._moved) { + this._moved = true; + + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); + + this._map.fire('boxzoomstart'); + } + + this._point = this._map.mouseEventToContainerPoint(e); + + var bounds = new L.Bounds(this._point, this._startPoint), + size = bounds.getSize(); + + L.DomUtil.setPosition(this._box, bounds.min); + + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; + }, + + _finish: function () { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown + }, this); + }, + + _onMouseUp: function (e) { + if ((e.which !== 1) && (e.button !== 1)) { return; } + + this._finish(); + + if (!this._moved) { return; } + // Postpone to next JS tick so internal click event handling + // still see it as "moved". + setTimeout(L.bind(this._resetState, this), 0); + + var bounds = new L.LatLngBounds( + this._map.containerPointToLatLng(this._startPoint), + this._map.containerPointToLatLng(this._point)); + + this._map + .fitBounds(bounds) + .fire('boxzoomend', {boxZoomBounds: bounds}); + }, + + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); + } + } +}); + +// @section Handlers +// @property boxZoom: Handler +// Box (shift-drag with mouse) zoom handler. +L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); + + + +/* + * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. + */ + +// @namespace Map +// @section Keyboard Navigation Options +L.Map.mergeOptions({ + // @option keyboard: Boolean = true + // Makes the map focusable and allows users to navigate the map with keyboard + // arrows and `+`/`-` keys. + keyboard: true, + + // @option keyboardPanDelta: Number = 80 + // Amount of pixels to pan when pressing an arrow key. + keyboardPanDelta: 80 +}); + +L.Map.Keyboard = L.Handler.extend({ + + keyCodes: { + left: [37], + right: [39], + down: [40], + up: [38], + zoomIn: [187, 107, 61, 171], + zoomOut: [189, 109, 54, 173] + }, + + initialize: function (map) { + this._map = map; + + this._setPanDelta(map.options.keyboardPanDelta); + this._setZoomDelta(map.options.zoomDelta); + }, + + addHooks: function () { + var container = this._map._container; + + // make the container focusable by tabbing + if (container.tabIndex <= 0) { + container.tabIndex = '0'; + } + + L.DomEvent.on(container, { + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown + }, this); + + this._map.on({ + focus: this._addHooks, + blur: this._removeHooks + }, this); + }, + + removeHooks: function () { + this._removeHooks(); + + L.DomEvent.off(this._map._container, { + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown + }, this); + + this._map.off({ + focus: this._addHooks, + blur: this._removeHooks + }, this); + }, + + _onMouseDown: function () { + if (this._focused) { return; } + + var body = document.body, + docEl = document.documentElement, + top = body.scrollTop || docEl.scrollTop, + left = body.scrollLeft || docEl.scrollLeft; + + this._map._container.focus(); + + window.scrollTo(left, top); + }, + + _onFocus: function () { + this._focused = true; + this._map.fire('focus'); + }, + + _onBlur: function () { + this._focused = false; + this._map.fire('blur'); + }, + + _setPanDelta: function (panDelta) { + var keys = this._panKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.left.length; i < len; i++) { + keys[codes.left[i]] = [-1 * panDelta, 0]; + } + for (i = 0, len = codes.right.length; i < len; i++) { + keys[codes.right[i]] = [panDelta, 0]; + } + for (i = 0, len = codes.down.length; i < len; i++) { + keys[codes.down[i]] = [0, panDelta]; + } + for (i = 0, len = codes.up.length; i < len; i++) { + keys[codes.up[i]] = [0, -1 * panDelta]; + } + }, + + _setZoomDelta: function (zoomDelta) { + var keys = this._zoomKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.zoomIn.length; i < len; i++) { + keys[codes.zoomIn[i]] = zoomDelta; + } + for (i = 0, len = codes.zoomOut.length; i < len; i++) { + keys[codes.zoomOut[i]] = -zoomDelta; + } + }, + + _addHooks: function () { + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + }, + + _removeHooks: function () { + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + }, + + _onKeyDown: function (e) { + if (e.altKey || e.ctrlKey || e.metaKey) { return; } + + var key = e.keyCode, + map = this._map, + offset; + + if (key in this._panKeys) { + + if (map._panAnim && map._panAnim._inProgress) { return; } + + offset = this._panKeys[key]; + if (e.shiftKey) { + offset = L.point(offset).multiplyBy(3); + } + + map.panBy(offset); + + if (map.options.maxBounds) { + map.panInsideBounds(map.options.maxBounds); + } + + } else if (key in this._zoomKeys) { + map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]); + + } else if (key === 27) { + map.closePopup(); + + } else { + return; + } + + L.DomEvent.stop(e); + } +}); + +// @section Handlers +// @section Handlers +// @property keyboard: Handler +// Keyboard navigation handler. +L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); + + + +/* + * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. + */ + + +/* @namespace Marker + * @section Interaction handlers + * + * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example: + * + * ```js + * marker.dragging.disable(); + * ``` + * + * @property dragging: Handler + * Marker dragging handler (by both mouse and touch). + */ + +L.Handler.MarkerDrag = L.Handler.extend({ + initialize: function (marker) { + this._marker = marker; + }, + + addHooks: function () { + var icon = this._marker._icon; + + if (!this._draggable) { + this._draggable = new L.Draggable(icon, icon, true); + } + + this._draggable.on({ + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).enable(); + + L.DomUtil.addClass(icon, 'leaflet-marker-draggable'); + }, + + removeHooks: function () { + this._draggable.off({ + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).disable(); + + if (this._marker._icon) { + L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); + } + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + _onDragStart: function () { + // @section Dragging events + // @event dragstart: Event + // Fired when the user starts dragging the marker. + + // @event movestart: Event + // Fired when the marker starts moving (because of dragging). + + this._oldLatLng = this._marker.getLatLng(); + this._marker + .closePopup() + .fire('movestart') + .fire('dragstart'); + }, + + _onDrag: function (e) { + var marker = this._marker, + shadow = marker._shadow, + iconPos = L.DomUtil.getPosition(marker._icon), + latlng = marker._map.layerPointToLatLng(iconPos); + + // update shadow position + if (shadow) { + L.DomUtil.setPosition(shadow, iconPos); + } + + marker._latlng = latlng; + e.latlng = latlng; + e.oldLatLng = this._oldLatLng; + + // @event drag: Event + // Fired repeatedly while the user drags the marker. + marker + .fire('move', e) + .fire('drag', e); + }, + + _onDragEnd: function (e) { + // @event dragend: DragEndEvent + // Fired when the user stops dragging the marker. + + // @event moveend: Event + // Fired when the marker stops moving (because of dragging). + delete this._oldLatLng; + this._marker + .fire('moveend') + .fire('dragend', e); + } +}); + + + +/* + * @class Control + * @aka L.Control + * @inherits Class + * + * L.Control is a base class for implementing map controls. Handles positioning. + * All other controls extend from this class. + */ + +L.Control = L.Class.extend({ + // @section + // @aka Control options + options: { + // @option position: String = 'topright' + // The position of the control (one of the map corners). Possible values are `'topleft'`, + // `'topright'`, `'bottomleft'` or `'bottomright'` + position: 'topright' + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + /* @section + * Classes extending L.Control will inherit the following methods: + * + * @method getPosition: string + * Returns the position of the control. + */ + getPosition: function () { + return this.options.position; + }, + + // @method setPosition(position: string): this + // Sets the position of the control. + setPosition: function (position) { + var map = this._map; + + if (map) { + map.removeControl(this); + } + + this.options.position = position; + + if (map) { + map.addControl(this); + } + + return this; + }, + + // @method getContainer: HTMLElement + // Returns the HTMLElement that contains the control. + getContainer: function () { + return this._container; + }, + + // @method addTo(map: Map): this + // Adds the control to the given map. + addTo: function (map) { + this.remove(); + this._map = map; + + var container = this._container = this.onAdd(map), + pos = this.getPosition(), + corner = map._controlCorners[pos]; + + L.DomUtil.addClass(container, 'leaflet-control'); + + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + + return this; + }, + + // @method remove: this + // Removes the control from the map it is currently active on. + remove: function () { + if (!this._map) { + return this; + } + + L.DomUtil.remove(this._container); + + if (this.onRemove) { + this.onRemove(this._map); + } + + this._map = null; + + return this; + }, + + _refocusOnMap: function (e) { + // if map exists and event is not a keyboard event + if (this._map && e && e.screenX > 0 && e.screenY > 0) { + this._map.getContainer().focus(); + } + } +}); + +L.control = function (options) { + return new L.Control(options); +}; + +/* @section Extension methods + * @uninheritable + * + * Every control should extend from `L.Control` and (re-)implement the following methods. + * + * @method onAdd(map: Map): HTMLElement + * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo). + * + * @method onRemove(map: Map) + * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove). + */ + +/* @namespace Map + * @section Methods for Layers and Controls + */ +L.Map.include({ + // @method addControl(control: Control): this + // Adds the given control to the map + addControl: function (control) { + control.addTo(this); + return this; + }, + + // @method removeControl(control: Control): this + // Removes the given control from the map + removeControl: function (control) { + control.remove(); + return this; + }, + + _initControlPos: function () { + var corners = this._controlCorners = {}, + l = 'leaflet-', + container = this._controlContainer = + L.DomUtil.create('div', l + 'control-container', this._container); + + function createCorner(vSide, hSide) { + var className = l + vSide + ' ' + l + hSide; + + corners[vSide + hSide] = L.DomUtil.create('div', className, container); + } + + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); + }, + + _clearControlPos: function () { + L.DomUtil.remove(this._controlContainer); + } +}); + + + +/* + * @class Control.Zoom + * @aka L.Control.Zoom + * @inherits Control + * + * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`. + */ + +L.Control.Zoom = L.Control.extend({ + // @section + // @aka Control.Zoom options + options: { + position: 'topleft', + + // @option zoomInText: String = '+' + // The text set on the 'zoom in' button. + zoomInText: '+', + + // @option zoomInTitle: String = 'Zoom in' + // The title set on the 'zoom in' button. + zoomInTitle: 'Zoom in', + + // @option zoomOutText: String = '-' + // The text set on the 'zoom out' button. + zoomOutText: '-', + + // @option zoomOutTitle: String = 'Zoom out' + // The title set on the 'zoom out' button. + zoomOutTitle: 'Zoom out' + }, + + onAdd: function (map) { + var zoomName = 'leaflet-control-zoom', + container = L.DomUtil.create('div', zoomName + ' leaflet-bar'), + options = this.options; + + this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, + zoomName + '-in', container, this._zoomIn); + this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, + zoomName + '-out', container, this._zoomOut); + + this._updateDisabled(); + map.on('zoomend zoomlevelschange', this._updateDisabled, this); + + return container; + }, + + onRemove: function (map) { + map.off('zoomend zoomlevelschange', this._updateDisabled, this); + }, + + disable: function () { + this._disabled = true; + this._updateDisabled(); + return this; + }, + + enable: function () { + this._disabled = false; + this._updateDisabled(); + return this; + }, + + _zoomIn: function (e) { + if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) { + this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _zoomOut: function (e) { + if (!this._disabled && this._map._zoom > this._map.getMinZoom()) { + this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _createButton: function (html, title, className, container, fn) { + var link = L.DomUtil.create('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; + + /* + * Will force screen readers like VoiceOver to read this as "Zoom in - button" + */ + link.setAttribute('role', 'button'); + link.setAttribute('aria-label', title); + + L.DomEvent + .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation) + .on(link, 'click', L.DomEvent.stop) + .on(link, 'click', fn, this) + .on(link, 'click', this._refocusOnMap, this); + + return link; + }, + + _updateDisabled: function () { + var map = this._map, + className = 'leaflet-disabled'; + + L.DomUtil.removeClass(this._zoomInButton, className); + L.DomUtil.removeClass(this._zoomOutButton, className); + + if (this._disabled || map._zoom === map.getMinZoom()) { + L.DomUtil.addClass(this._zoomOutButton, className); + } + if (this._disabled || map._zoom === map.getMaxZoom()) { + L.DomUtil.addClass(this._zoomInButton, className); + } + } +}); + +// @namespace Map +// @section Control options +// @option zoomControl: Boolean = true +// Whether a [zoom control](#control-zoom) is added to the map by default. +L.Map.mergeOptions({ + zoomControl: true +}); + +L.Map.addInitHook(function () { + if (this.options.zoomControl) { + this.zoomControl = new L.Control.Zoom(); + this.addControl(this.zoomControl); + } +}); + +// @namespace Control.Zoom +// @factory L.control.zoom(options: Control.Zoom options) +// Creates a zoom control +L.control.zoom = function (options) { + return new L.Control.Zoom(options); +}; + + + +/* + * @class Control.Attribution + * @aka L.Control.Attribution + * @inherits Control + * + * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control. + */ + +L.Control.Attribution = L.Control.extend({ + // @section + // @aka Control.Attribution options + options: { + position: 'bottomright', + + // @option prefix: String = 'Leaflet' + // The HTML text shown before the attributions. Pass `false` to disable. + prefix: 'Leaflet' + }, + + initialize: function (options) { + L.setOptions(this, options); + + this._attributions = {}; + }, + + onAdd: function (map) { + map.attributionControl = this; + this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); + if (L.DomEvent) { + L.DomEvent.disableClickPropagation(this._container); + } + + // TODO ugly, refactor + for (var i in map._layers) { + if (map._layers[i].getAttribution) { + this.addAttribution(map._layers[i].getAttribution()); + } + } + + this._update(); + + return this._container; + }, + + // @method setPrefix(prefix: String): this + // Sets the text before the attributions. + setPrefix: function (prefix) { + this.options.prefix = prefix; + this._update(); + return this; + }, + + // @method addAttribution(text: String): this + // Adds an attribution text (e.g. `'Vector data © Mapbox'`). + addAttribution: function (text) { + if (!text) { return this; } + + if (!this._attributions[text]) { + this._attributions[text] = 0; + } + this._attributions[text]++; + + this._update(); + + return this; + }, + + // @method removeAttribution(text: String): this + // Removes an attribution text. + removeAttribution: function (text) { + if (!text) { return this; } + + if (this._attributions[text]) { + this._attributions[text]--; + this._update(); + } + + return this; + }, + + _update: function () { + if (!this._map) { return; } + + var attribs = []; + + for (var i in this._attributions) { + if (this._attributions[i]) { + attribs.push(i); + } + } + + var prefixAndAttribs = []; + + if (this.options.prefix) { + prefixAndAttribs.push(this.options.prefix); + } + if (attribs.length) { + prefixAndAttribs.push(attribs.join(', ')); + } + + this._container.innerHTML = prefixAndAttribs.join(' | '); + } +}); + +// @namespace Map +// @section Control options +// @option attributionControl: Boolean = true +// Whether a [attribution control](#control-attribution) is added to the map by default. +L.Map.mergeOptions({ + attributionControl: true +}); + +L.Map.addInitHook(function () { + if (this.options.attributionControl) { + new L.Control.Attribution().addTo(this); + } +}); + +// @namespace Control.Attribution +// @factory L.control.attribution(options: Control.Attribution options) +// Creates an attribution control. +L.control.attribution = function (options) { + return new L.Control.Attribution(options); +}; + + + +/* + * @class Control.Scale + * @aka L.Control.Scale + * @inherits Control + * + * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`. + * + * @example + * + * ```js + * L.control.scale().addTo(map); + * ``` + */ + +L.Control.Scale = L.Control.extend({ + // @section + // @aka Control.Scale options + options: { + position: 'bottomleft', + + // @option maxWidth: Number = 100 + // Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). + maxWidth: 100, + + // @option metric: Boolean = True + // Whether to show the metric scale line (m/km). + metric: true, + + // @option imperial: Boolean = True + // Whether to show the imperial scale line (mi/ft). + imperial: true + + // @option updateWhenIdle: Boolean = false + // If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)). + }, + + onAdd: function (map) { + var className = 'leaflet-control-scale', + container = L.DomUtil.create('div', className), + options = this.options; + + this._addScales(options, className + '-line', container); + + map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + map.whenReady(this._update, this); + + return container; + }, + + onRemove: function (map) { + map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + }, + + _addScales: function (options, className, container) { + if (options.metric) { + this._mScale = L.DomUtil.create('div', className, container); + } + if (options.imperial) { + this._iScale = L.DomUtil.create('div', className, container); + } + }, + + _update: function () { + var map = this._map, + y = map.getSize().y / 2; + + var maxMeters = map.distance( + map.containerPointToLatLng([0, y]), + map.containerPointToLatLng([this.options.maxWidth, y])); + + this._updateScales(maxMeters); + }, + + _updateScales: function (maxMeters) { + if (this.options.metric && maxMeters) { + this._updateMetric(maxMeters); + } + if (this.options.imperial && maxMeters) { + this._updateImperial(maxMeters); + } + }, + + _updateMetric: function (maxMeters) { + var meters = this._getRoundNum(maxMeters), + label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + + this._updateScale(this._mScale, label, meters / maxMeters); + }, + + _updateImperial: function (maxMeters) { + var maxFeet = maxMeters * 3.2808399, + maxMiles, miles, feet; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this._getRoundNum(maxMiles); + this._updateScale(this._iScale, miles + ' mi', miles / maxMiles); + + } else { + feet = this._getRoundNum(maxFeet); + this._updateScale(this._iScale, feet + ' ft', feet / maxFeet); + } + }, + + _updateScale: function (scale, text, ratio) { + scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px'; + scale.innerHTML = text; + }, + + _getRoundNum: function (num) { + var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), + d = num / pow10; + + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; + + return pow10 * d; + } +}); + + +// @factory L.control.scale(options?: Control.Scale options) +// Creates an scale control with the given options. +L.control.scale = function (options) { + return new L.Control.Scale(options); +}; + + + +/* + * @class Control.Layers + * @aka L.Control.Layers + * @inherits Control + * + * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`. + * + * @example + * + * ```js + * var baseLayers = { + * "Mapbox": mapbox, + * "OpenStreetMap": osm + * }; + * + * var overlays = { + * "Marker": marker, + * "Roads": roadsLayer + * }; + * + * L.control.layers(baseLayers, overlays).addTo(map); + * ``` + * + * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values: + * + * ```js + * { + * "": layer1, + * "": layer2 + * } + * ``` + * + * The layer names can contain HTML, which allows you to add additional styling to the items: + * + * ```js + * {" My Layer": myLayer} + * ``` + */ + + +L.Control.Layers = L.Control.extend({ + // @section + // @aka Control.Layers options + options: { + // @option collapsed: Boolean = true + // If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch. + collapsed: true, + position: 'topright', + + // @option autoZIndex: Boolean = true + // If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + autoZIndex: true, + + // @option hideSingleBase: Boolean = false + // If `true`, the base layers in the control will be hidden when there is only one. + hideSingleBase: false, + + // @option sortLayers: Boolean = false + // Whether to sort the layers. When `false`, layers will keep the order + // in which they were added to the control. + sortLayers: false, + + // @option sortFunction: Function = * + // A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + // that will be used for sorting the layers, when `sortLayers` is `true`. + // The function receives both the `L.Layer` instances and their names, as in + // `sortFunction(layerA, layerB, nameA, nameB)`. + // By default, it sorts layers alphabetically by their name. + sortFunction: function (layerA, layerB, nameA, nameB) { + return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0); + } + }, + + initialize: function (baseLayers, overlays, options) { + L.setOptions(this, options); + + this._layers = []; + this._lastZIndex = 0; + this._handlingClick = false; + + for (var i in baseLayers) { + this._addLayer(baseLayers[i], i); + } + + for (i in overlays) { + this._addLayer(overlays[i], i, true); + } + }, + + onAdd: function (map) { + this._initLayout(); + this._update(); + + this._map = map; + map.on('zoomend', this._checkDisabledLayers, this); + + return this._container; + }, + + onRemove: function () { + this._map.off('zoomend', this._checkDisabledLayers, this); + + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.off('add remove', this._onLayerChange, this); + } + }, + + // @method addBaseLayer(layer: Layer, name: String): this + // Adds a base layer (radio button entry) with the given name to the control. + addBaseLayer: function (layer, name) { + this._addLayer(layer, name); + return (this._map) ? this._update() : this; + }, + + // @method addOverlay(layer: Layer, name: String): this + // Adds an overlay (checkbox entry) with the given name to the control. + addOverlay: function (layer, name) { + this._addLayer(layer, name, true); + return (this._map) ? this._update() : this; + }, + + // @method removeLayer(layer: Layer): this + // Remove the given layer from the control. + removeLayer: function (layer) { + layer.off('add remove', this._onLayerChange, this); + + var obj = this._getLayer(L.stamp(layer)); + if (obj) { + this._layers.splice(this._layers.indexOf(obj), 1); + } + return (this._map) ? this._update() : this; + }, + + // @method expand(): this + // Expand the control container if collapsed. + expand: function () { + L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); + this._form.style.height = null; + var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50); + if (acceptableHeight < this._form.clientHeight) { + L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); + this._form.style.height = acceptableHeight + 'px'; + } else { + L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar'); + } + this._checkDisabledLayers(); + return this; + }, + + // @method collapse(): this + // Collapse the control container if expanded. + collapse: function () { + L.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded'); + return this; + }, + + _initLayout: function () { + var className = 'leaflet-control-layers', + container = this._container = L.DomUtil.create('div', className), + collapsed = this.options.collapsed; + + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', true); + + L.DomEvent.disableClickPropagation(container); + if (!L.Browser.touch) { + L.DomEvent.disableScrollPropagation(container); + } + + var form = this._form = L.DomUtil.create('form', className + '-list'); + + if (collapsed) { + this._map.on('click', this.collapse, this); + + if (!L.Browser.android) { + L.DomEvent.on(container, { + mouseenter: this.expand, + mouseleave: this.collapse + }, this); + } + } + + var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); + link.href = '#'; + link.title = 'Layers'; + + if (L.Browser.touch) { + L.DomEvent + .on(link, 'click', L.DomEvent.stop) + .on(link, 'click', this.expand, this); + } else { + L.DomEvent.on(link, 'focus', this.expand, this); + } + + // work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033 + L.DomEvent.on(form, 'click', function () { + setTimeout(L.bind(this._onInputClick, this), 0); + }, this); + + // TODO keyboard accessibility + + if (!collapsed) { + this.expand(); + } + + this._baseLayersList = L.DomUtil.create('div', className + '-base', form); + this._separator = L.DomUtil.create('div', className + '-separator', form); + this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); + + container.appendChild(form); + }, + + _getLayer: function (id) { + for (var i = 0; i < this._layers.length; i++) { + + if (this._layers[i] && L.stamp(this._layers[i].layer) === id) { + return this._layers[i]; + } + } + }, + + _addLayer: function (layer, name, overlay) { + layer.on('add remove', this._onLayerChange, this); + + this._layers.push({ + layer: layer, + name: name, + overlay: overlay + }); + + if (this.options.sortLayers) { + this._layers.sort(L.bind(function (a, b) { + return this.options.sortFunction(a.layer, b.layer, a.name, b.name); + }, this)); + } + + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); + } + }, + + _update: function () { + if (!this._container) { return this; } + + L.DomUtil.empty(this._baseLayersList); + L.DomUtil.empty(this._overlaysList); + + var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0; + + for (i = 0; i < this._layers.length; i++) { + obj = this._layers[i]; + this._addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + baseLayersCount += !obj.overlay ? 1 : 0; + } + + // Hide base layers section if there's only one layer. + if (this.options.hideSingleBase) { + baseLayersPresent = baseLayersPresent && baseLayersCount > 1; + this._baseLayersList.style.display = baseLayersPresent ? '' : 'none'; + } + + this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + + return this; + }, + + _onLayerChange: function (e) { + if (!this._handlingClick) { + this._update(); + } + + var obj = this._getLayer(L.stamp(e.target)); + + // @namespace Map + // @section Layer events + // @event baselayerchange: LayersControlEvent + // Fired when the base layer is changed through the [layer control](#control-layers). + // @event overlayadd: LayersControlEvent + // Fired when an overlay is selected through the [layer control](#control-layers). + // @event overlayremove: LayersControlEvent + // Fired when an overlay is deselected through the [layer control](#control-layers). + // @namespace Control.Layers + var type = obj.overlay ? + (e.type === 'add' ? 'overlayadd' : 'overlayremove') : + (e.type === 'add' ? 'baselayerchange' : null); + + if (type) { + this._map.fire(type, obj); + } + }, + + // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) + _createRadioElement: function (name, checked) { + + var radioHtml = ''; + + var radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; + + return radioFragment.firstChild; + }, + + _addItem: function (obj) { + var label = document.createElement('label'), + checked = this._map.hasLayer(obj.layer), + input; + + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers', checked); + } + + input.layerId = L.stamp(obj.layer); + + L.DomEvent.on(input, 'click', this._onInputClick, this); + + var name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + // Helps from preventing layer control flicker when checkboxes are disabled + // https://github.com/Leaflet/Leaflet/issues/2771 + var holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); + + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + container.appendChild(label); + + this._checkDisabledLayers(); + return label; + }, + + _onInputClick: function () { + var inputs = this._form.getElementsByTagName('input'), + input, layer, hasLayer; + var addedLayers = [], + removedLayers = []; + + this._handlingClick = true; + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + hasLayer = this._map.hasLayer(layer); + + if (input.checked && !hasLayer) { + addedLayers.push(layer); + + } else if (!input.checked && hasLayer) { + removedLayers.push(layer); + } + } + + // Bugfix issue 2318: Should remove all old layers before readding new ones + for (i = 0; i < removedLayers.length; i++) { + this._map.removeLayer(removedLayers[i]); + } + for (i = 0; i < addedLayers.length; i++) { + this._map.addLayer(addedLayers[i]); + } + + this._handlingClick = false; + + this._refocusOnMap(); + }, + + _checkDisabledLayers: function () { + var inputs = this._form.getElementsByTagName('input'), + input, + layer, + zoom = this._map.getZoom(); + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) || + (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom); + + } + }, + + _expand: function () { + // Backward compatibility, remove me in 1.1. + return this.expand(); + }, + + _collapse: function () { + // Backward compatibility, remove me in 1.1. + return this.collapse(); + } + +}); + + +// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options) +// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. +L.control.layers = function (baseLayers, overlays, options) { + return new L.Control.Layers(baseLayers, overlays, options); +}; + + + +}(window, document)); +//# sourceMappingURL=leaflet-src.map \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-1.0.3.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-1.0.3.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +(function(f,b,h){var a={version:"1.0.3+ed36a04"};function d(){var i=f.L;a.noConflict=function(){f.L=i;return this};f.L=a}if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a}else{if(typeof define==="function"&&define.amd){define(a)}}if(typeof f!=="undefined"){d()}a.Util={extend:function(m){var n,l,k,o;for(l=1,k=arguments.length;l1}}());a.Point=function(i,k,j){this.x=(j?Math.round(i):i);this.y=(j?Math.round(k):k)};a.Point.prototype={clone:function(){return new a.Point(this.x,this.y)},add:function(i){return this.clone()._add(a.point(i))},_add:function(i){this.x+=i.x;this.y+=i.y;return this},subtract:function(i){return this.clone()._subtract(a.point(i))},_subtract:function(i){this.x-=i.x;this.y-=i.y;return this},divideBy:function(i){return this.clone()._divideBy(i)},_divideBy:function(i){this.x/=i;this.y/=i;return this},multiplyBy:function(i){return this.clone()._multiplyBy(i)},_multiplyBy:function(i){this.x*=i;this.y*=i;return this},scaleBy:function(i){return new a.Point(this.x*i.x,this.y*i.y)},unscaleBy:function(i){return new a.Point(this.x/i.x,this.y/i.y)},round:function(){return this.clone()._round()},_round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},floor:function(){return this.clone()._floor()},_floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){return this.clone()._ceil()},_ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},distanceTo:function(j){j=a.point(j);var i=j.x-this.x,k=j.y-this.y;return Math.sqrt(i*i+k*k)},equals:function(i){i=a.point(i);return i.x===this.x&&i.y===this.y},contains:function(i){i=a.point(i);return Math.abs(i.x)<=Math.abs(this.x)&&Math.abs(i.y)<=Math.abs(this.y)},toString:function(){return"Point("+a.Util.formatNum(this.x)+", "+a.Util.formatNum(this.y)+")"}};a.point=function(i,k,j){if(i instanceof a.Point){return i}if(a.Util.isArray(i)){return new a.Point(i[0],i[1])}if(i===h||i===null){return i}if(typeof i==="object"&&"x" in i&&"y" in i){return new a.Point(i.x,i.y)}return new a.Point(i,k,j)};a.Bounds=function(l,k){if(!l){return}var n=k?[l,k]:l;for(var m=0,j=n.length;m=this.min.x)&&(i.x<=this.max.x)&&(j.y>=this.min.y)&&(i.y<=this.max.y)},intersects:function(n){n=a.bounds(n);var l=this.min,i=this.max,m=n.min,j=n.max,k=(j.x>=l.x)&&(m.x<=i.x),o=(j.y>=l.y)&&(m.y<=i.y);return k&&o},overlaps:function(o){o=a.bounds(o);var l=this.min,i=this.max,n=o.min,j=o.max,m=(j.x>l.x)&&(n.xl.y)&&(n.y0&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(j)},addClass:function(o,k){if(o.classList!==h){var m=a.Util.splitWords(k);for(var l=0,j=m.length;l=i.lat)&&(k.lat<=l.lat)&&(j.lng>=i.lng)&&(k.lng<=l.lng)},intersects:function(l){l=a.latLngBounds(l);var i=this._southWest,o=this._northEast,j=l.getSouthWest(),n=l.getNorthEast(),m=(n.lat>=i.lat)&&(j.lat<=o.lat),k=(n.lng>=i.lng)&&(j.lng<=o.lng);return m&&k},overlaps:function(m){m=a.latLngBounds(m);var i=this._southWest,o=this._northEast,j=m.getSouthWest(),n=m.getNorthEast(),l=(n.lat>i.lat)&&(j.lati.lng)&&(j.lngthis.options.maxZoom)){return this.setZoom(i)}return this},panInsideBounds:function(l,k){this._enforcingBounds=true;var i=this.getCenter(),j=this._limitCenter(i,this._zoom,a.latLngBounds(l));if(!i.equals(j)){this.panTo(j,k)}this._enforcingBounds=false;return this},invalidateSize:function(k){if(!this._loaded){return this}k=a.extend({animate:false,pan:true},k===true?{animate:true}:k);var l=this.getSize();this._sizeChanged=true;this._lastCenter=null;var j=this.getSize(),n=l.divideBy(2).round(),i=j.divideBy(2).round(),m=n.subtract(i);if(!m.x&&!m.y){return this}if(k.animate&&k.pan){this.panBy(m)}else{if(k.pan){this._rawPanBy(m)}this.fire("move");if(k.debounceMoveend){clearTimeout(this._sizeTimer);this._sizeTimer=setTimeout(a.bind(this.fire,this,"moveend"),200)}else{this.fire("moveend")}}return this.fire("resize",{oldSize:l,newSize:j})},stop:function(){this.setZoom(this._limitZoom(this._zoom));if(!this.options.zoomSnap){this.fire("viewreset")}return this._stop()},locate:function(i){i=this._locateOptions=a.extend({timeout:10000,watch:false},i);if(!("geolocation" in navigator)){this._handleGeolocationError({code:0,message:"Geolocation not supported."});return this}var k=a.bind(this._handleGeolocationResponse,this),j=a.bind(this._handleGeolocationError,this);if(i.watch){this._locationWatchId=navigator.geolocation.watchPosition(k,j,i)}else{navigator.geolocation.getCurrentPosition(k,j,i)}return this},stopLocate:function(){if(navigator.geolocation&&navigator.geolocation.clearWatch){navigator.geolocation.clearWatch(this._locationWatchId)}if(this._locateOptions){this._locateOptions.setView=false}return this},_handleGeolocationError:function(i){var k=i.code,j=i.message||(k===1?"permission denied":(k===2?"position unavailable":"timeout"));if(this._locateOptions.setView&&!this._loaded){this.fitWorld()}this.fire("locationerror",{code:k,message:"Geolocation error: "+j+"."})},_handleGeolocationResponse:function(o){var n=o.coords.latitude,p=o.coords.longitude,k=new a.LatLng(n,p),j=k.toBounds(o.coords.accuracy),r=this._locateOptions;if(r.setView){var q=this.getBoundsZoom(j);this.setView(k,r.maxZoom?Math.min(q,r.maxZoom):q)}var m={latlng:k,bounds:j,timestamp:o.timestamp};for(var l in o.coords){if(typeof o.coords[l]==="number"){m[l]=o.coords[l]}}this.fire("locationfound",m)},addHandler:function(i,k){if(!k){return this}var j=this[i]=new k(this);this._handlers.push(j);if(this.options[i]){j.enable()}return this},remove:function(){this._initEvents(true);if(this._containerId!==this._container._leaflet_id){throw new Error("Map container is being reused by another instance")}try{delete this._container._leaflet_id;delete this._containerId}catch(k){this._container._leaflet_id=h;this._containerId=h}a.DomUtil.remove(this._mapPane);if(this._clearControlPos){this._clearControlPos()}this._clearHandlers();if(this._loaded){this.fire("unload")}for(var j in this._layers){this._layers[j].remove()}return this},createPane:function(j,i){var k="leaflet-pane"+(j?" leaflet-"+j.replace("Pane","")+"-pane":""),l=a.DomUtil.create("div",k,i||this._mapPane);if(j){this._panes[j]=l}return l},getCenter:function(){this._checkIfLoaded();if(this._lastCenter&&!this._moved()){return this._lastCenter}return this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var j=this.getPixelBounds(),i=this.unproject(j.getBottomLeft()),k=this.unproject(j.getTopRight());return new a.LatLngBounds(i,k)},getMinZoom:function(){return this.options.minZoom===h?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===h?(this._layersMaxZoom===h?Infinity:this._layersMaxZoom):this.options.maxZoom},getBoundsZoom:function(i,l,q){i=a.latLngBounds(i);q=a.point(q||[0,0]);var r=this.getZoom()||0,m=this.getMinZoom(),p=this.getMaxZoom(),n=i.getNorthWest(),o=i.getSouthEast(),t=this.getSize().subtract(q),s=a.bounds(this.project(o,r),this.project(n,r)).getSize(),k=a.Browser.any3d?this.options.zoomSnap:1;var j=Math.min(t.x/s.x,t.y/s.y);r=this.getScaleZoom(j,r);if(k){r=Math.round(r/(k/100))*(k/100);r=l?Math.ceil(r/k)*k:Math.floor(r/k)*k}return Math.max(m,Math.min(p,r))},getSize:function(){if(!this._size||this._sizeChanged){this._size=new a.Point(this._container.clientWidth||0,this._container.clientHeight||0);this._sizeChanged=false}return this._size.clone()},getPixelBounds:function(i,k){var j=this._getTopLeftPoint(i,k);return new a.Bounds(j,j.add(this.getSize()))},getPixelOrigin:function(){this._checkIfLoaded();return this._pixelOrigin},getPixelWorldBounds:function(i){return this.options.crs.getProjectedBounds(i===h?this.getZoom():i)},getPane:function(i){return typeof i==="string"?this._panes[i]:i},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(j,k){var i=this.options.crs;k=k===h?this._zoom:k;return i.scale(j)/i.scale(k)},getScaleZoom:function(l,k){var i=this.options.crs;k=k===h?this._zoom:k;var j=i.zoom(l*i.scale(k));return isNaN(j)?Infinity:j},project:function(j,i){i=i===h?this._zoom:i;return this.options.crs.latLngToPoint(a.latLng(j),i)},unproject:function(i,j){j=j===h?this._zoom:j;return this.options.crs.pointToLatLng(a.point(i),j)},layerPointToLatLng:function(i){var j=a.point(i).add(this.getPixelOrigin());return this.unproject(j)},latLngToLayerPoint:function(j){var i=this.project(a.latLng(j))._round();return i._subtract(this.getPixelOrigin())},wrapLatLng:function(i){return this.options.crs.wrapLatLng(a.latLng(i))},wrapLatLngBounds:function(i){return this.options.crs.wrapLatLngBounds(a.latLngBounds(i))},distance:function(i,j){return this.options.crs.distance(a.latLng(i),a.latLng(j))},containerPointToLayerPoint:function(i){return a.point(i).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(i){return a.point(i).add(this._getMapPanePos())},containerPointToLatLng:function(i){var j=this.containerPointToLayerPoint(a.point(i));return this.layerPointToLatLng(j)},latLngToContainerPoint:function(i){return this.layerPointToContainerPoint(this.latLngToLayerPoint(a.latLng(i)))},mouseEventToContainerPoint:function(i){return a.DomEvent.getMousePosition(i,this._container)},mouseEventToLayerPoint:function(i){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(i))},mouseEventToLatLng:function(i){return this.layerPointToLatLng(this.mouseEventToLayerPoint(i))},_initContainer:function(j){var i=this._container=a.DomUtil.get(j);if(!i){throw new Error("Map container not found.")}else{if(i._leaflet_id){throw new Error("Map container is already initialized.")}}a.DomEvent.addListener(i,"scroll",this._onScroll,this);this._containerId=a.Util.stamp(i)},_initLayout:function(){var j=this._container;this._fadeAnimated=this.options.fadeAnimation&&a.Browser.any3d;a.DomUtil.addClass(j,"leaflet-container"+(a.Browser.touch?" leaflet-touch":"")+(a.Browser.retina?" leaflet-retina":"")+(a.Browser.ielt9?" leaflet-oldie":"")+(a.Browser.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=a.DomUtil.getStyle(j,"position");if(i!=="absolute"&&i!=="relative"&&i!=="fixed"){j.style.position="relative"}this._initPanes();if(this._initControlPos){this._initControlPos()}},_initPanes:function(){var i=this._panes={};this._paneRenderers={};this._mapPane=this.createPane("mapPane",this._container);a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));this.createPane("tilePane");this.createPane("shadowPane");this.createPane("overlayPane");this.createPane("markerPane");this.createPane("tooltipPane");this.createPane("popupPane");if(!this.options.markerZoomAnimation){a.DomUtil.addClass(i.markerPane,"leaflet-zoom-hide");a.DomUtil.addClass(i.shadowPane,"leaflet-zoom-hide")}},_resetView:function(j,k){a.DomUtil.setPosition(this._mapPane,new a.Point(0,0));var l=!this._loaded;this._loaded=true;k=this._limitZoom(k);this.fire("viewprereset");var i=this._zoom!==k;this._moveStart(i)._move(j,k)._moveEnd(i);this.fire("viewreset");if(l){this.fire("load")}},_moveStart:function(i){if(i){this.fire("zoomstart")}return this.fire("movestart")},_move:function(j,k,l){if(k===h){k=this._zoom}var i=this._zoom!==k;this._zoom=k;this._lastCenter=j;this._pixelOrigin=this._getNewPixelOrigin(j);if(i||(l&&l.pinch)){this.fire("zoom",l)}return this.fire("move",l)},_moveEnd:function(i){if(i){this.fire("zoomend")}return this.fire("moveend")},_stop:function(){a.Util.cancelAnimFrame(this._flyToFrame);if(this._panAnim){this._panAnim.stop()}return this},_rawPanBy:function(i){a.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(i))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){if(!this._enforcingBounds){this.panInsideBounds(this.options.maxBounds)}},_checkIfLoaded:function(){if(!this._loaded){throw new Error("Set map center and zoom first.")}},_initEvents:function(j){if(!a.DomEvent){return}this._targets={};this._targets[a.stamp(this._container)]=this;var i=j?"off":"on";a.DomEvent[i](this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress",this._handleDOMEvent,this);if(this.options.trackResize){a.DomEvent[i](f,"resize",this._onResize,this)}if(a.Browser.any3d&&this.options.transform3DLimit){this[i]("moveend",this._onMoveEnd)}},_onResize:function(){a.Util.cancelAnimFrame(this._resizeRequest);this._resizeRequest=a.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:true})},this)},_onScroll:function(){this._container.scrollTop=0;this._container.scrollLeft=0},_onMoveEnd:function(){var i=this._getMapPanePos();if(Math.max(Math.abs(i.x),Math.abs(i.y))>=this.options.transform3DLimit){this._resetView(this.getCenter(),this.getZoom())}},_findEventTargets:function(n,j){var i=[],m,l=j==="mouseout"||j==="mouseover",o=n.target||n.srcElement,k=false;while(o){m=this._targets[a.stamp(o)];if(m&&(j==="click"||j==="preclick")&&!n._simulated&&this._draggableMoved(m)){k=true;break}if(m&&m.listens(j,true)){if(l&&!a.DomEvent._isExternalTarget(o,n)){break}i.push(m);if(l){break}}if(o===this._container){break}o=o.parentNode}if(!i.length&&!k&&!l&&a.DomEvent._isExternalTarget(o,n)){i=[this]}return i},_handleDOMEvent:function(j){if(!this._loaded||a.DomEvent._skipped(j)){return}var i=j.type==="keypress"&&j.keyCode===13?"click":j.type;if(i==="mousedown"){a.DomUtil.preventOutline(j.target||j.srcElement)}this._fireDOMEvent(j,i)},_fireDOMEvent:function(p,m,j){if(p.type==="click"){var k=a.Util.extend({},p);k.type="preclick";this._fireDOMEvent(k,k.type,j)}if(p._stopped){return}j=(j||[]).concat(this._findEventTargets(p,m));if(!j.length){return}var o=j[0];if(m==="contextmenu"&&o.listens(m,true)){a.DomEvent.preventDefault(p)}var n={originalEvent:p};if(p.type!=="keypress"){var q=o instanceof a.Marker;n.containerPoint=q?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(p);n.layerPoint=this.containerPointToLayerPoint(n.containerPoint);n.latlng=q?o.getLatLng():this.layerPointToLatLng(n.layerPoint)}for(var l=0;l0?Math.round(j-i)/2:Math.max(0,Math.ceil(j))-Math.max(0,Math.floor(i))},_limitZoom:function(l){var k=this.getMinZoom(),j=this.getMaxZoom(),i=a.Browser.any3d?this.options.zoomSnap:1;if(i){l=Math.round(l/i)*i}return Math.max(k,Math.min(j,l))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){a.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim");this.fire("moveend")},_tryAnimatedPan:function(i,j){var k=this._getCenterOffset(i)._floor();if((j&&j.animate)!==true&&!this.getSize().contains(k)){return false}this.panBy(k,j);return true},_createAnimProxy:function(){var i=this._proxy=a.DomUtil.create("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(i);this.on("zoomanim",function(k){var l=a.DomUtil.TRANSFORM,j=i.style[l];a.DomUtil.setTransform(i,this.project(k.center,k.zoom),this.getZoomScale(k.zoom,1));if(j===i.style[l]&&this._animatingZoom){this._onZoomTransitionEnd()}},this);this.on("load moveend",function(){var k=this.getCenter(),j=this.getZoom();a.DomUtil.setTransform(i,this.project(k,j),this.getZoomScale(j,1))},this)},_catchTransitionEnd:function(i){if(this._animatingZoom&&i.propertyName.indexOf("transform")>=0){this._onZoomTransitionEnd()}},_nothingToAnimate:function(){return !this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(i,k,j){if(this._animatingZoom){return true}j=j||{};if(!this._zoomAnimated||j.animate===false||this._nothingToAnimate()||Math.abs(k-this._zoom)>this.options.zoomAnimationThreshold){return false}var m=this.getZoomScale(k),l=this._getCenterOffset(i)._divideBy(1-1/m);if(j.animate!==true&&!this.getSize().contains(l)){return false}a.Util.requestAnimFrame(function(){this._moveStart(true)._animateZoom(i,k,true)},this);return true},_animateZoom:function(i,l,j,k){if(j){this._animatingZoom=true;this._animateToCenter=i;this._animateToZoom=l;a.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim")}this.fire("zoomanim",{center:i,zoom:l,noUpdate:k});setTimeout(a.bind(this._onZoomTransitionEnd,this),250)},_onZoomTransitionEnd:function(){if(!this._animatingZoom){return}a.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim");this._animatingZoom=false;this._move(this._animateToCenter,this._animateToZoom);a.Util.requestAnimFrame(function(){this._moveEnd(true)},this)}});a.map=function(j,i){return new a.Map(j,i)};a.Layer=a.Evented.extend({options:{pane:"overlayPane",nonBubblingEvents:[],attribution:null},addTo:function(i){i.addLayer(this);return this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(i){if(i){i.removeLayer(this)}return this},getPane:function(i){return this._map.getPane(i?(this.options[i]||i):this.options.pane)},addInteractiveTarget:function(i){this._map._targets[a.stamp(i)]=this;return this},removeInteractiveTarget:function(i){delete this._map._targets[a.stamp(i)];return this},getAttribution:function(){return this.options.attribution},_layerAdd:function(k){var j=k.target;if(!j.hasLayer(this)){return}this._map=j;this._zoomAnimated=j._zoomAnimated;if(this.getEvents){var i=this.getEvents();j.on(i,this);this.once("remove",function(){j.off(i,this)},this)}this.onAdd(j);if(this.getAttribution&&j.attributionControl){j.attributionControl.addAttribution(this.getAttribution())}this.fire("add");j.fire("layeradd",{layer:this})}});a.Map.include({addLayer:function(i){var j=a.stamp(i);if(this._layers[j]){return this}this._layers[j]=i;i._mapToAdd=this;if(i.beforeAdd){i.beforeAdd(this)}this.whenReady(i._layerAdd,i);return this},removeLayer:function(i){var j=a.stamp(i);if(!this._layers[j]){return this}if(this._loaded){i.onRemove(this)}if(i.getAttribution&&this.attributionControl){this.attributionControl.removeAttribution(i.getAttribution())}delete this._layers[j];if(this._loaded){this.fire("layerremove",{layer:i});i.fire("remove")}i._map=i._mapToAdd=null;return this},hasLayer:function(i){return !!i&&(a.stamp(i) in this._layers)},eachLayer:function(l,k){for(var j in this._layers){l.call(k,this._layers[j])}return this},_addLayers:function(l){l=l?(a.Util.isArray(l)?l:[l]):[];for(var k=0,j=l.length;kthis._layersMaxZoom){this.setZoom(this._layersMaxZoom)}if(this.options.minZoom===h&&this._layersMinZoom&&this.getZoom()100&&i<500)||(l.target._simulatedClick&&!l._simulated)){a.DomEvent.stop(l);return}a.DomEvent._lastClick=j;k(l)}};a.DomEvent.addListener=a.DomEvent.on;a.DomEvent.removeListener=a.DomEvent.off;a.PosAnimation=a.Evented.extend({run:function(j,i,k,l){this.stop();this._el=j;this._inProgress=true;this._duration=k||0.25;this._easeOutPower=1/Math.max(l||0.5,0.2);this._startPos=a.DomUtil.getPosition(j);this._offset=i.subtract(this._startPos);this._startTime=+new Date();this.fire("start");this._animate()},stop:function(){if(!this._inProgress){return}this._step(true);this._complete()},_animate:function(){this._animId=a.Util.requestAnimFrame(this._animate,this);this._step()},_step:function(j){var i=(+new Date())-this._startTime,k=this._duration*1000;if(i1e-7;m++){k=o*Math.sin(p);k=Math.pow((1-k)/(1+k),o/2);n=Math.PI/2-2*Math.atan(s*k)-p;p+=n}return new a.LatLng(p*q,t.x*q/j)}};a.CRS.EPSG3395=a.extend({},a.CRS.Earth,{code:"EPSG:3395",projection:a.Projection.Mercator,transformation:(function(){var i=0.5/(Math.PI*a.Projection.Mercator.R);return new a.Transformation(i,0.5,-i,0.5)}())});a.GridLayer=a.Layer.extend({options:{tileSize:256,opacity:1,updateWhenIdle:a.Browser.mobile,updateWhenZooming:true,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:h,noWrap:false,pane:"tilePane",className:"",keepBuffer:2},initialize:function(i){a.setOptions(this,i)},onAdd:function(){this._initContainer();this._levels={};this._tiles={};this._resetView();this._update()},beforeAdd:function(i){i._addZoomLimit(this)},onRemove:function(i){this._removeAllTiles();a.DomUtil.remove(this._container);i._removeZoomLimit(this);this._container=null;this._tileZoom=null},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container);this._setAutoZIndex(Math.max)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container);this._setAutoZIndex(Math.min)}return this},getContainer:function(){return this._container},setOpacity:function(i){this.options.opacity=i;this._updateOpacity();return this},setZIndex:function(i){this.options.zIndex=i;this._updateZIndex();return this},isLoading:function(){return this._loading},redraw:function(){if(this._map){this._removeAllTiles();this._update()}return this},getEvents:function(){var i={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};if(!this.options.updateWhenIdle){if(!this._onMove){this._onMove=a.Util.throttle(this._onMoveEnd,this.options.updateInterval,this)}i.move=this._onMove}if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},createTile:function(){return b.createElement("div")},getTileSize:function(){var i=this.options.tileSize;return i instanceof a.Point?i:new a.Point(i,i)},_updateZIndex:function(){if(this._container&&this.options.zIndex!==h&&this.options.zIndex!==null){this._container.style.zIndex=this.options.zIndex}},_setAutoZIndex:function(m){var n=this.getPane().children,l=-m(-Infinity,Infinity);for(var k=0,j=n.length,o;kthis.options.maxZoom||ji){return this._retainParent(j,o,k,i)}return false},_retainChildren:function(r,o,n,q){for(var l=2*r;l<2*r+2;l++){for(var k=2*o;k<2*o+2;k++){var p=new a.Point(l,k);p.z=n+1;var s=this._tileCoordsToKey(p),m=this._tiles[s];if(m&&m.active){m.retain=true;continue}else{if(m&&m.loaded){m.retain=true}}if(n+1this.options.maxZoom)||(this.options.minZoom!==h&&n1){this._setView(k,z);return}for(var o=m.min.y;o<=m.max.y;o++){for(var p=m.min.x;p<=m.max.x;p++){var x=new a.Point(p,o);x.z=this._tileZoom;if(!this._isValidTile(x)){continue}var u=this._tiles[this._tileCoordsToKey(x)];if(u){u.current=true}else{s.push(x)}}}s.sort(function(j,i){return j.distanceTo(w)-i.distanceTo(w)});if(s.length!==0){if(!this._loading){this._loading=true;this.fire("loading")}var t=b.createDocumentFragment();for(p=0;pj.max.x))||(!i.wrapLat&&(k.yj.max.y))){return false}}if(!this.options.bounds){return true}var l=this._tileCoordsToBounds(k);return a.latLngBounds(this.options.bounds).overlaps(l)},_keyToBounds:function(i){return this._tileCoordsToBounds(this._keyToTileCoords(i))},_tileCoordsToBounds:function(o){var p=this._map,n=this.getTileSize(),k=o.scaleBy(n),i=k.add(n),j=p.unproject(k,o.z),m=p.unproject(i,o.z),l=new a.LatLngBounds(j,m);if(!this.options.noWrap){p.wrapLatLngBounds(l)}return l},_tileCoordsToKey:function(i){return i.x+":"+i.y+":"+i.z},_keyToTileCoords:function(j){var i=j.split(":"),l=new a.Point(+i[0],+i[1]);l.z=+i[2];return l},_removeTile:function(i){var j=this._tiles[i];if(!j){return}a.DomUtil.remove(j.el);delete this._tiles[i];this.fire("tileunload",{tile:j.el,coords:this._keyToTileCoords(i)})},_initTile:function(i){a.DomUtil.addClass(i,"leaflet-tile");var j=this.getTileSize();i.style.width=j.x+"px";i.style.height=j.y+"px";i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;if(a.Browser.ielt9&&this.options.opacity<1){a.DomUtil.setOpacity(i,this.options.opacity)}if(a.Browser.android&&!a.Browser.android23){i.style.WebkitBackfaceVisibility="hidden"}},_addTile:function(m,i){var k=this._getTilePos(m),j=this._tileCoordsToKey(m);var l=this.createTile(this._wrapCoords(m),a.bind(this._tileReady,this,m));this._initTile(l);if(this.createTile.length<2){a.Util.requestAnimFrame(a.bind(this._tileReady,this,m,null,l))}a.DomUtil.setPosition(l,k);this._tiles[j]={el:l,coords:m,current:true};i.appendChild(l);this.fire("tileloadstart",{tile:l,coords:m})},_tileReady:function(l,k,j){if(!this._map){return}if(k){this.fire("tileerror",{error:k,tile:j,coords:l})}var i=this._tileCoordsToKey(l);j=this._tiles[i];if(!j){return}j.loaded=+new Date();if(this._map._fadeAnimated){a.DomUtil.setOpacity(j.el,0);a.Util.cancelAnimFrame(this._fadeFrame);this._fadeFrame=a.Util.requestAnimFrame(this._updateOpacity,this)}else{j.active=true;this._pruneTiles()}if(!k){a.DomUtil.addClass(j.el,"leaflet-tile-loaded");this.fire("tileload",{tile:j.el,coords:l})}if(this._noTilesToLoad()){this._loading=false;this.fire("load");if(a.Browser.ielt9||!this._map._fadeAnimated){a.Util.requestAnimFrame(this._pruneTiles,this)}else{setTimeout(a.bind(this._pruneTiles,this),250)}}},_getTilePos:function(i){return i.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(i){var j=new a.Point(this._wrapX?a.Util.wrapNum(i.x,this._wrapX):i.x,this._wrapY?a.Util.wrapNum(i.y,this._wrapY):i.y);j.z=i.z;return j},_pxBoundsToTileRange:function(i){var j=this.getTileSize();return new a.Bounds(i.min.unscaleBy(j).floor(),i.max.unscaleBy(j).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var i in this._tiles){if(!this._tiles[i].loaded){return false}}return true}});a.gridLayer=function(i){return new a.GridLayer(i)};a.TileLayer=a.GridLayer.extend({options:{minZoom:0,maxZoom:18,maxNativeZoom:null,minNativeZoom:null,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:false,zoomReverse:false,detectRetina:false,crossOrigin:false},initialize:function(j,i){this._url=j;i=a.setOptions(this,i);if(i.detectRetina&&a.Browser.retina&&i.maxZoom>0){i.tileSize=Math.floor(i.tileSize/2);if(!i.zoomReverse){i.zoomOffset++;i.maxZoom--}else{i.zoomOffset--;i.minZoom++}i.minZoom=Math.max(0,i.minZoom)}if(typeof i.subdomains==="string"){i.subdomains=i.subdomains.split("")}if(!a.Browser.android){this.on("tileunload",this._onTileRemove)}},setUrl:function(i,j){this._url=i;if(!j){this.redraw()}return this},createTile:function(k,i){var j=b.createElement("img");a.DomEvent.on(j,"load",a.bind(this._tileOnLoad,this,i,j));a.DomEvent.on(j,"error",a.bind(this._tileOnError,this,i,j));if(this.options.crossOrigin){j.crossOrigin=""}j.alt="";j.setAttribute("role","presentation");j.src=this.getTileUrl(k);return j},getTileUrl:function(j){var i={r:a.Browser.retina?"@2x":"",s:this._getSubdomain(j),x:j.x,y:j.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var k=this._globalTileRange.max.y-j.y;if(this.options.tms){i.y=k}i["-y"]=k}return a.Util.template(this._url,a.extend(i,this.options))},_tileOnLoad:function(i,j){if(a.Browser.ielt9){setTimeout(a.bind(i,this,null,j),0)}else{i(null,j)}},_tileOnError:function(j,k,l){var i=this.options.errorTileUrl;if(i&&k.src!==i){k.src=i}j(l,k)},getTileSize:function(){var k=this._map,j=a.GridLayer.prototype.getTileSize.call(this),i=this._tileZoom+this.options.zoomOffset,m=this.options.minNativeZoom,l=this.options.maxNativeZoom;if(m!==null&&il){return j.divideBy(k.getZoomScale(l,i)).round()}return j},_onTileRemove:function(i){i.tile.onload=null},_getZoomForUrl:function(){var k=this._tileZoom,j=this.options.maxZoom,l=this.options.zoomReverse,i=this.options.zoomOffset,n=this.options.minNativeZoom,m=this.options.maxNativeZoom;if(l){k=j-k}k+=i;if(n!==null&&km){return m}return k},_getSubdomain:function(j){var i=Math.abs(j.x+j.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var j,k;for(j in this._tiles){if(this._tiles[j].coords.z!==this._tileZoom){k=this._tiles[j].el;k.onload=a.Util.falseFn;k.onerror=a.Util.falseFn;if(!k.complete){k.src=a.Util.emptyImageUrl;a.DomUtil.remove(k)}}}}});a.tileLayer=function(j,i){return new a.TileLayer(j,i)};a.TileLayer.WMS=a.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:false,version:"1.1.1"},options:{crs:null,uppercase:false},initialize:function(l,k){this._url=l;var j=a.extend({},this.defaultWmsParams);for(var m in k){if(!(m in this.options)){j[m]=k[m]}}k=a.setOptions(this,k);j.width=j.height=k.tileSize*(k.detectRetina&&a.Browser.retina?2:1);this.wmsParams=j},onAdd:function(i){this._crs=this.options.crs||i.options.crs;this._wmsVersion=parseFloat(this.wmsParams.version);var j=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[j]=this._crs.code;a.TileLayer.prototype.onAdd.call(this,i)},getTileUrl:function(l){var m=this._tileCoordsToBounds(l),i=this._crs.project(m.getNorthWest()),k=this._crs.project(m.getSouthEast()),n=(this._wmsVersion>=1.3&&this._crs===a.CRS.EPSG4326?[k.y,i.x,i.y,k.x]:[i.x,k.y,k.x,i.y]).join(","),j=a.TileLayer.prototype.getTileUrl.call(this,l);return j+a.Util.getParamString(this.wmsParams,j,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+n},setParams:function(j,i){a.extend(this.wmsParams,j);if(!i){this.redraw()}return this}});a.tileLayer.wms=function(j,i){return new a.TileLayer.WMS(j,i)};a.ImageOverlay=a.Layer.extend({options:{opacity:1,alt:"",interactive:false,crossOrigin:false},initialize:function(j,k,i){this._url=j;this._bounds=a.latLngBounds(k);a.setOptions(this,i)},onAdd:function(){if(!this._image){this._initImage();if(this.options.opacity<1){this._updateOpacity()}}if(this.options.interactive){a.DomUtil.addClass(this._image,"leaflet-interactive");this.addInteractiveTarget(this._image)}this.getPane().appendChild(this._image);this._reset()},onRemove:function(){a.DomUtil.remove(this._image);if(this.options.interactive){this.removeInteractiveTarget(this._image)}},setOpacity:function(i){this.options.opacity=i;if(this._image){this._updateOpacity()}return this},setStyle:function(i){if(i.opacity){this.setOpacity(i.opacity)}return this},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._image)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._image)}return this},setUrl:function(i){this._url=i;if(this._image){this._image.src=i}return this},setBounds:function(i){this._bounds=i;if(this._map){this._reset()}return this},getEvents:function(){var i={zoom:this._reset,viewreset:this._reset};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var i=this._image=a.DomUtil.create("img","leaflet-image-layer "+(this._zoomAnimated?"leaflet-zoom-animated":""));i.onselectstart=a.Util.falseFn;i.onmousemove=a.Util.falseFn;i.onload=a.bind(this.fire,this,"load");if(this.options.crossOrigin){i.crossOrigin=""}i.src=this._url;i.alt=this.options.alt},_animateZoom:function(i){var k=this._map.getZoomScale(i.zoom),j=this._map._latLngBoundsToNewLayerBounds(this._bounds,i.zoom,i.center).min;a.DomUtil.setTransform(this._image,j,k)},_reset:function(){var k=this._image,j=new a.Bounds(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=j.getSize();a.DomUtil.setPosition(k,j.min);k.style.width=i.x+"px";k.style.height=i.y+"px"},_updateOpacity:function(){a.DomUtil.setOpacity(this._image,this.options.opacity)}});a.imageOverlay=function(j,k,i){return new a.ImageOverlay(j,k,i)};a.Icon=a.Class.extend({initialize:function(i){a.setOptions(this,i)},createIcon:function(i){return this._createIcon("icon",i)},createShadow:function(i){return this._createIcon("shadow",i)},_createIcon:function(j,k){var l=this._getIconUrl(j);if(!l){if(j==="icon"){throw new Error("iconUrl not set in Icon options (see the docs).")}return null}var i=this._createImg(l,k&&k.tagName==="IMG"?k:null);this._setIconStyles(i,j);return i},_setIconStyles:function(j,m){var l=this.options;var i=l[m+"Size"];if(typeof i==="number"){i=[i,i]}var n=a.point(i),k=a.point(m==="shadow"&&l.shadowAnchor||l.iconAnchor||n&&n.divideBy(2,true));j.className="leaflet-marker-"+m+" "+(l.className||"");if(k){j.style.marginLeft=(-k.x)+"px";j.style.marginTop=(-k.y)+"px"}if(n){j.style.width=n.x+"px";j.style.height=n.y+"px"}},_createImg:function(j,i){i=i||b.createElement("img");i.src=j;return i},_getIconUrl:function(i){return a.Browser.retina&&this.options[i+"RetinaUrl"]||this.options[i+"Url"]}});a.icon=function(i){return new a.Icon(i)};a.Icon.Default=a.Icon.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(i){if(!a.Icon.Default.imagePath){a.Icon.Default.imagePath=this._detectIconPath()}return(this.options.imagePath||a.Icon.Default.imagePath)+a.Icon.prototype._getIconUrl.call(this,i)},_detectIconPath:function(){var i=a.DomUtil.create("div","leaflet-default-icon-path",b.body);var j=a.DomUtil.getStyle(i,"background-image")||a.DomUtil.getStyle(i,"backgroundImage");b.body.removeChild(i);return j.indexOf("url")===0?j.replace(/^url\([\"\']?/,"").replace(/marker-icon\.png[\"\']?\)$/,""):""}});a.Marker=a.Layer.extend({options:{icon:new a.Icon.Default(),interactive:true,draggable:false,keyboard:true,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:false,riseOffset:250,pane:"markerPane",nonBubblingEvents:["click","dblclick","mouseover","mouseout","contextmenu"]},initialize:function(j,i){a.setOptions(this,i);this._latlng=a.latLng(j)},onAdd:function(i){this._zoomAnimated=this._zoomAnimated&&i.options.markerZoomAnimation;if(this._zoomAnimated){i.on("zoomanim",this._animateZoom,this)}this._initIcon();this.update()},onRemove:function(i){if(this.dragging&&this.dragging.enabled()){this.options.draggable=true;this.dragging.removeHooks()}if(this._zoomAnimated){i.off("zoomanim",this._animateZoom,this)}this._removeIcon();this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(j){var i=this._latlng;this._latlng=a.latLng(j);this.update();return this.fire("move",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(i){this.options.zIndexOffset=i;return this.update()},setIcon:function(i){this.options.icon=i;if(this._map){this._initIcon();this.update()}if(this._popup){this.bindPopup(this._popup,this._popup.options)}return this},getElement:function(){return this._icon},update:function(){if(this._icon){var i=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(i)}return this},_initIcon:function(){var j=this.options,l="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");var k=j.icon.createIcon(this._icon),m=false;if(k!==this._icon){if(this._icon){this._removeIcon()}m=true;if(j.title){k.title=j.title}if(j.alt){k.alt=j.alt}}a.DomUtil.addClass(k,l);if(j.keyboard){k.tabIndex="0"}this._icon=k;if(j.riseOnHover){this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex})}var i=j.icon.createShadow(this._shadow),n=false;if(i!==this._shadow){this._removeShadow();n=true}if(i){a.DomUtil.addClass(i,l);i.alt=""}this._shadow=i;if(j.opacity<1){this._updateOpacity()}if(m){this.getPane().appendChild(this._icon)}this._initInteraction();if(i&&n){this.getPane("shadowPane").appendChild(this._shadow)}},_removeIcon:function(){if(this.options.riseOnHover){this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex})}a.DomUtil.remove(this._icon);this.removeInteractiveTarget(this._icon);this._icon=null},_removeShadow:function(){if(this._shadow){a.DomUtil.remove(this._shadow)}this._shadow=null},_setPos:function(i){a.DomUtil.setPosition(this._icon,i);if(this._shadow){a.DomUtil.setPosition(this._shadow,i)}this._zIndex=i.y+this.options.zIndexOffset;this._resetZIndex()},_updateZIndex:function(i){this._icon.style.zIndex=this._zIndex+i},_animateZoom:function(i){var j=this._map._latLngToNewLayerPoint(this._latlng,i.zoom,i.center).round();this._setPos(j)},_initInteraction:function(){if(!this.options.interactive){return}a.DomUtil.addClass(this._icon,"leaflet-interactive");this.addInteractiveTarget(this._icon);if(a.Handler.MarkerDrag){var i=this.options.draggable;if(this.dragging){i=this.dragging.enabled();this.dragging.disable()}this.dragging=new a.Handler.MarkerDrag(this);if(i){this.dragging.enable()}}},setOpacity:function(i){this.options.opacity=i;if(this._map){this._updateOpacity()}return this},_updateOpacity:function(){var i=this.options.opacity;a.DomUtil.setOpacity(this._icon,i);if(this._shadow){a.DomUtil.setOpacity(this._shadow,i)}},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor||[0,0]},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor||[0,0]}});a.marker=function(j,i){return new a.Marker(j,i)};a.DivIcon=a.Icon.extend({options:{iconSize:[12,12],html:false,bgPos:null,className:"leaflet-div-icon"},createIcon:function(j){var l=(j&&j.tagName==="DIV")?j:b.createElement("div"),i=this.options;l.innerHTML=i.html!==false?i.html:"";if(i.bgPos){var k=a.point(i.bgPos);l.style.backgroundPosition=(-k.x)+"px "+(-k.y)+"px"}this._setIconStyles(l,"icon");return l},createShadow:function(){return null}});a.divIcon=function(i){return new a.DivIcon(i)};a.DivOverlay=a.Layer.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(i,j){a.setOptions(this,i);this._source=j},onAdd:function(i){this._zoomAnimated=i._zoomAnimated;if(!this._container){this._initLayout()}if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0)}clearTimeout(this._removeTimeout);this.getPane().appendChild(this._container);this.update();if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,1)}this.bringToFront()},onRemove:function(i){if(i._fadeAnimated){a.DomUtil.setOpacity(this._container,0);this._removeTimeout=setTimeout(a.bind(a.DomUtil.remove,a.DomUtil,this._container),200)}else{a.DomUtil.remove(this._container)}},getLatLng:function(){return this._latlng},setLatLng:function(i){this._latlng=a.latLng(i);if(this._map){this._updatePosition();this._adjustPan()}return this},getContent:function(){return this._content},setContent:function(i){this._content=i;this.update();return this},getElement:function(){return this._container},update:function(){if(!this._map){return}this._container.style.visibility="hidden";this._updateContent();this._updateLayout();this._updatePosition();this._container.style.visibility="";this._adjustPan()},getEvents:function(){var i={zoom:this._updatePosition,viewreset:this._updatePosition};if(this._zoomAnimated){i.zoomanim=this._animateZoom}return i},isOpen:function(){return !!this._map&&this._map.hasLayer(this)},bringToFront:function(){if(this._map){a.DomUtil.toFront(this._container)}return this},bringToBack:function(){if(this._map){a.DomUtil.toBack(this._container)}return this},_updateContent:function(){if(!this._content){return}var j=this._contentNode;var i=(typeof this._content==="function")?this._content(this._source||this):this._content;if(typeof i==="string"){j.innerHTML=i}else{while(j.hasChildNodes()){j.removeChild(j.firstChild)}j.appendChild(i)}this.fire("contentupdate")},_updatePosition:function(){if(!this._map){return}var m=this._map.latLngToLayerPoint(this._latlng),l=a.point(this.options.offset),j=this._getAnchor();if(this._zoomAnimated){a.DomUtil.setPosition(this._container,m.add(j))}else{l=l.add(m).add(j)}var i=this._containerBottom=-l.y,k=this._containerLeft=-Math.round(this._containerWidth/2)+l.x;this._container.style.bottom=i+"px";this._container.style.left=k+"px"},_getAnchor:function(){return[0,0]}});a.Popup=a.DivOverlay.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:true,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:false,closeButton:true,autoClose:true,className:""},openOn:function(i){i.openPopup(this);return this},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);i.fire("popupopen",{popup:this});if(this._source){this._source.fire("popupopen",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.on("preclick",a.DomEvent.stopPropagation)}}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("popupclose",{popup:this});if(this._source){this._source.fire("popupclose",{popup:this},true);if(!(this._source instanceof a.Path)){this._source.off("preclick",a.DomEvent.stopPropagation)}}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if("closeOnClick" in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick){i.preclick=this._close}if(this.options.keepInView){i.moveend=this._adjustPan}return i},_close:function(){if(this._map){this._map.closePopup(this)}},_initLayout:function(){var k="leaflet-popup",i=this._container=a.DomUtil.create("div",k+" "+(this.options.className||"")+" leaflet-zoom-animated");if(this.options.closeButton){var j=this._closeButton=a.DomUtil.create("a",k+"-close-button",i);j.href="#close";j.innerHTML="×";a.DomEvent.on(j,"click",this._onCloseButtonClick,this)}var l=this._wrapper=a.DomUtil.create("div",k+"-content-wrapper",i);this._contentNode=a.DomUtil.create("div",k+"-content",l);a.DomEvent.disableClickPropagation(l).disableScrollPropagation(this._contentNode).on(l,"contextmenu",a.DomEvent.stopPropagation);this._tipContainer=a.DomUtil.create("div",k+"-tip-container",i);this._tip=a.DomUtil.create("div",k+"-tip",this._tipContainer)},_updateLayout:function(){var j=this._contentNode,l=j.style;l.width="";l.whiteSpace="nowrap";var k=j.offsetWidth;k=Math.min(k,this.options.maxWidth);k=Math.max(k,this.options.minWidth);l.width=(k+1)+"px";l.whiteSpace="";l.height="";var i=j.offsetHeight,m=this.options.maxHeight,n="leaflet-popup-scrolled";if(m&&i>m){l.height=m+"px";a.DomUtil.addClass(j,n)}else{a.DomUtil.removeClass(j,n)}this._containerWidth=this._container.offsetWidth},_animateZoom:function(j){var k=this._map._latLngToNewLayerPoint(this._latlng,j.zoom,j.center),i=this._getAnchor();a.DomUtil.setPosition(this._container,k.add(i))},_adjustPan:function(){if(!this.options.autoPan||(this._map._panAnim&&this._map._panAnim._inProgress)){return}var j=this._map,m=parseInt(a.DomUtil.getStyle(this._container,"marginBottom"),10)||0,t=this._container.offsetHeight+m,p=this._containerWidth,n=new a.Point(this._containerLeft,-t-this._containerBottom);n._add(a.DomUtil.getPosition(this._container));var l=j.layerPointToContainerPoint(n),o=a.point(this.options.autoPanPadding),k=a.point(this.options.autoPanPaddingTopLeft||o),i=a.point(this.options.autoPanPaddingBottomRight||o),s=j.getSize(),r=0,q=0;if(l.x+p+i.x>s.x){r=l.x+p-s.x+i.x}if(l.x-r-k.x<0){r=l.x-k.x}if(l.y+t+i.y>s.y){q=l.y+t-s.y+i.y}if(l.y-q-k.y<0){q=l.y-k.y}if(r||q){j.fire("autopanstart").panBy([r,q])}},_onCloseButtonClick:function(i){this._close();a.DomEvent.stop(i)},_getAnchor:function(){return a.point(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});a.popup=function(i,j){return new a.Popup(i,j)};a.Map.mergeOptions({closePopupOnClick:true});a.Map.include({openPopup:function(i,k,j){if(!(i instanceof a.Popup)){i=new a.Popup(j).setContent(i)}if(k){i.setLatLng(k)}if(this.hasLayer(i)){return this}if(this._popup&&this._popup.options.autoClose){this.closePopup()}this._popup=i;return this.addLayer(i)},closePopup:function(i){if(!i||i===this._popup){i=this._popup;this._popup=null}if(i){this.removeLayer(i)}return this}});a.Layer.include({bindPopup:function(j,i){if(j instanceof a.Popup){a.setOptions(j,i);this._popup=j;j._source=this}else{if(!this._popup||i){this._popup=new a.Popup(i,this)}this._popup.setContent(j)}if(!this._popupHandlersAdded){this.on({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=true}return this},unbindPopup:function(){if(this._popup){this.off({click:this._openPopup,remove:this.closePopup,move:this._movePopup});this._popupHandlersAdded=false;this._popup=null}return this},openPopup:function(i,k){if(!(i instanceof a.Layer)){k=i;i=this}if(i instanceof a.FeatureGroup){for(var j in this._layers){i=this._layers[j];break}}if(!k){k=i.getCenter?i.getCenter():i.getLatLng()}if(this._popup&&this._map){this._popup._source=i;this._popup.update();this._map.openPopup(this._popup,k)}return this},closePopup:function(){if(this._popup){this._popup._close()}return this},togglePopup:function(i){if(this._popup){if(this._popup._map){this.closePopup()}else{this.openPopup(i)}}return this},isPopupOpen:function(){return(this._popup?this._popup.isOpen():false)},setPopupContent:function(i){if(this._popup){this._popup.setContent(i)}return this},getPopup:function(){return this._popup},_openPopup:function(j){var i=j.layer||j.target;if(!this._popup){return}if(!this._map){return}a.DomEvent.stop(j);if(i instanceof a.Path){this.openPopup(j.layer||j.target,j.latlng);return}if(this._map.hasLayer(this._popup)&&this._popup._source===i){this.closePopup()}else{this.openPopup(i,j.latlng)}},_movePopup:function(i){this._popup.setLatLng(i.latlng)}});a.Tooltip=a.DivOverlay.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:false,sticky:false,interactive:false,opacity:0.9},onAdd:function(i){a.DivOverlay.prototype.onAdd.call(this,i);this.setOpacity(this.options.opacity);i.fire("tooltipopen",{tooltip:this});if(this._source){this._source.fire("tooltipopen",{tooltip:this},true)}},onRemove:function(i){a.DivOverlay.prototype.onRemove.call(this,i);i.fire("tooltipclose",{tooltip:this});if(this._source){this._source.fire("tooltipclose",{tooltip:this},true)}},getEvents:function(){var i=a.DivOverlay.prototype.getEvents.call(this);if(a.Browser.touch&&!this.options.permanent){i.preclick=this._close}return i},_close:function(){if(this._map){this._map.closeTooltip(this)}},_initLayout:function(){var j="leaflet-tooltip",i=j+" "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=a.DomUtil.create("div",i)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(p){var i=this._map,j=this._container,o=i.latLngToContainerPoint(i.getCenter()),k=i.layerPointToContainerPoint(p),q=this.options.direction,n=j.offsetWidth,r=j.offsetHeight,l=a.point(this.options.offset),m=this._getAnchor();if(q==="top"){p=p.add(a.point(-n/2+l.x,-r+l.y+m.y,true))}else{if(q==="bottom"){p=p.subtract(a.point(n/2-l.x,-l.y,true))}else{if(q==="center"){p=p.subtract(a.point(n/2+l.x,r/2-m.y+l.y,true))}else{if(q==="right"||q==="auto"&&k.xl){p=m;l=n}}if(l>j){k[p]=1;this._simplifyDPStep(r,k,j,o,p);this._simplifyDPStep(r,k,j,p,q)}},_reducePoints:function(m,k){var o=[m[0]];for(var l=1,n=0,j=m.length;lk){o.push(m[l]);n=l}}if(nj.max.x){i|=2}}if(k.yj.max.y){i|=8}}return i},_sqDist:function(l,k){var j=k.x-l.x,i=k.y-l.y;return j*j+i*i},_sqClosestPointOnSegment:function(j,o,n,k){var m=o.x,l=o.y,s=n.x-m,r=n.y-l,i=s*s+r*r,q;if(i>0){q=((j.x-m)*s+(j.y-l)*r)/i;if(q>1){m=n.x;l=n.y}else{if(q>0){m+=s*q;l+=r*q}}}s=j.x-m;r=j.y-l;return k?s*s+r*r:new a.Point(m,l)}};a.Polyline=a.Path.extend({options:{smoothFactor:1,noClip:false},initialize:function(i,j){a.setOptions(this,j);this._setLatLngs(i)},getLatLngs:function(){return this._latlngs},setLatLngs:function(i){this._setLatLngs(i);return this.redraw()},isEmpty:function(){return !this._latlngs.length},closestLayerPoint:function(k){var t=Infinity,r=null,l=a.LineUtil._sqClosestPointOnSegment,v,u;for(var m=0,w=this._parts.length;mj){n=(o-j)/k;return this._map.layerPointToLatLng([p.x-n*(p.x-r.x),p.y-n*(p.y-r.y)])}}},getBounds:function(){return this._bounds},addLatLng:function(j,i){i=i||this._defaultShape();j=a.latLng(j);i.push(j);this._bounds.extend(j);return this.redraw()},_setLatLngs:function(i){this._bounds=new a.LatLngBounds();this._latlngs=this._convertLatLngs(i)},_defaultShape:function(){return a.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(l){var k=[],n=a.Polyline._flat(l);for(var m=0,j=l.length;m=2&&j[0] instanceof a.LatLng&&j[0].equals(j[i-1])){j.pop()}return j},_setLatLngs:function(i){a.Polyline.prototype._setLatLngs.call(this,i);if(a.Polyline._flat(this._latlngs)){this._latlngs=[this._latlngs]}},_defaultShape:function(){return a.Polyline._flat(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var n=this._renderer._bounds,l=this.options.weight,o=new a.Point(l,l);n=new a.Bounds(n.min.subtract(o),n.max.add(o));this._parts=[];if(!this._pxBounds||!this._pxBounds.intersects(n)){return}if(this.options.noClip){this._parts=this._rings;return}for(var m=0,k=this._rings.length,j;m';var i=k.firstChild;i.style.behavior="url(#default#VML)";return i&&(typeof i.adj==="object")}catch(j){return false}}());a.SVG.include(!a.Browser.vml?{}:{_initContainer:function(){this._container=a.DomUtil.create("div","leaflet-vml-container")},_update:function(){if(this._map._animatingZoom){return}a.Renderer.prototype._update.call(this);this.fire("update")},_initPath:function(j){var i=j._container=a.SVG.create("shape");a.DomUtil.addClass(i,"leaflet-vml-shape "+(this.options.className||""));i.coordsize="1 1";j._path=a.SVG.create("path");i.appendChild(j._path);this._updateStyle(j);this._layers[a.stamp(j)]=j},_addPath:function(j){var i=j._container;this._container.appendChild(i);if(j.options.interactive){j.addInteractiveTarget(i)}},_removePath:function(j){var i=j._container;a.DomUtil.remove(i);j.removeInteractiveTarget(i);delete this._layers[a.stamp(j)]},_updateStyle:function(k){var m=k._stroke,l=k._fill,j=k.options,i=k._container;i.stroked=!!j.stroke;i.filled=!!j.fill;if(j.stroke){if(!m){m=k._stroke=a.SVG.create("stroke")}i.appendChild(m);m.weight=j.weight+"px";m.color=j.color;m.opacity=j.opacity;if(j.dashArray){m.dashStyle=a.Util.isArray(j.dashArray)?j.dashArray.join(" "):j.dashArray.replace(/( *, *)/g," ")}else{m.dashStyle=""}m.endcap=j.lineCap.replace("butt","flat");m.joinstyle=j.lineJoin}else{if(m){i.removeChild(m);k._stroke=null}}if(j.fill){if(!l){l=k._fill=a.SVG.create("fill")}i.appendChild(l);l.color=j.fillColor||j.color;l.opacity=j.fillOpacity}else{if(l){i.removeChild(l);k._fill=null}}},_updateCircle:function(j){var l=j._point.round(),k=Math.round(j._radius),i=Math.round(j._radiusY||k);this._setPath(j,j._empty()?"M0 0":"AL "+l.x+","+l.y+" "+k+","+i+" 0,"+(65535*360))},_setPath:function(i,j){i._path.v=j},_bringToFront:function(i){a.DomUtil.toFront(i._container)},_bringToBack:function(i){a.DomUtil.toBack(i._container)}});if(a.Browser.vml){a.SVG.create=(function(){try{b.namespaces.add("lvml","urn:schemas-microsoft-com:vml");return function(j){return b.createElement("')}}catch(i){return function(j){return b.createElement("<"+j+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}})()}a.Canvas=a.Renderer.extend({getEvents:function(){var i=a.Renderer.prototype.getEvents.call(this);i.viewprereset=this._onViewPreReset;return i},_onViewPreReset:function(){this._postponeUpdatePaths=true},onAdd:function(){a.Renderer.prototype.onAdd.call(this);this._draw()},_initContainer:function(){var i=this._container=b.createElement("canvas");a.DomEvent.on(i,"mousemove",a.Util.throttle(this._onMouseMove,32,this),this).on(i,"click dblclick mousedown mouseup contextmenu",this._onClick,this).on(i,"mouseout",this._handleMouseOut,this);this._ctx=i.getContext("2d")},_updatePaths:function(){if(this._postponeUpdatePaths){return}var i;this._redrawBounds=null;for(var j in this._layers){i=this._layers[j];i._update()}this._redraw()},_update:function(){if(this._map._animatingZoom&&this._bounds){return}this._drawnLayers={};a.Renderer.prototype._update.call(this);var j=this._bounds,k=this._container,l=j.getSize(),i=a.Browser.retina?2:1;a.DomUtil.setPosition(k,j.min);k.width=i*l.x;k.height=i*l.y;k.style.width=l.x+"px";k.style.height=l.y+"px";if(a.Browser.retina){this._ctx.scale(2,2)}this._ctx.translate(-j.min.x,-j.min.y);this.fire("update")},_reset:function(){a.Renderer.prototype._reset.call(this);if(this._postponeUpdatePaths){this._postponeUpdatePaths=false;this._updatePaths()}},_initPath:function(j){this._updateDashArray(j);this._layers[a.stamp(j)]=j;var i=j._order={layer:j,prev:this._drawLast,next:null};if(this._drawLast){this._drawLast.next=i}this._drawLast=i;this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(i){this._requestRedraw(i)},_removePath:function(j){var i=j._order;var k=i.next;var l=i.prev;if(k){k.prev=l}else{this._drawLast=l}if(l){l.next=k}else{this._drawFirst=k}delete j._order;delete this._layers[a.stamp(j)];this._requestRedraw(j)},_updatePath:function(i){this._extendRedrawBounds(i);i._project();i._update();this._requestRedraw(i)},_updateStyle:function(i){this._updateDashArray(i);this._requestRedraw(i)},_updateDashArray:function(l){if(l.options.dashArray){var m=l.options.dashArray.split(","),j=[],k;for(k=0;kl.y)!==(u.y>l.y))&&(l.x<(u.x-v.x)*(l.y-v.y)/(u.y-v.y)+v.x)){n=!n}}}return n||a.Polyline.prototype._containsPoint.call(this,l,true)};a.CircleMarker.prototype._containsPoint=function(i){return i.distanceTo(this._point)<=this._radius+this._clickTolerance()};a.GeoJSON=a.FeatureGroup.extend({initialize:function(j,i){a.setOptions(this,i);this._layers={};if(j){this.addData(j)}},addData:function(l){var p=a.Util.isArray(l)?l:l.features,o,j,n;if(p){for(o=0,j=p.length;o1){this._moved=true;return}var l=(j.touches&&j.touches.length===1?j.touches[0]:j),i=new a.Point(l.clientX,l.clientY),k=i.subtract(this._startPoint);if(!k.x&&!k.y){return}if(Math.abs(k.x)+Math.abs(k.y)50){this._positions.shift();this._times.shift()}}this._map.fire("move",j).fire("drag",j)},_onZoomEnd:function(){var j=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(j).x;this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(j,i){return j-(j-i)*this._viscosity},_onPreDragLimit:function(){if(!this._viscosity||!this._offsetLimit){return}var j=this._draggable._newPos.subtract(this._draggable._startPos);var i=this._offsetLimit;if(j.xi.max.x){j.x=this._viscousLimit(j.x,i.max.x)}if(j.y>i.max.y){j.y=this._viscousLimit(j.y,i.max.y)}this._draggable._newPos=this._draggable._startPos.add(j)},_onPreDragWrap:function(){var o=this._worldWidth,n=Math.round(o/2),j=this._initialWorldOffset,i=this._draggable._newPos.x,l=(i-n+j)%o+n-j,k=(i+n+j)%o-n-j,m=Math.abs(l+j)0?j:-j))-m;this._delta=0;this._startTime=null;if(!o){return}if(n.options.scrollWheelZoom==="center"){n.setZoom(m+o)}else{n.setZoomAround(this._lastMousePos,m+o)}}});a.Map.addInitHook("addHandler","scrollWheelZoom",a.Map.ScrollWheelZoom);a.extend(a.DomEvent,{_touchstart:a.Browser.msPointer?"MSPointerDown":a.Browser.pointer?"pointerdown":"touchstart",_touchend:a.Browser.msPointer?"MSPointerUp":a.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(l,t,i){var s,k,p=false,n=250;function m(w){var v;if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}v=a.DomEvent._pointersCount}else{v=w.touches.length}if(v>1){return}var u=Date.now(),x=u-(s||u);k=w.touches?w.touches[0]:w;p=(x>0&&x<=n);s=u}function q(w){if(p&&!k.cancelBubble){if(a.Browser.pointer){if((!a.Browser.edge)||w.pointerType==="mouse"){return}var u={},x,v;for(v in k){x=k[v];u[v]=x&&x.bind?x.bind(k):x}k=u}k.type="dblclick";t(k);s=null}}var j="_leaflet_",o=this._touchstart,r=this._touchend;l[j+o+i]=m;l[j+r+i]=q;l[j+"dblclick"+i]=t;l.addEventListener(o,m,false);l.addEventListener(r,q,false);l.addEventListener("dblclick",t,false);return this},removeDoubleTapListener:function(k,n){var j="_leaflet_",m=k[j+this._touchstart+n],l=k[j+this._touchend+n],i=k[j+"dblclick"+n];k.removeEventListener(this._touchstart,m,false);k.removeEventListener(this._touchend,l,false);if(!a.Browser.edge){k.removeEventListener("dblclick",i,false)}return this}});a.extend(a.DomEvent,{POINTER_DOWN:a.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:a.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:a.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:a.Browser.msPointer?"MSPointerCancel":"pointercancel",TAG_WHITE_LIST:["INPUT","SELECT","OPTION"],_pointers:{},_pointersCount:0,addPointerListener:function(k,j,i,l){if(j==="touchstart"){this._addPointerStart(k,i,l)}else{if(j==="touchmove"){this._addPointerMove(k,i,l)}else{if(j==="touchend"){this._addPointerEnd(k,i,l)}}}return this},removePointerListener:function(k,j,l){var i=k["_leaflet_"+j+l];if(j==="touchstart"){k.removeEventListener(this.POINTER_DOWN,i,false)}else{if(j==="touchmove"){k.removeEventListener(this.POINTER_MOVE,i,false)}else{if(j==="touchend"){k.removeEventListener(this.POINTER_UP,i,false);k.removeEventListener(this.POINTER_CANCEL,i,false)}}}return this},_addPointerStart:function(k,i,m){var j=a.bind(function(n){if(n.pointerType!=="mouse"&&n.MSPOINTER_TYPE_MOUSE&&n.pointerType!==n.MSPOINTER_TYPE_MOUSE){if(this.TAG_WHITE_LIST.indexOf(n.target.tagName)<0){a.DomEvent.preventDefault(n)}else{return}}this._handlePointer(n,i)},this);k["_leaflet_touchstart"+m]=j;k.addEventListener(this.POINTER_DOWN,j,false);if(!this._pointerDocListener){var l=a.bind(this._globalPointerUp,this);b.documentElement.addEventListener(this.POINTER_DOWN,a.bind(this._globalPointerDown,this),true);b.documentElement.addEventListener(this.POINTER_MOVE,a.bind(this._globalPointerMove,this),true);b.documentElement.addEventListener(this.POINTER_UP,l,true);b.documentElement.addEventListener(this.POINTER_CANCEL,l,true);this._pointerDocListener=true}},_globalPointerDown:function(i){this._pointers[i.pointerId]=i;this._pointersCount++},_globalPointerMove:function(i){if(this._pointers[i.pointerId]){this._pointers[i.pointerId]=i}},_globalPointerUp:function(i){delete this._pointers[i.pointerId];this._pointersCount--},_handlePointer:function(l,k){l.touches=[];for(var j in this._pointers){l.touches.push(this._pointers[j])}l.changedTouches=[l];k(l)},_addPointerMove:function(j,i,l){var k=a.bind(function(m){if((m.pointerType===m.MSPOINTER_TYPE_MOUSE||m.pointerType==="mouse")&&m.buttons===0){return}this._handlePointer(m,i)},this);j["_leaflet_touchmove"+l]=k;j.addEventListener(this.POINTER_MOVE,k,false)},_addPointerEnd:function(j,i,l){var k=a.bind(function(m){this._handlePointer(m,i)},this);j["_leaflet_touchend"+l]=k;j.addEventListener(this.POINTER_UP,k,false);j.addEventListener(this.POINTER_CANCEL,k,false)}});a.Map.mergeOptions({touchZoom:a.Browser.touch&&!a.Browser.android23,bounceAtZoomLimits:true});a.Map.TouchZoom=a.Handler.extend({addHooks:function(){a.DomUtil.addClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){a.DomUtil.removeClass(this._map._container,"leaflet-touch-zoom");a.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(k){var j=this._map;if(!k.touches||k.touches.length!==2||j._animatingZoom||this._zooming){return}var l=j.mouseEventToContainerPoint(k.touches[0]),i=j.mouseEventToContainerPoint(k.touches[1]);this._centerPoint=j.getSize()._divideBy(2);this._startLatLng=j.containerPointToLatLng(this._centerPoint);if(j.options.touchZoom!=="center"){this._pinchStartLatLng=j.containerPointToLatLng(l.add(i)._divideBy(2))}this._startDist=l.distanceTo(i);this._startZoom=j.getZoom();this._moved=false;this._zooming=true;j._stop();a.DomEvent.on(b,"touchmove",this._onTouchMove,this).on(b,"touchend",this._onTouchEnd,this);a.DomEvent.preventDefault(k)},_onTouchMove:function(l){if(!l.touches||l.touches.length!==2||!this._zooming){return}var k=this._map,n=k.mouseEventToContainerPoint(l.touches[0]),j=k.mouseEventToContainerPoint(l.touches[1]),m=n.distanceTo(j)/this._startDist;this._zoom=k.getScaleZoom(m,this._startZoom);if(!k.options.bounceAtZoomLimits&&((this._zoomk.getMaxZoom()&&m>1))){this._zoom=k._limitZoom(this._zoom)}if(k.options.touchZoom==="center"){this._center=this._startLatLng;if(m===1){return}}else{var o=n._add(j)._divideBy(2)._subtract(this._centerPoint);if(m===1&&o.x===0&&o.y===0){return}this._center=k.unproject(k.project(this._pinchStartLatLng,this._zoom).subtract(o),this._zoom)}if(!this._moved){k._moveStart(true);this._moved=true}a.Util.cancelAnimFrame(this._animRequest);var i=a.bind(k._move,k,this._center,this._zoom,{pinch:true,round:false});this._animRequest=a.Util.requestAnimFrame(i,this,true);a.DomEvent.preventDefault(l)},_onTouchEnd:function(){if(!this._moved||!this._zooming){this._zooming=false;return}this._zooming=false;a.Util.cancelAnimFrame(this._animRequest);a.DomEvent.off(b,"touchmove",this._onTouchMove).off(b,"touchend",this._onTouchEnd);if(this._map.options.zoomAnimation){this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),true,this._map.options.zoomSnap)}else{this._map._resetView(this._center,this._map._limitZoom(this._zoom))}}});a.Map.addInitHook("addHandler","touchZoom",a.Map.TouchZoom);a.Map.mergeOptions({tap:true,tapTolerance:15});a.Map.Tap=a.Handler.extend({addHooks:function(){a.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){a.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(j){if(!j.touches){return}a.DomEvent.preventDefault(j);this._fireClick=true;if(j.touches.length>1){this._fireClick=false;clearTimeout(this._holdTimeout);return}var k=j.touches[0],i=k.target;this._startPos=this._newPos=new a.Point(k.clientX,k.clientY);if(i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.addClass(i,"leaflet-active")}this._holdTimeout=setTimeout(a.bind(function(){if(this._isTapValid()){this._fireClick=false;this._onUp();this._simulateEvent("contextmenu",k)}},this),1000);this._simulateEvent("mousedown",k);a.DomEvent.on(b,{touchmove:this._onMove,touchend:this._onUp},this)},_onUp:function(j){clearTimeout(this._holdTimeout);a.DomEvent.off(b,{touchmove:this._onMove,touchend:this._onUp},this);if(this._fireClick&&j&&j.changedTouches){var k=j.changedTouches[0],i=k.target;if(i&&i.tagName&&i.tagName.toLowerCase()==="a"){a.DomUtil.removeClass(i,"leaflet-active")}this._simulateEvent("mouseup",k);if(this._isTapValid()){this._simulateEvent("click",k)}}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(i){var j=i.touches[0];this._newPos=new a.Point(j.clientX,j.clientY);this._simulateEvent("mousemove",j)},_simulateEvent:function(i,k){var j=b.createEvent("MouseEvents");j._simulated=true;k.target._simulatedClick=true;j.initMouseEvent(i,true,true,f,1,k.screenX,k.screenY,k.clientX,k.clientY,false,false,false,false,0,null);k.target.dispatchEvent(j)}});if(a.Browser.touch&&!a.Browser.pointer){a.Map.addInitHook("addHandler","tap",a.Map.Tap)}a.Map.mergeOptions({boxZoom:true});a.Map.BoxZoom=a.Handler.extend({initialize:function(i){this._map=i;this._container=i._container;this._pane=i._panes.overlayPane},addHooks:function(){a.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){a.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_resetState:function(){this._moved=false},_onMouseDown:function(i){if(!i.shiftKey||((i.which!==1)&&(i.button!==1))){return false}this._resetState();a.DomUtil.disableTextSelection();a.DomUtil.disableImageDrag();this._startPoint=this._map.mouseEventToContainerPoint(i);a.DomEvent.on(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(k){if(!this._moved){this._moved=true;this._box=a.DomUtil.create("div","leaflet-zoom-box",this._container);a.DomUtil.addClass(this._container,"leaflet-crosshair");this._map.fire("boxzoomstart")}this._point=this._map.mouseEventToContainerPoint(k);var j=new a.Bounds(this._point,this._startPoint),i=j.getSize();a.DomUtil.setPosition(this._box,j.min);this._box.style.width=i.x+"px";this._box.style.height=i.y+"px"},_finish:function(){if(this._moved){a.DomUtil.remove(this._box);a.DomUtil.removeClass(this._container,"leaflet-crosshair")}a.DomUtil.enableTextSelection();a.DomUtil.enableImageDrag();a.DomEvent.off(b,{contextmenu:a.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(j){if((j.which!==1)&&(j.button!==1)){return}this._finish();if(!this._moved){return}setTimeout(a.bind(this._resetState,this),0);var i=new a.LatLngBounds(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})},_onKeyDown:function(i){if(i.keyCode===27){this._finish()}}});a.Map.addInitHook("addHandler","boxZoom",a.Map.BoxZoom);a.Map.mergeOptions({keyboard:true,keyboardPanDelta:80});a.Map.Keyboard=a.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(i){this._map=i;this._setPanDelta(i.options.keyboardPanDelta);this._setZoomDelta(i.options.zoomDelta)},addHooks:function(){var i=this._map._container;if(i.tabIndex<=0){i.tabIndex="0"}a.DomEvent.on(i,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks();a.DomEvent.off(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this);this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(this._focused){return}var i=b.body,l=b.documentElement,k=i.scrollTop||l.scrollTop,j=i.scrollLeft||l.scrollLeft;this._map._container.focus();f.scrollTo(j,k)},_onFocus:function(){this._focused=true;this._map.fire("focus")},_onBlur:function(){this._focused=false;this._map.fire("blur")},_setPanDelta:function(n){var m=this._panKeys={},k=this.keyCodes,l,j;for(l=0,j=k.left.length;l0&&i.screenY>0){this._map.getContainer().focus()}}});a.control=function(i){return new a.Control(i)};a.Map.include({addControl:function(i){i.addTo(this);return this},removeControl:function(i){i.remove();return this},_initControlPos:function(){var k=this._controlCorners={},j="leaflet-",i=this._controlContainer=a.DomUtil.create("div",j+"control-container",this._container);function m(n,o){var l=j+n+" "+j+o;k[n+o]=a.DomUtil.create("div",l,i)}m("top","left");m("top","right");m("bottom","left");m("bottom","right")},_clearControlPos:function(){a.DomUtil.remove(this._controlContainer)}});a.Control.Zoom=a.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(k){var l="leaflet-control-zoom",i=a.DomUtil.create("div",l+" leaflet-bar"),j=this.options;this._zoomInButton=this._createButton(j.zoomInText,j.zoomInTitle,l+"-in",i,this._zoomIn);this._zoomOutButton=this._createButton(j.zoomOutText,j.zoomOutTitle,l+"-out",i,this._zoomOut);this._updateDisabled();k.on("zoomend zoomlevelschange",this._updateDisabled,this);return i},onRemove:function(i){i.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){this._disabled=true;this._updateDisabled();return this},enable:function(){this._disabled=false;this._updateDisabled();return this},_zoomIn:function(i){if(!this._disabled&&this._map._zoomthis._map.getMinZoom()){this._map.zoomOut(this._map.options.zoomDelta*(i.shiftKey?3:1))}},_createButton:function(j,n,l,i,k){var m=a.DomUtil.create("a",l,i);m.innerHTML=j;m.href="#";m.title=n;m.setAttribute("role","button");m.setAttribute("aria-label",n);a.DomEvent.on(m,"mousedown dblclick",a.DomEvent.stopPropagation).on(m,"click",a.DomEvent.stop).on(m,"click",k,this).on(m,"click",this._refocusOnMap,this);return m},_updateDisabled:function(){var j=this._map,i="leaflet-disabled";a.DomUtil.removeClass(this._zoomInButton,i);a.DomUtil.removeClass(this._zoomOutButton,i);if(this._disabled||j._zoom===j.getMinZoom()){a.DomUtil.addClass(this._zoomOutButton,i)}if(this._disabled||j._zoom===j.getMaxZoom()){a.DomUtil.addClass(this._zoomInButton,i)}}});a.Map.mergeOptions({zoomControl:true});a.Map.addInitHook(function(){if(this.options.zoomControl){this.zoomControl=new a.Control.Zoom();this.addControl(this.zoomControl)}});a.control.zoom=function(i){return new a.Control.Zoom(i)};a.Control.Attribution=a.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(i){a.setOptions(this,i);this._attributions={}},onAdd:function(k){k.attributionControl=this;this._container=a.DomUtil.create("div","leaflet-control-attribution");if(a.DomEvent){a.DomEvent.disableClickPropagation(this._container)}for(var j in k._layers){if(k._layers[j].getAttribution){this.addAttribution(k._layers[j].getAttribution())}}this._update();return this._container},setPrefix:function(i){this.options.prefix=i;this._update();return this},addAttribution:function(i){if(!i){return this}if(!this._attributions[i]){this._attributions[i]=0}this._attributions[i]++;this._update();return this},removeAttribution:function(i){if(!i){return this}if(this._attributions[i]){this._attributions[i]--;this._update()}return this},_update:function(){if(!this._map){return}var l=[];for(var j in this._attributions){if(this._attributions[j]){l.push(j)}}var k=[];if(this.options.prefix){k.push(this.options.prefix)}if(l.length){k.push(l.join(", "))}this._container.innerHTML=k.join(" | ")}});a.Map.mergeOptions({attributionControl:true});a.Map.addInitHook(function(){if(this.options.attributionControl){new a.Control.Attribution().addTo(this)}});a.control.attribution=function(i){return new a.Control.Attribution(i)};a.Control.Scale=a.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:true,imperial:true},onAdd:function(l){var k="leaflet-control-scale",i=a.DomUtil.create("div",k),j=this.options;this._addScales(j,k+"-line",i);l.on(j.updateWhenIdle?"moveend":"move",this._update,this);l.whenReady(this._update,this);return i},onRemove:function(i){i.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(j,k,i){if(j.metric){this._mScale=a.DomUtil.create("div",k,i)}if(j.imperial){this._iScale=a.DomUtil.create("div",k,i)}},_update:function(){var j=this._map,k=j.getSize().y/2;var i=j.distance(j.containerPointToLatLng([0,k]),j.containerPointToLatLng([this.options.maxWidth,k]));this._updateScales(i)},_updateScales:function(i){if(this.options.metric&&i){this._updateMetric(i)}if(this.options.imperial&&i){this._updateImperial(i)}},_updateMetric:function(k){var i=this._getRoundNum(k),j=i<1000?i+" m":(i/1000)+" km";this._updateScale(this._mScale,j,i/k)},_updateImperial:function(m){var l=m*3.2808399,k,j,i;if(l>5280){k=l/5280;j=this._getRoundNum(k);this._updateScale(this._iScale,j+" mi",j/k)}else{i=this._getRoundNum(l);this._updateScale(this._iScale,i+" ft",i/l)}},_updateScale:function(k,j,i){k.style.width=Math.round(this.options.maxWidth*i)+"px";k.innerHTML=j},_getRoundNum:function(j){var i=Math.pow(10,(Math.floor(j)+"").length-1),k=j/i;k=k>=10?10:k>=5?5:k>=3?3:k>=2?2:1;return i*k}});a.control.scale=function(i){return new a.Control.Scale(i)};a.Control.Layers=a.Control.extend({options:{collapsed:true,position:"topright",autoZIndex:true,hideSingleBase:false,sortLayers:false,sortFunction:function(l,j,k,i){return k1;this._baseLayersList.style.display=j?"":"none"}this._separator.style.display=m&&j?"":"none";return this},_onLayerChange:function(k){if(!this._handlingClick){this._update()}var j=this._getLayer(a.stamp(k.target));var i=j.overlay?(k.type==="add"?"overlayadd":"overlayremove"):(k.type==="add"?"baselayerchange":null);if(i){this._map.fire(i,j)}},_createRadioElement:function(i,l){var k='";var j=b.createElement("div");j.innerHTML=k;return j.firstChild},_addItem:function(o){var l=b.createElement("label"),n=this._map.hasLayer(o.layer),j;if(o.overlay){j=b.createElement("input");j.type="checkbox";j.className="leaflet-control-layers-selector";j.defaultChecked=n}else{j=this._createRadioElement("leaflet-base-layers",n)}j.layerId=a.stamp(o.layer);a.DomEvent.on(j,"click",this._onInputClick,this);var k=b.createElement("span");k.innerHTML=" "+o.name;var m=b.createElement("div");l.appendChild(m);m.appendChild(j);m.appendChild(k);var i=o.overlay?this._overlaysList:this._baseLayersList;i.appendChild(l);this._checkDisabledLayers();return l},_onInputClick:function(){var k=this._form.getElementsByTagName("input"),l,p,j;var n=[],m=[];this._handlingClick=true;for(var o=k.length-1;o>=0;o--){l=k[o];p=this._getLayer(l.layerId).layer;j=this._map.hasLayer(p);if(l.checked&&!j){n.push(p)}else{if(!l.checked&&j){m.push(p)}}}for(o=0;o=0;l--){k=j[l];m=this._getLayer(k.layerId).layer;k.disabled=(m.options.minZoom!==h&&nm.options.maxZoom)}},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}});a.control.layers=function(k,j,i){return new a.Control.Layers(k,j,i)}}(window,document)); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-2.0.8.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-2.0.8.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,3967 @@ +/* esri-leaflet - v2.0.8 - Tue Mar 21 2017 16:10:14 GMT-0700 (PDT) + * Copyright (c) 2017 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}),global.L)); +}(this, function (exports,L$1) { 'use strict'; + + var L$1__default = 'default' in L$1 ? L$1['default'] : L$1; + + var version = "2.0.8"; + + var cors = ((window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest())); + var pointerEvents = document.documentElement.style.pointerEvents === ''; + + var Support = { + cors: cors, + pointerEvents: pointerEvents + }; + + var options = { + attributionWidthOffset: 55 + }; + + var callbacks = 0; + + function serialize (params) { + var data = ''; + + params.f = params.f || 'json'; + + for (var key in params) { + if (params.hasOwnProperty(key)) { + var param = params[key]; + var type = Object.prototype.toString.call(param); + var value; + + if (data.length) { + data += '&'; + } + + if (type === '[object Array]') { + value = (Object.prototype.toString.call(param[0]) === '[object Object]') ? JSON.stringify(param) : param.join(','); + } else if (type === '[object Object]') { + value = JSON.stringify(param); + } else if (type === '[object Date]') { + value = param.valueOf(); + } else { + value = param; + } + + data += encodeURIComponent(key) + '=' + encodeURIComponent(value); + } + } + + return data; + } + + function createRequest (callback, context) { + var httpRequest = new window.XMLHttpRequest(); + + httpRequest.onerror = function (e) { + httpRequest.onreadystatechange = L$1.Util.falseFn; + + callback.call(context, { + error: { + code: 500, + message: 'XMLHttpRequest error' + } + }, null); + }; + + httpRequest.onreadystatechange = function () { + var response; + var error; + + if (httpRequest.readyState === 4) { + try { + response = JSON.parse(httpRequest.responseText); + } catch (e) { + response = null; + error = { + code: 500, + message: 'Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error.' + }; + } + + if (!error && response.error) { + error = response.error; + response = null; + } + + httpRequest.onerror = L$1.Util.falseFn; + + callback.call(context, error, response); + } + }; + + httpRequest.ontimeout = function () { + this.onerror(); + }; + + return httpRequest; + } + + function xmlHttpPost (url, params, callback, context) { + var httpRequest = createRequest(callback, context); + httpRequest.open('POST', url); + + if (typeof context !== 'undefined' && context !== null) { + if (typeof context.options !== 'undefined') { + httpRequest.timeout = context.options.timeout; + } + } + httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + httpRequest.send(serialize(params)); + + return httpRequest; + } + + function xmlHttpGet (url, params, callback, context) { + var httpRequest = createRequest(callback, context); + httpRequest.open('GET', url + '?' + serialize(params), true); + + if (typeof context !== 'undefined' && context !== null) { + if (typeof context.options !== 'undefined') { + httpRequest.timeout = context.options.timeout; + } + } + httpRequest.send(null); + + return httpRequest; + } + + // AJAX handlers for CORS (modern browsers) or JSONP (older browsers) + function request (url, params, callback, context) { + var paramString = serialize(params); + var httpRequest = createRequest(callback, context); + var requestLength = (url + '?' + paramString).length; + + // ie10/11 require the request be opened before a timeout is applied + if (requestLength <= 2000 && Support.cors) { + httpRequest.open('GET', url + '?' + paramString); + } else if (requestLength > 2000 && Support.cors) { + httpRequest.open('POST', url); + httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + + if (typeof context !== 'undefined' && context !== null) { + if (typeof context.options !== 'undefined') { + httpRequest.timeout = context.options.timeout; + } + } + + // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest + if (requestLength <= 2000 && Support.cors) { + httpRequest.send(null); + + // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest + } else if (requestLength > 2000 && Support.cors) { + httpRequest.send(paramString); + + // request is less than 2000 characters and the browser does not support CORS, make a JSONP request + } else if (requestLength <= 2000 && !Support.cors) { + return jsonp(url, params, callback, context); + + // request is longer then 2000 characters and the browser does not support CORS, log a warning + } else { + warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html'); + return; + } + + return httpRequest; + } + + function jsonp (url, params, callback, context) { + window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {}; + var callbackId = 'c' + callbacks; + params.callback = 'window._EsriLeafletCallbacks.' + callbackId; + + window._EsriLeafletCallbacks[callbackId] = function (response) { + if (window._EsriLeafletCallbacks[callbackId] !== true) { + var error; + var responseType = Object.prototype.toString.call(response); + + if (!(responseType === '[object Object]' || responseType === '[object Array]')) { + error = { + error: { + code: 500, + message: 'Expected array or object as JSONP response' + } + }; + response = null; + } + + if (!error && response.error) { + error = response; + response = null; + } + + callback.call(context, error, response); + window._EsriLeafletCallbacks[callbackId] = true; + } + }; + + var script = L$1.DomUtil.create('script', null, document.body); + script.type = 'text/javascript'; + script.src = url + '?' + serialize(params); + script.id = callbackId; + + callbacks++; + + return { + id: callbackId, + url: script.src, + abort: function () { + window._EsriLeafletCallbacks._callback[callbackId]({ + code: 0, + message: 'Request aborted.' + }); + } + }; + } + + var get = ((Support.cors) ? xmlHttpGet : jsonp); + get.CORS = xmlHttpGet; + get.JSONP = jsonp; + + // export the Request object to call the different handlers for debugging + var Request = { + request: request, + get: get, + post: xmlHttpPost + }; + + /* + * Copyright 2015 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the Liscense. + */ + + // checks if 2 x,y points are equal + function pointsEqual (a, b) { + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + } + + // checks if the first and last points of a ring are equal and closes the ring + function closeRing (coordinates) { + if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) { + coordinates.push(coordinates[0]); + } + return coordinates; + } + + // determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring + // or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon- + // points-are-in-clockwise-order + function ringIsClockwise (ringToTest) { + var total = 0; + var i = 0; + var rLength = ringToTest.length; + var pt1 = ringToTest[i]; + var pt2; + for (i; i < rLength - 1; i++) { + pt2 = ringToTest[i + 1]; + total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]); + pt1 = pt2; + } + return (total >= 0); + } + + // ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519 + function vertexIntersectsVertex (a1, a2, b1, b2) { + var uaT = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]); + var ubT = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]); + var uB = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]); + + if (uB !== 0) { + var ua = uaT / uB; + var ub = ubT / uB; + + if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) { + return true; + } + } + + return false; + } + + // ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531 + function arrayIntersectsArray (a, b) { + for (var i = 0; i < a.length - 1; i++) { + for (var j = 0; j < b.length - 1; j++) { + if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) { + return true; + } + } + } + + return false; + } + + // ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480 + function coordinatesContainPoint (coordinates, point) { + var contains = false; + for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) { + if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) || + (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) && + (point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0])) { + contains = !contains; + } + } + return contains; + } + + // ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113 + function coordinatesContainCoordinates (outer, inner) { + var intersects = arrayIntersectsArray(outer, inner); + var contains = coordinatesContainPoint(outer, inner[0]); + if (!intersects && contains) { + return true; + } + return false; + } + + // do any polygons in this array contain any other polygons in this array? + // used for checking for holes in arcgis rings + // ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172 + function convertRingsToGeoJSON (rings) { + var outerRings = []; + var holes = []; + var x; // iterator + var outerRing; // current outer ring being evaluated + var hole; // current hole being evaluated + + // for each ring + for (var r = 0; r < rings.length; r++) { + var ring = closeRing(rings[r].slice(0)); + if (ring.length < 4) { + continue; + } + // is this ring an outer ring? is it clockwise? + if (ringIsClockwise(ring)) { + var polygon = [ ring ]; + outerRings.push(polygon); // push to outer rings + } else { + holes.push(ring); // counterclockwise push to holes + } + } + + var uncontainedHoles = []; + + // while there are holes left... + while (holes.length) { + // pop a hole off out stack + hole = holes.pop(); + + // loop over all outer rings and see if they contain our hole. + var contained = false; + for (x = outerRings.length - 1; x >= 0; x--) { + outerRing = outerRings[x][0]; + if (coordinatesContainCoordinates(outerRing, hole)) { + // the hole is contained push it into our polygon + outerRings[x].push(hole); + contained = true; + break; + } + } + + // ring is not contained in any outer ring + // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320 + if (!contained) { + uncontainedHoles.push(hole); + } + } + + // if we couldn't match any holes using contains we can try intersects... + while (uncontainedHoles.length) { + // pop a hole off out stack + hole = uncontainedHoles.pop(); + + // loop over all outer rings and see if any intersect our hole. + var intersects = false; + + for (x = outerRings.length - 1; x >= 0; x--) { + outerRing = outerRings[x][0]; + if (arrayIntersectsArray(outerRing, hole)) { + // the hole is contained push it into our polygon + outerRings[x].push(hole); + intersects = true; + break; + } + } + + if (!intersects) { + outerRings.push([hole.reverse()]); + } + } + + if (outerRings.length === 1) { + return { + type: 'Polygon', + coordinates: outerRings[0] + }; + } else { + return { + type: 'MultiPolygon', + coordinates: outerRings + }; + } + } + + // This function ensures that rings are oriented in the right directions + // outer rings are clockwise, holes are counterclockwise + // used for converting GeoJSON Polygons to ArcGIS Polygons + function orientRings (poly) { + var output = []; + var polygon = poly.slice(0); + var outerRing = closeRing(polygon.shift().slice(0)); + if (outerRing.length >= 4) { + if (!ringIsClockwise(outerRing)) { + outerRing.reverse(); + } + + output.push(outerRing); + + for (var i = 0; i < polygon.length; i++) { + var hole = closeRing(polygon[i].slice(0)); + if (hole.length >= 4) { + if (ringIsClockwise(hole)) { + hole.reverse(); + } + output.push(hole); + } + } + } + + return output; + } + + // This function flattens holes in multipolygons to one array of polygons + // used for converting GeoJSON Polygons to ArcGIS Polygons + function flattenMultiPolygonRings (rings) { + var output = []; + for (var i = 0; i < rings.length; i++) { + var polygon = orientRings(rings[i]); + for (var x = polygon.length - 1; x >= 0; x--) { + var ring = polygon[x].slice(0); + output.push(ring); + } + } + return output; + } + + // shallow object clone for feature properties and attributes + // from http://jsperf.com/cloning-an-object/2 + function shallowClone$1 (obj) { + var target = {}; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + target[i] = obj[i]; + } + } + return target; + } + + function arcgisToGeoJSON$1 (arcgis, idAttribute) { + var geojson = {}; + + if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') { + geojson.type = 'Point'; + geojson.coordinates = [arcgis.x, arcgis.y]; + } + + if (arcgis.points) { + geojson.type = 'MultiPoint'; + geojson.coordinates = arcgis.points.slice(0); + } + + if (arcgis.paths) { + if (arcgis.paths.length === 1) { + geojson.type = 'LineString'; + geojson.coordinates = arcgis.paths[0].slice(0); + } else { + geojson.type = 'MultiLineString'; + geojson.coordinates = arcgis.paths.slice(0); + } + } + + if (arcgis.rings) { + geojson = convertRingsToGeoJSON(arcgis.rings.slice(0)); + } + + if (arcgis.geometry || arcgis.attributes) { + geojson.type = 'Feature'; + geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON$1(arcgis.geometry) : null; + geojson.properties = (arcgis.attributes) ? shallowClone$1(arcgis.attributes) : null; + if (arcgis.attributes) { + geojson.id = arcgis.attributes[idAttribute] || arcgis.attributes.OBJECTID || arcgis.attributes.FID; + } + } + + return geojson; + } + + function geojsonToArcGIS$1 (geojson, idAttribute) { + idAttribute = idAttribute || 'OBJECTID'; + var spatialReference = { wkid: 4326 }; + var result = {}; + var i; + + switch (geojson.type) { + case 'Point': + result.x = geojson.coordinates[0]; + result.y = geojson.coordinates[1]; + result.spatialReference = spatialReference; + break; + case 'MultiPoint': + result.points = geojson.coordinates.slice(0); + result.spatialReference = spatialReference; + break; + case 'LineString': + result.paths = [geojson.coordinates.slice(0)]; + result.spatialReference = spatialReference; + break; + case 'MultiLineString': + result.paths = geojson.coordinates.slice(0); + result.spatialReference = spatialReference; + break; + case 'Polygon': + result.rings = orientRings(geojson.coordinates.slice(0)); + result.spatialReference = spatialReference; + break; + case 'MultiPolygon': + result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0)); + result.spatialReference = spatialReference; + break; + case 'Feature': + if (geojson.geometry) { + result.geometry = geojsonToArcGIS$1(geojson.geometry, idAttribute); + } + result.attributes = (geojson.properties) ? shallowClone$1(geojson.properties) : {}; + if (geojson.id) { + result.attributes[idAttribute] = geojson.id; + } + break; + case 'FeatureCollection': + result = []; + for (i = 0; i < geojson.features.length; i++) { + result.push(geojsonToArcGIS$1(geojson.features[i], idAttribute)); + } + break; + case 'GeometryCollection': + result = []; + for (i = 0; i < geojson.geometries.length; i++) { + result.push(geojsonToArcGIS$1(geojson.geometries[i], idAttribute)); + } + break; + } + + return result; + } + + function geojsonToArcGIS (geojson, idAttr) { + return geojsonToArcGIS$1(geojson, idAttr); + } + + function arcgisToGeoJSON (arcgis, idAttr) { + return arcgisToGeoJSON$1(arcgis, idAttr); + } + + // shallow object clone for feature properties and attributes + // from http://jsperf.com/cloning-an-object/2 + function shallowClone (obj) { + var target = {}; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + target[i] = obj[i]; + } + } + return target; + } + + // convert an extent (ArcGIS) to LatLngBounds (Leaflet) + function extentToBounds (extent) { + // "NaN" coordinates from ArcGIS Server indicate a null geometry + if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') { + var sw = L$1.latLng(extent.ymin, extent.xmin); + var ne = L$1.latLng(extent.ymax, extent.xmax); + return L$1.latLngBounds(sw, ne); + } else { + return null; + } + } + + // convert an LatLngBounds (Leaflet) to extent (ArcGIS) + function boundsToExtent (bounds) { + bounds = L$1.latLngBounds(bounds); + return { + 'xmin': bounds.getSouthWest().lng, + 'ymin': bounds.getSouthWest().lat, + 'xmax': bounds.getNorthEast().lng, + 'ymax': bounds.getNorthEast().lat, + 'spatialReference': { + 'wkid': 4326 + } + }; + } + + function responseToFeatureCollection (response, idAttribute) { + var objectIdField; + var features = response.features || response.results; + var count = features.length; + + if (idAttribute) { + objectIdField = idAttribute; + } else if (response.objectIdFieldName) { + objectIdField = response.objectIdFieldName; + } else if (response.fields) { + for (var j = 0; j <= response.fields.length - 1; j++) { + if (response.fields[j].type === 'esriFieldTypeOID') { + objectIdField = response.fields[j].name; + break; + } + } + } else if (count) { + /* as a last resort, check for common ID fieldnames in the first feature returned + not foolproof. identifyFeatures can returned a mixed array of features. */ + for (var key in features[0].attributes) { + if (key.match(/^(OBJECTID|FID|OID|ID)$/i)) { + objectIdField = key; + break; + } + } + } + + var featureCollection = { + type: 'FeatureCollection', + features: [] + }; + + if (count) { + for (var i = features.length - 1; i >= 0; i--) { + var feature = arcgisToGeoJSON(features[i], objectIdField); + featureCollection.features.push(feature); + } + } + + return featureCollection; + } + + // trim url whitespace and add a trailing slash if needed + function cleanUrl (url) { + // trim leading and trailing spaces, but not spaces inside the url + url = L$1.Util.trim(url); + + // add a trailing slash to the url if the user omitted it + if (url[url.length - 1] !== '/') { + url += '/'; + } + + return url; + } + + function isArcgisOnline (url) { + /* hosted feature services support geojson as an output format + utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */ + return (/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i).test(url); + } + + function geojsonTypeToArcGIS (geoJsonType) { + var arcgisGeometryType; + switch (geoJsonType) { + case 'Point': + arcgisGeometryType = 'esriGeometryPoint'; + break; + case 'MultiPoint': + arcgisGeometryType = 'esriGeometryMultipoint'; + break; + case 'LineString': + arcgisGeometryType = 'esriGeometryPolyline'; + break; + case 'MultiLineString': + arcgisGeometryType = 'esriGeometryPolyline'; + break; + case 'Polygon': + arcgisGeometryType = 'esriGeometryPolygon'; + break; + case 'MultiPolygon': + arcgisGeometryType = 'esriGeometryPolygon'; + break; + } + + return arcgisGeometryType; + } + + function warn () { + if (console && console.warn) { + console.warn.apply(console, arguments); + } + } + + function calcAttributionWidth (map) { + // either crop at 55px or user defined buffer + return (map.getSize().x - options.attributionWidthOffset) + 'px'; + } + + function setEsriAttribution (map) { + if (map.attributionControl && !map.attributionControl._esriAttributionAdded) { + map.attributionControl.setPrefix('Leaflet | Powered by Esri'); + + var hoverAttributionStyle = document.createElement('style'); + hoverAttributionStyle.type = 'text/css'; + hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' + + 'white-space: normal;' + + '}'; + + document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle); + L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover'); + + // define a new css class in JS to trim attribution into a single line + var attributionStyle = document.createElement('style'); + attributionStyle.type = 'text/css'; + attributionStyle.innerHTML = '.esri-truncated-attribution {' + + 'vertical-align: -3px;' + + 'white-space: nowrap;' + + 'overflow: hidden;' + + 'text-overflow: ellipsis;' + + 'display: inline-block;' + + 'transition: 0s white-space;' + + 'transition-delay: 1s;' + + 'max-width: ' + calcAttributionWidth(map) + ';' + + '}'; + + document.getElementsByTagName('head')[0].appendChild(attributionStyle); + L$1.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution'); + + // update the width used to truncate when the map itself is resized + map.on('resize', function (e) { + map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target); + }); + + map.attributionControl._esriAttributionAdded = true; + } + } + + function _getAttributionData (url, map) { + jsonp(url, {}, L$1.Util.bind(function (error, attributions) { + if (error) { return; } + map._esriAttributions = []; + for (var c = 0; c < attributions.contributors.length; c++) { + var contributor = attributions.contributors[c]; + + for (var i = 0; i < contributor.coverageAreas.length; i++) { + var coverageArea = contributor.coverageAreas[i]; + var southWest = L$1.latLng(coverageArea.bbox[0], coverageArea.bbox[1]); + var northEast = L$1.latLng(coverageArea.bbox[2], coverageArea.bbox[3]); + map._esriAttributions.push({ + attribution: contributor.attribution, + score: coverageArea.score, + bounds: L$1.latLngBounds(southWest, northEast), + minZoom: coverageArea.zoomMin, + maxZoom: coverageArea.zoomMax + }); + } + } + + map._esriAttributions.sort(function (a, b) { + return b.score - a.score; + }); + + // pass the same argument as the map's 'moveend' event + var obj = { target: map }; + _updateMapAttribution(obj); + }, this)); + } + + function _updateMapAttribution (evt) { + var map = evt.target; + var oldAttributions = map._esriAttributions; + + if (map && map.attributionControl && oldAttributions) { + var newAttributions = ''; + var bounds = map.getBounds(); + var wrappedBounds = L$1.latLngBounds( + bounds.getSouthWest().wrap(), + bounds.getNorthEast().wrap() + ); + var zoom = map.getZoom(); + + for (var i = 0; i < oldAttributions.length; i++) { + var attribution = oldAttributions[i]; + var text = attribution.attribution; + + if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) { + newAttributions += (', ' + text); + } + } + + newAttributions = newAttributions.substr(2); + var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution'); + + attributionElement.innerHTML = newAttributions; + attributionElement.style.maxWidth = calcAttributionWidth(map); + + map.fire('attributionupdated', { + attribution: newAttributions + }); + } + } + + var EsriUtil = { + shallowClone: shallowClone, + warn: warn, + cleanUrl: cleanUrl, + isArcgisOnline: isArcgisOnline, + geojsonTypeToArcGIS: geojsonTypeToArcGIS, + responseToFeatureCollection: responseToFeatureCollection, + geojsonToArcGIS: geojsonToArcGIS, + arcgisToGeoJSON: arcgisToGeoJSON, + boundsToExtent: boundsToExtent, + extentToBounds: extentToBounds, + calcAttributionWidth: calcAttributionWidth, + setEsriAttribution: setEsriAttribution, + _getAttributionData: _getAttributionData, + _updateMapAttribution: _updateMapAttribution + }; + + var Task = L$1.Class.extend({ + + options: { + proxy: false, + useCors: cors + }, + + // Generate a method for each methodName:paramName in the setters for this task. + generateSetter: function (param, context) { + return L$1.Util.bind(function (value) { + this.params[param] = value; + return this; + }, context); + }, + + initialize: function (endpoint) { + // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service + if (endpoint.request && endpoint.options) { + this._service = endpoint; + L$1.Util.setOptions(this, endpoint.options); + } else { + L$1.Util.setOptions(this, endpoint); + this.options.url = cleanUrl(endpoint.url); + } + + // clone default params into this object + this.params = L$1.Util.extend({}, this.params || {}); + + // generate setter methods based on the setters object implimented a child class + if (this.setters) { + for (var setter in this.setters) { + var param = this.setters[setter]; + this[setter] = this.generateSetter(param, this); + } + } + }, + + token: function (token) { + if (this._service) { + this._service.authenticate(token); + } else { + this.params.token = token; + } + return this; + }, + + request: function (callback, context) { + if (this._service) { + return this._service.request(this.path, this.params, callback, context); + } + + return this._request('request', this.path, this.params, callback, context); + }, + + _request: function (method, path, params, callback, context) { + var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path; + + if ((method === 'get' || method === 'request') && !this.options.useCors) { + return Request.get.JSONP(url, params, callback, context); + } + + return Request[method](url, params, callback, context); + } + }); + + function task (options) { + return new Task(options); + } + + var Query = Task.extend({ + setters: { + 'offset': 'resultOffset', + 'limit': 'resultRecordCount', + 'fields': 'outFields', + 'precision': 'geometryPrecision', + 'featureIds': 'objectIds', + 'returnGeometry': 'returnGeometry', + 'token': 'token' + }, + + path: 'query', + + params: { + returnGeometry: true, + where: '1=1', + outSr: 4326, + outFields: '*' + }, + + // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations. + within: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer + return this; + }, + + // Returns a feature if any spatial relationship is found. Applies to all shape type combinations. + intersects: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelIntersects'; + return this; + }, + + // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations. + contains: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer + return this; + }, + + // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations. + crosses: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelCrosses'; + return this; + }, + + // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point. + touches: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelTouches'; + return this; + }, + + // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations. + overlaps: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelOverlaps'; + return this; + }, + + // Returns a feature if the envelope of the two shapes intersects. + bboxIntersects: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects'; + return this; + }, + + // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc + indexIntersects: function (geometry) { + this._setGeometry(geometry); + this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry + return this; + }, + + // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online + nearby: function (latlng, radius) { + latlng = L$1.latLng(latlng); + this.params.geometry = [latlng.lng, latlng.lat]; + this.params.geometryType = 'esriGeometryPoint'; + this.params.spatialRel = 'esriSpatialRelIntersects'; + this.params.units = 'esriSRUnit_Meter'; + this.params.distance = radius; + this.params.inSr = 4326; + return this; + }, + + where: function (string) { + // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered + this.params.where = string; + return this; + }, + + between: function (start, end) { + this.params.time = [start.valueOf(), end.valueOf()]; + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + orderBy: function (fieldName, order) { + order = order || 'ASC'; + this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : ''; + this.params.orderByFields += ([fieldName, order]).join(' '); + return this; + }, + + run: function (callback, context) { + this._cleanParams(); + + // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly + if (this.options.isModern || isArcgisOnline(this.options.url)) { + this.params.f = 'geojson'; + + return this.request(function (error, response) { + this._trapSQLerrors(error); + callback.call(context, error, response, response); + }, this); + + // otherwise convert it in the callback then pass it on + } else { + return this.request(function (error, response) { + this._trapSQLerrors(error); + callback.call(context, error, (response && responseToFeatureCollection(response)), response); + }, this); + } + }, + + count: function (callback, context) { + this._cleanParams(); + this.params.returnCountOnly = true; + return this.request(function (error, response) { + callback.call(this, error, (response && response.count), response); + }, context); + }, + + ids: function (callback, context) { + this._cleanParams(); + this.params.returnIdsOnly = true; + return this.request(function (error, response) { + callback.call(this, error, (response && response.objectIds), response); + }, context); + }, + + // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online + bounds: function (callback, context) { + this._cleanParams(); + this.params.returnExtentOnly = true; + return this.request(function (error, response) { + if (response && response.extent && extentToBounds(response.extent)) { + callback.call(context, error, extentToBounds(response.extent), response); + } else { + error = { + message: 'Invalid Bounds' + }; + callback.call(context, error, null, response); + } + }, context); + }, + + // only valid for image services + pixelSize: function (rawPoint) { + var castPoint = L$1.point(rawPoint); + this.params.pixelSize = [castPoint.x, castPoint.y]; + return this; + }, + + // only valid for map services + layer: function (layer) { + this.path = layer + '/query'; + return this; + }, + + _trapSQLerrors: function (error) { + if (error) { + if (error.code === '400') { + warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes'); + } + } + }, + + _cleanParams: function () { + delete this.params.returnIdsOnly; + delete this.params.returnExtentOnly; + delete this.params.returnCountOnly; + }, + + _setGeometry: function (geometry) { + this.params.inSr = 4326; + + // convert bounds to extent and finish + if (geometry instanceof L$1.LatLngBounds) { + // set geometry + geometryType + this.params.geometry = boundsToExtent(geometry); + this.params.geometryType = 'esriGeometryEnvelope'; + return; + } + + // convert L.Marker > L.LatLng + if (geometry.getLatLng) { + geometry = geometry.getLatLng(); + } + + // convert L.LatLng to a geojson point and continue; + if (geometry instanceof L$1.LatLng) { + geometry = { + type: 'Point', + coordinates: [geometry.lng, geometry.lat] + }; + } + + // handle L.GeoJSON, pull out the first geometry + if (geometry instanceof L$1.GeoJSON) { + // reassign geometry to the GeoJSON value (we are assuming that only one feature is present) + geometry = geometry.getLayers()[0].feature.geometry; + this.params.geometry = geojsonToArcGIS(geometry); + this.params.geometryType = geojsonTypeToArcGIS(geometry.type); + } + + // Handle L.Polyline and L.Polygon + if (geometry.toGeoJSON) { + geometry = geometry.toGeoJSON(); + } + + // handle GeoJSON feature by pulling out the geometry + if (geometry.type === 'Feature') { + // get the geometry of the geojson feature + geometry = geometry.geometry; + } + + // confirm that our GeoJSON is a point, line or polygon + if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') { + this.params.geometry = geojsonToArcGIS(geometry); + this.params.geometryType = geojsonTypeToArcGIS(geometry.type); + return; + } + + // warn the user if we havn't found an appropriate object + warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object'); + + return; + } + }); + + function query (options) { + return new Query(options); + } + + var Find = Task.extend({ + setters: { + // method name > param name + 'contains': 'contains', + 'text': 'searchText', + 'fields': 'searchFields', // denote an array or single string + 'spatialReference': 'sr', + 'sr': 'sr', + 'layers': 'layers', + 'returnGeometry': 'returnGeometry', + 'maxAllowableOffset': 'maxAllowableOffset', + 'precision': 'geometryPrecision', + 'dynamicLayers': 'dynamicLayers', + 'returnZ': 'returnZ', + 'returnM': 'returnM', + 'gdbVersion': 'gdbVersion', + 'token': 'token' + }, + + path: 'find', + + params: { + sr: 4326, + contains: true, + returnGeometry: true, + returnZ: true, + returnM: false + }, + + layerDefs: function (id, where) { + this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : ''; + this.params.layerDefs += ([id, where]).join(':'); + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + callback.call(context, error, (response && responseToFeatureCollection(response)), response); + }, context); + } + }); + + function find (options) { + return new Find(options); + } + + var Identify = Task.extend({ + path: 'identify', + + between: function (start, end) { + this.params.time = [start.valueOf(), end.valueOf()]; + return this; + } + }); + + function identify (options) { + return new Identify(options); + } + + var IdentifyFeatures = Identify.extend({ + setters: { + 'layers': 'layers', + 'precision': 'geometryPrecision', + 'tolerance': 'tolerance', + 'returnGeometry': 'returnGeometry' + }, + + params: { + sr: 4326, + layers: 'all', + tolerance: 3, + returnGeometry: true + }, + + on: function (map) { + var extent = boundsToExtent(map.getBounds()); + var size = map.getSize(); + this.params.imageDisplay = [size.x, size.y, 96]; + this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax]; + return this; + }, + + at: function (latlng) { + latlng = L$1.latLng(latlng); + this.params.geometry = [latlng.lng, latlng.lat]; + this.params.geometryType = 'esriGeometryPoint'; + return this; + }, + + layerDef: function (id, where) { + this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : ''; + this.params.layerDefs += ([id, where]).join(':'); + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + // immediately invoke with an error + if (error) { + callback.call(context, error, undefined, response); + return; + + // ok no error lets just assume we have features... + } else { + var featureCollection = responseToFeatureCollection(response); + response.results = response.results.reverse(); + for (var i = 0; i < featureCollection.features.length; i++) { + var feature = featureCollection.features[i]; + feature.layerId = response.results[i].layerId; + } + callback.call(context, undefined, featureCollection, response); + } + }); + } + }); + + function identifyFeatures (options) { + return new IdentifyFeatures(options); + } + + var IdentifyImage = Identify.extend({ + setters: { + 'setMosaicRule': 'mosaicRule', + 'setRenderingRule': 'renderingRule', + 'setPixelSize': 'pixelSize', + 'returnCatalogItems': 'returnCatalogItems', + 'returnGeometry': 'returnGeometry' + }, + + params: { + returnGeometry: false + }, + + at: function (latlng) { + latlng = L$1.latLng(latlng); + this.params.geometry = JSON.stringify({ + x: latlng.lng, + y: latlng.lat, + spatialReference: { + wkid: 4326 + } + }); + this.params.geometryType = 'esriGeometryPoint'; + return this; + }, + + getMosaicRule: function () { + return this.params.mosaicRule; + }, + + getRenderingRule: function () { + return this.params.renderingRule; + }, + + getPixelSize: function () { + return this.params.pixelSize; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + callback.call(context, error, (response && this._responseToGeoJSON(response)), response); + }, this); + }, + + // get pixel data and return as geoJSON point + // populate catalog items (if any) + // merging in any catalogItemVisibilities as a propery of each feature + _responseToGeoJSON: function (response) { + var location = response.location; + var catalogItems = response.catalogItems; + var catalogItemVisibilities = response.catalogItemVisibilities; + var geoJSON = { + 'pixel': { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [location.x, location.y] + }, + 'crs': { + 'type': 'EPSG', + 'properties': { + 'code': location.spatialReference.wkid + } + }, + 'properties': { + 'OBJECTID': response.objectId, + 'name': response.name, + 'value': response.value + }, + 'id': response.objectId + } + }; + + if (response.properties && response.properties.Values) { + geoJSON.pixel.properties.values = response.properties.Values; + } + + if (catalogItems && catalogItems.features) { + geoJSON.catalogItems = responseToFeatureCollection(catalogItems); + if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) { + for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) { + geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i]; + } + } + } + return geoJSON; + } + + }); + + function identifyImage (params) { + return new IdentifyImage(params); + } + + var Service = L$1.Evented.extend({ + + options: { + proxy: false, + useCors: cors, + timeout: 0 + }, + + initialize: function (options) { + options = options || {}; + this._requestQueue = []; + this._authenticating = false; + L$1.Util.setOptions(this, options); + this.options.url = cleanUrl(this.options.url); + }, + + get: function (path, params, callback, context) { + return this._request('get', path, params, callback, context); + }, + + post: function (path, params, callback, context) { + return this._request('post', path, params, callback, context); + }, + + request: function (path, params, callback, context) { + return this._request('request', path, params, callback, context); + }, + + metadata: function (callback, context) { + return this._request('get', '', {}, callback, context); + }, + + authenticate: function (token) { + this._authenticating = false; + this.options.token = token; + this._runQueue(); + return this; + }, + + getTimeout: function () { + return this.options.timeout; + }, + + setTimeout: function (timeout) { + this.options.timeout = timeout; + }, + + _request: function (method, path, params, callback, context) { + this.fire('requeststart', { + url: this.options.url + path, + params: params, + method: method + }, true); + + var wrappedCallback = this._createServiceCallback(method, path, params, callback, context); + + if (this.options.token) { + params.token = this.options.token; + } + + if (this._authenticating) { + this._requestQueue.push([method, path, params, callback, context]); + return; + } else { + var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path; + + if ((method === 'get' || method === 'request') && !this.options.useCors) { + return Request.get.JSONP(url, params, wrappedCallback, context); + } else { + return Request[method](url, params, wrappedCallback, context); + } + } + }, + + _createServiceCallback: function (method, path, params, callback, context) { + return L$1.Util.bind(function (error, response) { + if (error && (error.code === 499 || error.code === 498)) { + this._authenticating = true; + + this._requestQueue.push([method, path, params, callback, context]); + + // fire an event for users to handle and re-authenticate + this.fire('authenticationrequired', { + authenticate: L$1.Util.bind(this.authenticate, this) + }, true); + + // if the user has access to a callback they can handle the auth error + error.authenticate = L$1.Util.bind(this.authenticate, this); + } + + callback.call(context, error, response); + + if (error) { + this.fire('requesterror', { + url: this.options.url + path, + params: params, + message: error.message, + code: error.code, + method: method + }, true); + } else { + this.fire('requestsuccess', { + url: this.options.url + path, + params: params, + response: response, + method: method + }, true); + } + + this.fire('requestend', { + url: this.options.url + path, + params: params, + method: method + }, true); + }, this); + }, + + _runQueue: function () { + for (var i = this._requestQueue.length - 1; i >= 0; i--) { + var request = this._requestQueue[i]; + var method = request.shift(); + this[method].apply(this, request); + } + this._requestQueue = []; + } + }); + + function service (options) { + return new Service(options); + } + + var MapService = Service.extend({ + + identify: function () { + return identifyFeatures(this); + }, + + find: function () { + return find(this); + }, + + query: function () { + return query(this); + } + + }); + + function mapService (options) { + return new MapService(options); + } + + var ImageService = Service.extend({ + + query: function () { + return query(this); + }, + + identify: function () { + return identifyImage(this); + } + }); + + function imageService (options) { + return new ImageService(options); + } + + var FeatureLayerService = Service.extend({ + + options: { + idAttribute: 'OBJECTID' + }, + + query: function () { + return query(this); + }, + + addFeature: function (feature, callback, context) { + delete feature.id; + + feature = geojsonToArcGIS(feature); + + return this.post('addFeatures', { + features: [feature] + }, function (error, response) { + var result = (response && response.addResults) ? response.addResults[0] : undefined; + if (callback) { + callback.call(context, error || response.addResults[0].error, result); + } + }, context); + }, + + updateFeature: function (feature, callback, context) { + feature = geojsonToArcGIS(feature, this.options.idAttribute); + + return this.post('updateFeatures', { + features: [feature] + }, function (error, response) { + var result = (response && response.updateResults) ? response.updateResults[0] : undefined; + if (callback) { + callback.call(context, error || response.updateResults[0].error, result); + } + }, context); + }, + + deleteFeature: function (id, callback, context) { + return this.post('deleteFeatures', { + objectIds: id + }, function (error, response) { + var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined; + if (callback) { + callback.call(context, error || response.deleteResults[0].error, result); + } + }, context); + }, + + deleteFeatures: function (ids, callback, context) { + return this.post('deleteFeatures', { + objectIds: ids + }, function (error, response) { + // pass back the entire array + var result = (response && response.deleteResults) ? response.deleteResults : undefined; + if (callback) { + callback.call(context, error || response.deleteResults[0].error, result); + } + }, context); + } + }); + + function featureLayerService (options) { + return new FeatureLayerService(options); + } + + var tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:'; + + var BasemapLayer = L$1.TileLayer.extend({ + statics: { + TILES: { + Streets: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map' + } + }, + Topographic: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map' + } + }, + Oceans: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap' + } + }, + OceansLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane' + } + }, + NationalGeographic: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.' + } + }, + DarkGray: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors' + } + }, + DarkGrayLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + + } + }, + Gray: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors' + } + }, + GrayLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + Imagery: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community' + } + }, + ImageryLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + ImageryTransportation: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane' + } + }, + ShadedRelief: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + attribution: 'USGS' + } + }, + ShadedReliefLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 12, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + Terrain: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA' + } + }, + TerrainLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + USATopo: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 15, + subdomains: ['server', 'services'], + attribution: 'USGS, National Geographic Society, i-cubed' + } + } + } + }, + + initialize: function (key, options) { + var config; + + // set the config variable with the appropriate config object + if (typeof key === 'object' && key.urlTemplate && key.options) { + config = key; + } else if (typeof key === 'string' && BasemapLayer.TILES[key]) { + config = BasemapLayer.TILES[key]; + } else { + throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"'); + } + + // merge passed options into the config options + var tileOptions = L$1.Util.extend(config.options, options); + + L$1.Util.setOptions(this, tileOptions); + + if (this.options.token) { + config.urlTemplate += ('?token=' + this.options.token); + } + + // call the initialize method on L.TileLayer to set everything up + L$1.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions); + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + if (this.options.pane === 'esri-labels') { + this._initPane(); + } + // some basemaps can supply dynamic attribution + if (this.options.attributionUrl) { + _getAttributionData(this.options.attributionUrl, map); + } + + map.on('moveend', _updateMapAttribution); + + L$1.TileLayer.prototype.onAdd.call(this, map); + }, + + onRemove: function (map) { + map.off('moveend', _updateMapAttribution); + L$1.TileLayer.prototype.onRemove.call(this, map); + }, + + _initPane: function () { + if (!this._map.getPane(this.options.pane)) { + var pane = this._map.createPane(this.options.pane); + pane.style.pointerEvents = 'none'; + pane.style.zIndex = 500; + } + }, + + getAttribution: function () { + if (this.options.attribution) { + var attribution = '' + this.options.attribution + ''; + } + return attribution; + } + }); + + function basemapLayer (key, options) { + return new BasemapLayer(key, options); + } + + var TiledMapLayer = L$1.TileLayer.extend({ + options: { + zoomOffsetAllowance: 0.1, + errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg==' + }, + + statics: { + MercatorZoomLevels: { + '0': 156543.03392799999, + '1': 78271.516963999893, + '2': 39135.758482000099, + '3': 19567.879240999901, + '4': 9783.9396204999593, + '5': 4891.9698102499797, + '6': 2445.9849051249898, + '7': 1222.9924525624899, + '8': 611.49622628138002, + '9': 305.74811314055802, + '10': 152.874056570411, + '11': 76.437028285073197, + '12': 38.218514142536598, + '13': 19.109257071268299, + '14': 9.5546285356341496, + '15': 4.7773142679493699, + '16': 2.38865713397468, + '17': 1.1943285668550501, + '18': 0.59716428355981699, + '19': 0.29858214164761698, + '20': 0.14929107082381, + '21': 0.07464553541191, + '22': 0.0373227677059525, + '23': 0.0186613838529763 + } + }, + + initialize: function (options) { + options.url = cleanUrl(options.url); + options = L$1.Util.setOptions(this, options); + + // set the urls + this.tileUrl = options.url + 'tile/{z}/{y}/{x}'; + this.service = mapService(options); + this.service.addEventParent(this); + + var arcgisonline = new RegExp(/tiles.arcgis(online)?\.com/g); + if (arcgisonline.test(options.url)) { + this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}'); + options.subdomains = ['1', '2', '3', '4']; + } + + if (this.options.token) { + this.tileUrl += ('?token=' + this.options.token); + } + + // init layer by calling TileLayers initialize method + L$1.TileLayer.prototype.initialize.call(this, this.tileUrl, options); + }, + + getTileUrl: function (tilePoint) { + var zoom = this._getZoomForUrl(); + + return L$1.Util.template(this.tileUrl, L$1.Util.extend({ + s: this._getSubdomain(tilePoint), + x: tilePoint.x, + y: tilePoint.y, + // try lod map first, then just default to zoom level + z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom + }, this.options)); + }, + + createTile: function (coords, done) { + var tile = document.createElement('img'); + + L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); + L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); + + if (this.options.crossOrigin) { + tile.crossOrigin = ''; + } + + /* + Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons + http://www.w3.org/TR/WCAG20-TECHS/H67 + */ + tile.alt = ''; + + // if there is no lod map or an lod map with a proper zoom load the tile + // otherwise wait for the lod map to become available + if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) { + tile.src = this.getTileUrl(coords); + } else { + this.once('lodmap', function () { + tile.src = this.getTileUrl(coords); + }, this); + } + + return tile; + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + if (!this._lodMap) { + this.metadata(function (error, metadata) { + if (!error && metadata.spatialReference) { + var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid; + if (!this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + if (map.options.crs === L.CRS.EPSG3857 && sr === 102100 || sr === 3857) { + this._lodMap = {}; + // create the zoom level data + var arcgisLODs = metadata.tileInfo.lods; + var correctResolutions = TiledMapLayer.MercatorZoomLevels; + + for (var i = 0; i < arcgisLODs.length; i++) { + var arcgisLOD = arcgisLODs[i]; + for (var ci in correctResolutions) { + var correctRes = correctResolutions[ci]; + + if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) { + this._lodMap[ci] = arcgisLOD.level; + break; + } + } + } + + this.fire('lodmap'); + } else { + if (!proj4) { + warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html'); + } + } + } + }, this); + } + + L$1.TileLayer.prototype.onAdd.call(this, map); + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + identify: function () { + return this.service.identify(); + }, + + find: function () { + return this.service.find(); + }, + + query: function () { + return this.service.query(); + }, + + authenticate: function (token) { + var tokenQs = '?token=' + token; + this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs; + this.options.token = token; + this.service.authenticate(token); + return this; + }, + + _withinPercentage: function (a, b, percentage) { + var diff = Math.abs((a / b) - 1); + return diff < percentage; + } + }); + + function tiledMapLayer (url, options) { + return new TiledMapLayer(url, options); + } + + var Overlay = L$1.ImageOverlay.extend({ + onAdd: function (map) { + this._topLeft = map.getPixelBounds().min; + L$1.ImageOverlay.prototype.onAdd.call(this, map); + }, + _reset: function () { + if (this._map.options.crs === L$1.CRS.EPSG3857) { + L$1.ImageOverlay.prototype._reset.call(this); + } else { + L$1.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin())); + } + } + }); + + var RasterLayer = L$1.Layer.extend({ + + options: { + opacity: 1, + position: 'front', + f: 'image', + useCors: cors, + attribution: null, + interactive: false, + alt: '' + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + this._update = L$1.Util.throttle(this._update, this.options.updateInterval, this); + + map.on('moveend', this._update, this); + + // if we had an image loaded and it matches the + // current bounds show the image otherwise remove it + if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) { + map.addLayer(this._currentImage); + } else if (this._currentImage) { + this._map.removeLayer(this._currentImage); + this._currentImage = null; + } + + this._update(); + + if (this._popup) { + this._map.on('click', this._getPopupData, this); + this._map.on('dblclick', this._resetPopupState, this); + } + + // add copyright text listed in service metadata + this.metadata(function (err, metadata) { + if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + }, this); + }, + + onRemove: function (map) { + if (this._currentImage) { + this._map.removeLayer(this._currentImage); + } + + if (this._popup) { + this._map.off('click', this._getPopupData, this); + this._map.off('dblclick', this._resetPopupState, this); + } + + this._map.off('moveend', this._update, this); + }, + + bindPopup: function (fn, popupOptions) { + this._shouldRenderPopup = false; + this._lastClick = false; + this._popup = L$1.popup(popupOptions); + this._popupFunction = fn; + if (this._map) { + this._map.on('click', this._getPopupData, this); + this._map.on('dblclick', this._resetPopupState, this); + } + return this; + }, + + unbindPopup: function () { + if (this._map) { + this._map.closePopup(this._popup); + this._map.off('click', this._getPopupData, this); + this._map.off('dblclick', this._resetPopupState, this); + } + this._popup = false; + return this; + }, + + bringToFront: function () { + this.options.position = 'front'; + if (this._currentImage) { + this._currentImage.bringToFront(); + } + return this; + }, + + bringToBack: function () { + this.options.position = 'back'; + if (this._currentImage) { + this._currentImage.bringToBack(); + } + return this; + }, + + getAttribution: function () { + return this.options.attribution; + }, + + getOpacity: function () { + return this.options.opacity; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._currentImage) { + this._currentImage.setOpacity(opacity); + } + return this; + }, + + getTimeRange: function () { + return [this.options.from, this.options.to]; + }, + + setTimeRange: function (from, to) { + this.options.from = from; + this.options.to = to; + this._update(); + return this; + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + authenticate: function (token) { + this.service.authenticate(token); + return this; + }, + + redraw: function () { + this._update(); + }, + + _renderImage: function (url, bounds, contentType) { + if (this._map) { + // if no output directory has been specified for a service, MIME data will be returned + if (contentType) { + url = 'data:' + contentType + ';base64,' + url; + } + // create a new image overlay and add it to the map + // to start loading the image + // opacity is 0 while the image is loading + var image = new Overlay(url, bounds, { + opacity: 0, + crossOrigin: this.options.useCors, + alt: this.options.alt, + pane: this.options.pane || this.getPane(), + interactive: this.options.interactive + }).addTo(this._map); + + // once the image loads + image.once('load', function (e) { + if (this._map) { + var newImage = e.target; + var oldImage = this._currentImage; + + // if the bounds of this image matches the bounds that + // _renderImage was called with and we have a map with the same bounds + // hide the old image if there is one and set the opacity + // of the new image otherwise remove the new image + if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) { + this._currentImage = newImage; + + if (this.options.position === 'front') { + this.bringToFront(); + } else { + this.bringToBack(); + } + + if (this._map && this._currentImage._map) { + this._currentImage.setOpacity(this.options.opacity); + } else { + this._currentImage._map.removeLayer(this._currentImage); + } + + if (oldImage && this._map) { + this._map.removeLayer(oldImage); + } + + if (oldImage && oldImage._map) { + oldImage._map.removeLayer(oldImage); + } + } else { + this._map.removeLayer(newImage); + } + } + + this.fire('load', { + bounds: bounds + }); + }, this); + + this.fire('loading', { + bounds: bounds + }); + } + }, + + _update: function () { + if (!this._map) { + return; + } + + var zoom = this._map.getZoom(); + var bounds = this._map.getBounds(); + + if (this._animatingZoom) { + return; + } + + if (this._map._panTransition && this._map._panTransition._inProgress) { + return; + } + + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + this._currentImage = null; + } + return; + } + + var params = this._buildExportParams(); + + this._requestExport(params, bounds); + }, + + _renderPopup: function (latlng, error, results, response) { + latlng = L$1.latLng(latlng); + if (this._shouldRenderPopup && this._lastClick.equals(latlng)) { + // add the popup to the map where the mouse was clicked at + var content = this._popupFunction(error, results, response); + if (content) { + this._popup.setLatLng(latlng).setContent(content).openOn(this._map); + } + } + }, + + _resetPopupState: function (e) { + this._shouldRenderPopup = false; + this._lastClick = e.latlng; + } + }); + + var ImageMapLayer = RasterLayer.extend({ + + options: { + updateInterval: 150, + format: 'jpgpng', + transparent: true, + f: 'json' + }, + + query: function () { + return this.service.query(); + }, + + identify: function () { + return this.service.identify(); + }, + + initialize: function (options) { + options.url = cleanUrl(options.url); + this.service = imageService(options); + this.service.addEventParent(this); + + L$1.Util.setOptions(this, options); + }, + + setPixelType: function (pixelType) { + this.options.pixelType = pixelType; + this._update(); + return this; + }, + + getPixelType: function () { + return this.options.pixelType; + }, + + setBandIds: function (bandIds) { + if (L$1.Util.isArray(bandIds)) { + this.options.bandIds = bandIds.join(','); + } else { + this.options.bandIds = bandIds.toString(); + } + this._update(); + return this; + }, + + getBandIds: function () { + return this.options.bandIds; + }, + + setNoData: function (noData, noDataInterpretation) { + if (L$1.Util.isArray(noData)) { + this.options.noData = noData.join(','); + } else { + this.options.noData = noData.toString(); + } + if (noDataInterpretation) { + this.options.noDataInterpretation = noDataInterpretation; + } + this._update(); + return this; + }, + + getNoData: function () { + return this.options.noData; + }, + + getNoDataInterpretation: function () { + return this.options.noDataInterpretation; + }, + + setRenderingRule: function (renderingRule) { + this.options.renderingRule = renderingRule; + this._update(); + }, + + getRenderingRule: function () { + return this.options.renderingRule; + }, + + setMosaicRule: function (mosaicRule) { + this.options.mosaicRule = mosaicRule; + this._update(); + }, + + getMosaicRule: function () { + return this.options.mosaicRule; + }, + + _getPopupData: function (e) { + var callback = L$1.Util.bind(function (error, results, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + setTimeout(L$1.Util.bind(function () { + this._renderPopup(e.latlng, error, results, response); + }, this), 300); + }, this); + + var identifyRequest = this.identify().at(e.latlng); + + // set mosaic rule for identify task if it is set for layer + if (this.options.mosaicRule) { + identifyRequest.setMosaicRule(this.options.mosaicRule); + // @TODO: force return catalog items too? + } + + // @TODO: set rendering rule? Not sure, + // sometimes you want raw pixel values + // if (this.options.renderingRule) { + // identifyRequest.setRenderingRule(this.options.renderingRule); + // } + + identifyRequest.run(callback); + + // set the flags to show the popup + this._shouldRenderPopup = true; + this._lastClick = e.latlng; + }, + + _buildExportParams: function () { + var bounds = this._map.getBounds(); + var size = this._map.getSize(); + var ne = this._map.options.crs.project(bounds._northEast); + var sw = this._map.options.crs.project(bounds._southWest); + + // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying + var top = this._map.latLngToLayerPoint(bounds._northEast); + var bottom = this._map.latLngToLayerPoint(bounds._southWest); + + if (top.y > 0 || bottom.y < size.y) { + size.y = bottom.y - top.y; + } + + var sr = parseInt(this._map.options.crs.code.split(':')[1], 10); + + var params = { + bbox: [sw.x, sw.y, ne.x, ne.y].join(','), + size: size.x + ',' + size.y, + format: this.options.format, + transparent: this.options.transparent, + bboxSR: sr, + imageSR: sr + }; + + if (this.options.from && this.options.to) { + params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf(); + } + + if (this.options.pixelType) { + params.pixelType = this.options.pixelType; + } + + if (this.options.interpolation) { + params.interpolation = this.options.interpolation; + } + + if (this.options.compressionQuality) { + params.compressionQuality = this.options.compressionQuality; + } + + if (this.options.bandIds) { + params.bandIds = this.options.bandIds; + } + + if (this.options.noData) { + params.noData = this.options.noData; + } + + if (this.options.noDataInterpretation) { + params.noDataInterpretation = this.options.noDataInterpretation; + } + + if (this.service.options.token) { + params.token = this.service.options.token; + } + + if (this.options.renderingRule) { + params.renderingRule = JSON.stringify(this.options.renderingRule); + } + + if (this.options.mosaicRule) { + params.mosaicRule = JSON.stringify(this.options.mosaicRule); + } + + return params; + }, + + _requestExport: function (params, bounds) { + if (this.options.f === 'json') { + this.service.request('exportImage', params, function (error, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + if (this.options.token) { + response.href += ('?token=' + this.options.token); + } + this._renderImage(response.href, bounds); + }, this); + } else { + params.f = 'image'; + this._renderImage(this.options.url + 'exportImage' + L$1.Util.getParamString(params), bounds); + } + } + }); + + function imageMapLayer (url, options) { + return new ImageMapLayer(url, options); + } + + var DynamicMapLayer = RasterLayer.extend({ + + options: { + updateInterval: 150, + layers: false, + layerDefs: false, + timeOptions: false, + format: 'png24', + transparent: true, + f: 'json' + }, + + initialize: function (options) { + options.url = cleanUrl(options.url); + this.service = mapService(options); + this.service.addEventParent(this); + + if ((options.proxy || options.token) && options.f !== 'json') { + options.f = 'json'; + } + + L$1.Util.setOptions(this, options); + }, + + getDynamicLayers: function () { + return this.options.dynamicLayers; + }, + + setDynamicLayers: function (dynamicLayers) { + this.options.dynamicLayers = dynamicLayers; + this._update(); + return this; + }, + + getLayers: function () { + return this.options.layers; + }, + + setLayers: function (layers) { + this.options.layers = layers; + this._update(); + return this; + }, + + getLayerDefs: function () { + return this.options.layerDefs; + }, + + setLayerDefs: function (layerDefs) { + this.options.layerDefs = layerDefs; + this._update(); + return this; + }, + + getTimeOptions: function () { + return this.options.timeOptions; + }, + + setTimeOptions: function (timeOptions) { + this.options.timeOptions = timeOptions; + this._update(); + return this; + }, + + query: function () { + return this.service.query(); + }, + + identify: function () { + return this.service.identify(); + }, + + find: function () { + return this.service.find(); + }, + + _getPopupData: function (e) { + var callback = L$1.Util.bind(function (error, featureCollection, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + setTimeout(L$1.Util.bind(function () { + this._renderPopup(e.latlng, error, featureCollection, response); + }, this), 300); + }, this); + + var identifyRequest = this.identify().on(this._map).at(e.latlng); + + // remove extraneous vertices from response features + identifyRequest.simplify(this._map, 0.5); + + if (this.options.layers) { + identifyRequest.layers('visible:' + this.options.layers.join(',')); + } else { + identifyRequest.layers('visible'); + } + + identifyRequest.run(callback); + + // set the flags to show the popup + this._shouldRenderPopup = true; + this._lastClick = e.latlng; + }, + + _buildExportParams: function () { + var bounds = this._map.getBounds(); + var size = this._map.getSize(); + var ne = this._map.options.crs.project(bounds.getNorthEast()); + var sw = this._map.options.crs.project(bounds.getSouthWest()); + var sr = parseInt(this._map.options.crs.code.split(':')[1], 10); + + // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying + var top = this._map.latLngToLayerPoint(bounds._northEast); + var bottom = this._map.latLngToLayerPoint(bounds._southWest); + + if (top.y > 0 || bottom.y < size.y) { + size.y = bottom.y - top.y; + } + + var params = { + bbox: [sw.x, sw.y, ne.x, ne.y].join(','), + size: size.x + ',' + size.y, + dpi: 96, + format: this.options.format, + transparent: this.options.transparent, + bboxSR: sr, + imageSR: sr + }; + + if (this.options.dynamicLayers) { + params.dynamicLayers = this.options.dynamicLayers; + } + + if (this.options.layers) { + params.layers = 'show:' + this.options.layers.join(','); + } + + if (this.options.layerDefs) { + params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs); + } + + if (this.options.timeOptions) { + params.timeOptions = JSON.stringify(this.options.timeOptions); + } + + if (this.options.from && this.options.to) { + params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf(); + } + + if (this.service.options.token) { + params.token = this.service.options.token; + } + + if (this.options.proxy) { + params.proxy = this.options.proxy; + } + + return params; + }, + + _requestExport: function (params, bounds) { + if (this.options.f === 'json') { + this.service.request('export', params, function (error, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + + if (this.options.token) { + response.href += ('?token=' + this.options.token); + } + if (this.options.proxy) { + response.href = this.options.proxy + '?' + response.href; + } + if (response.href) { + this._renderImage(response.href, bounds); + } else { + this._renderImage(response.imageData, bounds, response.contentType); + } + }, this); + } else { + params.f = 'image'; + this._renderImage(this.options.url + 'export' + L$1.Util.getParamString(params), bounds); + } + } + }); + + function dynamicMapLayer (url, options) { + return new DynamicMapLayer(url, options); + } + + var VirtualGrid = L$1__default.Layer.extend({ + + options: { + cellSize: 512, + updateInterval: 150 + }, + + initialize: function (options) { + options = L$1__default.setOptions(this, options); + this._zooming = false; + }, + + onAdd: function (map) { + this._map = map; + this._update = L$1__default.Util.throttle(this._update, this.options.updateInterval, this); + this._reset(); + this._update(); + }, + + onRemove: function () { + this._map.removeEventListener(this.getEvents(), this); + this._removeCells(); + }, + + getEvents: function () { + var events = { + moveend: this._update, + zoomstart: this._zoomstart, + zoomend: this._reset + }; + + return events; + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + removeFrom: function (map) { + map.removeLayer(this); + return this; + }, + + _zoomstart: function () { + this._zooming = true; + }, + + _reset: function () { + this._removeCells(); + + this._cells = {}; + this._activeCells = {}; + this._cellsToLoad = 0; + this._cellsTotal = 0; + this._cellNumBounds = this._getCellNumBounds(); + + this._resetWrap(); + this._zooming = false; + }, + + _resetWrap: function () { + var map = this._map; + var crs = map.options.crs; + + if (crs.infinite) { return; } + + var cellSize = this._getCellSize(); + + if (crs.wrapLng) { + this._wrapLng = [ + Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize), + Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize) + ]; + } + + if (crs.wrapLat) { + this._wrapLat = [ + Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize), + Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize) + ]; + } + }, + + _getCellSize: function () { + return this.options.cellSize; + }, + + _update: function () { + if (!this._map) { + return; + } + + var bounds = this._map.getPixelBounds(); + var cellSize = this._getCellSize(); + + // cell coordinates range for the current view + var cellBounds = L$1__default.bounds( + bounds.min.divideBy(cellSize).floor(), + bounds.max.divideBy(cellSize).floor()); + + this._removeOtherCells(cellBounds); + this._addCells(cellBounds); + + this.fire('cellsupdated'); + }, + + _addCells: function (bounds) { + var queue = []; + var center = bounds.getCenter(); + var zoom = this._map.getZoom(); + + var j, i, coords; + // create a queue of coordinates to load cells from + for (j = bounds.min.y; j <= bounds.max.y; j++) { + for (i = bounds.min.x; i <= bounds.max.x; i++) { + coords = L$1__default.point(i, j); + coords.z = zoom; + + if (this._isValidCell(coords)) { + queue.push(coords); + } + } + } + + var cellsToLoad = queue.length; + + if (cellsToLoad === 0) { return; } + + this._cellsToLoad += cellsToLoad; + this._cellsTotal += cellsToLoad; + + // sort cell queue to load cells in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(center) - b.distanceTo(center); + }); + + for (i = 0; i < cellsToLoad; i++) { + this._addCell(queue[i]); + } + }, + + _isValidCell: function (coords) { + var crs = this._map.options.crs; + + if (!crs.infinite) { + // don't load cell if it's out of bounds and not wrapped + var bounds = this._cellNumBounds; + if ( + (!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || + (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y)) + ) { + return false; + } + } + + if (!this.options.bounds) { + return true; + } + + // don't load cell if it doesn't intersect the bounds in options + var cellBounds = this._cellCoordsToBounds(coords); + return L$1__default.latLngBounds(this.options.bounds).intersects(cellBounds); + }, + + // converts cell coordinates to its geographical bounds + _cellCoordsToBounds: function (coords) { + var map = this._map; + var cellSize = this.options.cellSize; + var nwPoint = coords.multiplyBy(cellSize); + var sePoint = nwPoint.add([cellSize, cellSize]); + var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z)); + var se = map.wrapLatLng(map.unproject(sePoint, coords.z)); + + return L$1__default.latLngBounds(nw, se); + }, + + // converts cell coordinates to key for the cell cache + _cellCoordsToKey: function (coords) { + return coords.x + ':' + coords.y; + }, + + // converts cell cache key to coordiantes + _keyToCellCoords: function (key) { + var kArr = key.split(':'); + var x = parseInt(kArr[0], 10); + var y = parseInt(kArr[1], 10); + + return L$1__default.point(x, y); + }, + + // remove any present cells that are off the specified bounds + _removeOtherCells: function (bounds) { + for (var key in this._cells) { + if (!bounds.contains(this._keyToCellCoords(key))) { + this._removeCell(key); + } + } + }, + + _removeCell: function (key) { + var cell = this._activeCells[key]; + + if (cell) { + delete this._activeCells[key]; + + if (this.cellLeave) { + this.cellLeave(cell.bounds, cell.coords); + } + + this.fire('cellleave', { + bounds: cell.bounds, + coords: cell.coords + }); + } + }, + + _removeCells: function () { + for (var key in this._cells) { + var bounds = this._cells[key].bounds; + var coords = this._cells[key].coords; + + if (this.cellLeave) { + this.cellLeave(bounds, coords); + } + + this.fire('cellleave', { + bounds: bounds, + coords: coords + }); + } + }, + + _addCell: function (coords) { + // wrap cell coords if necessary (depending on CRS) + this._wrapCoords(coords); + + // generate the cell key + var key = this._cellCoordsToKey(coords); + + // get the cell from the cache + var cell = this._cells[key]; + // if this cell should be shown as isnt active yet (enter) + + if (cell && !this._activeCells[key]) { + if (this.cellEnter) { + this.cellEnter(cell.bounds, coords); + } + + this.fire('cellenter', { + bounds: cell.bounds, + coords: coords + }); + + this._activeCells[key] = cell; + } + + // if we dont have this cell in the cache yet (create) + if (!cell) { + cell = { + coords: coords, + bounds: this._cellCoordsToBounds(coords) + }; + + this._cells[key] = cell; + this._activeCells[key] = cell; + + if (this.createCell) { + this.createCell(cell.bounds, coords); + } + + this.fire('cellcreate', { + bounds: cell.bounds, + coords: coords + }); + } + }, + + _wrapCoords: function (coords) { + coords.x = this._wrapLng ? L$1__default.Util.wrapNum(coords.x, this._wrapLng) : coords.x; + coords.y = this._wrapLat ? L$1__default.Util.wrapNum(coords.y, this._wrapLat) : coords.y; + }, + + // get the global cell coordinates range for the current zoom + _getCellNumBounds: function () { + var bounds = this._map.getPixelWorldBounds(); + var size = this._getCellSize(); + + return bounds ? L$1__default.bounds( + bounds.min.divideBy(size).floor(), + bounds.max.divideBy(size).ceil().subtract([1, 1])) : null; + } + }); + + function BinarySearchIndex (values) { + this.values = [].concat(values || []); + } + + BinarySearchIndex.prototype.query = function (value) { + var index = this.getIndex(value); + return this.values[index]; + }; + + BinarySearchIndex.prototype.getIndex = function getIndex (value) { + if (this.dirty) { + this.sort(); + } + + var minIndex = 0; + var maxIndex = this.values.length - 1; + var currentIndex; + var currentElement; + + while (minIndex <= maxIndex) { + currentIndex = (minIndex + maxIndex) / 2 | 0; + currentElement = this.values[Math.round(currentIndex)]; + if (+currentElement.value < +value) { + minIndex = currentIndex + 1; + } else if (+currentElement.value > +value) { + maxIndex = currentIndex - 1; + } else { + return currentIndex; + } + } + + return Math.abs(~maxIndex); + }; + + BinarySearchIndex.prototype.between = function between (start, end) { + var startIndex = this.getIndex(start); + var endIndex = this.getIndex(end); + + if (startIndex === 0 && endIndex === 0) { + return []; + } + + while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) { + startIndex--; + } + + while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) { + endIndex++; + } + + if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) { + endIndex++; + } + + return this.values.slice(startIndex, endIndex); + }; + + BinarySearchIndex.prototype.insert = function insert (item) { + this.values.splice(this.getIndex(item.value), 0, item); + return this; + }; + + BinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) { + this.values = this.values.concat([].concat(items || [])); + + if (sort) { + this.sort(); + } else { + this.dirty = true; + } + + return this; + }; + + BinarySearchIndex.prototype.sort = function sort () { + this.values.sort(function (a, b) { + return +b.value - +a.value; + }).reverse(); + this.dirty = false; + return this; + }; + + var FeatureManager = VirtualGrid.extend({ + /** + * Options + */ + + options: { + attribution: null, + where: '1=1', + fields: ['*'], + from: false, + to: false, + timeField: false, + timeFilterMode: 'server', + simplifyFactor: 0, + precision: 6 + }, + + /** + * Constructor + */ + + initialize: function (options) { + VirtualGrid.prototype.initialize.call(this, options); + + options.url = cleanUrl(options.url); + options = L$1.setOptions(this, options); + + this.service = featureLayerService(options); + this.service.addEventParent(this); + + // use case insensitive regex to look for common fieldnames used for indexing + if (this.options.fields[0] !== '*') { + var oidCheck = false; + for (var i = 0; i < this.options.fields.length; i++) { + if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) { + oidCheck = true; + } + } + if (oidCheck === false) { + warn('no known esriFieldTypeOID field detected in fields Array. Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.'); + } + } + + if (this.options.timeField.start && this.options.timeField.end) { + this._startTimeIndex = new BinarySearchIndex(); + this._endTimeIndex = new BinarySearchIndex(); + } else if (this.options.timeField) { + this._timeIndex = new BinarySearchIndex(); + } + + this._cache = {}; + this._currentSnapshot = []; // cache of what layers should be active + this._activeRequests = 0; + }, + + /** + * Layer Interface + */ + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + this.service.metadata(function (err, metadata) { + if (!err) { + var supportedFormats = metadata.supportedQueryFormats; + + // Check if someone has requested that we don't use geoJSON, even if it's available + var forceJsonFormat = false; + if (this.service.options.isModern === false) { + forceJsonFormat = true; + } + + // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively + if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) { + this.service.options.isModern = true; + } + + // add copyright text listed in service metadata + if (!this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + } + }, this); + + map.on('zoomend', this._handleZoomChange, this); + + return VirtualGrid.prototype.onAdd.call(this, map); + }, + + onRemove: function (map) { + map.off('zoomend', this._handleZoomChange, this); + + return VirtualGrid.prototype.onRemove.call(this, map); + }, + + getAttribution: function () { + return this.options.attribution; + }, + + /** + * Feature Management + */ + + createCell: function (bounds, coords) { + // dont fetch features outside the scale range defined for the layer + if (this._visibleZoom()) { + this._requestFeatures(bounds, coords); + } + }, + + _requestFeatures: function (bounds, coords, callback) { + this._activeRequests++; + + // our first active request fires loading + if (this._activeRequests === 1) { + this.fire('loading', { + bounds: bounds + }, true); + } + + return this._buildQuery(bounds).run(function (error, featureCollection, response) { + if (response && response.exceededTransferLimit) { + this.fire('drawlimitexceeded'); + } + + // no error, features + if (!error && featureCollection && featureCollection.features.length) { + // schedule adding features until the next animation frame + L$1.Util.requestAnimFrame(L$1.Util.bind(function () { + this._addFeatures(featureCollection.features, coords); + this._postProcessFeatures(bounds); + }, this)); + } + + // no error, no features + if (!error && featureCollection && !featureCollection.features.length) { + this._postProcessFeatures(bounds); + } + + if (error) { + this._postProcessFeatures(bounds); + } + + if (callback) { + callback.call(this, error, featureCollection); + } + }, this); + }, + + _postProcessFeatures: function (bounds) { + // deincrement the request counter now that we have processed features + this._activeRequests--; + + // if there are no more active requests fire a load event for this view + if (this._activeRequests <= 0) { + this.fire('load', { + bounds: bounds + }); + } + }, + + _cacheKey: function (coords) { + return coords.z + ':' + coords.x + ':' + coords.y; + }, + + _addFeatures: function (features, coords) { + var key = this._cacheKey(coords); + this._cache[key] = this._cache[key] || []; + + for (var i = features.length - 1; i >= 0; i--) { + var id = features[i].id; + + if (this._currentSnapshot.indexOf(id) === -1) { + this._currentSnapshot.push(id); + } + if (this._cache[key].indexOf(id) === -1) { + this._cache[key].push(id); + } + } + + if (this.options.timeField) { + this._buildTimeIndexes(features); + } + + this.createLayers(features); + }, + + _buildQuery: function (bounds) { + var query = this.service.query() + .intersects(bounds) + .where(this.options.where) + .fields(this.options.fields) + .precision(this.options.precision); + + if (this.options.simplifyFactor) { + query.simplify(this._map, this.options.simplifyFactor); + } + + if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) { + query.between(this.options.from, this.options.to); + } + + return query; + }, + + /** + * Where Methods + */ + + setWhere: function (where, callback, context) { + this.options.where = (where && where.length) ? where : '1=1'; + + var oldSnapshot = []; + var newSnapshot = []; + var pendingRequests = 0; + var requestError = null; + var requestCallback = L$1.Util.bind(function (error, featureCollection) { + if (error) { + requestError = error; + } + + if (featureCollection) { + for (var i = featureCollection.features.length - 1; i >= 0; i--) { + newSnapshot.push(featureCollection.features[i].id); + } + } + + pendingRequests--; + + if (pendingRequests <= 0) { + this._currentSnapshot = newSnapshot; + // schedule adding features for the next animation frame + L$1.Util.requestAnimFrame(L$1.Util.bind(function () { + this.removeLayers(oldSnapshot); + this.addLayers(newSnapshot); + if (callback) { + callback.call(context, requestError); + } + }, this)); + } + }, this); + + for (var i = this._currentSnapshot.length - 1; i >= 0; i--) { + oldSnapshot.push(this._currentSnapshot[i]); + } + + for (var key in this._activeCells) { + pendingRequests++; + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key, requestCallback); + } + + return this; + }, + + getWhere: function () { + return this.options.where; + }, + + /** + * Time Range Methods + */ + + getTimeRange: function () { + return [this.options.from, this.options.to]; + }, + + setTimeRange: function (from, to, callback, context) { + var oldFrom = this.options.from; + var oldTo = this.options.to; + var pendingRequests = 0; + var requestError = null; + var requestCallback = L$1.Util.bind(function (error) { + if (error) { + requestError = error; + } + this._filterExistingFeatures(oldFrom, oldTo, from, to); + + pendingRequests--; + + if (callback && pendingRequests <= 0) { + callback.call(context, requestError); + } + }, this); + + this.options.from = from; + this.options.to = to; + + this._filterExistingFeatures(oldFrom, oldTo, from, to); + + if (this.options.timeFilterMode === 'server') { + for (var key in this._activeCells) { + pendingRequests++; + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key, requestCallback); + } + } + + return this; + }, + + refresh: function () { + for (var key in this._activeCells) { + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key); + } + + if (this.redraw) { + this.once('load', function () { + this.eachFeature(function (layer) { + this._redraw(layer.feature.id); + }, this); + }, this); + } + }, + + _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) { + var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot; + var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo); + + if (layersToAdd.indexOf) { + for (var i = 0; i < layersToAdd.length; i++) { + var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]); + if (shouldRemoveLayer >= 0) { + layersToRemove.splice(shouldRemoveLayer, 1); + } + } + } + + // schedule adding features until the next animation frame + L$1.Util.requestAnimFrame(L$1.Util.bind(function () { + this.removeLayers(layersToRemove); + this.addLayers(layersToAdd); + }, this)); + }, + + _getFeaturesInTimeRange: function (start, end) { + var ids = []; + var search; + + if (this.options.timeField.start && this.options.timeField.end) { + var startTimes = this._startTimeIndex.between(start, end); + var endTimes = this._endTimeIndex.between(start, end); + search = startTimes.concat(endTimes); + } else { + search = this._timeIndex.between(start, end); + } + + for (var i = search.length - 1; i >= 0; i--) { + ids.push(search[i].id); + } + + return ids; + }, + + _buildTimeIndexes: function (geojson) { + var i; + var feature; + if (this.options.timeField.start && this.options.timeField.end) { + var startTimeEntries = []; + var endTimeEntries = []; + for (i = geojson.length - 1; i >= 0; i--) { + feature = geojson[i]; + startTimeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField.start]) + }); + endTimeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField.end]) + }); + } + this._startTimeIndex.bulkAdd(startTimeEntries); + this._endTimeIndex.bulkAdd(endTimeEntries); + } else { + var timeEntries = []; + for (i = geojson.length - 1; i >= 0; i--) { + feature = geojson[i]; + timeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField]) + }); + } + + this._timeIndex.bulkAdd(timeEntries); + } + }, + + _featureWithinTimeRange: function (feature) { + if (!this.options.from || !this.options.to) { + return true; + } + + var from = +this.options.from.valueOf(); + var to = +this.options.to.valueOf(); + + if (typeof this.options.timeField === 'string') { + var date = +feature.properties[this.options.timeField]; + return (date >= from) && (date <= to); + } + + if (this.options.timeField.start && this.options.timeField.end) { + var startDate = +feature.properties[this.options.timeField.start]; + var endDate = +feature.properties[this.options.timeField.end]; + return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to)); + } + }, + + _visibleZoom: function () { + // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer + if (!this._map) { + return false; + } + var zoom = this._map.getZoom(); + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + return false; + } else { return true; } + }, + + _handleZoomChange: function () { + if (!this._visibleZoom()) { + this.removeLayers(this._currentSnapshot); + this._currentSnapshot = []; + } else { + /* + for every cell in this._activeCells + 1. Get the cache key for the coords of the cell + 2. If this._cache[key] exists it will be an array of feature IDs. + 3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back. + */ + for (var i in this._activeCells) { + var coords = this._activeCells[i].coords; + var key = this._cacheKey(coords); + if (this._cache[key]) { + this.addLayers(this._cache[key]); + } + } + } + }, + + /** + * Service Methods + */ + + authenticate: function (token) { + this.service.authenticate(token); + return this; + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + query: function () { + return this.service.query(); + }, + + _getMetadata: function (callback) { + if (this._metadata) { + var error; + callback(error, this._metadata); + } else { + this.metadata(L$1.Util.bind(function (error, response) { + this._metadata = response; + callback(error, this._metadata); + }, this)); + } + }, + + addFeature: function (feature, callback, context) { + this._getMetadata(L$1.Util.bind(function (error, metadata) { + if (error) { + if (callback) { callback.call(this, error, null); } + return; + } + + this.service.addFeature(feature, L$1.Util.bind(function (error, response) { + if (!error) { + // assign ID from result to appropriate objectid field from service metadata + feature.properties[metadata.objectIdField] = response.objectId; + + // we also need to update the geojson id for createLayers() to function + feature.id = response.objectId; + this.createLayers([feature]); + } + + if (callback) { + callback.call(context, error, response); + } + }, this)); + }, this)); + }, + + updateFeature: function (feature, callback, context) { + this.service.updateFeature(feature, function (error, response) { + if (!error) { + this.removeLayers([feature.id], true); + this.createLayers([feature]); + } + + if (callback) { + callback.call(context, error, response); + } + }, this); + }, + + deleteFeature: function (id, callback, context) { + this.service.deleteFeature(id, function (error, response) { + if (!error && response.objectId) { + this.removeLayers([response.objectId], true); + } + if (callback) { + callback.call(context, error, response); + } + }, this); + }, + + deleteFeatures: function (ids, callback, context) { + return this.service.deleteFeatures(ids, function (error, response) { + if (!error && response.length > 0) { + for (var i = 0; i < response.length; i++) { + this.removeLayers([response[i].objectId], true); + } + } + if (callback) { + callback.call(context, error, response); + } + }, this); + } + }); + + var FeatureLayer = FeatureManager.extend({ + + options: { + cacheLayers: true + }, + + /** + * Constructor + */ + initialize: function (options) { + FeatureManager.prototype.initialize.call(this, options); + this._originalStyle = this.options.style; + this._layers = {}; + }, + + /** + * Layer Interface + */ + + onRemove: function (map) { + for (var i in this._layers) { + map.removeLayer(this._layers[i]); + // trigger the event when the entire featureLayer is removed from the map + this.fire('removefeature', { + feature: this._layers[i].feature, + permanent: false + }, true); + } + + return FeatureManager.prototype.onRemove.call(this, map); + }, + + createNewLayer: function (geojson) { + var layer = L$1.GeoJSON.geometryToLayer(geojson, this.options); + layer.defaultOptions = layer.options; + return layer; + }, + + _updateLayer: function (layer, geojson) { + // convert the geojson coordinates into a Leaflet LatLng array/nested arrays + // pass it to setLatLngs to update layer geometries + var latlngs = []; + var coordsToLatLng = this.options.coordsToLatLng || L$1.GeoJSON.coordsToLatLng; + + // copy new attributes, if present + if (geojson.properties) { + layer.feature.properties = geojson.properties; + } + + switch (geojson.geometry.type) { + case 'Point': + latlngs = L$1.GeoJSON.coordsToLatLng(geojson.geometry.coordinates); + layer.setLatLng(latlngs); + break; + case 'LineString': + latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'MultiLineString': + latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'Polygon': + latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'MultiPolygon': + latlngs = L$1.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + } + }, + + /** + * Feature Management Methods + */ + + createLayers: function (features) { + for (var i = features.length - 1; i >= 0; i--) { + var geojson = features[i]; + + var layer = this._layers[geojson.id]; + var newLayer; + + if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) { + this._map.addLayer(layer); + this.fire('addfeature', { + feature: layer.feature + }, true); + } + + // update geometry if necessary + if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) { + this._updateLayer(layer, geojson); + } + + if (!layer) { + newLayer = this.createNewLayer(geojson); + newLayer.feature = geojson; + + // bubble events from individual layers to the feature layer + newLayer.addEventParent(this); + + if (this.options.onEachFeature) { + this.options.onEachFeature(newLayer.feature, newLayer); + } + + // cache the layer + this._layers[newLayer.feature.id] = newLayer; + + // style the layer + this.setFeatureStyle(newLayer.feature.id, this.options.style); + + this.fire('createfeature', { + feature: newLayer.feature + }, true); + + // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled + if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) { + this._map.addLayer(newLayer); + } + } + } + }, + + addLayers: function (ids) { + for (var i = ids.length - 1; i >= 0; i--) { + var layer = this._layers[ids[i]]; + if (layer) { + this._map.addLayer(layer); + } + } + }, + + removeLayers: function (ids, permanent) { + for (var i = ids.length - 1; i >= 0; i--) { + var id = ids[i]; + var layer = this._layers[id]; + if (layer) { + this.fire('removefeature', { + feature: layer.feature, + permanent: permanent + }, true); + this._map.removeLayer(layer); + } + if (layer && permanent) { + delete this._layers[id]; + } + } + }, + + cellEnter: function (bounds, coords) { + if (this._visibleZoom() && !this._zooming && this._map) { + L$1.Util.requestAnimFrame(L$1.Util.bind(function () { + var cacheKey = this._cacheKey(coords); + var cellKey = this._cellCoordsToKey(coords); + var layers = this._cache[cacheKey]; + if (this._activeCells[cellKey] && layers) { + this.addLayers(layers); + } + }, this)); + } + }, + + cellLeave: function (bounds, coords) { + if (!this._zooming) { + L$1.Util.requestAnimFrame(L$1.Util.bind(function () { + if (this._map) { + var cacheKey = this._cacheKey(coords); + var cellKey = this._cellCoordsToKey(coords); + var layers = this._cache[cacheKey]; + var mapBounds = this._map.getBounds(); + if (!this._activeCells[cellKey] && layers) { + var removable = true; + + for (var i = 0; i < layers.length; i++) { + var layer = this._layers[layers[i]]; + if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) { + removable = false; + } + } + + if (removable) { + this.removeLayers(layers, !this.options.cacheLayers); + } + + if (!this.options.cacheLayers && removable) { + delete this._cache[cacheKey]; + delete this._cells[cellKey]; + delete this._activeCells[cellKey]; + } + } + } + }, this)); + } + }, + + /** + * Styling Methods + */ + + resetStyle: function () { + this.options.style = this._originalStyle; + this.eachFeature(function (layer) { + this.resetFeatureStyle(layer.feature.id); + }, this); + return this; + }, + + setStyle: function (style) { + this.options.style = style; + this.eachFeature(function (layer) { + this.setFeatureStyle(layer.feature.id, style); + }, this); + return this; + }, + + resetFeatureStyle: function (id) { + var layer = this._layers[id]; + var style = this._originalStyle || L.Path.prototype.options; + if (layer) { + L$1.Util.extend(layer.options, layer.defaultOptions); + this.setFeatureStyle(id, style); + } + return this; + }, + + setFeatureStyle: function (id, style) { + var layer = this._layers[id]; + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + return this; + }, + + /** + * Utility Methods + */ + + eachActiveFeature: function (fn, context) { + // figure out (roughly) which layers are in view + if (this._map) { + var activeBounds = this._map.getBounds(); + for (var i in this._layers) { + if (activeBounds.intersects(this._layers[i].getBounds()) && this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) { + fn.call(context, this._layers[i]); + } + } + } + return this; + }, + + eachFeature: function (fn, context) { + for (var i in this._layers) { + fn.call(context, this._layers[i]); + } + return this; + }, + + getFeature: function (id) { + return this._layers[id]; + }, + + bringToBack: function () { + this.eachFeature(function (layer) { + if (layer.bringToBack) { + layer.bringToBack(); + } + }); + }, + + bringToFront: function () { + this.eachFeature(function (layer) { + if (layer.bringToFront) { + layer.bringToFront(); + } + }); + }, + + redraw: function (id) { + if (id) { + this._redraw(id); + } + return this; + }, + + _redraw: function (id) { + var layer = this._layers[id]; + var geojson = layer.feature; + + // if this looks like a marker + if (layer && layer.setIcon && this.options.pointToLayer) { + // update custom symbology, if necessary + if (this.options.pointToLayer) { + var getIcon = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0])); + var updatedIcon = getIcon.options.icon; + layer.setIcon(updatedIcon); + } + } + + // looks like a vector marker (circleMarker) + if (layer && layer.setStyle && this.options.pointToLayer) { + var getStyle = this.options.pointToLayer(geojson, L$1.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0])); + var updatedStyle = getStyle.options; + this.setFeatureStyle(geojson.id, updatedStyle); + } + + // looks like a path (polygon/polyline) + if (layer && layer.setStyle && this.options.style) { + this.resetStyle(geojson.id); + } + } + }); + + function featureLayer (options) { + return new FeatureLayer(options); + } + + exports.VERSION = version; + exports.Support = Support; + exports.options = options; + exports.Util = EsriUtil; + exports.get = get; + exports.post = xmlHttpPost; + exports.request = request; + exports.Task = Task; + exports.task = task; + exports.Query = Query; + exports.query = query; + exports.Find = Find; + exports.find = find; + exports.Identify = Identify; + exports.identify = identify; + exports.IdentifyFeatures = IdentifyFeatures; + exports.identifyFeatures = identifyFeatures; + exports.IdentifyImage = IdentifyImage; + exports.identifyImage = identifyImage; + exports.Service = Service; + exports.service = service; + exports.MapService = MapService; + exports.mapService = mapService; + exports.ImageService = ImageService; + exports.imageService = imageService; + exports.FeatureLayerService = FeatureLayerService; + exports.featureLayerService = featureLayerService; + exports.BasemapLayer = BasemapLayer; + exports.basemapLayer = basemapLayer; + exports.TiledMapLayer = TiledMapLayer; + exports.tiledMapLayer = tiledMapLayer; + exports.RasterLayer = RasterLayer; + exports.ImageMapLayer = ImageMapLayer; + exports.imageMapLayer = imageMapLayer; + exports.DynamicMapLayer = DynamicMapLayer; + exports.dynamicMapLayer = dynamicMapLayer; + exports.FeatureManager = FeatureManager; + exports.FeatureLayer = FeatureLayer; + exports.featureLayer = featureLayer; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvU3VwcG9ydC5qcyIsIi4uL3NyYy9PcHRpb25zLmpzIiwiLi4vc3JjL1JlcXVlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvYXJjZ2lzLXRvLWdlb2pzb24tdXRpbHMvaW5kZXguanMiLCIuLi9zcmMvVXRpbC5qcyIsIi4uL3NyYy9UYXNrcy9UYXNrLmpzIiwiLi4vc3JjL1Rhc2tzL1F1ZXJ5LmpzIiwiLi4vc3JjL1Rhc2tzL0ZpbmQuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnkuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnlGZWF0dXJlcy5qcyIsIi4uL3NyYy9UYXNrcy9JZGVudGlmeUltYWdlLmpzIiwiLi4vc3JjL1NlcnZpY2VzL1NlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9JbWFnZVNlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvRmVhdHVyZUxheWVyU2VydmljZS5qcyIsIi4uL3NyYy9MYXllcnMvQmFzZW1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9UaWxlZE1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9SYXN0ZXJMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvSW1hZ2VNYXBMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvRHluYW1pY01hcExheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtdmlydHVhbC1ncmlkL3NyYy92aXJ0dWFsLWdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueS1iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwiLi4vc3JjL0xheWVycy9GZWF0dXJlTGF5ZXIvRmVhdHVyZU1hbmFnZXIuanMiLCIuLi9zcmMvTGF5ZXJzL0ZlYXR1cmVMYXllci9GZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXRcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkxlYWZsZXQgcGx1Z2lucyBmb3IgY29uc3VtaW5nIEFyY0dJUyBPbmxpbmUgYW5kIEFyY0dJUyBTZXJ2ZXIgc2VydmljZXMuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC44XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWRlYnVnLmpzXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXNyaS9lc3JpLWxlYWZsZXQvaXNzdWVzXCJcbiAgfSxcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhcmNnaXMtdG8tZ2VvanNvbi11dGlsc1wiOiBcIl4xLjAuMVwiLFxuICAgIFwibGVhZmxldFwiOiBcIl4xLjAuMFwiLFxuICAgIFwibGVhZmxldC12aXJ0dWFsLWdyaWRcIjogXCJeMS4wLjNcIixcbiAgICBcInRpbnktYmluYXJ5LXNlYXJjaFwiOiBcIl4xLjAuMlwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImNoYWlcIjogXCIzLjUuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaGlnaGxpZ2h0LmpzXCI6IFwiXjguMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaHVza3lcIjogXCJeMC4xMi4wXCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMS4zLjBcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjEuMS4xXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMi4yLjFcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjIuMFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJtb2NoYVwiOiBcIl4zLjEuMFwiLFxuICAgIFwicGFyYWxsZWxzaGVsbFwiOiBcIl4yLjAuMFwiLFxuICAgIFwicGhhbnRvbWpzXCI6IFwiXjEuOS44XCIsXG4gICAgXCJyb2xsdXBcIjogXCJeMC4yNS40XCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLWpzb25cIjogXCJeMi4wLjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tbm9kZS1yZXNvbHZlXCI6IFwiXjEuNC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLXVnbGlmeVwiOiBcIl4wLjMuMVwiLFxuICAgIFwic2VtaXN0YW5kYXJkXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJzaW5vblwiOiBcIl4xLjExLjFcIixcbiAgICBcInNpbm9uLWNoYWlcIjogXCIyLjguMFwiLFxuICAgIFwic25henp5XCI6IFwiXjUuMC4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi42LjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0XCIsXG4gIFwibW9kdWxlXCI6IFwic3JjL0VzcmlMZWFmbGV0LmpzXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXQuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1kZWJ1Zy5qc1wiLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXRAZ2l0aHViLmNvbTpFc3JpL2VzcmktbGVhZmxldC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCB8IHNuYXp6eVwiLFxuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmVjb21taXRcIjogXCJucG0gcnVuIGxpbnRcIixcbiAgICBcInJlbGVhc2VcIjogXCIuL3NjcmlwdHMvcmVsZWFzZS5zaFwiLFxuICAgIFwic3RhcnQtd2F0Y2hcIjogXCJ3YXRjaCBcXFwibnBtIHJ1biBidWlsZFxcXCIgc3JjXCIsXG4gICAgXCJzdGFydFwiOiBcInBhcmFsbGVsc2hlbGwgXFxcIm5wbSBydW4gc3RhcnQtd2F0Y2hcXFwiIFxcXCJodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cXFwiXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCJcbiAgfSxcbiAgXCJzZW1pc3RhbmRhcmRcIjoge1xuICAgIFwiZ2xvYmFsc1wiOiBbIFwiZXhwZWN0XCIsIFwiTFwiLCBcIlhNTEh0dHBSZXF1ZXN0XCIsIFwic2lub25cIiwgXCJ4aHJcIiwgXCJwcm9qNFwiIF1cbiAgfVxufVxuIiwiZXhwb3J0IHZhciBjb3JzID0gKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKSk7XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJyc7XG5cbmV4cG9ydCB2YXIgU3VwcG9ydCA9IHtcbiAgY29yczogY29ycyxcbiAgcG9pbnRlckV2ZW50czogcG9pbnRlckV2ZW50c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VwcG9ydDtcbiIsImV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcbiAgYXR0cmlidXRpb25XaWR0aE9mZnNldDogNTVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCJpbXBvcnQgeyBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3VwcG9ydCBmcm9tICcuL1N1cHBvcnQnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vVXRpbCc7XG5cbnZhciBjYWxsYmFja3MgPSAwO1xuXG5mdW5jdGlvbiBzZXJpYWxpemUgKHBhcmFtcykge1xuICB2YXIgZGF0YSA9ICcnO1xuXG4gIHBhcmFtcy5mID0gcGFyYW1zLmYgfHwgJ2pzb24nO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFyYW0pO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgZGF0YSArPSAnJic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHZhbHVlID0gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbVswXSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtKSA6IHBhcmFtLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlT2YoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGFyYW07XG4gICAgICB9XG5cbiAgICAgIGRhdGEgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0IChjYWxsYmFjaywgY29udGV4dCkge1xuICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgIG1lc3NhZ2U6ICdYTUxIdHRwUmVxdWVzdCBlcnJvcidcbiAgICAgIH1cbiAgICB9LCBudWxsKTtcbiAgfTtcblxuICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiBUaGlzIGNvdWxkIGFsc28gYmUgY2F1c2VkIGJ5IGEgQ09SUyBvciBYTUxIdHRwUmVxdWVzdCBlcnJvci4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG4gICAgfVxuICB9O1xuXG4gIGh0dHBSZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9uZXJyb3IoKTtcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIHhtbEh0dHBQb3N0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIGh0dHBSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdChjYWxsYmFjaywgY29udGV4dCk7XG4gIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gIGh0dHBSZXF1ZXN0LnNlbmQoc2VyaWFsaXplKHBhcmFtcykpO1xuXG4gIHJldHVybiBodHRwUmVxdWVzdDtcbn1cblxuZnVuY3Rpb24geG1sSHR0cEdldCAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyAnPycgKyBzZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0ICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gY29udGV4dC5vcHRpb25zLnRpbWVvdXQ7XG4gICAgfVxuICB9XG4gIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG4vLyBBSkFYIGhhbmRsZXJzIGZvciBDT1JTIChtb2Rlcm4gYnJvd3NlcnMpIG9yIEpTT05QIChvbGRlciBicm93c2VycylcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIHBhcmFtU3RyaW5nID0gc2VyaWFsaXplKHBhcmFtcyk7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICB2YXIgcmVxdWVzdExlbmd0aCA9ICh1cmwgKyAnPycgKyBwYXJhbVN0cmluZykubGVuZ3RoO1xuXG4gIC8vIGllMTAvMTEgcmVxdWlyZSB0aGUgcmVxdWVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgdGltZW91dCBpcyBhcHBsaWVkXG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgJz8nICsgcGFyYW1TdHJpbmcpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RMZW5ndGggPiAyMDAwICYmIFN1cHBvcnQuY29ycykge1xuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgaXMgbGVzcyB0aGFuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ09SUywgbWFrZSBHRVQgcmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcblxuICAvLyByZXF1ZXN0IGlzIG1vcmUgdGhhbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIENPUlMsIG1ha2UgUE9TVCByZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgfSBlbHNlIGlmIChyZXF1ZXN0TGVuZ3RoID4gMjAwMCAmJiBTdXBwb3J0LmNvcnMpIHtcbiAgICBodHRwUmVxdWVzdC5zZW5kKHBhcmFtU3RyaW5nKTtcblxuICAvLyByZXF1ZXN0IGlzIGxlc3MgIHRoYW4gMjAwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIG1ha2UgYSBKU09OUCByZXF1ZXN0XG4gIH0gZWxzZSBpZiAocmVxdWVzdExlbmd0aCA8PSAyMDAwICYmICFTdXBwb3J0LmNvcnMpIHtcbiAgICByZXR1cm4ganNvbnAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAvLyByZXF1ZXN0IGlzIGxvbmdlciB0aGVuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCBsb2cgYSB3YXJuaW5nXG4gIH0gZWxzZSB7XG4gICAgd2FybignYSByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHdhcyBsb25nZXIgdGhlbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoaXMgYnJvd3NlciBjYW5ub3QgbWFrZSBhIGNyb3NzLWRvbWFpbiBwb3N0IHJlcXVlc3QuIFBsZWFzZSB1c2UgYSBwcm94eSBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2FwaS1yZWZlcmVuY2UvcmVxdWVzdC5odG1sJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnAgKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICB3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzID0gd2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGNhbGxiYWNrSWQgPSAnYycgKyBjYWxsYmFja3M7XG4gIHBhcmFtcy5jYWxsYmFjayA9ICd3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzLicgKyBjYWxsYmFja0lkO1xuXG4gIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAod2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrc1tjYWxsYmFja0lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXNwb25zZSk7XG5cbiAgICAgIGlmICghKHJlc3BvbnNlVHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgcmVzcG9uc2VUeXBlID09PSAnW29iamVjdCBBcnJheV0nKSkge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBKU09OUCByZXNwb25zZSdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvciAmJiByZXNwb25zZS5lcnJvcikge1xuICAgICAgICBlcnJvciA9IHJlc3BvbnNlO1xuICAgICAgICByZXNwb25zZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2NyaXB0ID0gRG9tVXRpbC5jcmVhdGUoJ3NjcmlwdCcsIG51bGwsIGRvY3VtZW50LmJvZHkpO1xuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICBzY3JpcHQuc3JjID0gdXJsICsgJz8nICsgc2VyaWFsaXplKHBhcmFtcyk7XG4gIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7XG5cbiAgY2FsbGJhY2tzKys7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogY2FsbGJhY2tJZCxcbiAgICB1cmw6IHNjcmlwdC5zcmMsXG4gICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3MuX2NhbGxiYWNrW2NhbGxiYWNrSWRdKHtcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgYWJvcnRlZC4nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBnZXQgPSAoKFN1cHBvcnQuY29ycykgPyB4bWxIdHRwR2V0IDoganNvbnApO1xuZ2V0LkNPUlMgPSB4bWxIdHRwR2V0O1xuZ2V0LkpTT05QID0ganNvbnA7XG5cbi8vIGNob29zZSB0aGUgY29ycmVjdCBBSkFYIGhhbmRsZXIgZGVwZW5kaW5nIG9uIENPUlMgc3VwcG9ydFxuZXhwb3J0IHsgZ2V0IH07XG5cbi8vIGFsd2F5cyB1c2UgWE1MSHR0cFJlcXVlc3QgZm9yIHBvc3RzXG5leHBvcnQgeyB4bWxIdHRwUG9zdCBhcyBwb3N0IH07XG5cbi8vIGV4cG9ydCB0aGUgUmVxdWVzdCBvYmplY3QgdG8gY2FsbCB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIGZvciBkZWJ1Z2dpbmdcbmV4cG9ydCB2YXIgUmVxdWVzdCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCxcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHhtbEh0dHBQb3N0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE1IEVzcmlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpc2NlbnNlLlxuICovXG5cbi8vIGNoZWNrcyBpZiAyIHgseSBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBwb2ludHNFcXVhbCAoYSwgYikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY2hlY2tzIGlmIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgb2YgYSByaW5nIGFyZSBlcXVhbCBhbmQgY2xvc2VzIHRoZSByaW5nXG5mdW5jdGlvbiBjbG9zZVJpbmcgKGNvb3JkaW5hdGVzKSB7XG4gIGlmICghcG9pbnRzRXF1YWwoY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdKSkge1xuICAgIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pO1xuICB9XG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuLy8gZGV0ZXJtaW5lIGlmIHBvbHlnb24gcmluZyBjb29yZGluYXRlcyBhcmUgY2xvY2t3aXNlLiBjbG9ja3dpc2Ugc2lnbmlmaWVzIG91dGVyIHJpbmcsIGNvdW50ZXItY2xvY2t3aXNlIGFuIGlubmVyIHJpbmdcbi8vIG9yIGhvbGUuIHRoaXMgbG9naWMgd2FzIGZvdW5kIGF0IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE2NTY0Ny9ob3ctdG8tZGV0ZXJtaW5lLWlmLWEtbGlzdC1vZi1wb2x5Z29uLVxuLy8gcG9pbnRzLWFyZS1pbi1jbG9ja3dpc2Utb3JkZXJcbmZ1bmN0aW9uIHJpbmdJc0Nsb2Nrd2lzZSAocmluZ1RvVGVzdCkge1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciByTGVuZ3RoID0gcmluZ1RvVGVzdC5sZW5ndGg7XG4gIHZhciBwdDEgPSByaW5nVG9UZXN0W2ldO1xuICB2YXIgcHQyO1xuICBmb3IgKGk7IGkgPCByTGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgcHQyID0gcmluZ1RvVGVzdFtpICsgMV07XG4gICAgdG90YWwgKz0gKHB0MlswXSAtIHB0MVswXSkgKiAocHQyWzFdICsgcHQxWzFdKTtcbiAgICBwdDEgPSBwdDI7XG4gIH1cbiAgcmV0dXJuICh0b3RhbCA+PSAwKTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDUwNC1MNTE5XG5mdW5jdGlvbiB2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4IChhMSwgYTIsIGIxLCBiMikge1xuICB2YXIgdWFUID0gKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGIyWzFdIC0gYjFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdWJUID0gKGEyWzBdIC0gYTFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pO1xuICB2YXIgdUIgPSAoYjJbMV0gLSBiMVsxXSkgKiAoYTJbMF0gLSBhMVswXSkgLSAoYjJbMF0gLSBiMVswXSkgKiAoYTJbMV0gLSBhMVsxXSk7XG5cbiAgaWYgKHVCICE9PSAwKSB7XG4gICAgdmFyIHVhID0gdWFUIC8gdUI7XG4gICAgdmFyIHViID0gdWJUIC8gdUI7XG5cbiAgICBpZiAodWEgPj0gMCAmJiB1YSA8PSAxICYmIHViID49IDAgJiYgdWIgPD0gMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNTIxLUw1MzFcbmZ1bmN0aW9uIGFycmF5SW50ZXJzZWN0c0FycmF5IChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAodmVydGV4SW50ZXJzZWN0c1ZlcnRleChhW2ldLCBhW2kgKyAxXSwgYltqXSwgYltqICsgMV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gcG9ydGVkIGZyb20gdGVycmFmb3JtZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvVGVycmFmb3JtZXIvYmxvYi9tYXN0ZXIvdGVycmFmb3JtZXIuanMjTDQ3MC1MNDgwXG5mdW5jdGlvbiBjb29yZGluYXRlc0NvbnRhaW5Qb2ludCAoY29vcmRpbmF0ZXMsIHBvaW50KSB7XG4gIHZhciBjb250YWlucyA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gLTEsIGwgPSBjb29yZGluYXRlcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHtcbiAgICBpZiAoKChjb29yZGluYXRlc1tpXVsxXSA8PSBwb2ludFsxXSAmJiBwb2ludFsxXSA8IGNvb3JkaW5hdGVzW2pdWzFdKSB8fFxuICAgICAgICAgKGNvb3JkaW5hdGVzW2pdWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbaV1bMV0pKSAmJlxuICAgICAgICAocG9pbnRbMF0gPCAoY29vcmRpbmF0ZXNbal1bMF0gLSBjb29yZGluYXRlc1tpXVswXSkgKiAocG9pbnRbMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgLyAoY29vcmRpbmF0ZXNbal1bMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHtcbiAgICAgIGNvbnRhaW5zID0gIWNvbnRhaW5zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbnM7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMDYtTDExM1xuZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMgKG91dGVyLCBpbm5lcikge1xuICB2YXIgaW50ZXJzZWN0cyA9IGFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7XG4gIHZhciBjb250YWlucyA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7XG4gIGlmICghaW50ZXJzZWN0cyAmJiBjb250YWlucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT9cbi8vIHVzZWQgZm9yIGNoZWNraW5nIGZvciBob2xlcyBpbiBhcmNnaXMgcmluZ3Ncbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMTctTDE3MlxuZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OIChyaW5ncykge1xuICB2YXIgb3V0ZXJSaW5ncyA9IFtdO1xuICB2YXIgaG9sZXMgPSBbXTtcbiAgdmFyIHg7IC8vIGl0ZXJhdG9yXG4gIHZhciBvdXRlclJpbmc7IC8vIGN1cnJlbnQgb3V0ZXIgcmluZyBiZWluZyBldmFsdWF0ZWRcbiAgdmFyIGhvbGU7IC8vIGN1cnJlbnQgaG9sZSBiZWluZyBldmFsdWF0ZWRcblxuICAvLyBmb3IgZWFjaCByaW5nXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3MubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGNsb3NlUmluZyhyaW5nc1tyXS5zbGljZSgwKSk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGlzIHRoaXMgcmluZyBhbiBvdXRlciByaW5nPyBpcyBpdCBjbG9ja3dpc2U/XG4gICAgaWYgKHJpbmdJc0Nsb2Nrd2lzZShyaW5nKSkge1xuICAgICAgdmFyIHBvbHlnb24gPSBbIHJpbmcgXTtcbiAgICAgIG91dGVyUmluZ3MucHVzaChwb2x5Z29uKTsgLy8gcHVzaCB0byBvdXRlciByaW5nc1xuICAgIH0gZWxzZSB7XG4gICAgICBob2xlcy5wdXNoKHJpbmcpOyAvLyBjb3VudGVyY2xvY2t3aXNlIHB1c2ggdG8gaG9sZXNcbiAgICB9XG4gIH1cblxuICB2YXIgdW5jb250YWluZWRIb2xlcyA9IFtdO1xuXG4gIC8vIHdoaWxlIHRoZXJlIGFyZSBob2xlcyBsZWZ0Li4uXG4gIHdoaWxlIChob2xlcy5sZW5ndGgpIHtcbiAgICAvLyBwb3AgYSBob2xlIG9mZiBvdXQgc3RhY2tcbiAgICBob2xlID0gaG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLlxuICAgIHZhciBjb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKHggPSBvdXRlclJpbmdzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdO1xuICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpIHtcbiAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvblxuICAgICAgICBvdXRlclJpbmdzW3hdLnB1c2goaG9sZSk7XG4gICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJpbmcgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgb3V0ZXIgcmluZ1xuICAgIC8vIHNvbWV0aW1lcyB0aGlzIGhhcHBlbnMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0L2lzc3Vlcy8zMjBcbiAgICBpZiAoIWNvbnRhaW5lZCkge1xuICAgICAgdW5jb250YWluZWRIb2xlcy5wdXNoKGhvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGNvdWxkbid0IG1hdGNoIGFueSBob2xlcyB1c2luZyBjb250YWlucyB3ZSBjYW4gdHJ5IGludGVyc2VjdHMuLi5cbiAgd2hpbGUgKHVuY29udGFpbmVkSG9sZXMubGVuZ3RoKSB7XG4gICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrXG4gICAgaG9sZSA9IHVuY29udGFpbmVkSG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgYW55IGludGVyc2VjdCBvdXIgaG9sZS5cbiAgICB2YXIgaW50ZXJzZWN0cyA9IGZhbHNlO1xuXG4gICAgZm9yICh4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTtcbiAgICAgIGlmIChhcnJheUludGVyc2VjdHNBcnJheShvdXRlclJpbmcsIGhvbGUpKSB7XG4gICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb25cbiAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpO1xuICAgICAgICBpbnRlcnNlY3RzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnNlY3RzKSB7XG4gICAgICBvdXRlclJpbmdzLnB1c2goW2hvbGUucmV2ZXJzZSgpXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBvdXRlclJpbmdzWzBdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ011bHRpUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgcmluZ3MgYXJlIG9yaWVudGVkIGluIHRoZSByaWdodCBkaXJlY3Rpb25zXG4vLyBvdXRlciByaW5ncyBhcmUgY2xvY2t3aXNlLCBob2xlcyBhcmUgY291bnRlcmNsb2Nrd2lzZVxuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gb3JpZW50UmluZ3MgKHBvbHkpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7XG4gIHZhciBvdXRlclJpbmcgPSBjbG9zZVJpbmcocG9seWdvbi5zaGlmdCgpLnNsaWNlKDApKTtcbiAgaWYgKG91dGVyUmluZy5sZW5ndGggPj0gNCkge1xuICAgIGlmICghcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpIHtcbiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhvbGUgPSBjbG9zZVJpbmcocG9seWdvbltpXS5zbGljZSgwKSk7XG4gICAgICBpZiAoaG9sZS5sZW5ndGggPj0gNCkge1xuICAgICAgICBpZiAocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKSB7XG4gICAgICAgICAgaG9sZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goaG9sZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29uc1xuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzIChyaW5ncykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9seWdvbiA9IG9yaWVudFJpbmdzKHJpbmdzW2ldKTtcbiAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApO1xuICAgICAgb3V0cHV0LnB1c2gocmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8vIHNoYWxsb3cgb2JqZWN0IGNsb25lIGZvciBmZWF0dXJlIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbi8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMlxuZnVuY3Rpb24gc2hhbGxvd0Nsb25lIChvYmopIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyY2dpc1RvR2VvSlNPTiAoYXJjZ2lzLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgZ2VvanNvbiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgYXJjZ2lzLnggPT09ICdudW1iZXInICYmIHR5cGVvZiBhcmNnaXMueSA9PT0gJ251bWJlcicpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBbYXJjZ2lzLngsIGFyY2dpcy55XTtcbiAgfVxuXG4gIGlmIChhcmNnaXMucG9pbnRzKSB7XG4gICAgZ2VvanNvbi50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucG9pbnRzLnNsaWNlKDApO1xuICB9XG5cbiAgaWYgKGFyY2dpcy5wYXRocykge1xuICAgIGlmIChhcmNnaXMucGF0aHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gYXJjZ2lzLnBhdGhzWzBdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW9qc29uLnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHMuc2xpY2UoMCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyY2dpcy5yaW5ncykge1xuICAgIGdlb2pzb24gPSBjb252ZXJ0UmluZ3NUb0dlb0pTT04oYXJjZ2lzLnJpbmdzLnNsaWNlKDApKTtcbiAgfVxuXG4gIGlmIChhcmNnaXMuZ2VvbWV0cnkgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnRmVhdHVyZSc7XG4gICAgZ2VvanNvbi5nZW9tZXRyeSA9IChhcmNnaXMuZ2VvbWV0cnkpID8gYXJjZ2lzVG9HZW9KU09OKGFyY2dpcy5nZW9tZXRyeSkgOiBudWxsO1xuICAgIGdlb2pzb24ucHJvcGVydGllcyA9IChhcmNnaXMuYXR0cmlidXRlcykgPyBzaGFsbG93Q2xvbmUoYXJjZ2lzLmF0dHJpYnV0ZXMpIDogbnVsbDtcbiAgICBpZiAoYXJjZ2lzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGdlb2pzb24uaWQgPSBhcmNnaXMuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuT0JKRUNUSUQgfHwgYXJjZ2lzLmF0dHJpYnV0ZXMuRklEO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZW9qc29uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblRvQXJjR0lTIChnZW9qc29uLCBpZEF0dHJpYnV0ZSkge1xuICBpZEF0dHJpYnV0ZSA9IGlkQXR0cmlidXRlIHx8ICdPQkpFQ1RJRCc7XG4gIHZhciBzcGF0aWFsUmVmZXJlbmNlID0geyB3a2lkOiA0MzI2IH07XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlICdQb2ludCc6XG4gICAgICByZXN1bHQueCA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMF07XG4gICAgICByZXN1bHQueSA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIHJlc3VsdC5wb2ludHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgICByZXN1bHQucGF0aHMgPSBbZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKV07XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgcmVzdWx0LnBhdGhzID0gZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gb3JpZW50UmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgcmVzdWx0LnJpbmdzID0gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzKGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCkpO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZSc6XG4gICAgICBpZiAoZ2VvanNvbi5nZW9tZXRyeSkge1xuICAgICAgICByZXN1bHQuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5nZW9tZXRyeSwgaWRBdHRyaWJ1dGUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmF0dHJpYnV0ZXMgPSAoZ2VvanNvbi5wcm9wZXJ0aWVzKSA/IHNoYWxsb3dDbG9uZShnZW9qc29uLnByb3BlcnRpZXMpIDoge307XG4gICAgICBpZiAoZ2VvanNvbi5pZCkge1xuICAgICAgICByZXN1bHQuYXR0cmlidXRlc1tpZEF0dHJpYnV0ZV0gPSBnZW9qc29uLmlkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOlxuICAgICAgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5mZWF0dXJlc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0dlb21ldHJ5Q29sbGVjdGlvbic6XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvblRvQXJjR0lTKGdlb2pzb24uZ2VvbWV0cmllc1tpXSwgaWRBdHRyaWJ1dGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IGxhdExuZywgbGF0TG5nQm91bmRzLCBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBqc29ucCB9IGZyb20gJy4vUmVxdWVzdCc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zJztcblxuaW1wb3J0IHtcbiAgZ2VvanNvblRvQXJjR0lTIGFzIGcyYSxcbiAgYXJjZ2lzVG9HZW9KU09OIGFzIGEyZ1xufSBmcm9tICdhcmNnaXMtdG8tZ2VvanNvbi11dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cikge1xuICByZXR1cm4gZzJhKGdlb2pzb24sIGlkQXR0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyKSB7XG4gIHJldHVybiBhMmcoYXJjZ2lzLCBpZEF0dHIpO1xufVxuXG4vLyBzaGFsbG93IG9iamVjdCBjbG9uZSBmb3IgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzXG4vLyBmcm9tIGh0dHA6Ly9qc3BlcmYuY29tL2Nsb25pbmctYW4tb2JqZWN0LzJcbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q2xvbmUgKG9iaikge1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vLyBjb252ZXJ0IGFuIGV4dGVudCAoQXJjR0lTKSB0byBMYXRMbmdCb3VuZHMgKExlYWZsZXQpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW50VG9Cb3VuZHMgKGV4dGVudCkge1xuICAvLyBcIk5hTlwiIGNvb3JkaW5hdGVzIGZyb20gQXJjR0lTIFNlcnZlciBpbmRpY2F0ZSBhIG51bGwgZ2VvbWV0cnlcbiAgaWYgKGV4dGVudC54bWluICE9PSAnTmFOJyAmJiBleHRlbnQueW1pbiAhPT0gJ05hTicgJiYgZXh0ZW50LnhtYXggIT09ICdOYU4nICYmIGV4dGVudC55bWF4ICE9PSAnTmFOJykge1xuICAgIHZhciBzdyA9IGxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pO1xuICAgIHZhciBuZSA9IGxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpO1xuICAgIHJldHVybiBsYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBjb252ZXJ0IGFuIExhdExuZ0JvdW5kcyAoTGVhZmxldCkgdG8gZXh0ZW50IChBcmNHSVMpXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzVG9FeHRlbnQgKGJvdW5kcykge1xuICBib3VuZHMgPSBsYXRMbmdCb3VuZHMoYm91bmRzKTtcbiAgcmV0dXJuIHtcbiAgICAneG1pbic6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsXG4gICAgJ3ltaW4nOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LFxuICAgICd4bWF4JzogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxuZyxcbiAgICAneW1heCc6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiB7XG4gICAgICAnd2tpZCc6IDQzMjZcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gKHJlc3BvbnNlLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgb2JqZWN0SWRGaWVsZDtcbiAgdmFyIGZlYXR1cmVzID0gcmVzcG9uc2UuZmVhdHVyZXMgfHwgcmVzcG9uc2UucmVzdWx0cztcbiAgdmFyIGNvdW50ID0gZmVhdHVyZXMubGVuZ3RoO1xuXG4gIGlmIChpZEF0dHJpYnV0ZSkge1xuICAgIG9iamVjdElkRmllbGQgPSBpZEF0dHJpYnV0ZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZSkge1xuICAgIG9iamVjdElkRmllbGQgPSByZXNwb25zZS5vYmplY3RJZEZpZWxkTmFtZTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5maWVsZHMpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSByZXNwb25zZS5maWVsZHMubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICBpZiAocmVzcG9uc2UuZmllbGRzW2pdLnR5cGUgPT09ICdlc3JpRmllbGRUeXBlT0lEJykge1xuICAgICAgICBvYmplY3RJZEZpZWxkID0gcmVzcG9uc2UuZmllbGRzW2pdLm5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChjb3VudCkge1xuICAgIC8qIGFzIGEgbGFzdCByZXNvcnQsIGNoZWNrIGZvciBjb21tb24gSUQgZmllbGRuYW1lcyBpbiB0aGUgZmlyc3QgZmVhdHVyZSByZXR1cm5lZFxuICAgIG5vdCBmb29scHJvb2YuIGlkZW50aWZ5RmVhdHVyZXMgY2FuIHJldHVybmVkIGEgbWl4ZWQgYXJyYXkgb2YgZmVhdHVyZXMuICovXG4gICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmVzWzBdLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChrZXkubWF0Y2goL14oT0JKRUNUSUR8RklEfE9JRHxJRCkkL2kpKSB7XG4gICAgICAgIG9iamVjdElkRmllbGQgPSBrZXk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBbXVxuICB9O1xuXG4gIGlmIChjb3VudCkge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZlYXR1cmUgPSBhcmNnaXNUb0dlb0pTT04oZmVhdHVyZXNbaV0sIG9iamVjdElkRmllbGQpO1xuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbiAgLy8gdHJpbSB1cmwgd2hpdGVzcGFjZSBhbmQgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwgKHVybCkge1xuICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcywgYnV0IG5vdCBzcGFjZXMgaW5zaWRlIHRoZSB1cmxcbiAgdXJsID0gVXRpbC50cmltKHVybCk7XG5cbiAgLy8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0XG4gIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICB1cmwgKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJjZ2lzT25saW5lICh1cmwpIHtcbiAgLyogaG9zdGVkIGZlYXR1cmUgc2VydmljZXMgc3VwcG9ydCBnZW9qc29uIGFzIGFuIG91dHB1dCBmb3JtYXRcbiAgdXRpbGl0eS5hcmNnaXMuY29tIHNlcnZpY2VzIGFyZSBwcm94aWVkIGZyb20gYSB2YXJpZXR5IG9mIEFyY0dJUyBTZXJ2ZXIgdmludGFnZXMsIGFuZCBtYXkgbm90ICovXG4gIHJldHVybiAoL14oPyEuKnV0aWxpdHlcXC5hcmNnaXNcXC5jb20pLipcXC5hcmNnaXNcXC5jb20uKkZlYXR1cmVTZXJ2ZXIvaSkudGVzdCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvanNvblR5cGVUb0FyY0dJUyAoZ2VvSnNvblR5cGUpIHtcbiAgdmFyIGFyY2dpc0dlb21ldHJ5VHlwZTtcbiAgc3dpdGNoIChnZW9Kc29uVHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlNdWx0aXBvaW50JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlsaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWxpbmUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9seWdvbic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlnb24nO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYXJjZ2lzR2VvbWV0cnlUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybiAoKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgIGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjQXR0cmlidXRpb25XaWR0aCAobWFwKSB7XG4gIC8vIGVpdGhlciBjcm9wIGF0IDU1cHggb3IgdXNlciBkZWZpbmVkIGJ1ZmZlclxuICByZXR1cm4gKG1hcC5nZXRTaXplKCkueCAtIG9wdGlvbnMuYXR0cmlidXRpb25XaWR0aE9mZnNldCkgKyAncHgnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXNyaUF0dHJpYnV0aW9uIChtYXApIHtcbiAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgIW1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2VzcmlBdHRyaWJ1dGlvbkFkZGVkKSB7XG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5zZXRQcmVmaXgoJzxhIGhyZWY9XCJodHRwOi8vbGVhZmxldGpzLmNvbVwiIHRpdGxlPVwiQSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzXCI+TGVhZmxldDwvYT4gfCBQb3dlcmVkIGJ5IDxhIGhyZWY9XCJodHRwczovL3d3dy5lc3JpLmNvbVwiPkVzcmk8L2E+Jyk7XG5cbiAgICB2YXIgaG92ZXJBdHRyaWJ1dGlvblN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBob3ZlckF0dHJpYnV0aW9uU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgaG92ZXJBdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXIgeycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3JtYWw7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChob3ZlckF0dHJpYnV0aW9uU3R5bGUpO1xuICAgIERvbVV0aWwuYWRkQ2xhc3MobWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLCAnZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb246aG92ZXInKTtcblxuICAgIC8vIGRlZmluZSBhIG5ldyBjc3MgY2xhc3MgaW4gSlMgdG8gdHJpbSBhdHRyaWJ1dGlvbiBpbnRvIGEgc2luZ2xlIGxpbmVcbiAgICB2YXIgYXR0cmlidXRpb25TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgYXR0cmlidXRpb25TdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICBhdHRyaWJ1dGlvblN0eWxlLmlubmVySFRNTCA9ICcuZXNyaS10cnVuY2F0ZWQtYXR0cmlidXRpb24geycgK1xuICAgICAgJ3ZlcnRpY2FsLWFsaWduOiAtM3B4OycgK1xuICAgICAgJ3doaXRlLXNwYWNlOiBub3dyYXA7JyArXG4gICAgICAnb3ZlcmZsb3c6IGhpZGRlbjsnICtcbiAgICAgICd0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsnICtcbiAgICAgICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7JyArXG4gICAgICAndHJhbnNpdGlvbjogMHMgd2hpdGUtc3BhY2U7JyArXG4gICAgICAndHJhbnNpdGlvbi1kZWxheTogMXM7JyArXG4gICAgICAnbWF4LXdpZHRoOiAnICsgY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKSArICc7JyArXG4gICAgJ30nO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChhdHRyaWJ1dGlvblN0eWxlKTtcbiAgICBEb21VdGlsLmFkZENsYXNzKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lciwgJ2VzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uJyk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHdpZHRoIHVzZWQgdG8gdHJ1bmNhdGUgd2hlbiB0aGUgbWFwIGl0c2VsZiBpcyByZXNpemVkXG4gICAgbWFwLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgoZS50YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fZXNyaUF0dHJpYnV0aW9uQWRkZWQgPSB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QXR0cmlidXRpb25EYXRhICh1cmwsIG1hcCkge1xuICBqc29ucCh1cmwsIHt9LCBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBhdHRyaWJ1dGlvbnMpIHtcbiAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgbWFwLl9lc3JpQXR0cmlidXRpb25zID0gW107XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzLmxlbmd0aDsgYysrKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3IgPSBhdHRyaWJ1dGlvbnMuY29udHJpYnV0b3JzW2NdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvdmVyYWdlQXJlYSA9IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXNbaV07XG4gICAgICAgIHZhciBzb3V0aFdlc3QgPSBsYXRMbmcoY292ZXJhZ2VBcmVhLmJib3hbMF0sIGNvdmVyYWdlQXJlYS5iYm94WzFdKTtcbiAgICAgICAgdmFyIG5vcnRoRWFzdCA9IGxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFsyXSwgY292ZXJhZ2VBcmVhLmJib3hbM10pO1xuICAgICAgICBtYXAuX2VzcmlBdHRyaWJ1dGlvbnMucHVzaCh7XG4gICAgICAgICAgYXR0cmlidXRpb246IGNvbnRyaWJ1dG9yLmF0dHJpYnV0aW9uLFxuICAgICAgICAgIHNjb3JlOiBjb3ZlcmFnZUFyZWEuc2NvcmUsXG4gICAgICAgICAgYm91bmRzOiBsYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpLFxuICAgICAgICAgIG1pblpvb206IGNvdmVyYWdlQXJlYS56b29tTWluLFxuICAgICAgICAgIG1heFpvb206IGNvdmVyYWdlQXJlYS56b29tTWF4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1hcC5fZXNyaUF0dHJpYnV0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYi5zY29yZSAtIGEuc2NvcmU7XG4gICAgfSk7XG5cbiAgICAvLyBwYXNzIHRoZSBzYW1lIGFyZ3VtZW50IGFzIHRoZSBtYXAncyAnbW92ZWVuZCcgZXZlbnRcbiAgICB2YXIgb2JqID0geyB0YXJnZXQ6IG1hcCB9O1xuICAgIF91cGRhdGVNYXBBdHRyaWJ1dGlvbihvYmopO1xuICB9LCB0aGlzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdXBkYXRlTWFwQXR0cmlidXRpb24gKGV2dCkge1xuICB2YXIgbWFwID0gZXZ0LnRhcmdldDtcbiAgdmFyIG9sZEF0dHJpYnV0aW9ucyA9IG1hcC5fZXNyaUF0dHJpYnV0aW9ucztcblxuICBpZiAobWFwICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgb2xkQXR0cmlidXRpb25zKSB7XG4gICAgdmFyIG5ld0F0dHJpYnV0aW9ucyA9ICcnO1xuICAgIHZhciBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7XG4gICAgdmFyIHdyYXBwZWRCb3VuZHMgPSBsYXRMbmdCb3VuZHMoXG4gICAgICBib3VuZHMuZ2V0U291dGhXZXN0KCkud3JhcCgpLFxuICAgICAgYm91bmRzLmdldE5vcnRoRWFzdCgpLndyYXAoKVxuICAgICk7XG4gICAgdmFyIHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRBdHRyaWJ1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9IG9sZEF0dHJpYnV0aW9uc1tpXTtcbiAgICAgIHZhciB0ZXh0ID0gYXR0cmlidXRpb24uYXR0cmlidXRpb247XG5cbiAgICAgIGlmICghbmV3QXR0cmlidXRpb25zLm1hdGNoKHRleHQpICYmIGF0dHJpYnV0aW9uLmJvdW5kcy5pbnRlcnNlY3RzKHdyYXBwZWRCb3VuZHMpICYmIHpvb20gPj0gYXR0cmlidXRpb24ubWluWm9vbSAmJiB6b29tIDw9IGF0dHJpYnV0aW9uLm1heFpvb20pIHtcbiAgICAgICAgbmV3QXR0cmlidXRpb25zICs9ICgnLCAnICsgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3QXR0cmlidXRpb25zID0gbmV3QXR0cmlidXRpb25zLnN1YnN0cigyKTtcbiAgICB2YXIgYXR0cmlidXRpb25FbGVtZW50ID0gbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5lc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKTtcblxuICAgIGF0dHJpYnV0aW9uRWxlbWVudC5pbm5lckhUTUwgPSBuZXdBdHRyaWJ1dGlvbnM7XG4gICAgYXR0cmlidXRpb25FbGVtZW50LnN0eWxlLm1heFdpZHRoID0gY2FsY0F0dHJpYnV0aW9uV2lkdGgobWFwKTtcblxuICAgIG1hcC5maXJlKCdhdHRyaWJ1dGlvbnVwZGF0ZWQnLCB7XG4gICAgICBhdHRyaWJ1dGlvbjogbmV3QXR0cmlidXRpb25zXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBFc3JpVXRpbCA9IHtcbiAgc2hhbGxvd0Nsb25lOiBzaGFsbG93Q2xvbmUsXG4gIHdhcm46IHdhcm4sXG4gIGNsZWFuVXJsOiBjbGVhblVybCxcbiAgaXNBcmNnaXNPbmxpbmU6IGlzQXJjZ2lzT25saW5lLFxuICBnZW9qc29uVHlwZVRvQXJjR0lTOiBnZW9qc29uVHlwZVRvQXJjR0lTLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb246IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbixcbiAgZ2VvanNvblRvQXJjR0lTOiBnZW9qc29uVG9BcmNHSVMsXG4gIGFyY2dpc1RvR2VvSlNPTjogYXJjZ2lzVG9HZW9KU09OLFxuICBib3VuZHNUb0V4dGVudDogYm91bmRzVG9FeHRlbnQsXG4gIGV4dGVudFRvQm91bmRzOiBleHRlbnRUb0JvdW5kcyxcbiAgY2FsY0F0dHJpYnV0aW9uV2lkdGg6IGNhbGNBdHRyaWJ1dGlvbldpZHRoLFxuICBzZXRFc3JpQXR0cmlidXRpb246IHNldEVzcmlBdHRyaWJ1dGlvbixcbiAgX2dldEF0dHJpYnV0aW9uRGF0YTogX2dldEF0dHJpYnV0aW9uRGF0YSxcbiAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBfdXBkYXRlTWFwQXR0cmlidXRpb25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVzcmlVdGlsO1xuIiwiaW1wb3J0IHsgQ2xhc3MsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7Y29yc30gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge2NsZWFuVXJsfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL1JlcXVlc3QnO1xuXG5leHBvcnQgdmFyIFRhc2sgPSBDbGFzcy5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29yc1xuICB9LFxuXG4gIC8vIEdlbmVyYXRlIGEgbWV0aG9kIGZvciBlYWNoIG1ldGhvZE5hbWU6cGFyYW1OYW1lIGluIHRoZSBzZXR0ZXJzIGZvciB0aGlzIHRhc2suXG4gIGdlbmVyYXRlU2V0dGVyOiBmdW5jdGlvbiAocGFyYW0sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gVXRpbC5iaW5kKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJhbXNbcGFyYW1dID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoZW5kcG9pbnQpIHtcbiAgICAvLyBlbmRwb2ludCBjYW4gYmUgZWl0aGVyIGEgdXJsIChhbmQgb3B0aW9ucykgZm9yIGFuIEFyY0dJUyBSZXN0IFNlcnZpY2Ugb3IgYW4gaW5zdGFuY2Ugb2YgRXNyaUxlYWZsZXQuU2VydmljZVxuICAgIGlmIChlbmRwb2ludC5yZXF1ZXN0ICYmIGVuZHBvaW50Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UgPSBlbmRwb2ludDtcbiAgICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBlbmRwb2ludC5vcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIGVuZHBvaW50KTtcbiAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBjbGVhblVybChlbmRwb2ludC51cmwpO1xuICAgIH1cblxuICAgIC8vIGNsb25lIGRlZmF1bHQgcGFyYW1zIGludG8gdGhpcyBvYmplY3RcbiAgICB0aGlzLnBhcmFtcyA9IFV0aWwuZXh0ZW5kKHt9LCB0aGlzLnBhcmFtcyB8fCB7fSk7XG5cbiAgICAvLyBnZW5lcmF0ZSBzZXR0ZXIgbWV0aG9kcyBiYXNlZCBvbiB0aGUgc2V0dGVycyBvYmplY3QgaW1wbGltZW50ZWQgYSBjaGlsZCBjbGFzc1xuICAgIGlmICh0aGlzLnNldHRlcnMpIHtcbiAgICAgIGZvciAodmFyIHNldHRlciBpbiB0aGlzLnNldHRlcnMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5zZXR0ZXJzW3NldHRlcl07XG4gICAgICAgIHRoaXNbc2V0dGVyXSA9IHRoaXMuZ2VuZXJhdGVTZXR0ZXIocGFyYW0sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2tlbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHRoaXMuX3NlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJhbXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdyZXF1ZXN0JywgdGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIF9yZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICByZXR1cm4gUmVxdWVzdC5nZXQuSlNPTlAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVxdWVzdFttZXRob2RdKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFzayAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRhc2sob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRhc2s7XG4iLCJpbXBvcnQgeyBwb2ludCwgbGF0TG5nLCBMYXRMbmdCb3VuZHMsIExhdExuZywgR2VvSlNPTiB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQge1xuICB3YXJuLFxuICByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24sXG4gIGlzQXJjZ2lzT25saW5lLFxuICBleHRlbnRUb0JvdW5kcyxcbiAgYm91bmRzVG9FeHRlbnQsXG4gIGdlb2pzb25Ub0FyY0dJUyxcbiAgZ2VvanNvblR5cGVUb0FyY0dJU1xufSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBRdWVyeSA9IFRhc2suZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdvZmZzZXQnOiAncmVzdWx0T2Zmc2V0JyxcbiAgICAnbGltaXQnOiAncmVzdWx0UmVjb3JkQ291bnQnLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAnZmVhdHVyZUlkcyc6ICdvYmplY3RJZHMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdxdWVyeScsXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIG91dFNyOiA0MzI2LFxuICAgIG91dEZpZWxkczogJyonXG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZSBzZWFyY2ggZ2VvbWV0cnkuIFZhbGlkIGZvciBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxDb250YWlucyc7IC8vIHRvIHRoZSBSRVNUIGFwaSB0aGlzIHJlYWRzIGdlb21ldHJ5ICoqY29udGFpbnMqKiBsYXllclxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIGFueSBzcGF0aWFsIHJlbGF0aW9uc2hpcCBpcyBmb3VuZC4gQXBwbGllcyB0byBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIGludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIGdlb21ldHJ5LiBWYWxpZCBmb3IgYWxsIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjb250YWluczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxXaXRoaW4nOyAvLyB0byB0aGUgUkVTVCBhcGkgdGhpcyByZWFkcyBnZW9tZXRyeSAqKndpdGhpbioqIGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW50ZXJpb3JzIG9mIHRoZSB0d28gc2hhcGVzIGlzIG5vdCBlbXB0eSBhbmQgaGFzIGEgbG93ZXIgZGltZW5zaW9uIHRoYW4gdGhlIG1heGltdW0gZGltZW5zaW9uIG9mIHRoZSB0d28gc2hhcGVzLiBUd28gbGluZXMgdGhhdCBzaGFyZSBhbiBlbmRwb2ludCBpbiBjb21tb24gZG8gbm90IGNyb3NzLiBWYWxpZCBmb3IgTGluZS9MaW5lLCBMaW5lL0FyZWEsIE11bHRpLXBvaW50L0FyZWEsIGFuZCBNdWx0aS1wb2ludC9MaW5lIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjcm9zc2VzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbENyb3NzZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSB0d28gc2hhcGVzIHNoYXJlIGEgY29tbW9uIGJvdW5kYXJ5LiBIb3dldmVyLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbnRlcmlvcnMgb2YgdGhlIHR3byBzaGFwZXMgbXVzdCBiZSBlbXB0eS4gSW4gdGhlIFBvaW50L0xpbmUgY2FzZSwgdGhlIHBvaW50IG1heSB0b3VjaCBhbiBlbmRwb2ludCBvbmx5IG9mIHRoZSBsaW5lLiBBcHBsaWVzIHRvIGFsbCBjb21iaW5hdGlvbnMgZXhjZXB0IFBvaW50L1BvaW50LlxuICB0b3VjaGVzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbFRvdWNoZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzaGFwZXMgcmVzdWx0cyBpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgZGltZW5zaW9uLCBidXQgZGlmZmVyZW50IGZyb20gYm90aCBvZiB0aGUgc2hhcGVzLiBBcHBsaWVzIHRvIEFyZWEvQXJlYSwgTGluZS9MaW5lLCBhbmQgTXVsdGktcG9pbnQvTXVsdGktcG9pbnQgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIG92ZXJsYXBzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbE92ZXJsYXBzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgZmVhdHVyZSBpZiB0aGUgZW52ZWxvcGUgb2YgdGhlIHR3byBzaGFwZXMgaW50ZXJzZWN0cy5cbiAgYmJveEludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsRW52ZWxvcGVJbnRlcnNlY3RzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBpZiBzb21lb25lIGNhbiBoZWxwIGRlY2lwaGVyIHRoZSBBcmNPYmplY3RzIGV4cGxhbmF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gcGxhaW4gc3BlYWssIHdlIHNob3VsZCBtZW50aW9uIHRoaXMgbWV0aG9kIGluIHRoZSBkb2NcbiAgaW5kZXhJbnRlcnNlY3RzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbEluZGV4SW50ZXJzZWN0cyc7IC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgaW50ZXJzZWN0cyB0aGUgaW5kZXggZW50cnkgZm9yIHRoZSB0YXJnZXQgZ2VvbWV0cnlcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBGZWF0dXJlIFNlcnZpY2VzIHJ1bm5pbmcgb24gQXJjR0lTIFNlcnZlciAxMC4zKyBvciBBcmNHSVMgT25saW5lXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF07XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgdGhpcy5wYXJhbXMudW5pdHMgPSAnZXNyaVNSVW5pdF9NZXRlcic7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSByYWRpdXM7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgd2hlcmU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgZG91YmxlLXF1b3RlcyB0byBzaW5nbGUgcXVvdGVzLCBwYXNzIGFzIGlzLCBhbmQgcHJvdmlkZSBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZSBpZiBhIDQwMCBpcyBlbmNvdW50ZXJlZFxuICAgIHRoaXMucGFyYW1zLndoZXJlID0gc3RyaW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIG9yZGVyID0gb3JkZXIgfHwgJ0FTQyc7XG4gICAgdGhpcy5wYXJhbXMub3JkZXJCeUZpZWxkcyA9ICh0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzKSA/IHRoaXMucGFyYW1zLm9yZGVyQnlGaWVsZHMgKyAnLCcgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzICs9IChbZmllbGROYW1lLCBvcmRlcl0pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG5cbiAgICAvLyBzZXJ2aWNlcyBob3N0ZWQgb24gQXJjR0lTIE9ubGluZSBhbmQgQXJjR0lTIFNlcnZlciAxMC4zLjErIHN1cHBvcnQgcmVxdWVzdGluZyBnZW9qc29uIGRpcmVjdGx5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc01vZGVybiB8fCBpc0FyY2dpc09ubGluZSh0aGlzLm9wdGlvbnMudXJsKSkge1xuICAgICAgdGhpcy5wYXJhbXMuZiA9ICdnZW9qc29uJztcblxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3RyYXBTUUxlcnJvcnMoZXJyb3IpO1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG5cbiAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCBpbiB0aGUgY2FsbGJhY2sgdGhlbiBwYXNzIGl0IG9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl90cmFwU1FMZXJyb3JzKGVycm9yKTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY291bnQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIChyZXNwb25zZSAmJiByZXNwb25zZS5jb3VudCksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpZHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0SWRzKSwgcmVzcG9uc2UpO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIEZlYXR1cmUgU2VydmljZXMgcnVubmluZyBvbiBBcmNHSVMgU2VydmVyIDEwLjMrIG9yIEFyY0dJUyBPbmxpbmVcbiAgYm91bmRzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jbGVhblBhcmFtcygpO1xuICAgIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4dGVudCAmJiBleHRlbnRUb0JvdW5kcyhyZXNwb25zZS5leHRlbnQpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIGV4dGVudFRvQm91bmRzKHJlc3BvbnNlLmV4dGVudCksIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEJvdW5kcydcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIGltYWdlIHNlcnZpY2VzXG4gIHBpeGVsU2l6ZTogZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNhc3RQb2ludCA9IHBvaW50KHJhd1BvaW50KTtcbiAgICB0aGlzLnBhcmFtcy5waXhlbFNpemUgPSBbY2FzdFBvaW50LngsIGNhc3RQb2ludC55XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBtYXAgc2VydmljZXNcbiAgbGF5ZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgIHRoaXMucGF0aCA9IGxheWVyICsgJy9xdWVyeSc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3RyYXBTUUxlcnJvcnM6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICc0MDAnKSB7XG4gICAgICAgIHdhcm4oJ29uZSBjb21tb24gc3ludGF4IGVycm9yIGluIHF1ZXJ5IHJlcXVlc3RzIGlzIGVuY2FzaW5nIHN0cmluZyB2YWx1ZXMgaW4gZG91YmxlIHF1b3RlcyBpbnN0ZWFkIG9mIHNpbmdsZSBxdW90ZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NsZWFuUGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybklkc09ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHk7XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLnJldHVybkNvdW50T25seTtcbiAgfSxcblxuICBfc2V0R2VvbWV0cnk6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMucGFyYW1zLmluU3IgPSA0MzI2O1xuXG4gICAgLy8gY29udmVydCBib3VuZHMgdG8gZXh0ZW50IGFuZCBmaW5pc2hcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAgIC8vIHNldCBnZW9tZXRyeSArIGdlb21ldHJ5VHlwZVxuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBib3VuZHNUb0V4dGVudChnZW9tZXRyeSk7XG4gICAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5RW52ZWxvcGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgTC5NYXJrZXIgPiBMLkxhdExuZ1xuICAgIGlmIChnZW9tZXRyeS5nZXRMYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2V0TGF0TG5nKCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLkxhdExuZyB0byBhIGdlb2pzb24gcG9pbnQgYW5kIGNvbnRpbnVlO1xuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbZ2VvbWV0cnkubG5nLCBnZW9tZXRyeS5sYXRdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBMLkdlb0pTT04sIHB1bGwgb3V0IHRoZSBmaXJzdCBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgTC5Qb2x5bGluZSBhbmQgTC5Qb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnRvR2VvSlNPTikge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS50b0dlb0pTT04oKTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgR2VvSlNPTiBmZWF0dXJlIGJ5IHB1bGxpbmcgb3V0IHRoZSBnZW9tZXRyeVxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgIC8vIGdldCB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdlb2pzb24gZmVhdHVyZVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZW9tZXRyeTtcbiAgICB9XG5cbiAgICAvLyBjb25maXJtIHRoYXQgb3VyIEdlb0pTT04gaXMgYSBwb2ludCwgbGluZSBvciBwb2x5Z29uXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBnZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB3YXJuIHRoZSB1c2VyIGlmIHdlIGhhdm4ndCBmb3VuZCBhbiBhcHByb3ByaWF0ZSBvYmplY3RcbiAgICB3YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCB0byBzcGF0aWFsIHF1ZXJ5LiBTaG91bGQgYmUgTC5MYXRMbmcsIEwuTGF0TG5nQm91bmRzLCBMLk1hcmtlciBvciBhIEdlb0pTT04gUG9pbnQsIExpbmUsIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIG9iamVjdCcpO1xuXG4gICAgcmV0dXJuO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUXVlcnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHF1ZXJ5O1xuIiwiaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGaW5kID0gVGFzay5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgLy8gbWV0aG9kIG5hbWUgPiBwYXJhbSBuYW1lXG4gICAgJ2NvbnRhaW5zJzogJ2NvbnRhaW5zJyxcbiAgICAndGV4dCc6ICdzZWFyY2hUZXh0JyxcbiAgICAnZmllbGRzJzogJ3NlYXJjaEZpZWxkcycsIC8vIGRlbm90ZSBhbiBhcnJheSBvciBzaW5nbGUgc3RyaW5nXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiAnc3InLFxuICAgICdzcic6ICdzcicsXG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ21heEFsbG93YWJsZU9mZnNldCc6ICdtYXhBbGxvd2FibGVPZmZzZXQnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICdkeW5hbWljTGF5ZXJzJzogJ2R5bmFtaWNMYXllcnMnLFxuICAgICdyZXR1cm5aJzogJ3JldHVyblonLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICdnZGJWZXJzaW9uJzogJ2dkYlZlcnNpb24nLFxuICAgICd0b2tlbic6ICd0b2tlbidcbiAgfSxcblxuICBwYXRoOiAnZmluZCcsXG5cbiAgcGFyYW1zOiB7XG4gICAgc3I6IDQzMjYsXG4gICAgY29udGFpbnM6IHRydWUsXG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgcmV0dXJuWjogdHJ1ZSxcbiAgICByZXR1cm5NOiBmYWxzZVxuICB9LFxuXG4gIGxheWVyRGVmczogZnVuY3Rpb24gKGlkLCB3aGVyZSkge1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyA9ICh0aGlzLnBhcmFtcy5sYXllckRlZnMpID8gdGhpcy5wYXJhbXMubGF5ZXJEZWZzICsgJzsnIDogJyc7XG4gICAgdGhpcy5wYXJhbXMubGF5ZXJEZWZzICs9IChbaWQsIHdoZXJlXSkuam9pbignOicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZCAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZpbmQob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmQ7XG4iLCJpbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IHZhciBJZGVudGlmeSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2lkZW50aWZ5JyxcblxuICBiZXR3ZWVuOiBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHRoaXMucGFyYW1zLnRpbWUgPSBbc3RhcnQudmFsdWVPZigpLCBlbmQudmFsdWVPZigpXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IElkZW50aWZ5KG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGlmeTtcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IGJvdW5kc1RvRXh0ZW50LCByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBJZGVudGlmeUZlYXR1cmVzID0gSWRlbnRpZnkuZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdsYXllcnMnOiAnbGF5ZXJzJyxcbiAgICAncHJlY2lzaW9uJzogJ2dlb21ldHJ5UHJlY2lzaW9uJyxcbiAgICAndG9sZXJhbmNlJzogJ3RvbGVyYW5jZScsXG4gICAgJ3JldHVybkdlb21ldHJ5JzogJ3JldHVybkdlb21ldHJ5J1xuICB9LFxuXG4gIHBhcmFtczoge1xuICAgIHNyOiA0MzI2LFxuICAgIGxheWVyczogJ2FsbCcsXG4gICAgdG9sZXJhbmNlOiAzLFxuICAgIHJldHVybkdlb21ldHJ5OiB0cnVlXG4gIH0sXG5cbiAgb246IGZ1bmN0aW9uIChtYXApIHtcbiAgICB2YXIgZXh0ZW50ID0gYm91bmRzVG9FeHRlbnQobWFwLmdldEJvdW5kcygpKTtcbiAgICB2YXIgc2l6ZSA9IG1hcC5nZXRTaXplKCk7XG4gICAgdGhpcy5wYXJhbXMuaW1hZ2VEaXNwbGF5ID0gW3NpemUueCwgc2l6ZS55LCA5Nl07XG4gICAgdGhpcy5wYXJhbXMubWFwRXh0ZW50ID0gW2V4dGVudC54bWluLCBleHRlbnQueW1pbiwgZXh0ZW50LnhtYXgsIGV4dGVudC55bWF4XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBhdDogZnVuY3Rpb24gKGxhdGxuZykge1xuICAgIGxhdGxuZyA9IGxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5ID0gW2xhdGxuZy5sbmcsIGxhdGxuZy5sYXRdO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbGF5ZXJEZWY6IGZ1bmN0aW9uIChpZCwgd2hlcmUpIHtcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgPSAodGhpcy5wYXJhbXMubGF5ZXJEZWZzKSA/IHRoaXMucGFyYW1zLmxheWVyRGVmcyArICc7JyA6ICcnO1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyArPSAoW2lkLCB3aGVyZV0pLmpvaW4oJzonKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzaW1wbGlmeTogZnVuY3Rpb24gKG1hcCwgZmFjdG9yKSB7XG4gICAgdmFyIG1hcFdpZHRoID0gTWF0aC5hYnMobWFwLmdldEJvdW5kcygpLmdldFdlc3QoKSAtIG1hcC5nZXRCb3VuZHMoKS5nZXRFYXN0KCkpO1xuICAgIHRoaXMucGFyYW1zLm1heEFsbG93YWJsZU9mZnNldCA9IChtYXBXaWR0aCAvIG1hcC5nZXRTaXplKCkueSkgKiBmYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGludm9rZSB3aXRoIGFuIGVycm9yXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgdW5kZWZpbmVkLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gb2sgbm8gZXJyb3IgbGV0cyBqdXN0IGFzc3VtZSB3ZSBoYXZlIGZlYXR1cmVzLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IHJlc3BvbnNlLnJlc3VsdHNbaV0ubGF5ZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHVuZGVmaW5lZCwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUZlYXR1cmVzIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnlGZWF0dXJlcyhvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaWRlbnRpZnlGZWF0dXJlcztcbiIsImltcG9ydCB7IGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgSWRlbnRpZnkgfSBmcm9tICcuL0lkZW50aWZ5JztcbmltcG9ydCB7IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5SW1hZ2UgPSBJZGVudGlmeS5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgJ3NldE1vc2FpY1J1bGUnOiAnbW9zYWljUnVsZScsXG4gICAgJ3NldFJlbmRlcmluZ1J1bGUnOiAncmVuZGVyaW5nUnVsZScsXG4gICAgJ3NldFBpeGVsU2l6ZSc6ICdwaXhlbFNpemUnLFxuICAgICdyZXR1cm5DYXRhbG9nSXRlbXMnOiAncmV0dXJuQ2F0YWxvZ0l0ZW1zJyxcbiAgICAncmV0dXJuR2VvbWV0cnknOiAncmV0dXJuR2VvbWV0cnknXG4gIH0sXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IGZhbHNlXG4gIH0sXG5cbiAgYXQ6IGZ1bmN0aW9uIChsYXRsbmcpIHtcbiAgICBsYXRsbmcgPSBsYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5nZW9tZXRyeSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHg6IGxhdGxuZy5sbmcsXG4gICAgICB5OiBsYXRsbmcubGF0LFxuICAgICAgc3BhdGlhbFJlZmVyZW5jZToge1xuICAgICAgICB3a2lkOiA0MzI2XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRNb3NhaWNSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgZ2V0UmVuZGVyaW5nUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIGdldFBpeGVsU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5waXhlbFNpemU7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLl9yZXNwb25zZVRvR2VvSlNPTihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgLy8gZ2V0IHBpeGVsIGRhdGEgYW5kIHJldHVybiBhcyBnZW9KU09OIHBvaW50XG4gIC8vIHBvcHVsYXRlIGNhdGFsb2cgaXRlbXMgKGlmIGFueSlcbiAgLy8gbWVyZ2luZyBpbiBhbnkgY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXMgYXMgYSBwcm9wZXJ5IG9mIGVhY2ggZmVhdHVyZVxuICBfcmVzcG9uc2VUb0dlb0pTT046IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmxvY2F0aW9uO1xuICAgIHZhciBjYXRhbG9nSXRlbXMgPSByZXNwb25zZS5jYXRhbG9nSXRlbXM7XG4gICAgdmFyIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzID0gcmVzcG9uc2UuY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXM7XG4gICAgdmFyIGdlb0pTT04gPSB7XG4gICAgICAncGl4ZWwnOiB7XG4gICAgICAgICd0eXBlJzogJ0ZlYXR1cmUnLFxuICAgICAgICAnZ2VvbWV0cnknOiB7XG4gICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICdjb29yZGluYXRlcyc6IFtsb2NhdGlvbi54LCBsb2NhdGlvbi55XVxuICAgICAgICB9LFxuICAgICAgICAnY3JzJzoge1xuICAgICAgICAgICd0eXBlJzogJ0VQU0cnLFxuICAgICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICAgJ2NvZGUnOiBsb2NhdGlvbi5zcGF0aWFsUmVmZXJlbmNlLndraWRcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICdPQkpFQ1RJRCc6IHJlc3BvbnNlLm9iamVjdElkLFxuICAgICAgICAgICduYW1lJzogcmVzcG9uc2UubmFtZSxcbiAgICAgICAgICAndmFsdWUnOiByZXNwb25zZS52YWx1ZVxuICAgICAgICB9LFxuICAgICAgICAnaWQnOiByZXNwb25zZS5vYmplY3RJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocmVzcG9uc2UucHJvcGVydGllcyAmJiByZXNwb25zZS5wcm9wZXJ0aWVzLlZhbHVlcykge1xuICAgICAgZ2VvSlNPTi5waXhlbC5wcm9wZXJ0aWVzLnZhbHVlcyA9IHJlc3BvbnNlLnByb3BlcnRpZXMuVmFsdWVzO1xuICAgIH1cblxuICAgIGlmIChjYXRhbG9nSXRlbXMgJiYgY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzKSB7XG4gICAgICBnZW9KU09OLmNhdGFsb2dJdGVtcyA9IHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihjYXRhbG9nSXRlbXMpO1xuICAgICAgaWYgKGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzICYmIGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzLmxlbmd0aCA9PT0gZ2VvSlNPTi5jYXRhbG9nSXRlbXMuZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBjYXRhbG9nSXRlbVZpc2liaWxpdGllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGdlb0pTT04uY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMuY2F0YWxvZ0l0ZW1WaXNpYmlsaXR5ID0gY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb0pTT047XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUltYWdlIChwYXJhbXMpIHtcbiAgcmV0dXJuIG5ldyBJZGVudGlmeUltYWdlKHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5SW1hZ2U7XG4iLCJpbXBvcnQgeyBVdGlsLCBFdmVudGVkIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge2NvcnN9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHtjbGVhblVybH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9SZXF1ZXN0JztcblxuZXhwb3J0IHZhciBTZXJ2aWNlID0gRXZlbnRlZC5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICB0aW1lb3V0OiAwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMudXJsID0gY2xlYW5VcmwodGhpcy5vcHRpb25zLnVybCk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdnZXQnLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfSxcblxuICBwb3N0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdwb3N0JywgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgncmVxdWVzdCcsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnZ2V0JywgJycsIHt9LCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX3J1blF1ZXVlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGltZW91dDtcbiAgfSxcblxuICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gdGltZW91dDtcbiAgfSxcblxuICBfcmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuZmlyZSgncmVxdWVzdHN0YXJ0Jywge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICB9LCB0cnVlKTtcblxuICAgIHZhciB3cmFwcGVkQ2FsbGJhY2sgPSB0aGlzLl9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2sobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYXV0aGVudGljYXRpbmcpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RRdWV1ZS5wdXNoKFttZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgICAgaWYgKChtZXRob2QgPT09ICdnZXQnIHx8IG1ldGhvZCA9PT0gJ3JlcXVlc3QnKSAmJiAhdGhpcy5vcHRpb25zLnVzZUNvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3QuZ2V0LkpTT05QKHVybCwgcGFyYW1zLCB3cmFwcGVkQ2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RbbWV0aG9kXSh1cmwsIHBhcmFtcywgd3JhcHBlZENhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZVNlcnZpY2VDYWxsYmFjazogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yICYmIChlcnJvci5jb2RlID09PSA0OTkgfHwgZXJyb3IuY29kZSA9PT0gNDk4KSkge1xuICAgICAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdFF1ZXVlLnB1c2goW21ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dF0pO1xuXG4gICAgICAgIC8vIGZpcmUgYW4gZXZlbnQgZm9yIHVzZXJzIHRvIGhhbmRsZSBhbmQgcmUtYXV0aGVudGljYXRlXG4gICAgICAgIHRoaXMuZmlyZSgnYXV0aGVudGljYXRpb25yZXF1aXJlZCcsIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGU6IFV0aWwuYmluZCh0aGlzLmF1dGhlbnRpY2F0ZSwgdGhpcylcbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIGNhbGxiYWNrIHRoZXkgY2FuIGhhbmRsZSB0aGUgYXV0aCBlcnJvclxuICAgICAgICBlcnJvci5hdXRoZW50aWNhdGUgPSBVdGlsLmJpbmQodGhpcy5hdXRoZW50aWNhdGUsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RlcnJvcicsIHtcbiAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwgKyBwYXRoLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSxcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyZSgncmVxdWVzdHN1Y2Nlc3MnLCB7XG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgncmVxdWVzdGVuZCcsIHtcbiAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgICB9LCB0cnVlKTtcbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcnVuUXVldWU6IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fcmVxdWVzdFF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuX3JlcXVlc3RRdWV1ZVtpXTtcbiAgICAgIHZhciBtZXRob2QgPSByZXF1ZXN0LnNoaWZ0KCk7XG4gICAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgcmVxdWVzdCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RRdWV1ZSA9IFtdO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXJ2aWNlO1xuIiwiaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vU2VydmljZSc7XG5pbXBvcnQgaWRlbnRpZnlGZWF0dXJlcyBmcm9tICcuLi9UYXNrcy9JZGVudGlmeUZlYXR1cmVzJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5pbXBvcnQgZmluZCBmcm9tICcuLi9UYXNrcy9GaW5kJztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkZW50aWZ5RmVhdHVyZXModGhpcyk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmaW5kKHRoaXMpO1xuICB9LFxuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1hcFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcFNlcnZpY2U7XG4iLCJpbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlJztcbmltcG9ydCBpZGVudGlmeUltYWdlIGZyb20gJy4uL1Rhc2tzL0lkZW50aWZ5SW1hZ2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcblxuZXhwb3J0IHZhciBJbWFnZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWRlbnRpZnlJbWFnZSh0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBJbWFnZVNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGltYWdlU2VydmljZTtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2UnO1xuaW1wb3J0IHF1ZXJ5IGZyb20gJy4uL1Rhc2tzL1F1ZXJ5JztcbmltcG9ydCB7IGdlb2pzb25Ub0FyY0dJUyB9IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGlkQXR0cmlidXRlOiAnT0JKRUNUSUQnXG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcXVlcnkodGhpcyk7XG4gIH0sXG5cbiAgYWRkRmVhdHVyZTogZnVuY3Rpb24gKGZlYXR1cmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgZGVsZXRlIGZlYXR1cmUuaWQ7XG5cbiAgICBmZWF0dXJlID0gZ2VvanNvblRvQXJjR0lTKGZlYXR1cmUpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCgnYWRkRmVhdHVyZXMnLCB7XG4gICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5hZGRSZXN1bHRzKSA/IHJlc3BvbnNlLmFkZFJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5hZGRSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGZlYXR1cmUgPSBnZW9qc29uVG9BcmNHSVMoZmVhdHVyZSwgdGhpcy5vcHRpb25zLmlkQXR0cmlidXRlKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QoJ3VwZGF0ZUZlYXR1cmVzJywge1xuICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UudXBkYXRlUmVzdWx0cykgPyByZXNwb25zZS51cGRhdGVSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UudXBkYXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCgnZGVsZXRlRmVhdHVyZXMnLCB7XG4gICAgICBvYmplY3RJZHM6IGlkXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnBvc3QoJ2RlbGV0ZUZlYXR1cmVzJywge1xuICAgICAgb2JqZWN0SWRzOiBpZHNcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAvLyBwYXNzIGJhY2sgdGhlIGVudGlyZSBhcnJheVxuICAgICAgdmFyIHJlc3VsdCA9IChyZXNwb25zZSAmJiByZXNwb25zZS5kZWxldGVSZXN1bHRzKSA/IHJlc3BvbnNlLmRlbGV0ZVJlc3VsdHMgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciB8fCByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdLmVycm9yLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlTGF5ZXJTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXJTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgVGlsZUxheWVyLCBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBwb2ludGVyRXZlbnRzIH0gZnJvbSAnLi4vU3VwcG9ydCc7XG5pbXBvcnQge1xuICBzZXRFc3JpQXR0cmlidXRpb24sXG4gIF9nZXRBdHRyaWJ1dGlvbkRhdGEsXG4gIF91cGRhdGVNYXBBdHRyaWJ1dGlvblxufSBmcm9tICcuLi9VdGlsJztcblxudmFyIHRpbGVQcm90b2NvbCA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSA/ICdodHRwOicgOiAnaHR0cHM6JztcblxuZXhwb3J0IHZhciBCYXNlbWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgc3RhdGljczoge1xuICAgIFRJTEVTOiB7XG4gICAgICBTdHJlZXRzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9TdHJlZXRfTWFwJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVG9wb2dyYXBoaWM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1RvcG9fTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE9jZWFuc0xhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvT2NlYW4vV29ybGRfT2NlYW5fUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBwYW5lOiAocG9pbnRlckV2ZW50cykgPyAnZXNyaS1sYWJlbHMnIDogJ3RpbGVQYW5lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTmF0aW9uYWxHZW9ncmFwaGljOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ05hdGlvbmFsIEdlb2dyYXBoaWMsIERlTG9ybWUsIEhFUkUsIFVORVAtV0NNQywgVVNHUywgTkFTQSwgRVNBLCBNRVRJLCBOUkNBTiwgR0VCQ08sIE5PQUEsIGluY3JlbWVudCBQIENvcnAuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRGFya0dyYXk6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9EYXJrX0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdIRVJFLCBEZUxvcm1lLCBNYXBteUluZGlhLCAmY29weTsgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBEYXJrR3JheUxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0RhcmtfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBHcmF5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0hFUkUsIERlTG9ybWUsIE1hcG15SW5kaWEsICZjb3B5OyBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEdyYXlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBJbWFnZXJ5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9JbWFnZXJ5L01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTksXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ0RpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEltYWdlcnlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxOSxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBTaGFkZWRSZWxpZWY6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1NoYWRlZF9SZWxpZWYvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFNoYWRlZFJlbGllZkxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVGVycmFpbjoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVGVycmFpbl9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTMsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5PQUEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBUZXJyYWluTGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfUmVmZXJlbmNlX092ZXJsYXkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVVNBVG9wbzoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvVVNBX1RvcG9fTWFwcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE1LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOYXRpb25hbCBHZW9ncmFwaGljIFNvY2lldHksIGktY3ViZWQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGtleSwgb3B0aW9ucykge1xuICAgIHZhciBjb25maWc7XG5cbiAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleS51cmxUZW1wbGF0ZSAmJiBrZXkub3B0aW9ucykge1xuICAgICAgY29uZmlnID0ga2V5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcExheWVyLlRJTEVTW2tleV0pIHtcbiAgICAgIGNvbmZpZyA9IEJhc2VtYXBMYXllci5USUxFU1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5CYXNlbWFwTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiU3RyZWV0c1wiLCBcIlRvcG9ncmFwaGljXCIsIFwiT2NlYW5zXCIsIFwiT2NlYW5zTGFiZWxzXCIsIFwiTmF0aW9uYWxHZW9ncmFwaGljXCIsIFwiR3JheVwiLCBcIkdyYXlMYWJlbHNcIiwgXCJEYXJrR3JheVwiLCBcIkRhcmtHcmF5TGFiZWxzXCIsIFwiSW1hZ2VyeVwiLCBcIkltYWdlcnlMYWJlbHNcIiwgXCJJbWFnZXJ5VHJhbnNwb3J0YXRpb25cIiwgXCJTaGFkZWRSZWxpZWZcIiwgXCJTaGFkZWRSZWxpZWZMYWJlbHNcIiwgXCJUZXJyYWluXCIsIFwiVGVycmFpbkxhYmVsc1wiIG9yIFwiVVNBVG9wb1wiJyk7XG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgcGFzc2VkIG9wdGlvbnMgaW50byB0aGUgY29uZmlnIG9wdGlvbnNcbiAgICB2YXIgdGlsZU9wdGlvbnMgPSBVdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgdGlsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbikge1xuICAgICAgY29uZmlnLnVybFRlbXBsYXRlICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgIH1cblxuICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwXG4gICAgVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgY29uZmlnLnVybFRlbXBsYXRlLCB0aWxlT3B0aW9ucyk7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYW5lID09PSAnZXNyaS1sYWJlbHMnKSB7XG4gICAgICB0aGlzLl9pbml0UGFuZSgpO1xuICAgIH1cbiAgICAvLyBzb21lIGJhc2VtYXBzIGNhbiBzdXBwbHkgZHluYW1pYyBhdHRyaWJ1dGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25VcmwpIHtcbiAgICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGEodGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uVXJsLCBtYXApO1xuICAgIH1cblxuICAgIG1hcC5vbignbW92ZWVuZCcsIF91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBfdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIF9pbml0UGFuZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwLmdldFBhbmUodGhpcy5vcHRpb25zLnBhbmUpKSB7XG4gICAgICB2YXIgcGFuZSA9IHRoaXMuX21hcC5jcmVhdGVQYW5lKHRoaXMub3B0aW9ucy5wYW5lKTtcbiAgICAgIHBhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBhbmUuc3R5bGUuekluZGV4ID0gNTAwO1xuICAgIH1cbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9ICc8c3BhbiBjbGFzcz1cImVzcmktZHluYW1pYy1hdHRyaWJ1dGlvblwiPicgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwTGF5ZXIgKGtleSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlbWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBUaWxlTGF5ZXIsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHdhcm4sIGNsZWFuVXJsLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBtYXBTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL01hcFNlcnZpY2UnO1xuXG5leHBvcnQgdmFyIFRpbGVkTWFwTGF5ZXIgPSBUaWxlTGF5ZXIuZXh0ZW5kKHtcbiAgb3B0aW9uczoge1xuICAgIHpvb21PZmZzZXRBbGxvd2FuY2U6IDAuMSxcbiAgICBlcnJvclRpbGVVcmw6ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVFBQUFBRUFCQU1BQUFDdVhMVlZBQUFBQTFCTVZFVXpORFZzemxISEFBQUFBWFJTVGxNQVFPYllaZ0FBQUFsd1NGbHpBQUFBQUFBQUFBQUI2bVVXcEFBQUFEWkpSRUZVZUp6dHdRRUJBQUFBZ2lEL3IyNUlRQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTd3YUJBQUFCdzA4UndBQUFBQUJKUlU1RXJrSmdnZz09J1xuICB9LFxuXG4gIHN0YXRpY3M6IHtcbiAgICBNZXJjYXRvclpvb21MZXZlbHM6IHtcbiAgICAgICcwJzogMTU2NTQzLjAzMzkyNzk5OTk5LFxuICAgICAgJzEnOiA3ODI3MS41MTY5NjM5OTk4OTMsXG4gICAgICAnMic6IDM5MTM1Ljc1ODQ4MjAwMDA5OSxcbiAgICAgICczJzogMTk1NjcuODc5MjQwOTk5OTAxLFxuICAgICAgJzQnOiA5NzgzLjkzOTYyMDQ5OTk1OTMsXG4gICAgICAnNSc6IDQ4OTEuOTY5ODEwMjQ5OTc5NyxcbiAgICAgICc2JzogMjQ0NS45ODQ5MDUxMjQ5ODk4LFxuICAgICAgJzcnOiAxMjIyLjk5MjQ1MjU2MjQ4OTksXG4gICAgICAnOCc6IDYxMS40OTYyMjYyODEzODAwMixcbiAgICAgICc5JzogMzA1Ljc0ODExMzE0MDU1ODAyLFxuICAgICAgJzEwJzogMTUyLjg3NDA1NjU3MDQxMSxcbiAgICAgICcxMSc6IDc2LjQzNzAyODI4NTA3MzE5NyxcbiAgICAgICcxMic6IDM4LjIxODUxNDE0MjUzNjU5OCxcbiAgICAgICcxMyc6IDE5LjEwOTI1NzA3MTI2ODI5OSxcbiAgICAgICcxNCc6IDkuNTU0NjI4NTM1NjM0MTQ5NixcbiAgICAgICcxNSc6IDQuNzc3MzE0MjY3OTQ5MzY5OSxcbiAgICAgICcxNic6IDIuMzg4NjU3MTMzOTc0NjgsXG4gICAgICAnMTcnOiAxLjE5NDMyODU2Njg1NTA1MDEsXG4gICAgICAnMTgnOiAwLjU5NzE2NDI4MzU1OTgxNjk5LFxuICAgICAgJzE5JzogMC4yOTg1ODIxNDE2NDc2MTY5OCxcbiAgICAgICcyMCc6IDAuMTQ5MjkxMDcwODIzODEsXG4gICAgICAnMjEnOiAwLjA3NDY0NTUzNTQxMTkxLFxuICAgICAgJzIyJzogMC4wMzczMjI3Njc3MDU5NTI1LFxuICAgICAgJzIzJzogMC4wMTg2NjEzODM4NTI5NzYzXG4gICAgfVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy51cmwgPSBjbGVhblVybChvcHRpb25zLnVybCk7XG4gICAgb3B0aW9ucyA9IFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vIHNldCB0aGUgdXJsc1xuICAgIHRoaXMudGlsZVVybCA9IG9wdGlvbnMudXJsICsgJ3RpbGUve3p9L3t5fS97eH0nO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgdmFyIGFyY2dpc29ubGluZSA9IG5ldyBSZWdFeHAoL3RpbGVzLmFyY2dpcyhvbmxpbmUpP1xcLmNvbS9nKTtcbiAgICBpZiAoYXJjZ2lzb25saW5lLnRlc3Qob3B0aW9ucy51cmwpKSB7XG4gICAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnRpbGVVcmwucmVwbGFjZSgnOi8vdGlsZXMnLCAnOi8vdGlsZXN7c30nKTtcbiAgICAgIG9wdGlvbnMuc3ViZG9tYWlucyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHRoaXMudGlsZVVybCArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICB9XG5cbiAgICAvLyBpbml0IGxheWVyIGJ5IGNhbGxpbmcgVGlsZUxheWVycyBpbml0aWFsaXplIG1ldGhvZFxuICAgIFRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgZ2V0VGlsZVVybDogZnVuY3Rpb24gKHRpbGVQb2ludCkge1xuICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbUZvclVybCgpO1xuXG4gICAgcmV0dXJuIFV0aWwudGVtcGxhdGUodGhpcy50aWxlVXJsLCBVdGlsLmV4dGVuZCh7XG4gICAgICBzOiB0aGlzLl9nZXRTdWJkb21haW4odGlsZVBvaW50KSxcbiAgICAgIHg6IHRpbGVQb2ludC54LFxuICAgICAgeTogdGlsZVBvaW50LnksXG4gICAgICAvLyB0cnkgbG9kIG1hcCBmaXJzdCwgdGhlbiBqdXN0IGRlZmF1bHQgdG8gem9vbSBsZXZlbFxuICAgICAgejogKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbem9vbV0pID8gdGhpcy5fbG9kTWFwW3pvb21dIDogem9vbVxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuICB9LFxuXG4gIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMsIGRvbmUpIHtcbiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnbG9hZCcsIEwuYmluZCh0aGlzLl90aWxlT25Mb2FkLCB0aGlzLCBkb25lLCB0aWxlKSk7XG4gICAgTC5Eb21FdmVudC5vbih0aWxlLCAnZXJyb3InLCBMLmJpbmQodGhpcy5fdGlsZU9uRXJyb3IsIHRoaXMsIGRvbmUsIHRpbGUpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHRpbGUuY3Jvc3NPcmlnaW4gPSAnJztcbiAgICB9XG5cbiAgICAvKlxuICAgICBBbHQgdGFnIGlzIHNldCB0byBlbXB0eSBzdHJpbmcgdG8ga2VlcCBzY3JlZW4gcmVhZGVycyBmcm9tIHJlYWRpbmcgVVJMIGFuZCBmb3IgY29tcGxpYW5jZSByZWFzb25zXG4gICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9INjdcbiAgICAqL1xuICAgIHRpbGUuYWx0ID0gJyc7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBsb2QgbWFwIG9yIGFuIGxvZCBtYXAgd2l0aCBhIHByb3BlciB6b29tIGxvYWQgdGhlIHRpbGVcbiAgICAvLyBvdGhlcndpc2Ugd2FpdCBmb3IgdGhlIGxvZCBtYXAgdG8gYmVjb21lIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5fbG9kTWFwIHx8ICh0aGlzLl9sb2RNYXAgJiYgdGhpcy5fbG9kTWFwW3RoaXMuX2dldFpvb21Gb3JVcmwoKV0pKSB7XG4gICAgICB0aWxlLnNyYyA9IHRoaXMuZ2V0VGlsZVVybChjb29yZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ2xvZG1hcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGlsZS5zcmMgPSB0aGlzLmdldFRpbGVVcmwoY29vcmRzKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWxlO1xuICB9LFxuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIGlmICghdGhpcy5fbG9kTWFwKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvciAmJiBtZXRhZGF0YS5zcGF0aWFsUmVmZXJlbmNlKSB7XG4gICAgICAgICAgdmFyIHNyID0gbWV0YWRhdGEuc3BhdGlhbFJlZmVyZW5jZS5sYXRlc3RXa2lkIHx8IG1ldGFkYXRhLnNwYXRpYWxSZWZlcmVuY2Uud2tpZDtcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5jcnMgPT09IEwuQ1JTLkVQU0czODU3ICYmIHNyID09PSAxMDIxMDAgfHwgc3IgPT09IDM4NTcpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZE1hcCA9IHt9O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB6b29tIGxldmVsIGRhdGFcbiAgICAgICAgICAgIHZhciBhcmNnaXNMT0RzID0gbWV0YWRhdGEudGlsZUluZm8ubG9kcztcbiAgICAgICAgICAgIHZhciBjb3JyZWN0UmVzb2x1dGlvbnMgPSBUaWxlZE1hcExheWVyLk1lcmNhdG9yWm9vbUxldmVscztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmNnaXNMT0RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBhcmNnaXNMT0QgPSBhcmNnaXNMT0RzW2ldO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjaSBpbiBjb3JyZWN0UmVzb2x1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdFJlcyA9IGNvcnJlY3RSZXNvbHV0aW9uc1tjaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2l0aGluUGVyY2VudGFnZShhcmNnaXNMT0QucmVzb2x1dGlvbiwgY29ycmVjdFJlcywgdGhpcy5vcHRpb25zLnpvb21PZmZzZXRBbGxvd2FuY2UpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9sb2RNYXBbY2ldID0gYXJjZ2lzTE9ELmxldmVsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9kbWFwJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvajQpIHtcbiAgICAgICAgICAgICAgd2FybignTC5lc3JpLlRpbGVkTWFwTGF5ZXIgaXMgdXNpbmcgYSBub24tbWVyY2F0b3Igc3BhdGlhbCByZWZlcmVuY2UuIFN1cHBvcnQgbWF5IGJlIGF2YWlsYWJsZSB0aHJvdWdoIFByb2o0TGVhZmxldCBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2V4YW1wbGVzL25vbi1tZXJjYXRvci1wcm9qZWN0aW9uLmh0bWwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5pZGVudGlmeSgpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmZpbmQoKTtcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBhdXRoZW50aWNhdGU6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciB0b2tlblFzID0gJz90b2tlbj0nICsgdG9rZW47XG4gICAgdGhpcy50aWxlVXJsID0gKHRoaXMub3B0aW9ucy50b2tlbikgPyB0aGlzLnRpbGVVcmwucmVwbGFjZSgvXFw/dG9rZW49KC4rKS9nLCB0b2tlblFzKSA6IHRoaXMudGlsZVVybCArIHRva2VuUXM7XG4gICAgdGhpcy5vcHRpb25zLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy5zZXJ2aWNlLmF1dGhlbnRpY2F0ZSh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3dpdGhpblBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChhLCBiLCBwZXJjZW50YWdlKSB7XG4gICAgdmFyIGRpZmYgPSBNYXRoLmFicygoYSAvIGIpIC0gMSk7XG4gICAgcmV0dXJuIGRpZmYgPCBwZXJjZW50YWdlO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVkTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFRpbGVkTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGlsZWRNYXBMYXllcjtcbiIsImltcG9ydCB7IEltYWdlT3ZlcmxheSwgQ1JTLCBEb21VdGlsLCBVdGlsLCBMYXllciwgcG9wdXAsIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgY29ycyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciBPdmVybGF5ID0gSW1hZ2VPdmVybGF5LmV4dGVuZCh7XG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fdG9wTGVmdCA9IG1hcC5nZXRQaXhlbEJvdW5kcygpLm1pbjtcbiAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcbiAgX3Jlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLmNycyA9PT0gQ1JTLkVQU0czODU3KSB7XG4gICAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBEb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ltYWdlLCB0aGlzLl90b3BMZWZ0LnN1YnRyYWN0KHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpKSk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IHZhciBSYXN0ZXJMYXllciA9IExheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgcG9zaXRpb246ICdmcm9udCcsXG4gICAgZjogJ2ltYWdlJyxcbiAgICB1c2VDb3JzOiBjb3JzLFxuICAgIGF0dHJpYnV0aW9uOiBudWxsLFxuICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICBhbHQ6ICcnXG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgdGhpcy5fdXBkYXRlID0gVXRpbC50aHJvdHRsZSh0aGlzLl91cGRhdGUsIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCwgdGhpcyk7XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUsIHRoaXMpO1xuXG4gICAgLy8gaWYgd2UgaGFkIGFuIGltYWdlIGxvYWRlZCBhbmQgaXQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGJvdW5kcyBzaG93IHRoZSBpbWFnZSBvdGhlcndpc2UgcmVtb3ZlIGl0XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgbWFwLmFkZExheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX2dldFBvcHVwRGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgY29weXJpZ2h0IHRleHQgbGlzdGVkIGluIHNlcnZpY2UgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGFkYXRhKGZ1bmN0aW9uIChlcnIsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoIWVyciAmJiAhdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gPSBtZXRhZGF0YS5jb3B5cmlnaHRUZXh0O1xuICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlLCB0aGlzKTtcbiAgfSxcblxuICBiaW5kUG9wdXA6IGZ1bmN0aW9uIChmbiwgcG9wdXBPcHRpb25zKSB7XG4gICAgdGhpcy5fc2hvdWxkUmVuZGVyUG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLl9wb3B1cCA9IHBvcHVwKHBvcHVwT3B0aW9ucyk7XG4gICAgdGhpcy5fcG9wdXBGdW5jdGlvbiA9IGZuO1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHVuYmluZFBvcHVwOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcy5fcG9wdXApO1xuICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9yZXNldFBvcHVwU3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9wb3B1cCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdmcm9udCc7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9Gcm9udCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBicmluZ1RvQmFjazogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9ICdiYWNrJztcbiAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuYnJpbmdUb0JhY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIGdldE9wYWNpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk7XG4gIH0sXG5cbiAgc2V0T3BhY2l0eTogZnVuY3Rpb24gKG9wYWNpdHkpIHtcbiAgICB0aGlzLm9wdGlvbnMub3BhY2l0eSA9IG9wYWNpdHk7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLnNldE9wYWNpdHkob3BhY2l0eSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVSYW5nZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbdGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50b107XG4gIH0sXG5cbiAgc2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICB0aGlzLm9wdGlvbnMuZnJvbSA9IGZyb207XG4gICAgdGhpcy5vcHRpb25zLnRvID0gdG87XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS5tZXRhZGF0YShjYWxsYmFjaywgY29udGV4dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICByZWRyYXc6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBfcmVuZGVySW1hZ2U6IGZ1bmN0aW9uICh1cmwsIGJvdW5kcywgY29udGVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAvLyBpZiBubyBvdXRwdXQgZGlyZWN0b3J5IGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgYSBzZXJ2aWNlLCBNSU1FIGRhdGEgd2lsbCBiZSByZXR1cm5lZFxuICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIHVybCA9ICdkYXRhOicgKyBjb250ZW50VHlwZSArICc7YmFzZTY0LCcgKyB1cmw7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgaW1hZ2Ugb3ZlcmxheSBhbmQgYWRkIGl0IHRvIHRoZSBtYXBcbiAgICAgIC8vIHRvIHN0YXJ0IGxvYWRpbmcgdGhlIGltYWdlXG4gICAgICAvLyBvcGFjaXR5IGlzIDAgd2hpbGUgdGhlIGltYWdlIGlzIGxvYWRpbmdcbiAgICAgIHZhciBpbWFnZSA9IG5ldyBPdmVybGF5KHVybCwgYm91bmRzLCB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIGNyb3NzT3JpZ2luOiB0aGlzLm9wdGlvbnMudXNlQ29ycyxcbiAgICAgICAgYWx0OiB0aGlzLm9wdGlvbnMuYWx0LFxuICAgICAgICBwYW5lOiB0aGlzLm9wdGlvbnMucGFuZSB8fCB0aGlzLmdldFBhbmUoKSxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZVxuICAgICAgfSkuYWRkVG8odGhpcy5fbWFwKTtcblxuICAgICAgLy8gb25jZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICAgIGltYWdlLm9uY2UoJ2xvYWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIG5ld0ltYWdlID0gZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlO1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGJvdW5kcyBvZiB0aGlzIGltYWdlIG1hdGNoZXMgdGhlIGJvdW5kcyB0aGF0XG4gICAgICAgICAgLy8gX3JlbmRlckltYWdlIHdhcyBjYWxsZWQgd2l0aCBhbmQgd2UgaGF2ZSBhIG1hcCB3aXRoIHRoZSBzYW1lIGJvdW5kc1xuICAgICAgICAgIC8vIGhpZGUgdGhlIG9sZCBpbWFnZSBpZiB0aGVyZSBpcyBvbmUgYW5kIHNldCB0aGUgb3BhY2l0eVxuICAgICAgICAgIC8vIG9mIHRoZSBuZXcgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSB0aGUgbmV3IGltYWdlXG4gICAgICAgICAgaWYgKG5ld0ltYWdlLl9ib3VuZHMuZXF1YWxzKGJvdW5kcykgJiYgbmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0JhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkSW1hZ2UgJiYgdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcihvbGRJbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRJbWFnZSAmJiBvbGRJbWFnZS5fbWFwKSB7XG4gICAgICAgICAgICAgIG9sZEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcsIHtcbiAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH0sIHRoaXMpO1xuXG4gICAgICB0aGlzLmZpcmUoJ2xvYWRpbmcnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7XG5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW5nWm9vbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXAuX3BhblRyYW5zaXRpb24gJiYgdGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uLl9pblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHpvb20gPiB0aGlzLm9wdGlvbnMubWF4Wm9vbSB8fCB6b29tIDwgdGhpcy5vcHRpb25zLm1pblpvb20pIHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0gdGhpcy5fYnVpbGRFeHBvcnRQYXJhbXMoKTtcblxuICAgIHRoaXMuX3JlcXVlc3RFeHBvcnQocGFyYW1zLCBib3VuZHMpO1xuICB9LFxuXG4gIF9yZW5kZXJQb3B1cDogZnVuY3Rpb24gKGxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwICYmIHRoaXMuX2xhc3RDbGljay5lcXVhbHMobGF0bG5nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwb3B1cCB0byB0aGUgbWFwIHdoZXJlIHRoZSBtb3VzZSB3YXMgY2xpY2tlZCBhdFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9wb3B1cEZ1bmN0aW9uKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICB0aGlzLl9wb3B1cC5zZXRMYXRMbmcobGF0bG5nKS5zZXRDb250ZW50KGNvbnRlbnQpLm9wZW5Pbih0aGlzLl9tYXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVzZXRQb3B1cFN0YXRlOiBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH1cbn0pO1xuIiwiaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgUmFzdGVyTGF5ZXIgfSBmcm9tICcuL1Jhc3RlckxheWVyJztcbmltcG9ydCB7IGNsZWFuVXJsIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgaW1hZ2VTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL0ltYWdlU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgSW1hZ2VNYXBMYXllciA9IFJhc3RlckxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHVwZGF0ZUludGVydmFsOiAxNTAsXG4gICAgZm9ybWF0OiAnanBncG5nJyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IGltYWdlU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0UGl4ZWxUeXBlOiBmdW5jdGlvbiAocGl4ZWxUeXBlKSB7XG4gICAgdGhpcy5vcHRpb25zLnBpeGVsVHlwZSA9IHBpeGVsVHlwZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRQaXhlbFR5cGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBpeGVsVHlwZTtcbiAgfSxcblxuICBzZXRCYW5kSWRzOiBmdW5jdGlvbiAoYmFuZElkcykge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoYmFuZElkcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5iYW5kSWRzID0gYmFuZElkcy50b1N0cmluZygpO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRCYW5kSWRzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5iYW5kSWRzO1xuICB9LFxuXG4gIHNldE5vRGF0YTogZnVuY3Rpb24gKG5vRGF0YSwgbm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KG5vRGF0YSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ub0RhdGEgPSBub0RhdGEuam9pbignLCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm9EYXRhID0gbm9EYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChub0RhdGFJbnRlcnByZXRhdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zLm5vRGF0YUludGVycHJldGF0aW9uID0gbm9EYXRhSW50ZXJwcmV0YXRpb247XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldE5vRGF0YTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICB9LFxuXG4gIGdldE5vRGF0YUludGVycHJldGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgfSxcblxuICBzZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAocmVuZGVyaW5nUnVsZSkge1xuICAgIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlID0gcmVuZGVyaW5nUnVsZTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBnZXRSZW5kZXJpbmdSdWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlO1xuICB9LFxuXG4gIHNldE1vc2FpY1J1bGU6IGZ1bmN0aW9uIChtb3NhaWNSdWxlKSB7XG4gICAgdGhpcy5vcHRpb25zLm1vc2FpY1J1bGUgPSBtb3NhaWNSdWxlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIGdldE1vc2FpY1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1vc2FpY1J1bGU7XG4gIH0sXG5cbiAgX2dldFBvcHVwRGF0YTogZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcbiAgICAgIHNldFRpbWVvdXQoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyUG9wdXAoZS5sYXRsbmcsIGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkuYXQoZS5sYXRsbmcpO1xuXG4gICAgLy8gc2V0IG1vc2FpYyBydWxlIGZvciBpZGVudGlmeSB0YXNrIGlmIGl0IGlzIHNldCBmb3IgbGF5ZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1vc2FpY1J1bGUpIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5zZXRNb3NhaWNSdWxlKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICAgIC8vIEBUT0RPOiBmb3JjZSByZXR1cm4gY2F0YWxvZyBpdGVtcyB0b28/XG4gICAgfVxuXG4gICAgLy8gQFRPRE86IHNldCByZW5kZXJpbmcgcnVsZT8gTm90IHN1cmUsXG4gICAgLy8gc29tZXRpbWVzIHlvdSB3YW50IHJhdyBwaXhlbCB2YWx1ZXNcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUpIHtcbiAgICAvLyAgIGlkZW50aWZ5UmVxdWVzdC5zZXRSZW5kZXJpbmdSdWxlKHRoaXMub3B0aW9ucy5yZW5kZXJpbmdSdWxlKTtcbiAgICAvLyB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBzdyA9IHRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHNyID0gcGFyc2VJbnQodGhpcy5fbWFwLm9wdGlvbnMuY3JzLmNvZGUuc3BsaXQoJzonKVsxXSwgMTApO1xuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsXG4gICAgICB0cmFuc3BhcmVudDogdGhpcy5vcHRpb25zLnRyYW5zcGFyZW50LFxuICAgICAgYmJveFNSOiBzcixcbiAgICAgIGltYWdlU1I6IHNyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHBhcmFtcy50aW1lID0gdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpICsgJywnICsgdGhpcy5vcHRpb25zLnRvLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpeGVsVHlwZSkge1xuICAgICAgcGFyYW1zLnBpeGVsVHlwZSA9IHRoaXMub3B0aW9ucy5waXhlbFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJhbXMuaW50ZXJwb2xhdGlvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcHJlc3Npb25RdWFsaXR5KSB7XG4gICAgICBwYXJhbXMuY29tcHJlc3Npb25RdWFsaXR5ID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uUXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJhbmRJZHMpIHtcbiAgICAgIHBhcmFtcy5iYW5kSWRzID0gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub0RhdGEpIHtcbiAgICAgIHBhcmFtcy5ub0RhdGEgPSB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICAgIHBhcmFtcy5ub0RhdGFJbnRlcnByZXRhdGlvbiA9IHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgICAgcGFyYW1zLnJlbmRlcmluZ1J1bGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKSB7XG4gICAgICBwYXJhbXMubW9zYWljUnVsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydEltYWdlJywgcGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH0gLy8gd2UgcmVhbGx5IGNhbid0IGRvIGFueXRoaW5nIGhlcmUgYnV0IGF1dGhlbnRpY2F0ZSBvciByZXF1ZXN0ZXJyb3Igd2lsbCBmaXJlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmYgPSAnaW1hZ2UnO1xuICAgICAgdGhpcy5fcmVuZGVySW1hZ2UodGhpcy5vcHRpb25zLnVybCArICdleHBvcnRJbWFnZScgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEltYWdlTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW1hZ2VNYXBMYXllcjtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBjbGVhblVybCB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IG1hcFNlcnZpY2UgZnJvbSAnLi4vU2VydmljZXMvTWFwU2VydmljZSc7XG5cbmV4cG9ydCB2YXIgRHluYW1pY01hcExheWVyID0gUmFzdGVyTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MCxcbiAgICBsYXllcnM6IGZhbHNlLFxuICAgIGxheWVyRGVmczogZmFsc2UsXG4gICAgdGltZU9wdGlvbnM6IGZhbHNlLFxuICAgIGZvcm1hdDogJ3BuZzI0JyxcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICBmOiAnanNvbidcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgaWYgKChvcHRpb25zLnByb3h5IHx8IG9wdGlvbnMudG9rZW4pICYmIG9wdGlvbnMuZiAhPT0gJ2pzb24nKSB7XG4gICAgICBvcHRpb25zLmYgPSAnanNvbic7XG4gICAgfVxuXG4gICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIGdldER5bmFtaWNMYXllcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gIH0sXG5cbiAgc2V0RHluYW1pY0xheWVyczogZnVuY3Rpb24gKGR5bmFtaWNMYXllcnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZHluYW1pY0xheWVycyA9IGR5bmFtaWNMYXllcnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TGF5ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYXllcnM7XG4gIH0sXG5cbiAgc2V0TGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzKSB7XG4gICAgdGhpcy5vcHRpb25zLmxheWVycyA9IGxheWVycztcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRMYXllckRlZnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyRGVmcztcbiAgfSxcblxuICBzZXRMYXllckRlZnM6IGZ1bmN0aW9uIChsYXllckRlZnMpIHtcbiAgICB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzID0gbGF5ZXJEZWZzO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucztcbiAgfSxcblxuICBzZXRUaW1lT3B0aW9uczogZnVuY3Rpb24gKHRpbWVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVPcHRpb25zID0gdGltZU9wdGlvbnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmlkZW50aWZ5KCk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZCgpO1xuICB9LFxuXG4gIF9nZXRQb3B1cERhdGE6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkub24odGhpcy5fbWFwKS5hdChlLmxhdGxuZyk7XG5cbiAgICAvLyByZW1vdmUgZXh0cmFuZW91cyB2ZXJ0aWNlcyBmcm9tIHJlc3BvbnNlIGZlYXR1cmVzXG4gICAgaWRlbnRpZnlSZXF1ZXN0LnNpbXBsaWZ5KHRoaXMuX21hcCwgMC41KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJzKSB7XG4gICAgICBpZGVudGlmeVJlcXVlc3QubGF5ZXJzKCd2aXNpYmxlOicgKyB0aGlzLm9wdGlvbnMubGF5ZXJzLmpvaW4oJywnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkZW50aWZ5UmVxdWVzdC5sYXllcnMoJ3Zpc2libGUnKTtcbiAgICB9XG5cbiAgICBpZGVudGlmeVJlcXVlc3QucnVuKGNhbGxiYWNrKTtcblxuICAgIC8vIHNldCB0aGUgZmxhZ3MgdG8gc2hvdyB0aGUgcG9wdXBcbiAgICB0aGlzLl9zaG91bGRSZW5kZXJQb3B1cCA9IHRydWU7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2J1aWxkRXhwb3J0UGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgdmFyIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLmdldE5vcnRoRWFzdCgpKTtcbiAgICB2YXIgc3cgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMucHJvamVjdChib3VuZHMuZ2V0U291dGhXZXN0KCkpO1xuICAgIHZhciBzciA9IHBhcnNlSW50KHRoaXMuX21hcC5vcHRpb25zLmNycy5jb2RlLnNwbGl0KCc6JylbMV0sIDEwKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IGFzayBBcmNHSVMgU2VydmVyIGZvciBhIHRhbGxlciBpbWFnZSB0aGFuIHdlIGhhdmUgYWN0dWFsIG1hcCBkaXNwbGF5aW5nXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYm91bmRzLl9ub3J0aEVhc3QpO1xuICAgIHZhciBib3R0b20gPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGJvdW5kcy5fc291dGhXZXN0KTtcblxuICAgIGlmICh0b3AueSA+IDAgfHwgYm90dG9tLnkgPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbS55IC0gdG9wLnk7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIGJib3g6IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyksXG4gICAgICBzaXplOiBzaXplLnggKyAnLCcgKyBzaXplLnksXG4gICAgICBkcGk6IDk2LFxuICAgICAgZm9ybWF0OiB0aGlzLm9wdGlvbnMuZm9ybWF0LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRoaXMub3B0aW9ucy50cmFuc3BhcmVudCxcbiAgICAgIGJib3hTUjogc3IsXG4gICAgICBpbWFnZVNSOiBzclxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnMpIHtcbiAgICAgIHBhcmFtcy5keW5hbWljTGF5ZXJzID0gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgIHBhcmFtcy5sYXllcnMgPSAnc2hvdzonICsgdGhpcy5vcHRpb25zLmxheWVycy5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllckRlZnMpIHtcbiAgICAgIHBhcmFtcy5sYXllckRlZnMgPSB0eXBlb2YgdGhpcy5vcHRpb25zLmxheWVyRGVmcyA9PT0gJ3N0cmluZycgPyB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzIDogSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxheWVyRGVmcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucykge1xuICAgICAgcGFyYW1zLnRpbWVPcHRpb25zID0gSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnRpbWVPcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZyb20gJiYgdGhpcy5vcHRpb25zLnRvKSB7XG4gICAgICBwYXJhbXMudGltZSA9IHRoaXMub3B0aW9ucy5mcm9tLnZhbHVlT2YoKSArICcsJyArIHRoaXMub3B0aW9ucy50by52YWx1ZU9mKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuKSB7XG4gICAgICBwYXJhbXMudG9rZW4gPSB0aGlzLnNlcnZpY2Uub3B0aW9ucy50b2tlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICBwYXJhbXMucHJveHkgPSB0aGlzLm9wdGlvbnMucHJveHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSxcblxuICBfcmVxdWVzdEV4cG9ydDogZnVuY3Rpb24gKHBhcmFtcywgYm91bmRzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mID09PSAnanNvbicpIHtcbiAgICAgIHRoaXMuc2VydmljZS5yZXF1ZXN0KCdleHBvcnQnLCBwYXJhbXMsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7IHJldHVybjsgfSAvLyB3ZSByZWFsbHkgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSBidXQgYXV0aGVudGljYXRlIG9yIHJlcXVlc3RlcnJvciB3aWxsIGZpcmVcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRva2VuKSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICAgICAgcmVzcG9uc2UuaHJlZiA9IHRoaXMub3B0aW9ucy5wcm94eSArICc/JyArIHJlc3BvbnNlLmhyZWY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmhyZWYpIHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJJbWFnZShyZXNwb25zZS5ocmVmLCBib3VuZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmltYWdlRGF0YSwgYm91bmRzLCByZXNwb25zZS5jb250ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMuZiA9ICdpbWFnZSc7XG4gICAgICB0aGlzLl9yZW5kZXJJbWFnZSh0aGlzLm9wdGlvbnMudXJsICsgJ2V4cG9ydCcgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNNYXBMYXllciAodXJsLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRHluYW1pY01hcExheWVyKHVybCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGR5bmFtaWNNYXBMYXllcjtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG52YXIgVmlydHVhbEdyaWQgPSBMLkxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIGNlbGxTaXplOiA1MTIsXG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fdXBkYXRlID0gTC5VdGlsLnRocm90dGxlKHRoaXMuX3VwZGF0ZSwgdGhpcy5vcHRpb25zLnVwZGF0ZUludGVydmFsLCB0aGlzKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fbWFwLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5nZXRFdmVudHMoKSwgdGhpcyk7XG4gICAgdGhpcy5fcmVtb3ZlQ2VsbHMoKTtcbiAgfSxcblxuICBnZXRFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXZlbnRzID0ge1xuICAgICAgbW92ZWVuZDogdGhpcy5fdXBkYXRlLFxuICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tc3RhcnQsXG4gICAgICB6b29tZW5kOiB0aGlzLl9yZXNldFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9LFxuXG4gIGFkZFRvOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLmFkZExheWVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlbW92ZUZyb206IGZ1bmN0aW9uIChtYXApIHtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX3pvb21zdGFydDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICB9LFxuXG4gIF9yZXNldDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbW92ZUNlbGxzKCk7XG5cbiAgICB0aGlzLl9jZWxscyA9IHt9O1xuICAgIHRoaXMuX2FjdGl2ZUNlbGxzID0ge307XG4gICAgdGhpcy5fY2VsbHNUb0xvYWQgPSAwO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgPSAwO1xuICAgIHRoaXMuX2NlbGxOdW1Cb3VuZHMgPSB0aGlzLl9nZXRDZWxsTnVtQm91bmRzKCk7XG5cbiAgICB0aGlzLl9yZXNldFdyYXAoKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgX3Jlc2V0V3JhcDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNycyA9IG1hcC5vcHRpb25zLmNycztcblxuICAgIGlmIChjcnMuaW5maW5pdGUpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgY2VsbFNpemUgPSB0aGlzLl9nZXRDZWxsU2l6ZSgpO1xuXG4gICAgaWYgKGNycy53cmFwTG5nKSB7XG4gICAgICB0aGlzLl93cmFwTG5nID0gW1xuICAgICAgICBNYXRoLmZsb29yKG1hcC5wcm9qZWN0KFswLCBjcnMud3JhcExuZ1swXV0pLnggLyBjZWxsU2l6ZSksXG4gICAgICAgIE1hdGguY2VpbChtYXAucHJvamVjdChbMCwgY3JzLndyYXBMbmdbMV1dKS54IC8gY2VsbFNpemUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmIChjcnMud3JhcExhdCkge1xuICAgICAgdGhpcy5fd3JhcExhdCA9IFtcbiAgICAgICAgTWF0aC5mbG9vcihtYXAucHJvamVjdChbY3JzLndyYXBMYXRbMF0sIDBdKS55IC8gY2VsbFNpemUpLFxuICAgICAgICBNYXRoLmNlaWwobWFwLnByb2plY3QoW2Nycy53cmFwTGF0WzFdLCAwXSkueSAvIGNlbGxTaXplKVxuICAgICAgXTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldENlbGxTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jZWxsU2l6ZTtcbiAgfSxcblxuICBfdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsQm91bmRzKCk7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5fZ2V0Q2VsbFNpemUoKTtcblxuICAgIC8vIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHZpZXdcbiAgICB2YXIgY2VsbEJvdW5kcyA9IEwuYm91bmRzKFxuICAgICAgYm91bmRzLm1pbi5kaXZpZGVCeShjZWxsU2l6ZSkuZmxvb3IoKSxcbiAgICAgIGJvdW5kcy5tYXguZGl2aWRlQnkoY2VsbFNpemUpLmZsb29yKCkpO1xuXG4gICAgdGhpcy5fcmVtb3ZlT3RoZXJDZWxscyhjZWxsQm91bmRzKTtcbiAgICB0aGlzLl9hZGRDZWxscyhjZWxsQm91bmRzKTtcblxuICAgIHRoaXMuZmlyZSgnY2VsbHN1cGRhdGVkJyk7XG4gIH0sXG5cbiAgX2FkZENlbGxzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgdmFyIGNlbnRlciA9IGJvdW5kcy5nZXRDZW50ZXIoKTtcbiAgICB2YXIgem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7XG5cbiAgICB2YXIgaiwgaSwgY29vcmRzO1xuICAgIC8vIGNyZWF0ZSBhIHF1ZXVlIG9mIGNvb3JkaW5hdGVzIHRvIGxvYWQgY2VsbHMgZnJvbVxuICAgIGZvciAoaiA9IGJvdW5kcy5taW4ueTsgaiA8PSBib3VuZHMubWF4Lnk7IGorKykge1xuICAgICAgZm9yIChpID0gYm91bmRzLm1pbi54OyBpIDw9IGJvdW5kcy5tYXgueDsgaSsrKSB7XG4gICAgICAgIGNvb3JkcyA9IEwucG9pbnQoaSwgaik7XG4gICAgICAgIGNvb3Jkcy56ID0gem9vbTtcblxuICAgICAgICBpZiAodGhpcy5faXNWYWxpZENlbGwoY29vcmRzKSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsc1RvTG9hZCA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIGlmIChjZWxsc1RvTG9hZCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuX2NlbGxzVG9Mb2FkICs9IGNlbGxzVG9Mb2FkO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgKz0gY2VsbHNUb0xvYWQ7XG5cbiAgICAvLyBzb3J0IGNlbGwgcXVldWUgdG8gbG9hZCBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBkaXN0YW5jZSB0byBjZW50ZXJcbiAgICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXN0YW5jZVRvKGNlbnRlcikgLSBiLmRpc3RhbmNlVG8oY2VudGVyKTtcbiAgICB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsc1RvTG9hZDsgaSsrKSB7XG4gICAgICB0aGlzLl9hZGRDZWxsKHF1ZXVlW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgX2lzVmFsaWRDZWxsOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgdmFyIGNycyA9IHRoaXMuX21hcC5vcHRpb25zLmNycztcblxuICAgIGlmICghY3JzLmluZmluaXRlKSB7XG4gICAgICAvLyBkb24ndCBsb2FkIGNlbGwgaWYgaXQncyBvdXQgb2YgYm91bmRzIGFuZCBub3Qgd3JhcHBlZFxuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxOdW1Cb3VuZHM7XG4gICAgICBpZiAoXG4gICAgICAgICghY3JzLndyYXBMbmcgJiYgKGNvb3Jkcy54IDwgYm91bmRzLm1pbi54IHx8IGNvb3Jkcy54ID4gYm91bmRzLm1heC54KSkgfHxcbiAgICAgICAgKCFjcnMud3JhcExhdCAmJiAoY29vcmRzLnkgPCBib3VuZHMubWluLnkgfHwgY29vcmRzLnkgPiBib3VuZHMubWF4LnkpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ib3VuZHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGRvbid0IGxvYWQgY2VsbCBpZiBpdCBkb2Vzbid0IGludGVyc2VjdCB0aGUgYm91bmRzIGluIG9wdGlvbnNcbiAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyh0aGlzLm9wdGlvbnMuYm91bmRzKS5pbnRlcnNlY3RzKGNlbGxCb3VuZHMpO1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY29vcmRpbmF0ZXMgdG8gaXRzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgX2NlbGxDb29yZHNUb0JvdW5kczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5vcHRpb25zLmNlbGxTaXplO1xuICAgIHZhciBud1BvaW50ID0gY29vcmRzLm11bHRpcGx5QnkoY2VsbFNpemUpO1xuICAgIHZhciBzZVBvaW50ID0gbndQb2ludC5hZGQoW2NlbGxTaXplLCBjZWxsU2l6ZV0pO1xuICAgIHZhciBudyA9IG1hcC53cmFwTGF0TG5nKG1hcC51bnByb2plY3QobndQb2ludCwgY29vcmRzLnopKTtcbiAgICB2YXIgc2UgPSBtYXAud3JhcExhdExuZyhtYXAudW5wcm9qZWN0KHNlUG9pbnQsIGNvb3Jkcy56KSk7XG5cbiAgICByZXR1cm4gTC5sYXRMbmdCb3VuZHMobncsIHNlKTtcbiAgfSxcblxuICAvLyBjb252ZXJ0cyBjZWxsIGNvb3JkaW5hdGVzIHRvIGtleSBmb3IgdGhlIGNlbGwgY2FjaGVcbiAgX2NlbGxDb29yZHNUb0tleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueCArICc6JyArIGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY2FjaGUga2V5IHRvIGNvb3JkaWFudGVzXG4gIF9rZXlUb0NlbGxDb29yZHM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIga0FyciA9IGtleS5zcGxpdCgnOicpO1xuICAgIHZhciB4ID0gcGFyc2VJbnQoa0FyclswXSwgMTApO1xuICAgIHZhciB5ID0gcGFyc2VJbnQoa0FyclsxXSwgMTApO1xuXG4gICAgcmV0dXJuIEwucG9pbnQoeCwgeSk7XG4gIH0sXG5cbiAgLy8gcmVtb3ZlIGFueSBwcmVzZW50IGNlbGxzIHRoYXQgYXJlIG9mZiB0aGUgc3BlY2lmaWVkIGJvdW5kc1xuICBfcmVtb3ZlT3RoZXJDZWxsczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgaWYgKCFib3VuZHMuY29udGFpbnModGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSkpKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNlbGwoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZUNlbGw6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICBpZiAoY2VsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2tleV07XG5cbiAgICAgIGlmICh0aGlzLmNlbGxMZWF2ZSkge1xuICAgICAgICB0aGlzLmNlbGxMZWF2ZShjZWxsLmJvdW5kcywgY2VsbC5jb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjZWxsLmNvb3Jkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9yZW1vdmVDZWxsczogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9jZWxscykge1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxzW2tleV0uYm91bmRzO1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2NlbGxzW2tleV0uY29vcmRzO1xuXG4gICAgICBpZiAodGhpcy5jZWxsTGVhdmUpIHtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUoYm91bmRzLCBjb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxsZWF2ZScsIHtcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2FkZENlbGw6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAvLyB3cmFwIGNlbGwgY29vcmRzIGlmIG5lY2Vzc2FyeSAoZGVwZW5kaW5nIG9uIENSUylcbiAgICB0aGlzLl93cmFwQ29vcmRzKGNvb3Jkcyk7XG5cbiAgICAvLyBnZW5lcmF0ZSB0aGUgY2VsbCBrZXlcbiAgICB2YXIga2V5ID0gdGhpcy5fY2VsbENvb3Jkc1RvS2V5KGNvb3Jkcyk7XG5cbiAgICAvLyBnZXQgdGhlIGNlbGwgZnJvbSB0aGUgY2FjaGVcbiAgICB2YXIgY2VsbCA9IHRoaXMuX2NlbGxzW2tleV07XG4gICAgLy8gaWYgdGhpcyBjZWxsIHNob3VsZCBiZSBzaG93biBhcyBpc250IGFjdGl2ZSB5ZXQgKGVudGVyKVxuXG4gICAgaWYgKGNlbGwgJiYgIXRoaXMuX2FjdGl2ZUNlbGxzW2tleV0pIHtcbiAgICAgIGlmICh0aGlzLmNlbGxFbnRlcikge1xuICAgICAgICB0aGlzLmNlbGxFbnRlcihjZWxsLmJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsZW50ZXInLCB7XG4gICAgICAgIGJvdW5kczogY2VsbC5ib3VuZHMsXG4gICAgICAgIGNvb3JkczogY29vcmRzXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fYWN0aXZlQ2VsbHNba2V5XSA9IGNlbGw7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZG9udCBoYXZlIHRoaXMgY2VsbCBpbiB0aGUgY2FjaGUgeWV0IChjcmVhdGUpXG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICBjZWxsID0ge1xuICAgICAgICBjb29yZHM6IGNvb3JkcyxcbiAgICAgICAgYm91bmRzOiB0aGlzLl9jZWxsQ29vcmRzVG9Cb3VuZHMoY29vcmRzKVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fY2VsbHNba2V5XSA9IGNlbGw7XG4gICAgICB0aGlzLl9hY3RpdmVDZWxsc1trZXldID0gY2VsbDtcblxuICAgICAgaWYgKHRoaXMuY3JlYXRlQ2VsbCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNlbGwoY2VsbC5ib3VuZHMsIGNvb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgnY2VsbGNyZWF0ZScsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfd3JhcENvb3JkczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIGNvb3Jkcy54ID0gdGhpcy5fd3JhcExuZyA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy54LCB0aGlzLl93cmFwTG5nKSA6IGNvb3Jkcy54O1xuICAgIGNvb3Jkcy55ID0gdGhpcy5fd3JhcExhdCA/IEwuVXRpbC53cmFwTnVtKGNvb3Jkcy55LCB0aGlzLl93cmFwTGF0KSA6IGNvb3Jkcy55O1xuICB9LFxuXG4gIC8vIGdldCB0aGUgZ2xvYmFsIGNlbGwgY29vcmRpbmF0ZXMgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHpvb21cbiAgX2dldENlbGxOdW1Cb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICByZXR1cm4gYm91bmRzID8gTC5ib3VuZHMoXG4gICAgICAgIGJvdW5kcy5taW4uZGl2aWRlQnkoc2l6ZSkuZmxvb3IoKSxcbiAgICAgICAgYm91bmRzLm1heC5kaXZpZGVCeShzaXplKS5jZWlsKCkuc3VidHJhY3QoWzEsIDFdKSkgOiBudWxsO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVmlydHVhbEdyaWQ7XG4iLCJmdW5jdGlvbiBCaW5hcnlTZWFyY2hJbmRleCAodmFsdWVzKSB7XG4gIHRoaXMudmFsdWVzID0gW10uY29uY2F0KHZhbHVlcyB8fCBbXSk7XG59XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICh2YWx1ZSkge1xuICBpZiAodGhpcy5kaXJ0eSkge1xuICAgIHRoaXMuc29ydCgpO1xuICB9XG5cbiAgdmFyIG1pbkluZGV4ID0gMDtcbiAgdmFyIG1heEluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIGN1cnJlbnRJbmRleDtcbiAgdmFyIGN1cnJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChtaW5JbmRleCA8PSBtYXhJbmRleCkge1xuICAgIGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSAvIDIgfCAwO1xuICAgIGN1cnJlbnRFbGVtZW50ID0gdGhpcy52YWx1ZXNbTWF0aC5yb3VuZChjdXJyZW50SW5kZXgpXTtcbiAgICBpZiAoK2N1cnJlbnRFbGVtZW50LnZhbHVlIDwgK3ZhbHVlKSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICgrY3VycmVudEVsZW1lbnQudmFsdWUgPiArdmFsdWUpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMofm1heEluZGV4KTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2VlbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoc3RhcnQpO1xuICB2YXIgZW5kSW5kZXggPSB0aGlzLmdldEluZGV4KGVuZCk7XG5cbiAgaWYgKHN0YXJ0SW5kZXggPT09IDAgJiYgZW5kSW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbc3RhcnRJbmRleCAtIDFdICYmIHRoaXMudmFsdWVzW3N0YXJ0SW5kZXggLSAxXS52YWx1ZSA9PT0gc3RhcnQpIHtcbiAgICBzdGFydEluZGV4LS07XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbZW5kSW5kZXggKyAxXSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdLnZhbHVlID09PSBlbmQpIHtcbiAgICBlbmRJbmRleCsrO1xuICB9XG5cbiAgaWYgKHRoaXMudmFsdWVzW2VuZEluZGV4XSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleF0udmFsdWUgPT09IGVuZCAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdKSB7XG4gICAgZW5kSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpdGVtKSB7XG4gIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLmdldEluZGV4KGl0ZW0udmFsdWUpLCAwLCBpdGVtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuYnVsa0FkZCA9IGZ1bmN0aW9uIGJ1bGtBZGQgKGl0ZW1zLCBzb3J0KSB7XG4gIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuY29uY2F0KFtdLmNvbmNhdChpdGVtcyB8fCBbXSkpO1xuXG4gIGlmIChzb3J0KSB7XG4gICAgdGhpcy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoKSB7XG4gIHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gK2IudmFsdWUgLSArYS52YWx1ZTtcbiAgfSkucmV2ZXJzZSgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5U2VhcmNoSW5kZXg7XG4iLCJpbXBvcnQgeyBVdGlsLCBzZXRPcHRpb25zIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgZmVhdHVyZUxheWVyU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9GZWF0dXJlTGF5ZXJTZXJ2aWNlJztcbmltcG9ydCB7IGNsZWFuVXJsLCB3YXJuLCBzZXRFc3JpQXR0cmlidXRpb24gfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCBWaXJ0dWFsR3JpZCBmcm9tICdsZWFmbGV0LXZpcnR1YWwtZ3JpZCc7XG5pbXBvcnQgQmluYXJ5U2VhcmNoSW5kZXggZnJvbSAndGlueS1iaW5hcnktc2VhcmNoJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTWFuYWdlciA9IFZpcnR1YWxHcmlkLmV4dGVuZCh7XG4gIC8qKlxuICAgKiBPcHRpb25zXG4gICAqL1xuXG4gIG9wdGlvbnM6IHtcbiAgICBhdHRyaWJ1dGlvbjogbnVsbCxcbiAgICB3aGVyZTogJzE9MScsXG4gICAgZmllbGRzOiBbJyonXSxcbiAgICBmcm9tOiBmYWxzZSxcbiAgICB0bzogZmFsc2UsXG4gICAgdGltZUZpZWxkOiBmYWxzZSxcbiAgICB0aW1lRmlsdGVyTW9kZTogJ3NlcnZlcicsXG4gICAgc2ltcGxpZnlGYWN0b3I6IDAsXG4gICAgcHJlY2lzaW9uOiA2XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgVmlydHVhbEdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMudXJsID0gY2xlYW5Vcmwob3B0aW9ucy51cmwpO1xuICAgIG9wdGlvbnMgPSBzZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5zZXJ2aWNlID0gZmVhdHVyZUxheWVyU2VydmljZShvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2UuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAvLyB1c2UgY2FzZSBpbnNlbnNpdGl2ZSByZWdleCB0byBsb29rIGZvciBjb21tb24gZmllbGRuYW1lcyB1c2VkIGZvciBpbmRleGluZ1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzWzBdICE9PSAnKicpIHtcbiAgICAgIHZhciBvaWRDaGVjayA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmllbGRzW2ldLm1hdGNoKC9eKE9CSkVDVElEfEZJRHxPSUR8SUQpJC9pKSkge1xuICAgICAgICAgIG9pZENoZWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9pZENoZWNrID09PSBmYWxzZSkge1xuICAgICAgICB3YXJuKCdubyBrbm93biBlc3JpRmllbGRUeXBlT0lEIGZpZWxkIGRldGVjdGVkIGluIGZpZWxkcyBBcnJheS4gIFBsZWFzZSBhZGQgYW4gYXR0cmlidXRlIGZpZWxkIGNvbnRhaW5pbmcgdW5pcXVlIElEcyB0byBlbnN1cmUgdGhlIGxheWVyIGNhbiBiZSBkcmF3biBjb3JyZWN0bHkuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQuc3RhcnQgJiYgdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGltZUluZGV4ID0gbmV3IEJpbmFyeVNlYXJjaEluZGV4KCk7XG4gICAgICB0aGlzLl9lbmRUaW1lSW5kZXggPSBuZXcgQmluYXJ5U2VhcmNoSW5kZXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX3RpbWVJbmRleCA9IG5ldyBCaW5hcnlTZWFyY2hJbmRleCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgdGhpcy5fY3VycmVudFNuYXBzaG90ID0gW107IC8vIGNhY2hlIG9mIHdoYXQgbGF5ZXJzIHNob3VsZCBiZSBhY3RpdmVcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVyciwgbWV0YWRhdGEpIHtcbiAgICAgIGlmICghZXJyKSB7XG4gICAgICAgIHZhciBzdXBwb3J0ZWRGb3JtYXRzID0gbWV0YWRhdGEuc3VwcG9ydGVkUXVlcnlGb3JtYXRzO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHNvbWVvbmUgaGFzIHJlcXVlc3RlZCB0aGF0IHdlIGRvbid0IHVzZSBnZW9KU09OLCBldmVuIGlmIGl0J3MgYXZhaWxhYmxlXG4gICAgICAgIHZhciBmb3JjZUpzb25Gb3JtYXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZS5vcHRpb25zLmlzTW9kZXJuID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvcmNlSnNvbkZvcm1hdCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmxlc3Mgd2UndmUgYmVlbiB0b2xkIG90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgc2VydmljZSBjYW4gZW1pdCBHZW9KU09OIG5hdGl2ZWx5XG4gICAgICAgIGlmICghZm9yY2VKc29uRm9ybWF0ICYmIHN1cHBvcnRlZEZvcm1hdHMgJiYgc3VwcG9ydGVkRm9ybWF0cy5pbmRleE9mKCdnZW9KU09OJykgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLm9wdGlvbnMuaXNNb2Rlcm4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGNvcHlyaWdodCB0ZXh0IGxpc3RlZCBpbiBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uICYmIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wgJiYgbWV0YWRhdGEuY29weXJpZ2h0VGV4dCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBtYXAub24oJ3pvb21lbmQnLCB0aGlzLl9oYW5kbGVab29tQ2hhbmdlLCB0aGlzKTtcblxuICAgIHJldHVybiBWaXJ0dWFsR3JpZC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX2hhbmRsZVpvb21DaGFuZ2UsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgZ2V0QXR0cmlidXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQ2VsbDogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgLy8gZG9udCBmZXRjaCBmZWF0dXJlcyBvdXRzaWRlIHRoZSBzY2FsZSByYW5nZSBkZWZpbmVkIGZvciB0aGUgbGF5ZXJcbiAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywgY29vcmRzKTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzKys7XG5cbiAgICAvLyBvdXIgZmlyc3QgYWN0aXZlIHJlcXVlc3QgZmlyZXMgbG9hZGluZ1xuICAgIGlmICh0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9PT0gMSkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkaW5nJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUXVlcnkoYm91bmRzKS5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlQ29sbGVjdGlvbiwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5leGNlZWRlZFRyYW5zZmVyTGltaXQpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkcmF3bGltaXRleGNlZWRlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBubyBlcnJvciwgZmVhdHVyZXNcbiAgICAgIGlmICghZXJyb3IgJiYgZmVhdHVyZUNvbGxlY3Rpb24gJiYgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHNjaGVkdWxlIGFkZGluZyBmZWF0dXJlcyB1bnRpbCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcbiAgICAgICAgVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKFV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMsIGNvb3Jkcyk7XG4gICAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgICB9LCB0aGlzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGVycm9yLCBubyBmZWF0dXJlc1xuICAgICAgaWYgKCFlcnJvciAmJiBmZWF0dXJlQ29sbGVjdGlvbiAmJiAhZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RQcm9jZXNzRmVhdHVyZXMoYm91bmRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfcG9zdFByb2Nlc3NGZWF0dXJlczogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIC8vIGRlaW5jcmVtZW50IHRoZSByZXF1ZXN0IGNvdW50ZXIgbm93IHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgZmVhdHVyZXNcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cy0tO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHJlcXVlc3RzIGZpcmUgYSBsb2FkIGV2ZW50IGZvciB0aGlzIHZpZXdcbiAgICBpZiAodGhpcy5fYWN0aXZlUmVxdWVzdHMgPD0gMCkge1xuICAgICAgdGhpcy5maXJlKCdsb2FkJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF9jYWNoZUtleTogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBjb29yZHMueiArICc6JyArIGNvb3Jkcy54ICsgJzonICsgY29vcmRzLnk7XG4gIH0sXG5cbiAgX2FkZEZlYXR1cmVzOiBmdW5jdGlvbiAoZmVhdHVyZXMsIGNvb3Jkcykge1xuICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgIHRoaXMuX2NhY2hlW2tleV0gPSB0aGlzLl9jYWNoZVtrZXldIHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBmZWF0dXJlc1tpXS5pZDtcblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKGlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNuYXBzaG90LnB1c2goaWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NhY2hlW2tleV0uaW5kZXhPZihpZCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlW2tleV0ucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmllbGQpIHtcbiAgICAgIHRoaXMuX2J1aWxkVGltZUluZGV4ZXMoZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlTGF5ZXJzKGZlYXR1cmVzKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuc2VydmljZS5xdWVyeSgpXG4gICAgICAuaW50ZXJzZWN0cyhib3VuZHMpXG4gICAgICAud2hlcmUodGhpcy5vcHRpb25zLndoZXJlKVxuICAgICAgLmZpZWxkcyh0aGlzLm9wdGlvbnMuZmllbGRzKVxuICAgICAgLnByZWNpc2lvbih0aGlzLm9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlGYWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNpbXBsaWZ5KHRoaXMuX21hcCwgdGhpcy5vcHRpb25zLnNpbXBsaWZ5RmFjdG9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWx0ZXJNb2RlID09PSAnc2VydmVyJyAmJiB0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHF1ZXJ5LmJldHdlZW4odGhpcy5vcHRpb25zLmZyb20sIHRoaXMub3B0aW9ucy50byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBXaGVyZSBNZXRob2RzXG4gICAqL1xuXG4gIHNldFdoZXJlOiBmdW5jdGlvbiAod2hlcmUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5vcHRpb25zLndoZXJlID0gKHdoZXJlICYmIHdoZXJlLmxlbmd0aCkgPyB3aGVyZSA6ICcxPTEnO1xuXG4gICAgdmFyIG9sZFNuYXBzaG90ID0gW107XG4gICAgdmFyIG5ld1NuYXBzaG90ID0gW107XG4gICAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IDA7XG4gICAgdmFyIHJlcXVlc3RFcnJvciA9IG51bGw7XG4gICAgdmFyIHJlcXVlc3RDYWxsYmFjayA9IFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVxdWVzdEVycm9yID0gZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBuZXdTbmFwc2hvdC5wdXNoKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90O1xuICAgICAgICAvLyBzY2hlZHVsZSBhZGRpbmcgZmVhdHVyZXMgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxheWVycyhvbGRTbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5hZGRMYXllcnMobmV3U25hcHNob3QpO1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXF1ZXN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgb2xkU25hcHNob3QucHVzaCh0aGlzLl9jdXJyZW50U25hcHNob3RbaV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICB2YXIgY29vcmRzID0gdGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSk7XG4gICAgICB2YXIgYm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0V2hlcmU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndoZXJlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaW1lIFJhbmdlIE1ldGhvZHNcbiAgICovXG5cbiAgZ2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wdGlvbnMuZnJvbSwgdGhpcy5vcHRpb25zLnRvXTtcbiAgfSxcblxuICBzZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmcm9tLCB0bywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgb2xkRnJvbSA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHZhciBvbGRUbyA9IHRoaXMub3B0aW9ucy50bztcbiAgICB2YXIgcGVuZGluZ1JlcXVlc3RzID0gMDtcbiAgICB2YXIgcmVxdWVzdEVycm9yID0gbnVsbDtcbiAgICB2YXIgcmVxdWVzdENhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsdGVyRXhpc3RpbmdGZWF0dXJlcyhvbGRGcm9tLCBvbGRUbywgZnJvbSwgdG8pO1xuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVxdWVzdEVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMub3B0aW9ucy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLm9wdGlvbnMudG8gPSB0bztcblxuICAgIHRoaXMuX2ZpbHRlckV4aXN0aW5nRmVhdHVyZXMob2xkRnJvbSwgb2xkVG8sIGZyb20sIHRvKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpbHRlck1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fYWN0aXZlQ2VsbHMpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KTtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2tleVRvQ2VsbENvb3JkcyhrZXkpO1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywga2V5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWRyYXcpIHtcbiAgICAgIHRoaXMub25jZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXcobGF5ZXIuZmVhdHVyZS5pZCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIF9maWx0ZXJFeGlzdGluZ0ZlYXR1cmVzOiBmdW5jdGlvbiAob2xkRnJvbSwgb2xkVG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIGxheWVyc1RvUmVtb3ZlID0gKG9sZEZyb20gJiYgb2xkVG8pID8gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShvbGRGcm9tLCBvbGRUbykgOiB0aGlzLl9jdXJyZW50U25hcHNob3Q7XG4gICAgdmFyIGxheWVyc1RvQWRkID0gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShuZXdGcm9tLCBuZXdUbyk7XG5cbiAgICBpZiAobGF5ZXJzVG9BZGQuaW5kZXhPZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlTGF5ZXIgPSBsYXllcnNUb1JlbW92ZS5pbmRleE9mKGxheWVyc1RvQWRkW2ldKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxheWVyID49IDApIHtcbiAgICAgICAgICBsYXllcnNUb1JlbW92ZS5zcGxpY2Uoc2hvdWxkUmVtb3ZlTGF5ZXIsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzVG9SZW1vdmUpO1xuICAgICAgdGhpcy5hZGRMYXllcnMobGF5ZXJzVG9BZGQpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBfZ2V0RmVhdHVyZXNJblRpbWVSYW5nZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaWRzID0gW107XG4gICAgdmFyIHNlYXJjaDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lcyA9IHRoaXMuX3N0YXJ0VGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgZW5kVGltZXMgPSB0aGlzLl9lbmRUaW1lSW5kZXguYmV0d2VlbihzdGFydCwgZW5kKTtcbiAgICAgIHNlYXJjaCA9IHN0YXJ0VGltZXMuY29uY2F0KGVuZFRpbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoID0gdGhpcy5fdGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWRzLnB1c2goc2VhcmNoW2ldLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9LFxuXG4gIF9idWlsZFRpbWVJbmRleGVzOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBpO1xuICAgIHZhciBmZWF0dXJlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lRW50cmllcyA9IFtdO1xuICAgICAgdmFyIGVuZFRpbWVFbnRyaWVzID0gW107XG4gICAgICBmb3IgKGkgPSBnZW9qc29uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZlYXR1cmUgPSBnZW9qc29uW2ldO1xuICAgICAgICBzdGFydFRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF0pXG4gICAgICAgIH0pO1xuICAgICAgICBlbmRUaW1lRW50cmllcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFRpbWVJbmRleC5idWxrQWRkKHN0YXJ0VGltZUVudHJpZXMpO1xuICAgICAgdGhpcy5fZW5kVGltZUluZGV4LmJ1bGtBZGQoZW5kVGltZUVudHJpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGltZUVudHJpZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IGdlb2pzb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZmVhdHVyZSA9IGdlb2pzb25baV07XG4gICAgICAgIHRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90aW1lSW5kZXguYnVsa0FkZCh0aW1lRW50cmllcyk7XG4gICAgfVxuICB9LFxuXG4gIF9mZWF0dXJlV2l0aGluVGltZVJhbmdlOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmZyb20gfHwgIXRoaXMub3B0aW9ucy50bykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSArdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpO1xuICAgIHZhciB0byA9ICt0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGltZUZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRhdGUgPSArZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGRdO1xuICAgICAgcmV0dXJuIChkYXRlID49IGZyb20pICYmIChkYXRlIDw9IHRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdmFyIHN0YXJ0RGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF07XG4gICAgICB2YXIgZW5kRGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmRdO1xuICAgICAgcmV0dXJuICgoc3RhcnREYXRlID49IGZyb20pICYmIChzdGFydERhdGUgPD0gdG8pKSB8fCAoKGVuZERhdGUgPj0gZnJvbSkgJiYgKGVuZERhdGUgPD0gdG8pKTtcbiAgICB9XG4gIH0sXG5cbiAgX3Zpc2libGVab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgbWFwIGlzIHdpdGhpbiB0aGUgb3B0aW9uYWwgbGltaXQgZGVmaW5lZCBmb3IgdGhlIEZlYXR1cmVMYXllclxuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gIH0sXG5cbiAgX2hhbmRsZVpvb21DaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3Zpc2libGVab29tKCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHRoaXMuX2N1cnJlbnRTbmFwc2hvdCk7XG4gICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgIGZvciBldmVyeSBjZWxsIGluIHRoaXMuX2FjdGl2ZUNlbGxzXG4gICAgICAgIDEuIEdldCB0aGUgY2FjaGUga2V5IGZvciB0aGUgY29vcmRzIG9mIHRoZSBjZWxsXG4gICAgICAgIDIuIElmIHRoaXMuX2NhY2hlW2tleV0gZXhpc3RzIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2YgZmVhdHVyZSBJRHMuXG4gICAgICAgIDMuIENhbGwgdGhpcy5hZGRMYXllcnModGhpcy5fY2FjaGVba2V5XSkgdG8gaW5zdHJ1Y3QgdGhlIGZlYXR1cmUgbGF5ZXIgdG8gYWRkIHRoZSBsYXllcnMgYmFjay5cbiAgICAgICovXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2FjdGl2ZUNlbGxzKSB7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9hY3RpdmVDZWxsc1tpXS5jb29yZHM7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVba2V5XSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKHRoaXMuX2NhY2hlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIE1ldGhvZHNcbiAgICovXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRoaXMuX21ldGFkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgdGhpcy5fbWV0YWRhdGEpO1xuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICBhZGRGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9nZXRNZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VydmljZS5hZGRGZWF0dXJlKGZlYXR1cmUsIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAvLyBhc3NpZ24gSUQgZnJvbSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgb2JqZWN0aWQgZmllbGQgZnJvbSBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW21ldGFkYXRhLm9iamVjdElkRmllbGRdID0gcmVzcG9uc2Uub2JqZWN0SWQ7XG5cbiAgICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBnZW9qc29uIGlkIGZvciBjcmVhdGVMYXllcnMoKSB0byBmdW5jdGlvblxuICAgICAgICAgIGZlYXR1cmUuaWQgPSByZXNwb25zZS5vYmplY3RJZDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVycyhbZmVhdHVyZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKSk7XG4gICAgfSwgdGhpcykpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGZWF0dXJlKGZlYXR1cmUsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW2ZlYXR1cmUuaWRdLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcnMoW2ZlYXR1cmVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZlYXR1cmUoaWQsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2Uub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW3Jlc3BvbnNlLm9iamVjdElkXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlRmVhdHVyZXMoaWRzLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVycm9yICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKFtyZXNwb25zZVtpXS5vYmplY3RJZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcbiIsImltcG9ydCB7IFV0aWwsIEdlb0pTT04sIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZXIgfSBmcm9tICcuL0ZlYXR1cmVNYW5hZ2VyJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXIgPSBGZWF0dXJlTWFuYWdlci5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBjYWNoZUxheWVyczogdHJ1ZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX29yaWdpbmFsU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKTtcbiAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IHdoZW4gdGhlIGVudGlyZSBmZWF0dXJlTGF5ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMuZmlyZSgncmVtb3ZlZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogdGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUsXG4gICAgICAgIHBlcm1hbmVudDogZmFsc2VcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIGNyZWF0ZU5ld0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBsYXllciA9IEdlb0pTT04uZ2VvbWV0cnlUb0xheWVyKGdlb2pzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgbGF5ZXIuZGVmYXVsdE9wdGlvbnMgPSBsYXllci5vcHRpb25zO1xuICAgIHJldHVybiBsYXllcjtcbiAgfSxcblxuICBfdXBkYXRlTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgZ2VvanNvbikge1xuICAgIC8vIGNvbnZlcnQgdGhlIGdlb2pzb24gY29vcmRpbmF0ZXMgaW50byBhIExlYWZsZXQgTGF0TG5nIGFycmF5L25lc3RlZCBhcnJheXNcbiAgICAvLyBwYXNzIGl0IHRvIHNldExhdExuZ3MgdG8gdXBkYXRlIGxheWVyIGdlb21ldHJpZXNcbiAgICB2YXIgbGF0bG5ncyA9IFtdO1xuICAgIHZhciBjb29yZHNUb0xhdExuZyA9IHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyB8fCBHZW9KU09OLmNvb3Jkc1RvTGF0TG5nO1xuXG4gICAgLy8gY29weSBuZXcgYXR0cmlidXRlcywgaWYgcHJlc2VudFxuICAgIGlmIChnZW9qc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllcyA9IGdlb2pzb24ucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdlb2pzb24uZ2VvbWV0cnkudHlwZSkge1xuICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcywgMCwgY29vcmRzVG9MYXRMbmcpO1xuICAgICAgICBsYXllci5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgbGF0bG5ncyA9IEdlb0pTT04uY29vcmRzVG9MYXRMbmdzKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIDIsIGNvb3Jkc1RvTGF0TG5nKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5ncyhsYXRsbmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgKi9cblxuICBjcmVhdGVMYXllcnM6IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGdlb2pzb24gPSBmZWF0dXJlc1tpXTtcblxuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuICAgICAgdmFyIG5ld0xheWVyO1xuXG4gICAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSAmJiBsYXllciAmJiAhdGhpcy5fbWFwLmhhc0xheWVyKGxheWVyKSkge1xuICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobGF5ZXIpO1xuICAgICAgICB0aGlzLmZpcmUoJ2FkZGZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKGxheWVyICYmIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3RvciA+IDAgJiYgKGxheWVyLnNldExhdExuZ3MgfHwgbGF5ZXIuc2V0TGF0TG5nKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllciwgZ2VvanNvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgbmV3TGF5ZXIgPSB0aGlzLmNyZWF0ZU5ld0xheWVyKGdlb2pzb24pO1xuICAgICAgICBuZXdMYXllci5mZWF0dXJlID0gZ2VvanNvbjtcblxuICAgICAgICAvLyBidWJibGUgZXZlbnRzIGZyb20gaW5kaXZpZHVhbCBsYXllcnMgdG8gdGhlIGZlYXR1cmUgbGF5ZXJcbiAgICAgICAgbmV3TGF5ZXIuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9uRWFjaEZlYXR1cmUobmV3TGF5ZXIuZmVhdHVyZSwgbmV3TGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgdGhlIGxheWVyXG4gICAgICAgIHRoaXMuX2xheWVyc1tuZXdMYXllci5mZWF0dXJlLmlkXSA9IG5ld0xheWVyO1xuXG4gICAgICAgIC8vIHN0eWxlIHRoZSBsYXllclxuICAgICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBpbnNpZGUgdGhlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllciwgaXQgaXMgd2l0aGluIHRoZSBjdXJyZW50IHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpICYmICghdGhpcy5vcHRpb25zLnRpbWVGaWVsZCB8fCAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCAmJiB0aGlzLl9mZWF0dXJlV2l0aGluVGltZVJhbmdlKGdlb2pzb24pKSkpIHtcbiAgICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFkZExheWVyczogZnVuY3Rpb24gKGlkcykge1xuICAgIGZvciAodmFyIGkgPSBpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZHNbaV1dO1xuICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgIHRoaXMuX21hcC5hZGRMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIGlmIChsYXllcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZWZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZSxcbiAgICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciAmJiBwZXJtYW5lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNlbGxFbnRlcjogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGVab29tKCkgJiYgIXRoaXMuX3pvb21pbmcgJiYgdGhpcy5fbWFwKSB7XG4gICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGNlbGxLZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGxheWVycyA9IHRoaXMuX2NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY2VsbExlYXZlOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICBpZiAoIXRoaXMuX3pvb21pbmcpIHtcbiAgICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgICB2YXIgY2VsbEtleSA9IHRoaXMuX2NlbGxDb29yZHNUb0tleShjb29yZHMpO1xuICAgICAgICAgIHZhciBsYXllcnMgPSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgICAgdmFyIHJlbW92YWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcnNbaV1dO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuZ2V0Qm91bmRzICYmIG1hcEJvdW5kcy5pbnRlcnNlY3RzKGxheWVyLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW1vdmFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzLCAhdGhpcy5vcHRpb25zLmNhY2hlTGF5ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FjaGVMYXllcnMgJiYgcmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jZWxsc1tjZWxsS2V5XTtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3R5bGluZyBNZXRob2RzXG4gICAqL1xuXG4gIHJlc2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSB0aGlzLl9vcmlnaW5hbFN0eWxlO1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICB0aGlzLnJlc2V0RmVhdHVyZVN0eWxlKGxheWVyLmZlYXR1cmUuaWQpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuX29yaWdpbmFsU3R5bGUgfHwgTC5QYXRoLnByb3RvdHlwZS5vcHRpb25zO1xuICAgIGlmIChsYXllcikge1xuICAgICAgVXRpbC5leHRlbmQobGF5ZXIub3B0aW9ucywgbGF5ZXIuZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUoaWQsIHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQsIHN0eWxlKSB7XG4gICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoQWN0aXZlRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgLy8gZmlndXJlIG91dCAocm91Z2hseSkgd2hpY2ggbGF5ZXJzIGFyZSBpbiB2aWV3XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdmFyIGFjdGl2ZUJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgIGlmIChhY3RpdmVCb3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9sYXllcnNbaV0uZ2V0Qm91bmRzKCkpICYmIHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5pbmRleE9mKHRoaXMuX2xheWVyc1tpXS5mZWF0dXJlLmlkKSAhPT0gLTEpIHtcbiAgICAgICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZWFjaEZlYXR1cmU6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBmbi5jYWxsKGNvbnRleHQsIHRoaXMuX2xheWVyc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEZlYXR1cmU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiB0aGlzLl9sYXllcnNbaWRdO1xuICB9LFxuXG4gIGJyaW5nVG9CYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgIGlmIChsYXllci5icmluZ1RvQmFjaykge1xuICAgICAgICBsYXllci5icmluZ1RvQmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGJyaW5nVG9Gcm9udDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICBpZiAobGF5ZXIuYnJpbmdUb0Zyb250KSB7XG4gICAgICAgIGxheWVyLmJyaW5nVG9Gcm9udCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHJlZHJhdzogZnVuY3Rpb24gKGlkKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLl9yZWRyYXcoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBfcmVkcmF3OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBnZW9qc29uID0gbGF5ZXIuZmVhdHVyZTtcblxuICAgIC8vIGlmIHRoaXMgbG9va3MgbGlrZSBhIG1hcmtlclxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRJY29uICYmIHRoaXMub3B0aW9ucy5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHVwZGF0ZSBjdXN0b20gc3ltYm9sb2d5LCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKSB7XG4gICAgICAgIHZhciBnZXRJY29uID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgICB2YXIgdXBkYXRlZEljb24gPSBnZXRJY29uLm9wdGlvbnMuaWNvbjtcbiAgICAgICAgbGF5ZXIuc2V0SWNvbih1cGRhdGVkSWNvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9va3MgbGlrZSBhIHZlY3RvciBtYXJrZXIgKGNpcmNsZU1hcmtlcilcbiAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuc2V0U3R5bGUgJiYgdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcikge1xuICAgICAgdmFyIGdldFN0eWxlID0gdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcihnZW9qc29uLCBsYXRMbmcoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkpO1xuICAgICAgdmFyIHVwZGF0ZWRTdHlsZSA9IGdldFN0eWxlLm9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShnZW9qc29uLmlkLCB1cGRhdGVkU3R5bGUpO1xuICAgIH1cblxuICAgIC8vIGxvb2tzIGxpa2UgYSBwYXRoIChwb2x5Z29uL3BvbHlsaW5lKVxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRTdHlsZSAmJiB0aGlzLm9wdGlvbnMuc3R5bGUpIHtcbiAgICAgIHRoaXMucmVzZXRTdHlsZShnZW9qc29uLmlkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiVXRpbCIsIkRvbVV0aWwiLCJzaGFsbG93Q2xvbmUiLCJhcmNnaXNUb0dlb0pTT04iLCJnZW9qc29uVG9BcmNHSVMiLCJnMmEiLCJhMmciLCJsYXRMbmciLCJsYXRMbmdCb3VuZHMiLCJDbGFzcyIsInBvaW50IiwiTGF0TG5nQm91bmRzIiwiTGF0TG5nIiwiR2VvSlNPTiIsIkV2ZW50ZWQiLCJUaWxlTGF5ZXIiLCJJbWFnZU92ZXJsYXkiLCJDUlMiLCJMYXllciIsInBvcHVwIiwiTCIsInNldE9wdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NBTyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBTyxJQUFJLGFBQWEsR0FB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QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsQ0FBQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFakYsQ0FBQSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNoQixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7QUFFdEIsQ0FBQSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNsRCxDQUFBLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUEsQ0FBQzs7QUFFRCxDQUFBO0FBQ0EsQ0FBQSxTQUFTLG9CQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxDQUFBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLENBQUEsTUFBTSxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbEUsQ0FBQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFBLENBQUM7O0FBRUQsQ0FBQTtBQUNBLENBQUEsU0FBUyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO0FBQ3RELENBQUEsRUFBRSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDdkIsQ0FBQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEUsQ0FBQSxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFBLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0osQ0FBQSxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUMzQixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7QUFDSCxDQUFBLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQSxDQUFDOztBQUVE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RTtBQUN4QyxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQ3ZCLENBQUEsTUFBTSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0UsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQy9ELENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0FBRWxILENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUM3RSxDQUFBLE1BQU0sT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0IsQ0FBQSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQSxDQUFDOztDQzVETSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQy9CLENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksUUFBUSxFQUFFLGNBQWM7QUFDNUIsQ0FBQSxJQUFJLE9BQU8sRUFBRSxtQkFBbUI7QUFDaEMsQ0FBQSxJQUFJLFFBQVEsRUFBRSxXQUFXO0FBQ3pCLENBQUEsSUFBSSxXQUFXLEVBQUUsbUJBQW1CO0FBQ3BDLENBQUEsSUFBSSxZQUFZLEVBQUUsV0FBVztBQUM3QixDQUFBLElBQUksZ0JBQWdCLEVBQUUsZ0JBQWdCO0FBQ3RDLENBQUEsSUFBSSxPQUFPLEVBQUUsT0FBTztBQUNwQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLElBQUksRUFBRSxPQUFPOztBQUVmLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksY0FBYyxFQUFFLElBQUk7QUFDeEIsQ0FBQSxJQUFJLEtBQUssRUFBRSxLQUFLO0FBQ2hCLENBQUEsSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUNmLENBQUEsSUFBSSxTQUFTLEVBQUUsR0FBRztBQUNsQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxNQUFNLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDOUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDO0FBQ3RELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBQ3hELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHNCQUFzQixDQUFDO0FBQ3BELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUEsRUFBRSxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxN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QUFDOztBQUVqRSxDQUFBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztBQUVwRSxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUc7QUFDakIsQ0FBQSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUEsTUFBTSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07QUFDakMsQ0FBQSxNQUFNLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7QUFDM0MsQ0FBQSxNQUFNLE1BQU0sRUFBRSxFQUFFO0FBQ2hCLENBQUEsTUFBTSxPQUFPLEVBQUUsRUFBRTtBQUNqQixDQUFBLEtBQUssQ0FBQzs7QUFFTixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUM5QyxDQUFBLE1BQU0sTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDbEYsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO0FBQ2hDLENBQUEsTUFBTSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2hELENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtBQUNwQyxDQUFBLE1BQU0sTUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN4RCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtBQUN6QyxDQUFBLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDbEUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO0FBQzlCLENBQUEsTUFBTSxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzVDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUM3QixDQUFBLE1BQU0sTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUMxQyxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtBQUMzQyxDQUFBLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7QUFDdEUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUNwQyxDQUFBLE1BQU0sTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDaEQsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO0FBQ3BDLENBQUEsTUFBTSxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN4RSxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7QUFDakMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xFLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxjQUFjLEVBQUUsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQzVDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtBQUNuQyxDQUFBLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDN0UsQ0FBQSxRQUFRLElBQUksS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzlCLENBQUEsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ2hDLENBQUEsVUFBVSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxDQUFBLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNmLENBQUEsS0FBSyxNQUFNO0FBQ1gsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3pCLENBQUEsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLGFBQWEsR0FBR0EsUUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRyxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQU8sU0FBUyxhQUFhLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRTtBQUM3QyxDQUFBLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQSxDQUFDOztDQzNNTSxJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDOztBQUVoRCxDQUFBLEVBQUUsT0FBTyxFQUFFO0FBQ1gsQ0FBQSxJQUFJLGNBQWMsRUFBRSxHQUFHO0FBQ3ZCLENBQUEsSUFBSSxNQUFNLEVBQUUsS0FBSztBQUNqQixDQUFBLElBQUksU0FBUyxFQUFFLEtBQUs7QUFDcEIsQ0FBQSxJQUFJLFdBQVcsRUFBRSxLQUFLO0FBQ3RCLENBQUEsSUFBSSxNQUFNLEVBQUUsT0FBTztBQUNuQixDQUFBLElBQUksV0FBVyxFQUFFLElBQUk7QUFDckIsQ0FBQSxJQUFJLENBQUMsRUFBRSxNQUFNO0FBQ2IsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxPQUFPLEVBQUU7QUFDakMsQ0FBQSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUV0QyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFO0FBQ2xFLENBQUEsTUFBTSxPQUFPLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN6QixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJQSxRQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuQyxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGdCQUFnQixFQUFFLFlBQVk7QUFDaEMsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEMsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLGFBQWEsRUFBRTtBQUM3QyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQy9DLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDbkIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsU0FBUyxFQUFFLFlBQVk7QUFDekIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDL0IsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxTQUFTLEVBQUUsVUFBVSxNQUFNLEVBQUU7QUFDL0IsQ0FBQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNqQyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25CLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFlBQVksRUFBRSxZQUFZO0FBQzVCLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsWUFBWSxFQUFFLFVBQVUsU0FBUyxFQUFFO0FBQ3JDLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDdkMsQ0FBQSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuQixDQUFBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxjQUFjLEVBQUUsWUFBWTtBQUM5QixDQUFBLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQyxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLGNBQWMsRUFBRSxVQUFVLFdBQVcsRUFBRTtBQUN6QyxDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQzNDLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDbkIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsS0FBSyxFQUFFLFlBQVk7QUFDckIsQ0FBQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQyxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFFBQVEsRUFBRSxZQUFZO0FBQ3hCLENBQUEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDbkMsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxJQUFJLEVBQUUsWUFBWTtBQUNwQixDQUFBLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0FBQzlCLENBQUEsSUFBSSxJQUFJLFFBQVEsR0FBR0EsUUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUU7QUFDM0UsQ0FBQSxNQUFNLElBQUksS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzVCLENBQUEsTUFBTSxVQUFVLENBQUNBLFFBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtBQUN2QyxDQUFBLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4RSxDQUFBLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFBLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzs7QUFFYixDQUFBLElBQUksSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFckUsQ0FBQTtBQUNBLENBQUEsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBRTdDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQzdCLENBQUEsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFbEMsQ0FBQTtBQUNBLENBQUEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ25DLENBQUEsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDL0IsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxrQkFBa0IsRUFBRSxZQUFZO0FBQ2xDLENBQUEsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3ZDLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25DLENBQUEsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUEsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUEsSUFBSSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7O0FBRXBFLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUQsQ0FBQSxJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqRSxDQUFBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEMsQ0FBQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxNQUFNLEdBQUc7QUFDakIsQ0FBQSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUEsTUFBTSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQSxNQUFNLEdBQUcsRUFBRSxFQUFFO0FBQ2IsQ0FBQSxNQUFNLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07QUFDakMsQ0FBQSxNQUFNLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7QUFDM0MsQ0FBQSxNQUFNLE1BQU0sRUFBRSxFQUFFO0FBQ2hCLENBQUEsTUFBTSxPQUFPLEVBQUUsRUFBRTtBQUNqQixDQUFBLEtBQUssQ0FBQzs7QUFFTixDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtBQUNwQyxDQUFBLE1BQU0sTUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN4RCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDN0IsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFDaEMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3RJLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtBQUNsQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO0FBQzlDLENBQUEsTUFBTSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNsRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3BDLENBQUEsTUFBTSxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNoRCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDNUIsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FB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QSxHQUFHOztBQUVILENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUU7QUFDL0UsQ0FBQSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2YsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ2pHLENBQUEsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUNmLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQSxDQUFDLENBQUM7O0FBRUYsQ0FBQSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM1RCxDQUFBLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUEsRUFBRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUEsQ0FBQyxDQUFDOztBQUVGLENBQUEsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3JFLENBQUEsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FB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QUFTLENBQUMsQ0FBQztBQUM3RCxDQUFBLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1QyxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUNwRSxDQUFBLE1BQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLENBQUEsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEUsQ0FBQSxNQUFNLE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFlBQVksRUFBRSxZQUFZO0FBQzVCLENBQUE7QUFDQSxDQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEIsQ0FBQSxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLENBQUEsS0FBSztBQUNMLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25DLENBQUEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFP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 diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-cluster-2.0.0.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,185 @@ +/* esri-leaflet-cluster - v2.0.0 - Thu Aug 18 2016 17:12:43 GMT-0700 (PDT) + * Copyright (c) 2016 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Cluster = global.L.esri.Cluster || {}),global.L,global.L.esri)); +}(this, function (exports,L,esriLeaflet) { 'use strict'; + + L = 'default' in L ? L['default'] : L; + + var version = "2.0.0"; + + var FeatureLayer = esriLeaflet.FeatureManager.extend({ + + statics: { + EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose', + CLUSTEREVENTS: 'clusterclick clusterdblclick clustermouseover clustermouseout clustermousemove clustercontextmenu' + }, + + /** + * Constructor + */ + + initialize: function (options) { + esriLeaflet.FeatureManager.prototype.initialize.call(this, options); + + options = L.setOptions(this, options); + + this._layers = {}; + this._leafletIds = {}; + + this.cluster = L.markerClusterGroup(options); + this._key = 'c' + (Math.random() * 1e9).toString(36).replace('.', '_'); + + this.cluster.addEventParent(this); + }, + + /** + * Layer Interface + */ + + onAdd: function (map) { + esriLeaflet.FeatureManager.prototype.onAdd.call(this, map); + this._map.addLayer(this.cluster); + }, + + onRemove: function (map) { + esriLeaflet.FeatureManager.prototype.onRemove.call(this, map); + this._map.removeLayer(this.cluster); + }, + + /** + * Feature Management Methods + */ + + createLayers: function (features) { + var markers = []; + + for (var i = features.length - 1; i >= 0; i--) { + var geojson = features[i]; + var layer = this._layers[geojson.id]; + + if (!layer) { + var newLayer = L.GeoJSON.geometryToLayer(geojson, this.options); + newLayer.feature = L.GeoJSON.asFeature(geojson); + newLayer.defaultOptions = newLayer.options; + newLayer._leaflet_id = this._key + '_' + geojson.id; + + this.resetStyle(newLayer.feature.id); + + // cache the layer + this._layers[newLayer.feature.id] = newLayer; + + this._leafletIds[newLayer._leaflet_id] = geojson.id; + + if (this.options.onEachFeature) { + this.options.onEachFeature(newLayer.feature, newLayer); + } + + this.fire('createfeature', { + feature: newLayer.feature + }); + + // add the layer if it is within the time bounds or our layer is not time enabled + if (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson))) { + markers.push(newLayer); + } + } + } + + if (markers.length) { + this.cluster.addLayers(markers); + } + }, + + addLayers: function (ids) { + var layersToAdd = []; + for (var i = ids.length - 1; i >= 0; i--) { + var layer = this._layers[ids[i]]; + this.fire('addfeature', { + feature: layer.feature + }); + layersToAdd.push(layer); + } + this.cluster.addLayers(layersToAdd); + }, + + removeLayers: function (ids, permanent) { + var layersToRemove = []; + for (var i = ids.length - 1; i >= 0; i--) { + var id = ids[i]; + var layer = this._layers[id]; + this.fire('removefeature', { + feature: layer.feature, + permanent: permanent + }); + layersToRemove.push(layer); + if (this._layers[id] && permanent) { + delete this._layers[id]; + } + } + this.cluster.removeLayers(layersToRemove); + }, + + /** + * Styling Methods + */ + + resetStyle: function (id) { + var layer = this._layers[id]; + + if (layer) { + layer.options = layer.defaultOptions; + this.setFeatureStyle(layer.feature.id, this.options.style); + } + + return this; + }, + + setStyle: function (style) { + this.eachFeature(function (layer) { + this.setFeatureStyle(layer.feature.id, style); + }, this); + return this; + }, + + setFeatureStyle: function (id, style) { + var layer = this._layers[id]; + + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + }, + + /** + * Utility Methods + */ + + eachFeature: function (fn, context) { + for (var i in this._layers) { + fn.call(context, this._layers[i]); + } + return this; + }, + + getFeature: function (id) { + return this._layers[id]; + } + }); + + function featureLayer (options) { + return new FeatureLayer(options); + } + + exports.FeatureLayer = FeatureLayer; + exports.featureLayer = featureLayer; + exports['default'] = featureLayer; + exports.VERSION = version; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWNsdXN0ZXItZGVidWcuanMiLCJzb3VyY2VzIjpbIi4uL3BhY2thZ2UuanNvbiIsIi4uL3NyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRXNyaSBMZWFmbGV0IHBsdWdpbiBmb3IgdmlzdWFsaXppbmcgRmVhdHVyZSBMYXllcnMgYXMgY2x1c3RlcnMgd2l0aCBMLm1hcmtlcmNsdXN0ZXIuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wLXJjLjNcIixcbiAgICBcImxlYWZsZXQubWFya2VyY2x1c3RlclwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuZ2l0I3YxLjAuMC1yYy4xXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaXNwYXJ0YVwiOiBcIl4zLjAuM1wiLFxuICAgIFwiaXN0YW5idWxcIjogXCJeMC40LjJcIixcbiAgICBcImthcm1hXCI6IFwiXjAuMTIuMjRcIixcbiAgICBcImthcm1hLWNoYWktc2lub25cIjogXCJeMC4xLjNcIixcbiAgICBcImthcm1hLWNvdmVyYWdlXCI6IFwiXjAuNS4zXCIsXG4gICAgXCJrYXJtYS1tb2NoYVwiOiBcIl4wLjEuMFwiLFxuICAgIFwia2FybWEtbW9jaGEtcmVwb3J0ZXJcIjogXCJeMC4yLjVcIixcbiAgICBcImthcm1hLXBoYW50b21qcy1sYXVuY2hlclwiOiBcIl4wLjEuNFwiLFxuICAgIFwia2FybWEtc291cmNlbWFwLWxvYWRlclwiOiBcIl4wLjMuNVwiLFxuICAgIFwibWtkaXJwXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjRcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcIndhdGNoXCI6IFwiXjAuMTcuMVwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3RlclwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0NsdXN0ZXJlZEZlYXR1cmVMYXllci5qc1wiLFxuICBcImpzcG1cIjoge1xuICAgIFwicmVnaXN0cnlcIjogXCJucG1cIixcbiAgICBcImZvcm1hdFwiOiBcImVzNlwiLFxuICAgIFwibWFpblwiOiBcInNyYy9DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuanNcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImFyY2dpc1wiLFxuICAgIFwiZXNyaVwiLFxuICAgIFwiZXNyaSBsZWFmbGV0XCIsXG4gICAgXCJnaXNcIixcbiAgICBcImxlYWZsZXQgcGx1Z2luXCIsXG4gICAgXCJtYXBwaW5nXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1jbHVzdGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQtY2x1c3Rlci5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1wiLFxuICAgIFwidGVzdFwiOiBcIm5wbSBydW4gbGludCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn0iLCJleHBvcnQge3ZlcnNpb24gYXMgVkVSU0lPTn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBGZWF0dXJlTWFuYWdlciB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZUxheWVyID0gRmVhdHVyZU1hbmFnZXIuZXh0ZW5kKHtcblxuICBzdGF0aWNzOiB7XG4gICAgRVZFTlRTOiAnY2xpY2sgZGJsY2xpY2sgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBwb3B1cG9wZW4gcG9wdXBjbG9zZScsXG4gICAgQ0xVU1RFUkVWRU5UUzogJ2NsdXN0ZXJjbGljayBjbHVzdGVyZGJsY2xpY2sgY2x1c3Rlcm1vdXNlb3ZlciBjbHVzdGVybW91c2VvdXQgY2x1c3Rlcm1vdXNlbW92ZSBjbHVzdGVyY29udGV4dG1lbnUnXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICB0aGlzLl9sZWFmbGV0SWRzID0ge307XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBMLm1hcmtlckNsdXN0ZXJHcm91cChvcHRpb25zKTtcbiAgICB0aGlzLl9rZXkgPSAnYycgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoJy4nLCAnXycpO1xuXG4gICAgdGhpcy5jbHVzdGVyLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXllciBJbnRlcmZhY2VcbiAgICovXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApO1xuICAgIHRoaXMuX21hcC5hZGRMYXllcih0aGlzLmNsdXN0ZXIpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcbiAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKTtcbiAgfSxcblxuICAvKipcbiAgICogRmVhdHVyZSBNYW5hZ2VtZW50IE1ldGhvZHNcbiAgICovXG5cbiAgY3JlYXRlTGF5ZXJzOiBmdW5jdGlvbiAoZmVhdHVyZXMpIHtcbiAgICB2YXIgbWFya2VycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IGZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZ2VvanNvbiA9IGZlYXR1cmVzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHZhciBuZXdMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgbmV3TGF5ZXIuZmVhdHVyZSA9IEwuR2VvSlNPTi5hc0ZlYXR1cmUoZ2VvanNvbik7XG4gICAgICAgIG5ld0xheWVyLmRlZmF1bHRPcHRpb25zID0gbmV3TGF5ZXIub3B0aW9ucztcbiAgICAgICAgbmV3TGF5ZXIuX2xlYWZsZXRfaWQgPSB0aGlzLl9rZXkgKyAnXycgKyBnZW9qc29uLmlkO1xuXG4gICAgICAgIHRoaXMucmVzZXRTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkKTtcblxuICAgICAgICAvLyBjYWNoZSB0aGUgbGF5ZXJcbiAgICAgICAgdGhpcy5fbGF5ZXJzW25ld0xheWVyLmZlYXR1cmUuaWRdID0gbmV3TGF5ZXI7XG5cbiAgICAgICAgdGhpcy5fbGVhZmxldElkc1tuZXdMYXllci5fbGVhZmxldF9pZF0gPSBnZW9qc29uLmlkO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FYWNoRmVhdHVyZSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKG5ld0xheWVyLmZlYXR1cmUsIG5ld0xheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgaXQgaXMgd2l0aGluIHRoZSB0aW1lIGJvdW5kcyBvciBvdXIgbGF5ZXIgaXMgbm90IHRpbWUgZW5hYmxlZFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50aW1lRmllbGQgfHwgKHRoaXMub3B0aW9ucy50aW1lRmllbGQgJiYgdGhpcy5fZmVhdHVyZVdpdGhpblRpbWVSYW5nZShnZW9qc29uKSkpIHtcbiAgICAgICAgICBtYXJrZXJzLnB1c2gobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNsdXN0ZXIuYWRkTGF5ZXJzKG1hcmtlcnMpO1xuICAgIH1cbiAgfSxcblxuICBhZGRMYXllcnM6IGZ1bmN0aW9uIChpZHMpIHtcbiAgICB2YXIgbGF5ZXJzVG9BZGQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRzW2ldXTtcbiAgICAgIHRoaXMuZmlyZSgnYWRkZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb0FkZC5wdXNoKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLmFkZExheWVycyhsYXllcnNUb0FkZCk7XG4gIH0sXG5cbiAgcmVtb3ZlTGF5ZXJzOiBmdW5jdGlvbiAoaWRzLCBwZXJtYW5lbnQpIHtcbiAgICB2YXIgbGF5ZXJzVG9SZW1vdmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgdGhpcy5maXJlKCdyZW1vdmVmZWF0dXJlJywge1xuICAgICAgICBmZWF0dXJlOiBsYXllci5mZWF0dXJlLFxuICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgfSk7XG4gICAgICBsYXllcnNUb1JlbW92ZS5wdXNoKGxheWVyKTtcbiAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdICYmIHBlcm1hbmVudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbHVzdGVyLnJlbW92ZUxheWVycyhsYXllcnNUb1JlbW92ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN0eWxpbmcgTWV0aG9kc1xuICAgKi9cblxuICByZXNldFN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuXG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBsYXllci5vcHRpb25zID0gbGF5ZXIuZGVmYXVsdE9wdGlvbnM7XG4gICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShsYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldEZlYXR1cmVTdHlsZTogZnVuY3Rpb24gKGlkLCBzdHlsZSkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlKGxheWVyLmZlYXR1cmUpO1xuICAgIH1cbiAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHtcbiAgICAgIGxheWVyLnNldFN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgTWV0aG9kc1xuICAgKi9cblxuICBlYWNoRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgIGZuLmNhbGwoY29udGV4dCwgdGhpcy5fbGF5ZXJzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0RmVhdHVyZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUxheWVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlTGF5ZXI7XG4iXSwibmFtZXMiOlsiRmVhdHVyZU1hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NLTyxJQUFJLFlBQVksR0FBR0EsMEJBQWMsQ0FBQyxNQUFNLENBQUM7O0FBRWhELENBQUEsRUFBRSxPQUFPLEVBQUU7QUFDWCxDQUFBLElBQUksTUFBTSxFQUFFLDhFQUE4RTtBQUMxRixDQUFBLElBQUksYUFBYSxFQUFFLG1HQUFtRztBQUN0SCxDQUFBLEdBQUc7O0FBRUgsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBOztBQUVBLENBQUEsRUFBRSxVQUFV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 \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-geocoder-2.2.4.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1194 @@ +/* esri-leaflet-geocoder - v2.2.4 - Wed Mar 22 2017 15:48:59 GMT-0700 (PDT) + * Copyright (c) 2017 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Geocoding = global.L.esri.Geocoding || {}),global.L,global.L.esri)); +}(this, function (exports,L,esriLeaflet) { 'use strict'; + + L = 'default' in L ? L['default'] : L; + + var version = "2.2.4"; + + var Geocode = esriLeaflet.Task.extend({ + path: 'findAddressCandidates', + + params: { + outSr: 4326, + forStorage: false, + outFields: '*', + maxLocations: 20 + }, + + setters: { + 'address': 'address', + 'neighborhood': 'neighborhood', + 'city': 'city', + 'subregion': 'subregion', + 'region': 'region', + 'postal': 'postal', + 'country': 'country', + 'text': 'singleLine', + 'category': 'category', + 'token': 'token', + 'key': 'magicKey', + 'fields': 'outFields', + 'forStorage': 'forStorage', + 'maxLocations': 'maxLocations' + }, + + initialize: function (options) { + options = options || {}; + options.url = options.url || WorldGeocodingServiceUrl; + esriLeaflet.Task.prototype.initialize.call(this, options); + }, + + within: function (bounds) { + bounds = L.latLngBounds(bounds); + this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds); + return this; + }, + + nearby: function (latlng, radius) { + latlng = L.latLng(latlng); + this.params.location = latlng.lng + ',' + latlng.lat; + this.params.distance = Math.min(Math.max(radius, 2000), 50000); + return this; + }, + + run: function (callback, context) { + if (this.options.customParam) { + this.params[this.options.customParam] = this.params.singleLine; + delete this.params.singleLine; + } + + return this.request(function (error, response) { + var processor = this._processGeocoderResponse; + var results = (!error) ? processor(response) : undefined; + callback.call(context, error, { results: results }, response); + }, this); + }, + + _processGeocoderResponse: function (response) { + var results = []; + + for (var i = 0; i < response.candidates.length; i++) { + var candidate = response.candidates[i]; + if (candidate.extent) { + var bounds = esriLeaflet.Util.extentToBounds(candidate.extent); + } + + results.push({ + text: candidate.address, + bounds: bounds, + score: candidate.score, + latlng: L.latLng(candidate.location.y, candidate.location.x), + properties: candidate.attributes + }); + } + return results; + } + }); + + function geocode (options) { + return new Geocode(options); + } + + var ReverseGeocode = esriLeaflet.Task.extend({ + path: 'reverseGeocode', + + params: { + outSR: 4326, + returnIntersection: false + }, + + setters: { + 'distance': 'distance', + 'language': 'langCode', + 'intersection': 'returnIntersection' + }, + + initialize: function (options) { + options = options || {}; + options.url = options.url || WorldGeocodingServiceUrl; + esriLeaflet.Task.prototype.initialize.call(this, options); + }, + + latlng: function (latlng) { + latlng = L.latLng(latlng); + this.params.location = latlng.lng + ',' + latlng.lat; + return this; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + var result; + + if (!error) { + result = { + latlng: L.latLng(response.location.y, response.location.x), + address: response.address + }; + } else { + result = undefined; + } + + callback.call(context, error, result, response); + }, this); + } + }); + + function reverseGeocode (options) { + return new ReverseGeocode(options); + } + + var Suggest = esriLeaflet.Task.extend({ + path: 'suggest', + + params: {}, + + setters: { + text: 'text', + category: 'category', + countries: 'countryCode', + maxSuggestions: 'maxSuggestions' + }, + + initialize: function (options) { + options = options || {}; + if (!options.url) { + options.url = WorldGeocodingServiceUrl; + options.supportsSuggest = true; + } + esriLeaflet.Task.prototype.initialize.call(this, options); + }, + + within: function (bounds) { + bounds = L.latLngBounds(bounds); + bounds = bounds.pad(0.5); + var center = bounds.getCenter(); + var ne = bounds.getNorthWest(); + this.params.location = center.lng + ',' + center.lat; + this.params.distance = Math.min(Math.max(center.distanceTo(ne), 2000), 50000); + this.params.searchExtent = esriLeaflet.Util.boundsToExtent(bounds); + return this; + }, + + nearby: function (latlng, radius) { + latlng = L.latLng(latlng); + this.params.location = latlng.lng + ',' + latlng.lat; + this.params.distance = Math.min(Math.max(radius, 2000), 50000); + return this; + }, + + run: function (callback, context) { + if (this.options.supportsSuggest) { + return this.request(function (error, response) { + callback.call(context, error, response, response); + }, this); + } else { + console.warn('this geocoding service does not support asking for suggestions'); + } + } + + }); + + function suggest (options) { + return new Suggest(options); + } + + var GeocodeService = esriLeaflet.Service.extend({ + initialize: function (options) { + options = options || {}; + if (options.url) { + esriLeaflet.Service.prototype.initialize.call(this, options); + this._confirmSuggestSupport(); + } else { + options.url = WorldGeocodingServiceUrl; + options.supportsSuggest = true; + esriLeaflet.Service.prototype.initialize.call(this, options); + } + }, + + geocode: function () { + return geocode(this); + }, + + reverse: function () { + return reverseGeocode(this); + }, + + suggest: function () { + // requires either the Esri World Geocoding Service or a <10.3 ArcGIS Server Geocoding Service that supports suggest. + return suggest(this); + }, + + _confirmSuggestSupport: function () { + this.metadata(function (error, response) { + if (error) { return; } + // pre 10.3 geocoding services dont list capabilities (and dont support maxLocations) + // only SOME individual services have been configured to support asking for suggestions + if (!response.capabilities) { + this.options.supportsSuggest = false; + this.options.customParam = response.singleLineAddressField.name; + } else if (response.capabilities.indexOf('Suggest') > -1) { + this.options.supportsSuggest = true; + } else { + this.options.supportsSuggest = false; + } + }, this); + } + }); + + function geocodeService (options) { + return new GeocodeService(options); + } + + var GeosearchCore = L.Evented.extend({ + + options: { + zoomToResult: true, + useMapBounds: 12, + searchBounds: null + }, + + initialize: function (control, options) { + L.Util.setOptions(this, options); + this._control = control; + + if (!options || !options.providers || !options.providers.length) { + throw new Error('You must specify at least one provider'); + } + + this._providers = options.providers; + }, + + _geocode: function (text, key, provider) { + var activeRequests = 0; + var allResults = []; + var bounds; + + var callback = L.Util.bind(function (error, results) { + activeRequests--; + if (error) { + return; + } + + if (results) { + allResults = allResults.concat(results); + } + + if (activeRequests <= 0) { + bounds = this._boundsFromResults(allResults); + + this.fire('results', { + results: allResults, + bounds: bounds, + latlng: (bounds) ? bounds.getCenter() : undefined, + text: text + }, true); + + if (this.options.zoomToResult && bounds) { + this._control._map.fitBounds(bounds); + } + + this.fire('load'); + } + }, this); + + if (key) { + activeRequests++; + provider.results(text, key, this._searchBounds(), callback); + } else { + for (var i = 0; i < this._providers.length; i++) { + activeRequests++; + this._providers[i].results(text, key, this._searchBounds(), callback); + } + } + }, + + _suggest: function (text) { + var activeRequests = this._providers.length; + + var createCallback = L.Util.bind(function (text, provider) { + return L.Util.bind(function (error, suggestions) { + if (error) { return; } + + var i; + + activeRequests = activeRequests - 1; + + if (text.length < 2) { + this._suggestions.innerHTML = ''; + this._suggestions.style.display = 'none'; + return; + } + + if (suggestions.length) { + for (i = 0; i < suggestions.length; i++) { + suggestions[i].provider = provider; + } + } else { + // we still need to update the UI + this._control._renderSuggestions(suggestions); + } + + if (provider._lastRender !== text && provider.nodes) { + for (i = 0; i < provider.nodes.length; i++) { + if (provider.nodes[i].parentElement) { + this._control._suggestions.removeChild(provider.nodes[i]); + } + } + + provider.nodes = []; + } + + if (suggestions.length && this._control._input.value === text) { + this._control.clearSuggestions(provider.nodes); + + provider._lastRender = text; + provider.nodes = this._control._renderSuggestions(suggestions); + this._control._nodes = []; + } + }, this); + }, this); + + this._pendingSuggestions = []; + + for (var i = 0; i < this._providers.length; i++) { + var provider = this._providers[i]; + var request = provider.suggestions(text, this._searchBounds(), createCallback(text, provider)); + this._pendingSuggestions.push(request); + } + }, + + _searchBounds: function () { + if (this.options.searchBounds !== null) { + return this.options.searchBounds; + } + + if (this.options.useMapBounds === false) { + return null; + } + + if (this.options.useMapBounds === true) { + return this._control._map.getBounds(); + } + + if (this.options.useMapBounds <= this._control._map.getZoom()) { + return this._control._map.getBounds(); + } + + return null; + }, + + _boundsFromResults: function (results) { + if (!results.length) { + return; + } + + var nullIsland = L.latLngBounds([0, 0], [0, 0]); + var resultBounds = []; + var resultLatlngs = []; + + // collect the bounds and center of each result + for (var i = results.length - 1; i >= 0; i--) { + var result = results[i]; + + resultLatlngs.push(result.latlng); + + // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present + if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) { + resultBounds.push(result.bounds); + } + } + + // form a bounds object containing all center points + var bounds = L.latLngBounds(resultLatlngs); + + // and extend it to contain all bounds objects + for (var j = 0; j < resultBounds.length; j++) { + bounds.extend(resultBounds[j]); + } + + return bounds; + }, + + _getAttribution: function () { + var attribs = []; + var providers = this._providers; + + for (var i = 0; i < providers.length; i++) { + if (providers[i].options.attribution) { + attribs.push(providers[i].options.attribution); + } + } + + return attribs.join(', '); + } + + }); + + function geosearchCore (control, options) { + return new GeosearchCore(control, options); + } + + var ArcgisOnlineProvider = GeocodeService.extend({ + options: { + label: 'Places and Addresses', + maxResults: 5 + }, + + suggestions: function (text, bounds, callback) { + var request = this.suggest().text(text); + + if (bounds) { + request.within(bounds); + } + + if (this.options.countries) { + request.countries(this.options.countries); + } + + if (this.options.categories) { + request.category(this.options.categories); + } + + // 15 is the maximum number of suggestions that can be returned + request.maxSuggestions(this.options.maxResults); + + return request.run(function (error, results, response) { + var suggestions = []; + if (!error) { + while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) { + var suggestion = response.suggestions.shift(); + if (!suggestion.isCollection) { + suggestions.push({ + text: suggestion.text, + magicKey: suggestion.magicKey + }); + } + } + } + callback(error, suggestions); + }, this); + }, + + results: function (text, key, bounds, callback) { + var request = this.geocode().text(text); + + if (key) { + request.key(key); + } + // in the future Address/StreetName geocoding requests that include a magicKey will always only return one match + request.maxLocations(this.options.maxResults); + + if (bounds) { + request.within(bounds); + } + + if (this.options.forStorage) { + request.forStorage(true); + } + + return request.run(function (error, response) { + callback(error, response.results); + }, this); + } + }); + + function arcgisOnlineProvider (options) { + return new ArcgisOnlineProvider(options); + } + + var Geosearch = L.Control.extend({ + includes: L.Mixin.Events, + + options: { + position: 'topleft', + collapseAfterResult: true, + expanded: false, + allowMultipleResults: true, + placeholder: 'Search for places or addresses', + title: 'Location Search' + }, + + initialize: function (options) { + L.Util.setOptions(this, options); + + if (!options || !options.providers || !options.providers.length) { + if (!options) { + options = {}; + } + options.providers = [ arcgisOnlineProvider() ]; + } + + // instantiate the underlying class and pass along options + this._geosearchCore = geosearchCore(this, options); + this._geosearchCore._providers = options.providers; + + // bubble each providers events to the control + this._geosearchCore.addEventParent(this); + for (var i = 0; i < this._geosearchCore._providers.length; i++) { + this._geosearchCore._providers[i].addEventParent(this); + } + + this._geosearchCore._pendingSuggestions = []; + + L.Control.prototype.initialize.call(options); + }, + + _renderSuggestions: function (suggestions) { + var currentGroup; + + if (suggestions.length > 0) { + this._suggestions.style.display = 'block'; + } + // set the maxHeight of the suggestions box to + // map height + // - suggestions offset (distance from top of suggestions to top of control) + // - control offset (distance from top of control to top of map) + // - 10 (extra padding) + this._suggestions.style.maxHeight = (this._map.getSize().y - this._suggestions.offsetTop - this._wrapper.offsetTop - 10) + 'px'; + + var nodes = []; + var list; + var header; + var suggestionTextArray = []; + + for (var i = 0; i < suggestions.length; i++) { + var suggestion = suggestions[i]; + if (!header && this._geosearchCore._providers.length > 1 && currentGroup !== suggestion.provider.options.label) { + header = L.DomUtil.create('span', 'geocoder-control-header', this._suggestions); + header.textContent = suggestion.provider.options.label; + header.innerText = suggestion.provider.options.label; + currentGroup = suggestion.provider.options.label; + nodes.push(header); + } + + if (!list) { + list = L.DomUtil.create('ul', 'geocoder-control-list', this._suggestions); + } + + if (suggestionTextArray.indexOf(suggestion.text) === -1) { + var suggestionItem = L.DomUtil.create('li', 'geocoder-control-suggestion', list); + + suggestionItem.innerHTML = suggestion.text; + suggestionItem.provider = suggestion.provider; + suggestionItem['data-magic-key'] = suggestion.magicKey; + } else { + for (var j = 0; j < list.childNodes.length; j++) { + // if the same text already appears in the list of suggestions, append an additional ObjectID to its magicKey instead + if (list.childNodes[j].innerHTML === suggestion.text) { + list.childNodes[j]['data-magic-key'] += ',' + suggestion.magicKey; + } + } + } + suggestionTextArray.push(suggestion.text); + } + + L.DomUtil.removeClass(this._input, 'geocoder-control-loading'); + + nodes.push(list); + + return nodes; + }, + + _boundsFromResults: function (results) { + if (!results.length) { + return; + } + + var nullIsland = L.latLngBounds([0, 0], [0, 0]); + var resultBounds = []; + var resultLatlngs = []; + + // collect the bounds and center of each result + for (var i = results.length - 1; i >= 0; i--) { + var result = results[i]; + + resultLatlngs.push(result.latlng); + + // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present + if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) { + resultBounds.push(result.bounds); + } + } + + // form a bounds object containing all center points + var bounds = L.latLngBounds(resultLatlngs); + + // and extend it to contain all bounds objects + for (var j = 0; j < resultBounds.length; j++) { + bounds.extend(resultBounds[j]); + } + + return bounds; + }, + + clear: function () { + this._suggestions.innerHTML = ''; + this._suggestions.style.display = 'none'; + this._input.value = ''; + + if (this.options.collapseAfterResult) { + this._input.placeholder = ''; + L.DomUtil.removeClass(this._wrapper, 'geocoder-control-expanded'); + } + + if (!this._map.scrollWheelZoom.enabled() && this._map.options.scrollWheelZoom) { + this._map.scrollWheelZoom.enable(); + } + }, + + clearSuggestions: function () { + if (this._nodes) { + for (var k = 0; k < this._nodes.length; k++) { + if (this._nodes[k].parentElement) { + this._suggestions.removeChild(this._nodes[k]); + } + } + } + }, + + _setupClick: function () { + L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded'); + this._input.focus(); + }, + + disable: function () { + this._input.disabled = true; + L.DomUtil.addClass(this._input, 'geocoder-control-input-disabled'); + L.DomEvent.removeListener(this._wrapper, 'click', this._setupClick, this); + }, + + enable: function () { + this._input.disabled = false; + L.DomUtil.removeClass(this._input, 'geocoder-control-input-disabled'); + L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this); + }, + + getAttribution: function () { + var attribs = []; + + for (var i = 0; i < this._providers.length; i++) { + if (this._providers[i].options.attribution) { + attribs.push(this._providers[i].options.attribution); + } + } + + return attribs.join(', '); + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + esriLeaflet.Util.setEsriAttribution(map); + + this._map = map; + this._wrapper = L.DomUtil.create('div', 'geocoder-control'); + this._input = L.DomUtil.create('input', 'geocoder-control-input leaflet-bar', this._wrapper); + this._input.title = this.options.title; + + if (this.options.expanded) { + L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded'); + this._input.placeholder = this.options.placeholder; + } + + this._suggestions = L.DomUtil.create('div', 'geocoder-control-suggestions leaflet-bar', this._wrapper); + + var credits = this._geosearchCore._getAttribution(); + map.attributionControl.addAttribution(credits); + + L.DomEvent.addListener(this._input, 'focus', function (e) { + this._input.placeholder = this.options.placeholder; + L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded'); + }, this); + + L.DomEvent.addListener(this._wrapper, 'click', this._setupClick, this); + + L.DomEvent.addListener(this._suggestions, 'mousedown', function (e) { + var suggestionItem = e.target || e.srcElement; + this._geosearchCore._geocode(suggestionItem.innerHTML, suggestionItem['data-magic-key'], suggestionItem.provider); + this.clear(); + }, this); + + L.DomEvent.addListener(this._input, 'blur', function (e) { + this.clear(); + }, this); + + L.DomEvent.addListener(this._input, 'keydown', function (e) { + var text = (e.target || e.srcElement).value; + + L.DomUtil.addClass(this._wrapper, 'geocoder-control-expanded'); + + var list = this._suggestions.querySelectorAll('.' + 'geocoder-control-suggestion'); + var selected = this._suggestions.querySelectorAll('.' + 'geocoder-control-selected')[0]; + var selectedPosition; + + for (var i = 0; i < list.length; i++) { + if (list[i] === selected) { + selectedPosition = i; + break; + } + } + + switch (e.keyCode) { + case 13: + /* + if an item has been selected, geocode it + if focus is on the input textbox, geocode only if multiple results are allowed and more than two characters are present, or if a single suggestion is displayed. + if less than two characters have been typed, abort the geocode + */ + if (selected) { + this._geosearchCore._geocode(selected.innerHTML, selected['data-magic-key'], selected.provider); + this.clear(); + } else if (this.options.allowMultipleResults && text.length >= 2) { + this._geosearchCore._geocode(this._input.value, undefined); + this.clear(); + } else { + if (list.length === 1) { + L.DomUtil.addClass(list[0], 'geocoder-control-selected'); + this._geosearchCore._geocode(list[0].innerHTML, list[0]['data-magic-key'], list[0].provider); + } else { + this.clear(); + this._input.blur(); + } + } + L.DomEvent.preventDefault(e); + break; + case 38: + if (selected) { + L.DomUtil.removeClass(selected, 'geocoder-control-selected'); + } + + var previousItem = list[selectedPosition - 1]; + + if (selected && previousItem) { + L.DomUtil.addClass(previousItem, 'geocoder-control-selected'); + } else { + L.DomUtil.addClass(list[list.length - 1], 'geocoder-control-selected'); + } + L.DomEvent.preventDefault(e); + break; + case 40: + if (selected) { + L.DomUtil.removeClass(selected, 'geocoder-control-selected'); + } + + var nextItem = list[selectedPosition + 1]; + + if (selected && nextItem) { + L.DomUtil.addClass(nextItem, 'geocoder-control-selected'); + } else { + L.DomUtil.addClass(list[0], 'geocoder-control-selected'); + } + L.DomEvent.preventDefault(e); + break; + default: + // when the input changes we should cancel all pending suggestion requests if possible to avoid result collisions + for (var x = 0; x < this._geosearchCore._pendingSuggestions.length; x++) { + var request = this._geosearchCore._pendingSuggestions[x]; + if (request && request.abort && !request.id) { + request.abort(); + } + } + break; + } + }, this); + + L.DomEvent.addListener(this._input, 'keyup', L.Util.throttle(function (e) { + var key = e.which || e.keyCode; + var text = (e.target || e.srcElement).value; + + // require at least 2 characters for suggestions + if (text.length < 2) { + this._suggestions.innerHTML = ''; + this._suggestions.style.display = 'none'; + L.DomUtil.removeClass(this._input, 'geocoder-control-loading'); + return; + } + + // if this is the escape key it will clear the input so clear suggestions + if (key === 27) { + this._suggestions.innerHTML = ''; + this._suggestions.style.display = 'none'; + return; + } + + // if this is NOT the up/down arrows or enter make a suggestion + if (key !== 13 && key !== 38 && key !== 40) { + if (this._input.value !== this._lastValue) { + this._lastValue = this._input.value; + L.DomUtil.addClass(this._input, 'geocoder-control-loading'); + this._geosearchCore._suggest(text); + } + } + }, 50, this), this); + + L.DomEvent.disableClickPropagation(this._wrapper); + + // when mouse moves over suggestions disable scroll wheel zoom if its enabled + L.DomEvent.addListener(this._suggestions, 'mouseover', function (e) { + if (map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) { + map.scrollWheelZoom.disable(); + } + }); + + // when mouse moves leaves suggestions enable scroll wheel zoom if its disabled + L.DomEvent.addListener(this._suggestions, 'mouseout', function (e) { + if (!map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) { + map.scrollWheelZoom.enable(); + } + }); + + this._geosearchCore.on('load', function (e) { + L.DomUtil.removeClass(this._input, 'geocoder-control-loading'); + this.clear(); + this._input.blur(); + }, this); + + return this._wrapper; + } + }); + + function geosearch (options) { + return new Geosearch(options); + } + + var FeatureLayerProvider = esriLeaflet.FeatureLayerService.extend({ + options: { + label: 'Feature Layer', + maxResults: 5, + bufferRadius: 1000, + formatSuggestion: function (feature) { + return feature.properties[this.options.searchFields[0]]; + } + }, + + initialize: function (options) { + esriLeaflet.FeatureLayerService.prototype.initialize.call(this, options); + if (typeof this.options.searchFields === 'string') { + this.options.searchFields = [this.options.searchFields]; + } + this._suggestionsQuery = this.query(); + this._resultsQuery = this.query(); + }, + + suggestions: function (text, bounds, callback) { + var query = this._suggestionsQuery.where(this._buildQuery(text)) + .returnGeometry(false); + + if (bounds) { + query.intersects(bounds); + } + + if (this.options.idField) { + query.fields([this.options.idField].concat(this.options.searchFields)); + } + + var request = query.run(function (error, results, raw) { + if (error) { + callback(error, []); + } else { + this.options.idField = raw.objectIdFieldName; + var suggestions = []; + for (var i = results.features.length - 1; i >= 0; i--) { + var feature = results.features[i]; + suggestions.push({ + text: this.options.formatSuggestion.call(this, feature), + magicKey: feature.id + }); + } + callback(error, suggestions.slice(0, this.options.maxResults)); + } + }, this); + + return request; + }, + + results: function (text, key, bounds, callback) { + var query = this._resultsQuery; + + if (key) { + delete query.params.where; + query.featureIds([key]); + } else { + query.where(this._buildQuery(text)); + } + + if (bounds) { + query.within(bounds); + } + + return query.run(L.Util.bind(function (error, features) { + var results = []; + for (var i = 0; i < features.features.length; i++) { + var feature = features.features[i]; + if (feature) { + var bounds = this._featureBounds(feature); + + var result = { + latlng: bounds.getCenter(), + bounds: bounds, + text: this.options.formatSuggestion.call(this, feature), + properties: feature.properties, + geojson: feature + }; + + results.push(result); + + // clear query parameters for the next search + delete this._resultsQuery.params['objectIds']; + } + } + callback(error, results); + }, this)); + }, + + orderBy: function (fieldName, order) { + this._suggestionsQuery.orderBy(fieldName, order); + }, + + _buildQuery: function (text) { + var queryString = []; + + for (var i = this.options.searchFields.length - 1; i >= 0; i--) { + var field = 'upper("' + this.options.searchFields[i] + '")'; + + queryString.push(field + " LIKE upper('%" + text + "%')"); + } + + if (this.options.where) { + return this.options.where + ' AND (' + queryString.join(' OR ') + ')'; + } else { + return queryString.join(' OR '); + } + }, + + _featureBounds: function (feature) { + var geojson = L.geoJson(feature); + if (feature.geometry.type === 'Point') { + var center = geojson.getBounds().getCenter(); + var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat); + var latRadius = (this.options.bufferRadius / 40075017) * 360; + return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]); + } else { + return geojson.getBounds(); + } + } + }); + + function featureLayerProvider (options) { + return new FeatureLayerProvider(options); + } + + var MapServiceProvider = esriLeaflet.MapService.extend({ + options: { + layers: [0], + label: 'Map Service', + bufferRadius: 1000, + maxResults: 5, + formatSuggestion: function (feature) { + return feature.properties[feature.displayFieldName] + ' ' + feature.layerName + ''; + } + }, + + initialize: function (options) { + esriLeaflet.MapService.prototype.initialize.call(this, options); + this._getIdFields(); + }, + + suggestions: function (text, bounds, callback) { + var request = this.find().text(text).fields(this.options.searchFields).returnGeometry(false).layers(this.options.layers); + + return request.run(function (error, results, raw) { + var suggestions = []; + if (!error) { + var count = Math.min(this.options.maxResults, results.features.length); + raw.results = raw.results.reverse(); + for (var i = 0; i < count; i++) { + var feature = results.features[i]; + var result = raw.results[i]; + var layer = result.layerId; + var idField = this._idFields[layer]; + feature.layerId = layer; + feature.layerName = this._layerNames[layer]; + feature.displayFieldName = this._displayFields[layer]; + if (idField) { + suggestions.push({ + text: this.options.formatSuggestion.call(this, feature), + magicKey: result.attributes[idField] + ':' + layer + }); + } + } + } + callback(error, suggestions.reverse()); + }, this); + }, + + results: function (text, key, bounds, callback) { + var results = []; + var request; + + if (key) { + var featureId = key.split(':')[0]; + var layer = key.split(':')[1]; + request = this.query().layer(layer).featureIds(featureId); + } else { + request = this.find().text(text).fields(this.options.searchFields).layers(this.options.layers); + } + + return request.run(function (error, features, response) { + if (!error) { + if (response.results) { + response.results = response.results.reverse(); + } + for (var i = 0; i < features.features.length; i++) { + var feature = features.features[i]; + layer = layer || response.results[i].layerId; + + if (feature && layer !== undefined) { + var bounds = this._featureBounds(feature); + feature.layerId = layer; + feature.layerName = this._layerNames[layer]; + feature.displayFieldName = this._displayFields[layer]; + + var result = { + latlng: bounds.getCenter(), + bounds: bounds, + text: this.options.formatSuggestion.call(this, feature), + properties: feature.properties, + geojson: feature + }; + + results.push(result); + } + } + } + callback(error, results.reverse()); + }, this); + }, + + _featureBounds: function (feature) { + var geojson = L.geoJson(feature); + if (feature.geometry.type === 'Point') { + var center = geojson.getBounds().getCenter(); + var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat); + var latRadius = (this.options.bufferRadius / 40075017) * 360; + return L.latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]); + } else { + return geojson.getBounds(); + } + }, + + _layerMetadataCallback: function (layerid) { + return L.Util.bind(function (error, metadata) { + if (error) { return; } + this._displayFields[layerid] = metadata.displayField; + this._layerNames[layerid] = metadata.name; + for (var i = 0; i < metadata.fields.length; i++) { + var field = metadata.fields[i]; + if (field.type === 'esriFieldTypeOID') { + this._idFields[layerid] = field.name; + break; + } + } + }, this); + }, + + _getIdFields: function () { + this._idFields = {}; + this._displayFields = {}; + this._layerNames = {}; + for (var i = 0; i < this.options.layers.length; i++) { + var layer = this.options.layers[i]; + this.get(layer, {}, this._layerMetadataCallback(layer)); + } + } + }); + + function mapServiceProvider (options) { + return new MapServiceProvider(options); + } + + var GeocodeServiceProvider = GeocodeService.extend({ + options: { + label: 'Geocode Server', + maxResults: 5 + }, + + suggestions: function (text, bounds, callback) { + if (this.options.supportsSuggest) { + var request = this.suggest().text(text); + if (bounds) { + request.within(bounds); + } + + return request.run(function (error, results, response) { + var suggestions = []; + if (!error) { + while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) { + var suggestion = response.suggestions.shift(); + if (!suggestion.isCollection) { + suggestions.push({ + text: suggestion.text, + magicKey: suggestion.magicKey + }); + } + } + } + callback(error, suggestions); + }, this); + } else { + callback(undefined, []); + return false; + } + }, + + results: function (text, key, bounds, callback) { + var request = this.geocode().text(text); + + request.maxLocations(this.options.maxResults); + + if (bounds) { + request.within(bounds); + } + + return request.run(function (error, response) { + callback(error, response.results); + }, this); + } + }); + + function geocodeServiceProvider (options) { + return new GeocodeServiceProvider(options); + } + + var WorldGeocodingServiceUrl = 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/'; + + exports.WorldGeocodingServiceUrl = WorldGeocodingServiceUrl; + exports.VERSION = version; + exports.Geocode = Geocode; + exports.geocode = geocode; + exports.ReverseGeocode = ReverseGeocode; + exports.reverseGeocode = reverseGeocode; + exports.Suggest = Suggest; + exports.suggest = suggest; + exports.GeocodeService = GeocodeService; + exports.geocodeService = geocodeService; + exports.Geosearch = Geosearch; + exports.geosearch = geosearch; + exports.GeosearchCore = GeosearchCore; + exports.geosearchCore = geosearchCore; + exports.ArcgisOnlineProvider = ArcgisOnlineProvider; + exports.arcgisOnlineProvider = arcgisOnlineProvider; + exports.FeatureLayerProvider = FeatureLayerProvider; + exports.featureLayerProvider = featureLayerProvider; + exports.MapServiceProvider = MapServiceProvider; + exports.mapServiceProvider = mapServiceProvider; + exports.GeocodeServiceProvider = GeocodeServiceProvider; + exports.geocodeServiceProvider = geocodeServiceProvider; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9SZXZlcnNlR2VvY29kZS5qcyIsIi4uL3NyYy9UYXNrcy9TdWdnZXN0LmpzIiwiLi4vc3JjL1NlcnZpY2VzL0dlb2NvZGUuanMiLCIuLi9zcmMvQ2xhc3Nlcy9HZW9zZWFyY2hDb3JlLmpzIiwiLi4vc3JjL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlci5qcyIsIi4uL3NyYy9Db250cm9scy9HZW9zZWFyY2guanMiLCIuLi9zcmMvUHJvdmlkZXJzL0ZlYXR1cmVMYXllci5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9Qcm92aWRlcnMvR2VvY29kZVNlcnZpY2UuanMiLCIuLi9zcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtZ2VvY29kZXJcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVzcmkgR2VvY29kaW5nIHV0aWxpdHkgYW5kIHNlYXJjaCBwbHVnaW4gZm9yIExlYWZsZXQuXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuMi40XCIsXG4gIFwiYXV0aG9yXCI6IFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCIsXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT4gKGh0dHA6Ly9qb2huZ3Jhdm9pcy5jb20pXCJcbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjMuNS4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJodHRwLXNlcnZlclwiOiBcIl4wLjguNVwiLFxuICAgIFwiaW1hZ2VtaW5cIjogXCJeMy4yLjBcIixcbiAgICBcImlzcGFydGFcIjogXCJeNC4wLjBcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4xLjMuMFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMS4xLjFcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjEuMy4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4yLjIuMVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm1vY2hhXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJub2RlLXNhc3NcIjogXCJeMy4yLjBcIixcbiAgICBcInBhcmFsbGVsc2hlbGxcIjogXCJeMi4wLjBcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuOFwiLFxuICAgIFwicm9sbHVwXCI6IFwiXjAuMjUuNFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1qc29uXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi11Z2xpZnlcIjogXCJeMC4zLjFcIixcbiAgICBcInNlbWlzdGFuZGFyZFwiOiBcIl45LjAuMFwiLFxuICAgIFwic2lub25cIjogXCJeMS4xMS4xXCIsXG4gICAgXCJzaW5vbi1jaGFpXCI6IFwiMi44LjBcIixcbiAgICBcInNuYXp6eVwiOiBcIl41LjAuMFwiLFxuICAgIFwidWdsaWZ5LWpzXCI6IFwiXjIuNi4xXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRHZW9jb2RpbmcuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwiYnJvd3NlclwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOkVzcmkvZXNyaS1sZWFmbGV0LWdlb2NvZGVyLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJwcmVidWlsZFwiOiBcIm1rZGlycCBkaXN0XCIsXG4gICAgXCJidWlsZFwiOiBcInJvbGx1cCAtYyBwcm9maWxlcy9kZWJ1Zy5qcyAmIHJvbGx1cCAtYyBwcm9maWxlcy9wcm9kdWN0aW9uLmpzICYgbnBtIHJ1biBjc3MgJiBucG0gcnVuIGltZ1wiLFxuICAgIFwiY3NzXCI6IFwibm9kZS1zYXNzIC4vc3JjL2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLi9kaXN0L2VzcmktbGVhZmxldC1nZW9jb2Rlci5jc3MgLS1vdXRwdXQtc3R5bGUgY29tcHJlc3NlZFwiLFxuICAgIFwiaW1nXCI6IFwiaW1hZ2VtaW4gLi9zcmMvaW1nIC4vZGlzdC9pbWdcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydC13YXRjaFwiOiBcIndhdGNoIFxcXCJucG0gcnVuIGJ1aWxkXFxcIiBzcmNcIixcbiAgICBcInN0YXJ0XCI6IFwicGFyYWxsZWxzaGVsbCBcXFwibnBtIHJ1biBzdGFydC13YXRjaFxcXCIgXFxcImh0dHAtc2VydmVyIC1wIDU2NzggLWMtMSAtb1xcXCJcIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYga2FybWEgc3RhcnRcIlxuICB9LFxuICBcInNlbWlzdGFuZGFyZFwiOiB7XG4gICAgXCJnbG9iYWxzXCI6IFsgXCJleHBlY3RcIiwgXCJMXCIsIFwiWE1MSHR0cFJlcXVlc3RcIiwgXCJzaW5vblwiLCBcInhoclwiIF1cbiAgfSxcbiAgXCJzdHlsZVwiOiBcIi4vZGlzdC9lc3JpLWxlYWZsZXQtZ2VvY29kZXIuY3NzXCJcbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzaywgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZSA9IFRhc2suZXh0ZW5kKHtcbiAgcGF0aDogJ2ZpbmRBZGRyZXNzQ2FuZGlkYXRlcycsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U3I6IDQzMjYsXG4gICAgZm9yU3RvcmFnZTogZmFsc2UsXG4gICAgb3V0RmllbGRzOiAnKicsXG4gICAgbWF4TG9jYXRpb25zOiAyMFxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnYWRkcmVzcyc6ICdhZGRyZXNzJyxcbiAgICAnbmVpZ2hib3Job29kJzogJ25laWdoYm9yaG9vZCcsXG4gICAgJ2NpdHknOiAnY2l0eScsXG4gICAgJ3N1YnJlZ2lvbic6ICdzdWJyZWdpb24nLFxuICAgICdyZWdpb24nOiAncmVnaW9uJyxcbiAgICAncG9zdGFsJzogJ3Bvc3RhbCcsXG4gICAgJ2NvdW50cnknOiAnY291bnRyeScsXG4gICAgJ3RleHQnOiAnc2luZ2xlTGluZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NhdGVnb3J5JyxcbiAgICAndG9rZW4nOiAndG9rZW4nLFxuICAgICdrZXknOiAnbWFnaWNLZXknLFxuICAgICdmaWVsZHMnOiAnb3V0RmllbGRzJyxcbiAgICAnZm9yU3RvcmFnZSc6ICdmb3JTdG9yYWdlJyxcbiAgICAnbWF4TG9jYXRpb25zJzogJ21heExvY2F0aW9ucydcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgfHwgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsO1xuICAgIFRhc2sucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICB3aXRoaW46IGZ1bmN0aW9uIChib3VuZHMpIHtcbiAgICBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhib3VuZHMpO1xuICAgIHRoaXMucGFyYW1zLnNlYXJjaEV4dGVudCA9IFV0aWwuYm91bmRzVG9FeHRlbnQoYm91bmRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBuZWFyYnk6IGZ1bmN0aW9uIChsYXRsbmcsIHJhZGl1cykge1xuICAgIGxhdGxuZyA9IEwubGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMubG9jYXRpb24gPSBsYXRsbmcubG5nICsgJywnICsgbGF0bG5nLmxhdDtcbiAgICB0aGlzLnBhcmFtcy5kaXN0YW5jZSA9IE1hdGgubWluKE1hdGgubWF4KHJhZGl1cywgMjAwMCksIDUwMDAwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW0pIHtcbiAgICAgIHRoaXMucGFyYW1zW3RoaXMub3B0aW9ucy5jdXN0b21QYXJhbV0gPSB0aGlzLnBhcmFtcy5zaW5nbGVMaW5lO1xuICAgICAgZGVsZXRlIHRoaXMucGFyYW1zLnNpbmdsZUxpbmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcHJvY2Vzc29yID0gdGhpcy5fcHJvY2Vzc0dlb2NvZGVyUmVzcG9uc2U7XG4gICAgICB2YXIgcmVzdWx0cyA9ICghZXJyb3IpID8gcHJvY2Vzc29yKHJlc3BvbnNlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHsgcmVzdWx0czogcmVzdWx0cyB9LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgX3Byb2Nlc3NHZW9jb2RlclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5jYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FuZGlkYXRlID0gcmVzcG9uc2UuY2FuZGlkYXRlc1tpXTtcbiAgICAgIGlmIChjYW5kaWRhdGUuZXh0ZW50KSB7XG4gICAgICAgIHZhciBib3VuZHMgPSBVdGlsLmV4dGVudFRvQm91bmRzKGNhbmRpZGF0ZS5leHRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICB0ZXh0OiBjYW5kaWRhdGUuYWRkcmVzcyxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIHNjb3JlOiBjYW5kaWRhdGUuc2NvcmUsXG4gICAgICAgIGxhdGxuZzogTC5sYXRMbmcoY2FuZGlkYXRlLmxvY2F0aW9uLnksIGNhbmRpZGF0ZS5sb2NhdGlvbi54KSxcbiAgICAgICAgcHJvcGVydGllczogY2FuZGlkYXRlLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9jb2RlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmwgfSBmcm9tICcuLi9Fc3JpTGVhZmxldEdlb2NvZGluZyc7XG5cbmV4cG9ydCB2YXIgUmV2ZXJzZUdlb2NvZGUgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdyZXZlcnNlR2VvY29kZScsXG5cbiAgcGFyYW1zOiB7XG4gICAgb3V0U1I6IDQzMjYsXG4gICAgcmV0dXJuSW50ZXJzZWN0aW9uOiBmYWxzZVxuICB9LFxuXG4gIHNldHRlcnM6IHtcbiAgICAnZGlzdGFuY2UnOiAnZGlzdGFuY2UnLFxuICAgICdsYW5ndWFnZSc6ICdsYW5nQ29kZScsXG4gICAgJ2ludGVyc2VjdGlvbic6ICdyZXR1cm5JbnRlcnNlY3Rpb24nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsIHx8IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICBUYXNrLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgbGF0bG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBsYXRsbmc6IEwubGF0TG5nKHJlc3BvbnNlLmxvY2F0aW9uLnksIHJlc3BvbnNlLmxvY2F0aW9uLngpLFxuICAgICAgICAgIGFkZHJlc3M6IHJlc3BvbnNlLmFkZHJlc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzdWx0LCByZXNwb25zZSk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZUdlb2NvZGUgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZXZlcnNlR2VvY29kZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmV2ZXJzZUdlb2NvZGU7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFRhc2ssIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuXG5leHBvcnQgdmFyIFN1Z2dlc3QgPSBUYXNrLmV4dGVuZCh7XG4gIHBhdGg6ICdzdWdnZXN0JyxcblxuICBwYXJhbXM6IHt9LFxuXG4gIHNldHRlcnM6IHtcbiAgICB0ZXh0OiAndGV4dCcsXG4gICAgY2F0ZWdvcnk6ICdjYXRlZ29yeScsXG4gICAgY291bnRyaWVzOiAnY291bnRyeUNvZGUnLFxuICAgIG1heFN1Z2dlc3Rpb25zOiAnbWF4U3VnZ2VzdGlvbnMnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMudXJsKSB7XG4gICAgICBvcHRpb25zLnVybCA9IFdvcmxkR2VvY29kaW5nU2VydmljZVVybDtcbiAgICAgIG9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gdHJ1ZTtcbiAgICB9XG4gICAgVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGJvdW5kcykge1xuICAgIGJvdW5kcyA9IEwubGF0TG5nQm91bmRzKGJvdW5kcyk7XG4gICAgYm91bmRzID0gYm91bmRzLnBhZCgwLjUpO1xuICAgIHZhciBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIG5lID0gYm91bmRzLmdldE5vcnRoV2VzdCgpO1xuICAgIHRoaXMucGFyYW1zLmxvY2F0aW9uID0gY2VudGVyLmxuZyArICcsJyArIGNlbnRlci5sYXQ7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLm1heChjZW50ZXIuZGlzdGFuY2VUbyhuZSksIDIwMDApLCA1MDAwMCk7XG4gICAgdGhpcy5wYXJhbXMuc2VhcmNoRXh0ZW50ID0gVXRpbC5ib3VuZHNUb0V4dGVudChib3VuZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnBhcmFtcy5sb2NhdGlvbiA9IGxhdGxuZy5sbmcgKyAnLCcgKyBsYXRsbmcubGF0O1xuICAgIHRoaXMucGFyYW1zLmRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5tYXgocmFkaXVzLCAyMDAwKSwgNTAwMDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybigndGhpcyBnZW9jb2Rpbmcgc2VydmljZSBkb2VzIG5vdCBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnMnKTtcbiAgICB9XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3VnZ2VzdChvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3VnZ2VzdDtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsIH0gZnJvbSAnLi4vRXNyaUxlYWZsZXRHZW9jb2RpbmcnO1xuaW1wb3J0IGdlb2NvZGUgZnJvbSAnLi4vVGFza3MvR2VvY29kZSc7XG5pbXBvcnQgcmV2ZXJzZUdlb2NvZGUgZnJvbSAnLi4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuaW1wb3J0IHN1Z2dlc3QgZnJvbSAnLi4vVGFza3MvU3VnZ2VzdCc7XG5cbmV4cG9ydCB2YXIgR2VvY29kZVNlcnZpY2UgPSBTZXJ2aWNlLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLl9jb25maXJtU3VnZ2VzdFN1cHBvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy51cmwgPSBXb3JsZEdlb2NvZGluZ1NlcnZpY2VVcmw7XG4gICAgICBvcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIGdlb2NvZGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2VvY29kZSh0aGlzKTtcbiAgfSxcblxuICByZXZlcnNlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJldmVyc2VHZW9jb2RlKHRoaXMpO1xuICB9LFxuXG4gIHN1Z2dlc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyByZXF1aXJlcyBlaXRoZXIgdGhlIEVzcmkgV29ybGQgR2VvY29kaW5nIFNlcnZpY2Ugb3IgYSA8MTAuMyBBcmNHSVMgU2VydmVyIEdlb2NvZGluZyBTZXJ2aWNlIHRoYXQgc3VwcG9ydHMgc3VnZ2VzdC5cbiAgICByZXR1cm4gc3VnZ2VzdCh0aGlzKTtcbiAgfSxcblxuICBfY29uZmlybVN1Z2dlc3RTdXBwb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5tZXRhZGF0YShmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICAvLyBwcmUgMTAuMyBnZW9jb2Rpbmcgc2VydmljZXMgZG9udCBsaXN0IGNhcGFiaWxpdGllcyAoYW5kIGRvbnQgc3VwcG9ydCBtYXhMb2NhdGlvbnMpXG4gICAgICAvLyBvbmx5IFNPTUUgaW5kaXZpZHVhbCBzZXJ2aWNlcyBoYXZlIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0IGFza2luZyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICghcmVzcG9uc2UuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdXBwb3J0c1N1Z2dlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBhcmFtID0gcmVzcG9uc2Uuc2luZ2xlTGluZUFkZHJlc3NGaWVsZC5uYW1lO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jYXBhYmlsaXRpZXMuaW5kZXhPZignU3VnZ2VzdCcpID4gLTEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnN1cHBvcnRzU3VnZ2VzdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VvY29kZVNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VvY29kZVNlcnZpY2U7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuZXhwb3J0IHZhciBHZW9zZWFyY2hDb3JlID0gTC5FdmVudGVkLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHpvb21Ub1Jlc3VsdDogdHJ1ZSxcbiAgICB1c2VNYXBCb3VuZHM6IDEyLFxuICAgIHNlYXJjaEJvdW5kczogbnVsbFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChjb250cm9sLCBvcHRpb25zKSB7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fY29udHJvbCA9IGNvbnRyb2w7XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzIHx8ICFvcHRpb25zLnByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm92aWRlcnMgPSBvcHRpb25zLnByb3ZpZGVycztcbiAgfSxcblxuICBfZ2VvY29kZTogZnVuY3Rpb24gKHRleHQsIGtleSwgcHJvdmlkZXIpIHtcbiAgICB2YXIgYWN0aXZlUmVxdWVzdHMgPSAwO1xuICAgIHZhciBhbGxSZXN1bHRzID0gW107XG4gICAgdmFyIGJvdW5kcztcblxuICAgIHZhciBjYWxsYmFjayA9IEwuVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0cykge1xuICAgICAgYWN0aXZlUmVxdWVzdHMtLTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICAgIGFsbFJlc3VsdHMgPSBhbGxSZXN1bHRzLmNvbmNhdChyZXN1bHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RzIDw9IDApIHtcbiAgICAgICAgYm91bmRzID0gdGhpcy5fYm91bmRzRnJvbVJlc3VsdHMoYWxsUmVzdWx0cyk7XG5cbiAgICAgICAgdGhpcy5maXJlKCdyZXN1bHRzJywge1xuICAgICAgICAgIHJlc3VsdHM6IGFsbFJlc3VsdHMsXG4gICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgbGF0bG5nOiAoYm91bmRzKSA/IGJvdW5kcy5nZXRDZW50ZXIoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuem9vbVRvUmVzdWx0ICYmIGJvdW5kcykge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX21hcC5maXRCb3VuZHMoYm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgYWN0aXZlUmVxdWVzdHMrKztcbiAgICAgIHByb3ZpZGVyLnJlc3VsdHModGV4dCwga2V5LCB0aGlzLl9zZWFyY2hCb3VuZHMoKSwgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY3RpdmVSZXF1ZXN0cysrO1xuICAgICAgICB0aGlzLl9wcm92aWRlcnNbaV0ucmVzdWx0cyh0ZXh0LCBrZXksIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIF9zdWdnZXN0OiBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciBhY3RpdmVSZXF1ZXN0cyA9IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7XG5cbiAgICB2YXIgY3JlYXRlQ2FsbGJhY2sgPSBMLlV0aWwuYmluZChmdW5jdGlvbiAodGV4dCwgcHJvdmlkZXIpIHtcbiAgICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHN1Z2dlc3Rpb25zKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgaTtcblxuICAgICAgICBhY3RpdmVSZXF1ZXN0cyA9IGFjdGl2ZVJlcXVlc3RzIC0gMTtcblxuICAgICAgICBpZiAodGV4dC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uc1tpXS5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgVUlcbiAgICAgICAgICB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvdmlkZXIuX2xhc3RSZW5kZXIgIT09IHRleHQgJiYgcHJvdmlkZXIubm9kZXMpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvdmlkZXIubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlci5ub2Rlc1tpXS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wuX3N1Z2dlc3Rpb25zLnJlbW92ZUNoaWxkKHByb3ZpZGVyLm5vZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm92aWRlci5ub2RlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCAmJiB0aGlzLl9jb250cm9sLl9pbnB1dC52YWx1ZSA9PT0gdGV4dCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRyb2wuY2xlYXJTdWdnZXN0aW9ucyhwcm92aWRlci5ub2Rlcyk7XG5cbiAgICAgICAgICBwcm92aWRlci5fbGFzdFJlbmRlciA9IHRleHQ7XG4gICAgICAgICAgcHJvdmlkZXIubm9kZXMgPSB0aGlzLl9jb250cm9sLl9yZW5kZXJTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5fY29udHJvbC5fbm9kZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0aGlzLl9wcm92aWRlcnNbaV07XG4gICAgICB2YXIgcmVxdWVzdCA9IHByb3ZpZGVyLnN1Z2dlc3Rpb25zKHRleHQsIHRoaXMuX3NlYXJjaEJvdW5kcygpLCBjcmVhdGVDYWxsYmFjayh0ZXh0LCBwcm92aWRlcikpO1xuICAgICAgdGhpcy5fcGVuZGluZ1N1Z2dlc3Rpb25zLnB1c2gocmVxdWVzdCk7XG4gICAgfVxuICB9LFxuXG4gIF9zZWFyY2hCb3VuZHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEJvdW5kcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZWFyY2hCb3VuZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VNYXBCb3VuZHMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2wuX21hcC5nZXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZU1hcEJvdW5kcyA8PSB0aGlzLl9jb250cm9sLl9tYXAuZ2V0Wm9vbSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udHJvbC5fbWFwLmdldEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIF9ib3VuZHNGcm9tUmVzdWx0czogZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bGxJc2xhbmQgPSBMLmxhdExuZ0JvdW5kcyhbMCwgMF0sIFswLCAwXSk7XG4gICAgdmFyIHJlc3VsdEJvdW5kcyA9IFtdO1xuICAgIHZhciByZXN1bHRMYXRsbmdzID0gW107XG5cbiAgICAvLyBjb2xsZWN0IHRoZSBib3VuZHMgYW5kIGNlbnRlciBvZiBlYWNoIHJlc3VsdFxuICAgIGZvciAodmFyIGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgcmVzdWx0TGF0bG5ncy5wdXNoKHJlc3VsdC5sYXRsbmcpO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgYm91bmRzIGFyZSB2YWxpZCBhbmQgbm90IDAsMC4gc29tZXRpbWVzIGJvdW5kcyBhcmUgaW5jb3JyZWN0IG9yIG5vdCBwcmVzZW50XG4gICAgICBpZiAocmVzdWx0LmJvdW5kcyAmJiByZXN1bHQuYm91bmRzLmlzVmFsaWQoKSAmJiAhcmVzdWx0LmJvdW5kcy5lcXVhbHMobnVsbElzbGFuZCkpIHtcbiAgICAgICAgcmVzdWx0Qm91bmRzLnB1c2gocmVzdWx0LmJvdW5kcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBhIGJvdW5kcyBvYmplY3QgY29udGFpbmluZyBhbGwgY2VudGVyIHBvaW50c1xuICAgIHZhciBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhyZXN1bHRMYXRsbmdzKTtcblxuICAgIC8vIGFuZCBleHRlbmQgaXQgdG8gY29udGFpbiBhbGwgYm91bmRzIG9iamVjdHNcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlc3VsdEJvdW5kcy5sZW5ndGg7IGorKykge1xuICAgICAgYm91bmRzLmV4dGVuZChyZXN1bHRCb3VuZHNbal0pO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZHM7XG4gIH0sXG5cbiAgX2dldEF0dHJpYnV0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGF0dHJpYnMgPSBbXTtcbiAgICB2YXIgcHJvdmlkZXJzID0gdGhpcy5fcHJvdmlkZXJzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbikge1xuICAgICAgICBhdHRyaWJzLnB1c2gocHJvdmlkZXJzW2ldLm9wdGlvbnMuYXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJzLmpvaW4oJywgJyk7XG4gIH1cblxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9zZWFyY2hDb3JlIChjb250cm9sLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoQ29yZShjb250cm9sLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2Vvc2VhcmNoQ29yZTtcbiIsImltcG9ydCB7IEdlb2NvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2VvY29kZSc7XG5cbmV4cG9ydCB2YXIgQXJjZ2lzT25saW5lUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdQbGFjZXMgYW5kIEFkZHJlc3NlcycsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5zdWdnZXN0KCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpIHtcbiAgICAgIHJlcXVlc3QuY291bnRyaWVzKHRoaXMub3B0aW9ucy5jb3VudHJpZXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcykge1xuICAgICAgcmVxdWVzdC5jYXRlZ29yeSh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgLy8gMTUgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRoYXQgY2FuIGJlIHJldHVybmVkXG4gICAgcmVxdWVzdC5tYXhTdWdnZXN0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSkge1xuICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gW107XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHdoaWxlIChyZXNwb25zZS5zdWdnZXN0aW9ucy5sZW5ndGggJiYgc3VnZ2VzdGlvbnMubGVuZ3RoIDw9ICh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyAtIDEpKSB7XG4gICAgICAgICAgdmFyIHN1Z2dlc3Rpb24gPSByZXNwb25zZS5zdWdnZXN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0OiBzdWdnZXN0aW9uLnRleHQsXG4gICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucyk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0ID0gdGhpcy5nZW9jb2RlKCkudGV4dCh0ZXh0KTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHJlcXVlc3Qua2V5KGtleSk7XG4gICAgfVxuICAgIC8vIGluIHRoZSBmdXR1cmUgQWRkcmVzcy9TdHJlZXROYW1lIGdlb2NvZGluZyByZXF1ZXN0cyB0aGF0IGluY2x1ZGUgYSBtYWdpY0tleSB3aWxsIGFsd2F5cyBvbmx5IHJldHVybiBvbmUgbWF0Y2hcbiAgICByZXF1ZXN0Lm1heExvY2F0aW9ucyh0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyk7XG5cbiAgICBpZiAoYm91bmRzKSB7XG4gICAgICByZXF1ZXN0LndpdGhpbihib3VuZHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZm9yU3RvcmFnZSkge1xuICAgICAgcmVxdWVzdC5mb3JTdG9yYWdlKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJjZ2lzT25saW5lUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBBcmNnaXNPbmxpbmVQcm92aWRlcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJjZ2lzT25saW5lUHJvdmlkZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IGdlb3NlYXJjaENvcmUgfSBmcm9tICcuLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuaW1wb3J0IHsgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuLi9Qcm92aWRlcnMvQXJjZ2lzT25saW5lR2VvY29kZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgR2Vvc2VhcmNoID0gTC5Db250cm9sLmV4dGVuZCh7XG4gIGluY2x1ZGVzOiBMLk1peGluLkV2ZW50cyxcblxuICBvcHRpb25zOiB7XG4gICAgcG9zaXRpb246ICd0b3BsZWZ0JyxcbiAgICBjb2xsYXBzZUFmdGVyUmVzdWx0OiB0cnVlLFxuICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICBhbGxvd011bHRpcGxlUmVzdWx0czogdHJ1ZSxcbiAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBmb3IgcGxhY2VzIG9yIGFkZHJlc3NlcycsXG4gICAgdGl0bGU6ICdMb2NhdGlvbiBTZWFyY2gnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5wcm92aWRlcnMgfHwgIW9wdGlvbnMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucHJvdmlkZXJzID0gWyBhcmNnaXNPbmxpbmVQcm92aWRlcigpIF07XG4gICAgfVxuXG4gICAgLy8gaW5zdGFudGlhdGUgdGhlIHVuZGVybHlpbmcgY2xhc3MgYW5kIHBhc3MgYWxvbmcgb3B0aW9uc1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUgPSBnZW9zZWFyY2hDb3JlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVycyA9IG9wdGlvbnMucHJvdmlkZXJzO1xuXG4gICAgLy8gYnViYmxlIGVhY2ggcHJvdmlkZXJzIGV2ZW50cyB0byB0aGUgY29udHJvbFxuICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX3Byb3ZpZGVyc1tpXS5hZGRFdmVudFBhcmVudCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMgPSBbXTtcblxuICAgIEwuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKG9wdGlvbnMpO1xuICB9LFxuXG4gIF9yZW5kZXJTdWdnZXN0aW9uczogZnVuY3Rpb24gKHN1Z2dlc3Rpb25zKSB7XG4gICAgdmFyIGN1cnJlbnRHcm91cDtcblxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBtYXhIZWlnaHQgb2YgdGhlIHN1Z2dlc3Rpb25zIGJveCB0b1xuICAgIC8vIG1hcCBoZWlnaHRcbiAgICAvLyAtIHN1Z2dlc3Rpb25zIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2Ygc3VnZ2VzdGlvbnMgdG8gdG9wIG9mIGNvbnRyb2wpXG4gICAgLy8gLSBjb250cm9sIG9mZnNldCAoZGlzdGFuY2UgZnJvbSB0b3Agb2YgY29udHJvbCB0byB0b3Agb2YgbWFwKVxuICAgIC8vIC0gMTAgKGV4dHJhIHBhZGRpbmcpXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUubWF4SGVpZ2h0ID0gKHRoaXMuX21hcC5nZXRTaXplKCkueSAtIHRoaXMuX3N1Z2dlc3Rpb25zLm9mZnNldFRvcCAtIHRoaXMuX3dyYXBwZXIub2Zmc2V0VG9wIC0gMTApICsgJ3B4JztcblxuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciBsaXN0O1xuICAgIHZhciBoZWFkZXI7XG4gICAgdmFyIHN1Z2dlc3Rpb25UZXh0QXJyYXkgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uID0gc3VnZ2VzdGlvbnNbaV07XG4gICAgICBpZiAoIWhlYWRlciAmJiB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wcm92aWRlcnMubGVuZ3RoID4gMSAmJiBjdXJyZW50R3JvdXAgIT09IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbCkge1xuICAgICAgICBoZWFkZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdzcGFuJywgJ2dlb2NvZGVyLWNvbnRyb2wtaGVhZGVyJywgdGhpcy5fc3VnZ2VzdGlvbnMpO1xuICAgICAgICBoZWFkZXIudGV4dENvbnRlbnQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGhlYWRlci5pbm5lclRleHQgPSBzdWdnZXN0aW9uLnByb3ZpZGVyLm9wdGlvbnMubGFiZWw7XG4gICAgICAgIGN1cnJlbnRHcm91cCA9IHN1Z2dlc3Rpb24ucHJvdmlkZXIub3B0aW9ucy5sYWJlbDtcbiAgICAgICAgbm9kZXMucHVzaChoZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgbGlzdCA9IEwuRG9tVXRpbC5jcmVhdGUoJ3VsJywgJ2dlb2NvZGVyLWNvbnRyb2wtbGlzdCcsIHRoaXMuX3N1Z2dlc3Rpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN1Z2dlc3Rpb25UZXh0QXJyYXkuaW5kZXhPZihzdWdnZXN0aW9uLnRleHQpID09PSAtMSkge1xuICAgICAgICB2YXIgc3VnZ2VzdGlvbkl0ZW0gPSBMLkRvbVV0aWwuY3JlYXRlKCdsaScsICdnZW9jb2Rlci1jb250cm9sLXN1Z2dlc3Rpb24nLCBsaXN0KTtcblxuICAgICAgICBzdWdnZXN0aW9uSXRlbS5pbm5lckhUTUwgPSBzdWdnZXN0aW9uLnRleHQ7XG4gICAgICAgIHN1Z2dlc3Rpb25JdGVtLnByb3ZpZGVyID0gc3VnZ2VzdGlvbi5wcm92aWRlcjtcbiAgICAgICAgc3VnZ2VzdGlvbkl0ZW1bJ2RhdGEtbWFnaWMta2V5J10gPSBzdWdnZXN0aW9uLm1hZ2ljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaXN0LmNoaWxkTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAvLyBpZiB0aGUgc2FtZSB0ZXh0IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucywgYXBwZW5kIGFuIGFkZGl0aW9uYWwgT2JqZWN0SUQgdG8gaXRzIG1hZ2ljS2V5IGluc3RlYWRcbiAgICAgICAgICBpZiAobGlzdC5jaGlsZE5vZGVzW2pdLmlubmVySFRNTCA9PT0gc3VnZ2VzdGlvbi50ZXh0KSB7XG4gICAgICAgICAgICBsaXN0LmNoaWxkTm9kZXNbal1bJ2RhdGEtbWFnaWMta2V5J10gKz0gJywnICsgc3VnZ2VzdGlvbi5tYWdpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1Z2dlc3Rpb25UZXh0QXJyYXkucHVzaChzdWdnZXN0aW9uLnRleHQpO1xuICAgIH1cblxuICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuXG4gICAgbm9kZXMucHVzaChsaXN0KTtcblxuICAgIHJldHVybiBub2RlcztcbiAgfSxcblxuICBfYm91bmRzRnJvbVJlc3VsdHM6IGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBudWxsSXNsYW5kID0gTC5sYXRMbmdCb3VuZHMoWzAsIDBdLCBbMCwgMF0pO1xuICAgIHZhciByZXN1bHRCb3VuZHMgPSBbXTtcbiAgICB2YXIgcmVzdWx0TGF0bG5ncyA9IFtdO1xuXG4gICAgLy8gY29sbGVjdCB0aGUgYm91bmRzIGFuZCBjZW50ZXIgb2YgZWFjaCByZXN1bHRcbiAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgIHJlc3VsdExhdGxuZ3MucHVzaChyZXN1bHQubGF0bG5nKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGJvdW5kcyBhcmUgdmFsaWQgYW5kIG5vdCAwLDAuIHNvbWV0aW1lcyBib3VuZHMgYXJlIGluY29ycmVjdCBvciBub3QgcHJlc2VudFxuICAgICAgaWYgKHJlc3VsdC5ib3VuZHMgJiYgcmVzdWx0LmJvdW5kcy5pc1ZhbGlkKCkgJiYgIXJlc3VsdC5ib3VuZHMuZXF1YWxzKG51bGxJc2xhbmQpKSB7XG4gICAgICAgIHJlc3VsdEJvdW5kcy5wdXNoKHJlc3VsdC5ib3VuZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gYSBib3VuZHMgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGNlbnRlciBwb2ludHNcbiAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMocmVzdWx0TGF0bG5ncyk7XG5cbiAgICAvLyBhbmQgZXh0ZW5kIGl0IHRvIGNvbnRhaW4gYWxsIGJvdW5kcyBvYmplY3RzXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXN1bHRCb3VuZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGJvdW5kcy5leHRlbmQocmVzdWx0Qm91bmRzW2pdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9LFxuXG4gIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsYXBzZUFmdGVyUmVzdWx0KSB7XG4gICAgICB0aGlzLl9pbnB1dC5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiB0aGlzLl9tYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgIHRoaXMuX21hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgfVxuICB9LFxuXG4gIGNsZWFyU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbm9kZXMpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5fbm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX25vZGVzW2tdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5yZW1vdmVDaGlsZCh0aGlzLl9ub2Rlc1trXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX3NldHVwQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB0aGlzLl9pbnB1dC5mb2N1cygpO1xuICB9LFxuXG4gIGRpc2FibGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1pbnB1dC1kaXNhYmxlZCcpO1xuICAgIEwuRG9tRXZlbnQucmVtb3ZlTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG4gIH0sXG5cbiAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5faW5wdXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5faW5wdXQsICdnZW9jb2Rlci1jb250cm9sLWlucHV0LWRpc2FibGVkJyk7XG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl93cmFwcGVyLCAnY2xpY2snLCB0aGlzLl9zZXR1cENsaWNrLCB0aGlzKTtcbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBhdHRyaWJzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3Byb3ZpZGVyc1tpXS5vcHRpb25zLmF0dHJpYnV0aW9uKSB7XG4gICAgICAgIGF0dHJpYnMucHVzaCh0aGlzLl9wcm92aWRlcnNbaV0ub3B0aW9ucy5hdHRyaWJ1dGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnMuam9pbignLCAnKTtcbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIC8vIGluY2x1ZGUgJ1Bvd2VyZWQgYnkgRXNyaScgaW4gbWFwIGF0dHJpYnV0aW9uXG4gICAgVXRpbC5zZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl93cmFwcGVyID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2JywgJ2dlb2NvZGVyLWNvbnRyb2wnKTtcbiAgICB0aGlzLl9pbnB1dCA9IEwuRG9tVXRpbC5jcmVhdGUoJ2lucHV0JywgJ2dlb2NvZGVyLWNvbnRyb2wtaW5wdXQgbGVhZmxldC1iYXInLCB0aGlzLl93cmFwcGVyKTtcbiAgICB0aGlzLl9pbnB1dC50aXRsZSA9IHRoaXMub3B0aW9ucy50aXRsZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwYW5kZWQpIHtcbiAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl93cmFwcGVyLCAnZ2VvY29kZXItY29udHJvbC1leHBhbmRlZCcpO1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgdGhpcy5fc3VnZ2VzdGlvbnMgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9ucyBsZWFmbGV0LWJhcicsIHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgdmFyIGNyZWRpdHMgPSB0aGlzLl9nZW9zZWFyY2hDb3JlLl9nZXRBdHRyaWJ1dGlvbigpO1xuICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oY3JlZGl0cyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX2lucHV0LCAnZm9jdXMnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5faW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fd3JhcHBlciwgJ2dlb2NvZGVyLWNvbnRyb2wtZXhwYW5kZWQnKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIEwuRG9tRXZlbnQuYWRkTGlzdGVuZXIodGhpcy5fd3JhcHBlciwgJ2NsaWNrJywgdGhpcy5fc2V0dXBDbGljaywgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uSXRlbSA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc3VnZ2VzdGlvbkl0ZW0uaW5uZXJIVE1MLCBzdWdnZXN0aW9uSXRlbVsnZGF0YS1tYWdpYy1rZXknXSwgc3VnZ2VzdGlvbkl0ZW0ucHJvdmlkZXIpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2JsdXInLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRleHQgPSAoZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KS52YWx1ZTtcblxuICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3dyYXBwZXIsICdnZW9jb2Rlci1jb250cm9sLWV4cGFuZGVkJyk7XG5cbiAgICAgIHZhciBsaXN0ID0gdGhpcy5fc3VnZ2VzdGlvbnMucXVlcnlTZWxlY3RvckFsbCgnLicgKyAnZ2VvY29kZXItY29udHJvbC1zdWdnZXN0aW9uJyk7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLl9zdWdnZXN0aW9ucy5xdWVyeVNlbGVjdG9yQWxsKCcuJyArICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJylbMF07XG4gICAgICB2YXIgc2VsZWN0ZWRQb3NpdGlvbjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChsaXN0W2ldID09PSBzZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkUG9zaXRpb24gPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgLypcbiAgICAgICAgICAgIGlmIGFuIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQsIGdlb2NvZGUgaXRcbiAgICAgICAgICAgIGlmIGZvY3VzIGlzIG9uIHRoZSBpbnB1dCB0ZXh0Ym94LCBnZW9jb2RlIG9ubHkgaWYgbXVsdGlwbGUgcmVzdWx0cyBhcmUgYWxsb3dlZCBhbmQgbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50LCBvciBpZiBhIHNpbmdsZSBzdWdnZXN0aW9uIGlzIGRpc3BsYXllZC5cbiAgICAgICAgICAgIGlmIGxlc3MgdGhhbiB0d28gY2hhcmFjdGVycyBoYXZlIGJlZW4gdHlwZWQsIGFib3J0IHRoZSBnZW9jb2RlXG4gICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUoc2VsZWN0ZWQuaW5uZXJIVE1MLCBzZWxlY3RlZFsnZGF0YS1tYWdpYy1rZXknXSwgc2VsZWN0ZWQucHJvdmlkZXIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmFsbG93TXVsdGlwbGVSZXN1bHRzICYmIHRleHQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb3NlYXJjaENvcmUuX2dlb2NvZGUodGhpcy5faW5wdXQudmFsdWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFswXSwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fZ2VvY29kZShsaXN0WzBdLmlubmVySFRNTCwgbGlzdFswXVsnZGF0YS1tYWdpYy1rZXknXSwgbGlzdFswXS5wcm92aWRlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2lucHV0LmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgTC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgJ2dlb2NvZGVyLWNvbnRyb2wtc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcHJldmlvdXNJdGVtID0gbGlzdFtzZWxlY3RlZFBvc2l0aW9uIC0gMV07XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgcHJldmlvdXNJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MocHJldmlvdXNJdGVtLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobGlzdFtsaXN0Lmxlbmd0aCAtIDFdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgTC5Eb21VdGlsLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0SXRlbSA9IGxpc3Rbc2VsZWN0ZWRQb3NpdGlvbiArIDFdO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkICYmIG5leHRJdGVtKSB7XG4gICAgICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3MobmV4dEl0ZW0sICdnZW9jb2Rlci1jb250cm9sLXNlbGVjdGVkJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyhsaXN0WzBdLCAnZ2VvY29kZXItY29udHJvbC1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMgd2Ugc2hvdWxkIGNhbmNlbCBhbGwgcGVuZGluZyBzdWdnZXN0aW9uIHJlcXVlc3RzIGlmIHBvc3NpYmxlIHRvIGF2b2lkIHJlc3VsdCBjb2xsaXNpb25zXG4gICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLl9nZW9zZWFyY2hDb3JlLl9wZW5kaW5nU3VnZ2VzdGlvbnMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fcGVuZGluZ1N1Z2dlc3Rpb25zW3hdO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC5hYm9ydCAmJiAhcmVxdWVzdC5pZCkge1xuICAgICAgICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9pbnB1dCwgJ2tleXVwJywgTC5VdGlsLnRocm90dGxlKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIga2V5ID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgICB2YXIgdGV4dCA9IChlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAvLyByZXF1aXJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGVzY2FwZSBrZXkgaXQgd2lsbCBjbGVhciB0aGUgaW5wdXQgc28gY2xlYXIgc3VnZ2VzdGlvbnNcbiAgICAgIGlmIChrZXkgPT09IDI3KSB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoaXMgaXMgTk9UIHRoZSB1cC9kb3duIGFycm93cyBvciBlbnRlciBtYWtlIGEgc3VnZ2VzdGlvblxuICAgICAgaWYgKGtleSAhPT0gMTMgJiYga2V5ICE9PSAzOCAmJiBrZXkgIT09IDQwKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dC52YWx1ZSAhPT0gdGhpcy5fbGFzdFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdGhpcy5faW5wdXQudmFsdWU7XG4gICAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2lucHV0LCAnZ2VvY29kZXItY29udHJvbC1sb2FkaW5nJyk7XG4gICAgICAgICAgdGhpcy5fZ2Vvc2VhcmNoQ29yZS5fc3VnZ2VzdCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDUwLCB0aGlzKSwgdGhpcyk7XG5cbiAgICBMLkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKHRoaXMuX3dyYXBwZXIpO1xuXG4gICAgLy8gd2hlbiBtb3VzZSBtb3ZlcyBvdmVyIHN1Z2dlc3Rpb25zIGRpc2FibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGVuYWJsZWRcbiAgICBMLkRvbUV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX3N1Z2dlc3Rpb25zLCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKSAmJiBtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20pIHtcbiAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB3aGVuIG1vdXNlIG1vdmVzIGxlYXZlcyBzdWdnZXN0aW9ucyBlbmFibGUgc2Nyb2xsIHdoZWVsIHpvb20gaWYgaXRzIGRpc2FibGVkXG4gICAgTC5Eb21FdmVudC5hZGRMaXN0ZW5lcih0aGlzLl9zdWdnZXN0aW9ucywgJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGVkKCkgJiYgbWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tKSB7XG4gICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9nZW9zZWFyY2hDb3JlLm9uKCdsb2FkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIEwuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9pbnB1dCwgJ2dlb2NvZGVyLWNvbnRyb2wtbG9hZGluZycpO1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5faW5wdXQuYmx1cigpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3dyYXBwZXI7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2Vvc2VhcmNoIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2Vvc2VhcmNoKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9zZWFyY2g7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IEZlYXR1cmVMYXllclNlcnZpY2UgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgdmFyIEZlYXR1cmVMYXllclByb3ZpZGVyID0gRmVhdHVyZUxheWVyU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdGZWF0dXJlIExheWVyJyxcbiAgICBtYXhSZXN1bHRzOiA1LFxuICAgIGJ1ZmZlclJhZGl1czogMTAwMCxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1t0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzWzBdXTtcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTGF5ZXJTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkcyA9IFt0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzXTtcbiAgICB9XG4gICAgdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeSA9IHRoaXMucXVlcnkoKTtcbiAgICB0aGlzLl9yZXN1bHRzUXVlcnkgPSB0aGlzLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgc3VnZ2VzdGlvbnM6IGZ1bmN0aW9uICh0ZXh0LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fc3VnZ2VzdGlvbnNRdWVyeS53aGVyZSh0aGlzLl9idWlsZFF1ZXJ5KHRleHQpKVxuICAgICAgLnJldHVybkdlb21ldHJ5KGZhbHNlKTtcblxuICAgIGlmIChib3VuZHMpIHtcbiAgICAgIHF1ZXJ5LmludGVyc2VjdHMoYm91bmRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmlkRmllbGQpIHtcbiAgICAgIHF1ZXJ5LmZpZWxkcyhbdGhpcy5vcHRpb25zLmlkRmllbGRdLmNvbmNhdCh0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBxdWVyeS5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSByYXcub2JqZWN0SWRGaWVsZE5hbWU7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gcmVzdWx0cy5mZWF0dXJlc1tpXTtcbiAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICBtYWdpY0tleTogZmVhdHVyZS5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCBzdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciBxdWVyeSA9IHRoaXMuX3Jlc3VsdHNRdWVyeTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGRlbGV0ZSBxdWVyeS5wYXJhbXMud2hlcmU7XG4gICAgICBxdWVyeS5mZWF0dXJlSWRzKFtrZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkud2hlcmUodGhpcy5fYnVpbGRRdWVyeSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcXVlcnkud2l0aGluKGJvdW5kcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5LnJ1bihMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVzKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzLmZlYXR1cmVzW2ldO1xuICAgICAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9mZWF0dXJlQm91bmRzKGZlYXR1cmUpO1xuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGxhdGxuZzogYm91bmRzLmdldENlbnRlcigpLFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMuZm9ybWF0U3VnZ2VzdGlvbi5jYWxsKHRoaXMsIGZlYXR1cmUpLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICAgIC8vIGNsZWFyIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBuZXh0IHNlYXJjaFxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXN1bHRzUXVlcnkucGFyYW1zWydvYmplY3RJZHMnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdHMpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIHRoaXMuX3N1Z2dlc3Rpb25zUXVlcnkub3JkZXJCeShmaWVsZE5hbWUsIG9yZGVyKTtcbiAgfSxcblxuICBfYnVpbGRRdWVyeTogZnVuY3Rpb24gKHRleHQpIHtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSB0aGlzLm9wdGlvbnMuc2VhcmNoRmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZmllbGQgPSAndXBwZXIoXCInICsgdGhpcy5vcHRpb25zLnNlYXJjaEZpZWxkc1tpXSArICdcIiknO1xuXG4gICAgICBxdWVyeVN0cmluZy5wdXNoKGZpZWxkICsgXCIgTElLRSB1cHBlcignJVwiICsgdGV4dCArIFwiJScpXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMud2hlcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud2hlcmUgKyAnIEFORCAoJyArIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKSArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nLmpvaW4oJyBPUiAnKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZlYXR1cmVCb3VuZHM6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb2pzb24gPSBMLmdlb0pzb24oZmVhdHVyZSk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgdmFyIGNlbnRlciA9IGdlb2pzb24uZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7XG4gICAgICB2YXIgbG5nUmFkaXVzID0gKCh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwKSAvIE1hdGguY29zKCgxODAgLyBNYXRoLlBJKSAqIGNlbnRlci5sYXQpO1xuICAgICAgdmFyIGxhdFJhZGl1cyA9ICh0aGlzLm9wdGlvbnMuYnVmZmVyUmFkaXVzIC8gNDAwNzUwMTcpICogMzYwO1xuICAgICAgcmV0dXJuIEwubGF0TG5nQm91bmRzKFtjZW50ZXIubGF0IC0gbGF0UmFkaXVzLCBjZW50ZXIubG5nIC0gbG5nUmFkaXVzXSwgW2NlbnRlci5sYXQgKyBsYXRSYWRpdXMsIGNlbnRlci5sbmcgKyBsbmdSYWRpdXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdlb2pzb24uZ2V0Qm91bmRzKCk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllclByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyUHJvdmlkZXIob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZlYXR1cmVMYXllclByb3ZpZGVyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBNYXBTZXJ2aWNlIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBNYXBTZXJ2aWNlUHJvdmlkZXIgPSBNYXBTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBsYXllcnM6IFswXSxcbiAgICBsYWJlbDogJ01hcCBTZXJ2aWNlJyxcbiAgICBidWZmZXJSYWRpdXM6IDEwMDAsXG4gICAgbWF4UmVzdWx0czogNSxcbiAgICBmb3JtYXRTdWdnZXN0aW9uOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllc1tmZWF0dXJlLmRpc3BsYXlGaWVsZE5hbWVdICsgJyA8c21hbGw+JyArIGZlYXR1cmUubGF5ZXJOYW1lICsgJzwvc21hbGw+JztcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBNYXBTZXJ2aWNlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fZ2V0SWRGaWVsZHMoKTtcbiAgfSxcblxuICBzdWdnZXN0aW9uczogZnVuY3Rpb24gKHRleHQsIGJvdW5kcywgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLnJldHVybkdlb21ldHJ5KGZhbHNlKS5sYXllcnModGhpcy5vcHRpb25zLmxheWVycyk7XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzLCByYXcpIHtcbiAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICB2YXIgY291bnQgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4UmVzdWx0cywgcmVzdWx0cy5mZWF0dXJlcy5sZW5ndGgpO1xuICAgICAgICByYXcucmVzdWx0cyA9IHJhdy5yZXN1bHRzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXN1bHRzLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIHZhciByZXN1bHQgPSByYXcucmVzdWx0c1tpXTtcbiAgICAgICAgICB2YXIgbGF5ZXIgPSByZXN1bHQubGF5ZXJJZDtcbiAgICAgICAgICB2YXIgaWRGaWVsZCA9IHRoaXMuX2lkRmllbGRzW2xheWVyXTtcbiAgICAgICAgICBmZWF0dXJlLmxheWVySWQgPSBsYXllcjtcbiAgICAgICAgICBmZWF0dXJlLmxheWVyTmFtZSA9IHRoaXMuX2xheWVyTmFtZXNbbGF5ZXJdO1xuICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuICAgICAgICAgIGlmIChpZEZpZWxkKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dDogdGhpcy5vcHRpb25zLmZvcm1hdFN1Z2dlc3Rpb24uY2FsbCh0aGlzLCBmZWF0dXJlKSxcbiAgICAgICAgICAgICAgbWFnaWNLZXk6IHJlc3VsdC5hdHRyaWJ1dGVzW2lkRmllbGRdICsgJzonICsgbGF5ZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyb3IsIHN1Z2dlc3Rpb25zLnJldmVyc2UoKSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgcmVzdWx0czogZnVuY3Rpb24gKHRleHQsIGtleSwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICB2YXIgZmVhdHVyZUlkID0ga2V5LnNwbGl0KCc6JylbMF07XG4gICAgICB2YXIgbGF5ZXIgPSBrZXkuc3BsaXQoJzonKVsxXTtcbiAgICAgIHJlcXVlc3QgPSB0aGlzLnF1ZXJ5KCkubGF5ZXIobGF5ZXIpLmZlYXR1cmVJZHMoZmVhdHVyZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdCA9IHRoaXMuZmluZCgpLnRleHQodGV4dCkuZmllbGRzKHRoaXMub3B0aW9ucy5zZWFyY2hGaWVsZHMpLmxheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlcywgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXMuZmVhdHVyZXNbaV07XG4gICAgICAgICAgbGF5ZXIgPSBsYXllciB8fCByZXNwb25zZS5yZXN1bHRzW2ldLmxheWVySWQ7XG5cbiAgICAgICAgICBpZiAoZmVhdHVyZSAmJiBsYXllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fZmVhdHVyZUJvdW5kcyhmZWF0dXJlKTtcbiAgICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IGxheWVyO1xuICAgICAgICAgICAgZmVhdHVyZS5sYXllck5hbWUgPSB0aGlzLl9sYXllck5hbWVzW2xheWVyXTtcbiAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheUZpZWxkTmFtZSA9IHRoaXMuX2Rpc3BsYXlGaWVsZHNbbGF5ZXJdO1xuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICBsYXRsbmc6IGJvdW5kcy5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5mb3JtYXRTdWdnZXN0aW9uLmNhbGwodGhpcywgZmVhdHVyZSksXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgZ2VvanNvbjogZmVhdHVyZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0cy5yZXZlcnNlKCkpO1xuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIF9mZWF0dXJlQm91bmRzOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciBnZW9qc29uID0gTC5nZW9Kc29uKGZlYXR1cmUpO1xuICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgIHZhciBjZW50ZXIgPSBnZW9qc29uLmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgICAgdmFyIGxuZ1JhZGl1cyA9ICgodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MCkgLyBNYXRoLmNvcygoMTgwIC8gTWF0aC5QSSkgKiBjZW50ZXIubGF0KTtcbiAgICAgIHZhciBsYXRSYWRpdXMgPSAodGhpcy5vcHRpb25zLmJ1ZmZlclJhZGl1cyAvIDQwMDc1MDE3KSAqIDM2MDtcbiAgICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyhbY2VudGVyLmxhdCAtIGxhdFJhZGl1cywgY2VudGVyLmxuZyAtIGxuZ1JhZGl1c10sIFtjZW50ZXIubGF0ICsgbGF0UmFkaXVzLCBjZW50ZXIubG5nICsgbG5nUmFkaXVzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW9qc29uLmdldEJvdW5kcygpO1xuICAgIH1cbiAgfSxcblxuICBfbGF5ZXJNZXRhZGF0YUNhbGxiYWNrOiBmdW5jdGlvbiAobGF5ZXJpZCkge1xuICAgIHJldHVybiBMLlV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIG1ldGFkYXRhKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLl9kaXNwbGF5RmllbGRzW2xheWVyaWRdID0gbWV0YWRhdGEuZGlzcGxheUZpZWxkO1xuICAgICAgdGhpcy5fbGF5ZXJOYW1lc1tsYXllcmlkXSA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGFkYXRhLmZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmllbGQgPSBtZXRhZGF0YS5maWVsZHNbaV07XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZXNyaUZpZWxkVHlwZU9JRCcpIHtcbiAgICAgICAgICB0aGlzLl9pZEZpZWxkc1tsYXllcmlkXSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBfZ2V0SWRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9pZEZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZHMgPSB7fTtcbiAgICB0aGlzLl9sYXllck5hbWVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJzW2ldO1xuICAgICAgdGhpcy5nZXQobGF5ZXIsIHt9LCB0aGlzLl9sYXllck1ldGFkYXRhQ2FsbGJhY2sobGF5ZXIpKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFwU2VydmljZVByb3ZpZGVyIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTWFwU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBTZXJ2aWNlUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBHZW9jb2RlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG5leHBvcnQgdmFyIEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgPSBHZW9jb2RlU2VydmljZS5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbGFiZWw6ICdHZW9jb2RlIFNlcnZlcicsXG4gICAgbWF4UmVzdWx0czogNVxuICB9LFxuXG4gIHN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydHNTdWdnZXN0KSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHRoaXMuc3VnZ2VzdCgpLnRleHQodGV4dCk7XG4gICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgIHJlcXVlc3Qud2l0aGluKGJvdW5kcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXF1ZXN0LnJ1bihmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgd2hpbGUgKHJlc3BvbnNlLnN1Z2dlc3Rpb25zLmxlbmd0aCAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPD0gKHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzIC0gMSkpIHtcbiAgICAgICAgICAgIHZhciBzdWdnZXN0aW9uID0gcmVzcG9uc2Uuc3VnZ2VzdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghc3VnZ2VzdGlvbi5pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogc3VnZ2VzdGlvbi50ZXh0LFxuICAgICAgICAgICAgICAgIG1hZ2ljS2V5OiBzdWdnZXN0aW9uLm1hZ2ljS2V5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnJvciwgc3VnZ2VzdGlvbnMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgW10pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICByZXN1bHRzOiBmdW5jdGlvbiAodGV4dCwga2V5LCBib3VuZHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHJlcXVlc3QgPSB0aGlzLmdlb2NvZGUoKS50ZXh0KHRleHQpO1xuXG4gICAgcmVxdWVzdC5tYXhMb2NhdGlvbnModGhpcy5vcHRpb25zLm1heFJlc3VsdHMpO1xuXG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgcmVxdWVzdC53aXRoaW4oYm91bmRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdC5ydW4oZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZW9jb2RlU2VydmljZVByb3ZpZGVyKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW9jb2RlU2VydmljZVByb3ZpZGVyO1xuIiwiZXhwb3J0IHsgdmVyc2lvbiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCB2YXIgV29ybGRHZW9jb2RpbmdTZXJ2aWNlVXJsID0gJ2h0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXIvJztcblxuLy8gaW1wb3J0IHRhc2tzXG5leHBvcnQgeyBHZW9jb2RlLCBnZW9jb2RlIH0gZnJvbSAnLi9UYXNrcy9HZW9jb2RlJztcbmV4cG9ydCB7IFJldmVyc2VHZW9jb2RlLCByZXZlcnNlR2VvY29kZSB9IGZyb20gJy4vVGFza3MvUmV2ZXJzZUdlb2NvZGUnO1xuZXhwb3J0IHsgU3VnZ2VzdCwgc3VnZ2VzdCB9IGZyb20gJy4vVGFza3MvU3VnZ2VzdCc7XG5cbi8vIGltcG9ydCBzZXJ2aWNlXG5leHBvcnQgeyBHZW9jb2RlU2VydmljZSwgZ2VvY29kZVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL0dlb2NvZGUnO1xuXG4vLyBpbXBvcnQgY29udHJvbFxuZXhwb3J0IHsgR2Vvc2VhcmNoLCBnZW9zZWFyY2ggfSBmcm9tICcuL0NvbnRyb2xzL0dlb3NlYXJjaCc7XG5cbi8vIGltcG9ydCBzdXBwb3J0aW5nIGNsYXNzXG5leHBvcnQgeyBHZW9zZWFyY2hDb3JlLCBnZW9zZWFyY2hDb3JlIH0gZnJvbSAnLi9DbGFzc2VzL0dlb3NlYXJjaENvcmUnO1xuXG4vLyBpbXBvcnQgcHJvdmlkZXJzXG5leHBvcnQgeyBBcmNnaXNPbmxpbmVQcm92aWRlciwgYXJjZ2lzT25saW5lUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9BcmNnaXNPbmxpbmVHZW9jb2Rlcic7XG5leHBvcnQgeyBGZWF0dXJlTGF5ZXJQcm92aWRlciwgZmVhdHVyZUxheWVyUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9GZWF0dXJlTGF5ZXInO1xuZXhwb3J0IHsgTWFwU2VydmljZVByb3ZpZGVyLCBtYXBTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9NYXBTZXJ2aWNlJztcbmV4cG9ydCB7IEdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIsIGdlb2NvZGVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuL1Byb3ZpZGVycy9HZW9jb2RlU2VydmljZSc7XG4iXSwibmFtZXMiOlsiVGFzayIsIlV0aWwiLCJTZXJ2aWNlIiwiRmVhdHVyZUxheWVyU2VydmljZSIsIk1hcFNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NJTyxJQUFJLE9BQU8sR0FBR0EsZ0JBQUksQ0FBQyxNQUFNLENBQUM7QUFDakMsQ0FBQSxFQUFFLElBQUksRUFBRSx1QkFBdUI7O0FBRS9CLENBQUEsRUFBRSxNQUFNLEVBQUU7QUFDVixDQUFBLElBQUksS0FBSyxFQUFFLElBQUk7QUFDZixDQUFBLElB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QU07QUFDWCxDQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckcsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUM1RCxDQUFBLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNsQixDQUFBLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO0FBQzlCLENBQUEsVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEQsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzRCxDQUFBLFVBQVUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFBLFVBQVUsS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7QUFFdkQsQ0FBQSxVQUFVLElBQUksT0FBTyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDOUMsQ0FBQSxZQUFZLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsQ0FBQSxZQUFZLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLENBQUEsWUFBWSxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFD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 \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-gp-2.0.1.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,281 @@ +/* esri-leaflet-gp - v2.0.1 - Fri Sep 09 2016 14:42:04 GMT-0700 (PDT) + * Copyright (c) 2016 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.GP = global.L.esri.GP || {}),global.L,global.L.esri)); +}(this, function (exports,L,esriLeaflet) { 'use strict'; + + L = 'default' in L ? L['default'] : L; + + var version = "2.0.1"; + + var Task$1 = esriLeaflet.Task.extend({ + + includes: L.Mixin.Events, + + // setters: {}, we don't use these because we don't know the ParamName OR value of custom GP services + params: {}, + resultParams: {}, + + initialize: function (options) { + // don't replace parent initialize + esriLeaflet.Task.prototype.initialize.call(this, options); + + // if path isn't supplied in options, try and determine if its sync or async to set automatically + if (!this.options.path) { + // assume initially, that service is synchronous + this.options.async = false; + this.options.path = 'execute'; + + // the parameters below seem wonky to me, but work for both CORS and JSONP requests + this._service.metadata(function (error, results) { + if (!error) { + if (results.executionType === 'esriExecutionTypeSynchronous') { + this.options.async = false; + this.options.path = 'execute'; + } else { + this.options.async = true; + this.options.path = 'submitJob'; + } + this.fire('initialized'); + } else { + // if check fails, hopefully its synchronous + this.options.async = false; + this.options.path = 'execute'; + return; + } + }, this); + } else { + // if path is custom, hopefully its synchronous + if (this.options.async !== true && this.options.path !== 'submitJob') { + this.options.async = false; + } + } + }, + + // doc for various GPInput types can be found here + // http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/GP_Result/02r3000000q7000000/ + + // set booleans, numbers, strings + setParam: function (paramName, paramValue) { + if (typeof paramValue === 'boolean') { + this.params[paramName] = paramValue; + return; + } else if (typeof paramValue !== 'object') { // strings, numbers + this.params[paramName] = paramValue; + return; + } else { + // otherwise assume its latlng, marker, bounds or geojson + this._setGeometry(paramName, paramValue); + } + }, + + // not sure how best to handle passing more than one parameter at once + // setParams: function(inputArray) { + // if (L.Util.isArray(inputArray)) { + // for (var i = 0; i < inputArray.length; i++) { + // this.setParam(inputArray[i]); + // } + // } + // }, + + // give developer opportunity to point out where the output is going to be available + setOutputParam: function (paramName) { + this.params.outputParam = paramName; + }, + + /* necessary because of the design requirement that resultParams be specified + for async elevation services in order to get Zs (unnecessarily confusing)*/ + gpAsyncResultParam: function (paramName, paramValue) { + this.resultParams[paramName] = paramValue; + }, + + // we currently expect a single geometry or feature (ported from: Tasks.Query._setGeometry) + _setGeometry: function (paramName, geometry) { + var processedInput = { + 'geometryType': '', + 'features': [] + }; + + // convert bounds to extent and finish + if (geometry instanceof L.LatLngBounds) { + // set geometry + type + processedInput.features.push({'geometry': L.esri.Util.boundsToExtent(geometry)}); + processedInput.geometryType = L.esri.Util.geojsonTypeToArcGIS(geometry.type); + } + + // convert L.Marker > L.LatLng + if (geometry.getLatLng) { + geometry = geometry.getLatLng(); + } + + // convert L.LatLng to a geojson point and continue; + if (geometry instanceof L.LatLng) { + geometry = { + type: 'Point', + coordinates: [geometry.lng, geometry.lat] + }; + } + + // handle L.GeoJSON, pull out the first geometry + if (geometry instanceof L.GeoJSON) { + // reassign geometry to the GeoJSON value (we are assuming that only one feature is present) + geometry = geometry.getLayers()[0].feature.geometry; + processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)}); + processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type); + } + + // Handle L.Polyline and L.Polygon + if (geometry.toGeoJSON) { + geometry = geometry.toGeoJSON(); + } + + // handle GeoJSON feature by pulling out the geometry + if (geometry.type === 'Feature') { + // get the geometry of the geojson feature + geometry = geometry.geometry; + } + + // confirm that our GeoJSON is a point, line or polygon + if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon') { + processedInput.features.push({'geometry': esriLeaflet.Util.geojsonToArcGIS(geometry)}); + processedInput.geometryType = esriLeaflet.Util.geojsonTypeToArcGIS(geometry.type); + } else { + if (console && console.warn) { + console.warn('invalid geometry passed as GP input. Should be an L.LatLng, L.LatLngBounds, L.Marker or GeoJSON Point Line or Polygon object'); + } + } + + this.params[paramName] = processedInput; + return; + }, + + run: function (callback, context) { + this._done = false; + + if (this.options.async === true) { + /* eslint-disable */ + this._service.request(this.options.path, this.params, function (error, response) { + this._currentJobId = response.jobId; + this.checkJob(this._currentJobId, callback, context); + }, this); + /* eslint-enable */ + } else { + return this._service.request(this.options.path, this.params, function (error, response) { + callback.call(context, error, (response && this.processGPOutput(response)), response); + }, this); + } + }, + + checkJob: function (jobId, callback, context) { + var pollJob = function () { + /* eslint-disable */ + this._service.request('jobs/' + jobId, {}, function polledJob (error, response) { + if (response.jobStatus === 'esriJobSucceeded') { + if (!this._done) { + this._done = true; + // to do: + // refactor to make an array of async requests for output + this._service.request('jobs/' + jobId + '/results/' + this.params.outputParam, this.resultParams, function processJobResult (error, response) { + callback.call(context, error, (response && this.processAsyncOutput(response)), response); + }, this); + } + window.clearInterval(counter); + } else if (response.jobStatus === 'esriJobFailed') { + callback.call(context, 'Job Failed', null); + window.clearInterval(counter); + } + }, this); + /* eslint-enable */ + }.bind(this); + + var counter = window.setInterval(pollJob, this._service.options.asyncInterval * 1000); + }, + + processGPOutput: function (response) { + var processedResponse = {}; + + // grab syncronous results + if (this.options.async === false) { + // loop through results and pass back, parsing esri json + for (var i = 0; i < response.results.length; i++) { + /* jshint ignore:start */ + processedResponse[response.results[i].paramName]; + /* jshint ignore:end */ + if (response.results[i].dataType === 'GPFeatureRecordSetLayer') { + var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.results[i].value); + processedResponse[response.results[i].paramName] = featureCollection; + } else { + processedResponse[response.results[i].paramName] = response.results[i].value; + } + } + } else { // grab async results slightly differently + processedResponse.jobId = this._currentJobId; + // var responseValue = response.value; + } + + // if output is a raster layer, we also need to stub out a MapService url using jobid + if (this.options.async === true && response.dataType === 'GPRasterDataLayer') { + var baseURL = this.options.url; + var n = baseURL.indexOf('GPServer'); + var serviceURL = baseURL.slice(0, n) + 'MapServer/'; + processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId; + } + + return processedResponse; + }, + + processAsyncOutput: function (response) { + var processedResponse = {}; + processedResponse.jobId = this._currentJobId; + + // if output is a raster layer, we also need to stub out a MapService url using jobid + if (this.options.async === true && response.dataType === 'GPRasterDataLayer') { + var baseURL = this.options.url; + var n = baseURL.indexOf('GPServer'); + var serviceURL = baseURL.slice(0, n) + 'MapServer/'; + processedResponse.outputMapService = serviceURL + 'jobs/' + this._currentJobId; + } + + // if output is GPFeatureRecordSetLayer, convert to GeoJSON + if (response.dataType === 'GPFeatureRecordSetLayer') { + var featureCollection = esriLeaflet.Util.responseToFeatureCollection(response.value); + processedResponse[response.paramName] = featureCollection; + } else { + processedResponse[response.paramName] = response.value; + } + + return processedResponse; + } + + }); + + function task (options) { + return new Task$1(options); + } + + var Service$1 = esriLeaflet.Service.extend({ + options: { + asyncInterval: 1 + }, + + createTask: function () { + return new Task$1(this, this.options); + } + + }); + + function service (options) { + return new Service$1(options); + } + + exports.VERSION = version; + exports.Task = Task$1; + exports.task = task; + exports.Service = Service$1; + exports.service = service; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9wYWNrYWdlLmpzb24iLCIuLi9zcmMvVGFza3MvR2VvcHJvY2Vzc2luZy5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9HZW9wcm9jZXNzaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIntcbiAgXCJuYW1lXCI6IFwiZXNyaS1sZWFmbGV0LWdwXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJBIExlYWZsZXQgcGx1Z2luIGZvciBpbnRlcmFjdGluZyB3aXRoIEFyY0dJUyBnZW9wcm9jZXNzaW5nIHNlcnZpY2VzLlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMVwiLFxuICBcImF1dGhvclwiOiBcIkpvaG4gR3Jhdm9pcyA8amdyYXZvaXNAZXNyaS5jb20+IChodHRwOi8vam9obmdyYXZvaXMuY29tKVwiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1ncC1kZWJ1Zy5qc1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2pncmF2b2lzL2VzcmktbGVhZmxldC1ncC9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgICBcIk5pY2hvbGFzIEZ1cm5lc3MgPG5mdXJuZXNzQGVzcmkuY29tPiAoaHR0cDovL25peHRhLmdpdGh1Yi5pby8pXCIsXG4gICAgXCJQYXRyaWNrIEFybHQgPHBhcmx0QGVzcmkuY29tPiAoaHR0cDovL3BhdHJpY2thcmx0LmNvbSlcIixcbiAgICBcIlJvd2FuIFdpbnNlbWl1c1wiXG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtcmMuM1wiLFxuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiY2hhaVwiOiBcIjIuMy4wXCIsXG4gICAgXCJnaC1yZWxlYXNlXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJoaWdobGlnaHQuanNcIjogXCJeOC4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjMuMC4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMC4xMi4yNFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMC41LjNcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjAuMS4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4wLjIuNVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMi4wXCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMS4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJzbmF6enlcIjogXCJeMi4wLjFcIixcbiAgICBcInVnbGlmeS1qc1wiOiBcIl4yLjYuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qZ3Jhdm9pcy9lc3JpLWxlYWZsZXQtZ3BcIixcbiAgXCJqc25leHQ6bWFpblwiOiBcInNyYy9Fc3JpTGVhZmxldEdQLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0R1AuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LWdwLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdEBnaXRodWIuY29tOmpncmF2b2lzL2VzcmktbGVhZmxldC1ncC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKiovKi5qcyB8IHNuYXp6eVwiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIixcbiAgICBcInN0YXJ0XCI6IFwid2F0Y2ggJ25wbSBydW4gYnVpbGQnIHNyYyAmIGh0dHAtc2VydmVyIC1wIDUwMDAgLWMtMSAtb1wiXG4gIH1cbn1cbiIsIi8qXG50byBkbzpcbnNldFBhcmFtKFtdKVxuKi9cblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIGFzIEJhc2VUYXNrLCBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcblxuZXhwb3J0IHZhciBUYXNrID0gQmFzZVRhc2suZXh0ZW5kKHtcblxuICBpbmNsdWRlczogTC5NaXhpbi5FdmVudHMsXG5cbiAgLy8gc2V0dGVyczoge30sIHdlIGRvbid0IHVzZSB0aGVzZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIFBhcmFtTmFtZSBPUiB2YWx1ZSBvZiBjdXN0b20gR1Agc2VydmljZXNcbiAgcGFyYW1zOiB7fSxcbiAgcmVzdWx0UGFyYW1zOiB7fSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIC8vIGRvbid0IHJlcGxhY2UgcGFyZW50IGluaXRpYWxpemVcbiAgICBCYXNlVGFzay5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gaWYgcGF0aCBpc24ndCBzdXBwbGllZCBpbiBvcHRpb25zLCB0cnkgYW5kIGRldGVybWluZSBpZiBpdHMgc3luYyBvciBhc3luYyB0byBzZXQgYXV0b21hdGljYWxseVxuICAgIGlmICghdGhpcy5vcHRpb25zLnBhdGgpIHtcbiAgICAgIC8vIGFzc3VtZSBpbml0aWFsbHksIHRoYXQgc2VydmljZSBpcyBzeW5jaHJvbm91c1xuICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcblxuICAgICAgLy8gdGhlIHBhcmFtZXRlcnMgYmVsb3cgc2VlbSB3b25reSB0byBtZSwgYnV0IHdvcmsgZm9yIGJvdGggQ09SUyBhbmQgSlNPTlAgcmVxdWVzdHNcbiAgICAgIHRoaXMuX3NlcnZpY2UubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXN1bHRzKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBpZiAocmVzdWx0cy5leGVjdXRpb25UeXBlID09PSAnZXNyaUV4ZWN1dGlvblR5cGVTeW5jaHJvbm91cycpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGggPSAnZXhlY3V0ZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdzdWJtaXRKb2InO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpcmUoJ2luaXRpYWxpemVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgY2hlY2sgZmFpbHMsIGhvcGVmdWxseSBpdHMgc3luY2hyb25vdXNcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0aCA9ICdleGVjdXRlJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBwYXRoIGlzIGN1c3RvbSwgaG9wZWZ1bGx5IGl0cyBzeW5jaHJvbm91c1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyAhPT0gdHJ1ZSAmJiB0aGlzLm9wdGlvbnMucGF0aCAhPT0gJ3N1Ym1pdEpvYicpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIGRvYyBmb3IgdmFyaW91cyBHUElucHV0IHR5cGVzIGNhbiBiZSBmb3VuZCBoZXJlXG4gIC8vIGh0dHA6Ly9yZXNvdXJjZXMuYXJjZ2lzLmNvbS9lbi9oZWxwL2FyY2dpcy1yZXN0LWFwaS9pbmRleC5odG1sIy9HUF9SZXN1bHQvMDJyMzAwMDAwMHE3MDAwMDAwL1xuXG4gIC8vIHNldCBib29sZWFucywgbnVtYmVycywgc3RyaW5nc1xuICBzZXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1WYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbVZhbHVlICE9PSAnb2JqZWN0JykgeyAvLyBzdHJpbmdzLCBudW1iZXJzXG4gICAgICB0aGlzLnBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdHMgbGF0bG5nLCBtYXJrZXIsIGJvdW5kcyBvciBnZW9qc29uXG4gICAgICB0aGlzLl9zZXRHZW9tZXRyeShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpO1xuICAgIH1cbiAgfSxcblxuICAvLyBub3Qgc3VyZSBob3cgYmVzdCB0byBoYW5kbGUgcGFzc2luZyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhdCBvbmNlXG4gIC8vIHNldFBhcmFtczogZnVuY3Rpb24oaW5wdXRBcnJheSkge1xuICAvLyAgIGlmIChMLlV0aWwuaXNBcnJheShpbnB1dEFycmF5KSkge1xuICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICAgIHRoaXMuc2V0UGFyYW0oaW5wdXRBcnJheVtpXSk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9LFxuXG4gIC8vIGdpdmUgZGV2ZWxvcGVyIG9wcG9ydHVuaXR5IHRvIHBvaW50IG91dCB3aGVyZSB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGJlIGF2YWlsYWJsZVxuICBzZXRPdXRwdXRQYXJhbTogZnVuY3Rpb24gKHBhcmFtTmFtZSkge1xuICAgIHRoaXMucGFyYW1zLm91dHB1dFBhcmFtID0gcGFyYW1OYW1lO1xuICB9LFxuXG4gIC8qIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBkZXNpZ24gcmVxdWlyZW1lbnQgdGhhdCByZXN1bHRQYXJhbXMgYmUgc3BlY2lmaWVkXG4gIGZvciBhc3luYyBlbGV2YXRpb24gc2VydmljZXMgaW4gb3JkZXIgdG8gZ2V0IFpzICh1bm5lY2Vzc2FyaWx5IGNvbmZ1c2luZykqL1xuICBncEFzeW5jUmVzdWx0UGFyYW06IGZ1bmN0aW9uIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUpIHtcbiAgICB0aGlzLnJlc3VsdFBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgfSxcblxuICAvLyB3ZSBjdXJyZW50bHkgZXhwZWN0IGEgc2luZ2xlIGdlb21ldHJ5IG9yIGZlYXR1cmUgKHBvcnRlZCBmcm9tOiBUYXNrcy5RdWVyeS5fc2V0R2VvbWV0cnkpXG4gIF9zZXRHZW9tZXRyeTogZnVuY3Rpb24gKHBhcmFtTmFtZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgcHJvY2Vzc2VkSW5wdXQgPSB7XG4gICAgICAnZ2VvbWV0cnlUeXBlJzogJycsXG4gICAgICAnZmVhdHVyZXMnOiBbXVxuICAgIH07XG5cbiAgICAvLyBjb252ZXJ0IGJvdW5kcyB0byBleHRlbnQgYW5kIGZpbmlzaFxuICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEwuTGF0TG5nQm91bmRzKSB7XG4gICAgICAvLyBzZXQgZ2VvbWV0cnkgKyB0eXBlXG4gICAgICBwcm9jZXNzZWRJbnB1dC5mZWF0dXJlcy5wdXNoKHsnZ2VvbWV0cnknOiBMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChnZW9tZXRyeSl9KTtcbiAgICAgIHByb2Nlc3NlZElucHV0Lmdlb21ldHJ5VHlwZSA9IEwuZXNyaS5VdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBMLk1hcmtlciA+IEwuTGF0TG5nXG4gICAgaWYgKGdlb21ldHJ5LmdldExhdExuZykge1xuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXRMbmcoKTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IEwuTGF0TG5nIHRvIGEgZ2VvanNvbiBwb2ludCBhbmQgY29udGludWU7XG4gICAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgTC5MYXRMbmcpIHtcbiAgICAgIGdlb21ldHJ5ID0ge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2dlb21ldHJ5LmxuZywgZ2VvbWV0cnkubGF0XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgTC5HZW9KU09OLCBwdWxsIG91dCB0aGUgZmlyc3QgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMLkdlb0pTT04pIHtcbiAgICAgIC8vIHJlYXNzaWduIGdlb21ldHJ5IHRvIHRoZSBHZW9KU09OIHZhbHVlICAod2UgYXJlIGFzc3VtaW5nIHRoYXQgb25seSBvbmUgZmVhdHVyZSBpcyBwcmVzZW50KVxuICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXllcnMoKVswXS5mZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZmVhdHVyZXMucHVzaCh7J2dlb21ldHJ5JzogVXRpbC5nZW9qc29uVG9BcmNHSVMoZ2VvbWV0cnkpfSk7XG4gICAgICBwcm9jZXNzZWRJbnB1dC5nZW9tZXRyeVR5cGUgPSBVdGlsLmdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEwuUG9seWxpbmUgYW5kIEwuUG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50b0dlb0pTT04pIHtcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkudG9HZW9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIEdlb0pTT04gZmVhdHVyZSBieSBwdWxsaW5nIG91dCB0aGUgZ2VvbWV0cnlcbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAvLyBnZXQgdGhlIGdlb21ldHJ5IG9mIHRoZSBnZW9qc29uIGZlYXR1cmVcbiAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkuZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgLy8gY29uZmlybSB0aGF0IG91ciBHZW9KU09OIGlzIGEgcG9pbnQsIGxpbmUgb3IgcG9seWdvblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgIHByb2Nlc3NlZElucHV0LmZlYXR1cmVzLnB1c2goeydnZW9tZXRyeSc6IFV0aWwuZ2VvanNvblRvQXJjR0lTKGdlb21ldHJ5KX0pO1xuICAgICAgcHJvY2Vzc2VkSW5wdXQuZ2VvbWV0cnlUeXBlID0gVXRpbC5nZW9qc29uVHlwZVRvQXJjR0lTKGdlb21ldHJ5LnR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCBhcyBHUCBpbnB1dC4gU2hvdWxkIGJlIGFuIEwuTGF0TG5nLCBMLkxhdExuZ0JvdW5kcywgTC5NYXJrZXIgb3IgR2VvSlNPTiBQb2ludCBMaW5lIG9yIFBvbHlnb24gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXJhbXNbcGFyYW1OYW1lXSA9IHByb2Nlc3NlZElucHV0O1xuICAgIHJldHVybjtcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IHRydWUpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRKb2JJZCA9IHJlc3BvbnNlLmpvYklkO1xuICAgICAgICB0aGlzLmNoZWNrSm9iKHRoaXMuX2N1cnJlbnRKb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5vcHRpb25zLnBhdGgsIHRoaXMucGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIChyZXNwb25zZSAmJiB0aGlzLnByb2Nlc3NHUE91dHB1dChyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2tKb2I6IGZ1bmN0aW9uIChqb2JJZCwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgcG9sbEpvYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkLCB7fSwgZnVuY3Rpb24gcG9sbGVkSm9iIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JTdWNjZWVkZWQnKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9kb25lKSB7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRvIGRvOlxuICAgICAgICAgICAgLy8gcmVmYWN0b3IgdG8gbWFrZSBhbiBhcnJheSBvZiBhc3luYyByZXF1ZXN0cyBmb3Igb3V0cHV0XG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QoJ2pvYnMvJyArIGpvYklkICsgJy9yZXN1bHRzLycgKyB0aGlzLnBhcmFtcy5vdXRwdXRQYXJhbSwgdGhpcy5yZXN1bHRQYXJhbXMsIGZ1bmN0aW9uIHByb2Nlc3NKb2JSZXN1bHQgKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgdGhpcy5wcm9jZXNzQXN5bmNPdXRwdXQocmVzcG9uc2UpKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmpvYlN0YXR1cyA9PT0gJ2VzcmlKb2JGYWlsZWQnKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCAnSm9iIEZhaWxlZCcsIG51bGwpO1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvdW50ZXIpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICB2YXIgY291bnRlciA9IHdpbmRvdy5zZXRJbnRlcnZhbChwb2xsSm9iLCB0aGlzLl9zZXJ2aWNlLm9wdGlvbnMuYXN5bmNJbnRlcnZhbCAqIDEwMDApO1xuICB9LFxuXG4gIHByb2Nlc3NHUE91dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG5cbiAgICAvLyBncmFiIHN5bmNyb25vdXMgcmVzdWx0c1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAvLyBsb29wIHRocm91Z2ggcmVzdWx0cyBhbmQgcGFzcyBiYWNrLCBwYXJzaW5nIGVzcmkganNvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucmVzdWx0c1tpXS5wYXJhbU5hbWVdO1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0c1tpXS5kYXRhVHlwZSA9PT0gJ0dQRmVhdHVyZVJlY29yZFNldExheWVyJykge1xuICAgICAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWUpO1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IGZlYXR1cmVDb2xsZWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnJlc3VsdHNbaV0ucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnJlc3VsdHNbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBncmFiIGFzeW5jIHJlc3VsdHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlLmpvYklkID0gdGhpcy5fY3VycmVudEpvYklkO1xuICAgICAgLy8gdmFyIHJlc3BvbnNlVmFsdWUgPSByZXNwb25zZS52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZFJlc3BvbnNlO1xuICB9LFxuXG4gIHByb2Nlc3NBc3luY091dHB1dDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFJlc3BvbnNlID0ge307XG4gICAgcHJvY2Vzc2VkUmVzcG9uc2Uuam9iSWQgPSB0aGlzLl9jdXJyZW50Sm9iSWQ7XG5cbiAgICAvLyBpZiBvdXRwdXQgaXMgYSByYXN0ZXIgbGF5ZXIsIHdlIGFsc28gbmVlZCB0byBzdHViIG91dCBhIE1hcFNlcnZpY2UgdXJsIHVzaW5nIGpvYmlkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hc3luYyA9PT0gdHJ1ZSAmJiByZXNwb25zZS5kYXRhVHlwZSA9PT0gJ0dQUmFzdGVyRGF0YUxheWVyJykge1xuICAgICAgdmFyIGJhc2VVUkwgPSB0aGlzLm9wdGlvbnMudXJsO1xuICAgICAgdmFyIG4gPSBiYXNlVVJMLmluZGV4T2YoJ0dQU2VydmVyJyk7XG4gICAgICB2YXIgc2VydmljZVVSTCA9IGJhc2VVUkwuc2xpY2UoMCwgbikgKyAnTWFwU2VydmVyLyc7XG4gICAgICBwcm9jZXNzZWRSZXNwb25zZS5vdXRwdXRNYXBTZXJ2aWNlID0gc2VydmljZVVSTCArICdqb2JzLycgKyB0aGlzLl9jdXJyZW50Sm9iSWQ7XG4gICAgfVxuXG4gICAgLy8gaWYgb3V0cHV0IGlzIEdQRmVhdHVyZVJlY29yZFNldExheWVyLCBjb252ZXJ0IHRvIEdlb0pTT05cbiAgICBpZiAocmVzcG9uc2UuZGF0YVR5cGUgPT09ICdHUEZlYXR1cmVSZWNvcmRTZXRMYXllcicpIHtcbiAgICAgIHZhciBmZWF0dXJlQ29sbGVjdGlvbiA9IFV0aWwucmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlLnZhbHVlKTtcbiAgICAgIHByb2Nlc3NlZFJlc3BvbnNlW3Jlc3BvbnNlLnBhcmFtTmFtZV0gPSBmZWF0dXJlQ29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkUmVzcG9uc2VbcmVzcG9uc2UucGFyYW1OYW1lXSA9IHJlc3BvbnNlLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhc2sgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0YXNrO1xuIiwiaW1wb3J0IHsgU2VydmljZSBhcyBCYXNlU2VydmljZSB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vVGFza3MvR2VvcHJvY2Vzc2luZyc7XG5cbmV4cG9ydCB2YXIgU2VydmljZSA9IEJhc2VTZXJ2aWNlLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBhc3luY0ludGVydmFsOiAxXG4gIH0sXG5cbiAgY3JlYXRlVGFzazogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgVGFzayh0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZSAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNlcnZpY2Uob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlcnZpY2U7XG4iXSwibmFtZXMiOlsiVGFzayIsIkJhc2VUYXNrIiwiVXRpbCIsIlNlcnZpY2UiLCJCYXNlU2VydmljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztDQ1FPLElBQUlBLE1BQUksR0FBR0MsZ0JBQVEsQ0FBQyxNQUFNLENBQUM7O0FBRWxDLENBQUEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxD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 \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-heatmap-2.0.0.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-heatmap-2.0.0.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,116 @@ +/* esri-leaflet-heatmap - v2.0.0 - Mon Aug 29 2016 20:03:56 GMT-0700 (PDT) + * Copyright (c) 2016 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Heat = global.L.esri.Heat || {}),global.L,global.L.esri)); +}(this, function (exports,L,esriLeaflet) { 'use strict'; + + L = 'default' in L ? L['default'] : L; + + var version = "2.0.0"; + + var FeatureLayer = esriLeaflet.FeatureManager.extend({ + /** + * Constructor + */ + + initialize: function (options) { + esriLeaflet.FeatureManager.prototype.initialize.call(this, options); + + options = L.setOptions(this, options); + + this._cache = {}; + this._active = {}; + + this.heat = window.L.heatLayer([], options); + }, + + /** + * Layer Interface + */ + + onAdd: function (map) { + esriLeaflet.FeatureManager.prototype.onAdd.call(this, map); + this._map.addLayer(this.heat); + }, + + onRemove: function (map) { + esriLeaflet.FeatureManager.prototype.onRemove.call(this, map); + this._map.removeLayer(this.heat); + }, + + /** + * Feature Managment Methods + */ + + createLayers: function (features) { + for (var i = features.length - 1; i >= 0; i--) { + var geojson = features[i]; + var id = geojson.id; + var latlng = new L.LatLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]); + this._cache[id] = latlng; + + // add the layer if it is within the time bounds or our layer is not time enabled + if (!this._active[id] && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) { + this._active[id] = latlng; + this.heat._latlngs.push(latlng); + } + } + + this.heat.redraw(); + }, + + addLayers: function (ids) { + for (var i = ids.length - 1; i >= 0; i--) { + var id = ids[i]; + if (!this._active[id]) { + var latlng = this._cache[id]; + this.heat._latlngs.push(latlng); + this._active[id] = latlng; + } + } + this.heat.redraw(); + }, + + removeLayers: function (ids, permanent) { + var newLatLngs = []; + for (var i = ids.length - 1; i >= 0; i--) { + var id = ids[i]; + if (this._active[id]) { + delete this._active[id]; + } + if (this._cache[id] && permanent) { + delete this._cache[id]; + } + } + + for (var latlng in this._active) { + newLatLngs.push(this._active[latlng]); + } + + this.heat.setLatLngs(newLatLngs); + }, + + setOptions: function (options) { + this.heat.setOptions(options); + }, + + redraw: function () { + this.heat.redraw(); + } + + }); + + function featureLayer (options) { + return new FeatureLayer(options); + } + + exports.FeatureLayer = FeatureLayer; + exports.featureLayer = featureLayer; + exports['default'] = featureLayer; + exports.VERSION = version; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWhlYXRtYXAtZGVidWcuanMiLCJzb3VyY2VzIjpbIi4uL3BhY2thZ2UuanNvbiIsIi4uL3NyYy9IZWF0bWFwRmVhdHVyZUxheWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIntcbiAgXCJuYW1lXCI6IFwiZXNyaS1sZWFmbGV0LWhlYXRtYXBcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVzcmkgTGVhZmxldCBwbHVnaW4gZm9yIHZpc3VhbGl6aW5nIEZlYXR1cmUgTGF5ZXJzIGFzIGhlYXRtYXBzIHdpdGggTC5oZWF0LlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMFwiLFxuICBcImF1dGhvclwiOiBcIlBhdHJpY2sgQXJsdCA8cGFybHRAZXNyaS5jb20+IChodHRwOi8vcGF0cmlja2FybHQuY29tKVwiLFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJQYXRyaWNrIEFybHQgPHBhcmx0QGVzcmkuY29tPiAoaHR0cDovL3BhdHJpY2thcmx0LmNvbSlcIixcbiAgICBcIkpvaG4gR3Jhdm9pcyA8amdyYXZvaXNAZXNyaS5jb20+IChodHRwOi8vam9obmdyYXZvaXMuY29tKVwiXG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImVzcmktbGVhZmxldFwiOiBcIl4yLjAuMFwiLFxuICAgIFwibGVhZmxldFwiOiBcIl4xLjAuMC1yYy4zXCIsXG4gICAgXCJsZWFmbGV0LmhlYXRcIjogXCJeMC4yLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJjaGFpXCI6IFwiMi4zLjBcIixcbiAgICBcImdoLXJlbGVhc2VcIjogXCJeMi4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOS4wXCIsXG4gICAgXCJpc3BhcnRhXCI6IFwiXjMuMC4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwia2FybWFcIjogXCJeMC4xMi4yNFwiLFxuICAgIFwia2FybWEtY2hhaS1zaW5vblwiOiBcIl4wLjEuM1wiLFxuICAgIFwia2FybWEtY292ZXJhZ2VcIjogXCJeMC41LjNcIixcbiAgICBcImthcm1hLW1vY2hhXCI6IFwiXjAuMS4wXCIsXG4gICAgXCJrYXJtYS1tb2NoYS1yZXBvcnRlclwiOiBcIl4wLjIuNVwiLFxuICAgIFwia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyXCI6IFwiXjAuMS40XCIsXG4gICAgXCJrYXJtYS1zb3VyY2VtYXAtbG9hZGVyXCI6IFwiXjAuMy41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm5vZGUtc2Fzc1wiOiBcIl4zLjIuMFwiLFxuICAgIFwicGhhbnRvbWpzXCI6IFwiXjEuOS4xN1wiLFxuICAgIFwicm9sbHVwXCI6IFwiXjAuMjUuNFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1qc29uXCI6IFwiXjIuMC4wXCIsXG4gICAgXCJyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi11Z2xpZnlcIjogXCJeMC4zLjFcIixcbiAgICBcInNlbWlzdGFuZGFyZFwiOiBcIl43LjAuMlwiLFxuICAgIFwic2lub25cIjogXCJeMS4xMS4xXCIsXG4gICAgXCJzaW5vbi1jaGFpXCI6IFwiMi43LjBcIixcbiAgICBcInNuYXp6eVwiOiBcIl4yLjAuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC1oZWF0bWFwXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvSGVhdG1hcEZlYXR1cmVMYXllci5qc1wiLFxuICBcImpzcG1cIjoge1xuICAgIFwicmVnaXN0cnlcIjogXCJucG1cIixcbiAgICBcImZvcm1hdFwiOiBcImVzNlwiLFxuICAgIFwibWFpblwiOiBcInNyYy9IZWF0bWFwRmVhdHVyZUxheWVyLmpzXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlLTIuMFwiLFxuICBcIm1haW5cIjogXCJkaXN0L2VzcmktbGVhZmxldC1oZWF0bWFwLWRlYnVnLmpzXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb206RXNyaS9lc3JpLWxlYWZsZXQtaGVhdG1hcC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicHJlYnVpbGRcIjogXCJta2RpcnAgZGlzdFwiLFxuICAgIFwiYnVpbGRcIjogXCJyb2xsdXAgLWMgcHJvZmlsZXMvZGVidWcuanMgJiByb2xsdXAgLWMgcHJvZmlsZXMvcHJvZHVjdGlvbi5qc1wiLFxuICAgIFwibGludFwiOiBcInNlbWlzdGFuZGFyZCBzcmMvKi5qcyAmJiBzZW1pc3RhbmRhcmQgc3BlYy8qLmpzIHwgc25henp5XCIsXG4gICAgXCJwcmVwdWJsaXNoXCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicHJldGVzdFwiOiBcIm5wbSBydW4gYnVpbGRcIixcbiAgICBcInJlbGVhc2VcIjogXCIuL3NjcmlwdHMvcmVsZWFzZS5zaFwiLFxuICAgIFwic3RhcnRcIjogXCJ3YXRjaCAnbnBtIHJ1biBidWlsZCcgc3JjICYgaHR0cC1zZXJ2ZXIgLXAgNjc4OSAtYy0xIC1vXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIGthcm1hIHN0YXJ0XCJcbiAgfVxufVxuIiwiZXhwb3J0IHsgdmVyc2lvbiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBGZWF0dXJlTWFuYWdlciB9IGZyb20gJ2VzcmktbGVhZmxldCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZUxheWVyID0gRmVhdHVyZU1hbmFnZXIuZXh0ZW5kKHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIHRoaXMuX2FjdGl2ZSA9IHt9O1xuXG4gICAgdGhpcy5oZWF0ID0gd2luZG93LkwuaGVhdExheWVyKFtdLCBvcHRpb25zKTtcbiAgfSxcblxuICAvKipcbiAgICogTGF5ZXIgSW50ZXJmYWNlXG4gICAqL1xuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgICB0aGlzLl9tYXAuYWRkTGF5ZXIodGhpcy5oZWF0KTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIEZlYXR1cmVNYW5hZ2VyLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuaGVhdCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgTWFuYWdtZW50IE1ldGhvZHNcbiAgICovXG5cbiAgY3JlYXRlTGF5ZXJzOiBmdW5jdGlvbiAoZmVhdHVyZXMpIHtcbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBnZW9qc29uID0gZmVhdHVyZXNbaV07XG4gICAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgICAgdmFyIGxhdGxuZyA9IG5ldyBMLkxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKTtcbiAgICAgIHRoaXMuX2NhY2hlW2lkXSA9IGxhdGxuZztcblxuICAgICAgLy8gYWRkIHRoZSBsYXllciBpZiBpdCBpcyB3aXRoaW4gdGhlIHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZVtpZF0gJiYgKCF0aGlzLm9wdGlvbnMudGltZUZpZWxkIHx8ICh0aGlzLm9wdGlvbnMudGltZUZpZWxkICYmIHRoaXMuX2ZlYXR1cmVXaXRoaW5UaW1lUmFuZ2UoZ2VvanNvbikpKSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbaWRdID0gbGF0bG5nO1xuICAgICAgICB0aGlzLmhlYXQuX2xhdGxuZ3MucHVzaChsYXRsbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGVhdC5yZWRyYXcoKTtcbiAgfSxcblxuICBhZGRMYXllcnM6IGZ1bmN0aW9uIChpZHMpIHtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZVtpZF0pIHtcbiAgICAgICAgdmFyIGxhdGxuZyA9IHRoaXMuX2NhY2hlW2lkXTtcbiAgICAgICAgdGhpcy5oZWF0Ll9sYXRsbmdzLnB1c2gobGF0bG5nKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2lkXSA9IGxhdGxuZztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oZWF0LnJlZHJhdygpO1xuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgdmFyIG5ld0xhdExuZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gaWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgICBpZiAodGhpcy5fYWN0aXZlW2lkXSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fYWN0aXZlW2lkXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jYWNoZVtpZF0gJiYgcGVybWFuZW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgbGF0bG5nIGluIHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbmV3TGF0TG5ncy5wdXNoKHRoaXMuX2FjdGl2ZVtsYXRsbmddKTtcbiAgICB9XG5cbiAgICB0aGlzLmhlYXQuc2V0TGF0TG5ncyhuZXdMYXRMbmdzKTtcbiAgfSxcblxuICBzZXRPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHRoaXMuaGVhdC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9LFxuXG4gIHJlZHJhdzogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGVhdC5yZWRyYXcoKTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVMYXllciAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZlYXR1cmVMYXllcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmVhdHVyZUxheWVyO1xuIl0sIm5hbWVzIjpbIkZlYXR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0NDS08sSUFBSSxZQUFZLEdBQUdBLDBCQUFjLENBQUMsTUFBTSxDQUFDO0FBQ2hELENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQTs7QUFFQSxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0FBQ2pDLENBQUEsSUFBSUEsMEJBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRTVELENBQUEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRTFDLENBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQixDQUFBLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O0FBRXRCLENBQUEsSUFBSSxJ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 \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-renderers-2.0.2.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1129 @@ +/* esri-leaflet-renderers - v2.0.2 - Wed Jun 15 2016 09:56:55 GMT-0700 (PDT) + * Copyright (c) 2016 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Renderers = global.L.esri.Renderers || {}),global.L)); +}(this, function (exports,L) { 'use strict'; + + L = 'default' in L ? L['default'] : L; + + var version = "2.0.2"; + + var Symbol = L.Class.extend({ + initialize: function (symbolJson, options) { + this._symbolJson = symbolJson; + this.val = null; + this._styles = {}; + this._isDefault = false; + this._layerTransparency = 1; + if (options && options.layerTransparency) { + this._layerTransparency = 1 - (options.layerTransparency / 100.0); + } + }, + + // the geojson values returned are in points + pixelValue: function (pointValue) { + return pointValue * 1.333; + }, + + // color is an array [r,g,b,a] + colorValue: function (color) { + return 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')'; + }, + + alphaValue: function (color) { + var alpha = color[3] / 255.0; + return alpha * this._layerTransparency; + }, + + getSize: function (feature, sizeInfo) { + var attr = feature.properties; + var field = sizeInfo.field; + var size = 0; + var featureValue = null; + + if (field) { + featureValue = attr[field]; + var minSize = sizeInfo.minSize; + var maxSize = sizeInfo.maxSize; + var minDataValue = sizeInfo.minDataValue; + var maxDataValue = sizeInfo.maxDataValue; + var featureRatio; + var normField = sizeInfo.normalizationField; + var normValue = attr ? parseFloat(attr[normField]) : undefined; + + if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) { + return null; + } + + if (!isNaN(normValue)) { + featureValue /= normValue; + } + + if (minSize !== null && maxSize !== null && minDataValue !== null && maxDataValue !== null) { + if (featureValue <= minDataValue) { + size = minSize; + } else if (featureValue >= maxDataValue) { + size = maxSize; + } else { + featureRatio = (featureValue - minDataValue) / (maxDataValue - minDataValue); + size = minSize + (featureRatio * (maxSize - minSize)); + } + } + size = isNaN(size) ? 0 : size; + } + return size; + }, + + getColor: function (feature, colorInfo) { + // required information to get color + if (!(feature.properties && colorInfo && colorInfo.field && colorInfo.stops)) { + return null; + } + + var attr = feature.properties; + var featureValue = attr[colorInfo.field]; + var lowerBoundColor, upperBoundColor, lowerBound, upperBound; + var normField = colorInfo.normalizationField; + var normValue = attr ? parseFloat(attr[normField]) : undefined; + if (featureValue === null || (normField && ((isNaN(normValue) || normValue === 0)))) { + return null; + } + + if (!isNaN(normValue)) { + featureValue /= normValue; + } + + if (featureValue <= colorInfo.stops[0].value) { + return colorInfo.stops[0].color; + } + var lastStop = colorInfo.stops[colorInfo.stops.length - 1]; + if (featureValue >= lastStop.value) { + return lastStop.color; + } + + // go through the stops to find min and max + for (var i = 0; i < colorInfo.stops.length; i++) { + var stopInfo = colorInfo.stops[i]; + + if (stopInfo.value <= featureValue) { + lowerBoundColor = stopInfo.color; + lowerBound = stopInfo.value; + } else if (stopInfo.value > featureValue) { + upperBoundColor = stopInfo.color; + upperBound = stopInfo.value; + break; + } + } + + // feature falls between two stops, interplate the colors + if (!isNaN(lowerBound) && !isNaN(upperBound)) { + var range = upperBound - lowerBound; + if (range > 0) { + // more weight the further it is from the lower bound + var upperBoundColorWeight = (featureValue - lowerBound) / range; + if (upperBoundColorWeight) { + // more weight the further it is from the upper bound + var lowerBoundColorWeight = (upperBound - featureValue) / range; + if (lowerBoundColorWeight) { + // interpolate the lower and upper bound color by applying the + // weights to each of the rgba colors and adding them together + var interpolatedColor = []; + for (var j = 0; j < 4; j++) { + interpolatedColor[j] = Math.round(lowerBoundColor[j] * lowerBoundColorWeight + upperBoundColor[j] * upperBoundColorWeight); + } + return interpolatedColor; + } else { + // no difference between featureValue and upperBound, 100% of upperBoundColor + return upperBoundColor; + } + } else { + // no difference between featureValue and lowerBound, 100% of lowerBoundColor + return lowerBoundColor; + } + } + } + // if we get to here, none of the cases apply so return null + return null; + } + }); + + var ShapeMarker = L.Path.extend({ + + initialize: function (latlng, size, options) { + L.setOptions(this, options); + this._size = size; + this._latlng = L.latLng(latlng); + this._svgCanvasIncludes(); + }, + + _svgCanvasIncludes: function () { + // implement in sub class + }, + + _project: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + }, + + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + _updatePath: function () { + // implement in sub class + }, + + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + this.redraw(); + return this.fire('move', {latlng: this._latlng}); + }, + + getLatLng: function () { + return this._latlng; + }, + + setSize: function (size) { + this._size = size; + return this.redraw(); + }, + + getSize: function () { + return this._size; + } + }); + + var CrossMarker = ShapeMarker.extend({ + + initialize: function (latlng, size, options) { + ShapeMarker.prototype.initialize.call(this, latlng, size, options); + }, + + _updatePath: function () { + this._renderer._updateCrossMarker(this); + }, + + _svgCanvasIncludes: function () { + L.Canvas.include({ + _updateCrossMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + var ctx = this._ctx; + + ctx.beginPath(); + ctx.moveTo(latlng.x, latlng.y + offset); + ctx.lineTo(latlng.x, latlng.y - offset); + this._fillStroke(ctx, layer); + + ctx.moveTo(latlng.x - offset, latlng.y); + ctx.lineTo(latlng.x + offset, latlng.y); + this._fillStroke(ctx, layer); + } + }); + + L.SVG.include({ + _updateCrossMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + + if (L.Browser.vml) { + latlng._round(); + offset = Math.round(offset); + } + + var str = 'M' + latlng.x + ',' + (latlng.y + offset) + + 'L' + latlng.x + ',' + (latlng.y - offset) + + 'M' + (latlng.x - offset) + ',' + latlng.y + + 'L' + (latlng.x + offset) + ',' + latlng.y; + + this._setPath(layer, str); + } + }); + } + }); + + var crossMarker = function (latlng, size, options) { + return new CrossMarker(latlng, size, options); + }; + + var XMarker = ShapeMarker.extend({ + + initialize: function (latlng, size, options) { + ShapeMarker.prototype.initialize.call(this, latlng, size, options); + }, + + _updatePath: function () { + this._renderer._updateXMarker(this); + }, + + _svgCanvasIncludes: function () { + L.Canvas.include({ + _updateXMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + var ctx = this._ctx; + + ctx.beginPath(); + + ctx.moveTo(latlng.x + offset, latlng.y + offset); + ctx.lineTo(latlng.x - offset, latlng.y - offset); + this._fillStroke(ctx, layer); + } + }); + + L.SVG.include({ + _updateXMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + + if (L.Browser.vml) { + latlng._round(); + offset = Math.round(offset); + } + + var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) + + 'L' + (latlng.x - offset) + ',' + (latlng.y - offset) + + 'M' + (latlng.x - offset) + ',' + (latlng.y + offset) + + 'L' + (latlng.x + offset) + ',' + (latlng.y - offset); + + this._setPath(layer, str); + } + }); + } + }); + + var xMarker = function (latlng, size, options) { + return new XMarker(latlng, size, options); + }; + + var SquareMarker = ShapeMarker.extend({ + options: { + fill: true + }, + + initialize: function (latlng, size, options) { + ShapeMarker.prototype.initialize.call(this, latlng, size, options); + }, + + _updatePath: function () { + this._renderer._updateSquareMarker(this); + }, + + _svgCanvasIncludes: function () { + L.Canvas.include({ + _updateSquareMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + var ctx = this._ctx; + + ctx.beginPath(); + + ctx.moveTo(latlng.x + offset, latlng.y + offset); + ctx.lineTo(latlng.x - offset, latlng.y + offset); + ctx.lineTo(latlng.x - offset, latlng.y - offset); + ctx.lineTo(latlng.x + offset, latlng.y - offset); + + ctx.closePath(); + + this._fillStroke(ctx, layer); + } + }); + + L.SVG.include({ + _updateSquareMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + + if (L.Browser.vml) { + latlng._round(); + offset = Math.round(offset); + } + + var str = 'M' + (latlng.x + offset) + ',' + (latlng.y + offset) + + 'L' + (latlng.x - offset) + ',' + (latlng.y + offset) + + 'L' + (latlng.x - offset) + ',' + (latlng.y - offset) + + 'L' + (latlng.x + offset) + ',' + (latlng.y - offset); + + str = str + (L.Browser.svg ? 'z' : 'x'); + + this._setPath(layer, str); + } + }); + } + }); + + var squareMarker = function (latlng, size, options) { + return new SquareMarker(latlng, size, options); + }; + + var DiamondMarker = ShapeMarker.extend({ + options: { + fill: true + }, + + initialize: function (latlng, size, options) { + ShapeMarker.prototype.initialize.call(this, latlng, size, options); + }, + + _updatePath: function () { + this._renderer._updateDiamondMarker(this); + }, + + _svgCanvasIncludes: function () { + L.Canvas.include({ + _updateDiamondMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + var ctx = this._ctx; + + ctx.beginPath(); + + ctx.moveTo(latlng.x, latlng.y + offset); + ctx.lineTo(latlng.x - offset, latlng.y); + ctx.lineTo(latlng.x, latlng.y - offset); + ctx.lineTo(latlng.x + offset, latlng.y); + + ctx.closePath(); + + this._fillStroke(ctx, layer); + } + }); + + L.SVG.include({ + _updateDiamondMarker: function (layer) { + var latlng = layer._point; + var offset = layer._size / 2.0; + + if (L.Browser.vml) { + latlng._round(); + offset = Math.round(offset); + } + + var str = 'M' + latlng.x + ',' + (latlng.y + offset) + + 'L' + (latlng.x - offset) + ',' + latlng.y + + 'L' + latlng.x + ',' + (latlng.y - offset) + + 'L' + (latlng.x + offset) + ',' + latlng.y; + + str = str + (L.Browser.svg ? 'z' : 'x'); + + this._setPath(layer, str); + } + }); + } + }); + + var diamondMarker = function (latlng, size, options) { + return new DiamondMarker(latlng, size, options); + }; + + var PointSymbol = Symbol.extend({ + + statics: { + MARKERTYPES: ['esriSMSCircle', 'esriSMSCross', 'esriSMSDiamond', 'esriSMSSquare', 'esriSMSX', 'esriPMS'] + }, + + initialize: function (symbolJson, options) { + Symbol.prototype.initialize.call(this, symbolJson, options); + if (options) { + this.serviceUrl = options.url; + } + if (symbolJson) { + if (symbolJson.type === 'esriPMS') { + var url = this.serviceUrl + 'images/' + this._symbolJson.url; + this._iconUrl = options && options.token ? url + '?token=' + options.token : url; + // leaflet does not allow resizing icons so keep a hash of different + // icon sizes to try and keep down on the number of icons created + this._icons = {}; + // create base icon + this.icon = this._createIcon(this._symbolJson); + } else { + this._fillStyles(); + } + } + }, + + _fillStyles: function () { + if (this._symbolJson.outline && this._symbolJson.size > 0) { + this._styles.stroke = true; + this._styles.weight = this.pixelValue(this._symbolJson.outline.width); + this._styles.color = this.colorValue(this._symbolJson.outline.color); + this._styles.opacity = this.alphaValue(this._symbolJson.outline.color); + } else { + this._styles.stroke = false; + } + if (this._symbolJson.color) { + this._styles.fillColor = this.colorValue(this._symbolJson.color); + this._styles.fillOpacity = this.alphaValue(this._symbolJson.color); + } else { + this._styles.fillOpacity = 0; + } + + if (this._symbolJson.style === 'esriSMSCircle') { + this._styles.radius = this.pixelValue(this._symbolJson.size) / 2.0; + } + }, + + _createIcon: function (options) { + var width = this.pixelValue(options.width); + var height = width; + if (options.height) { + height = this.pixelValue(options.height); + } + var xOffset = width / 2.0; + var yOffset = height / 2.0; + + if (options.xoffset) { + xOffset += this.pixelValue(options.xoffset); + } + if (options.yoffset) { + yOffset += this.pixelValue(options.yoffset); + } + + var icon = L.icon({ + iconUrl: this._iconUrl, + iconSize: [width, height], + iconAnchor: [xOffset, yOffset] + }); + this._icons[options.width.toString()] = icon; + return icon; + }, + + _getIcon: function (size) { + // check to see if it is already created by size + var icon = this._icons[size.toString()]; + if (!icon) { + icon = this._createIcon({width: size}); + } + return icon; + }, + + pointToLayer: function (geojson, latlng, visualVariables, options) { + var size = this._symbolJson.size || this._symbolJson.width; + if (!this._isDefault) { + if (visualVariables.sizeInfo) { + var calculatedSize = this.getSize(geojson, visualVariables.sizeInfo); + if (calculatedSize) { + size = calculatedSize; + } + } + if (visualVariables.colorInfo) { + var color = this.getColor(geojson, visualVariables.colorInfo); + if (color) { + this._styles.fillColor = this.colorValue(color); + this._styles.fillOpacity = this.alphaValue(color); + } + } + } + + if (this._symbolJson.type === 'esriPMS') { + var layerOptions = L.extend({}, {icon: this._getIcon(size)}, options); + return L.marker(latlng, layerOptions); + } + size = this.pixelValue(size); + + switch (this._symbolJson.style) { + case 'esriSMSSquare': + return squareMarker(latlng, size, L.extend({}, this._styles, options)); + case 'esriSMSDiamond': + return diamondMarker(latlng, size, L.extend({}, this._styles, options)); + case 'esriSMSCross': + return crossMarker(latlng, size, L.extend({}, this._styles, options)); + case 'esriSMSX': + return xMarker(latlng, size, L.extend({}, this._styles, options)); + } + this._styles.radius = size / 2.0; + return L.circleMarker(latlng, L.extend({}, this._styles, options)); + } + }); + + function pointSymbol (symbolJson, options) { + return new PointSymbol(symbolJson, options); + } + + var LineSymbol = Symbol.extend({ + statics: { + // Not implemented 'esriSLSNull' + LINETYPES: ['esriSLSDash', 'esriSLSDot', 'esriSLSDashDotDot', 'esriSLSDashDot', 'esriSLSSolid'] + }, + initialize: function (symbolJson, options) { + Symbol.prototype.initialize.call(this, symbolJson, options); + this._fillStyles(); + }, + + _fillStyles: function () { + // set the defaults that show up on arcgis online + this._styles.lineCap = 'butt'; + this._styles.lineJoin = 'miter'; + this._styles.fill = false; + this._styles.weight = 0; + + if (!this._symbolJson) { + return this._styles; + } + + if (this._symbolJson.color) { + this._styles.color = this.colorValue(this._symbolJson.color); + this._styles.opacity = this.alphaValue(this._symbolJson.color); + } + + if (!isNaN(this._symbolJson.width)) { + this._styles.weight = this.pixelValue(this._symbolJson.width); + + var dashValues = []; + + switch (this._symbolJson.style) { + case 'esriSLSDash': + dashValues = [4, 3]; + break; + case 'esriSLSDot': + dashValues = [1, 3]; + break; + case 'esriSLSDashDot': + dashValues = [8, 3, 1, 3]; + break; + case 'esriSLSDashDotDot': + dashValues = [8, 3, 1, 3, 1, 3]; + break; + } + + // use the dash values and the line weight to set dash array + if (dashValues.length > 0) { + for (var i = 0; i < dashValues.length; i++) { + dashValues[i] *= this._styles.weight; + } + + this._styles.dashArray = dashValues.join(','); + } + } + }, + + style: function (feature, visualVariables) { + if (!this._isDefault && visualVariables) { + if (visualVariables.sizeInfo) { + var calculatedSize = this.pixelValue(this.getSize(feature, visualVariables.sizeInfo)); + if (calculatedSize) { + this._styles.weight = calculatedSize; + } + } + if (visualVariables.colorInfo) { + var color = this.getColor(feature, visualVariables.colorInfo); + if (color) { + this._styles.color = this.colorValue(color); + this._styles.opacity = this.alphaValue(color); + } + } + } + return this._styles; + } + }); + + function lineSymbol (symbolJson, options) { + return new LineSymbol(symbolJson, options); + } + + var PolygonSymbol = Symbol.extend({ + statics: { + // not implemented: 'esriSFSBackwardDiagonal','esriSFSCross','esriSFSDiagonalCross','esriSFSForwardDiagonal','esriSFSHorizontal','esriSFSNull','esriSFSVertical' + POLYGONTYPES: ['esriSFSSolid'] + }, + initialize: function (symbolJson, options) { + Symbol.prototype.initialize.call(this, symbolJson, options); + if (symbolJson) { + this._lineStyles = lineSymbol(symbolJson.outline, options).style(); + this._fillStyles(); + } + }, + + _fillStyles: function () { + if (this._lineStyles) { + if (this._lineStyles.weight === 0) { + // when weight is 0, setting the stroke to false can still look bad + // (gaps between the polygons) + this._styles.stroke = false; + } else { + // copy the line symbol styles into this symbol's styles + for (var styleAttr in this._lineStyles) { + this._styles[styleAttr] = this._lineStyles[styleAttr]; + } + } + } + + // set the fill for the polygon + if (this._symbolJson) { + if (this._symbolJson.color && + // don't fill polygon if type is not supported + PolygonSymbol.POLYGONTYPES.indexOf(this._symbolJson.style >= 0)) { + this._styles.fill = true; + this._styles.fillColor = this.colorValue(this._symbolJson.color); + this._styles.fillOpacity = this.alphaValue(this._symbolJson.color); + } else { + this._styles.fill = false; + this._styles.fillOpacity = 0; + } + } + }, + + style: function (feature, visualVariables) { + if (!this._isDefault && visualVariables && visualVariables.colorInfo) { + var color = this.getColor(feature, visualVariables.colorInfo); + if (color) { + this._styles.fillColor = this.colorValue(color); + this._styles.fillOpacity = this.alphaValue(color); + } + } + return this._styles; + } + }); + + function polygonSymbol (symbolJson, options) { + return new PolygonSymbol(symbolJson, options); + } + + var Renderer = L.Class.extend({ + options: { + proportionalPolygon: false, + clickable: true + }, + + initialize: function (rendererJson, options) { + this._rendererJson = rendererJson; + this._pointSymbols = false; + this._symbols = []; + this._visualVariables = this._parseVisualVariables(rendererJson.visualVariables); + L.Util.setOptions(this, options); + }, + + _parseVisualVariables: function (visualVariables) { + var visVars = {}; + if (visualVariables) { + for (var i = 0; i < visualVariables.length; i++) { + visVars[visualVariables[i].type] = visualVariables[i]; + } + } + return visVars; + }, + + _createDefaultSymbol: function () { + if (this._rendererJson.defaultSymbol) { + this._defaultSymbol = this._newSymbol(this._rendererJson.defaultSymbol); + this._defaultSymbol._isDefault = true; + } + }, + + _newSymbol: function (symbolJson) { + if (symbolJson.type === 'esriSMS' || symbolJson.type === 'esriPMS') { + this._pointSymbols = true; + return pointSymbol(symbolJson, this.options); + } + if (symbolJson.type === 'esriSLS') { + return lineSymbol(symbolJson, this.options); + } + if (symbolJson.type === 'esriSFS') { + return polygonSymbol(symbolJson, this.options); + } + }, + + _getSymbol: function () { + // override + }, + + attachStylesToLayer: function (layer) { + if (this._pointSymbols) { + layer.options.pointToLayer = L.Util.bind(this.pointToLayer, this); + } else { + layer.options.style = L.Util.bind(this.style, this); + layer._originalStyle = layer.options.style; + } + }, + + pointToLayer: function (geojson, latlng) { + var sym = this._getSymbol(geojson); + if (sym && sym.pointToLayer) { + // right now custom panes are the only option pushed through + return sym.pointToLayer(geojson, latlng, this._visualVariables, this.options); + } + // invisible symbology + return L.circleMarker(latlng, {radius: 0, opacity: 0}); + }, + + style: function (feature) { + var userStyles; + if (this.options.userDefinedStyle) { + userStyles = this.options.userDefinedStyle(feature); + } + // find the symbol to represent this feature + var sym = this._getSymbol(feature); + if (sym) { + return this.mergeStyles(sym.style(feature, this._visualVariables), userStyles); + } else { + // invisible symbology + return this.mergeStyles({opacity: 0, fillOpacity: 0}, userStyles); + } + }, + + mergeStyles: function (styles, userStyles) { + var mergedStyles = {}; + var attr; + // copy renderer style attributes + for (attr in styles) { + if (styles.hasOwnProperty(attr)) { + mergedStyles[attr] = styles[attr]; + } + } + // override with user defined style attributes + if (userStyles) { + for (attr in userStyles) { + if (userStyles.hasOwnProperty(attr)) { + mergedStyles[attr] = userStyles[attr]; + } + } + } + return mergedStyles; + } + }); + + var SimpleRenderer = Renderer.extend({ + initialize: function (rendererJson, options) { + Renderer.prototype.initialize.call(this, rendererJson, options); + this._createSymbol(); + }, + + _createSymbol: function () { + if (this._rendererJson.symbol) { + this._symbols.push(this._newSymbol(this._rendererJson.symbol)); + } + }, + + _getSymbol: function () { + return this._symbols[0]; + } + }); + + function simpleRenderer (rendererJson, options) { + return new SimpleRenderer(rendererJson, options); + } + + var ClassBreaksRenderer = Renderer.extend({ + initialize: function (rendererJson, options) { + Renderer.prototype.initialize.call(this, rendererJson, options); + this._field = this._rendererJson.field; + if (this._rendererJson.normalizationType && this._rendererJson.normalizationType === 'esriNormalizeByField') { + this._normalizationField = this._rendererJson.normalizationField; + } + this._createSymbols(); + }, + + _createSymbols: function () { + var symbol; + var classbreaks = this._rendererJson.classBreakInfos; + + this._symbols = []; + + // create a symbol for each class break + for (var i = classbreaks.length - 1; i >= 0; i--) { + if (this.options.proportionalPolygon && this._rendererJson.backgroundFillSymbol) { + symbol = this._newSymbol(this._rendererJson.backgroundFillSymbol); + } else { + symbol = this._newSymbol(classbreaks[i].symbol); + } + symbol.val = classbreaks[i].classMaxValue; + this._symbols.push(symbol); + } + // sort the symbols in ascending value + this._symbols.sort(function (a, b) { + return a.val > b.val ? 1 : -1; + }); + this._createDefaultSymbol(); + this._maxValue = this._symbols[this._symbols.length - 1].val; + }, + + _getSymbol: function (feature) { + var val = feature.properties[this._field]; + if (this._normalizationField) { + var normValue = feature.properties[this._normalizationField]; + if (!isNaN(normValue) && normValue !== 0) { + val = val / normValue; + } else { + return this._defaultSymbol; + } + } + + if (val > this._maxValue) { + return this._defaultSymbol; + } + var symbol = this._symbols[0]; + for (var i = this._symbols.length - 1; i >= 0; i--) { + if (val > this._symbols[i].val) { + break; + } + symbol = this._symbols[i]; + } + return symbol; + } + }); + + function classBreaksRenderer (rendererJson, options) { + return new ClassBreaksRenderer(rendererJson, options); + } + + var UniqueValueRenderer = Renderer.extend({ + initialize: function (rendererJson, options) { + Renderer.prototype.initialize.call(this, rendererJson, options); + this._field = this._rendererJson.field1; + this._createSymbols(); + }, + + _createSymbols: function () { + var symbol; + var uniques = this._rendererJson.uniqueValueInfos; + + // create a symbol for each unique value + for (var i = uniques.length - 1; i >= 0; i--) { + symbol = this._newSymbol(uniques[i].symbol); + symbol.val = uniques[i].value; + this._symbols.push(symbol); + } + this._createDefaultSymbol(); + }, + + _getSymbol: function (feature) { + var val = feature.properties[this._field]; + // accumulate values if there is more than one field defined + if (this._rendererJson.fieldDelimiter && this._rendererJson.field2) { + var val2 = feature.properties[this._rendererJson.field2]; + if (val2) { + val += this._rendererJson.fieldDelimiter + val2; + var val3 = feature.properties[this._rendererJson.field3]; + if (val3) { + val += this._rendererJson.fieldDelimiter + val3; + } + } + } + + var symbol = this._defaultSymbol; + for (var i = this._symbols.length - 1; i >= 0; i--) { + // using the === operator does not work if the field + // of the unique renderer is not a string + /*eslint-disable */ + if (this._symbols[i].val == val) { + symbol = this._symbols[i]; + } + /*eslint-enable */ + } + return symbol; + } + }); + + function uniqueValueRenderer (rendererJson, options) { + return new UniqueValueRenderer(rendererJson, options); + } + + L.esri.FeatureLayer.addInitHook(function () { + if (this.options.ignoreRenderer) { + return; + } + var oldOnAdd = L.Util.bind(this.onAdd, this); + var oldUnbindPopup = L.Util.bind(this.unbindPopup, this); + var oldOnRemove = L.Util.bind(this.onRemove, this); + L.Util.bind(this.createNewLayer, this); + + this.metadata(function (error, response) { + if (error) { + return; + } if (response && response.drawingInfo) { + this._setRenderers(response); + } if (this._alreadyAdded) { + this.setStyle(this._originalStyle); + } + }, this); + + this.onAdd = function (map) { + oldOnAdd(map); + this._addPointLayer(map); + this._alreadyAdded = true; + }; + + this.onRemove = function (map) { + oldOnRemove(map); + if (this._pointLayer) { + var pointLayers = this._pointLayer.getLayers(); + for (var i in pointLayers) { + map.removeLayer(pointLayers[i]); + } + } + }; + + this.unbindPopup = function () { + oldUnbindPopup(); + if (this._pointLayer) { + var pointLayers = this._pointLayer.getLayers(); + for (var i in pointLayers) { + pointLayers[i].unbindPopup(); + } + } + }; + + this._addPointLayer = function (map) { + if (this._pointLayer) { + this._pointLayer.addTo(map); + this._pointLayer.bringToFront(); + } + }; + + this._createPointLayer = function () { + if (!this._pointLayer) { + this._pointLayer = L.geoJson(); + // store the feature ids that have already been added to the map + this._pointLayerIds = {}; + + if (this._popup) { + var popupFunction = function (feature, layer) { + layer.bindPopup(this._popup(feature, layer), this._popupOptions); + }; + this._pointLayer.options.onEachFeature = L.Util.bind(popupFunction, this); + } + } + }; + + this.createNewLayer = function (geojson) { + var fLayer = L.GeoJSON.geometryToLayer(geojson, this.options); + + // add a point layer when the polygon is represented as proportional marker symbols + if (this._hasProportionalSymbols) { + var centroid = this.getPolygonCentroid(geojson.geometry.coordinates); + if (!(isNaN(centroid[0]) || isNaN(centroid[0]))) { + this._createPointLayer(); + + var featureId = geojson.id.toString(); + // only add the feature if it does not already exist on the map + if (!this._pointLayerIds[featureId]) { + var pointjson = this.getPointJson(geojson, centroid); + + this._pointLayer.addData(pointjson); + this._pointLayerIds[featureId] = true; + } + + this._pointLayer.bringToFront(); + } + } + return fLayer; + }; + + this.getPolygonCentroid = function (coordinates) { + var pts = coordinates[0][0]; + if (pts.length === 2) { + pts = coordinates[0]; + } + + var twicearea = 0; + var x = 0; + var y = 0; + var nPts = pts.length; + var p1; + var p2; + var f; + + for (var i = 0, j = nPts - 1; i < nPts; j = i++) { + p1 = pts[i]; p2 = pts[j]; + twicearea += p1[0] * p2[1]; + twicearea -= p1[1] * p2[0]; + f = p1[0] * p2[1] - p2[0] * p1[1]; + x += (p1[0] + p2[0]) * f; + y += (p1[1] + p2[1]) * f; + } + f = twicearea * 3; + return [x / f, y / f]; + }; + + this.getPointJson = function (geojson, centroid) { + return { + type: 'Feature', + properties: geojson.properties, + id: geojson.id, + geometry: { + type: 'Point', + coordinates: [centroid[0], centroid[1]] + } + }; + }; + + this._checkForProportionalSymbols = function (geometryType, renderer) { + this._hasProportionalSymbols = false; + if (geometryType === 'esriGeometryPolygon') { + if (renderer.backgroundFillSymbol) { + this._hasProportionalSymbols = true; + } + // check to see if the first symbol in the classbreaks is a marker symbol + if (renderer.classBreakInfos && renderer.classBreakInfos.length) { + var sym = renderer.classBreakInfos[0].symbol; + if (sym && (sym.type === 'esriSMS' || sym.type === 'esriPMS')) { + this._hasProportionalSymbols = true; + } + } + } + }; + + this._setRenderers = function (geojson) { + var rend; + var rendererInfo = geojson.drawingInfo.renderer; + + var options = { + url: this.options.url + }; + + if (this.options.token) { + options.token = this.options.token; + } + if (this.options.pane) { + options.pane = this.options.pane; + } + if (geojson.drawingInfo.transparency) { + options.layerTransparency = geojson.drawingInfo.transparency; + } + if (this.options.style) { + options.userDefinedStyle = this.options.style; + } + + switch (rendererInfo.type) { + case 'classBreaks': + this._checkForProportionalSymbols(geojson.geometryType, rendererInfo); + if (this._hasProportionalSymbols) { + this._createPointLayer(); + var pRend = classBreaksRenderer(rendererInfo, options); + pRend.attachStylesToLayer(this._pointLayer); + options.proportionalPolygon = true; + } + rend = classBreaksRenderer(rendererInfo, options); + break; + case 'uniqueValue': + rend = uniqueValueRenderer(rendererInfo, options); + break; + default: + rend = simpleRenderer(rendererInfo, options); + } + rend.attachStylesToLayer(this); + }; + }); + + exports.VERSION = version; + exports.Renderer = Renderer; + exports.SimpleRenderer = SimpleRenderer; + exports.simpleRenderer = simpleRenderer; + exports.ClassBreaksRenderer = ClassBreaksRenderer; + exports.classBreaksRenderer = classBreaksRenderer; + exports.UniqueValueRenderer = UniqueValueRenderer; + exports.uniqueValueRenderer = uniqueValueRenderer; + exports.Symbol = Symbol; + exports.PointSymbol = PointSymbol; + exports.pointSymbol = pointSymbol; + exports.LineSymbol = LineSymbol; + exports.lineSymbol = lineSymbol; + exports.PolygonSymbol = PolygonSymbol; + exports.polygonSymbol = polygonSymbol; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL1N5bWJvbHMvU3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtc2hhcGUtbWFya2Vycy9zcmMvU2hhcGVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9Dcm9zc01hcmtlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9sZWFmbGV0LXNoYXBlLW1hcmtlcnMvc3JjL1hNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9TcXVhcmVNYXJrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvbGVhZmxldC1zaGFwZS1tYXJrZXJzL3NyYy9EaWFtb25kTWFya2VyLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9pbnRTeW1ib2wuanMiLCIuLi9zcmMvU3ltYm9scy9MaW5lU3ltYm9sLmpzIiwiLi4vc3JjL1N5bWJvbHMvUG9seWdvblN5bWJvbC5qcyIsIi4uL3NyYy9SZW5kZXJlcnMvUmVuZGVyZXIuanMiLCIuLi9zcmMvUmVuZGVyZXJzL1NpbXBsZVJlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9DbGFzc0JyZWFrc1JlbmRlcmVyLmpzIiwiLi4vc3JjL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyLmpzIiwiLi4vc3JjL0ZlYXR1cmVMYXllckhvb2suanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtcmVuZGVyZXJzXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJlc3JpLWxlYWZsZXQgcGx1Z2luIGZvciByZW5kZXJpbmdcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjJcIixcbiAgXCJhdXRob3JcIjogXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJSYWNoZWwgTmVobWVyIDxybmVobWVyQGVzcmkuY29tPlwiLFxuICAgIFwiSm9obiBHcmF2b2lzIDxqZ3Jhdm9pc0Blc3JpLmNvbT5cIlxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4wLWJldGEuOFwiLFxuICAgICBcImxlYWZsZXRcIjogXCJeMS4wLjAtYmV0YS4yXCIsXG4gICAgIFwibGVhZmxldC1zaGFwZS1tYXJrZXJzXCI6IFwiXjEuMC40XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYmFiZWxpZnlcIjogXCJeNi4xLjNcIixcbiAgICBcImNoYWlcIjogXCIyLjMuMFwiLFxuICAgIFwiZ2gtcmVsZWFzZVwiOiBcIl4yLjAuMFwiLFxuICAgIFwiaHR0cC1zZXJ2ZXJcIjogXCJeMC44LjVcIixcbiAgICBcImlzcGFydGFcIjogXCJeMy4wLjNcIixcbiAgICBcImlzdGFuYnVsXCI6IFwiXjAuNC4yXCIsXG4gICAgXCJrYXJtYVwiOiBcIl4wLjEyLjI0XCIsXG4gICAgXCJrYXJtYS1jaGFpLXNpbm9uXCI6IFwiXjAuMS4zXCIsXG4gICAgXCJrYXJtYS1jb3ZlcmFnZVwiOiBcIl4wLjUuM1wiLFxuICAgIFwia2FybWEtbW9jaGFcIjogXCJeMC4xLjBcIixcbiAgICBcImthcm1hLW1vY2hhLXJlcG9ydGVyXCI6IFwiXjAuMi41XCIsXG4gICAgXCJrYXJtYS1waGFudG9tanMtbGF1bmNoZXJcIjogXCJeMC4xLjRcIixcbiAgICBcImthcm1hLXNvdXJjZW1hcC1sb2FkZXJcIjogXCJeMC4zLjVcIixcbiAgICBcIm1rZGlycFwiOiBcIl4wLjUuMVwiLFxuICAgIFwibW9jaGFcIjogXCJeMi4zLjRcIixcbiAgICBcInBoYW50b21qc1wiOiBcIl4xLjkuMTdcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMi4wXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNpbm9uXCI6IFwiXjEuMTEuMVwiLFxuICAgIFwic2lub24tY2hhaVwiOiBcIjIuNy4wXCIsXG4gICAgXCJ1Z2xpZnktanNcIjogXCJeMi40LjIzXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cDovL2VzcmkuZ2l0aHViLmlvL2VzcmktbGVhZmxldFwiLFxuICBcImpzbmV4dDptYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCIsXG4gIFwianNwbVwiOiB7XG4gICAgXCJyZWdpc3RyeVwiOiBcIm5wbVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiZXM2XCIsXG4gICAgXCJtYWluXCI6IFwic3JjL0VzcmlMZWFmbGV0UmVuZGVyZXJzLmpzXCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJhcmNnaXNcIixcbiAgICBcImVzcmlcIixcbiAgICBcImVzcmkgbGVhZmxldFwiLFxuICAgIFwiZ2lzXCIsXG4gICAgXCJsZWFmbGV0IHBsdWdpblwiLFxuICAgIFwibWFwcGluZ1wiLFxuICAgIFwicmVuZGVyZXJzXCIsXG4gICAgXCJzeW1ib2xvZ3lcIlxuICBdLFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXJlbmRlcmVycy1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC1yZW5kZXJlcnMtZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0QGdpdGh1Yi5jb206RXNyaS9lc3JpLWxlYWZsZXQtcmVuZGVyZXJzLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG5cbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgc3JjLyoqLyouanNcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwicmVsZWFzZVwiOiBcIi4vc2NyaXB0cy9yZWxlYXNlLnNoXCIsXG4gICAgXCJzdGFydFwiOiBcIndhdGNoICducG0gcnVuIGJ1aWxkJyBzcmMgJiBodHRwLXNlcnZlciAtcCA1MDAwIC1jLTEgLW9cIixcbiAgICBcInRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBidWlsZCAmJiBrYXJtYSBzdGFydFwiXG4gIH1cbn1cbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFN5bWJvbCA9IEwuQ2xhc3MuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9zeW1ib2xKc29uID0gc3ltYm9sSnNvbjtcbiAgICB0aGlzLnZhbCA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVzID0ge307XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgdGhpcy5fbGF5ZXJUcmFuc3BhcmVuY3kgPSAxO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGF5ZXJUcmFuc3BhcmVuY3kpIHtcbiAgICAgIHRoaXMuX2xheWVyVHJhbnNwYXJlbmN5ID0gMSAtIChvcHRpb25zLmxheWVyVHJhbnNwYXJlbmN5IC8gMTAwLjApO1xuICAgIH1cbiAgfSxcblxuICAvLyB0aGUgZ2VvanNvbiB2YWx1ZXMgcmV0dXJuZWQgYXJlIGluIHBvaW50c1xuICBwaXhlbFZhbHVlOiBmdW5jdGlvbiAocG9pbnRWYWx1ZSkge1xuICAgIHJldHVybiBwb2ludFZhbHVlICogMS4zMzM7XG4gIH0sXG5cbiAgLy8gY29sb3IgaXMgYW4gYXJyYXkgW3IsZyxiLGFdXG4gIGNvbG9yVmFsdWU6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiAncmdiKCcgKyBjb2xvclswXSArICcsJyArIGNvbG9yWzFdICsgJywnICsgY29sb3JbMl0gKyAnKSc7XG4gIH0sXG5cbiAgYWxwaGFWYWx1ZTogZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGFscGhhID0gY29sb3JbM10gLyAyNTUuMDtcbiAgICByZXR1cm4gYWxwaGEgKiB0aGlzLl9sYXllclRyYW5zcGFyZW5jeTtcbiAgfSxcblxuICBnZXRTaXplOiBmdW5jdGlvbiAoZmVhdHVyZSwgc2l6ZUluZm8pIHtcbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmllbGQgPSBzaXplSW5mby5maWVsZDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIGZlYXR1cmVWYWx1ZSA9IG51bGw7XG5cbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGZlYXR1cmVWYWx1ZSA9IGF0dHJbZmllbGRdO1xuICAgICAgdmFyIG1pblNpemUgPSBzaXplSW5mby5taW5TaXplO1xuICAgICAgdmFyIG1heFNpemUgPSBzaXplSW5mby5tYXhTaXplO1xuICAgICAgdmFyIG1pbkRhdGFWYWx1ZSA9IHNpemVJbmZvLm1pbkRhdGFWYWx1ZTtcbiAgICAgIHZhciBtYXhEYXRhVmFsdWUgPSBzaXplSW5mby5tYXhEYXRhVmFsdWU7XG4gICAgICB2YXIgZmVhdHVyZVJhdGlvO1xuICAgICAgdmFyIG5vcm1GaWVsZCA9IHNpemVJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICAgIHZhciBub3JtVmFsdWUgPSBhdHRyID8gcGFyc2VGbG9hdChhdHRyW25vcm1GaWVsZF0pIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICAgIGZlYXR1cmVWYWx1ZSAvPSBub3JtVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaW5TaXplICE9PSBudWxsICYmIG1heFNpemUgIT09IG51bGwgJiYgbWluRGF0YVZhbHVlICE9PSBudWxsICYmIG1heERhdGFWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZmVhdHVyZVZhbHVlIDw9IG1pbkRhdGFWYWx1ZSkge1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplO1xuICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmVWYWx1ZSA+PSBtYXhEYXRhVmFsdWUpIHtcbiAgICAgICAgICBzaXplID0gbWF4U2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlUmF0aW8gPSAoZmVhdHVyZVZhbHVlIC0gbWluRGF0YVZhbHVlKSAvIChtYXhEYXRhVmFsdWUgLSBtaW5EYXRhVmFsdWUpO1xuICAgICAgICAgIHNpemUgPSBtaW5TaXplICsgKGZlYXR1cmVSYXRpbyAqIChtYXhTaXplIC0gbWluU2l6ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaXplID0gaXNOYU4oc2l6ZSkgPyAwIDogc2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG5cbiAgZ2V0Q29sb3I6IGZ1bmN0aW9uIChmZWF0dXJlLCBjb2xvckluZm8pIHtcbiAgICAvLyByZXF1aXJlZCBpbmZvcm1hdGlvbiB0byBnZXQgY29sb3JcbiAgICBpZiAoIShmZWF0dXJlLnByb3BlcnRpZXMgJiYgY29sb3JJbmZvICYmIGNvbG9ySW5mby5maWVsZCAmJiBjb2xvckluZm8uc3RvcHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgYXR0ciA9IGZlYXR1cmUucHJvcGVydGllcztcbiAgICB2YXIgZmVhdHVyZVZhbHVlID0gYXR0cltjb2xvckluZm8uZmllbGRdO1xuICAgIHZhciBsb3dlckJvdW5kQ29sb3IsIHVwcGVyQm91bmRDb2xvciwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZDtcbiAgICB2YXIgbm9ybUZpZWxkID0gY29sb3JJbmZvLm5vcm1hbGl6YXRpb25GaWVsZDtcbiAgICB2YXIgbm9ybVZhbHVlID0gYXR0ciA/IHBhcnNlRmxvYXQoYXR0cltub3JtRmllbGRdKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoZmVhdHVyZVZhbHVlID09PSBudWxsIHx8IChub3JtRmllbGQgJiYgKChpc05hTihub3JtVmFsdWUpIHx8IG5vcm1WYWx1ZSA9PT0gMCkpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihub3JtVmFsdWUpKSB7XG4gICAgICBmZWF0dXJlVmFsdWUgLz0gbm9ybVZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlVmFsdWUgPD0gY29sb3JJbmZvLnN0b3BzWzBdLnZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sb3JJbmZvLnN0b3BzWzBdLmNvbG9yO1xuICAgIH1cbiAgICB2YXIgbGFzdFN0b3AgPSBjb2xvckluZm8uc3RvcHNbY29sb3JJbmZvLnN0b3BzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChmZWF0dXJlVmFsdWUgPj0gbGFzdFN0b3AudmFsdWUpIHtcbiAgICAgIHJldHVybiBsYXN0U3RvcC5jb2xvcjtcbiAgICB9XG5cbiAgICAvLyBnbyB0aHJvdWdoIHRoZSBzdG9wcyB0byBmaW5kIG1pbiBhbmQgbWF4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvckluZm8uc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdG9wSW5mbyA9IGNvbG9ySW5mby5zdG9wc1tpXTtcblxuICAgICAgaWYgKHN0b3BJbmZvLnZhbHVlIDw9IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICBsb3dlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgbG93ZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdG9wSW5mby52YWx1ZSA+IGZlYXR1cmVWYWx1ZSkge1xuICAgICAgICB1cHBlckJvdW5kQ29sb3IgPSBzdG9wSW5mby5jb2xvcjtcbiAgICAgICAgdXBwZXJCb3VuZCA9IHN0b3BJbmZvLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmZWF0dXJlIGZhbGxzIGJldHdlZW4gdHdvIHN0b3BzLCBpbnRlcnBsYXRlIHRoZSBjb2xvcnNcbiAgICBpZiAoIWlzTmFOKGxvd2VyQm91bmQpICYmICFpc05hTih1cHBlckJvdW5kKSkge1xuICAgICAgdmFyIHJhbmdlID0gdXBwZXJCb3VuZCAtIGxvd2VyQm91bmQ7XG4gICAgICBpZiAocmFuZ2UgPiAwKSB7XG4gICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIHZhciB1cHBlckJvdW5kQ29sb3JXZWlnaHQgPSAoZmVhdHVyZVZhbHVlIC0gbG93ZXJCb3VuZCkgLyByYW5nZTtcbiAgICAgICAgaWYgKHVwcGVyQm91bmRDb2xvcldlaWdodCkge1xuICAgICAgICAgIC8vIG1vcmUgd2VpZ2h0IHRoZSBmdXJ0aGVyIGl0IGlzIGZyb20gdGhlIHVwcGVyIGJvdW5kXG4gICAgICAgICAgdmFyIGxvd2VyQm91bmRDb2xvcldlaWdodCA9ICh1cHBlckJvdW5kIC0gZmVhdHVyZVZhbHVlKSAvIHJhbmdlO1xuICAgICAgICAgIGlmIChsb3dlckJvdW5kQ29sb3JXZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIGludGVycG9sYXRlIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgY29sb3IgYnkgYXBwbHlpbmcgdGhlXG4gICAgICAgICAgICAvLyB3ZWlnaHRzIHRvIGVhY2ggb2YgdGhlIHJnYmEgY29sb3JzIGFuZCBhZGRpbmcgdGhlbSB0b2dldGhlclxuICAgICAgICAgICAgdmFyIGludGVycG9sYXRlZENvbG9yID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWRDb2xvcltqXSA9IE1hdGgucm91bmQobG93ZXJCb3VuZENvbG9yW2pdICogbG93ZXJCb3VuZENvbG9yV2VpZ2h0ICsgdXBwZXJCb3VuZENvbG9yW2pdICogdXBwZXJCb3VuZENvbG9yV2VpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZWRDb2xvcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZlYXR1cmVWYWx1ZSBhbmQgdXBwZXJCb3VuZCwgMTAwJSBvZiB1cHBlckJvdW5kQ29sb3JcbiAgICAgICAgICAgIHJldHVybiB1cHBlckJvdW5kQ29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBmZWF0dXJlVmFsdWUgYW5kIGxvd2VyQm91bmQsIDEwMCUgb2YgbG93ZXJCb3VuZENvbG9yXG4gICAgICAgICAgcmV0dXJuIGxvd2VyQm91bmRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBnZXQgdG8gaGVyZSwgbm9uZSBvZiB0aGUgY2FzZXMgYXBwbHkgc28gcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBzeW1ib2wgKHN5bWJvbEpzb24pIHtcbi8vICAgcmV0dXJuIG5ldyBTeW1ib2woc3ltYm9sSnNvbik7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuXG5leHBvcnQgdmFyIFNoYXBlTWFya2VyID0gTC5QYXRoLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICB0aGlzLl9sYXRsbmcgPSBMLmxhdExuZyhsYXRsbmcpO1xuICAgIHRoaXMuX3N2Z0NhbnZhc0luY2x1ZGVzKCk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gaW1wbGVtZW50IGluIHN1YiBjbGFzc1xuICB9LFxuXG4gIF9wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcG9pbnQgPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhdGgoKTtcbiAgICB9XG4gIH0sXG5cbiAgX3VwZGF0ZVBhdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpbXBsZW1lbnQgaW4gc3ViIGNsYXNzXG4gIH0sXG5cbiAgc2V0TGF0TG5nOiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgdGhpcy5fbGF0bG5nID0gTC5sYXRMbmcobGF0bG5nKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICAgIHJldHVybiB0aGlzLmZpcmUoJ21vdmUnLCB7bGF0bG5nOiB0aGlzLl9sYXRsbmd9KTtcbiAgfSxcblxuICBnZXRMYXRMbmc6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0bG5nO1xuICB9LFxuXG4gIHNldFNpemU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgcmV0dXJuIHRoaXMucmVkcmF3KCk7XG4gIH0sXG5cbiAgZ2V0U2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG59KTtcbiIsImltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgU2hhcGVNYXJrZXIgfSBmcm9tICcuL1NoYXBlTWFya2VyJztcblxuZXhwb3J0IHZhciBDcm9zc01hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVDcm9zc01hcmtlcih0aGlzKTtcbiAgfSxcblxuICBfc3ZnQ2FudmFzSW5jbHVkZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBMLkNhbnZhcy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVDcm9zc01hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcbiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCArIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlQ3Jvc3NNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgbGF0bG5nLnggKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgbGF0bG5nLnkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBjcm9zc01hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDcm9zc01hcmtlcihsYXRsbmcsIHNpemUsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3Jvc3NNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgWE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVYTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZVhNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICB0aGlzLl9maWxsU3Ryb2tlKGN0eCwgbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTC5TVkcuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlWE1hcmtlcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgIHZhciBsYXRsbmcgPSBsYXllci5fcG9pbnQ7XG4gICAgICAgIHZhciBvZmZzZXQgPSBsYXllci5fc2l6ZSAvIDIuMDtcblxuICAgICAgICBpZiAoTC5Ccm93c2VyLnZtbCkge1xuICAgICAgICAgIGxhdGxuZy5fcm91bmQoKTtcbiAgICAgICAgICBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RyID0gJ00nICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSArIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCAtIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpICtcbiAgICAgICAgICAnTScgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54ICsgb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgeE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBYTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4TWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBTaGFwZU1hcmtlciB9IGZyb20gJy4vU2hhcGVNYXJrZXInO1xuXG5leHBvcnQgdmFyIFNxdWFyZU1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVTcXVhcmVNYXJrZXIodGhpcyk7XG4gIH0sXG5cbiAgX3N2Z0NhbnZhc0luY2x1ZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgTC5DYW52YXMuaW5jbHVkZSh7XG4gICAgICBfdXBkYXRlU3F1YXJlTWFya2VyOiBmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgdmFyIGxhdGxuZyA9IGxheWVyLl9wb2ludDtcbiAgICAgICAgdmFyIG9mZnNldCA9IGxheWVyLl9zaXplIC8gMi4wO1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcblxuICAgICAgICBjdHgubW92ZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSArIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggLSBvZmZzZXQsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkgLSBvZmZzZXQpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54ICsgb2Zmc2V0LCBsYXRsbmcueSAtIG9mZnNldCk7XG5cbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgICAgIHRoaXMuX2ZpbGxTdHJva2UoY3R4LCBsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBMLlNWRy5pbmNsdWRlKHtcbiAgICAgIF91cGRhdGVTcXVhcmVNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgKyBvZmZzZXQpICtcbiAgICAgICAgICAnTCcgKyAobGF0bG5nLnggLSBvZmZzZXQpICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyAobGF0bG5nLnkgLSBvZmZzZXQpO1xuXG4gICAgICAgIHN0ciA9IHN0ciArIChMLkJyb3dzZXIuc3ZnID8gJ3onIDogJ3gnKTtcblxuICAgICAgICB0aGlzLl9zZXRQYXRoKGxheWVyLCBzdHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuZXhwb3J0IHZhciBzcXVhcmVNYXJrZXIgPSBmdW5jdGlvbiAobGF0bG5nLCBzaXplLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU3F1YXJlTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzcXVhcmVNYXJrZXI7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFNoYXBlTWFya2VyIH0gZnJvbSAnLi9TaGFwZU1hcmtlcic7XG5cbmV4cG9ydCB2YXIgRGlhbW9uZE1hcmtlciA9IFNoYXBlTWFya2VyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBmaWxsOiB0cnVlXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZywgc2l6ZSwgb3B0aW9ucykge1xuICAgIFNoYXBlTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgbGF0bG5nLCBzaXplLCBvcHRpb25zKTtcbiAgfSxcblxuICBfdXBkYXRlUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLl91cGRhdGVEaWFtb25kTWFya2VyKHRoaXMpO1xuICB9LFxuXG4gIF9zdmdDYW52YXNJbmNsdWRlczogZnVuY3Rpb24gKCkge1xuICAgIEwuQ2FudmFzLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG4gICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgIGN0eC5tb3ZlVG8obGF0bG5nLngsIGxhdGxuZy55ICsgb2Zmc2V0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhsYXRsbmcueCAtIG9mZnNldCwgbGF0bG5nLnkpO1xuICAgICAgICBjdHgubGluZVRvKGxhdGxuZy54LCBsYXRsbmcueSAtIG9mZnNldCk7XG4gICAgICAgIGN0eC5saW5lVG8obGF0bG5nLnggKyBvZmZzZXQsIGxhdGxuZy55KTtcblxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICAgICAgdGhpcy5fZmlsbFN0cm9rZShjdHgsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIEwuU1ZHLmluY2x1ZGUoe1xuICAgICAgX3VwZGF0ZURpYW1vbmRNYXJrZXI6IGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICB2YXIgbGF0bG5nID0gbGF5ZXIuX3BvaW50O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGF5ZXIuX3NpemUgLyAyLjA7XG5cbiAgICAgICAgaWYgKEwuQnJvd3Nlci52bWwpIHtcbiAgICAgICAgICBsYXRsbmcuX3JvdW5kKCk7XG4gICAgICAgICAgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9ICdNJyArIGxhdGxuZy54ICsgJywnICsgKGxhdGxuZy55ICsgb2Zmc2V0KSArXG4gICAgICAgICAgJ0wnICsgKGxhdGxuZy54IC0gb2Zmc2V0KSArICcsJyArIGxhdGxuZy55ICtcbiAgICAgICAgICAnTCcgKyBsYXRsbmcueCArICcsJyArIChsYXRsbmcueSAtIG9mZnNldCkgK1xuICAgICAgICAgICdMJyArIChsYXRsbmcueCArIG9mZnNldCkgKyAnLCcgKyBsYXRsbmcueTtcblxuICAgICAgICBzdHIgPSBzdHIgKyAoTC5Ccm93c2VyLnN2ZyA/ICd6JyA6ICd4Jyk7XG5cbiAgICAgICAgdGhpcy5fc2V0UGF0aChsYXllciwgc3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG5cbmV4cG9ydCB2YXIgZGlhbW9uZE1hcmtlciA9IGZ1bmN0aW9uIChsYXRsbmcsIHNpemUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEaWFtb25kTWFya2VyKGxhdGxuZywgc2l6ZSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkaWFtb25kTWFya2VyO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcbmltcG9ydCB7c3F1YXJlTWFya2VyLCB4TWFya2VyLCBjcm9zc01hcmtlciwgZGlhbW9uZE1hcmtlcn0gZnJvbSAnbGVhZmxldC1zaGFwZS1tYXJrZXJzJztcblxuZXhwb3J0IHZhciBQb2ludFN5bWJvbCA9IFN5bWJvbC5leHRlbmQoe1xuXG4gIHN0YXRpY3M6IHtcbiAgICBNQVJLRVJUWVBFUzogWydlc3JpU01TQ2lyY2xlJywgJ2VzcmlTTVNDcm9zcycsICdlc3JpU01TRGlhbW9uZCcsICdlc3JpU01TU3F1YXJlJywgJ2VzcmlTTVNYJywgJ2VzcmlQTVMnXVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VydmljZVVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbikge1xuICAgICAgaWYgKHN5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLnNlcnZpY2VVcmwgKyAnaW1hZ2VzLycgKyB0aGlzLl9zeW1ib2xKc29uLnVybDtcbiAgICAgICAgdGhpcy5faWNvblVybCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50b2tlbiA/IHVybCArICc/dG9rZW49JyArIG9wdGlvbnMudG9rZW4gOiB1cmw7XG4gICAgICAgIC8vIGxlYWZsZXQgZG9lcyBub3QgYWxsb3cgcmVzaXppbmcgaWNvbnMgc28ga2VlcCBhIGhhc2ggb2YgZGlmZmVyZW50XG4gICAgICAgIC8vIGljb24gc2l6ZXMgdG8gdHJ5IGFuZCBrZWVwIGRvd24gb24gdGhlIG51bWJlciBvZiBpY29ucyBjcmVhdGVkXG4gICAgICAgIHRoaXMuX2ljb25zID0ge307XG4gICAgICAgIC8vIGNyZWF0ZSBiYXNlIGljb25cbiAgICAgICAgdGhpcy5pY29uID0gdGhpcy5fY3JlYXRlSWNvbih0aGlzLl9zeW1ib2xKc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5vdXRsaW5lICYmIHRoaXMuX3N5bWJvbEpzb24uc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSB0cnVlO1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUud2lkdGgpO1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24ub3V0bGluZS5jb2xvcik7XG4gICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLm91dGxpbmUuY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuc3Ryb2tlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLmZpbGxPcGFjaXR5ID0gdGhpcy5hbHBoYVZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlID09PSAnZXNyaVNNU0NpcmNsZScpIHtcbiAgICAgIHRoaXMuX3N0eWxlcy5yYWRpdXMgPSB0aGlzLnBpeGVsVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5zaXplKSAvIDIuMDtcbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZUljb246IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy5waXhlbFZhbHVlKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSB3aWR0aDtcbiAgICBpZiAob3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHZhciB4T2Zmc2V0ID0gd2lkdGggLyAyLjA7XG4gICAgdmFyIHlPZmZzZXQgPSBoZWlnaHQgLyAyLjA7XG5cbiAgICBpZiAob3B0aW9ucy54b2Zmc2V0KSB7XG4gICAgICB4T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnhvZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy55b2Zmc2V0KSB7XG4gICAgICB5T2Zmc2V0ICs9IHRoaXMucGl4ZWxWYWx1ZShvcHRpb25zLnlvZmZzZXQpO1xuICAgIH1cblxuICAgIHZhciBpY29uID0gTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHRoaXMuX2ljb25VcmwsXG4gICAgICBpY29uU2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgaWNvbkFuY2hvcjogW3hPZmZzZXQsIHlPZmZzZXRdXG4gICAgfSk7XG4gICAgdGhpcy5faWNvbnNbb3B0aW9ucy53aWR0aC50b1N0cmluZygpXSA9IGljb247XG4gICAgcmV0dXJuIGljb247XG4gIH0sXG5cbiAgX2dldEljb246IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGFscmVhZHkgY3JlYXRlZCBieSBzaXplXG4gICAgdmFyIGljb24gPSB0aGlzLl9pY29uc1tzaXplLnRvU3RyaW5nKCldO1xuICAgIGlmICghaWNvbikge1xuICAgICAgaWNvbiA9IHRoaXMuX2NyZWF0ZUljb24oe3dpZHRoOiBzaXplfSk7XG4gICAgfVxuICAgIHJldHVybiBpY29uO1xuICB9LFxuXG4gIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGdlb2pzb24sIGxhdGxuZywgdmlzdWFsVmFyaWFibGVzLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLl9zeW1ib2xKc29uLnNpemUgfHwgdGhpcy5fc3ltYm9sSnNvbi53aWR0aDtcbiAgICBpZiAoIXRoaXMuX2lzRGVmYXVsdCkge1xuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5zaXplSW5mbykge1xuICAgICAgICB2YXIgY2FsY3VsYXRlZFNpemUgPSB0aGlzLmdldFNpemUoZ2VvanNvbiwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKTtcbiAgICAgICAgaWYgKGNhbGN1bGF0ZWRTaXplKSB7XG4gICAgICAgICAgc2l6ZSA9IGNhbGN1bGF0ZWRTaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbykge1xuICAgICAgICB2YXIgY29sb3IgPSB0aGlzLmdldENvbG9yKGdlb2pzb24sIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbENvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbE9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24udHlwZSA9PT0gJ2VzcmlQTVMnKSB7XG4gICAgICB2YXIgbGF5ZXJPcHRpb25zID0gTC5leHRlbmQoe30sIHtpY29uOiB0aGlzLl9nZXRJY29uKHNpemUpfSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gTC5tYXJrZXIobGF0bG5nLCBsYXllck9wdGlvbnMpO1xuICAgIH1cbiAgICBzaXplID0gdGhpcy5waXhlbFZhbHVlKHNpemUpO1xuXG4gICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICBjYXNlICdlc3JpU01TU3F1YXJlJzpcbiAgICAgICAgcmV0dXJuIHNxdWFyZU1hcmtlcihsYXRsbmcsIHNpemUsIEwuZXh0ZW5kKHt9LCB0aGlzLl9zdHlsZXMsIG9wdGlvbnMpKTtcbiAgICAgIGNhc2UgJ2VzcmlTTVNEaWFtb25kJzpcbiAgICAgICAgcmV0dXJuIGRpYW1vbmRNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TQ3Jvc3MnOlxuICAgICAgICByZXR1cm4gY3Jvc3NNYXJrZXIobGF0bG5nLCBzaXplLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gICAgICBjYXNlICdlc3JpU01TWCc6XG4gICAgICAgIHJldHVybiB4TWFya2VyKGxhdGxuZywgc2l6ZSwgTC5leHRlbmQoe30sIHRoaXMuX3N0eWxlcywgb3B0aW9ucykpO1xuICAgIH1cbiAgICB0aGlzLl9zdHlsZXMucmFkaXVzID0gc2l6ZSAvIDIuMDtcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCBMLmV4dGVuZCh7fSwgdGhpcy5fc3R5bGVzLCBvcHRpb25zKSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRTeW1ib2wgKHN5bWJvbEpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQb2ludFN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcG9pbnRTeW1ib2w7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vU3ltYm9sJztcblxuZXhwb3J0IHZhciBMaW5lU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBOb3QgaW1wbGVtZW50ZWQgJ2VzcmlTTFNOdWxsJ1xuICAgIExJTkVUWVBFUzogWydlc3JpU0xTRGFzaCcsICdlc3JpU0xTRG90JywgJ2VzcmlTTFNEYXNoRG90RG90JywgJ2VzcmlTTFNEYXNoRG90JywgJ2VzcmlTTFNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmlsbFN0eWxlcygpO1xuICB9LFxuXG4gIF9maWxsU3R5bGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0cyB0aGF0IHNob3cgdXAgb24gYXJjZ2lzIG9ubGluZVxuICAgIHRoaXMuX3N0eWxlcy5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIHRoaXMuX3N0eWxlcy5saW5lSm9pbiA9ICdtaXRlcic7XG4gICAgdGhpcy5fc3R5bGVzLmZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLl9zdHlsZXMud2VpZ2h0ID0gMDtcblxuICAgIGlmICghdGhpcy5fc3ltYm9sSnNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3ltYm9sSnNvbi5jb2xvcikge1xuICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKHRoaXMuX3N5bWJvbEpzb24uY29sb3IpO1xuICAgICAgdGhpcy5fc3R5bGVzLm9wYWNpdHkgPSB0aGlzLmFscGhhVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLl9zeW1ib2xKc29uLndpZHRoKSkge1xuICAgICAgdGhpcy5fc3R5bGVzLndlaWdodCA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLndpZHRoKTtcblxuICAgICAgdmFyIGRhc2hWYWx1ZXMgPSBbXTtcblxuICAgICAgc3dpdGNoICh0aGlzLl9zeW1ib2xKc29uLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2VzcmlTTFNEYXNoJzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzQsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRG90JzpcbiAgICAgICAgICBkYXNoVmFsdWVzID0gWzEsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc3JpU0xTRGFzaERvdCc6XG4gICAgICAgICAgZGFzaFZhbHVlcyA9IFs4LCAzLCAxLCAzXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXNyaVNMU0Rhc2hEb3REb3QnOlxuICAgICAgICAgIGRhc2hWYWx1ZXMgPSBbOCwgMywgMSwgMywgMSwgM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZSB0aGUgZGFzaCB2YWx1ZXMgYW5kIHRoZSBsaW5lIHdlaWdodCB0byBzZXQgZGFzaCBhcnJheVxuICAgICAgaWYgKGRhc2hWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhc2hWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXNoVmFsdWVzW2ldICo9IHRoaXMuX3N0eWxlcy53ZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdHlsZXMuZGFzaEFycmF5ID0gZGFzaFZhbHVlcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgICBpZiAodmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSB7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkU2l6ZSA9IHRoaXMucGl4ZWxWYWx1ZSh0aGlzLmdldFNpemUoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLnNpemVJbmZvKSk7XG4gICAgICAgIGlmIChjYWxjdWxhdGVkU2l6ZSkge1xuICAgICAgICAgIHRoaXMuX3N0eWxlcy53ZWlnaHQgPSBjYWxjdWxhdGVkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5nZXRDb2xvcihmZWF0dXJlLCB2aXN1YWxWYXJpYWJsZXMuY29sb3JJbmZvKTtcbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzLmNvbG9yID0gdGhpcy5jb2xvclZhbHVlKGNvbG9yKTtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMub3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lU3ltYm9sIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTGluZVN5bWJvbChzeW1ib2xKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGluZVN5bWJvbDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9TeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi9MaW5lU3ltYm9sJztcblxuZXhwb3J0IHZhciBQb2x5Z29uU3ltYm9sID0gU3ltYm9sLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQ6ICdlc3JpU0ZTQmFja3dhcmREaWFnb25hbCcsJ2VzcmlTRlNDcm9zcycsJ2VzcmlTRlNEaWFnb25hbENyb3NzJywnZXNyaVNGU0ZvcndhcmREaWFnb25hbCcsJ2VzcmlTRlNIb3Jpem9udGFsJywnZXNyaVNGU051bGwnLCdlc3JpU0ZTVmVydGljYWwnXG4gICAgUE9MWUdPTlRZUEVTOiBbJ2VzcmlTRlNTb2xpZCddXG4gIH0sXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChzeW1ib2xKc29uLCBvcHRpb25zKSB7XG4gICAgU3ltYm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG4gICAgaWYgKHN5bWJvbEpzb24pIHtcbiAgICAgIHRoaXMuX2xpbmVTdHlsZXMgPSBsaW5lU3ltYm9sKHN5bWJvbEpzb24ub3V0bGluZSwgb3B0aW9ucykuc3R5bGUoKTtcbiAgICAgIHRoaXMuX2ZpbGxTdHlsZXMoKTtcbiAgICB9XG4gIH0sXG5cbiAgX2ZpbGxTdHlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fbGluZVN0eWxlcykge1xuICAgICAgaWYgKHRoaXMuX2xpbmVTdHlsZXMud2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIC8vIHdoZW4gd2VpZ2h0IGlzIDAsIHNldHRpbmcgdGhlIHN0cm9rZSB0byBmYWxzZSBjYW4gc3RpbGwgbG9vayBiYWRcbiAgICAgICAgLy8gKGdhcHMgYmV0d2VlbiB0aGUgcG9seWdvbnMpXG4gICAgICAgIHRoaXMuX3N0eWxlcy5zdHJva2UgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNvcHkgdGhlIGxpbmUgc3ltYm9sIHN0eWxlcyBpbnRvIHRoaXMgc3ltYm9sJ3Mgc3R5bGVzXG4gICAgICAgIGZvciAodmFyIHN0eWxlQXR0ciBpbiB0aGlzLl9saW5lU3R5bGVzKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzW3N0eWxlQXR0cl0gPSB0aGlzLl9saW5lU3R5bGVzW3N0eWxlQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGZpbGwgZm9yIHRoZSBwb2x5Z29uXG4gICAgaWYgKHRoaXMuX3N5bWJvbEpzb24pIHtcbiAgICAgIGlmICh0aGlzLl9zeW1ib2xKc29uLmNvbG9yICYmXG4gICAgICAgICAgLy8gZG9uJ3QgZmlsbCBwb2x5Z29uIGlmIHR5cGUgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICAgIFBvbHlnb25TeW1ib2wuUE9MWUdPTlRZUEVTLmluZGV4T2YodGhpcy5fc3ltYm9sSnNvbi5zdHlsZSA+PSAwKSkge1xuICAgICAgICB0aGlzLl9zdHlsZXMuZmlsbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsQ29sb3IgPSB0aGlzLmNvbG9yVmFsdWUodGhpcy5fc3ltYm9sSnNvbi5jb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZSh0aGlzLl9zeW1ib2xKc29uLmNvbG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiBmdW5jdGlvbiAoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzKSB7XG4gICAgaWYgKCF0aGlzLl9pc0RlZmF1bHQgJiYgdmlzdWFsVmFyaWFibGVzICYmIHZpc3VhbFZhcmlhYmxlcy5jb2xvckluZm8pIHtcbiAgICAgIHZhciBjb2xvciA9IHRoaXMuZ2V0Q29sb3IoZmVhdHVyZSwgdmlzdWFsVmFyaWFibGVzLmNvbG9ySW5mbyk7XG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgdGhpcy5fc3R5bGVzLmZpbGxDb2xvciA9IHRoaXMuY29sb3JWYWx1ZShjb2xvcik7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5maWxsT3BhY2l0eSA9IHRoaXMuYWxwaGFWYWx1ZShjb2xvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdHlsZXM7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvblN5bWJvbCAoc3ltYm9sSnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBvbHlnb25TeW1ib2w7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IHBvaW50U3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9pbnRTeW1ib2wnO1xuaW1wb3J0IGxpbmVTeW1ib2wgZnJvbSAnLi4vU3ltYm9scy9MaW5lU3ltYm9sJztcbmltcG9ydCBwb2x5Z29uU3ltYm9sIGZyb20gJy4uL1N5bWJvbHMvUG9seWdvblN5bWJvbCc7XG5cbmV4cG9ydCB2YXIgUmVuZGVyZXIgPSBMLkNsYXNzLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBwcm9wb3J0aW9uYWxQb2x5Z29uOiBmYWxzZSxcbiAgICBjbGlja2FibGU6IHRydWVcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgdGhpcy5fcmVuZGVyZXJKc29uID0gcmVuZGVyZXJKc29uO1xuICAgIHRoaXMuX3BvaW50U3ltYm9scyA9IGZhbHNlO1xuICAgIHRoaXMuX3N5bWJvbHMgPSBbXTtcbiAgICB0aGlzLl92aXN1YWxWYXJpYWJsZXMgPSB0aGlzLl9wYXJzZVZpc3VhbFZhcmlhYmxlcyhyZW5kZXJlckpzb24udmlzdWFsVmFyaWFibGVzKTtcbiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICBfcGFyc2VWaXN1YWxWYXJpYWJsZXM6IGZ1bmN0aW9uICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICB2YXIgdmlzVmFycyA9IHt9O1xuICAgIGlmICh2aXN1YWxWYXJpYWJsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzdWFsVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpc1ZhcnNbdmlzdWFsVmFyaWFibGVzW2ldLnR5cGVdID0gdmlzdWFsVmFyaWFibGVzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzVmFycztcbiAgfSxcblxuICBfY3JlYXRlRGVmYXVsdFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCkge1xuICAgICAgdGhpcy5fZGVmYXVsdFN5bWJvbCA9IHRoaXMuX25ld1N5bWJvbCh0aGlzLl9yZW5kZXJlckpzb24uZGVmYXVsdFN5bWJvbCk7XG4gICAgICB0aGlzLl9kZWZhdWx0U3ltYm9sLl9pc0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBfbmV3U3ltYm9sOiBmdW5jdGlvbiAoc3ltYm9sSnNvbikge1xuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU01TJyB8fCBzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpUE1TJykge1xuICAgICAgdGhpcy5fcG9pbnRTeW1ib2xzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwb2ludFN5bWJvbChzeW1ib2xKc29uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoc3ltYm9sSnNvbi50eXBlID09PSAnZXNyaVNMUycpIHtcbiAgICAgIHJldHVybiBsaW5lU3ltYm9sKHN5bWJvbEpzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChzeW1ib2xKc29uLnR5cGUgPT09ICdlc3JpU0ZTJykge1xuICAgICAgcmV0dXJuIHBvbHlnb25TeW1ib2woc3ltYm9sSnNvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gIH0sXG5cbiAgX2dldFN5bWJvbDogZnVuY3Rpb24gKCkge1xuICAgIC8vIG92ZXJyaWRlXG4gIH0sXG5cbiAgYXR0YWNoU3R5bGVzVG9MYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgaWYgKHRoaXMuX3BvaW50U3ltYm9scykge1xuICAgICAgbGF5ZXIub3B0aW9ucy5wb2ludFRvTGF5ZXIgPSBMLlV0aWwuYmluZCh0aGlzLnBvaW50VG9MYXllciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLm9wdGlvbnMuc3R5bGUgPSBMLlV0aWwuYmluZCh0aGlzLnN0eWxlLCB0aGlzKTtcbiAgICAgIGxheWVyLl9vcmlnaW5hbFN0eWxlID0gbGF5ZXIub3B0aW9ucy5zdHlsZTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRUb0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbiwgbGF0bG5nKSB7XG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChnZW9qc29uKTtcbiAgICBpZiAoc3ltICYmIHN5bS5wb2ludFRvTGF5ZXIpIHtcbiAgICAgIC8vIHJpZ2h0IG5vdyBjdXN0b20gcGFuZXMgYXJlIHRoZSBvbmx5IG9wdGlvbiBwdXNoZWQgdGhyb3VnaFxuICAgICAgcmV0dXJuIHN5bS5wb2ludFRvTGF5ZXIoZ2VvanNvbiwgbGF0bG5nLCB0aGlzLl92aXN1YWxWYXJpYWJsZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICByZXR1cm4gTC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7cmFkaXVzOiAwLCBvcGFjaXR5OiAwfSk7XG4gIH0sXG5cbiAgc3R5bGU6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHVzZXJTdHlsZXM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZFN0eWxlKSB7XG4gICAgICB1c2VyU3R5bGVzID0gdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUoZmVhdHVyZSk7XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIHN5bWJvbCB0byByZXByZXNlbnQgdGhpcyBmZWF0dXJlXG4gICAgdmFyIHN5bSA9IHRoaXMuX2dldFN5bWJvbChmZWF0dXJlKTtcbiAgICBpZiAoc3ltKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXJnZVN0eWxlcyhzeW0uc3R5bGUoZmVhdHVyZSwgdGhpcy5fdmlzdWFsVmFyaWFibGVzKSwgdXNlclN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGludmlzaWJsZSBzeW1ib2xvZ3lcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlU3R5bGVzKHtvcGFjaXR5OiAwLCBmaWxsT3BhY2l0eTogMH0sIHVzZXJTdHlsZXMpO1xuICAgIH1cbiAgfSxcblxuICBtZXJnZVN0eWxlczogZnVuY3Rpb24gKHN0eWxlcywgdXNlclN0eWxlcykge1xuICAgIHZhciBtZXJnZWRTdHlsZXMgPSB7fTtcbiAgICB2YXIgYXR0cjtcbiAgICAvLyBjb3B5IHJlbmRlcmVyIHN0eWxlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGF0dHIgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHN0eWxlc1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3ZlcnJpZGUgd2l0aCB1c2VyIGRlZmluZWQgc3R5bGUgYXR0cmlidXRlc1xuICAgIGlmICh1c2VyU3R5bGVzKSB7XG4gICAgICBmb3IgKGF0dHIgaW4gdXNlclN0eWxlcykge1xuICAgICAgICBpZiAodXNlclN0eWxlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIG1lcmdlZFN0eWxlc1thdHRyXSA9IHVzZXJTdHlsZXNbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFN0eWxlcztcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIFNpbXBsZVJlbmRlcmVyID0gUmVuZGVyZXIuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgcmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbiAgICB0aGlzLl9jcmVhdGVTeW1ib2woKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlbmRlcmVySnNvbi5zeW1ib2wpIHtcbiAgICAgIHRoaXMuX3N5bWJvbHMucHVzaCh0aGlzLl9uZXdTeW1ib2wodGhpcy5fcmVuZGVyZXJKc29uLnN5bWJvbCkpO1xuICAgIH1cbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHNbMF07XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNpbXBsZVJlbmRlcmVyO1xuIiwiaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuXG5leHBvcnQgdmFyIENsYXNzQnJlYWtzUmVuZGVyZXIgPSBSZW5kZXJlci5leHRlbmQoe1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAocmVuZGVyZXJKc29uLCBvcHRpb25zKSB7XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCByZW5kZXJlckpzb24sIG9wdGlvbnMpO1xuICAgIHRoaXMuX2ZpZWxkID0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkO1xuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvblR5cGUgJiYgdGhpcy5fcmVuZGVyZXJKc29uLm5vcm1hbGl6YXRpb25UeXBlID09PSAnZXNyaU5vcm1hbGl6ZUJ5RmllbGQnKSB7XG4gICAgICB0aGlzLl9ub3JtYWxpemF0aW9uRmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24ubm9ybWFsaXphdGlvbkZpZWxkO1xuICAgIH1cbiAgICB0aGlzLl9jcmVhdGVTeW1ib2xzKCk7XG4gIH0sXG5cbiAgX2NyZWF0ZVN5bWJvbHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3ltYm9sO1xuICAgIHZhciBjbGFzc2JyZWFrcyA9IHRoaXMuX3JlbmRlcmVySnNvbi5jbGFzc0JyZWFrSW5mb3M7XG5cbiAgICB0aGlzLl9zeW1ib2xzID0gW107XG5cbiAgICAvLyBjcmVhdGUgYSBzeW1ib2wgZm9yIGVhY2ggY2xhc3MgYnJlYWtcbiAgICBmb3IgKHZhciBpID0gY2xhc3NicmVha3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiAmJiB0aGlzLl9yZW5kZXJlckpzb24uYmFja2dyb3VuZEZpbGxTeW1ib2wpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHRoaXMuX3JlbmRlcmVySnNvbi5iYWNrZ3JvdW5kRmlsbFN5bWJvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW1ib2wgPSB0aGlzLl9uZXdTeW1ib2woY2xhc3NicmVha3NbaV0uc3ltYm9sKTtcbiAgICAgIH1cbiAgICAgIHN5bWJvbC52YWwgPSBjbGFzc2JyZWFrc1tpXS5jbGFzc01heFZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIC8vIHNvcnQgdGhlIHN5bWJvbHMgaW4gYXNjZW5kaW5nIHZhbHVlXG4gICAgdGhpcy5fc3ltYm9scy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS52YWwgPiBiLnZhbCA/IDEgOiAtMTtcbiAgICB9KTtcbiAgICB0aGlzLl9jcmVhdGVEZWZhdWx0U3ltYm9sKCk7XG4gICAgdGhpcy5fbWF4VmFsdWUgPSB0aGlzLl9zeW1ib2xzW3RoaXMuX3N5bWJvbHMubGVuZ3RoIC0gMV0udmFsO1xuICB9LFxuXG4gIF9nZXRTeW1ib2w6IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgdmFyIHZhbCA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9maWVsZF07XG4gICAgaWYgKHRoaXMuX25vcm1hbGl6YXRpb25GaWVsZCkge1xuICAgICAgdmFyIG5vcm1WYWx1ZSA9IGZlYXR1cmUucHJvcGVydGllc1t0aGlzLl9ub3JtYWxpemF0aW9uRmllbGRdO1xuICAgICAgaWYgKCFpc05hTihub3JtVmFsdWUpICYmIG5vcm1WYWx1ZSAhPT0gMCkge1xuICAgICAgICB2YWwgPSB2YWwgLyBub3JtVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID4gdGhpcy5fbWF4VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U3ltYm9sO1xuICAgIH1cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1swXTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHZhbCA+IHRoaXMuX3N5bWJvbHNbaV0udmFsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0JyZWFrc1JlbmRlcmVyIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDbGFzc0JyZWFrc1JlbmRlcmVyKHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzQnJlYWtzUmVuZGVyZXI7XG4iLCJpbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcic7XG5cbmV4cG9ydCB2YXIgVW5pcXVlVmFsdWVSZW5kZXJlciA9IFJlbmRlcmVyLmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChyZW5kZXJlckpzb24sIG9wdGlvbnMpIHtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHJlbmRlcmVySnNvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5fZmllbGQgPSB0aGlzLl9yZW5kZXJlckpzb24uZmllbGQxO1xuICAgIHRoaXMuX2NyZWF0ZVN5bWJvbHMoKTtcbiAgfSxcblxuICBfY3JlYXRlU3ltYm9sczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2w7XG4gICAgdmFyIHVuaXF1ZXMgPSB0aGlzLl9yZW5kZXJlckpzb24udW5pcXVlVmFsdWVJbmZvcztcblxuICAgIC8vIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCB1bmlxdWUgdmFsdWVcbiAgICBmb3IgKHZhciBpID0gdW5pcXVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgc3ltYm9sID0gdGhpcy5fbmV3U3ltYm9sKHVuaXF1ZXNbaV0uc3ltYm9sKTtcbiAgICAgIHN5bWJvbC52YWwgPSB1bmlxdWVzW2ldLnZhbHVlO1xuICAgICAgdGhpcy5fc3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZURlZmF1bHRTeW1ib2woKTtcbiAgfSxcblxuICBfZ2V0U3ltYm9sOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIHZhciB2YWwgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fZmllbGRdO1xuICAgIC8vIGFjY3VtdWxhdGUgdmFsdWVzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmllbGQgZGVmaW5lZFxuICAgIGlmICh0aGlzLl9yZW5kZXJlckpzb24uZmllbGREZWxpbWl0ZXIgJiYgdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMikge1xuICAgICAgdmFyIHZhbDIgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkMl07XG4gICAgICBpZiAodmFsMikge1xuICAgICAgICB2YWwgKz0gdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkRGVsaW1pdGVyICsgdmFsMjtcbiAgICAgICAgdmFyIHZhbDMgPSBmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5fcmVuZGVyZXJKc29uLmZpZWxkM107XG4gICAgICAgIGlmICh2YWwzKSB7XG4gICAgICAgICAgdmFsICs9IHRoaXMuX3JlbmRlcmVySnNvbi5maWVsZERlbGltaXRlciArIHZhbDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3ltYm9sID0gdGhpcy5fZGVmYXVsdFN5bWJvbDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5fc3ltYm9scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgLy8gdXNpbmcgdGhlID09PSBvcGVyYXRvciBkb2VzIG5vdCB3b3JrIGlmIHRoZSBmaWVsZFxuICAgICAgLy8gb2YgdGhlIHVuaXF1ZSByZW5kZXJlciBpcyBub3QgYSBzdHJpbmdcbiAgICAgIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgICAgIGlmICh0aGlzLl9zeW1ib2xzW2ldLnZhbCA9PSB2YWwpIHtcbiAgICAgICAgc3ltYm9sID0gdGhpcy5fc3ltYm9sc1tpXTtcbiAgICAgIH1cbiAgICAgIC8qZXNsaW50LWVuYWJsZSAqL1xuICAgIH1cbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZVZhbHVlUmVuZGVyZXIgKHJlbmRlcmVySnNvbiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFVuaXF1ZVZhbHVlUmVuZGVyZXIocmVuZGVyZXJKc29uLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW5pcXVlVmFsdWVSZW5kZXJlcjtcbiIsIiBpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcblxuaW1wb3J0IGNsYXNzQnJlYWtzUmVuZGVyZXIgZnJvbSAnLi9SZW5kZXJlcnMvQ2xhc3NCcmVha3NSZW5kZXJlcic7XG5pbXBvcnQgdW5pcXVlVmFsdWVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9VbmlxdWVWYWx1ZVJlbmRlcmVyJztcbmltcG9ydCBzaW1wbGVSZW5kZXJlciBmcm9tICcuL1JlbmRlcmVycy9TaW1wbGVSZW5kZXJlcic7XG5cbkwuZXNyaS5GZWF0dXJlTGF5ZXIuYWRkSW5pdEhvb2soZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVJlbmRlcmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvbGRPbkFkZCA9IEwuVXRpbC5iaW5kKHRoaXMub25BZGQsIHRoaXMpO1xuICB2YXIgb2xkVW5iaW5kUG9wdXAgPSBMLlV0aWwuYmluZCh0aGlzLnVuYmluZFBvcHVwLCB0aGlzKTtcbiAgdmFyIG9sZE9uUmVtb3ZlID0gTC5VdGlsLmJpbmQodGhpcy5vblJlbW92ZSwgdGhpcyk7XG4gIEwuVXRpbC5iaW5kKHRoaXMuY3JlYXRlTmV3TGF5ZXIsIHRoaXMpO1xuXG4gIHRoaXMubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRyYXdpbmdJbmZvKSB7XG4gICAgICB0aGlzLl9zZXRSZW5kZXJlcnMocmVzcG9uc2UpO1xuICAgIH0gaWYgKHRoaXMuX2FscmVhZHlBZGRlZCkge1xuICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLl9vcmlnaW5hbFN0eWxlKTtcbiAgICB9XG4gIH0sIHRoaXMpO1xuXG4gIHRoaXMub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7XG4gICAgb2xkT25BZGQobWFwKTtcbiAgICB0aGlzLl9hZGRQb2ludExheWVyKG1hcCk7XG4gICAgdGhpcy5fYWxyZWFkeUFkZGVkID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLm9uUmVtb3ZlID0gZnVuY3Rpb24gKG1hcCkge1xuICAgIG9sZE9uUmVtb3ZlKG1hcCk7XG4gICAgaWYgKHRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHZhciBwb2ludExheWVycyA9IHRoaXMuX3BvaW50TGF5ZXIuZ2V0TGF5ZXJzKCk7XG4gICAgICBmb3IgKHZhciBpIGluIHBvaW50TGF5ZXJzKSB7XG4gICAgICAgIG1hcC5yZW1vdmVMYXllcihwb2ludExheWVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMudW5iaW5kUG9wdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgb2xkVW5iaW5kUG9wdXAoKTtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdmFyIHBvaW50TGF5ZXJzID0gdGhpcy5fcG9pbnRMYXllci5nZXRMYXllcnMoKTtcbiAgICAgIGZvciAodmFyIGkgaW4gcG9pbnRMYXllcnMpIHtcbiAgICAgICAgcG9pbnRMYXllcnNbaV0udW5iaW5kUG9wdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fYWRkUG9pbnRMYXllciA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICBpZiAodGhpcy5fcG9pbnRMYXllcikge1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5hZGRUbyhtYXApO1xuICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlUG9pbnRMYXllciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXIpIHtcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXIgPSBMLmdlb0pzb24oKTtcbiAgICAgIC8vIHN0b3JlIHRoZSBmZWF0dXJlIGlkcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgIHRoaXMuX3BvaW50TGF5ZXJJZHMgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgIHZhciBwb3B1cEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZlYXR1cmUsIGxheWVyKSB7XG4gICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHRoaXMuX3BvcHVwKGZlYXR1cmUsIGxheWVyKSwgdGhpcy5fcG9wdXBPcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5vcHRpb25zLm9uRWFjaEZlYXR1cmUgPSBMLlV0aWwuYmluZChwb3B1cEZ1bmN0aW9uLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5jcmVhdGVOZXdMYXllciA9IGZ1bmN0aW9uIChnZW9qc29uKSB7XG4gICAgdmFyIGZMYXllciA9IEwuR2VvSlNPTi5nZW9tZXRyeVRvTGF5ZXIoZ2VvanNvbiwgdGhpcy5vcHRpb25zKTtcblxuICAgIC8vIGFkZCBhIHBvaW50IGxheWVyIHdoZW4gdGhlIHBvbHlnb24gaXMgcmVwcmVzZW50ZWQgYXMgcHJvcG9ydGlvbmFsIG1hcmtlciBzeW1ib2xzXG4gICAgaWYgKHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMpIHtcbiAgICAgIHZhciBjZW50cm9pZCA9IHRoaXMuZ2V0UG9seWdvbkNlbnRyb2lkKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgaWYgKCEoaXNOYU4oY2VudHJvaWRbMF0pIHx8IGlzTmFOKGNlbnRyb2lkWzBdKSkpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuXG4gICAgICAgIHZhciBmZWF0dXJlSWQgPSBnZW9qc29uLmlkLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIG9ubHkgYWRkIHRoZSBmZWF0dXJlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb24gdGhlIG1hcFxuICAgICAgICBpZiAoIXRoaXMuX3BvaW50TGF5ZXJJZHNbZmVhdHVyZUlkXSkge1xuICAgICAgICAgIHZhciBwb2ludGpzb24gPSB0aGlzLmdldFBvaW50SnNvbihnZW9qc29uLCBjZW50cm9pZCk7XG5cbiAgICAgICAgICB0aGlzLl9wb2ludExheWVyLmFkZERhdGEocG9pbnRqc29uKTtcbiAgICAgICAgICB0aGlzLl9wb2ludExheWVySWRzW2ZlYXR1cmVJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9pbnRMYXllci5icmluZ1RvRnJvbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZMYXllcjtcbiAgfTtcblxuICB0aGlzLmdldFBvbHlnb25DZW50cm9pZCA9IGZ1bmN0aW9uIChjb29yZGluYXRlcykge1xuICAgIHZhciBwdHMgPSBjb29yZGluYXRlc1swXVswXTtcbiAgICBpZiAocHRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcHRzID0gY29vcmRpbmF0ZXNbMF07XG4gICAgfVxuXG4gICAgdmFyIHR3aWNlYXJlYSA9IDA7XG4gICAgdmFyIHggPSAwO1xuICAgIHZhciB5ID0gMDtcbiAgICB2YXIgblB0cyA9IHB0cy5sZW5ndGg7XG4gICAgdmFyIHAxO1xuICAgIHZhciBwMjtcbiAgICB2YXIgZjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gblB0cyAtIDE7IGkgPCBuUHRzOyBqID0gaSsrKSB7XG4gICAgICBwMSA9IHB0c1tpXTsgcDIgPSBwdHNbal07XG4gICAgICB0d2ljZWFyZWEgKz0gcDFbMF0gKiBwMlsxXTtcbiAgICAgIHR3aWNlYXJlYSAtPSBwMVsxXSAqIHAyWzBdO1xuICAgICAgZiA9IHAxWzBdICogcDJbMV0gLSBwMlswXSAqIHAxWzFdO1xuICAgICAgeCArPSAocDFbMF0gKyBwMlswXSkgKiBmO1xuICAgICAgeSArPSAocDFbMV0gKyBwMlsxXSkgKiBmO1xuICAgIH1cbiAgICBmID0gdHdpY2VhcmVhICogMztcbiAgICByZXR1cm4gW3ggLyBmLCB5IC8gZl07XG4gIH07XG5cbiAgdGhpcy5nZXRQb2ludEpzb24gPSBmdW5jdGlvbiAoZ2VvanNvbiwgY2VudHJvaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzLFxuICAgICAgaWQ6IGdlb2pzb24uaWQsXG4gICAgICBnZW9tZXRyeToge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW2NlbnRyb2lkWzBdLCBjZW50cm9pZFsxXV1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHRoaXMuX2NoZWNrRm9yUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZ1bmN0aW9uIChnZW9tZXRyeVR5cGUsIHJlbmRlcmVyKSB7XG4gICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IGZhbHNlO1xuICAgIGlmIChnZW9tZXRyeVR5cGUgPT09ICdlc3JpR2VvbWV0cnlQb2x5Z29uJykge1xuICAgICAgaWYgKHJlbmRlcmVyLmJhY2tncm91bmRGaWxsU3ltYm9sKSB7XG4gICAgICAgIHRoaXMuX2hhc1Byb3BvcnRpb25hbFN5bWJvbHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGNsYXNzYnJlYWtzIGlzIGEgbWFya2VyIHN5bWJvbFxuICAgICAgaWYgKHJlbmRlcmVyLmNsYXNzQnJlYWtJbmZvcyAmJiByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBzeW0gPSByZW5kZXJlci5jbGFzc0JyZWFrSW5mb3NbMF0uc3ltYm9sO1xuICAgICAgICBpZiAoc3ltICYmIChzeW0udHlwZSA9PT0gJ2VzcmlTTVMnIHx8IHN5bS50eXBlID09PSAnZXNyaVBNUycpKSB7XG4gICAgICAgICAgdGhpcy5faGFzUHJvcG9ydGlvbmFsU3ltYm9scyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5fc2V0UmVuZGVyZXJzID0gZnVuY3Rpb24gKGdlb2pzb24pIHtcbiAgICB2YXIgcmVuZDtcbiAgICB2YXIgcmVuZGVyZXJJbmZvID0gZ2VvanNvbi5kcmF3aW5nSW5mby5yZW5kZXJlcjtcblxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIG9wdGlvbnMudG9rZW4gPSB0aGlzLm9wdGlvbnMudG9rZW47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFuZSkge1xuICAgICAgb3B0aW9ucy5wYW5lID0gdGhpcy5vcHRpb25zLnBhbmU7XG4gICAgfVxuICAgIGlmIChnZW9qc29uLmRyYXdpbmdJbmZvLnRyYW5zcGFyZW5jeSkge1xuICAgICAgb3B0aW9ucy5sYXllclRyYW5zcGFyZW5jeSA9IGdlb2pzb24uZHJhd2luZ0luZm8udHJhbnNwYXJlbmN5O1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlKSB7XG4gICAgICBvcHRpb25zLnVzZXJEZWZpbmVkU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJlckluZm8udHlwZSkge1xuICAgICAgY2FzZSAnY2xhc3NCcmVha3MnOlxuICAgICAgICB0aGlzLl9jaGVja0ZvclByb3BvcnRpb25hbFN5bWJvbHMoZ2VvanNvbi5nZW9tZXRyeVR5cGUsIHJlbmRlcmVySW5mbyk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNQcm9wb3J0aW9uYWxTeW1ib2xzKSB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlUG9pbnRMYXllcigpO1xuICAgICAgICAgIHZhciBwUmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgICBwUmVuZC5hdHRhY2hTdHlsZXNUb0xheWVyKHRoaXMuX3BvaW50TGF5ZXIpO1xuICAgICAgICAgIG9wdGlvbnMucHJvcG9ydGlvbmFsUG9seWdvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZCA9IGNsYXNzQnJlYWtzUmVuZGVyZXIocmVuZGVyZXJJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bmlxdWVWYWx1ZSc6XG4gICAgICAgIHJlbmQgPSB1bmlxdWVWYWx1ZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVuZCA9IHNpbXBsZVJlbmRlcmVyKHJlbmRlcmVySW5mbywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbmQuYXR0YWNoU3R5bGVzVG9MYXllcih0aGlzKTtcbiAgfTtcbn0pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Q0NFTyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUM3QyxDQUFBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDbEMsQ0FBQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLENBQUEsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFBLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQSxJQUFJLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtBQUM5QyxDQUFBLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RSxDQUFBLEtBQUs7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R0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUEsT0FBTztBQUNQLENBQUEsS0FBSyxDQUFDLENBQUM7O0FBRVAsQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ2xCLENBQUEsTUFBTSxtQkFBbUIsRUFBRSxVQUFVLEtBQUssRUFBRTtBQUM1QyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0FBRXZDLENBQUEsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQzNCLENBQUEsVUFBVSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDMUIsQ0FBQSxVQUFVLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2RSxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUMvRCxDQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFD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 \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-esri-vector-1.0.6.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,785 @@ +/* esri-leaflet-vector - v1.0.6 - Wed Jan 04 2017 15:02:16 GMT-0800 (PST) + * Copyright (c) 2017 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('esri-leaflet')) : + typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'esri-leaflet'], factory) : + (factory((global.L = global.L || {}, global.L.esri = global.L.esri || {}, global.L.esri.Vector = global.L.esri.Vector || {}),global.L,global.L.esri)); +}(this, function (exports,L$1,esriLeaflet) { 'use strict'; + + L$1 = 'default' in L$1 ? L$1['default'] : L$1; + + var version = "1.0.6"; + + (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;ou||u>=e||0>i||i>=e)){var l=this.buffers.circleVertex.index-this.elementGroups.current.vertexStartIndex;this.buffers.circleVertex.add(u,i,-1,-1),this.buffers.circleVertex.add(u,i,1,-1),this.buffers.circleVertex.add(u,i,1,1),this.buffers.circleVertex.add(u,i,-1,1),this.elementGroups.elementBuffer.add(l,l+1,l+2),this.elementGroups.elementBuffer.add(l,l+3,l+2),this.elementGroups.current.vertexLength+=4,this.elementGroups.current.elementLength+=2}}}; + },{"./element_groups":14}],13:[function(require,module,exports){ + "use strict";function createBucket(e,t,i,r,l){var c=new StyleDeclarationSet("layout",e.type,e.layout,{}).values(),a={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0},u={};for(var o in c)u[o]=c[o].calculate(i,a);"symbol"===e.type&&(c["text-size"]&&(u["text-max-size"]=c["text-size"].calculate(18,a),u["text-size"]=c["text-size"].calculate(i+1,a)),c["icon-size"]&&(u["icon-max-size"]=c["icon-size"].calculate(18,a),u["icon-size"]=c["icon-size"].calculate(i+1,a)));var s="line"===e.type?LineBucket:"fill"===e.type?FillBucket:"symbol"===e.type?SymbolBucket:"circle"===e.type?CircleBucket:null,n=new s(t,new LayoutProperties[e.type](u),r,i,l);return n.id=e.id,n.type=e.type,n["source-layer"]=e["source-layer"],n.interactive=e.interactive,n.minZoom=e.minzoom,n.maxZoom=e.maxzoom,n.filter=featureFilter(e.filter),n.features=[],n}module.exports=createBucket;var LineBucket=require("./line_bucket"),FillBucket=require("./fill_bucket"),SymbolBucket=require("./symbol_bucket"),CircleBucket=require("./circle_bucket"),LayoutProperties=require("../style/layout_properties"),featureFilter=require("feature-filter"),StyleDeclarationSet=require("../style/style_declaration_set"); + },{"../style/layout_properties":53,"../style/style_declaration_set":59,"./circle_bucket":12,"./fill_bucket":16,"./line_bucket":17,"./symbol_bucket":18,"feature-filter":108}],14:[function(require,module,exports){ + "use strict";function ElementGroups(e,t,n){this.vertexBuffer=e,this.elementBuffer=t,this.secondElementBuffer=n,this.groups=[]}function ElementGroup(e,t,n){this.vertexStartIndex=e,this.elementStartIndex=t,this.secondElementStartIndex=n,this.elementLength=0,this.vertexLength=0,this.secondElementLength=0}module.exports=ElementGroups,ElementGroups.prototype.makeRoomFor=function(e){(!this.current||this.current.vertexLength+e>65535)&&(this.current=new ElementGroup(this.vertexBuffer.index,this.elementBuffer&&this.elementBuffer.index,this.secondElementBuffer&&this.secondElementBuffer.index),this.groups.push(this.current))}; + },{}],15:[function(require,module,exports){ + "use strict";function FeatureTree(t,e){this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.rtree=rbush(9),this.toBeInserted=[]}function geometryIntersectsBox(t,e,n){return"Point"===e?pointIntersectsBox(t,n):"LineString"===e?lineIntersectsBox(t,n):"Polygon"===e?polyIntersectsBox(t,n)||lineIntersectsBox(t,n):!1}function polyIntersectsBox(t,e){return polyContainsPoint(t,new Point(e[0],e[1]))||polyContainsPoint(t,new Point(e[0],e[3]))||polyContainsPoint(t,new Point(e[2],e[1]))||polyContainsPoint(t,new Point(e[2],e[3]))?!0:lineIntersectsBox(t,e)}function lineIntersectsBox(t,e){for(var n=0;n=n;var i=(o-t.y)/(e.y-t.y),s=t.x+i*(e.x-t.x);return s>=n&&r>=s&&1>=i&&i>=0}function pointIntersectsBox(t,e){for(var n=0;n=e[0]&&r[o].y>=e[1]&&r[o].x<=e[2]&&r[o].y<=e[3])return!0;return!1}function geometryContainsPoint(t,e,n,r){return"Point"===e?pointContainsPoint(t,n,r):"LineString"===e?lineContainsPoint(t,n,r):"Polygon"===e?polyContainsPoint(t,n)||lineContainsPoint(t,n,r):!1}function distToSegmentSquared(t,e,n){var r=e.distSqr(n);if(0===r)return t.distSqr(e);var o=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/r;return 0>o?t.distSqr(e):o>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(o)._add(e))}function lineContainsPoint(t,e,n){for(var r=n*n,o=0;oe.y!=o.y>e.y&&e.x<(o.x-r.x)*(e.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function pointContainsPoint(t,e,n){for(var r=n*n,o=0;o=2&&(n.x!==e[0].x||n.y!==e[0].y)&&(u.add(d,l,r),i.elementLength++),a>=1&&(s.add(l,r),i.secondElementLength++),l=r}}; + },{"./element_groups":14}],17:[function(require,module,exports){ + "use strict";function LineBucket(e,t){this.buffers=e,this.elementGroups=new ElementGroups(e.lineVertex,e.lineElement),this.layoutProperties=t}var ElementGroups=require("./element_groups");module.exports=LineBucket,LineBucket.prototype.addFeatures=function(){for(var e=this.features,t=0;t2&&e[n-1].equals(e[n-2]);)n--;if(!(e.length<2)){"bevel"===t&&(i=1.05);var u=e[0],h=e[n-1],d=u.equals(h);if(this.elementGroups.makeRoomFor(10*n),2!==n||!d){var a,l,o,f,m,p,x,v=r,c=d?"butt":r,V=1,b=0,_=!0;this.e1=this.e2=this.e3=-1,d&&(a=e[n-2],m=u.sub(a)._unit()._perp());for(var y=0;n>y;y++)if(o=d&&y===n-1?e[1]:e[y+1],!o||!e[y].equals(o)){m&&(f=m),a&&(l=a),a=e[y],l&&(b+=a.dist(l)),m=o?o.sub(a)._unit()._perp():f,f=f||m;var L=f.add(m)._unit(),C=L.x*m.x+L.y*m.y,g=1/C,k=l&&o,G=k?t:o?v:c;if(k&&"round"===G&&(s>g?G="miter":2>=g&&(G="fakeround")),"miter"===G&&g>i&&(G="bevel"),"bevel"===G&&(g>2&&(G="flipbevel"),i>g&&(G="miter")),"miter"===G)L._mult(g),this.addCurrentVertex(a,V,b,L,0,0,!1);else if("flipbevel"===G){if(g>100)L=m.clone();else{var B=f.x*m.y-f.y*m.x>0?-1:1,q=g*f.add(m).mag()/f.sub(m).mag();L._perp()._mult(q*B)}this.addCurrentVertex(a,V,b,L,0,0,!1),V=-V}else if("bevel"===G||"fakeround"===G){var P=V*(f.x*m.y-f.y*m.x)>0,S=-Math.sqrt(g*g-1);if(P?(x=0,p=S):(p=0,x=S),_||this.addCurrentVertex(a,V,b,f,p,x,!1),"fakeround"===G){for(var E,F=Math.floor(8*(.5-(C-.5))),I=0;F>I;I++)E=m.mult((I+1)/(F+1))._add(f)._unit(),this.addPieSliceVertex(a,V,b,E,P);this.addPieSliceVertex(a,V,b,L,P);for(var M=F-1;M>=0;M--)E=f.mult((M+1)/(F+1))._add(m)._unit(),this.addPieSliceVertex(a,V,b,E,P)}o&&this.addCurrentVertex(a,V,b,m,-p,-x,!1)}else"butt"===G?(_||this.addCurrentVertex(a,V,b,f,0,0,!1),o&&this.addCurrentVertex(a,V,b,m,0,0,!1)):"square"===G?(_||(this.addCurrentVertex(a,V,b,f,1,1,!1),this.e1=this.e2=-1,V=1),o&&this.addCurrentVertex(a,V,b,m,-1,-1,!1)):"round"===G&&(_||(this.addCurrentVertex(a,V,b,f,0,0,!1),this.addCurrentVertex(a,V,b,f,1,1,!0),this.e1=this.e2=-1,V=1),o&&(this.addCurrentVertex(a,V,b,m,-1,-1,!0),this.addCurrentVertex(a,V,b,m,0,0,!1)));_=!1}}}},LineBucket.prototype.addCurrentVertex=function(e,t,r,i,s,n,u){var h,d=u?1:0,a=this.buffers.lineVertex,l=this.buffers.lineElement,o=this.elementGroups.current,f=this.elementGroups.current.vertexStartIndex;h=i.mult(t),s&&h._sub(i.perp()._mult(s)),this.e3=a.add(e,h,d,0,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,h=i.mult(-t),n&&h._sub(i.perp()._mult(n)),this.e3=a.add(e,h,d,1,r)-f,this.e1>=0&&this.e2>=0&&(l.add(this.e1,this.e2,this.e3),o.elementLength++),this.e1=this.e2,this.e2=this.e3,o.vertexLength+=2},LineBucket.prototype.addPieSliceVertex=function(e,t,r,i,s){var n=this.buffers.lineVertex,u=this.buffers.lineElement,h=this.elementGroups.current,d=this.elementGroups.current.vertexStartIndex,a=s;i=i.mult(t*(s?-1:1)),this.e3=n.add(e,i,0,a,r)-d,h.vertexLength+=1,this.e1>=0&&this.e2>=0&&(u.add(this.e1,this.e2,this.e3),h.elementLength++),s?this.e2=this.e3:this.e1=this.e3}; + },{"./element_groups":14}],18:[function(require,module,exports){ + "use strict";function SymbolBucket(e,t,o,i,s){this.buffers=e,this.layoutProperties=t,this.overscaling=o,this.zoom=i,this.collisionDebug=s;var n=512*o,a=4096;this.tilePixelRatio=a/n,this.compareText={},this.symbolInstances=[]}function SymbolInstance(e,t,o,i,s,n,a,l,r,c,h,u){this.x=e.x,this.y=e.y,this.hasText=!!o,this.hasIcon=!!i,this.hasText&&(this.glyphQuads=n?getGlyphQuads(e,o,a,t,s,r):[],this.textCollisionFeature=new CollisionFeature(t,e,o,a,l,r)),this.hasIcon&&(this.iconQuads=n?getIconQuads(e,i,c,t,s,u):[],this.iconCollisionFeature=new CollisionFeature(t,e,i,c,h,u))}var ElementGroups=require("./element_groups"),Anchor=require("../symbol/anchor"),getAnchors=require("../symbol/get_anchors"),resolveTokens=require("../util/token"),Quads=require("../symbol/quads"),Shaping=require("../symbol/shaping"),resolveText=require("../symbol/resolve_text"),resolveIcons=require("../symbol/resolve_icons"),mergeLines=require("../symbol/mergelines"),shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,clipLine=require("../symbol/clip_line"),Point=require("point-geometry"),CollisionFeature=require("../symbol/collision_feature");module.exports=SymbolBucket,SymbolBucket.prototype.needsPlacement=!0,SymbolBucket.prototype.addFeatures=function(e){var t=this.layoutProperties,o=this.features,i=this.textFeatures,s=.5,n=.5;switch(t["text-anchor"]){case"right":case"top-right":case"bottom-right":s=1;break;case"left":case"top-left":case"bottom-left":s=0}switch(t["text-anchor"]){case"bottom":case"bottom-right":case"bottom-left":n=1;break;case"top":case"top-right":case"top-left":n=0}for(var a="right"===t["text-justify"]?1:"left"===t["text-justify"]?0:.5,l=24,r=t["text-line-height"]*l,c="line"!==t["symbol-placement"]?t["text-max-width"]*l:0,h=t["text-letter-spacing"]*l,u=[t["text-offset"][0]*l,t["text-offset"][1]*l],m=t["text-font"].join(","),p=[],x=0;xS;S++){var P=I[S];if(!(t&&g&&this.anchorIsTooClose(t.text,f,P))){var M=!(P.x<0||P.x>4096||P.y<0||P.y>4096);if(!h||M){var k=M||d;this.symbolInstances.push(new SymbolInstance(P,v,t,o,i,k,a,u,x,r,m,y))}}}},SymbolBucket.prototype.anchorIsTooClose=function(e,t,o){var i=this.compareText;if(e in i){for(var s=i[e],n=s.length-1;n>=0;n--)if(o.dist(s[n])=f&&this.addSymbols(t.glyphVertex,t.glyphElement,i.text,p.glyphQuads,f,s["text-keep-upright"],a,e.angle)),y&&(s["icon-ignore-placement"]||e.insertCollisionFeature(p.iconCollisionFeature,b),n>=b&&this.addSymbols(t.iconVertex,t.iconElement,i.icon,p.iconQuads,b,s["icon-keep-upright"],l,e.angle))}o&&this.addToDebugBuffers(e)},SymbolBucket.prototype.addSymbols=function(e,t,o,i,s,n,a,l){o.makeRoomFor(4*i.length);for(var r=o.current,c=this.zoom,h=Math.max(Math.log(s)/Math.LN2+c,0),u=0;u3*Math.PI/2))){var y=m.tl,d=m.tr,g=m.bl,f=m.br,b=m.tex,v=m.anchorPoint,I=Math.max(c+Math.log(m.minScale)/Math.LN2,h),S=Math.min(c+Math.log(m.maxScale)/Math.LN2,25);if(!(I>=S)){I===h&&(I=0);var F=e.index-r.vertexStartIndex;e.add(v.x,v.y,y.x,y.y,b.x,b.y,I,S,h),e.add(v.x,v.y,d.x,d.y,b.x+b.w,b.y,I,S,h),e.add(v.x,v.y,g.x,g.y,b.x,b.y+b.h,I,S,h),e.add(v.x,v.y,f.x,f.y,b.x+b.w,b.y+b.h,I,S,h),r.vertexLength+=4,t.add(F,F+1,F+2),t.add(F+1,F+2,F+3),r.elementLength+=2}}}},SymbolBucket.prototype.getDependencies=function(e,t,o){function i(e){return e||s?o(e):void(s=!0)}var s=!1;this.getTextDependencies(e,t,i),this.getIconDependencies(e,t,i)},SymbolBucket.prototype.getIconDependencies=function(e,t,o){function i(e,t){return e?o(e):(this.icons=t,void o())}if(this.layoutProperties["icon-image"]){var s=this.features,n=resolveIcons(s,this.layoutProperties);n.length?t.send("get icons",{icons:n},i.bind(this)):o()}else o()},SymbolBucket.prototype.getTextDependencies=function(e,t,o){var i=this.features,s=this.layoutProperties["text-font"],n=this.stacks=e.stacks;void 0===n[s]&&(n[s]={});var a=n[s],l=resolveText(i,this.layoutProperties,a);this.textFeatures=l.textFeatures,t.send("get glyphs",{uid:e.uid,fontstack:s,codepoints:l.codepoints},function(e,t){if(e)return o(e);for(var i in t)a[i]=t[i];o()})},SymbolBucket.prototype.addToDebugBuffers=function(e){this.elementGroups.collisionBox=new ElementGroups(this.buffers.collisionBoxVertex),this.elementGroups.collisionBox.makeRoomFor(0);for(var t=this.buffers.collisionBoxVertex,o=-e.angle,i=e.yStretch,s=0;sn;n++){var a=this.symbolInstances[s][0===n?"textCollisionFeature":"iconCollisionFeature"];if(a)for(var l=a.boxes,r=0;r90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}module.exports=LngLat;var wrap=require("../util/util").wrap;LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.convert=function(t){return t instanceof LngLat?t:Array.isArray(t)?new LngLat(t[0],t[1]):t}; + },{"../util/util":106}],21:[function(require,module,exports){ + "use strict";function LngLatBounds(t,n){if(t)for(var e=n?[t,n]:t,s=0,i=e.length;i>s;s++)this.extend(e[s])}module.exports=LngLatBounds;var LngLat=require("./lng_lat");LngLatBounds.prototype={extend:function(t){var n,e,s=this._sw,i=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return t?this.extend(LngLat.convert(t)||LngLatBounds.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||i?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),i.lng=Math.max(e.lng,i.lng),i.lat=Math.max(e.lat,i.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},getCenter:function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},getSouthWest:function(){return this._sw},getNorthEast:function(){return this._ne},getNorthWest:function(){return new LngLat(this.getWest(),this.getNorth())},getSouthEast:function(){return new LngLat(this.getEast(),this.getSouth())},getWest:function(){return this._sw.lng},getSouth:function(){return this._sw.lat},getEast:function(){return this._ne.lng},getNorth:function(){return this._ne.lat}},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)}; + },{"./lng_lat":20}],22:[function(require,module,exports){ + "use strict";function Transform(t,i){this.tileSize=512,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this.zoom=0,this.center=new LngLat(0,0),this.angle=0,this._altitude=1.5,this._pitch=0}var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),wrap=require("../util/util").wrap,interp=require("../util/interpolate"),vec4=require("gl-matrix").vec4,mat4=require("gl-matrix").mat4;module.exports=Transform,Transform.prototype={get minZoom(){return this._minZoom},set minZoom(t){this._minZoom=t,this.zoom=Math.max(this.zoom,t)},get maxZoom(){return this._maxZoom},set maxZoom(t){this._maxZoom=t,this.zoom=Math.min(this.zoom,t)},get worldSize(){return this.tileSize*this.scale},get centerPoint(){return this.size._div(2)},get size(){return new Point(this.width,this.height)},get bearing(){return-this.angle/Math.PI*180},set bearing(t){this.angle=-wrap(t,-180,180)*Math.PI/180},get pitch(){return this._pitch/Math.PI*180},set pitch(t){this._pitch=Math.min(60,t)/180*Math.PI},get altitude(){return this._altitude},set altitude(t){this._altitude=Math.max(.75,t)},get zoom(){return this._zoom},set zoom(t){t=Math.min(Math.max(t,this.minZoom),this.maxZoom),this._zoom=t,this.scale=this.zoomScale(t),this.tileZoom=Math.floor(t),this.zoomFraction=t-this.tileZoom,this._constrain()},get center(){return this._center},set center(t){this._center=t,this._constrain()},zoomScale:function(t){return Math.pow(2,t)},scaleZoom:function(t){return Math.log(t)/Math.LN2},project:function(t,i){return new Point(this.lngX(t.lng,i),this.latY(t.lat,i))},unproject:function(t,i){return new LngLat(this.xLng(t.x,i),this.yLat(t.y,i))},get x(){return this.lngX(this.center.lng)},get y(){return this.latY(this.center.lat)},get point(){return new Point(this.x,this.y)},lngX:function(t,i){return(180+t)*(i||this.worldSize)/360},latY:function(t,i){var n=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-n)*(i||this.worldSize)/360},xLng:function(t,i){return 360*t/(i||this.worldSize)-180},yLat:function(t,i){var n=180-360*t/(i||this.worldSize);return 360/Math.PI*Math.atan(Math.exp(n*Math.PI/180))-90},panBy:function(t){var i=this.centerPoint._add(t);this.center=this.pointLocation(i)},setLocationAtPoint:function(t,i){var n=this.locationCoordinate(t),o=this.pointCoordinate(i),e=this.pointCoordinate(this.centerPoint),a=o._sub(n);this.center=this.coordinateLocation(e._sub(a))},setZoomAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.zoom=t,i&&this.setLocationAtPoint(i,n)},setBearingAround:function(t,i){var n;i&&(n=this.locationPoint(i)),this.bearing=t,i&&this.setLocationAtPoint(i,n)},locationPoint:function(t){return this.coordinatePoint(this.locationCoordinate(t))},pointLocation:function(t){return this.coordinateLocation(this.pointCoordinate(t))},locationCoordinate:function(t){var i=this.zoomScale(this.tileZoom)/this.worldSize,n=LngLat.convert(t);return new Coordinate(this.lngX(n.lng)*i,this.latY(n.lat)*i,this.tileZoom)},coordinateLocation:function(t){var i=this.zoomScale(t.zoom);return new LngLat(this.xLng(t.column,i),this.yLat(t.row,i))},pointCoordinate:function(t,i){void 0===i&&(i=0);var n=this.coordinatePointMatrix(this.tileZoom),o=mat4.invert(new Float64Array(16),n);if(!o)throw new Error("failed to invert matrix");var e=vec4.transformMat4([],[t.x,t.y,0,1],o),a=vec4.transformMat4([],[t.x,t.y,1,1],o),r=e[3],h=a[3],s=e[0]/r,c=a[0]/h,u=e[1]/r,l=a[1]/h,m=e[2]/r,g=a[2]/h,f=m===g?0:(i-m)/(g-m);return new Coordinate(interp(s,c,f),interp(u,l,f),this.tileZoom)},coordinatePoint:function(t){var i=this.coordinatePointMatrix(t.zoom),n=vec4.transformMat4([],[t.column,t.row,0,1],i);return new Point(n[0]/n[3],n[1]/n[3])},coordinatePointMatrix:function(t){var i=this.getProjMatrix(),n=this.worldSize/this.zoomScale(t);return mat4.scale(i,i,[n,n,1]),mat4.multiply(i,this.getPixelMatrix(),i),i},getPixelMatrix:function(){var t=mat4.create();return mat4.scale(t,t,[this.width/2,-this.height/2,1]),mat4.translate(t,t,[1,-1,0]),t},_constrain:function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,n,o,e,a,r,h,s=this.size;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),e=i-tu-l&&(h=t+l),u+l>i&&(h=i-l)}if(this.lngRange){var m=this.x,g=s.x/2;n>m-g&&(r=n+g),m+g>o&&(r=o-g)}(void 0!==r||void 0!==h)&&(this.center=this.unproject(new Point(void 0!==r?r:this.x,void 0!==h?h:this.y))),this._constraining=!1}},getProjMatrix:function(){var t=new Float64Array(16),i=Math.atan(.5/this.altitude),n=Math.sin(i)*this.altitude/Math.sin(Math.PI/2-this._pitch-i),o=Math.cos(Math.PI/2-this._pitch)*n+this.altitude;return mat4.perspective(t,2*Math.atan(this.height/2/this.altitude),this.width/this.height,.1,o),mat4.translate(t,t,[0,0,-this.altitude]),mat4.scale(t,t,[1,-1,1/this.height]),mat4.rotateX(t,t,this._pitch),mat4.rotateZ(t,t,this.angle),mat4.translate(t,t,[-this.x,-this.y,0]),t}}; + },{"../util/interpolate":102,"../util/util":106,"./coordinate":19,"./lng_lat":20,"gl-matrix":116,"point-geometry":137}],23:[function(require,module,exports){ + "use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;o>r;r++)if(i=simplexFont[l[r]]){for(p=null,u=0,s=i[1].length;s>u;u+=2)-1===i[1][u]&&-1===i[1][u+1]?p=null:(x=n+i[1][u]*e,f=t-i[1][u+1]*e,p&&h.push(p.x,p.y,x,f),p={x:x,y:f});n+=i[0]*e}return h}; + },{}],24:[function(require,module,exports){ + "use strict";var mapboxgl=module.exports={};mapboxgl.Map=require("./ui/map"),mapboxgl.Control=require("./ui/control/control"),mapboxgl.Navigation=require("./ui/control/navigation"),mapboxgl.Attribution=require("./ui/control/attribution"),mapboxgl.Popup=require("./ui/popup"),mapboxgl.GeoJSONSource=require("./source/geojson_source"),mapboxgl.VideoSource=require("./source/video_source"),mapboxgl.ImageSource=require("./source/image_source"),mapboxgl.Style=require("./style/style"),mapboxgl.LngLat=require("./geo/lng_lat"),mapboxgl.LngLatBounds=require("./geo/lng_lat_bounds"),mapboxgl.Point=require("point-geometry"),mapboxgl.Evented=require("./util/evented"),mapboxgl.util=require("./util/util"),mapboxgl.supported=require("./util/browser").supported;var ajax=require("./util/ajax");mapboxgl.util.getJSON=ajax.getJSON,mapboxgl.util.getArrayBuffer=ajax.getArrayBuffer;var config=require("./util/config");mapboxgl.config=config,Object.defineProperty(mapboxgl,"accessToken",{get:function(){return config.ACCESS_TOKEN},set:function(e){config.ACCESS_TOKEN=e}}); + },{"./geo/lng_lat":20,"./geo/lng_lat_bounds":21,"./source/geojson_source":39,"./source/image_source":41,"./source/video_source":48,"./style/style":56,"./ui/control/attribution":79,"./ui/control/control":80,"./ui/control/navigation":81,"./ui/map":91,"./ui/popup":92,"./util/ajax":94,"./util/browser":95,"./util/config":99,"./util/evented":100,"./util/util":106,"point-geometry":137}],25:[function(require,module,exports){ + "use strict";function drawBackground(t,a,r){var e,i=t.gl,o=a.paint["background-color"],n=a.paint["background-pattern"],l=a.paint["background-opacity"],u=n?t.spriteAtlas.getPosition(n.from,!0):null,m=n?t.spriteAtlas.getPosition(n.to,!0):null;if(u&&m){e=t.patternShader,i.switchShader(e,r),i.uniform1i(e.u_image,0),i.uniform2fv(e.u_pattern_tl_a,u.tl),i.uniform2fv(e.u_pattern_br_a,u.br),i.uniform2fv(e.u_pattern_tl_b,m.tl),i.uniform2fv(e.u_pattern_br_b,m.br),i.uniform1f(e.u_opacity,l);var c=t.transform,f=u.size,s=m.size,_=c.locationCoordinate(c.center),S=1/Math.pow(2,c.zoomFraction);i.uniform1f(e.u_mix,n.t);var d=mat3.create();mat3.scale(d,d,[1/(f[0]*n.fromScale),1/(f[1]*n.fromScale)]),mat3.translate(d,d,[_.column*c.tileSize%(f[0]*n.fromScale),_.row*c.tileSize%(f[1]*n.fromScale)]),mat3.rotate(d,d,-c.angle),mat3.scale(d,d,[S*c.width/2,-S*c.height/2]);var p=mat3.create();mat3.scale(p,p,[1/(s[0]*n.toScale),1/(s[1]*n.toScale)]),mat3.translate(p,p,[_.column*c.tileSize%(s[0]*n.toScale),_.row*c.tileSize%(s[1]*n.toScale)]),mat3.rotate(p,p,-c.angle),mat3.scale(p,p,[S*c.width/2,-S*c.height/2]),i.uniformMatrix3fv(e.u_patternmatrix_a,!1,d),i.uniformMatrix3fv(e.u_patternmatrix_b,!1,p),t.spriteAtlas.bind(i,!0)}else e=t.fillShader,i.switchShader(e,r),i.uniform4fv(e.u_color,o);i.disable(i.STENCIL_TEST),i.bindBuffer(i.ARRAY_BUFFER,t.backgroundBuffer),i.vertexAttribPointer(e.a_pos,t.backgroundBuffer.itemSize,i.SHORT,!1,0,0),i.drawArrays(i.TRIANGLE_STRIP,0,t.backgroundBuffer.itemCount),i.enable(i.STENCIL_TEST),i.stencilMask(0),i.stencilFunc(i.EQUAL,128,128)}var mat3=require("gl-matrix").mat3;module.exports=drawBackground; + },{"gl-matrix":116}],26:[function(require,module,exports){ + "use strict";function drawCircles(e,r,i,a){if(a.buffers){i=e.translateMatrix(i,a,r.paint["circle-translate"],r.paint["circle-translate-anchor"]);var t=a.elementGroups[r.ref||r.id];if(t){var l=e.gl;l.disable(l.STENCIL_TEST),l.switchShader(e.circleShader,i,a.exMatrix);var c=a.buffers.circleVertex,n=e.circleShader,s=a.buffers.circleElement,u=1/browser.devicePixelRatio/r.paint["circle-radius"];l.uniform4fv(n.u_color,r.paint["circle-color"]),l.uniform1f(n.u_blur,Math.max(r.paint["circle-blur"],u)),l.uniform1f(n.u_size,r.paint["circle-radius"]);for(var o=0;o0&&(u=i.paint["line-gap-width"]/2+.5*o,l=i.paint["line-width"],m=u-o/2);var _=m+l+o/2+s,h=i.paint["line-color"],d=t.transform.scale/(1<0?1/(1-t):1+t}function saturationFactor(t){return t>0?1-1/(1.001-t):-t}function getOpacities(t,r,e,a){if(!t.source)return[1,0];var i=(new Date).getTime(),o=e.paint["raster-fade-duration"],n=(i-t.timeAdded)/o,u=r?(i-r.timeAdded)/o:-1,s=t.source._pyramid.coveringZoomLevel(a),c=r?Math.abs(r.coord.z-s)>Math.abs(t.coord.z-s):!1,f=[];!r||c?(f[0]=util.clamp(n,0,1),f[1]=1-f[0]):(f[0]=util.clamp(1-u,0,1),f[1]=1-f[0]);var d=e.paint["raster-opacity"];return f[0]*=d,f[1]*=d,f}var util=require("../util/util");module.exports=drawRaster; + },{"../util/util":106}],32:[function(require,module,exports){ + "use strict";function drawSymbols(e,t,r,a){if(a.buffers){var o=a.elementGroups[t.ref||t.id];if(o){var i=!(t.layout["text-allow-overlap"]||t.layout["icon-allow-overlap"]||t.layout["text-ignore-placement"]||t.layout["icon-ignore-placement"]),n=e.gl;i&&n.disable(n.STENCIL_TEST),o.text.groups.length&&drawSymbol(e,t,r,a,o.text,"text",!0),o.icon.groups.length&&drawSymbol(e,t,r,a,o.icon,"icon",o.sdfIcons),drawCollisionDebug(e,t,r,a),i&&n.enable(n.STENCIL_TEST)}}}function drawSymbol(e,t,r,a,o,i,n){var l=e.gl;r=e.translateMatrix(r,a,t.paint[i+"-translate"],t.paint[i+"-translate-anchor"]);var m,f,u,s=e.transform,d="map"===t.layout[i+"-rotation-alignment"],h=d;h?(m=mat4.create(),f=a.tileExtent/a.tileSize/Math.pow(2,e.transform.zoom-a.coord.z),u=1/Math.cos(s._pitch)):(m=mat4.clone(a.exMatrix),f=e.transform.altitude,u=1),mat4.scale(m,m,[f,f,1]);var p=t.paint[i+"-size"],g=p/defaultSizes[i];mat4.scale(m,m,[g,g,1]);var S,c,x,b,v=Math.sqrt(s.height*s.height/4*(1+s.altitude*s.altitude)),_=s.height/2*Math.tan(s._pitch),z=(v+_)/v-1,w="text"===i;if(w||e.style.sprite.loaded()){l.activeTexture(l.TEXTURE0),S=n?e.sdfShader:e.iconShader,w?(e.glyphAtlas.updateTexture(l),c=a.buffers.glyphVertex,x=a.buffers.glyphElement,b=[e.glyphAtlas.width/4,e.glyphAtlas.height/4]):(e.spriteAtlas.bind(l,d||e.options.rotating||e.options.zooming||1!==g||n||e.transform.pitch),c=a.buffers.iconVertex,x=a.buffers.iconElement,b=[e.spriteAtlas.width/4,e.spriteAtlas.height/4]),l.switchShader(S,r,m),l.uniform1i(S.u_texture,0),l.uniform2fv(S.u_texsize,b),l.uniform1i(S.u_skewed,h),l.uniform1f(S.u_extra,z);var y=Math.log(p/o[i+"-size"])/Math.LN2||0;l.uniform1f(S.u_zoom,10*(e.transform.zoom-y));var E=e.frameHistory.getFadeProperties(300);l.uniform1f(S.u_fadedist,10*E.fadedist),l.uniform1f(S.u_minfadezoom,Math.floor(10*E.minfadezoom)),l.uniform1f(S.u_maxfadezoom,Math.floor(10*E.maxfadezoom)),l.uniform1f(S.u_fadezoom,10*(e.transform.zoom+E.bump));var T,I,N,M;if(x.bind(l),n){var A=8,L=1.19,R=6,G=.105*defaultSizes[i]/p/browser.devicePixelRatio;l.uniform1f(S.u_gamma,G*u),l.uniform4fv(S.u_color,t.paint[i+"-color"]),l.uniform1f(S.u_buffer,.75);for(var D=0;D3&&this.frameHistory[1].time+tr&&console.warn("there should never be less than three frames in the history");var i=this.frameHistory[0].z,s=this.frameHistory[r-1],o=s.z,a=Math.min(i,o),m=Math.max(i,o),h=s.z-this.frameHistory[1].z,f=s.time-this.frameHistory[1].time,y=h/(f/t);isNaN(y)&&console.warn("fadedist should never be NaN");var n=(e-s.time)/t*y;return{fadedist:y,minfadezoom:a,maxfadezoom:m,bump:n}},FrameHistory.prototype.record=function(t){var e=(new Date).getTime();this.frameHistory.length||this.frameHistory.push({time:0,z:t},{time:0,z:t}),(2===this.frameHistory.length||this.frameHistory[this.frameHistory.length-1].z!==t)&&this.frameHistory.push({time:e,z:t})}; + },{}],35:[function(require,module,exports){ + "use strict";var shaders=require("./shaders"),util=require("../util/util");exports.extend=function(r){var t=r.lineWidth,e=r.getParameter(r.ALIASED_LINE_WIDTH_RANGE);return r.lineWidth=function(i){t.call(r,util.clamp(i,e[0],e[1]))},r.getShader=function(r,t){var e=t===this.FRAGMENT_SHADER?"fragment":"vertex";if(!shaders[r]||!shaders[r][e])throw new Error("Could not find shader "+r);var i=this.createShader(t),a=shaders[r][e];if("undefined"==typeof orientation&&(a=a.replace(/ highp /g," ")),this.shaderSource(i,a),this.compileShader(i),!this.getShaderParameter(i,this.COMPILE_STATUS))throw new Error(this.getShaderInfoLog(i));return i},r.initializeShader=function(r,t,e){var i={program:this.createProgram(),fragment:this.getShader(r,this.FRAGMENT_SHADER),vertex:this.getShader(r,this.VERTEX_SHADER),attributes:[]};if(this.attachShader(i.program,i.vertex),this.attachShader(i.program,i.fragment),this.linkProgram(i.program),this.getProgramParameter(i.program,this.LINK_STATUS)){for(var a=0;athis.height)return console.warn("LineAtlas out of space"),null;for(var a=0,r=0;r=E;E++)for(var T=this.nextRow+e+E,l=this.width*T,R=d?-t[t.length-1]:0,u=t[0],g=1,p=0;pu;)R=u,u+=t[g],d&&g===t.length-1&&(u+=t[0]),g++;var x,f=Math.abs(p-R*n),A=Math.abs(p-u*n),w=Math.min(f,A),_=g%2===1;if(i){var y=e?E/e*(o+1):0;if(_){var D=o-Math.abs(y);x=Math.sqrt(w*w+D*D)}else x=o-Math.sqrt(w*w+y*y)}else x=(_?1:-1)*w;this.data[3+4*(l+p)]=Math.max(0,Math.min(255,x+s))}var c={y:(this.nextRow+e+.5)/this.height,height:2*e/this.height,width:a};return this.nextRow+=h,this.dirty=!0,c},LineAtlas.prototype.bind=function(t){this.texture?(t.bindTexture(t.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.RGBA,t.UNSIGNED_BYTE,this.data))):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,this.data))},LineAtlas.prototype.debug=function(){var t=document.createElement("canvas");document.body.appendChild(t),t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.background="#ff0",t.width=this.width,t.height=this.height;for(var i=t.getContext("2d"),e=i.getImageData(0,0,this.width,this.height),h=0;h=0;i--){var r=t._groups[i],a=t.sources[r.source];a?(this.clearStencil(),a.render(r,this)):void 0===r.source&&this.drawLayers(r,this.identityMatrix)}},Painter.prototype.drawTile=function(t,e){this.setExtent(t.tileExtent),this.drawClippingMask(t),this.drawLayers(e,t.posMatrix,t),this.options.debug&&draw.debug(this,t)},Painter.prototype.drawLayers=function(t,e,i){for(var r=t.length-1;r>=0;r--){var a=t[r];a.hidden||(draw[a.type](this,a,e,i),this.options.vertices&&draw.vertices(this,a,e,i))}},Painter.prototype.drawStencilBuffer=function(){var t=this.gl;t.switchShader(this.fillShader,this.identityMatrix),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.stencilMask(0),t.stencilFunc(t.EQUAL,128,128),t.bindBuffer(t.ARRAY_BUFFER,this.backgroundBuffer),t.vertexAttribPointer(this.fillShader.a_pos,this.backgroundBuffer.itemSize,t.SHORT,!1,0,0),t.uniform4fv(this.fillShader.u_color,[0,0,0,.5]),t.drawArrays(t.TRIANGLE_STRIP,0,this.tileExtentBuffer.itemCount),t.blendFunc(t.ONE_MINUS_DST_ALPHA,t.ONE)},Painter.prototype.translateMatrix=function(t,e,i,r){if(!i[0]&&!i[1])return t;if("viewport"===r){var a=Math.sin(-this.transform.angle),s=Math.cos(-this.transform.angle);i=[i[0]*s-i[1]*a,i[0]*a+i[1]*s]}var u=this.transform.scale/(1<0?e.pop():null}; + },{"../util/browser":95,"./draw_background":25,"./draw_circle":26,"./draw_debug":28,"./draw_fill":29,"./draw_line":30,"./draw_raster":31,"./draw_symbol":32,"./draw_vertices":33,"./frame_history":34,"./gl_util":35,"gl-matrix":116}],38:[function(require,module,exports){ + "use strict";var glify=void 0;module.exports={debug:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},dot:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}"},fill:{vertex:"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);}",fragment:"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"},circle:{vertex:"precision mediump float;uniform float u_size;attribute vec2 a_pos;uniform mat4 u_matrix,u_exmatrix;varying vec2 a;void main(){a=vec2(mod(a_pos,2.)*2.-1.);vec4 b=u_exmatrix*vec4(a*u_size,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5),0,1);gl_Position+=b*gl_Position.w;}",fragment:"precision mediump float;uniform vec4 u_color;uniform float u_blur,u_size;varying vec2 a;void main(){float b=smoothstep(1.-u_blur,1.,length(a));gl_FragColor=u_color*(1.-b);}"},line:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,e;d=a_data.xy;e=mod(a_pos,2.);e.y=sign(e.y-.5);a=e;vec4 f=vec4(u_linewidth.s*d*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+f.xy/u_ratio,0,1);float g,h,i;g=gl_Position.y/gl_Position.w;h=length(d)/length(u_antialiasingmatrix*d);i=1./(1.-min(g*u_extra,.9));c=i*h;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur;varying vec2 a;varying float b,c;void main(){float d,e,f;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);gl_FragColor=u_color*f;}"},linepattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform vec2 u_linewidth;uniform vec4 u_color;uniform mat2 u_antialiasingmatrix;varying vec2 a;varying float b,c;void main(){vec2 d,f,g,h;d=a_data.xy;float e,i,j,k;e=a_data.z*128.+a_data.w;f=mod(a_pos,2.);f.y=sign(f.y-.5);a=f;g=d*.015873016;h=u_linewidth.s*g;gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=e;i=gl_Position.y/gl_Position.w;j=length(d)/length(u_antialiasingmatrix*d);k=1./(1.-min(i*u_extra,.9));c=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth,u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform float u_point,u_blur,u_fade,u_opacity;uniform sampler2D u_image;varying vec2 a;varying float b,c;void main(){float d,e,f,g,h,i,j;d=length(a)*u_linewidth.s;e=u_blur*c;f=clamp(min(d-(u_linewidth.t-e),u_linewidth.s-d)/e,0.,1.);g=mod(b/u_pattern_size_a.x,1.);h=mod(b/u_pattern_size_b.x,1.);i=.5+a.y*u_linewidth.s/u_pattern_size_a.y;j=.5+a.y*u_linewidth.s/u_pattern_size_b.y;vec2 k,l;k=mix(u_pattern_tl_a,u_pattern_br_a,vec2(g,i));l=mix(u_pattern_tl_b,u_pattern_br_b,vec2(h,j));vec4 m=mix(texture2D(u_image,k),texture2D(u_image,l),u_fade);f*=u_opacity;gl_FragColor=m*f;}"},linesdfpattern:{vertex:"precision mediump float;attribute vec2 a_pos;attribute vec4 a_data;uniform highp mat4 u_matrix;uniform vec2 u_linewidth,u_patternscale_a,u_patternscale_b;uniform float u_ratio,u_tex_y_a,u_tex_y_b,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,b,c;varying float d;void main(){vec2 e,g;e=a_data.xy;float f,i,j,k;f=a_data.z*128.+a_data.w;g=mod(a_pos,2.);g.y=sign(g.y-.5);a=g;vec4 h=vec4(u_linewidth.s*e*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+h.xy/u_ratio,0,1);b=vec2(f*u_patternscale_a.x,g.y*u_patternscale_a.y+u_tex_y_a);c=vec2(f*u_patternscale_b.x,g.y*u_patternscale_b.y+u_tex_y_b);i=gl_Position.y/gl_Position.w;j=length(e)/length(u_antialiasingmatrix*e);k=1./(1.-min(i*u_extra,.9));d=k*j;}",fragment:"precision mediump float;uniform vec2 u_linewidth;uniform vec4 u_color;uniform float u_blur,u_sdfgamma,u_mix;uniform sampler2D u_image;varying vec2 a,b,c;varying float d;void main(){float e,f,g,h,i,j;e=length(a)*u_linewidth.s;f=u_blur*d;g=clamp(min(e-(u_linewidth.t-f),u_linewidth.s-e)/f,0.,1.);h=texture2D(u_image,b).a;i=texture2D(u_image,c).a;j=mix(h,i,u_mix);g*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,j);gl_FragColor=u_color*g;}"},outline:{vertex:"precision mediump float;attribute vec2 a_pos;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec2 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;}",fragment:"precision mediump float;uniform vec4 u_color;varying vec2 a;void main(){float b,c;b=length(a-gl_FragCoord.xy);c=smoothstep(1.,0.,b);gl_FragColor=u_color*c;}"},pattern:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}",fragment:"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}"},raster:{vertex:"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}",fragment:"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}"},icon:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_opacity,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=u_opacity;}",fragment:"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}"},sdf:{vertex:"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c;void main(){vec2 d,f;d=a_data1.xy;float e,g,h,i,j,k,l;e=a_data1[2];f=a_data2.st;g=f[0];h=f[1];i=2.-step(g,u_zoom)-(1.-step(h,u_zoom));j=clamp((u_fadezoom-e)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom=e)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}k=gl_Position.y/gl_Position.w;l=1./(1.-k*u_extra);c=l;a=d/u_texsize;}",fragment:"precision mediump float;uniform sampler2D u_texture;uniform vec4 u_color;uniform float u_buffer,u_gamma;varying vec2 a;varying float b,c;void main(){float d,e,f;d=u_gamma*c;e=texture2D(u_texture,a).a;f=smoothstep(u_buffer-d,u_buffer+d,e)*b;gl_FragColor=u_color*f;}"},collisionbox:{vertex:"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}",fragment:"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}"}}; + },{}],39:[function(require,module,exports){ + "use strict";function GeoJSONSource(i){i=i||{},this._data=i.data,void 0!==i.maxzoom&&(this.maxzoom=i.maxzoom),this.geojsonVtOptions={maxZoom:this.maxzoom},void 0!==i.buffer&&(this.geojsonVtOptions.buffer=i.buffer),void 0!==i.tolerance&&(this.geojsonVtOptions.tolerance=i.tolerance),this._pyramid=new TilePyramid({tileSize:512,minzoom:this.minzoom,maxzoom:this.maxzoom,cacheSize:20,load:this._loadTile.bind(this),abort:this._abortTile.bind(this),unload:this._unloadTile.bind(this),add:this._addTile.bind(this),remove:this._removeTile.bind(this)})}var util=require("../util/util"),Evented=require("../util/evented"),TilePyramid=require("./tile_pyramid"),Source=require("./source"),urlResolve=require("resolve-url");module.exports=GeoJSONSource,GeoJSONSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:14,_dirty:!0,setData:function(i){return this._data=i,this._dirty=!0,this.fire("change"),this.map&&this.update(this.map.transform),this},onAdd:function(i){this.map=i},loaded:function(){return this._loaded&&this._pyramid.loaded()},update:function(i){this._dirty&&this._updateData(),this._loaded&&this._pyramid.update(this.used,i)},reload:function(){this._loaded&&this._pyramid.reload()},render:Source._renderTiles,featuresAt:Source._vectorFeaturesAt,featuresIn:Source._vectorFeaturesIn,_updateData:function(){this._dirty=!1;var i=this._data;"string"==typeof i&&(i=urlResolve(window.location.href,i)),this.workerID=this.dispatcher.send("parse geojson",{data:i,tileSize:512,source:this.id,geojsonVtOptions:this.geojsonVtOptions},function(i){return i?void this.fire("error",{error:i}):(this._loaded=!0,this._pyramid.reload(),void this.fire("change"))}.bind(this))},_loadTile:function(i){var t=i.coord.z>this.maxzoom?Math.pow(2,i.coord.z-this.maxzoom):1,e={uid:i.uid,coord:i.coord,zoom:i.coord.z,maxZoom:this.maxzoom,tileSize:512,source:this.id,overscaling:t,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug};i.workerID=this.dispatcher.send("load geojson tile",e,function(t,e){if(i.unloadVectorData(this.map.painter),!i.aborted){if(t)return void this.fire("tile.error",{tile:i});i.loadVectorData(e),this.fire("tile.load",{tile:i})}}.bind(this),this.workerID)},_abortTile:function(i){i.aborted=!0},_addTile:function(i){this.fire("tile.add",{tile:i})},_removeTile:function(i){this.fire("tile.remove",{tile:i})},_unloadTile:function(i){i.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(i.uid),this.dispatcher.send("remove tile",{uid:i.uid,source:this.id},null,i.workerID)}}); + },{"../util/evented":100,"../util/util":106,"./source":43,"./tile_pyramid":46,"resolve-url":140}],40:[function(require,module,exports){ + "use strict";function GeoJSONWrapper(e){this.features=e,this.length=e.length}function FeatureWrapper(e){this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=4096}var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature;module.exports=GeoJSONWrapper,GeoJSONWrapper.prototype.feature=function(e){return new FeatureWrapper(this.features[e])},FeatureWrapper.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t4096||o.parentId)&&(o.tileExtent=4096),s+=d*(1<r&&(r=-1*r-1);var e=1<i.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx0,y=i.dx<0,x=n;h>x;x++){var c=d*Math.max(0,Math.min(t.dy,x+l-t.y0))+t.x0,u=a*Math.max(0,Math.min(i.dy,x+y-i.y0))+i.x0;e(Math.floor(u),Math.ceil(c),x)}}function scanTriangle(t,i,o,r,e,n){var h,s=edge(t,i),d=edge(i,o),a=edge(o,t);s.dy>d.dy&&(h=s,s=d,d=h),s.dy>a.dy&&(h=s,s=a,a=h),d.dy>a.dy&&(h=d,d=a,a=h),s.dy&&scanSpans(a,s,r,e,n),d.dy&&scanSpans(a,d,r,e,n)}module.exports=TileCoord,TileCoord.prototype.toString=function(){return this.z+"/"+this.x+"/"+this.y},TileCoord.fromID=function(t){var i=t%32,o=1<t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o){function r(t,i,r){var h,s,d;if(r>=0&&e>=r)for(h=t;i>h;h++)s=(h%e+e)%e,d=new TileCoord(o,s,r,Math.floor(h/e)),n[d.id]=d}var e=1<this.maxzoom&&(e=this.maxzoom);var o=i,r=o.locationCoordinate(o.center)._zoomTo(e),n=new Point(r.column-.5,r.row-.5);return TileCoord.cover(e,[o.pointCoordinate(new Point(0,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,0))._zoomTo(e),o.pointCoordinate(new Point(o.width,o.height))._zoomTo(e),o.pointCoordinate(new Point(0,o.height))._zoomTo(e)],this.reparseOverscaled?t:e).sort(function(i,e){return n.dist(i)-n.dist(e)})},findLoadedChildren:function(i,e,t){for(var o=!0,r=i.z,n=i.children(this.maxzoom),s=0;sr&&this.findLoadedChildren(n[s],e,t))}return o},findLoadedParent:function(i,e,t){for(var o=i.z-1;o>=e;o--){i=i.parent(this.maxzoom);var r=this._tiles[i.id];if(r&&r.loaded)return t[i.id]=!0,r}},update:function(i,e,t){var o,r,n,s=(this.roundZoom?Math.round:Math.floor)(this.getZoom(e)),d=util.clamp(s-10,this.minzoom,this.maxzoom),h=util.clamp(s+1,this.minzoom,this.maxzoom),a={},l=(new Date).getTime();this._coveredTiles={};var m=i?this.coveringTiles(e):[];for(o=0;ol-(t||0)&&(this.findLoadedChildren(r,h,a)?(this._coveredTiles[u]=!0,a[u]=!0):this.findLoadedParent(r,d,a));var c=util.keysDifference(this._tiles,a);for(o=0;othis.maxzoom?Math.pow(2,o-this.maxzoom):1;e=new Tile(t,this.tileSize*r),this.index&&(e.parentId=this.indexSearch(i.id)),this._load(e)}return e.uses++,this._tiles[i.id]=e,this._add(e,i),e},removeTile:function(i){var e=this._tiles[i];e&&(e.uses--,delete this._tiles[i],this._remove(e),e.uses>0||(e.loaded?this._cache.add(e.coord.wrapped().id,e):(this._abort(e),this._unload(e))))},clearTiles:function(){for(var i in this._tiles)this.removeTile(i);this._cache.reset()},tileAt:function(i){for(var e=this.orderedIDs(),t=0;t=0&&r.x=0&&r.y=0&&n[1].y>=0&&e.push({tile:r,minX:n[0].x,maxX:n[1].x,minY:n[0].y,maxY:n[1].y})}return e},indexSearch:function(i){for(var e=TileCoord.fromID(i),t=[i],o=e;0!==o.z;)o=o.parent(),t.push(o.id);for(var r,n=this.index,s=t.pop(),d=function(i){return i.id};t.length;)if(i=t.pop(),e=TileCoord.fromID(s),r=e.children(this.maxzoom).map(d).indexOf(i),n){if(0===n[r]){s=i;break}if(1===n[r]){s=i;break}s=i,n=n[r]}return 0===t.length?null:s}}; + },{"../util/mru_cache":104,"../util/util":106,"./tile":44,"./tile_coord":45,"point-geometry":137}],47:[function(require,module,exports){ + "use strict";function VectorTileSource(e){if(util.extend(this,util.pick(e,["url","tileSize"])),512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");Source._loadTileJSON.call(this,e)}var util=require("../util/util"),Evented=require("../util/evented"),Source=require("./source"),TileCoord=require("./tile_coord");module.exports=VectorTileSource,VectorTileSource.prototype=util.inherit(Evented,{minzoom:0,maxzoom:22,tileSize:512,reparseOverscaled:!0,_loaded:!1,onAdd:function(e){this.map=e},loaded:function(){return this._pyramid&&this._pyramid.loaded()},update:function(e){this._pyramid&&this._pyramid.update(this.used,e)},reload:function(){this._pyramid&&this._pyramid.reload()},redoPlacement:function(){if(this._pyramid)for(var e=this._pyramid.orderedIDs(),i=0;ithis.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,t={url:e.coord.url(this.tiles,this.maxzoom),uid:e.uid,coord:e.coord,zoom:e.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize*i,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug,parentId:e.parentId};e.parentId&&(t.url=TileCoord.fromID(e.parentId).url(this.tiles,this.maxzoom)),e.workerID?this.dispatcher.send("reload tile",t,this._tileLoaded.bind(this,e),e.workerID):e.workerID=this.dispatcher.send("load tile",t,this._tileLoaded.bind(this,e))},_tileLoaded:function(e,i,t){if(!e.aborted){if(i)return void this.fire("tile.error",{tile:e});e.loadVectorData(t),e.redoWhenDone&&(e.redoWhenDone=!1,this._redoTilePlacement(e)),this.fire("tile.load",{tile:e}),this.fire("tile.stats",t.bucketStats)}},_abortTile:function(e){e.aborted=!0,this.dispatcher.send("abort tile",{uid:e.uid,source:this.id},null,e.workerID)},_addTile:function(e){this.fire("tile.add",{tile:e})},_removeTile:function(e){this.fire("tile.remove",{tile:e})},_unloadTile:function(e){e.unloadVectorData(this.map.painter),this.glyphAtlas.removeGlyphs(e.uid),this.dispatcher.send("remove tile",{uid:e.uid,source:this.id},null,e.workerID)},_redoTilePlacement:function(e){function i(i,t){e.reloadSymbolData(t,this.map.painter),this.fire("tile.load",{tile:e}),e.redoingPlacement=!1,e.redoWhenDone&&(this._redoTilePlacement(e),e.redoWhenDone=!1)}return!e.loaded||e.redoingPlacement?void(e.redoWhenDone=!0):(e.redoingPlacement=!0,void this.dispatcher.send("redo placement",{uid:e.uid,source:this.id,angle:this.map.transform.angle,pitch:this.map.transform.pitch,collisionDebug:this.map.collisionDebug},i.bind(this),e.workerID))}}); + },{"../util/evented":100,"../util/util":106,"./source":43,"./tile_coord":45}],48:[function(require,module,exports){ + "use strict";function VideoSource(e){this.coordinates=e.coordinates,ajax.getVideo(e.urls,function(e,t){if(!e){this.video=t,this.video.loop=!0;var i;this.video.addEventListener("playing",function(){i=this.map.style.animationLoop.set(1/0),this.map._rerender()}.bind(this)),this.video.addEventListener("pause",function(){this.map.style.animationLoop.cancel(i)}.bind(this)),this._loaded=!0,this.map&&(this.video.play(),this.createTile(),this.fire("change"))}}.bind(this))}var util=require("../util/util"),Tile=require("./tile"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Evented=require("../util/evented"),ajax=require("../util/ajax");module.exports=VideoSource,VideoSource.prototype=util.inherit(Evented,{roundZoom:!0,getVideo:function(){return this.video},onAdd:function(e){this.map=e,this.video&&(this.video.play(),this.createTile())},createTile:function(){var e=this.map,t=this.coordinates.map(function(t){var i=LngLat.convert(t);return e.transform.locationCoordinate(i).zoomTo(0)}),i=util.getCoordinatesCenter(t),r=4096,o=t.map(function(e){var t=e.zoomTo(i.zoom);return new Point(Math.round((t.column-i.column)*r),Math.round((t.row-i.row)*r))}),n=e.painter.gl,a=32767,u=new Int16Array([o[0].x,o[0].y,0,0,o[1].x,o[1].y,a,0,o[3].x,o[3].y,0,a,o[2].x,o[2].y,a,a]);this.tile=new Tile,this.tile.buckets={},this.tile.boundsBuffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.tile.boundsBuffer),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),this.center=i},loaded:function(){return this.video&&this.video.readyState>=2},update:function(){},reload:function(){},render:function(e,t){if(this._loaded&&!(this.video.readyState<2)){var i=this.center;this.tile.calculateMatrices(i.zoom,i.column,i.row,this.map.transform,t);var r=t.gl;this.tile.texture?(r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.tile.texture=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.tile.texture),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.video)),t.drawLayers(e,this.tile.posMatrix,this.tile)}},featuresAt:function(e,t,i){return i(null,[])},featuresIn:function(e,t,i){return i(null,[])}}); + },{"../geo/lng_lat":20,"../util/ajax":94,"../util/evented":100,"../util/util":106,"./tile":44,"point-geometry":137}],49:[function(require,module,exports){ + "use strict";function Worker(e){this.self=e,this.actor=new Actor(e,this),this.loading={},this.loaded={},this.layers=[],this.geoJSONIndexes={}}var Actor=require("../util/actor"),WorkerTile=require("./worker_tile"),util=require("../util/util"),ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),TileCoord=require("./tile_coord"),geojsonvt=require("geojson-vt"),GeoJSONWrapper=require("./geojson_wrapper");module.exports=function(e){return new Worker(e)},util.extend(Worker.prototype,{"set layers":function(e){this.layers=e},"load tile":function(e,r){function t(t,s){if(delete this.loading[o][i],t)return r(t);if(a.data=new vt.VectorTile(new Protobuf(new Uint8Array(s))),e.parentId&&a.data.layers){var l=this.getChildPosition(e.coord.id,e.parentId);a.parse(a.data,this.layers,this.actor,r,l.dz,l.xPos,l.yPos)}else a.parse(a.data,this.layers,this.actor,r);this.loaded[o]=this.loaded[o]||{},this.loaded[o][i]=a}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.xhr=ajax.getArrayBuffer(e.url,t.bind(this))},"reload tile":function(e,r){var t=this.loaded[e.source],o=e.uid;if(t&&t[o]){var i=t[o];i.parse(i.data,this.layers,this.actor,r)}},"abort tile":function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&(r[t].xhr.abort(),delete r[t])},"remove tile":function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t]},"redo placement":function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],s=a.redoPlacement(e.angle,e.pitch,e.collisionDebug);s.result&&r(null,s.result,s.transferables)}else o&&o[i]&&(o[i].angle=e.angle)},"parse geojson":function(e,r){var t=function(t,o){return t?r(t):(this.geoJSONIndexes[e.source]=geojsonvt(o,e.geojsonVtOptions),void r(null))}.bind(this);"string"==typeof e.data?ajax.getJSON(e.data,t):t(null,e.data)},"load geojson tile":function(e,r){var t=e.source,o=e.coord,i=this.geoJSONIndexes[t].getTile(o.z,o.x,o.y);if(!i)return r(null,null);var a=new WorkerTile(e);a.parse(new GeoJSONWrapper(i.features),this.layers,this.actor,r),this.loaded[t]=this.loaded[t]||{},this.loaded[t][e.uid]=a},"query features":function(e,r){var t=this.loaded[e.source]&&this.loaded[e.source][e.uid];t?t.featureTree.query(e,r):r(null,[])},getChildPosition:function(e,r){var t=TileCoord.fromID(e),o=TileCoord.fromID(r),i=t.z-o.z,a=t.x&(1<=P)){var S=h.layout.visibility;if("none"!==S)if(p=createBucket(h,m,this.zoom,this.overscaling,this.collisionDebug),p.layers=[h.id],b[p.id]=p,x.push(p),e.layers){var D=h["source-layer"];y[D]||(y[D]={}),y[D][p.id]=p}else y[p.id]=p}}}for(c=0;c=0;c--)p=x[c],p.needsPlacement&&(z?z.next=p:p.previousPlaced=!0,z=p),p.getDependencies&&p.getDependencies(this,r,l(p)),p.needsPlacement||p.getDependencies||u(v,p)},WorkerTile.prototype.redoPlacement=function(e,t,r){if("done"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=e,{};for(var i=new BufferSet,s=[],o={},n=new CollisionTile(e,t),a=this.bucketsInOrder,l=a.length-1;l>=0;l--){var u=a[l];"symbol"===u.type&&(u.placeFeatures(n,i,r),o[u.id]=u.elementGroups)}for(var f in i)s.push(i[f].array);return{result:{elementGroups:o,buffers:i},transferables:s}}; + },{"../data/buffer/buffer_set":2,"../data/create_bucket":13,"../data/feature_tree":15,"../symbol/collision_tile":68}],51:[function(require,module,exports){ + "use strict";function AnimationLoop(){this.n=0,this.times=[]}module.exports=AnimationLoop,AnimationLoop.prototype.stopped=function(){return this.times=this.times.filter(function(t){return t.time>=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})}; + },{}],52:[function(require,module,exports){ + "use strict";function ImageSprite(t){this.base=t,this.retina=browser.devicePixelRatio>1;var i=this.retina?"@2x":"";ajax.getJSON(normalizeURL(t,i,".json"),function(t,i){return t?void this.fire("error",{error:t}):(this.data=i,void(this.img&&this.fire("load")))}.bind(this)),ajax.getImage(normalizeURL(t,i,".png"),function(t,i){if(t)return void this.fire("error",{error:t});for(var e=i.getData(),r=i.data=new Uint8Array(e.length),a=0;a1!==this.retina){var t=new ImageSprite(this.base);t.on("load",function(){this.img=t.img,this.data=t.data,this.retina=t.retina}.bind(this))}},SpritePosition.prototype={x:0,y:0,width:0,height:0,pixelRatio:1,sdf:!1},ImageSprite.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.img?i:new SpritePosition}; + },{"../util/ajax":94,"../util/browser":95,"../util/evented":100,"../util/mapbox":103}],53:[function(require,module,exports){ + "use strict";var reference=require("./reference");module.exports={},reference.layout.forEach(function(e){var r=function(e){for(var r in e)this[r]=e[r]},o=reference[e];for(var t in o)void 0!==o[t]["default"]&&(r.prototype[t]=o[t]["default"]);module.exports[e.replace("layout_","")]=r}); + },{"./reference":55}],54:[function(require,module,exports){ + "use strict";var reference=require("./reference"),parseCSSColor=require("csscolorparser").parseCSSColor;module.exports={},reference.paint.forEach(function(e){var r=function(){},o=reference[e];for(var p in o){var t=o[p],a=t["default"];void 0!==a&&("color"===t.type&&(a=parseCSSColor(a)),r.prototype[p]=a)}r.prototype.hidden=!1,module.exports[e.replace("paint_","")]=r}); + },{"./reference":55,"csscolorparser":107}],55:[function(require,module,exports){ + "use strict";module.exports=require("mapbox-gl-style-spec/reference/latest"); + },{"mapbox-gl-style-spec/reference/latest":131}],56:[function(require,module,exports){ + "use strict";function Style(e,t){this.animationLoop=t||new AnimationLoop,this.dispatcher=new Dispatcher(Math.max(browser.hardwareConcurrency-1,1),this),this.glyphAtlas=new GlyphAtlas(1024,1024),this.spriteAtlas=new SpriteAtlas(512,512),this.spriteAtlas.resize(browser.devicePixelRatio),this.lineAtlas=new LineAtlas(256,512),this._layers={},this._order=[],this._groups=[],this.sources={},this.zoomHistory={},util.bindAll(["_forwardSourceEvent","_forwardTileEvent","_redoPlacement"],this);var r=function(e,t){if(e)return void this.fire("error",{error:e});var r=validate(t);if(r.length)for(var i=0;iMath.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},batch:function(e){styleBatch(this,e)},addSource:function(e,t){return this.batch(function(r){r.addSource(e,t)}),this},removeSource:function(e){return this.batch(function(t){t.removeSource(e)}),this},getSource:function(e){return this.sources[e]},addLayer:function(e,t){return this.batch(function(r){r.addLayer(e,t)}),this},removeLayer:function(e){return this.batch(function(t){t.removeLayer(e)}),this},getLayer:function(e){return this._layers[e]},getReferentLayer:function(e){var t=this.getLayer(e);return t.ref&&(t=this.getLayer(t.ref)),t},setFilter:function(e,t){return this.batch(function(r){r.setFilter(e,t)}),this},setLayerZoomRange:function(e,t,r){return this.batch(function(i){i.setLayerZoomRange(e,t,r)}),this},getFilter:function(e){return this.getReferentLayer(e).filter},getLayoutProperty:function(e,t){return this.getReferentLayer(e).getLayoutProperty(t)},getPaintProperty:function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},featuresAt:function(e,t,r){var i=[],s=null;t.layer&&(t.layerIds=Array.isArray(t.layer)?t.layer:[t.layer]),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresAt(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},featuresIn:function(e,t,r){var i=[],s=null;t.layer&&(t.layer={id:t.layer}),util.asyncEach(Object.keys(this.sources),function(r,o){var a=this.sources[r];a.featuresIn(e,t,function(e,t){t&&(i=i.concat(t)),e&&(s=e),o()})}.bind(this),function(){return s?r(s):void r(null,i.filter(function(e){return void 0!==this._layers[e.layer]}.bind(this)).map(function(e){return e.layer=this._layers[e.layer].json(),e}.bind(this)))}.bind(this))},_remove:function(){this.dispatcher.remove()},_reloadSource:function(e){this.sources[e].reload()},_updateSources:function(e){for(var t in this.sources)this.sources[t].update(e)},_redoPlacement:function(){for(var e in this.sources)this.sources[e].redoPlacement&&this.sources[e].redoPlacement()},_forwardSourceEvent:function(e){this.fire("source."+e.type,util.extend({source:e.target},e))},_forwardTileEvent:function(e){this.fire(e.type,util.extend({source:e.target},e))},"get sprite json":function(e,t){var r=this.sprite;r.loaded()?t(null,{sprite:r.data,retina:r.retina}):r.on("load",function(){t(null,{sprite:r.data,retina:r.retina})})},"get icons":function(e,t){var r=this.sprite,i=this.spriteAtlas;r.loaded()?(i.setSprite(r),i.addIcons(e.icons,t)):r.on("load",function(){i.setSprite(r),i.addIcons(e.icons,t)})},"get glyphs":function(e,t){this.glyphSource.getSimpleGlyphs(e.fontstack,e.codepoints,e.uid,t)}}); + },{"../render/line_atlas":36,"../symbol/glyph_atlas":70,"../symbol/glyph_source":71,"../symbol/sprite_atlas":77,"../util/ajax":94,"../util/browser":95,"../util/dispatcher":97,"../util/evented":100,"../util/mapbox":103,"../util/util":106,"./animation_loop":51,"./image_sprite":52,"./style_batch":57,"./style_layer":60,"mapbox-gl-style-spec/lib/validate/latest":129}],57:[function(require,module,exports){ + "use strict";function styleBatch(e,t){if(!e._loaded)throw new Error("Style is not done loading");var r=Object.create(styleBatch.prototype);r._style=e,r._groupLayers=!1,r._broadcastLayers=!1,r._reloadSources={},r._events=[],r._change=!1,t(r),r._groupLayers&&r._style._groupLayers(),r._broadcastLayers&&r._style._broadcastLayers(),Object.keys(r._reloadSources).forEach(function(e){r._style._reloadSource(e)}),r._events.forEach(function(e){r._style.fire.apply(r._style,e)}),r._change&&r._style.fire("change")}var Source=require("../source/source"),StyleLayer=require("./style_layer");styleBatch.prototype={addLayer:function(e,t){if(void 0!==this._style._layers[e.id])throw new Error("There is already a layer with this ID");return e instanceof StyleLayer||(e=new StyleLayer(e)),this._style._layers[e.id]=e,this._style._order.splice(t?this._style._order.indexOf(t):1/0,0,e.id),e.resolveLayout(),e.resolveReference(this._style._layers),e.resolvePaint(),this._groupLayers=!0,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._events.push(["layer.add",{layer:e}]),this._change=!0,this},removeLayer:function(e){var t=this._style._layers[e];if(void 0===t)throw new Error("There is no layer with this ID");for(var r in this._style._layers)this._style._layers[r].ref===e&&this.removeLayer(r);return delete this._style._layers[e],this._style._order.splice(this._style._order.indexOf(e),1),this._groupLayers=!0,this._broadcastLayers=!0,this._events.push(["layer.remove",{layer:t}]),this._change=!0,this},setPaintProperty:function(e,t,r,s){return this._style.getLayer(e).setPaintProperty(t,r,s),this._change=!0,this},setLayoutProperty:function(e,t,r){return e=this._style.getReferentLayer(e),e.setLayoutProperty(t,r),this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setFilter:function(e,t){return e=this._style.getReferentLayer(e),e.filter=t,this._broadcastLayers=!0,e.source&&(this._reloadSources[e.source]=!0),this._change=!0,this},setLayerZoomRange:function(e,t,r){var s=this._style.getReferentLayer(e);return null!=t&&(s.minzoom=t),null!=r&&(s.maxzoom=r),this._broadcastLayers=!0,s.source&&(this._reloadSources[s.source]=!0),this._change=!0,this},addSource:function(e,t){if(!this._style._loaded)throw new Error("Style is not done loading");if(void 0!==this._style.sources[e])throw new Error("There is already a source with this ID");return t=Source.create(t),this._style.sources[e]=t,t.id=e,t.style=this._style,t.dispatcher=this._style.dispatcher,t.glyphAtlas=this._style.glyphAtlas,t.on("load",this._style._forwardSourceEvent).on("error",this._style._forwardSourceEvent).on("change",this._style._forwardSourceEvent).on("tile.add",this._style._forwardTileEvent).on("tile.load",this._style._forwardTileEvent).on("tile.error",this._style._forwardTileEvent).on("tile.remove",this._style._forwardTileEvent).on("tile.stats",this._style._forwardTileEvent),this._events.push(["source.add",{source:t}]),this._change=!0,this},removeSource:function(e){if(void 0===this._style.sources[e])throw new Error("There is no source with this ID");var t=this._style.sources[e];return delete this._style.sources[e],t.off("load",this._style._forwardSourceEvent).off("error",this._style._forwardSourceEvent).off("change",this._style._forwardSourceEvent).off("tile.add",this._style._forwardTileEvent).off("tile.load",this._style._forwardTileEvent).off("tile.error",this._style._forwardTileEvent).off("tile.remove",this._style._forwardTileEvent).off("tile.stats",this._style._forwardTileEvent),this._events.push(["source.remove",{source:t}]),this._change=!0,this}},module.exports=styleBatch; + },{"../source/source":43,"./style_layer":60}],58:[function(require,module,exports){ + "use strict";function StyleDeclaration(t,r){this.type=t.type,this.transitionable=t.transition,null==r&&(r=t["default"]),this.json=JSON.stringify(r),"color"===this.type?this.value=parseColor(r):this.value=r,"interpolated"===t["function"]?this.calculate=MapboxGLFunction.interpolated(this.value):(this.calculate=MapboxGLFunction["piecewise-constant"](this.value),t.transition&&(this.calculate=transitioned(this.calculate)))}function transitioned(t){return function(r,o,e){var n,i,a,l=r%1,s=Math.min((Date.now()-o.lastIntegerZoomTime)/e,1),c=1,u=1;return r>o.lastIntegerZoom?(n=l+(1-l)*s,c*=2,i=t(r-1),a=t(r)):(n=1-(1-s)*l,a=t(r),i=t(r+1),c/=2),{from:i,fromScale:c,to:a,toScale:u,t:n}}}function parseColor(t){if(colorCache[t])return colorCache[t];if(Array.isArray(t))return t;if(t.stops)return util.extend({},t,{stops:t.stops.map(function(t){return[t[0],parseColor(t[1])]})});if("string"==typeof t){var r=colorDowngrade(parseCSSColor(t));return colorCache[t]=r,r}throw new Error("Invalid color "+t)}function colorDowngrade(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]/1]}var parseCSSColor=require("csscolorparser").parseCSSColor,MapboxGLFunction=require("mapbox-gl-function"),util=require("../util/util");module.exports=StyleDeclaration;var colorCache={}; + },{"../util/util":106,"csscolorparser":107,"mapbox-gl-function":128}],59:[function(require,module,exports){ + "use strict";function makeConstructor(t){function e(t){this._values={},this._transitions={};for(var e in t)this[e]=t[e]}return Object.keys(t).forEach(function(n){var r=t[n];Object.defineProperty(e.prototype,n,{set:function(t){this._values[n]=new StyleDeclaration(r,t)},get:function(){return this._values[n].value}}),r.transition&&Object.defineProperty(e.prototype,n+"-transition",{set:function(t){this._transitions[n]=t},get:function(){return this._transitions[n]}})}),e.prototype.values=function(){return this._values},e.prototype.transition=function(t,e){var n=this._transitions[t]||{};return{duration:util.coalesce(n.duration,e.duration,300),delay:util.coalesce(n.delay,e.delay,0)}},e.prototype.json=function(){var t={};for(var e in this._values)t[e]=this._values[e].value;for(var n in this._transitions)t[n+"-transition"]=this._transitions[e];return t},e}var util=require("../util/util"),reference=require("./reference"),StyleDeclaration=require("./style_declaration"),lookup={paint:{},layout:{}};reference.layer.type.values.forEach(function(t){lookup.paint[t]=makeConstructor(reference["paint_"+t]),lookup.layout[t]=makeConstructor(reference["layout_"+t])}),module.exports=function(t,e,n){return new lookup[t][e](n)}; + },{"../util/util":106,"./reference":55,"./style_declaration":58}],60:[function(require,module,exports){ + "use strict";function StyleLayer(t){this._layer=t,this.id=t.id,this.ref=t.ref,this._resolved={},this._cascaded={},this.assign(t)}function premultiplyLayer(t,i){var e=i+"-color",a=i+"-halo-color",o=i+"-outline-color",r=t[e],s=t[a],n=t[o],l=t[i+"-opacity"],y=r&&l*r[3],u=s&&l*s[3],h=n&&l*n[3];void 0!==y&&1>y&&(t[e]=util.premultiply([r[0],r[1],r[2],y])),void 0!==u&&1>u&&(t[a]=util.premultiply([s[0],s[1],s[2],u])),void 0!==h&&1>h&&(t[o]=util.premultiply([n[0],n[1],n[2],h]))}var util=require("../util/util"),StyleTransition=require("./style_transition"),StyleDeclarationSet=require("./style_declaration_set"),LayoutProperties=require("./layout_properties"),PaintProperties=require("./paint_properties");module.exports=StyleLayer,StyleLayer.prototype={resolveLayout:function(){this.ref||(this.layout=new LayoutProperties[this.type](this._layer.layout),"line"===this.layout["symbol-placement"]&&(this.layout.hasOwnProperty("text-rotation-alignment")||(this.layout["text-rotation-alignment"]="map"),this.layout.hasOwnProperty("icon-rotation-alignment")||(this.layout["icon-rotation-alignment"]="map"),this.layout["symbol-avoid-edges"]=!0))},setLayoutProperty:function(t,i){null==i?delete this.layout[t]:this.layout[t]=i},getLayoutProperty:function(t){return this.layout[t]},resolveReference:function(t){this.ref&&this.assign(t[this.ref])},resolvePaint:function(){for(var t in this._layer){var i=t.match(/^paint(?:\.(.*))?$/);i&&(this._resolved[i[1]||""]=new StyleDeclarationSet("paint",this.type,this._layer[t]))}},setPaintProperty:function(t,i,e){var a=this._resolved[e||""];a||(a=this._resolved[e||""]=new StyleDeclarationSet("paint",this.type,{})),a[t]=i},getPaintProperty:function(t,i){var e=this._resolved[i||""];if(e)return e[t]},cascade:function(t,i,e,a){for(var o in this._resolved)if(""===o||t[o]){var r=this._resolved[o],s=r.values();for(var n in s){var l=s[n],y=i.transition?this._cascaded[n]:void 0;if(!y||y.declaration.json!==l.json){var u=r.transition(n,e),h=this._cascaded[n]=new StyleTransition(l,y,u);h.instant()||(h.loopID=a.set(h.endTime-(new Date).getTime())),y&&a.cancel(y.loopID)}}}if("symbol"===this.type){var c=new StyleDeclarationSet("layout",this.type,this.layout);this._cascaded["text-size"]=new StyleTransition(c.values()["text-size"],void 0,e),this._cascaded["icon-size"]=new StyleTransition(c.values()["icon-size"],void 0,e)}},recalculate:function(t,i){var e=this.type,a=this.paint=new PaintProperties[e];for(var o in this._cascaded)a[o]=this._cascaded[o].at(t,i);if(this.hidden=this.minzoom&&t=this.maxzoom||"none"===this.layout.visibility,"symbol"===e?0!==a["text-opacity"]&&this.layout["text-field"]||0!==a["icon-opacity"]&&this.layout["icon-image"]?(premultiplyLayer(a,"text"),premultiplyLayer(a,"icon")):this.hidden=!0:0===a[e+"-opacity"]?this.hidden=!0:premultiplyLayer(a,e),this._cascaded["line-dasharray"]){var r=a["line-dasharray"],s=this._cascaded["line-width"]?this._cascaded["line-width"].at(Math.floor(t),1/0):a["line-width"];r.fromScale*=s,r.toScale*=s}return!this.hidden},assign:function(t){util.extend(this,util.pick(t,["type","source","source-layer","minzoom","maxzoom","filter","layout"]))},json:function(){return util.extend({},this._layer,util.pick(this,["type","source","source-layer","minzoom","maxzoom","filter","layout","paint"]))}}; + },{"../util/util":106,"./layout_properties":53,"./paint_properties":54,"./style_declaration_set":59,"./style_transition":61}],61:[function(require,module,exports){ + "use strict";function StyleTransition(t,i,e){this.declaration=t,this.startTime=this.endTime=(new Date).getTime();var n=t.type;"string"!==n&&"array"!==n||!t.transitionable?this.interp=interpolate[n]:this.interp=interpZoomTransitioned,this.oldTransition=i,this.duration=e.duration||0,this.delay=e.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=util.easeCubicInOut),i&&i.endTime<=this.startTime&&delete i.oldTransition}function interpZoomTransitioned(t,i,e){return{from:t.to,fromScale:t.toScale,to:i.to,toScale:i.toScale,t:e}}var util=require("../util/util"),interpolate=require("../util/interpolate");module.exports=StyleTransition,StyleTransition.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},StyleTransition.prototype.at=function(t,i,e){var n=this.declaration.calculate(t,i,this.duration);if(this.instant())return n;if(e=e||Date.now(),et?{x:-1,y:-1}:(this.free.splice(t,1),i.we&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:i.w,h:i.h-h})):(i.w>e&&this.free.push({x:i.x+e,y:i.y,w:i.w-e,h:i.h}),i.h>h&&this.free.push({x:i.x,y:i.y+h,w:e,h:i.h-h})),{x:i.x,y:i.y,w:e,h:h})}; + },{}],64:[function(require,module,exports){ + "use strict";function checkMaxAngle(e,t,a,r,n){if(void 0===t.segment)return!0;for(var i=t,s=t.segment+1,f=0;f>-a/2;){if(s--,0>s)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;a/2>f;){var u=e[s-1],c=e[s],g=e[s+1];if(!g)return!1;var h=u.angleTo(c)-c.angleTo(g);for(h=(h+3*Math.PI)%(2*Math.PI)-Math.PI,l.push({distance:f,angleDelta:h}),o+=h;f-l[0].distance>r;)o-=l.shift().angleDelta;if(Math.abs(o)>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle; + },{}],65:[function(require,module,exports){ + "use strict";function clipLine(x,y,n,e,t){for(var i=[],o=0;o=e&&l.x>=e||(w.x>=e?w=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x))):l.x>=e&&(l=new Point(e,w.y+(l.y-w.y)*((e-w.x)/(l.x-w.x)))),w.y>=t&&l.y>=t||(w.y>=t?w=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t):l.y>=t&&(l=new Point(w.x+(l.x-w.x)*((t-w.y)/(l.y-w.y)),t)),r&&w.equals(r[r.length-1])||(r=[w],i.push(r)),r.push(l)))))}return i}var Point=require("point-geometry");module.exports=clipLine; + },{"point-geometry":137}],66:[function(require,module,exports){ + "use strict";function CollisionBox(i,t,s,h,o,l){this.anchorPoint=i,this.x1=t,this.y1=s,this.x2=h,this.y2=o,this.maxScale=l,this.placementScale=0,this[0]=this[1]=this[2]=this[3]=0}module.exports=CollisionBox; + },{}],67:[function(require,module,exports){ + "use strict";function CollisionFeature(o,i,t,e,r,s){var n=t.top*e-r,l=t.bottom*e+r,a=t.left*e-r,u=t.right*e+r;if(this.boxes=[],s){var h=l-n,x=u-a;if(0>=h)return;h=Math.max(10*e,h),this._addLineCollisionBoxes(o,i,x,h)}else this.boxes.push(new CollisionBox(new Point(i.x,i.y),a,n,u,l,1/0))}var CollisionBox=require("./collision_box"),Point=require("point-geometry");module.exports=CollisionFeature,CollisionFeature.prototype._addLineCollisionBoxes=function(o,i,t,e){var r=e/2,s=Math.floor(t/r),n=-e/2,l=this.boxes,a=i,u=i.segment+1,h=n;do{if(u--,0>u)return l;h-=o[u].dist(a),a=o[u]}while(h>-t/2);for(var x=o[u].dist(o[u+1]),d=0;s>d;d++){for(var f=-t/2+d*r;f>h+x;){if(h+=x,u++,u+1>=o.length)return l;x=o[u].dist(o[u+1])}var C=f-h,b=o[u],m=o[u+1],p=m.sub(b)._unit()._mult(C)._add(b),v=Math.max(Math.abs(f-n)-r/2,0),_=t/2/v;l.push(new CollisionBox(p,-e/2,-e/2,e/2,e/2,_))}return l}; + },{"./collision_box":66,"point-geometry":137}],68:[function(require,module,exports){ + "use strict";function CollisionTile(t,a){this.tree=rbush(),this.angle=t;var e=Math.sin(t),i=Math.cos(t);this.rotationMatrix=[i,-e,e,i],this.yStretch=1/Math.cos(a/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3)}var rbush=require("rbush");module.exports=CollisionTile,CollisionTile.prototype.minScale=.25,CollisionTile.prototype.maxScale=2,CollisionTile.prototype.placeCollisionFeature=function(t){for(var a=this.minScale,e=this.rotationMatrix,i=this.yStretch,o=0;ox.maxScale&&(M=x.maxScale),M>l.maxScale&&(M=l.maxScale),M>a&&M>=x.placementScale&&(a=M),a>=this.maxScale)return a}}return a},CollisionTile.prototype.insertCollisionFeature=function(t,a){for(var e=t.boxes,i=0;ir-c*l&&(r=c*l+r/4);var s=2*o,g=u?r/2*h%r:(c/2+s)*l*h%r;return resample(e,g,r,i,t,c*l,u,!1)}function resample(e,r,t,a,n,o,l,h){for(var i=0,c=r-t,u=[],s=0;sc+t;){c+=t;var v=(c-i)/x,m=interpolate(g.x,p.x,v),A=interpolate(g.y,p.y,v);if(m>=0&&4096>m&&A>=0&&4096>A){m=Math.round(m),A=Math.round(A);var y=new Anchor(m,A,f,s);(!a||checkMaxAngle(e,y,o,a,n))&&u.push(y)}}i+=x}return h||u.length||l||(u=resample(e,i/2,t,a,n,o,l,!0)),u}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors; + },{"../symbol/anchor":62,"../util/interpolate":102,"./check_max_angle":64}],70:[function(require,module,exports){ + "use strict";function GlyphAtlas(t,i){this.width=t,this.height=i,this.bin=new BinPack(t,i),this.index={},this.ids={},this.data=new Uint8Array(t*i)}var BinPack=require("./bin_pack");module.exports=GlyphAtlas,GlyphAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]=[]),s[i].push(e);return s},GlyphAtlas.prototype.getRects=function(){var t,i,e,s={};for(var h in this.ids)t=h.split("#"),i=t[0],e=t[1],s[i]||(s[i]={}),s[i][e]=this.index[h];return s},GlyphAtlas.prototype.removeGlyphs=function(t){for(var i in this.ids){var e=this.ids[i],s=e.indexOf(t);if(s>=0&&e.splice(s,1),this.ids[i]=e,!e.length){for(var h=this.index[i],a=this.data,r=0;ru;u++)for(var x=this.width*(o.y+u+n)+o.x+n,E=a*u,T=0;a>T;T++)c[x+T]=p[E+T];return this.dirty=!0,o},GlyphAtlas.prototype.bind=function(t){this.gl=t,this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,t.ALPHA,this.width,this.height,0,t.ALPHA,t.UNSIGNED_BYTE,null))},GlyphAtlas.prototype.updateTexture=function(t){if(this.bind(t),this.dirty){if(t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.ALPHA,t.UNSIGNED_BYTE,this.data),this.ctx){for(var i=this.ctx.getImageData(0,0,this.width,this.height),e=0,s=0;e65535)return r("gyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var i=this.loading[t];if(i[e])i[e].push(r);else{i[e]=[r];var l=256*e+"-"+(256*e+255),a=glyphUrl(t,l,this.url);getArrayBuffer(a,function(t,r){for(var l=!t&&new Glyphs(new Protobuf(new Uint8Array(r))),a=0;ae&&(o=!o),o&&i++;var h=new Point(a.x,a.y),l=n[i],s=1/0;e=Math.abs(e);for(var m=minScale;;){var u=h.dist(l),c=e/u,g=Math.atan2(l.y-h.y,l.x-h.x);if(o||(g+=Math.PI),r&&(g+=Math.PI),t.push({anchorPoint:h,offset:r?Math.PI:0,minScale:c,maxScale:s,angle:(g+2*Math.PI)%(2*Math.PI)}),m>=c)break;for(h=l;h.equals(l);)if(i+=o?1:-1,l=n[i],!l)return c;var M=l.sub(h)._unit();h=h.sub(M._mult(u)),s=c}return m}var Point=require("point-geometry");module.exports={getIconQuads:getIconQuads,getGlyphQuads:getGlyphQuads};var minScale=.5; + },{"point-geometry":137}],74:[function(require,module,exports){ + "use strict";function resolveIcons(e,r){for(var o=[],s=0,n=e.length;n>s;s++){var t=resolveTokens(e[s].properties,r["icon-image"]);t&&o.indexOf(t)<0&&o.push(t)}return o}var resolveTokens=require("../util/token");module.exports=resolveIcons; + },{"../util/token":105}],75:[function(require,module,exports){ + "use strict";function resolveText(e,r,t){for(var o=[],s=[],n=0,u=e.length;u>n;n++){var a=resolveTokens(e[n].properties,r["text-field"]);if(a){a=a.toString();var l=r["text-transform"];"uppercase"===l?a=a.toLocaleUpperCase():"lowercase"===l&&(a=a.toLocaleLowerCase());for(var i=0,v=a.length;v>i;i++)s.push(a.charCodeAt(i));o[n]=a}else o[n]=null}return s=uniq(s,t),{textFeatures:o,codepoints:s}}function uniq(e,r){var t,o=[];e.sort(sortNumbers);for(var s=0;se&&null!==s){var g=p[s+1].x;c=Math.max(g,c);for(var v=s+1;u>=v;v++)p[v].y+=n,p[v].x-=g;a&&justifyLine(p,i,l,s-1,a),l=s+1,s=null,r+=g,f++}breakable[d.codePoint]&&(s=u)}var x=p[p.length-1],y=x.x+i[x.codePoint].advance;c=Math.max(c,y);var P=(f+1)*n;justifyLine(p,i,l,p.length-1,a),align(p,a,o,h,c,n,f),t.top+=-h*P,t.bottom=t.top+P,t.left+=-o*c,t.right=t.left+c}function justifyLine(t,i,n,e,o){for(var h=i[t[e].codePoint].advance,a=(t[e].x+h)*o,s=n;e>=s;s++)t[s].x-=a}function align(t,i,n,e,o,h,a){for(var s=(i-n)*o,r=(-e*(a+1)+.5)*h,l=0;l=c;c++,x=((c+l)%l+h)*i+e,f+=s)for(d=-1;n>=d;d++)a[f+d]=t[x+(d+n)%n];else for(c=0;l>c;c++,x+=i,f+=s)for(d=0;n>d;d++)a[f+d]=t[x+d]}function AtlasImage(t,i,e,h){this.rect=t,this.width=i,this.height=e,this.sdf=h}var BinPack=require("./bin_pack");module.exports=SpriteAtlas,SpriteAtlas.prototype={get debug(){return"canvas"in this},set debug(t){t&&!this.canvas?(this.canvas=document.createElement("canvas"),this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.canvas.style.width=this.width+"px",this.canvas.style.width=this.width+"px",document.body.appendChild(this.canvas),this.ctx=this.canvas.getContext("2d")):!t&&this.canvas&&(this.canvas.parentNode.removeChild(this.canvas),delete this.ctx,delete this.canvas)}},SpriteAtlas.prototype.resize=function(t){if(this.pixelRatio===t)return!1;var i=this.pixelRatio;if(this.pixelRatio=t,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio),this.data){var e=this.data;this.data=!1,this.allocate(),this.texture=!1;for(var h=this.width*i,a=this.height*i,s=this.width*t,r=this.height*t,o=this.data,n=e,l=0;r>l;l++)for(var p=Math.floor(l*a/r)*h,d=l*s,c=0;s>c;c++){var x=Math.floor(c*h/s);o[d+c]=n[p+x]}e=null,this.dirty=!0}return this.dirty},SpriteAtlas.prototype.allocateImage=function(t,i){var e=2,h=t+e+(4-(t+e)%4),a=i+e+(4-(i+e)%4),s=this.bin.allocate(h,a);return 0===s.w?s:(s.originalWidth=t,s.originalHeight=i,s)},SpriteAtlas.prototype.getImage=function(t,i){if(this.images[t])return this.images[t];if(!this.sprite)return null;var e=this.sprite.getSpritePosition(t);if(!e.width||!e.height)return null;var h=e.width/e.pixelRatio,a=e.height/e.pixelRatio,s=this.allocateImage(h,a);if(0===s.w)return s;var r=new AtlasImage(s,h,a,e.sdf);return this.images[t]=r,this.copy(s,e,i),r},SpriteAtlas.prototype.getPosition=function(t,i){var e=this.getImage(t,i),h=e&&e.rect;if(!h)return null;var a=i?e.width:h.w,s=i?e.height:h.h,r=1;return{size:[a,s],tl:[(h.x+r)/this.width,(h.y+r)/this.height],br:[(h.x+r+a)/this.width,(h.y+r+s)/this.height]}},SpriteAtlas.prototype.allocate=function(){if(!this.data){var t=Math.floor(this.width*this.pixelRatio),i=Math.floor(this.height*this.pixelRatio);this.data=new Uint32Array(t*i);for(var e=0;e=200&&(this.zooming=!1,this.fire("moveend"))},i),i.duration<200&&(clearTimeout(this._onZoomEnd),this._onZoomEnd=setTimeout(function(){this.zooming=!1,this.fire("moveend")}.bind(this),200)),this},zoomIn:function(t){return this.zoomTo(this.getZoom()+1,t),this},zoomOut:function(t){return this.zoomTo(this.getZoom()-1,t),this},getBearing:function(){return this.transform.bearing},setBearing:function(t){return this.jumpTo({bearing:t}),this},rotateTo:function(t,i){this.stop(),i=util.extend({duration:500,easing:util.ease},i);var e=this.transform,n=this.getBearing(),o=e.center;return i.around?o=LngLat.convert(i.around):i.offset&&(o=e.pointLocation(e.centerPoint.add(Point.convert(i.offset)))),t=this._normalizeBearing(t,n),this.rotating=!0,this.fire("movestart"),this._ease(function(i){e.setBearingAround(interpolate(n,t,i),o),this.fire("move").fire("rotate")},function(){this.rotating=!1,this.fire("moveend")},i),this},resetNorth:function(t){return this.rotateTo(0,util.extend({duration:1e3},t)),this},snapToNorth:function(t){return Math.abs(this.getBearing())z?-1:1;B=Math.abs(Math.log(z/b))/l,T=function(){return 0},x=function(t){return Math.exp(j*l*t)}}return t.duration=1e3*B/v,this.zooming=!0,h!==c&&(this.rotating=!0),this.fire("movestart"),this._ease(function(t){var i=t*B,e=T(i);r.zoom=a+r.scaleZoom(1/x(i)),r.center=r.unproject(g.add(d.sub(g).mult(e)),p),c!==h&&(r.bearing=interpolate(h,c,t)),this.fire("move").fire("zoom"),c!==h&&this.fire("rotate")},function(){this.zooming=!1,this.rotating=!1,this.fire("moveend")},t),this},isEasing:function(){return!!this._abortFn},stop:function(){return this._abortFn&&(this._abortFn(),this._finishEase()),this},_ease:function(t,i,e){this._finishFn=i,this._abortFn=browser.timed(function(i){t.call(this,e.easing(i)),1===i&&this._finishEase()},e.animate===!1?0:e.duration,this)},_finishEase:function(){delete this._abortFn;var t=this._finishFn;delete this._finishFn,t.call(this)},_normalizeBearing:function(t,i){t=util.wrap(t,-180,180);var e=Math.abs(t-i);return Math.abs(t-360-i)o?-5:o>window.screen.width-2?5:(o-this._prevX)/4;this._map.setBearing(this._map.getBearing()-s),this._prevX=t.screenX,this._moved=!0,t.preventDefault()},_onCompassUp:function(){document.removeEventListener("mousemove",this._onCompassMove),document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._moved&&(this._moved=!1,DOM.suppressClick()),this._map.snapToNorth()},_createButton:function(t,o){var s=DOM.create("button",t,this._container);return s.addEventListener("click",function(){o()}),s},_drawNorth:function(){var t=20,o=8,s=26,e=this._map.transform.angle+Math.PI/2,i=this._compassCtx;this._compassCanvas.width=this._compassCanvas.width,i.translate(s,s),i.rotate(e),i.beginPath(),i.fillStyle="#000",i.lineTo(0,-o),i.lineTo(-t,0),i.lineTo(0,o),i.fill(),i.beginPath(),i.fillStyle="#bbb",i.moveTo(0,0),i.lineTo(0,o),i.lineTo(t,0),i.lineTo(0,-o),i.fill(),i.beginPath(),i.strokeStyle="#fff",i.lineWidth=4,i.moveTo(0,-o),i.lineTo(0,o),i.stroke()}}); + },{"../../util/dom":98,"../../util/util":106,"./control":80}],82:[function(require,module,exports){ + "use strict";function BoxZoom(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util");module.exports=BoxZoom,BoxZoom.prototype={enable:function(){this._el.addEventListener("mousedown",this._onMouseDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onMouseDown)},_onMouseDown:function(o){(o.shiftKey||1===o.which&&1===o.button)&&(document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("keydown",this._onKeyDown,!1),document.addEventListener("mouseup",this._onMouseUp,!1),this._startPos=DOM.mousePos(this._el,o),this.active=!0)},_onMouseMove:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),DOM.disableDrag(),this._map.fire("boxzoomstart"));var s=Math.min(e.x,t.x),n=Math.max(e.x,t.x),i=Math.min(e.y,t.y),a=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+s+"px,"+i+"px)"),this._box.style.width=n-s+"px",this._box.style.height=a-i+"px"},_onMouseUp:function(o){var e=this._startPos,t=DOM.mousePos(this._el,o),s=new LngLatBounds(this._map.unproject(e),this._map.unproject(t));this._finish(),this._map.fitBounds(s,{linear:!0}).fire("boxzoomend",{boxZoomBounds:s})},_onKeyDown:function(o){27===o.keyCode&&(this._finish(),this._map.fire("boxzoomcancel"))},_finish:function(){this._box&&(this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("keydown",this._onKeyDown,!1),document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box.parentNode.removeChild(this._box),this._box=null,DOM.enableDrag())}}; + },{"../../geo/lng_lat_bounds":21,"../../util/dom":98,"../../util/util":106}],83:[function(require,module,exports){ + "use strict";function DoubleClickZoom(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)}module.exports=DoubleClickZoom,DoubleClickZoom.prototype={enable:function(){this._map.on("dblclick",this._onDblClick)},disable:function(){this._map.off("dblclick",this._onDblClick)},_onDblClick:function(o){this._map.zoomTo(Math.round(this._map.getZoom())+1,{around:o.lngLat})}}; + },{}],84:[function(require,module,exports){ + "use strict";function DragPan(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=DragPan;var inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=3e3,inertiaDeceleration=4e3;DragPan.prototype={enable:function(){this._el.addEventListener("mousedown",this._onDown,!1),this._el.addEventListener("touchstart",this._onDown,!1)},disable:function(){this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown)},_onDown:function(e){this._startPos=this._pos=DOM.mousePos(this._el,e),this._inertia=[[Date.now(),this._pos]],e.touches?1===e.touches.length&&(document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onTouchEnd,!1)):(document.addEventListener("mousemove",this._onMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1))},_onMove:function(e){var t=this._map;if(!(t.boxZoom.active||t.dragRotate.active||e.touches&&e.touches.length>1)){this.active=!0;var n=DOM.mousePos(this._el,e),i=this._inertia,o=Date.now();for(i.push([o,n]);i.length>2&&o-i[0][0]>50;)i.shift();t.stop(),t.transform.setLocationAtPoint(t.transform.pointLocation(this._pos),n),t.fire("move"),this._pos=n,e.preventDefault()}},_onUp:function(){var e=this._inertia;if(e.length<2)return void this._map.fire("moveend");var t=e[e.length-1],n=e[0],i=t[1].sub(n[1]),o=(t[0]-n[0])/1e3,s=i.mult(inertiaLinearity/o),a=s.mag();a>inertiaMaxSpeed&&(a=inertiaMaxSpeed,s._unit()._mult(a));var r=a/(inertiaDeceleration*inertiaLinearity),u=s.mult(-r/2);this._map.panBy(u,{duration:1e3*r,easing:inertiaEasing,noMoveStart:!0}),this.active=!1},_onMouseUp:function(){this._onUp(),document.removeEventListener("mousemove",this._onMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)},_onTouchEnd:function(){this._onUp(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onTouchEnd)}}; + },{"../../util/dom":98,"../../util/util":106}],85:[function(require,module,exports){ + "use strict";function DragRotate(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),Point=require("point-geometry"),util=require("../../util/util");module.exports=DragRotate,DragRotate.prototype={enable:function(){this._el.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){this._el.removeEventListener("contextmenu",this._onContextMenu)},_onContextMenu:function(t){this._map.stop(),this._startPos=this._pos=DOM.mousePos(this._el,t),document.addEventListener("mousemove",this._onMouseMove,!1),document.addEventListener("mouseup",this._onMouseUp,!1),t.preventDefault()},_onMouseMove:function(t){var e=this._startPos,o=this._pos,n=DOM.mousePos(this._el,t),i=this._map,s=i.transform.centerPoint,r=e.sub(s),u=r.mag();this.active=!0,i.rotating||(i.fire("movestart"),i.rotating=!0),200>u&&(s=e.add(new Point(-200,0)._rotate(r.angle())));var a=o.sub(s).angleWith(n.sub(s))/Math.PI*180;i.transform.bearing=i.getBearing()-a,i.fire("move").fire("rotate"),clearTimeout(this._timeout),this._timeout=setTimeout(this._onTimeout,200),this._pos=n},_onTimeout:function(){var t=this._map;t.rotating=!1,t.snapToNorth(),t.rotating||(t._rerender(),t.fire("moveend"))},_onMouseUp:function(){this.active=!1,document.removeEventListener("mousemove",this._onMouseMove,!1),document.removeEventListener("mouseup",this._onMouseUp,!1)}}; + },{"../../util/dom":98,"../../util/util":106,"point-geometry":137}],86:[function(require,module,exports){ + "use strict";function Keyboard(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)}module.exports=Keyboard;var panDelta=80,rotateDelta=2;Keyboard.prototype={enable:function(){this._el.addEventListener("keydown",this._onKeyDown,!1)},disable:function(){this._el.removeEventListener("keydown",this._onKeyDown)},_onKeyDown:function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var a=this._map;switch(e.keyCode){case 61:case 107:case 171:case 187:a.zoomTo(Math.round(a.getZoom())+(e.shiftKey?2:1));break;case 189:case 109:case 173:a.zoomTo(Math.round(a.getZoom())-(e.shiftKey?2:1));break;case 37:e.shiftKey?a.setBearing(a.getBearing()-rotateDelta):a.panBy([-panDelta,0]);break;case 39:e.shiftKey?a.setBearing(a.getBearing()+rotateDelta):a.panBy([panDelta,0]);break;case 38:a.panBy([0,-panDelta]);break;case 40:a.panBy([0,panDelta])}}}}; + },{}],87:[function(require,module,exports){ + "use strict";function Pinch(t){this._map=t,this._el=t.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),util=require("../../util/util");module.exports=Pinch,Pinch.prototype={enable:function(){this._el.addEventListener("touchstart",this._onStart,!1)},disable:function(){this._el.removeEventListener("touchstart",this._onStart)},_onStart:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(s),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,document.addEventListener("touchmove",this._onMove,!1),document.addEventListener("touchend",this._onEnd,!1)}},_onMove:function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),s=DOM.mousePos(this._el,t.touches[1]),n=e.add(s).div(2),o=e.sub(s),i=o.mag()/this._startVec.mag(),a=180*o.angleWith(this._startVec)/Math.PI,r=this._map;r.easeTo({zoom:r.transform.scaleZoom(this._startScale*i),bearing:this._startBearing+a,duration:0,around:r.unproject(n)}),t.preventDefault()}},_onEnd:function(){this._map.snapToNorth(),document.removeEventListener("touchmove",this._onMove),document.removeEventListener("touchend",this._onEnd)}}; + },{"../../util/dom":98,"../../util/util":106}],88:[function(require,module,exports){ + "use strict";function ScrollZoom(e){this._map=e,this._el=e.getCanvasContainer(),util.bindHandlers(this)}var DOM=require("../../util/dom"),browser=require("../../util/browser"),util=require("../../util/util");module.exports=ScrollZoom;var ua="undefined"!=typeof navigator?navigator.userAgent.toLowerCase():"",firefox=-1!==ua.indexOf("firefox"),safari=-1!==ua.indexOf("safari")&&-1===ua.indexOf("chrom");ScrollZoom.prototype={enable:function(){this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1)},disable:function(){this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel)},_onWheel:function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var i=(window.performance||Date).now(),o=i-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=i,0!==t&&t%4.000244140625===0?(this._type="wheel",t=Math.floor(t/4)):0!==t&&Math.abs(t)<4?this._type="trackpad":o>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(o*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t),e.preventDefault()},_onTimeout:function(){this._type="wheel",this._zoom(-this._lastValue)},_zoom:function(e){var t=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));0>e&&0!==i&&(i=1/i);var o=t.ease?t.ease.to:t.transform.scale,s=t.transform.scaleZoom(o*i);t.zoomTo(s,{duration:0,around:t.unproject(this._pos)})}}; + },{"../../util/browser":95,"../../util/dom":98,"../../util/util":106}],89:[function(require,module,exports){ + "use strict";function Hash(){util.bindAll(["_onHashChange","_updateHash"],this)}module.exports=Hash;var util=require("../util/util");Hash.prototype={addTo:function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},remove:function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},_onHashChange:function(){var t=location.hash.replace("#","").split("/");return t.length>=3?(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0)}),!0):!1},_updateHash:function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(h)+"/"+t.lng.toFixed(h)+(a?"/"+Math.round(10*a)/10:"");window.history.replaceState("","",n)}}; + },{"../util/util":106}],90:[function(require,module,exports){ + "use strict";function Interaction(e){this._map=e,this._el=e.getCanvasContainer();for(var t in handlers)e[t]=new handlers[t](e);util.bindHandlers(this)}var handlers={scrollZoom:require("./handler/scroll_zoom"),boxZoom:require("./handler/box_zoom"),dragRotate:require("./handler/drag_rotate"),dragPan:require("./handler/drag_pan"),keyboard:require("./handler/keyboard"),doubleClickZoom:require("./handler/dblclick_zoom"),pinch:require("./handler/pinch")},DOM=require("../util/dom"),util=require("../util/util");module.exports=Interaction,Interaction.prototype={enable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].enable();t.addEventListener("mousedown",this._onMouseDown,!1),t.addEventListener("mouseup",this._onMouseUp,!1),t.addEventListener("touchstart",this._onTouchStart,!1),t.addEventListener("click",this._onClick,!1),t.addEventListener("mousemove",this._onMouseMove,!1),t.addEventListener("dblclick",this._onDblClick,!1),t.addEventListener("contextmenu",this._onContextMenu,!1)},disable:function(){var e=this._map.options,t=this._el;for(var n in handlers)e[n]&&this._map[n].disable();t.removeEventListener("mousedown",this._onMouseDown),t.removeEventListener("mouseup",this._onMouseUp),t.removeEventListener("touchstart",this._onTouchStart),t.removeEventListener("click",this._onClick),t.removeEventListener("mousemove",this._onMouseMove),t.removeEventListener("dblclick",this._onDblClick),t.removeEventListener("contextmenu",this._onContextMenu)},_onMouseDown:function(e){this._startPos=DOM.mousePos(this._el,e)},_onMouseUp:function(e){!this._contextMenuFired||this._map.dragRotate.active||this._map.dragPan.active||this._fireEvent("contextmenu",e),this._contextMenuFired=null},_onTouchStart:function(e){!e.touches||e.touches.length>1||(this._tapped?(clearTimeout(this._tapped),this._tapped=null,this._fireEvent("dblclick",e)):this._tapped=setTimeout(this._onTimeout,300))},_onTimeout:function(){this._tapped=null},_onMouseMove:function(e){var t=this._map,n=this._el;if(!t.dragPan.active&&!t.dragRotate.active){for(var o=e.toElement||e.target;o&&o!==n;)o=o.parentNode;o===n&&this._fireEvent("mousemove",e)}},_onClick:function(e){var t=DOM.mousePos(this._el,e);t.equals(this._startPos)&&this._fireEvent("click",e)},_onDblClick:function(e){this._fireEvent("dblclick",e),e.preventDefault()},_onContextMenu:function(){this._contextMenuFired=!0},_fireEvent:function(e,t){var n=DOM.mousePos(this._el,t);this._map.fire(e,{lngLat:this._map.unproject(n),point:n,originalEvent:t})}}; + },{"../util/dom":98,"../util/util":106,"./handler/box_zoom":82,"./handler/dblclick_zoom":83,"./handler/drag_pan":84,"./handler/drag_rotate":85,"./handler/keyboard":86,"./handler/pinch":87,"./handler/scroll_zoom":88}],91:[function(require,module,exports){ + "use strict";var Canvas=require("../util/canvas"),util=require("../util/util"),browser=require("../util/browser"),Evented=require("../util/evented"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),Interaction=require("./interaction"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Attribution=require("./control/attribution"),Map=module.exports=function(t){if(t=this.options=util.inherit(this.options,t),this.animationLoop=new AnimationLoop,this.transform=new Transform(t.minZoom,t.maxZoom),t.maxBounds){var e=LngLatBounds.convert(t.maxBounds);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()]}util.bindAll(["_forwardStyleEvent","_forwardSourceEvent","_forwardLayerEvent","_forwardTileEvent","_onStyleLoad","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","_onWindowResize","onError","update","render"],this),this._setupContainer(),this._setupPainter(),this.on("move",this.update),this.on("zoom",this.update.bind(this,!0)),this.on("moveend",function(){this.animationLoop.set(300),this._rerender()}.bind(this)),"undefined"!=typeof window&&window.addEventListener("resize",this._onWindowResize,!1),this.interaction=new Interaction(this),t.interactive&&this.interaction.enable(),this._hash=t.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo(t),this.sources={},this.stacks={},this._classes={},this.resize(),t.classes&&this.setClasses(t.classes),t.style&&this.setStyle(t.style),t.attributionControl&&this.addControl(new Attribution),this.on("style.error",this.onError),this.on("source.error",this.onError),this.on("tile.error",this.onError)};util.extend(Map.prototype,Evented),util.extend(Map.prototype,Camera.prototype),util.extend(Map.prototype,{options:{center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:0,maxZoom:20,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,pinch:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1},addControl:function(t){return t.addTo(this),this},addClass:function(t,e){this._classes[t]||(this._classes[t]=!0,this.style&&this.style._cascade(this._classes,e))},removeClass:function(t,e){this._classes[t]&&(delete this._classes[t],this.style&&this.style._cascade(this._classes,e))},setClasses:function(t,e){this._classes={};for(var i=0;ithis._map.transform.height-o?["bottom"]:[],t.xthis._map.transform.width-e/2&&i.push("right"),i=0===i.length?"bottom":i.join("-"),this.options.anchor=i}var n={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},s=this._container.classList;for(var a in n)s.remove("mapboxgl-popup-anchor-"+a);s.add("mapboxgl-popup-anchor-"+i),DOM.setTransform(this._container,n[i]+" translate("+t.x+"px,"+t.y+"px)")}},_onClickClose:function(){this.remove()}}); + },{"../geo/lng_lat":20,"../util/dom":98,"../util/evented":100,"../util/util":106}],93:[function(require,module,exports){ + "use strict";function Actor(t,e){this.target=t,this.parent=e,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)}module.exports=Actor,Actor.prototype.receive=function(t){var e,s=t.data;if(""===s.type)e=this.callbacks[s.id],delete this.callbacks[s.id],e(s.error||null,s.data);else if("undefined"!=typeof s.id){var i=s.id;this.parent[s.type](s.data,function(t,e,s){this.postMessage({type:"",id:String(i),error:t?String(t):null,data:e},s)}.bind(this))}else this.parent[s.type](s.data)},Actor.prototype.send=function(t,e,s,i){var a=null;s&&(this.callbacks[a=this.callbackID++]=s),this.postMessage({type:t,id:String(a),data:e},i)},Actor.prototype.postMessage=function(t,e){try{this.target.postMessage(t,e)}catch(s){this.target.postMessage(t)}}; + },{}],94:[function(require,module,exports){ + "use strict";function sameOrigin(e){var t=document.createElement("a");return t.href=e,t.protocol===document.location.protocol&&t.host===document.location.host}exports.getJSON=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","application/json"),n.onerror=function(e){t(e)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var e;try{e=JSON.parse(n.response)}catch(r){return t(r)}t(null,e)}else t(new Error(n.statusText))},n.send(),n},exports.getArrayBuffer=function(e,t){var n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",n.onerror=function(e){t(e)},n.onload=function(){n.status>=200&&n.status<300&&n.response?t(null,n.response):t(new Error(n.statusText))},n.send(),n},exports.getImage=function(e,t){return exports.getArrayBuffer(e,function(e,n){e&&t(e);var r=new Image;r.onload=function(){t(null,r),(window.URL||window.webkitURL).revokeObjectURL(r.src)};var o=new Blob([new Uint8Array(n)],{type:"image/png"});return r.src=(window.URL||window.webkitURL).createObjectURL(o),r.getData=function(){var e=document.createElement("canvas"),t=e.getContext("2d");return e.width=r.width,e.height=r.height,t.drawImage(r,0,0),t.getImageData(0,0,r.width,r.height).data},r})},exports.getVideo=function(e,t){var n=document.createElement("video");n.onloadstart=function(){t(null,n)};for(var r=0;r=i+r?e.call(t,1):(e.call(t,(a-i)/r),exports.frame(n)))}if(!r)return e.call(t,1),null;var o=!1,i=window.performance?window.performance.now():Date.now();return exports.frame(n),function(){o=!0}},exports.supported=function(e){for(var r=([function(){return"undefined"!=typeof window},function(){return"undefined"!=typeof document},function(){return!!(Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray)},function(){return!(!Function.prototype||!Function.prototype.bind||!(Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions))},function(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON},function(){return(new Canvas).supportsWebGLContext(e&&e.failIfMajorPerformanceCaveat||!1)},function(){return"Worker"in window}]),t=0;te;e++){var o=new WebWorkify(require("../../source/worker")),s=new Actor(o,t);s.name="Worker "+e,this.actors.push(s)}}var Actor=require("../actor"),WebWorkify=require("webworkify");module.exports=Dispatcher,Dispatcher.prototype={broadcast:function(r,t){for(var e=0;e=0&&this._events[t].splice(s,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var s=function(i){this.off(t,s),e.call(this,i)}.bind(this);return this.on(t,s),this},fire:function(t,e){if(!this.listens(t))return this;e=util.extend({},e),util.extend(e,{type:t,target:this});for(var s=this._events[t].slice(),i=0;i=2?"@2x.$1":".$1"):e}; + },{"./browser":95,"./config":99}],104:[function(require,module,exports){ + "use strict";function MRUCache(t,e){this.max=t,this.onRemove=e,this.reset()}module.exports=MRUCache,MRUCache.prototype.reset=function(){for(var t in this.list)this.onRemove(this.list[t]);return this.list={},this.order=[],this},MRUCache.prototype.add=function(t,e){if(this.list[t]=e,this.order.push(t),this.order.length>this.max){var i=this.get(this.order[0]);i&&this.onRemove(i)}return this},MRUCache.prototype.has=function(t){return t in this.list},MRUCache.prototype.keys=function(){return this.order},MRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.list[t];return delete this.list[t],this.order.splice(this.order.indexOf(t),1),e}; + },{}],105:[function(require,module,exports){ + "use strict";function resolveTokens(e,n){return n.replace(/{([^{}()\[\]<>$=:;.,^]+)}/g,function(n,r){return r in e?e[r]:""})}module.exports=resolveTokens; + },{}],106:[function(require,module,exports){ + "use strict";var UnitBezier=require("unitbezier"),Coordinate=require("../geo/coordinate");exports.easeCubicInOut=function(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,r=t*n;return 4*(.5>n?r:3*(n-t)+r-.75)},exports.bezier=function(n,t,r,e){var o=new UnitBezier(n,t,r,e);return function(n){return o.solve(n)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.premultiply=function(n){return n[0]*=n[3],n[1]*=n[3],n[2]*=n[3],n},exports.clamp=function(n,t,r){return Math.min(r,Math.max(t,n))},exports.wrap=function(n,t,r){var e=r-t,o=((n-t)%e+e)%e+t;return o===t?r:o},exports.coalesce=function(){for(var n=0;ne?0:e>255?255:e}function clamp_css_float(e){return 0>e?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return 0>l?l+=1:l>1&&(l-=1),1>6*l?e+(r-e)*l*6:1>2*l?r:2>3*l?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&4095>=l?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&16777215>=l?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(-1!==a&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=.5>=g?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){} + },{}],108:[function(require,module,exports){ + "use strict";function infix(t){return function(n,r,i){return"$type"===r?"t"+t+VectorTileFeatureTypes.indexOf(i):"p["+JSON.stringify(r)+"]"+t+JSON.stringify(i)}}function strictInfix(t){var n=infix(t);return function(t,r,i){return"$type"===r?n(t,r,i):"typeof(p["+JSON.stringify(r)+"]) === typeof("+JSON.stringify(i)+") && "+n(t,r,i)}}function compile(t){return operators[t[0]].apply(t,t)}function truth(){return!0}var VectorTileFeatureTypes=["Unknown","Point","LineString","Polygon"],operators={"==":infix("==="),"!=":infix("!=="),">":strictInfix(">"),"<":strictInfix("<"),"<=":strictInfix("<="),">=":strictInfix(">="),"in":function(t,n){return"(function(){"+Array.prototype.slice.call(arguments,2).map(function(r){return"if ("+operators["=="](t,n,r)+") return true;"}).join("")+"return false;})()"},"!in":function(){return"!("+operators["in"].apply(this,arguments)+")"},any:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("||")||"false"},all:function(){return Array.prototype.slice.call(arguments,1).map(function(t){return"("+compile(t)+")"}).join("&&")||"true"},none:function(){return"!("+operators.any.apply(this,arguments)+")"}};module.exports=function(t){if(!t)return truth;var n="var p = f.properties || f.tags || {}, t = f.type; return "+compile(t)+";";return new Function("f",n)}; + },{}],109:[function(require,module,exports){ + "use strict";function clip(e,n,t,r,l,u,i,s){if(t/=n,r/=n,i>=t&&r>=s)return e;if(i>r||t>s)return null;for(var p=[],h=0;h=t&&r>=a)p.push(o);else if(!(c>r||t>a)){var m=1===g?clipPoints(f,t,r,l):clipGeometry(f,t,r,l,u,3===g);m.length&&p.push({geometry:m,type:g,tags:e[h].tags||null,min:o.min,max:o.max})}}return p.length?p:null}function clipPoints(e,n,t,r){for(var l=[],u=0;u=n&&t>=s&&l.push(i)}return l}function clipGeometry(e,n,t,r,l,u){for(var i=[],s=0;sh;h++)p=f||g[h],f=g[h+1],a=o||p[r],o=f[r],n>a?o>t?(y.push(l(p,f,n),l(p,f,t)),u||(y=newSlice(i,y,m,v))):o>=n&&y.push(l(p,f,n)):a>t?n>o?(y.push(l(p,f,t),l(p,f,n)),u||(y=newSlice(i,y,m,v))):t>=o&&y.push(l(p,f,t)):(y.push(p),n>o?(y.push(l(p,f,n)),u||(y=newSlice(i,y,m,v))):o>t&&(y.push(l(p,f,t)),u||(y=newSlice(i,y,m,v))));p=g[w-1],a=p[r],a>=n&&t>=a&&y.push(p),c=y[y.length-1],u&&c&&(y[0][0]!==c[0]||y[0][1]!==c[1])&&y.push(y[0]),newSlice(i,y,m,v)}return i}function newSlice(e,n,t,r){return n.length&&(n.area=t,n.dist=r,e.push(n)),[]}module.exports=clip; + },{}],110:[function(require,module,exports){ + "use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;oo?-1:o>1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,n=0,a=0;a1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;r>s;s++){var l=transform.point(n.geometry[0][s],t,e.z2,e.x,e.y);if(l[0]!==-i&&l[0]!==t+i||l[1]!==-i&&l[1]!==t+i)return!1}return!0}module.exports=geojsonvt;var convert=require("./convert"),transform=require("./transform"),clip=require("./clip"),wrap=require("./wrap"),createTile=require("./tile");GeoJSONVT.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},GeoJSONVT.prototype.splitTile=function(e,t,i,o,n,r,s){for(var l=[e,t,i,o],a=this.options,u=a.debug,c=null;l.length;){o=l.pop(),i=l.pop(),t=l.pop(),e=l.pop();var p=1<1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),g&&l.push(g,t+1,2*i,2*o),v&&l.push(v,t+1,2*i,2*o+1),M&&l.push(M,t+1,2*i+1,2*o),T&&l.push(T,t+1,2*i+1,2*o+1)}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<e;e++)r=getSqSegDist(t[e],t[u],t[n]),r>p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify; + },{}],113:[function(require,module,exports){ + "use strict";function createTile(e,n,t,m,i,u){for(var r={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:t,y:m,z2:n,transformed:!1,min:[2,1],max:[-1,0]},a=0;ar.max[0]&&(r.max[0]=l[0]),l[1]>r.max[1]&&(r.max[1]=l[1])}return r}function addFeature(e,n,t,m){var i,u,r,a,s=n.geometry,l=n.type,o=[],f=t*t;if(1===l)for(i=0;if)&&(d.push(a),e.numSimplified++),e.numPoints++;o.push(d)}else e.numPoints+=r.length;o.length&&e.features.push({geometry:o,type:l,tags:n.tags||null})}module.exports=createTile; + },{}],114:[function(require,module,exports){ + "use strict";function transformTile(r,t){if(r.transformed)return r;var n,e,o,f=r.z2,a=r.x,s=r.y;for(n=0;nc?(vec3.cross(t,a,u),vec3.length(t)<1e-6&&vec3.cross(t,e,u),vec3.normalize(t,t),quat.setAxisAngle(r,t,Math.PI),r):c>.999999?(r[0]=0,r[1]=0,r[2]=0,r[3]=1,r):(vec3.cross(t,u,n),r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=1+c,quat.normalize(r,r))}}(),quat.setAxes=function(){var t=mat3.create();return function(a,e,r,u){return t[0]=r[0],t[3]=r[1],t[6]=r[2],t[1]=u[0],t[4]=u[1],t[7]=u[2],t[2]=-e[0],t[5]=-e[1],t[8]=-e[2],quat.normalize(a,quat.fromMat3(a,t))}}(),quat.clone=vec4.clone,quat.fromValues=vec4.fromValues,quat.copy=vec4.copy,quat.set=vec4.set,quat.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.setAxisAngle=function(t,a,e){e=.5*e;var r=Math.sin(e);return t[0]=r*a[0],t[1]=r*a[1],t[2]=r*a[2],t[3]=Math.cos(e),t},quat.add=vec4.add,quat.multiply=function(t,a,e){var r=a[0],u=a[1],n=a[2],c=a[3],q=e[0],o=e[1],s=e[2],i=e[3];return t[0]=r*i+c*q+u*s-n*o,t[1]=u*i+c*o+n*q-r*s,t[2]=n*i+c*s+r*o-u*q,t[3]=c*i-r*q-u*o-n*s,t},quat.mul=quat.multiply,quat.scale=vec4.scale,quat.rotateX=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+c*q,t[1]=u*o+n*q,t[2]=n*o-u*q,t[3]=c*o-r*q,t},quat.rotateY=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o-n*q,t[1]=u*o+c*q,t[2]=n*o+r*q,t[3]=c*o-u*q,t},quat.rotateZ=function(t,a,e){e*=.5;var r=a[0],u=a[1],n=a[2],c=a[3],q=Math.sin(e),o=Math.cos(e);return t[0]=r*o+u*q,t[1]=u*o-r*q,t[2]=n*o+c*q,t[3]=c*o-n*q,t},quat.calculateW=function(t,a){var e=a[0],r=a[1],u=a[2];return t[0]=e,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-e*e-r*r-u*u)),t},quat.dot=vec4.dot,quat.lerp=vec4.lerp,quat.slerp=function(t,a,e,r){var u,n,c,q,o,s=a[0],i=a[1],v=a[2],l=a[3],f=e[0],h=e[1],M=e[2],m=e[3];return n=s*f+i*h+v*M+l*m,0>n&&(n=-n,f=-f,h=-h,M=-M,m=-m),1-n>1e-6?(u=Math.acos(n),c=Math.sin(u),q=Math.sin((1-r)*u)/c,o=Math.sin(r*u)/c):(q=1-r,o=r),t[0]=q*s+o*f,t[1]=q*i+o*h,t[2]=q*v+o*M,t[3]=q*l+o*m,t},quat.sqlerp=function(){var t=quat.create(),a=quat.create();return function(e,r,u,n,c,q){return quat.slerp(t,r,c,q),quat.slerp(a,u,n,q),quat.slerp(e,t,a,2*q*(1-q)),e}}(),quat.invert=function(t,a){var e=a[0],r=a[1],u=a[2],n=a[3],c=e*e+r*r+u*u+n*n,q=c?1/c:0;return t[0]=-e*q,t[1]=-r*q,t[2]=-u*q,t[3]=n*q,t},quat.conjugate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3]=a[3],t},quat.length=vec4.length,quat.len=quat.length,quat.squaredLength=vec4.squaredLength,quat.sqrLen=quat.squaredLength,quat.normalize=vec4.normalize,quat.fromMat3=function(t,a){var e,r=a[0]+a[4]+a[8];if(r>0)e=Math.sqrt(r+1),t[3]=.5*e,e=.5/e,t[0]=(a[5]-a[7])*e,t[1]=(a[6]-a[2])*e,t[2]=(a[1]-a[3])*e;else{var u=0;a[4]>a[0]&&(u=1),a[8]>a[3*u+u]&&(u=2);var n=(u+1)%3,c=(u+2)%3;e=Math.sqrt(a[3*u+u]-a[3*n+n]-a[3*c+c]+1),t[u]=.5*e,e=.5/e,t[3]=(a[3*n+c]-a[3*c+n])*e,t[n]=(a[3*n+u]+a[3*u+n])*e,t[c]=(a[3*c+u]+a[3*u+c])*e}return t},quat.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},module.exports=quat; + },{"./common.js":117,"./mat3.js":120,"./vec3.js":124,"./vec4.js":125}],123:[function(require,module,exports){ + var glMatrix=require("./common.js"),vec2={};vec2.create=function(){var n=new glMatrix.ARRAY_TYPE(2);return n[0]=0,n[1]=0,n},vec2.clone=function(n){var e=new glMatrix.ARRAY_TYPE(2);return e[0]=n[0],e[1]=n[1],e},vec2.fromValues=function(n,e){var r=new glMatrix.ARRAY_TYPE(2);return r[0]=n,r[1]=e,r},vec2.copy=function(n,e){return n[0]=e[0],n[1]=e[1],n},vec2.set=function(n,e,r){return n[0]=e,n[1]=r,n},vec2.add=function(n,e,r){return n[0]=e[0]+r[0],n[1]=e[1]+r[1],n},vec2.subtract=function(n,e,r){return n[0]=e[0]-r[0],n[1]=e[1]-r[1],n},vec2.sub=vec2.subtract,vec2.multiply=function(n,e,r){return n[0]=e[0]*r[0],n[1]=e[1]*r[1],n},vec2.mul=vec2.multiply,vec2.divide=function(n,e,r){return n[0]=e[0]/r[0],n[1]=e[1]/r[1],n},vec2.div=vec2.divide,vec2.min=function(n,e,r){return n[0]=Math.min(e[0],r[0]),n[1]=Math.min(e[1],r[1]),n},vec2.max=function(n,e,r){return n[0]=Math.max(e[0],r[0]),n[1]=Math.max(e[1],r[1]),n},vec2.scale=function(n,e,r){return n[0]=e[0]*r,n[1]=e[1]*r,n},vec2.scaleAndAdd=function(n,e,r,t){return n[0]=e[0]+r[0]*t,n[1]=e[1]+r[1]*t,n},vec2.distance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return Math.sqrt(r*r+t*t)},vec2.dist=vec2.distance,vec2.squaredDistance=function(n,e){var r=e[0]-n[0],t=e[1]-n[1];return r*r+t*t},vec2.sqrDist=vec2.squaredDistance,vec2.length=function(n){var e=n[0],r=n[1];return Math.sqrt(e*e+r*r)},vec2.len=vec2.length,vec2.squaredLength=function(n){var e=n[0],r=n[1];return e*e+r*r},vec2.sqrLen=vec2.squaredLength,vec2.negate=function(n,e){return n[0]=-e[0],n[1]=-e[1],n},vec2.inverse=function(n,e){return n[0]=1/e[0],n[1]=1/e[1],n},vec2.normalize=function(n,e){var r=e[0],t=e[1],c=r*r+t*t;return c>0&&(c=1/Math.sqrt(c),n[0]=e[0]*c,n[1]=e[1]*c),n},vec2.dot=function(n,e){return n[0]*e[0]+n[1]*e[1]},vec2.cross=function(n,e,r){var t=e[0]*r[1]-e[1]*r[0];return n[0]=n[1]=0,n[2]=t,n},vec2.lerp=function(n,e,r,t){var c=e[0],u=e[1];return n[0]=c+t*(r[0]-c),n[1]=u+t*(r[1]-u),n},vec2.random=function(n,e){e=e||1;var r=2*glMatrix.RANDOM()*Math.PI;return n[0]=Math.cos(r)*e,n[1]=Math.sin(r)*e,n},vec2.transformMat2=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c,n[1]=r[1]*t+r[3]*c,n},vec2.transformMat2d=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[2]*c+r[4],n[1]=r[1]*t+r[3]*c+r[5],n},vec2.transformMat3=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[3]*c+r[6],n[1]=r[1]*t+r[4]*c+r[7],n},vec2.transformMat4=function(n,e,r){var t=e[0],c=e[1];return n[0]=r[0]*t+r[4]*c+r[12],n[1]=r[1]*t+r[5]*c+r[13],n},vec2.forEach=function(){var n=vec2.create();return function(e,r,t,c,u,v){var a,i;for(r||(r=2),t||(t=0),i=c?Math.min(c*r+t,e.length):e.length,a=t;i>a;a+=r)n[0]=e[a],n[1]=e[a+1],u(n,n,v),e[a]=n[0],e[a+1]=n[1];return e}}(),vec2.str=function(n){return"vec2("+n[0]+", "+n[1]+")"},module.exports=vec2; + },{"./common.js":117}],124:[function(require,module,exports){ + var glMatrix=require("./common.js"),vec3={};vec3.create=function(){var n=new glMatrix.ARRAY_TYPE(3);return n[0]=0,n[1]=0,n[2]=0,n},vec3.clone=function(n){var t=new glMatrix.ARRAY_TYPE(3);return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},vec3.fromValues=function(n,t,e){var r=new glMatrix.ARRAY_TYPE(3);return r[0]=n,r[1]=t,r[2]=e,r},vec3.copy=function(n,t){return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},vec3.set=function(n,t,e,r){return n[0]=t,n[1]=e,n[2]=r,n},vec3.add=function(n,t,e){return n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n},vec3.subtract=function(n,t,e){return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n},vec3.sub=vec3.subtract,vec3.multiply=function(n,t,e){return n[0]=t[0]*e[0],n[1]=t[1]*e[1],n[2]=t[2]*e[2],n},vec3.mul=vec3.multiply,vec3.divide=function(n,t,e){return n[0]=t[0]/e[0],n[1]=t[1]/e[1],n[2]=t[2]/e[2],n},vec3.div=vec3.divide,vec3.min=function(n,t,e){return n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n[2]=Math.min(t[2],e[2]),n},vec3.max=function(n,t,e){return n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n[2]=Math.max(t[2],e[2]),n},vec3.scale=function(n,t,e){return n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n},vec3.scaleAndAdd=function(n,t,e,r){return n[0]=t[0]+e[0]*r,n[1]=t[1]+e[1]*r,n[2]=t[2]+e[2]*r,n},vec3.distance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return Math.sqrt(e*e+r*r+c*c)},vec3.dist=vec3.distance,vec3.squaredDistance=function(n,t){var e=t[0]-n[0],r=t[1]-n[1],c=t[2]-n[2];return e*e+r*r+c*c},vec3.sqrDist=vec3.squaredDistance,vec3.length=function(n){var t=n[0],e=n[1],r=n[2];return Math.sqrt(t*t+e*e+r*r)},vec3.len=vec3.length,vec3.squaredLength=function(n){var t=n[0],e=n[1],r=n[2];return t*t+e*e+r*r},vec3.sqrLen=vec3.squaredLength,vec3.negate=function(n,t){return n[0]=-t[0],n[1]=-t[1],n[2]=-t[2],n},vec3.inverse=function(n,t){return n[0]=1/t[0],n[1]=1/t[1],n[2]=1/t[2],n},vec3.normalize=function(n,t){var e=t[0],r=t[1],c=t[2],a=e*e+r*r+c*c;return a>0&&(a=1/Math.sqrt(a),n[0]=t[0]*a,n[1]=t[1]*a,n[2]=t[2]*a),n},vec3.dot=function(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]},vec3.cross=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2];return n[0]=c*i-a*v,n[1]=a*u-r*i,n[2]=r*v-c*u,n},vec3.lerp=function(n,t,e,r){var c=t[0],a=t[1],u=t[2];return n[0]=c+r*(e[0]-c),n[1]=a+r*(e[1]-a),n[2]=u+r*(e[2]-u),n},vec3.hermite=function(n,t,e,r,c,a){var u=a*a,v=u*(2*a-3)+1,i=u*(a-2)+a,o=u*(a-1),s=u*(3-2*a);return n[0]=t[0]*v+e[0]*i+r[0]*o+c[0]*s,n[1]=t[1]*v+e[1]*i+r[1]*o+c[1]*s,n[2]=t[2]*v+e[2]*i+r[2]*o+c[2]*s,n},vec3.bezier=function(n,t,e,r,c,a){var u=1-a,v=u*u,i=a*a,o=v*u,s=3*a*v,f=3*i*u,M=i*a;return n[0]=t[0]*o+e[0]*s+r[0]*f+c[0]*M,n[1]=t[1]*o+e[1]*s+r[1]*f+c[1]*M,n[2]=t[2]*o+e[2]*s+r[2]*f+c[2]*M,n},vec3.random=function(n,t){t=t||1;var e=2*glMatrix.RANDOM()*Math.PI,r=2*glMatrix.RANDOM()-1,c=Math.sqrt(1-r*r)*t;return n[0]=Math.cos(e)*c,n[1]=Math.sin(e)*c,n[2]=r*t,n},vec3.transformMat4=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[3]*r+e[7]*c+e[11]*a+e[15];return u=u||1,n[0]=(e[0]*r+e[4]*c+e[8]*a+e[12])/u,n[1]=(e[1]*r+e[5]*c+e[9]*a+e[13])/u,n[2]=(e[2]*r+e[6]*c+e[10]*a+e[14])/u,n},vec3.transformMat3=function(n,t,e){var r=t[0],c=t[1],a=t[2];return n[0]=r*e[0]+c*e[3]+a*e[6],n[1]=r*e[1]+c*e[4]+a*e[7],n[2]=r*e[2]+c*e[5]+a*e[8],n},vec3.transformQuat=function(n,t,e){var r=t[0],c=t[1],a=t[2],u=e[0],v=e[1],i=e[2],o=e[3],s=o*r+v*a-i*c,f=o*c+i*r-u*a,M=o*a+u*c-v*r,h=-u*r-v*c-i*a;return n[0]=s*o+h*-u+f*-i-M*-v,n[1]=f*o+h*-v+M*-u-s*-i,n[2]=M*o+h*-i+s*-v-f*-u,n},vec3.rotateX=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0],a[1]=c[1]*Math.cos(r)-c[2]*Math.sin(r),a[2]=c[1]*Math.sin(r)+c[2]*Math.cos(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateY=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[2]*Math.sin(r)+c[0]*Math.cos(r),a[1]=c[1],a[2]=c[2]*Math.cos(r)-c[0]*Math.sin(r),n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.rotateZ=function(n,t,e,r){var c=[],a=[];return c[0]=t[0]-e[0],c[1]=t[1]-e[1],c[2]=t[2]-e[2],a[0]=c[0]*Math.cos(r)-c[1]*Math.sin(r),a[1]=c[0]*Math.sin(r)+c[1]*Math.cos(r),a[2]=c[2],n[0]=a[0]+e[0],n[1]=a[1]+e[1],n[2]=a[2]+e[2],n},vec3.forEach=function(){var n=vec3.create();return function(t,e,r,c,a,u){var v,i;for(e||(e=3),r||(r=0),i=c?Math.min(c*e+r,t.length):t.length,v=r;i>v;v+=e)n[0]=t[v],n[1]=t[v+1],n[2]=t[v+2],a(n,n,u),t[v]=n[0],t[v+1]=n[1],t[v+2]=n[2];return t}}(),vec3.angle=function(n,t){var e=vec3.fromValues(n[0],n[1],n[2]),r=vec3.fromValues(t[0],t[1],t[2]);vec3.normalize(e,e),vec3.normalize(r,r);var c=vec3.dot(e,r);return c>1?0:Math.acos(c)},vec3.str=function(n){return"vec3("+n[0]+", "+n[1]+", "+n[2]+")"},module.exports=vec3; + },{"./common.js":117}],125:[function(require,module,exports){ + var glMatrix=require("./common.js"),vec4={};vec4.create=function(){var e=new glMatrix.ARRAY_TYPE(4);return e[0]=0,e[1]=0,e[2]=0,e[3]=0,e},vec4.clone=function(e){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=e[0],n[1]=e[1],n[2]=e[2],n[3]=e[3],n},vec4.fromValues=function(e,n,t,r){var c=new glMatrix.ARRAY_TYPE(4);return c[0]=e,c[1]=n,c[2]=t,c[3]=r,c},vec4.copy=function(e,n){return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e},vec4.set=function(e,n,t,r,c){return e[0]=n,e[1]=t,e[2]=r,e[3]=c,e},vec4.add=function(e,n,t){return e[0]=n[0]+t[0],e[1]=n[1]+t[1],e[2]=n[2]+t[2],e[3]=n[3]+t[3],e},vec4.subtract=function(e,n,t){return e[0]=n[0]-t[0],e[1]=n[1]-t[1],e[2]=n[2]-t[2],e[3]=n[3]-t[3],e},vec4.sub=vec4.subtract,vec4.multiply=function(e,n,t){return e[0]=n[0]*t[0],e[1]=n[1]*t[1],e[2]=n[2]*t[2],e[3]=n[3]*t[3],e},vec4.mul=vec4.multiply,vec4.divide=function(e,n,t){return e[0]=n[0]/t[0],e[1]=n[1]/t[1],e[2]=n[2]/t[2],e[3]=n[3]/t[3],e},vec4.div=vec4.divide,vec4.min=function(e,n,t){return e[0]=Math.min(n[0],t[0]),e[1]=Math.min(n[1],t[1]),e[2]=Math.min(n[2],t[2]),e[3]=Math.min(n[3],t[3]),e},vec4.max=function(e,n,t){return e[0]=Math.max(n[0],t[0]),e[1]=Math.max(n[1],t[1]),e[2]=Math.max(n[2],t[2]),e[3]=Math.max(n[3],t[3]),e},vec4.scale=function(e,n,t){return e[0]=n[0]*t,e[1]=n[1]*t,e[2]=n[2]*t,e[3]=n[3]*t,e},vec4.scaleAndAdd=function(e,n,t,r){return e[0]=n[0]+t[0]*r,e[1]=n[1]+t[1]*r,e[2]=n[2]+t[2]*r,e[3]=n[3]+t[3]*r,e},vec4.distance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return Math.sqrt(t*t+r*r+c*c+u*u)},vec4.dist=vec4.distance,vec4.squaredDistance=function(e,n){var t=n[0]-e[0],r=n[1]-e[1],c=n[2]-e[2],u=n[3]-e[3];return t*t+r*r+c*c+u*u},vec4.sqrDist=vec4.squaredDistance,vec4.length=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return Math.sqrt(n*n+t*t+r*r+c*c)},vec4.len=vec4.length,vec4.squaredLength=function(e){var n=e[0],t=e[1],r=e[2],c=e[3];return n*n+t*t+r*r+c*c},vec4.sqrLen=vec4.squaredLength,vec4.negate=function(e,n){return e[0]=-n[0],e[1]=-n[1],e[2]=-n[2],e[3]=-n[3],e},vec4.inverse=function(e,n){return e[0]=1/n[0],e[1]=1/n[1],e[2]=1/n[2],e[3]=1/n[3],e},vec4.normalize=function(e,n){var t=n[0],r=n[1],c=n[2],u=n[3],a=t*t+r*r+c*c+u*u;return a>0&&(a=1/Math.sqrt(a),e[0]=t*a,e[1]=r*a,e[2]=c*a,e[3]=u*a),e},vec4.dot=function(e,n){return e[0]*n[0]+e[1]*n[1]+e[2]*n[2]+e[3]*n[3]},vec4.lerp=function(e,n,t,r){var c=n[0],u=n[1],a=n[2],v=n[3];return e[0]=c+r*(t[0]-c),e[1]=u+r*(t[1]-u),e[2]=a+r*(t[2]-a),e[3]=v+r*(t[3]-v),e},vec4.random=function(e,n){return n=n||1,e[0]=glMatrix.RANDOM(),e[1]=glMatrix.RANDOM(),e[2]=glMatrix.RANDOM(),e[3]=glMatrix.RANDOM(),vec4.normalize(e,e),vec4.scale(e,e,n),e},vec4.transformMat4=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=n[3];return e[0]=t[0]*r+t[4]*c+t[8]*u+t[12]*a,e[1]=t[1]*r+t[5]*c+t[9]*u+t[13]*a,e[2]=t[2]*r+t[6]*c+t[10]*u+t[14]*a,e[3]=t[3]*r+t[7]*c+t[11]*u+t[15]*a,e},vec4.transformQuat=function(e,n,t){var r=n[0],c=n[1],u=n[2],a=t[0],v=t[1],i=t[2],o=t[3],f=o*r+v*u-i*c,s=o*c+i*r-a*u,l=o*u+a*c-v*r,M=-a*r-v*c-i*u;return e[0]=f*o+M*-a+s*-i-l*-v,e[1]=s*o+M*-v+l*-a-f*-i,e[2]=l*o+M*-i+f*-v-s*-a,e[3]=n[3],e},vec4.forEach=function(){var e=vec4.create();return function(n,t,r,c,u,a){var v,i;for(t||(t=4),r||(r=0),i=c?Math.min(c*t+r,n.length):n.length,v=r;i>v;v+=t)e[0]=n[v],e[1]=n[v+1],e[2]=n[v+2],e[3]=n[v+3],u(e,e,a),n[v]=e[0],n[v+1]=e[1],n[v+2]=e[2],n[v+3]=e[3];return n}}(),vec4.str=function(e){return"vec4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+")"},module.exports=vec4; + },{"./common.js":117}],126:[function(require,module,exports){ + exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=0>o||0===o&&0>1/o?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; + },{}],127:[function(require,module,exports){ + "function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; + },{}],128:[function(require,module,exports){ + "use strict";function constant(r){return function(){return r}}function interpolateNumber(r,t,n){return r*(1-n)+t*n}function interpolateArray(r,t,n){for(var e=[],o=0;or){a=u;break}}if(o&&a){var s=a[0]-o[0],f=r-o[0],p=1===n?f/s:(Math.pow(n,f)-1)/(Math.pow(n,s)-1);return e(o[1],a[1],p)}return o?o[1]:a?a[1]:void 0}},exports["piecewise-constant"]=function(r){if(!r.stops)return constant(r);var t=r.stops;return function(r){for(var n=0;nr)return t[0===n?0:n-1][1];return t[t.length-1][1]}}; + },{}],129:[function(require,module,exports){ + "use strict";var reference=require("../../reference/latest.min.js"),validate=require("./parsed");module.exports=function(e){return validate(e,reference)}; + },{"../../reference/latest.min.js":132,"./parsed":130}],130:[function(require,module,exports){ + "use strict";function typeof_(e){return e instanceof Number?"number":e instanceof String?"string":e instanceof Boolean?"boolean":Array.isArray(e)?"array":null===e?"null":typeof e}function unbundle(e){return e instanceof Number||e instanceof String||e instanceof Boolean?e.valueOf():e}var parseCSSColor=require("csscolorparser").parseCSSColor,format=require("util").format;module.exports=function(e,t){function r(e,t){var r={message:(e?e+": ":"")+format.apply(format,Array.prototype.slice.call(arguments,2))};null!==t&&void 0!==t&&t.__line__&&(r.line=t.__line__),s.push(r)}function n(e,o,i){var s=typeof_(o);if("string"===s&&"@"===o[0]){if(t.$version>7)return r(e,o,"constants have been deprecated as of v8");if(!(o in a))return r(e,o,'constant "%s" not found',o);o=a[o],s=typeof_(o)}if(i["function"]&&"object"===s)return n["function"](e,o,i);if(i.type){var u=n[i.type];if(u)return u(e,o,i);i=t[i.type]}n.object(e,o,i)}function o(e){return function(t,n,o){var a=typeof_(n);a!==e&&r(t,n,"%s expected, %s found",e,a),"minimum"in o&&no.maximum&&r(t,n,"%s is greater than the maximum value %s",n,o.maximum)}}var a=e.constants||{},i={},s=[];return n.constants=function(e,n){if(t.$version>7){if(n)return r(e,n,"constants have been deprecated as of v8")}else{var o=typeof_(n);if("object"!==o)return r(e,n,"object expected, %s found",o);for(var a in n)"@"!==a[0]&&r(e+"."+a,n[a],'constants must start with "@"')}},n.source=function(e,o){if(!o.type)return void r(e,o,'"type" is required');var a=unbundle(o.type);switch(a){case"vector":case"raster":if(n.object(e,o,t.source_tile),"url"in o)for(var i in o)["type","url","tileSize"].indexOf(i)<0&&r(e+"."+i,o[i],'a source with a "url" property may not include a "%s" property',i);break;case"geojson":n.object(e,o,t.source_geojson);break;case"video":n.object(e,o,t.source_video);break;case"image":n.object(e,o,t.source_image);break;default:n["enum"](e+".type",o.type,{values:["vector","raster","geojson","video","image"]})}},n.layer=function(o,a){a.type||a.ref||r(o,a,'either "type" or "ref" is required');var s=unbundle(a.type),u=unbundle(a.ref);if(a.id&&(i[a.id]?r(o,a.id,'duplicate layer id "%s", previously used at line %d',a.id,i[a.id]):i[a.id]=a.id.__line__),"ref"in a){["type","source","source-layer","filter","layout"].forEach(function(e){e in a&&r(o,a[e],'"%s" is prohibited for ref layers',e)});var c;e.layers.forEach(function(e){e.id==u&&(c=e)}),c?c.ref?r(o,a.ref,"ref cannot reference another ref layer"):s=c.type:r(o,a.ref,'ref layer "%s" not found',u)}else if("background"!==s)if(a.source){var f=e.sources[a.source];f?"vector"==f.type&&"raster"==s?r(o,a.source,'layer "%s" requires a raster source',a.id):"raster"==f.type&&"raster"!=s?r(o,a.source,'layer "%s" requires a vector source',a.id):"vector"!=f.type||a["source-layer"]||r(o,a,'layer "%s" must specify a "source-layer"',a.id):r(o,a.source,'source "%s" not found',a.source)}else r(o,a,'missing required property "source"');n.object(o,a,t.layer,{filter:n.filter,layout:function(e,r){var o=t["layout_"+s];return s&&o&&n(e,r,o)},paint:function(e,r){var o=t["paint_"+s];return s&&o&&n(e,r,o)}})},n.object=function(e,o,a,i){i=i||{};var s=typeof_(o);if("object"!==s)return r(e,o,"object expected, %s found",s);for(var u in o){var c=u.split(".")[0],f=a[c]||a["*"],l=c.match(/^(.*)-transition$/);f?(i[c]||n)((e?e+".":e)+u,o[u],f):l&&a[l[1]]&&a[l[1]].transition?n((e?e+".":e)+u,o[u],t.transition):""!==e&&1!==e.split(".").length&&r(e,o[u],'unknown property "%s"',u)}for(var p in a)a[p].required&&void 0===a[p]["default"]&&void 0===o[p]&&r(e,o,'missing required property "%s"',p)},n.array=function(t,o,a,i){if("array"!==typeof_(o))return r(t,o,"array expected, %s found",typeof_(o));if(a.length&&o.length!==a.length)return r(t,o,"array length %d expected, length %d found",a.length,o.length);if(a["min-length"]&&o.length":case">=":o.length>=2&&"$type"==o[1]&&r(e,o,'"$type" cannot be use with operator "%s"',o[0]);case"==":case"!=":3!=o.length&&r(e,o,'filter array for operator "%s" must have 3 elements',o[0]);case"in":case"!in":o.length>=2&&(a=typeof_(o[1]),"string"!==a?r(e+"[1]",o[1],"string expected, %s found",a):"@"===o[1][0]&&r(e+"[1]",o[1],"filter key cannot be a constant"));for(var i=2;i7&&e.constants&&n.constants("constants",e.constants),s.sort(function(e,t){return e.line-t.line}),s}; + },{"csscolorparser":107,"util":143}],131:[function(require,module,exports){ + module.exports=require("./v8.json"); + },{"./v8.json":133}],132:[function(require,module,exports){ + module.exports=require("./v8.min.json"); + },{"./v8.min.json":134}],133:[function(require,module,exports){ + module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8],"doc":"Stylesheet version number. Must be 8.","example":8},"name":{"type":"string","doc":"A human-readable name for the style.","example":"Bright"},"metadata":{"type":"*","doc":"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'."},"center":{"type":"array","value":"number","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).","example":[-73.9749,40.7736]},"zoom":{"type":"number","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).","example":12.5},"bearing":{"type":"number","default":0,"period":360,"units":"degrees","doc":"Default bearing, in degrees. The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":29},"pitch":{"type":"number","default":0,"units":"degrees","doc":"Default pitch, in degrees. Zero is perpendicular to the surface. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).","example":50},"sources":{"required":true,"type":"sources","doc":"Data source specifications.","example":{"mapbox-streets":{"type":"vector","url":"mapbox://mapbox.mapbox-streets-v6"}}},"sprite":{"type":"string","doc":"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended.","example":"mapbox://sprites/mapbox/bright-v8"},"glyphs":{"type":"string","doc":"A URL template for loading signed-distance-field glyph sets in PBF format. Valid tokens are {fontstack} and {range}.","example":"mapbox://fonts/mapbox/{fontstack}/{range}.pbf"},"transition":{"type":"transition","doc":"A global transition definition to use as a default across properties.","example":{"duration":300,"delay":0}},"layers":{"required":true,"type":"array","value":"layer","doc":"Layers will be drawn in the order of this array.","example":[{"id":"water","source":"mapbox-streets","source-layer":"water","type":"fill","paint":{"fill-color":"#00ffff"}}]}},"sources":{"*":{"type":"source","doc":"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For GeoJSON and video sources, a URL must be provided."}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"],"doc":"The data type of the tile 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."},"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."},"*":{"type":"*","doc":"Other keys to configure the data source."}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"],"doc":"The data type of the GeoJSON source."},"data":{"type":"*","doc":"A URL to a GeoJSON file, or inline GeoJSON."},"maxzoom":{"type":"number","default":14,"doc":"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels)."},"buffer":{"type":"number","default":64,"doc":"Tile buffer size on each side (higher means fewer rendering artifacts near tile edges but slower performance)."},"tolerance":{"type":"number","default":3,"doc":"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance)."},"cluster":{"type":"boolean","default":false,"doc":"If the data is a collection of point features, setting this to true clusters the points by radius into groups."},"clusterRadius":{"type":"number","default":400,"doc":"Radius of each cluster when clustering points, relative to 4096 tile."},"clusterMaxZoom":{"type":"number","doc":"Max zoom to cluster points on. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered)."}},"source_video":{"type":{"required":true,"type":"enum","values":["video"],"doc":"The data type of the video source."},"urls":{"required":true,"type":"array","value":"string","doc":"URLs to video content in order of preferred format."},"coordinates":{"required":true,"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":true,"type":"enum","values":["image"],"doc":"The data type of the image source."},"url":{"required":true,"type":"string","doc":"URL that points to an image"},"coordinates":{"required":true,"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":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"],"doc":"Rendering type of this layer."},"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:'."},"ref":{"type":"string","doc":"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient."},"source":{"type":"string","doc":"Name of a source description to be used for this layer."},"source-layer":{"type":"string","doc":"Layer to use from a vector tile source. Required if the source supports multiple layers."},"minzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The minimum zoom level on which the layer gets parsed and appears on."},"maxzoom":{"type":"number","minimum":0,"maximum":22,"doc":"The maximum zoom level on which the layer gets parsed and appears on."},"interactive":{"type":"boolean","doc":"Enable querying of feature data from this layer for interactivity.","default":false},"filter":{"type":"filter","doc":"A expression specifying conditions on source features. Only features that match the filter are displayed."},"layout":{"type":"layout","doc":"Layout properties for the layer."},"paint":{"type":"paint","doc":"Default paint properties for this layer."},"paint.*":{"type":"paint","doc":"Class-specific paint properties for this layer. The class name is the part after the first dot."}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt","doc":"The display of line endings."},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter","doc":"The display of lines when joining."},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","doc":"Used to automatically convert miter joins to bevel joins for sharp angles.","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","doc":"Used to automatically convert round joins to miter joins for shallow angles.","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point","doc":"Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons."},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","doc":"Distance between two symbol anchors.","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false,"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."},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the icon will be visible even if it collides with other previously drawn symbols.","requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the icon.","requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"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"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of icon when map is rotated.","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","doc":"Scale factor for icon. 1 is original size, 3 triples the size.","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","doc":"A string with {tokens} replaced, referencing the data property to pull from.","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","doc":"Rotates the icon clockwise.","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","doc":"Size of the additional area around the icon bounding box used for detecting symbol collisions.","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"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"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","doc":"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up.","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","doc":"Orientation of text when map is rotated.","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true,"doc":"Value to use for a text label. Feature properties are specified using tokens like {field_name}."},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"doc":"Font stack to use for displaying text.","requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","doc":"Font size.","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","doc":"The maximum line width for text wrapping.","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","doc":"Text leading value for multi-line text.","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","doc":"Text tracking amount.","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","doc":"Text justification options.","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","doc":"Part of the text placed closest to the anchor.","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","doc":"Maximum angle change between adjacent characters.","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","doc":"Rotates the text clockwise.","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","doc":"Size of the additional area around the text bounding box used for detecting symbol collisions.","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"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"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","doc":"Specifies how to capitalize text, similar to the CSS `text-transform` property.","requires":["text-field"]},"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.","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, the text will be visible even if it collides with other previously drawn symbols.","requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"doc":"If true, other symbols can be visible even if they collide with the text.","requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"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"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible","doc":"The display of this layer. `none` hides this layer."}},"filter":{"type":"array","value":"*","doc":"A filter selects specific features from a layer."},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"],"doc":"The filter operator."},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"],"doc":"The geometry type for the filter to select."},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"],"doc":"A color operation to apply."},"function":{"stops":{"type":"array","required":true,"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."}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2,"doc":"Zoom level and value pair."},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true,"doc":"Whether or not the fill should be antialiased."},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"doc":"The opacity given to the fill color.","transition":true},"fill-color":{"type":"color","default":"#000000","doc":"The color of the fill.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","doc":"The outline color of the fill. Matches the value of `fill-color` if unspecified.","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true,"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)."}},"paint_line":{"line-opacity":{"type":"number","doc":"The opacity at which the line will be drawn.","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","doc":"The color with which the line will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Stroke thickness."},"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.","function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"doc":"The line's offset perpendicular to its direction. Values may be positive or negative, where positive indicates \"rightwards\" (if you were moving in the direction of the line) and negative indicates \"leftwards.\"","function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Blur applied to the line, in pixels."},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","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.","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true,"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)."}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Circle radius."},"circle-color":{"type":"color","default":"#000000","doc":"The color of the circle.","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"doc":"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.","function":"interpolated","transition":true},"circle-opacity":{"type":"number","doc":"The opacity at which the circle will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","doc":"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively."},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen)","default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"doc":"The opacity at which the icon will be drawn.","type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"doc":"The color of the icon. This can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the icon's halo. Icon halos can only be used with sdf icons.","requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the icon outline.","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Fade out the halo towards the outside.","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"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"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","doc":"The opacity at which the text will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","doc":"The color with which the text will be drawn.","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"doc":"The color of the text's halo, which helps it stand out from backgrounds.","requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","doc":"The halo's fadeout distance towards the outside.","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"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"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"doc":"Control whether the translation is relative to the map (north) or viewport (screen).","default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","doc":"The opacity at which the image will be drawn.","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees","doc":"Rotates hues around the color wheel."},"raster-brightness-min":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the minimum brightness.","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","doc":"Increase or reduce the brightness of the image. The value is the maximum brightness.","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","doc":"Increase or reduce the saturation of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","doc":"Increase or reduce the contrast of the image.","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds","doc":"Fade duration when a new tile is added."}},"paint_background":{"background-color":{"type":"color","default":"#000000","doc":"The color with which the background will be drawn.","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true,"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)."},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"doc":"The opacity at which the background will be drawn.","function":"interpolated","transition":true}},"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."}}} + },{}],134:[function(require,module,exports){ + module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":["vector","raster"]},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":["geojson"]},"data":{"type":"*"},"maxzoom":{"type":"number","default":14},"buffer":{"type":"number","default":64},"tolerance":{"type":"number","default":3},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":400},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":["video"]},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":["image"]},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":["fill","line","symbol","circle","raster","background"]},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":22},"maxzoom":{"type":"number","minimum":0,"maximum":22},"interactive":{"type":"boolean","default":false},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","values":["butt","round","square"],"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","values":["bevel","round","miter"],"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","values":["point","line"],"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","requires":["icon-image"]},"icon-image":{"type":"string","function":"piecewise-constant","tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","requires":["icon-image"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"viewport","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"em","function":"interpolated","requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"em","function":"interpolated","requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","values":["left","center","right"],"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","values":["center","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"],"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","values":["none","uppercase","lowercase"],"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","values":["visible","none"],"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":["==","!=",">",">=","<","<=","in","!in","all","any","none"]},"geometry_type":{"type":"enum","values":["Point","LineString","Polygon"]},"color_operation":{"type":"enum","values":["lighten","saturate","spin","fade","mix"]},"function":{"stops":{"type":"array","required":true,"value":"function_stop"},"base":{"type":"number","default":1,"minimum":0}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"paint":["paint_fill","paint_line","paint_circle","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","default":true},"fill-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["circle-translate"]}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","values":["map","viewport"],"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} + },{}],135:[function(require,module,exports){ + "use strict";function Buffer(t){var e;t&&t.length&&(e=t,t=e.length);var r=new Uint8Array(t||0);return e&&r.set(e),r.readUInt32LE=BufferMethods.readUInt32LE,r.writeUInt32LE=BufferMethods.writeUInt32LE,r.readInt32LE=BufferMethods.readInt32LE,r.writeInt32LE=BufferMethods.writeInt32LE,r.readFloatLE=BufferMethods.readFloatLE,r.writeFloatLE=BufferMethods.writeFloatLE,r.readDoubleLE=BufferMethods.readDoubleLE,r.writeDoubleLE=BufferMethods.writeDoubleLE,r.toString=BufferMethods.toString,r.write=BufferMethods.write,r.slice=BufferMethods.slice,r.copy=BufferMethods.copy,r._isBuffer=!0,r}function encodeString(t){for(var e,r,n=t.length,i=[],o=0;n>o;o++){if(e=t.charCodeAt(o),e>55295&&57344>e){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(56320>e){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>e?i.push(e):2048>e?i.push(e>>6|192,63&e|128):65536>e?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;r>o;o++){var u=this[o];127>=u?(n+=decodeURIComponent(i)+String.fromCharCode(u),i=""):i+="%"+u.toString(16)}return n+=decodeURIComponent(i)},write:function(t,e){for(var r=t===lastStr?lastStrEncoded:encodeString(t),n=0;n>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e,r,s,n,o=this.buf;if(e=o[this.pos++],128>e)return e;if(e=127&e,r=o[this.pos++],128>r)return e|r<<7;if(r=(127&r)<<7,s=o[this.pos++],128>s)return e|r|s<<14;if(s=(127&s)<<14,n=o[this.pos++],128>n)return e|r|s|n<<21;if(t=e|r|s|(127&n)<<21,i=o[this.pos++],t+=268435456*(127&i),128>i)return t;if(i=o[this.pos++],t+=34359738368*(127&i),128>i)return t;if(i=o[this.pos++],t+=4398046511104*(127&i),128>i)return t;if(i=o[this.pos++],t+=562949953421312*(127&i),128>i)return t;if(i=o[this.pos++],t+=72057594037927940*(127&i),128>i)return t;if(i=o[this.pos++],t+=0x8000000000000000*(127&i),128>i)return t;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var t=this.pos,i=this.readVarint();if(POW_2_63>i)return i;for(var e=this.pos-2;255===this.buf[e];)e--;t>e&&(e=t),i=0;for(var r=0;e-t+1>r;r++){var s=127&~this.buf[t+r];i+=4>r?s<<7*r:s*Math.pow(2,7*r)}return-i-1},readSVarint:function(){var t=this.readVarint();return t%2===1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,i=this.buf.toString("utf8",this.pos,t);return this.pos=t,i},readBytes:function(){var t=this.readVarint()+this.pos,i=this.buf.slice(this.pos,t);return this.pos=t,i},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i=t)this.realloc(1),this.buf[this.pos++]=t;else if(16383>=t)this.realloc(2),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127;else if(2097151>=t)this.realloc(3),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127;else if(268435455>=t)this.realloc(4),this.buf[this.pos++]=t>>>0&127|128,this.buf[this.pos++]=t>>>7&127|128,this.buf[this.pos++]=t>>>14&127|128,this.buf[this.pos++]=t>>>21&127;else{for(var i=this.pos;t>=128;)this.realloc(1),this.buf[this.pos++]=255&t|128,t/=128;if(this.realloc(1),this.buf[this.pos++]=0|t,this.pos-i>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(t){this.writeVarint(0>t?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;i>e;e++)this.buf[this.pos++]=t[e]},writeRawMessage:function(t,i){this.pos++;var e=this.pos;t(i,this);var r=this.pos-e,s=127>=r?1:16383>=r?2:2097151>=r?3:268435455>=r?4:Math.ceil(Math.log(r)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var n=this.pos-1;n>=e;n--)this.buf[n+s-1]=this.buf[n]}this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}}; + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + + },{"./buffer":135}],137:[function(require,module,exports){ + "use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t}; + },{}],138:[function(require,module,exports){ + function cleanUpNextTick(){draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue()}function drainQueue(){if(!draining){var e=setTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex1)for(var r=1;rs;s++)o=t.children[s],h(a,t.leaf?r(o):o.bbox);return a}function e(){return[1/0,1/0,-(1/0),-(1/0)]}function h(t,i){return t[0]=Math.min(t[0],i[0]),t[1]=Math.min(t[1],i[1]),t[2]=Math.max(t[2],i[2]),t[3]=Math.max(t[3],i[3]),t}function r(t,i){return t.bbox[0]-i.bbox[0]}function o(t,i){return t.bbox[1]-i.bbox[1]}function a(t){return(t[2]-t[0])*(t[3]-t[1])}function s(t){return t[2]-t[0]+(t[3]-t[1])}function l(t,i){return(Math.max(i[2],t[2])-Math.min(i[0],t[0]))*(Math.max(i[3],t[3])-Math.min(i[1],t[1]))}function u(t,i){var n=Math.max(t[0],i[0]),e=Math.max(t[1],i[1]),h=Math.min(t[2],i[2]),r=Math.min(t[3],i[3]);return Math.max(0,h-n)*Math.max(0,r-e)}function f(t,i){return t[0]<=i[0]&&t[1]<=i[1]&&i[2]<=t[2]&&i[3]<=t[3]}function c(t,i){return i[0]<=t[2]&&i[1]<=t[3]&&i[2]>=t[0]&&i[3]>=t[1]}function d(t,i,n,e,h){for(var r,o=[i,n];o.length;)n=o.pop(),i=o.pop(),e>=n-i||(r=i+Math.ceil((n-i)/e/2)*e,x(t,i,n,r,h),o.push(i,r,r,n))}function x(t,i,n,e,h){for(var r,o,a,s,l,u,f,c,d;n>i;){for(n-i>600&&(r=n-i+1,o=e-i+1,a=Math.log(r),s=.5*Math.exp(2*a/3),l=.5*Math.sqrt(a*s*(r-s)/r)*(0>o-r/2?-1:1),u=Math.max(i,Math.floor(e-o*s/r+l)),f=Math.min(n,Math.floor(e+(r-o)*s/r+l)),x(t,u,f,e,h)),c=t[e],o=i,d=n,p(t,i,e),h(t[n],c)>0&&p(t,i,n);d>o;){for(p(t,o,d),o++,d--;h(t[o],c)<0;)o++;for(;h(t[d],c)>0;)d--}0===h(t[i],c)?p(t,i,d):(d++,p(t,d,n)),e>=d&&(i=d+1),d>=e&&(n=d-1)}}function p(t,i,n){var e=t[i];t[i]=t[n],t[n]=e}t.prototype={all:function(){return this._all(this.data,[])},search:function(t){var i=this.data,n=[],e=this.toBBox;if(!c(t,i.bbox))return n;for(var h,r,o,a,s=[];i;){for(h=0,r=i.children.length;r>h;h++)o=i.children[h],a=i.leaf?e(o):o.bbox,c(t,a)&&(i.leaf?n.push(o):f(t,a)?this._all(o,n):s.push(o));i=s.pop()}return n},collides:function(t){var i=this.data,n=this.toBBox;if(!c(t,i.bbox))return!1;for(var e,h,r,o,a=[];i;){for(e=0,h=i.children.length;h>e;e++)if(r=i.children[e],o=i.leaf?n(r):r.bbox,c(t,o)){if(i.leaf||f(t,o))return!0;a.push(r)}i=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.lengthi;i++)this.insert(t[i]);return this}var e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height=o)return r={children:t.slice(n,e+1),height:1,bbox:null,leaf:!0},i(r,this.toBBox),r;h||(h=Math.ceil(Math.log(o)/Math.log(a)),a=Math.ceil(o/Math.pow(a,h-1))),r={children:[],height:h,bbox:null,leaf:!1};var s,l,u,f,c=Math.ceil(o/a),x=c*Math.ceil(Math.sqrt(a));for(d(t,n,e,x,this.compareMinX),s=n;e>=s;s+=x)for(u=Math.min(s+x-1,e),d(t,s,u,c,this.compareMinY),l=s;u>=l;l+=c)f=Math.min(l+c-1,u),r.children.push(this._build(t,l,f,h-1));return i(r,this.toBBox),r},_chooseSubtree:function(t,i,n,e){for(var h,r,o,s,u,f,c,d;;){if(e.push(i),i.leaf||e.length-1===n)break;for(c=d=1/0,h=0,r=i.children.length;r>h;h++)o=i.children[h],u=a(o.bbox),f=l(t,o.bbox)-u,d>f?(d=f,c=c>u?u:c,s=o):f===d&&c>u&&(c=u,s=o);i=s}return i},_insert:function(t,i,n){var e=this.toBBox,r=n?t.bbox:e(t),o=[],a=this._chooseSubtree(r,this.data,i,o);for(a.children.push(t),h(a.bbox,r);i>=0&&o[i].children.length>this._maxEntries;)this._split(o,i),i--;this._adjustParentBBoxes(r,o,i)},_split:function(t,n){var e=t[n],h=e.children.length,r=this._minEntries;this._chooseSplitAxis(e,r,h);var o=this._chooseSplitIndex(e,r,h),a={children:e.children.splice(o,e.children.length-o),height:e.height,bbox:null,leaf:!1};e.leaf&&(a.leaf=!0),i(e,this.toBBox),i(a,this.toBBox),n?t[n-1].children.push(a):this._splitRoot(e,a)},_splitRoot:function(t,n){this.data={children:[t,n],height:t.height+1,bbox:null,leaf:!1},i(this.data,this.toBBox)},_chooseSplitIndex:function(t,i,e){var h,r,o,s,l,f,c,d;for(f=c=1/0,h=i;e-i>=h;h++)r=n(t,0,h,this.toBBox),o=n(t,h,e,this.toBBox),s=u(r,o),l=a(r)+a(o),f>s?(f=s,d=h,c=c>l?l:c):s===f&&c>l&&(c=l,d=h);return d},_chooseSplitAxis:function(t,i,n){var e=t.leaf?this.compareMinX:r,h=t.leaf?this.compareMinY:o,a=this._allDistMargin(t,i,n,e),s=this._allDistMargin(t,i,n,h);s>a&&t.children.sort(e)},_allDistMargin:function(t,i,e,r){t.children.sort(r);var o,a,l=this.toBBox,u=n(t,0,i,l),f=n(t,e-i,e,l),c=s(u)+s(f);for(o=i;e-i>o;o++)a=t.children[o],h(u,t.leaf?l(a):a.bbox),c+=s(u);for(o=e-i-1;o>=i;o--)a=t.children[o],h(f,t.leaf?l(a):a.bbox),c+=s(f);return c},_adjustParentBBoxes:function(t,i,n){for(var e=n;e>=0;e--)h(i[e].bbox,t)},_condense:function(t){for(var n,e=t.length-1;e>=0;e--)0===t[e].children.length?e>0?(n=t[e-1].children,n.splice(n.indexOf(t[e]),1)):this.clear():i(t[e],this.toBBox)},_initFormat:function(t){var i=["return a"," - b",";"];this.compareMinX=new Function("a","b",i.join(t[0])),this.compareMinY=new Function("a","b",i.join(t[1])),this.toBBox=new Function("a","return [a"+t.join(", a")+"];")}},"function"==typeof define&&define.amd?define("rbush",function(){return t}):"undefined"!=typeof module?module.exports=t:"undefined"!=typeof self?self.rbush=t:window.rbush=t}(); + },{}],140:[function(require,module,exports){ + void function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():e.resolveUrl=r()}(this,function(){function e(){var e=arguments.length;if(0===e)throw new Error("resolveUrl requires at least one argument; got none.");var r=document.createElement("base");if(r.href=arguments[0],1===e)return r.href;var t=document.getElementsByTagName("head")[0];t.insertBefore(r,t.firstChild);for(var n,o=document.createElement("a"),f=1;e>f;f++)o.href=arguments[f],n=o.href,r.href=n;return t.removeChild(r),n}return e}); + },{}],141:[function(require,module,exports){ + function UnitBezier(t,i,e,r){this.cx=3*t,this.bx=3*(e-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*i,this.by=3*(r-i)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=e,this.p2y=r}module.exports=UnitBezier,UnitBezier.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},UnitBezier.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},UnitBezier.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},UnitBezier.prototype.solveCurveX=function(t,i){"undefined"==typeof i&&(i=1e-6);var e,r,s,h,n;for(s=t,n=0;8>n;n++){if(h=this.sampleCurveX(s)-t,Math.abs(h)s)return e;if(s>r)return r;for(;r>e;){if(h=this.sampleCurveX(s),Math.abs(h-t)h?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))}; + },{}],142:[function(require,module,exports){ + module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8}; + },{}],143:[function(require,module,exports){ + (function (process,global){ + function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var a="",c=!1,l=["{","}"];if(isArray(r)&&(c=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";a=" [Function"+p+"]"}if(isRegExp(r)&&(a=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(a=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(a=" "+formatError(r)),0===o.length&&(!c||0==r.length))return l[0]+a+l[1];if(0>t)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=c?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,c)}),e.seen.pop(),reduceToSingleString(f,a,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;u>s;++s)hasOwnProperty(r,String(s))?o.push(formatProperty(e,r,t,n,String(s),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,r,t,n,i,!0))}),o}function formatProperty(e,r,t,n,i,o){var s,u,a;if(a=Object.getOwnPropertyDescriptor(r,i)||{value:r[i]},a.get?u=a.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):a.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(n,i)||(s="["+i+"]"),u||(e.seen.indexOf(a.value)<0?(u=isNull(t)?formatValue(e,a.value,null):formatValue(e,a.value,t-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return 10>e?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(r){return"[Circular]"}default:return e}}),s=n[t];i>t;s=n[++t])o+=isNull(s)||!isObject(s)?" "+s:" "+inspect(s);return o},exports.deprecate=function(e,r){function t(){if(!n){if(process.throwDeprecation)throw new Error(r);process.traceDeprecation?console.trace(r):console.error(r),n=!0}return e.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(e,r).apply(this,arguments)};if(process.noDeprecation===!0)return e;var n=!1;return t};var debugs={},debugEnviron;exports.debuglog=function(e){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),e=e.toUpperCase(),!debugs[e])if(new RegExp("\\b"+e+"\\b","i").test(debugEnviron)){var r=process.pid;debugs[e]=function(){var t=exports.format.apply(exports,arguments);console.error("%s %d: %s",e,r,t)}}else debugs[e]=function(){};return debugs[e]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=require("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=require("inherits"),exports._extend=function(e,r){if(!r||!isObject(r))return e;for(var t=Object.keys(r),n=t.length;n--;)e[t[n]]=r[t[n]];return e}; + }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + + },{"./support/isBuffer":142,"_process":138,"inherits":127}],144:[function(require,module,exports){ + module.exports.VectorTile=require("./lib/vectortile.js"),module.exports.VectorTileFeature=require("./lib/vectortilefeature.js"),module.exports.VectorTileLayer=require("./lib/vectortilelayer.js"); + },{"./lib/vectortile.js":145,"./lib/vectortilefeature.js":147,"./lib/vectortilelayer.js":148}],145:[function(require,module,exports){ + "use strict";function VectorTile(e,r){this.layers=e.readFields(readTile,{},r)}function readTile(e,r,i){if(3===e){var t=new VectorTileLayer(i,i.readVarint()+i.pos);t.length&&(r[t.name]=t)}}var VectorTileLayer=require("./vectortilelayer");module.exports=VectorTile; + },{"./vectortilelayer":148}],146:[function(require,module,exports){ + "use strict";function VectorTileClipper(i){this.feature=i,this.finalRatio=4096/i.extent*Math.pow(2,i.dz);var t=64;t/=this.finalRatio;var s=i.extent>>i.dz;t>s&&(t=s),this.dz=i.dz,this.margin=t,this.xmin=s*i.xPos-t,this.ymin=s*i.yPos-t,this.xmax=this.xmin+s+2*t,this.ymax=this.ymin+s+2*t,this.lines=[],this._prevIsIn=!1,this.type=i.type}var Point=require("point-geometry");module.exports=VectorTileClipper,VectorTileClipper.prototype.loadGeometry=function(){var i=this.feature._pbf;i.pos=this.feature._geometry;for(var t=i.readVarint()+i.pos,s=1,h=0,n=0,e=0;i.pos>3}if(h--,1===s||2===s)n+=i.readSVarint(),e+=i.readSVarint(),1===s?this.moveTo(n,e):this.lineTo(n,e);else{if(7!==s)throw new Error("unknown command "+s);this.closePolygon()}}return this.result()},VectorTileClipper.prototype.moveTo=function(i,t){this._push_line(),this._prevIsIn=this._isIn(i,t),this._moveTo(i,t,this._prevIsIn),this._prevPt=new Point(i,t),this._firstPt=new Point(i,t)},VectorTileClipper.prototype.lineTo=function(i,t){var s,h,n,e,x,y,l,o,m,r,a,p,_=this._isIn(i,t);if(_)this._prevIsIn?this._lineTo(i,t,!0):(s=this._prevPt,h=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(h.x,h.y,!0));else if(this._prevIsIn)h=this._prevPt,s=new Point(i,t),n=this._intersect(h,s),this._lineTo(n.x,n.y,!0),this._lineTo(s.x,s.y,!1);else if(e=this._prevPt,x=new Point(i,t),e.x<=this.xmin&&x.x<=this.xmin||e.x>=this.xmax&&x.x>=this.xmax||e.y<=this.ymin&&x.y<=this.ymin||e.y>=this.ymax&&x.y>=this.ymax)this._lineTo(x.x,x.y,!1);else{if(o=[],(e.xthis.xmin||e.x>this.xmin&&x.x=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmin,l.y=p,o.push(l))),(e.xthis.xmax||e.x>this.xmax&&x.x=this.ymax?r=!0:(l={},l.ratio=y,l.x=this.xmax,l.y=p,o.push(l))),(e.ythis.ymin||e.y>this.ymin&&x.y=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymin,o.push(l))),(e.ythis.ymax||e.y>this.ymax&&x.y=this.xmax?m=!0:(l={},l.ratio=y,l.x=a,l.y=this.ymax,o.push(l))),0===o.length)m?r?this._lineTo(this.xmax,this.ymax,!0):this._lineTo(this.xmax,this.ymin,!0):r?this._lineTo(this.xmin,this.ymax,!0):this._lineTo(this.xmin,this.ymin,!0);else if(o.length>1&&o[0].ratio>o[1].ratio)this._lineTo(o[1].x,o[1].y,!0),this._lineTo(o[0].x,o[0].y,!0);else for(var u=0;u0&&(i=this._firstPt,t=this._prevPt,(i.x!==t.x||i.y!==t.y)&&this.lineTo(i.x,i.y))},VectorTileClipper.prototype.result=function(){return this._push_line(),0===this.lines.length?null:this.lines},VectorTileClipper.prototype._isIn=function(i,t){return i>=this.xmin&&i<=this.xmax&&t>=this.ymin&&t<=this.ymax},VectorTileClipper.prototype._intersect=function(i,t){var s,h,n,e;return t.x>=this.xmin&&t.x<=this.xmax?(h=t.y<=this.ymin?this.ymin:this.ymax,s=i.x+(h-i.y)/(t.y-i.y)*(t.x-i.x)):t.y>=this.ymin&&t.y<=this.ymax?(s=t.x<=this.xmin?this.xmin:this.xmax,h=i.y+(s-i.x)/(t.x-i.x)*(t.y-i.y)):(h=t.y<=this.ymin?this.ymin:this.ymax,s=t.x<=this.xmin?this.xmin:this.xmax,n=(s-i.x)/(t.x-i.x),e=(h-i.y)/(t.y-i.y),e>n?h=i.y+n*(t.y-i.y):s=i.x+e*(t.x-i.x)),new Point(s,h)},VectorTileClipper.prototype._push_line=function(){this.line&&(1===this.type?this.line.length>0&&this.lines.push(this.line):2===this.type?this.line.length>1&&this.lines.push(this.line):3===this.type&&this.line.length>3&&this.lines.push(this.line)),this.line=[]},VectorTileClipper.prototype._moveTo=function(i,t,s){3!==this.type?s&&(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t))):(s||(ithis.xmax&&(i=this.xmax),tthis.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.push(new Point(i,t)),this._is_h=!1,this._is_v=!1)},VectorTileClipper.prototype._lineTo=function(i,t,s){var h,n;if(3!==this.type)if(s){if(i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line.length>0&&(h=this.line[this.line.length-1],h.x===i&&h.y===t))return;this.line.push(new Point(i,t))}else this.line&&this.line.length>0&&this._push_line();else if(s||(ithis.xmax&&(i=this.xmax),tthis.ymax&&(t=this.ymax)),i=(i-(this.xmin+this.margin))*this.finalRatio,t=(t-(this.ymin+this.margin))*this.finalRatio,this.line&&this.line.length>0){h=this.line[this.line.length-1];var e=h.x===i,x=h.y===t;if(e&&x)return;this._is_h&&e?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):this._is_v&&x?(h.x=i,h.y=t,n=this.line[this.line.length-2],this._is_h=n.x===i,this._is_v=n.y===t):(this.line.push(new Point(i,t)),this._is_h=e,this._is_v=x)}else this.line.push(new Point(i,t))}; + },{"point-geometry":137}],147:[function(require,module,exports){ + "use strict";function VectorTileFeature(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(readFeature,this,t)}function readFeature(e,t,r){1==e?t._id=r.readVarint():2==e?readTag(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function readTag(e,t){for(var r=e.readVarint()+e.pos;e.pos4096;)r+=1,i>>=1;var o=this._pbf;o.pos=this._geometry;var a,n=o.readVarint()+o.pos,s=1,p=0,h=0,u=0;for(e=[];o.pos>3}if(p--,1===s||2===s)h+=o.readSVarint(),u+=o.readSVarint(),1===s&&(a&&e.push(a),a=[]),a.push(new Point(h>>r,u>>r));else{if(7!==s)throw new Error("unknown command "+s);a&&a.push(a[0].clone())}}a&&e.push(a)}return e},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,o=0,a=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos>3}if(i--,1===r||2===r)o+=e.readSVarint(),a+=e.readSVarint(),n>o&&(n=o),o>s&&(s=o),p>a&&(p=a),a>h&&(h=a);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){for(var i=this.extent*Math.pow(2,r),o=this.extent*e,a=this.extent*t,n=this.loadGeometry(),s=VectorTileFeature.types[this.type],p=0;p>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)}; + },{"./vectortilefeature.js":147}],149:[function(require,module,exports){ + var bundleFn=arguments[3],sources=arguments[4],cache=arguments[5],stringify=JSON.stringify;module.exports=function(r){for(var e,t=Object.keys(cache),n=0,o=t.length;o>n;n++){var a=t[n],i=cache[a].exports;if(i===r||i["default"]===r){e=a;break}}if(!e){e=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var s={},n=0,o=t.length;o>n;n++){var a=t[n];s[a]=a}sources[e]=[Function(["require","module","exports"],"("+r+")(self)"),s]}var u=Math.floor(Math.pow(16,8)*Math.random()).toString(16),f={};f[e]=e,sources[u]=[Function(["require"],"var f = require("+stringify(e)+");(f.default ? f.default : f)(self);"),f];var c="("+bundleFn+")({"+Object.keys(sources).map(function(r){return stringify(r)+":["+sources[r][0]+","+stringify(sources[r][1])+"]"}).join(",")+"},{},["+stringify(u)+"])",l=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(l.createObjectURL(new Blob([c],{type:"text/javascript"})))}; + },{}]},{},[24])(24) + }); + + L.MapboxGL = L.Layer.extend({ + options: { + updateInterval: 32 + }, + + initialize: function (options) { + L.setOptions(this, options); + + if (options.accessToken) { + mapboxgl.accessToken = options.accessToken; + } else { + throw new Error('You should provide a Mapbox GL access token as a token option.'); + } + + /** + * Create a version of `fn` that only fires once every `time` millseconds. + * + * @param {Function} fn the function to be throttled + * @param {number} time millseconds required between function calls + * @param {*} context the value of `this` with which the function is called + * @returns {Function} debounced function + * @private + */ + var throttle = function (fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; + } + }; + + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; + + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } + }; + + return wrapperFn; + }; + + // setup throttling the update event when panning + this._throttledUpdate = throttle(L.Util.bind(this._update, this), this.options.updateInterval); + }, + + onAdd: function (map) { + if (!this._glContainer) { + this._initContainer(); + } + + map._panes.tilePane.appendChild(this._glContainer); + + this._initGL(); + + this._offset = this._map.containerPointToLayerPoint([0, 0]); + + // work around https://github.com/mapbox/mapbox-gl-leaflet/issues/47 + if (map.options.zoomAnimation) { + L.DomEvent.on(map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this); + } + }, + + onRemove: function (map) { + if (this._map.options.zoomAnimation) { + L.DomEvent.off(this._map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this); + } + + map.getPanes().tilePane.removeChild(this._glContainer); + this._glMap.remove(); + this._glMap = null; + }, + + getEvents: function () { + return { + move: this._throttledUpdate, // sensibly throttle updating while panning + zoomanim: this._animateZoom, // applys the zoom animation to the + zoom: this._pinchZoom, // animate every zoom event for smoother pinch-zooming + zoomstart: this._zoomStart, // flag starting a zoom to disable panning + zoomend: this._zoomEnd + }; + }, + + _initContainer: function () { + var container = this._glContainer = L.DomUtil.create('div', 'leaflet-gl-layer'); + + var size = this._map.getSize(); + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; + }, + + _initGL: function () { + var center = this._map.getCenter(); + + var options = L.extend({}, this.options, { + container: this._glContainer, + interactive: false, + center: [center.lng, center.lat], + zoom: this._map.getZoom() - 1, + attributionControl: false + }); + + this._glMap = new mapboxgl.Map(options); + + // allow GL base map to pan beyond min/max latitudes + this._glMap.transform.latRange = null; + + // treat child element like L.ImageOverlay + L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-image-layer'); + L.DomUtil.addClass(this._glMap._canvas.canvas, 'leaflet-zoom-animated'); + }, + + _update: function (e) { + // update the offset so we can correct for it later when we zoom + this._offset = this._map.containerPointToLayerPoint([0, 0]); + + if (this._zooming) { + return; + } + + var size = this._map.getSize(), + container = this._glContainer, + gl = this._glMap, + topLeft = this._map.containerPointToLayerPoint([0, 0]); + + L.DomUtil.setPosition(container, topLeft); + + var center = this._map.getCenter(); + + // gl.setView([center.lat, center.lng], this._map.getZoom() - 1, 0); + // calling setView directly causes sync issues because it uses requestAnimFrame + + var tr = gl.transform; + tr.center = mapboxgl.LngLat.convert([center.lng, center.lat]); + tr.zoom = this._map.getZoom() - 1; + + if (gl.transform.width !== size.x || gl.transform.height !== size.y) { + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; + gl._resize(); + } else { + gl.update(); + } + }, + + // update the map constantly during a pinch zoom + _pinchZoom: function (e) { + this._glMap.jumpTo({ + zoom: this._map.getZoom() - 1, + center: this._map.getCenter() + }); + }, + + // borrowed from L.ImageOverlay https://github.com/Leaflet/Leaflet/blob/master/src/layer/ImageOverlay.js#L139-L144 + _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), e.zoom, e.center); + + L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale); + }, + + _zoomStart: function (e) { + this._zooming = true; + }, + + _zoomEnd: function () { + var scale = this._map.getZoomScale(this._map.getZoom()), + offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), this._map.getZoom(), this._map.getCenter()); + + L.DomUtil.setTransform(this._glMap._canvas.canvas, offset.subtract(this._offset), scale); + }, + + _transitionEnd: function (e) { + L.Util.requestAnimFrame(function () { + var zoom = this._map.getZoom(), + center = this._map.getCenter(), + offset = this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest()); + + // reset the scale and offset + L.DomUtil.setTransform(this._glMap._canvas.canvas, offset, 1); + + // enable panning once the gl map is ready again + this._glMap.once('moveend', L.Util.bind(function () { + this._zooming = false; + this._zoomEnd(); + }, this)); + + // update the map position + this._glMap.jumpTo({ + center: center, + zoom: zoom - 1 + }); + }, this) + } + }); + + L.mapboxGL = function (options) { + return new L.MapboxGL(options); + }; + + function fetchMetadata (url, context) { + esriLeaflet.request(url, {}, function (error, style) { + if (!error) { + esriLeaflet.request(style.sources.esri.url, {}, function (error, tileMetadata) { + if (!error) { + formatStyle(style, tileMetadata, url); + context._mapboxGL = L$1.mapboxGL({ + accessToken: 'ezree', + style: style + }); + + context._ready = true; + context.fire('ready', {}, true); + } + }, context); + } else { + throw new Error('Unable to fetch vector tile style metadata'); + } + }, context); + } + + function formatStyle (style, metadata, styleUrl) { + // if a relative path is referenced, the default style can be found in a standard location + if (style.sources.esri.url && style.sources.esri.url.indexOf('http') === -1) { + style.sources.esri.url = styleUrl.replace('/resources/styles/root.json', ''); + } + + // right now ArcGIS Pro published vector services have a slightly different signature + if (metadata.tiles && metadata.tiles[0].charAt(0) !== '/') { + metadata.tiles[0] = '/' + metadata.tiles[0]; + } + + if (metadata.tileMap && metadata.tileMap.charAt(0) !== '/') { + metadata.tileMap = '/' + metadata.tileMap; + } + + style.sources.esri = { + type: 'vector', + scheme: 'xyz', + tilejson: metadata.tilejson || '2.0.0', + format: (metadata.tileInfo && metadata.tileInfo.format) || 'pbf', + index: metadata.tileMap ? style.sources.esri.url + metadata.tileMap : null, + tiles: [ + style.sources.esri.url + metadata.tiles[0] + ], + description: metadata.description, + name: metadata.name + }; + + if (style.glyphs.indexOf('http') === -1) { + // set paths to sprite and glyphs + style.glyphs = styleUrl.replace('styles/root.json', style.glyphs.replace('../', '')); + style.sprite = styleUrl.replace('styles/root.json', style.sprite.replace('../', '')); + } + } + + var Basemap = L$1.Layer.extend({ + statics: { + URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/', + URLSUFFIX: '/resources/styles/root.json', + STYLES: { + 'DarkGray': '57436c01bc754dbb87dfb636b6484022', + 'Gray': '1e47168d181248e491541ffd5a91c0de', + 'Hybrid': 'af6063d6906c4eb589dfe03819610660', + 'Navigation': 'e19e9330bf08490ca8353d76b5e2e658', + 'Streets': 'a60a37a27cc140ddad15f919cd5a69f2', + 'StreetsNight': '92c551c9f07b4147846aae273e822714', + 'StreetsRelief': '78c0a9ab4fbf4198a8b951848aab19d8', + 'Topographic': '86d5ed4b6dc741de9dad5f0fbe09ae95', + 'Spring': '763884983d3544c0a418a97992881fce', + 'Newspaper': '4f4843d99c34436f82920932317893ae', + 'MidCentury': '267f44f08a844c7abee2b62b00600540', + 'ModernAntique': '996d9e7a3aac4514bb692ce7a990f1c1', + 'BlackAndWhite': '3161443179244702a5e0449010013b54' + } + }, + + initialize: function (options) { + // L.Layer expects a JSON object literal to be passed in constructor + options = { + key: options + }; + + if (typeof options.key === 'string' && Basemap.STYLES[options.key]) { + var url = Basemap.URLPREFIX + Basemap.STYLES[options.key] + Basemap.URLSUFFIX; + fetchMetadata(url, this); + } else { + throw new Error('L.esri.Vector.Basemap: Invalid parameter. Use one of "DarkGray", "Gray", "Hybrid", "Navigation", "Streets", "StreetsNight", "StreetsRelief", "Topographic"'); + } + }, + + onAdd: function (map) { + this._map = map; + + esriLeaflet.Util.setEsriAttribution(map); + + if (map.attributionControl) { + // 95% sure this is the right static attribution url + esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map); + map.attributionControl.addAttribution('USGS, NOAA'); + } + + if (this._ready) { + this._asyncAdd(); + } else { + this.once('ready', function () { + this._asyncAdd(); + }, this); + } + }, + + onRemove: function (map) { + map.off('moveend', esriLeaflet.Util._updateMapAttribution); + map.removeLayer(this._mapboxGL); + + if (map.attributionControl) { + var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML; + // this doesn't work, not sure why. + map.attributionControl.removeAttribution(vectorAttribution); + } + }, + + _asyncAdd: function () { + var map = this._map; + + // set the background color of the map to the background color of the tiles + map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color']; + + map.on('moveend', esriLeaflet.Util._updateMapAttribution); + this._mapboxGL.addTo(map, this); + } + }); + + function basemap (key) { + return new Basemap(key); + } + + var Layer = L$1.Layer.extend({ + statics: { + URLPREFIX: 'https://www.arcgis.com/sharing/rest/content/items/' + }, + + initialize: function (options) { + // L.Layer expects a JSON object literal to be passed in constructor + options = { + id: options + }; + + if (typeof options.id === 'string') { + var itemMetadataUrl = Layer.URLPREFIX + options.id; + var tileUrl; + var styleUrl; + + esriLeaflet.request(itemMetadataUrl, {}, function (error, metadata) { + if (!error) { + tileUrl = metadata.url; + + // custom tileset published using ArcGIS Pro + if (tileUrl.indexOf('basemaps.arcgis.com') === -1) { + this._customTileset = true; + // if copyright info was published, display it. + if (metadata.accessInformation) { + this._copyrightText = metadata.accessInformation; + } + esriLeaflet.request(tileUrl, {}, function (error, tileMetadata) { + if (!error) { + // right now ArcGIS Pro published vector services have a slightly different signature + if (tileMetadata.defaultStyles.charAt(0) !== '/') { + tileMetadata.defaultStyles = '/' + tileMetadata.defaultStyles; + } + + styleUrl = tileUrl + tileMetadata.defaultStyles + '/root.json'; + esriLeaflet.request(styleUrl, {}, function (error, style) { + if (!error) { + formatStyle(style, tileMetadata, styleUrl); + + this._mapboxGL = L$1.mapboxGL({ + accessToken: 'ezree', + style: style + }); + + this._ready = true; + this.fire('ready', {}, true); + } + }, this); + } + }, this); + } else { + // custom symbology applied to hosted basemap tiles + fetchMetadata(itemMetadataUrl + '/resources/styles/root.json', this); + } + } + }, this); + } else { + throw new Error('L.esri.Vector.Layer: Invalid parameter. Use the id of an ArcGIS Online vector tile item'); + } + }, + + onAdd: function (map) { + this._map = map; + esriLeaflet.Util.setEsriAttribution(map); + + if (this._ready) { + this._asyncAdd(); + } else { + this.once('ready', function () { + this._asyncAdd(); + }, this); + } + }, + + onRemove: function (map) { + map.off('moveend', esriLeaflet.Util._updateMapAttribution); + map.removeLayer(this._mapboxGL); + + if (map.attributionControl) { + var vectorAttribution = document.getElementsByClassName('esri-dynamic-attribution')[0].outerHTML; + // this doesn't work, not sure why. + map.attributionControl.removeAttribution(vectorAttribution); + } + }, + + _asyncAdd: function () { + var map = this._map; + if (map.attributionControl) { + if (this._customTileset) { + if (this._copyrightText) { + // pull static copyright text for services published with Pro + map.attributionControl.addAttribution('' + this._copyrightText + ''); + } + } else { + // provide dynamic attribution for Esri basemaps + esriLeaflet.Util._getAttributionData('https://static.arcgis.com/attribution/World_Street_Map', map); + map.attributionControl.addAttribution('USGS, NOAA'); + map.on('moveend', esriLeaflet.Util._updateMapAttribution); + } + } + + // set the background color of the map to the background color of the tiles + map.getContainer().style.background = this._mapboxGL.options.style.layers[0].paint['background-color']; + this._mapboxGL.addTo(map, this); + } + }); + + function layer (id) { + return new Layer(id); + } + + exports.VERSION = version; + exports.Basemap = Basemap; + exports.basemap = basemap; + exports.Layer = Layer; + exports.layer = layer; + +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qcyIsInNvdXJjZXMiOlsiLi4vcGFja2FnZS5qc29uIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21hcGJveC1nbC9kaXN0L21hcGJveC1nbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9tYXBib3gtZ2wtbGVhZmxldC9sZWFmbGV0LW1hcGJveC1nbC5qcyIsIi4uL3NyYy9VdGlsLmpzIiwiLi4vc3JjL0Jhc2VtYXAuanMiLCIuLi9zcmMvTGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsie1xuICBcIm5hbWVcIjogXCJlc3JpLWxlYWZsZXQtdmVjdG9yXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFc3JpIHZlY3RvciBiYXNlbWFwIHBsdWdpbiBmb3IgTGVhZmxldC5cIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4wLjZcIixcbiAgXCJhdXRob3JcIjogXCJKb2huIEdyYXZvaXMgPGpncmF2b2lzQGVzcmkuY29tPiAoaHR0cDovL2pvaG5ncmF2b2lzLmNvbSlcIixcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIFwiUGF0cmljayBBcmx0IDxwYXJsdEBlc3JpLmNvbT4gKGh0dHA6Ly9wYXRyaWNrYXJsdC5jb20pXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZXNyaS1sZWFmbGV0XCI6IFwiXjIuMC4zXCIsXG4gICAgXCJsZWFmbGV0XCI6IFwiXjEuMC4wXCIsXG4gICAgXCJtYXBib3gtZ2xcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL0VzcmkvbWFwYm94LWdsLWpzLmdpdCNpbmRleGVkLXZlY3Rvci1zb3VyY2VzXCIsXG4gICAgXCJtYXBib3gtZ2wtbGVhZmxldFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vamdyYXZvaXMvbWFwYm94LWdsLWxlYWZsZXQjaW5kZXhlZC12ZWN0b3Itc291cmNlc1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImdoLXJlbGVhc2VcIjogXCJeMi4wLjBcIixcbiAgICBcImh0dHAtc2VydmVyXCI6IFwiXjAuOC41XCIsXG4gICAgXCJta2RpcnBcIjogXCJeMC41LjFcIixcbiAgICBcIm5vZGVtb25cIjogXCJeMS45LjJcIixcbiAgICBcInJvbGx1cFwiOiBcIl4wLjI1LjRcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tanNvblwiOiBcIl4yLjAuMFwiLFxuICAgIFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjogXCJeMS40LjBcIixcbiAgICBcInJvbGx1cC1wbHVnaW4tdWdsaWZ5XCI6IFwiXjAuMy4xXCIsXG4gICAgXCJzZW1pc3RhbmRhcmRcIjogXCJeNy4wLjVcIixcbiAgICBcInNuYXp6eVwiOiBcIl4yLjAuMVwiLFxuICAgIFwid2F0Y2hcIjogXCJeMC4xNy4xXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IjcmVhZG1lXCIsXG4gIFwianNuZXh0Om1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIixcbiAgXCJqc3BtXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwibnBtXCIsXG4gICAgXCJmb3JtYXRcIjogXCJlczZcIixcbiAgICBcIm1haW5cIjogXCJzcmMvRXNyaUxlYWZsZXRWZWN0b3IuanNcIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJBcGFjaGUtMi4wXCIsXG4gIFwibWFpblwiOiBcImRpc3QvZXNyaS1sZWFmbGV0LXZlY3Rvci1kZWJ1Zy5qc1wiLFxuICBcImJyb3dzZXJcIjogXCJkaXN0L2VzcmktbGVhZmxldC12ZWN0b3ItZGVidWcuanNcIixcbiAgXCJyZWFkbWVGaWxlbmFtZVwiOiBcIlJFQURNRS5tZFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL2VzcmktbGVhZmxldC12ZWN0b3IuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInByZWJ1aWxkXCI6IFwibWtkaXJwIGRpc3RcIixcbiAgICBcImJ1aWxkXCI6IFwicm9sbHVwIC1jIHByb2ZpbGVzL2RlYnVnLmpzICYgcm9sbHVwIC1jIHByb2ZpbGVzL3Byb2R1Y3Rpb24uanNcIixcbiAgICBcImxpbnRcIjogXCJzZW1pc3RhbmRhcmQgfCBzbmF6enlcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gcnVuIGJ1aWxkXCIsXG4gICAgXCJwcmV0ZXN0XCI6IFwibnBtIHJ1biBidWlsZFwiLFxuICAgIFwic3RhcnRcIjogXCJ3YXRjaCAnbnBtIHJ1biBidWlsZCcgc3JjICYgaHR0cC1zZXJ2ZXIgLXAgODc2NSAtYy0xIC1vXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwiLi9zY3JpcHRzL3JlbGVhc2Uuc2hcIlxuICB9XG59XG4iLCIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5tYXBib3hnbCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJ1ZmZlcih0KXt0Pyh0aGlzLmFycmF5PXQuYXJyYXksdGhpcy5wb3M9dC5wb3MpOih0aGlzLmFycmF5PW5ldyBBcnJheUJ1ZmZlcih0aGlzLmRlZmF1bHRMZW5ndGgpLHRoaXMubGVuZ3RoPXRoaXMuZGVmYXVsdExlbmd0aCx0aGlzLnNldHVwVmlld3MoKSl9bW9kdWxlLmV4cG9ydHM9QnVmZmVyLEJ1ZmZlci5wcm90b3R5cGU9e3BvczowLGl0ZW1TaXplOjQsZGVmYXVsdExlbmd0aDo4MTkyLGFycmF5VHlwZTpcIkFSUkFZX0JVRkZFUlwiLGdldCBpbmRleCgpe3JldHVybiB0aGlzLnBvcy90aGlzLml0ZW1TaXplfSxzZXR1cFZpZXdzOmZ1bmN0aW9uKCl7dGhpcy51Ynl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheSksdGhpcy5ieXRlcz1uZXcgSW50OEFycmF5KHRoaXMuYXJyYXkpLHRoaXMudXNob3J0cz1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheSksdGhpcy5zaG9ydHM9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheSl9LGJpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLmFycmF5VHlwZV07dGhpcy5idWZmZXI/dC5iaW5kQnVmZmVyKGUsdGhpcy5idWZmZXIpOih0aGlzLmJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHQuYmluZEJ1ZmZlcihlLHRoaXMuYnVmZmVyKSx0LmJ1ZmZlckRhdGEoZSx0aGlzLmFycmF5LnNsaWNlKDAsdGhpcy5wb3MpLHQuU1RBVElDX0RSQVcpLHRoaXMuYXJyYXk9bnVsbCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dGhpcy5idWZmZXImJnQuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKX0scmVzaXplOmZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGg8dGhpcy5wb3MrdGhpcy5pdGVtU2l6ZSl7Zm9yKDt0aGlzLmxlbmd0aDx0aGlzLnBvcyt0aGlzLml0ZW1TaXplOyl0aGlzLmxlbmd0aD0yKk1hdGgucm91bmQoMS41KnRoaXMubGVuZ3RoLzIpO3RoaXMuYXJyYXk9bmV3IEFycmF5QnVmZmVyKHRoaXMubGVuZ3RoKTt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5KTt0LnNldCh0aGlzLnVieXRlcyksdGhpcy5zZXR1cFZpZXdzKCl9fX07XG59LHt9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBMaW5lVmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2xpbmVfdmVydGV4X2J1ZmZlclwiKSxMaW5lRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCIpLEZpbGxWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZmlsbF92ZXJ0ZXhfYnVmZmVyXCIpLEZpbGxFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL3RyaWFuZ2xlX2VsZW1lbnRfYnVmZmVyXCIpLE91dGxpbmVFbGVtZW50QnVmZmVyPXJlcXVpcmUoXCIuL291dGxpbmVfZWxlbWVudF9idWZmZXJcIiksR2x5cGhWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vZ2x5cGhfdmVydGV4X2J1ZmZlclwiKSxHbHlwaEVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksSWNvblZlcnRleEJ1ZmZlcj1yZXF1aXJlKFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIiksSWNvbkVsZW1lbnRCdWZmZXI9cmVxdWlyZShcIi4vdHJpYW5nbGVfZWxlbWVudF9idWZmZXJcIiksQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyPXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiKSxDaXJjbGVWZXJ0ZXhCdWZmZXI9cmVxdWlyZShcIi4vY2lyY2xlX3ZlcnRleF9idWZmZXJcIiksQ2lyY2xlRWxlbWVudEJ1ZmZlcj1yZXF1aXJlKFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT1lfHx7fSx7Z2x5cGhWZXJ0ZXg6bmV3IEdseXBoVmVydGV4QnVmZmVyKGUuZ2x5cGhWZXJ0ZXgpLGdseXBoRWxlbWVudDpuZXcgR2x5cGhFbGVtZW50QnVmZmVyKGUuZ2x5cGhFbGVtZW50KSxpY29uVmVydGV4Om5ldyBJY29uVmVydGV4QnVmZmVyKGUuaWNvblZlcnRleCksaWNvbkVsZW1lbnQ6bmV3IEljb25FbGVtZW50QnVmZmVyKGUuaWNvbkVsZW1lbnQpLGNpcmNsZVZlcnRleDpuZXcgQ2lyY2xlVmVydGV4QnVmZmVyKGUuY2lyY2xlVmVydGV4KSxjaXJjbGVFbGVtZW50Om5ldyBDaXJjbGVFbGVtZW50QnVmZmVyKGUuY2lyY2xlRWxlbWVudCksZmlsbFZlcnRleDpuZXcgRmlsbFZlcnRleEJ1ZmZlcihlLmZpbGxWZXJ0ZXgpLGZpbGxFbGVtZW50Om5ldyBGaWxsRWxlbWVudEJ1ZmZlcihlLmZpbGxFbGVtZW50KSxvdXRsaW5lRWxlbWVudDpuZXcgT3V0bGluZUVsZW1lbnRCdWZmZXIoZS5vdXRsaW5lRWxlbWVudCksbGluZVZlcnRleDpuZXcgTGluZVZlcnRleEJ1ZmZlcihlLmxpbmVWZXJ0ZXgpLGxpbmVFbGVtZW50Om5ldyBMaW5lRWxlbWVudEJ1ZmZlcihlLmxpbmVFbGVtZW50KSxjb2xsaXNpb25Cb3hWZXJ0ZXg6bmV3IENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcihlLmNvbGxpc2lvbkJveFZlcnRleCl9fTtcbn0se1wiLi9jaXJjbGVfdmVydGV4X2J1ZmZlclwiOjMsXCIuL2NvbGxpc2lvbl9ib3hfdmVydGV4X2J1ZmZlclwiOjQsXCIuL2ZpbGxfdmVydGV4X2J1ZmZlclwiOjUsXCIuL2dseXBoX3ZlcnRleF9idWZmZXJcIjo2LFwiLi9pY29uX3ZlcnRleF9idWZmZXJcIjo3LFwiLi9saW5lX2VsZW1lbnRfYnVmZmVyXCI6OCxcIi4vbGluZV92ZXJ0ZXhfYnVmZmVyXCI6OSxcIi4vb3V0bGluZV9lbGVtZW50X2J1ZmZlclwiOjEwLFwiLi90cmlhbmdsZV9lbGVtZW50X2J1ZmZlclwiOjExfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDaXJjbGVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9Q2lyY2xlVmVydGV4QnVmZmVyLENpcmNsZVZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLHQsaSxyKXt2YXIgZj10aGlzLnBvcyxzPWYvMjt0aGlzLnJlc2l6ZSgpLHRoaXMuc2hvcnRzW3MrMF09MiplKyhpKzEpLzIsdGhpcy5zaG9ydHNbcysxXT0yKnQrKHIrMSkvMix0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX0sYmluZDpmdW5jdGlvbihlLHQsaSl7QnVmZmVyLnByb3RvdHlwZS5iaW5kLmNhbGwodGhpcyxlKSxlLnZlcnRleEF0dHJpYlBvaW50ZXIodC5hX3BvcywyLGUuU0hPUlQsITEsdGhpcy5pdGVtU2l6ZSxpKzApfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbGxpc2lvbkJveFZlcnRleEJ1ZmZlcih0KXtCdWZmZXIuY2FsbCh0aGlzLHQpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25Cb3hWZXJ0ZXhCdWZmZXIsQ29sbGlzaW9uQm94VmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZToxMixkZWZhdWx0TGVuZ3RoOjMyNzY4LGFkZDpmdW5jdGlvbih0LGksZSxyKXt2YXIgcz10aGlzLnBvcyxvPXMvMix1PXRoaXMuaW5kZXg7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbyswXT10LngsdGhpcy5zaG9ydHNbbysxXT10LnksdGhpcy5zaG9ydHNbbysyXT1NYXRoLnJvdW5kKGkueCksdGhpcy5zaG9ydHNbbyszXT1NYXRoLnJvdW5kKGkueSksdGhpcy51Ynl0ZXNbcys4XT1NYXRoLmZsb29yKDEwKmUpLHRoaXMudWJ5dGVzW3MrOV09TWF0aC5mbG9vcigxMCpyKSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZSx1fX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEZpbGxWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9RmlsbFZlcnRleEJ1ZmZlcixGaWxsVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFkZDpmdW5jdGlvbihlLGkpe3ZhciB0PXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1t0KzBdPWUsdGhpcy5zaG9ydHNbdCsxXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUdseXBoVmVydGV4QnVmZmVyLEdseXBoVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtkZWZhdWx0TGVuZ3RoOjMyNzY4LGl0ZW1TaXplOjE2LGFkZDpmdW5jdGlvbih0LGUscixpLHMsaCxvLGYsdSl7dmFyIGE9dGhpcy5wb3MsbD1hLzI7dGhpcy5yZXNpemUoKSx0aGlzLnNob3J0c1tsKzBdPXQsdGhpcy5zaG9ydHNbbCsxXT1lLHRoaXMuc2hvcnRzW2wrMl09TWF0aC5yb3VuZCg2NCpyKSx0aGlzLnNob3J0c1tsKzNdPU1hdGgucm91bmQoNjQqaSksdGhpcy51Ynl0ZXNbYSs4XT1NYXRoLmZsb29yKHMvNCksdGhpcy51Ynl0ZXNbYSs5XT1NYXRoLmZsb29yKGgvNCksdGhpcy51Ynl0ZXNbYSsxMF09TWF0aC5mbG9vcigxMCp1KSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKm8pLHRoaXMudWJ5dGVzW2ErMTNdPU1hdGguZmxvb3IoMTAqTWF0aC5taW4oZiwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxyKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciBpPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLGksciswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEsaSxyKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEsaSxyKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBJY29uVmVydGV4QnVmZmVyKHQpe0J1ZmZlci5jYWxsKHRoaXMsdCl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPUljb25WZXJ0ZXhCdWZmZXIsSWNvblZlcnRleEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7ZGVmYXVsdExlbmd0aDozMjc2OCxpdGVtU2l6ZToxNixhZGQ6ZnVuY3Rpb24odCxlLGkscixzLG8saCx1LGYpe3ZhciBhPXRoaXMucG9zLG49YS8yO3RoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbbiswXT10LHRoaXMuc2hvcnRzW24rMV09ZSx0aGlzLnNob3J0c1tuKzJdPU1hdGgucm91bmQoNjQqaSksdGhpcy5zaG9ydHNbbiszXT1NYXRoLnJvdW5kKDY0KnIpLHRoaXMudWJ5dGVzW2ErOF09cy80LHRoaXMudWJ5dGVzW2ErOV09by80LHRoaXMudWJ5dGVzW2ErMTBdPU1hdGguZmxvb3IoMTAqKGZ8fDApKSx0aGlzLnVieXRlc1thKzEyXT1NYXRoLmZsb29yKDEwKihofHwwKSksdGhpcy51Ynl0ZXNbYSsxM109TWF0aC5mbG9vcigxMCpNYXRoLm1pbih1fHwyNSwyNSkpLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfSxiaW5kOmZ1bmN0aW9uKHQsZSxpKXtCdWZmZXIucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLHQpO3ZhciByPXRoaXMuaXRlbVNpemU7dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYV9wb3MsMix0LlNIT1JULCExLHIsaSswKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX29mZnNldCwyLHQuU0hPUlQsITEscixpKzQpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTEsNCx0LlVOU0lHTkVEX0JZVEUsITEscixpKzgpLHQudmVydGV4QXR0cmliUG9pbnRlcihlLmFfZGF0YTIsMix0LlVOU0lHTkVEX0JZVEUsITEscixpKzEyKX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBMaW5lRWxlbWVudEJ1ZmZlcihlKXtCdWZmZXIuY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIiksQnVmZmVyPXJlcXVpcmUoXCIuL2J1ZmZlclwiKTttb2R1bGUuZXhwb3J0cz1MaW5lRWxlbWVudEJ1ZmZlcixMaW5lRWxlbWVudEJ1ZmZlci5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEJ1ZmZlcix7aXRlbVNpemU6NixhcnJheVR5cGU6XCJFTEVNRU5UX0FSUkFZX0JVRkZFUlwiLGFkZDpmdW5jdGlvbihlLHQsaSl7dmFyIHI9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tyKzBdPWUsdGhpcy51c2hvcnRzW3IrMV09dCx0aGlzLnVzaG9ydHNbcisyXT1pLHRoaXMucG9zKz10aGlzLml0ZW1TaXplfX0pO1xufSx7XCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2J1ZmZlclwiOjF9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVWZXJ0ZXhCdWZmZXIoZSl7QnVmZmVyLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1yZXF1aXJlKFwiLi9idWZmZXJcIik7bW9kdWxlLmV4cG9ydHM9TGluZVZlcnRleEJ1ZmZlcixMaW5lVmVydGV4QnVmZmVyLmV4dHJ1ZGVTY2FsZT02MyxMaW5lVmVydGV4QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo4LGRlZmF1bHRMZW5ndGg6MzI3NjgsYWRkOmZ1bmN0aW9uKGUsdCxyLGkscyl7dmFyIHU9dGhpcy5wb3MsZj11LzIsaD10aGlzLmluZGV4LG89TGluZVZlcnRleEJ1ZmZlci5leHRydWRlU2NhbGU7cmV0dXJuIHRoaXMucmVzaXplKCksdGhpcy5zaG9ydHNbZiswXT0yKk1hdGguZmxvb3IoZS54KXxyLHRoaXMuc2hvcnRzW2YrMV09MipNYXRoLmZsb29yKGUueSl8aSx0aGlzLmJ5dGVzW3UrNF09TWF0aC5yb3VuZChvKnQueCksdGhpcy5ieXRlc1t1KzVdPU1hdGgucm91bmQobyp0LnkpLHRoaXMuYnl0ZXNbdSs2XT0oc3x8MCkvMTI4LHRoaXMuYnl0ZXNbdSs3XT0oc3x8MCklMTI4LHRoaXMucG9zKz10aGlzLml0ZW1TaXplLGh9fSk7XG59LHtcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vYnVmZmVyXCI6MX1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIE91dGxpbmVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPU91dGxpbmVFbGVtZW50QnVmZmVyLE91dGxpbmVFbGVtZW50QnVmZmVyLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQnVmZmVyLHtpdGVtU2l6ZTo0LGFycmF5VHlwZTpcIkVMRU1FTlRfQVJSQVlfQlVGRkVSXCIsYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5wb3MvMjt0aGlzLnJlc2l6ZSgpLHRoaXMudXNob3J0c1tpKzBdPWUsdGhpcy51c2hvcnRzW2krMV09dCx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVHJpYW5nbGVFbGVtZW50QnVmZmVyKGUpe0J1ZmZlci5jYWxsKHRoaXMsZSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKSxCdWZmZXI9cmVxdWlyZShcIi4vYnVmZmVyXCIpO21vZHVsZS5leHBvcnRzPVRyaWFuZ2xlRWxlbWVudEJ1ZmZlcixUcmlhbmdsZUVsZW1lbnRCdWZmZXIucHJvdG90eXBlPXV0aWwuaW5oZXJpdChCdWZmZXIse2l0ZW1TaXplOjYsYXJyYXlUeXBlOlwiRUxFTUVOVF9BUlJBWV9CVUZGRVJcIixhZGQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciByPXRoaXMucG9zLzI7dGhpcy5yZXNpemUoKSx0aGlzLnVzaG9ydHNbciswXT1lLHRoaXMudXNob3J0c1tyKzFdPXQsdGhpcy51c2hvcnRzW3IrMl09aSx0aGlzLnBvcys9dGhpcy5pdGVtU2l6ZX19KTtcbn0se1wiLi4vLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9idWZmZXJcIjoxfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ2lyY2xlQnVja2V0KGUpe3RoaXMuYnVmZmVycz1lLHRoaXMuZWxlbWVudEdyb3Vwcz1uZXcgRWxlbWVudEdyb3VwcyhlLmNpcmNsZVZlcnRleCxlLmNpcmNsZUVsZW1lbnQpfXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUNpcmNsZUJ1Y2tldCxDaXJjbGVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTQwOTYscj0wO3I8dGhpcy5mZWF0dXJlcy5sZW5ndGg7cisrKWZvcih2YXIgdD10aGlzLmZlYXR1cmVzW3JdLmxvYWRHZW9tZXRyeSgpWzBdLHM9MDtzPHQubGVuZ3RoO3MrKyl7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKDYpO3ZhciB1PXRbc10ueCxpPXRbc10ueTtpZighKDA+dXx8dT49ZXx8MD5pfHxpPj1lKSl7dmFyIGw9dGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5pbmRleC10aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhTdGFydEluZGV4O3RoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwtMSksdGhpcy5idWZmZXJzLmNpcmNsZVZlcnRleC5hZGQodSxpLDEsLTEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwxLDEpLHRoaXMuYnVmZmVycy5jaXJjbGVWZXJ0ZXguYWRkKHUsaSwtMSwxKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzEsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuZWxlbWVudEJ1ZmZlci5hZGQobCxsKzMsbCsyKSx0aGlzLmVsZW1lbnRHcm91cHMuY3VycmVudC52ZXJ0ZXhMZW5ndGgrPTQsdGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQuZWxlbWVudExlbmd0aCs9Mn19fTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlQnVja2V0KGUsdCxpLHIsbCl7dmFyIGM9bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJsYXlvdXRcIixlLnR5cGUsZS5sYXlvdXQse30pLnZhbHVlcygpLGE9e2xhc3RJbnRlZ2VyWm9vbToxLzAsbGFzdEludGVnZXJab29tVGltZTowLGxhc3Rab29tOjB9LHU9e307Zm9yKHZhciBvIGluIGMpdVtvXT1jW29dLmNhbGN1bGF0ZShpLGEpO1wic3ltYm9sXCI9PT1lLnR5cGUmJihjW1widGV4dC1zaXplXCJdJiYodVtcInRleHQtbWF4LXNpemVcIl09Y1tcInRleHQtc2l6ZVwiXS5jYWxjdWxhdGUoMTgsYSksdVtcInRleHQtc2l6ZVwiXT1jW1widGV4dC1zaXplXCJdLmNhbGN1bGF0ZShpKzEsYSkpLGNbXCJpY29uLXNpemVcIl0mJih1W1wiaWNvbi1tYXgtc2l6ZVwiXT1jW1wiaWNvbi1zaXplXCJdLmNhbGN1bGF0ZSgxOCxhKSx1W1wiaWNvbi1zaXplXCJdPWNbXCJpY29uLXNpemVcIl0uY2FsY3VsYXRlKGkrMSxhKSkpO3ZhciBzPVwibGluZVwiPT09ZS50eXBlP0xpbmVCdWNrZXQ6XCJmaWxsXCI9PT1lLnR5cGU/RmlsbEJ1Y2tldDpcInN5bWJvbFwiPT09ZS50eXBlP1N5bWJvbEJ1Y2tldDpcImNpcmNsZVwiPT09ZS50eXBlP0NpcmNsZUJ1Y2tldDpudWxsLG49bmV3IHModCxuZXcgTGF5b3V0UHJvcGVydGllc1tlLnR5cGVdKHUpLHIsaSxsKTtyZXR1cm4gbi5pZD1lLmlkLG4udHlwZT1lLnR5cGUsbltcInNvdXJjZS1sYXllclwiXT1lW1wic291cmNlLWxheWVyXCJdLG4uaW50ZXJhY3RpdmU9ZS5pbnRlcmFjdGl2ZSxuLm1pblpvb209ZS5taW56b29tLG4ubWF4Wm9vbT1lLm1heHpvb20sbi5maWx0ZXI9ZmVhdHVyZUZpbHRlcihlLmZpbHRlciksbi5mZWF0dXJlcz1bXSxufW1vZHVsZS5leHBvcnRzPWNyZWF0ZUJ1Y2tldDt2YXIgTGluZUJ1Y2tldD1yZXF1aXJlKFwiLi9saW5lX2J1Y2tldFwiKSxGaWxsQnVja2V0PXJlcXVpcmUoXCIuL2ZpbGxfYnVja2V0XCIpLFN5bWJvbEJ1Y2tldD1yZXF1aXJlKFwiLi9zeW1ib2xfYnVja2V0XCIpLENpcmNsZUJ1Y2tldD1yZXF1aXJlKFwiLi9jaXJjbGVfYnVja2V0XCIpLExheW91dFByb3BlcnRpZXM9cmVxdWlyZShcIi4uL3N0eWxlL2xheW91dF9wcm9wZXJ0aWVzXCIpLGZlYXR1cmVGaWx0ZXI9cmVxdWlyZShcImZlYXR1cmUtZmlsdGVyXCIpLFN0eWxlRGVjbGFyYXRpb25TZXQ9cmVxdWlyZShcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiKTtcbn0se1wiLi4vc3R5bGUvbGF5b3V0X3Byb3BlcnRpZXNcIjo1MyxcIi4uL3N0eWxlL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9jaXJjbGVfYnVja2V0XCI6MTIsXCIuL2ZpbGxfYnVja2V0XCI6MTYsXCIuL2xpbmVfYnVja2V0XCI6MTcsXCIuL3N5bWJvbF9idWNrZXRcIjoxOCxcImZlYXR1cmUtZmlsdGVyXCI6MTA4fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRWxlbWVudEdyb3VwcyhlLHQsbil7dGhpcy52ZXJ0ZXhCdWZmZXI9ZSx0aGlzLmVsZW1lbnRCdWZmZXI9dCx0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXI9bix0aGlzLmdyb3Vwcz1bXX1mdW5jdGlvbiBFbGVtZW50R3JvdXAoZSx0LG4pe3RoaXMudmVydGV4U3RhcnRJbmRleD1lLHRoaXMuZWxlbWVudFN0YXJ0SW5kZXg9dCx0aGlzLnNlY29uZEVsZW1lbnRTdGFydEluZGV4PW4sdGhpcy5lbGVtZW50TGVuZ3RoPTAsdGhpcy52ZXJ0ZXhMZW5ndGg9MCx0aGlzLnNlY29uZEVsZW1lbnRMZW5ndGg9MH1tb2R1bGUuZXhwb3J0cz1FbGVtZW50R3JvdXBzLEVsZW1lbnRHcm91cHMucHJvdG90eXBlLm1ha2VSb29tRm9yPWZ1bmN0aW9uKGUpeyghdGhpcy5jdXJyZW50fHx0aGlzLmN1cnJlbnQudmVydGV4TGVuZ3RoK2U+NjU1MzUpJiYodGhpcy5jdXJyZW50PW5ldyBFbGVtZW50R3JvdXAodGhpcy52ZXJ0ZXhCdWZmZXIuaW5kZXgsdGhpcy5lbGVtZW50QnVmZmVyJiZ0aGlzLmVsZW1lbnRCdWZmZXIuaW5kZXgsdGhpcy5zZWNvbmRFbGVtZW50QnVmZmVyJiZ0aGlzLnNlY29uZEVsZW1lbnRCdWZmZXIuaW5kZXgpLHRoaXMuZ3JvdXBzLnB1c2godGhpcy5jdXJyZW50KSl9O1xufSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmVhdHVyZVRyZWUodCxlKXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuei1NYXRoLmxvZyhlKS9NYXRoLkxOMix0aGlzLnJ0cmVlPXJidXNoKDkpLHRoaXMudG9CZUluc2VydGVkPVtdfWZ1bmN0aW9uIGdlb21ldHJ5SW50ZXJzZWN0c0JveCh0LGUsbil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludEludGVyc2VjdHNCb3godCxuKTpcIkxpbmVTdHJpbmdcIj09PWU/bGluZUludGVyc2VjdHNCb3godCxuKTpcIlBvbHlnb25cIj09PWU/cG9seUludGVyc2VjdHNCb3godCxuKXx8bGluZUludGVyc2VjdHNCb3godCxuKTohMX1mdW5jdGlvbiBwb2x5SW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzBdLGVbMV0pKXx8cG9seUNvbnRhaW5zUG9pbnQodCxuZXcgUG9pbnQoZVswXSxlWzNdKSl8fHBvbHlDb250YWluc1BvaW50KHQsbmV3IFBvaW50KGVbMl0sZVsxXSkpfHxwb2x5Q29udGFpbnNQb2ludCh0LG5ldyBQb2ludChlWzJdLGVbM10pKT8hMDpsaW5lSW50ZXJzZWN0c0JveCh0LGUpfWZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wLGk9ci5sZW5ndGgtMTtvPHIubGVuZ3RoO2k9bysrKXt2YXIgcz1yW29dLGE9cltpXSx1PW5ldyBQb2ludChzLnkscy54KSxsPW5ldyBQb2ludChhLnksYS54KTtpZihzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwocyxhLGVbMF0sZVsyXSxlWzFdKXx8c2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHMsYSxlWzBdLGVbMl0sZVszXSl8fHNlZ21lbnRDcm9zc2VzSG9yaXpvbnRhbCh1LGwsZVsxXSxlWzNdLGVbMF0pfHxzZWdtZW50Q3Jvc3Nlc0hvcml6b250YWwodSxsLGVbMV0sZVszXSxlWzJdKSlyZXR1cm4hMH1yZXR1cm4gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl9ZnVuY3Rpb24gc2VnbWVudENyb3NzZXNIb3Jpem9udGFsKHQsZSxuLHIsbyl7aWYoZS55PT09dC55KXJldHVybiBlLnk9PT1vJiZNYXRoLm1pbih0LngsZS54KTw9ciYmTWF0aC5tYXgodC54LGUueCk+PW47dmFyIGk9KG8tdC55KS8oZS55LXQueSkscz10LngraSooZS54LXQueCk7cmV0dXJuIHM+PW4mJnI+PXMmJjE+PWkmJmk+PTB9ZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQm94KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPXRbbl0sbz0wO288ci5sZW5ndGg7bysrKWlmKHJbb10ueD49ZVswXSYmcltvXS55Pj1lWzFdJiZyW29dLng8PWVbMl0mJnJbb10ueTw9ZVszXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBnZW9tZXRyeUNvbnRhaW5zUG9pbnQodCxlLG4scil7cmV0dXJuXCJQb2ludFwiPT09ZT9wb2ludENvbnRhaW5zUG9pbnQodCxuLHIpOlwiTGluZVN0cmluZ1wiPT09ZT9saW5lQ29udGFpbnNQb2ludCh0LG4scik6XCJQb2x5Z29uXCI9PT1lP3BvbHlDb250YWluc1BvaW50KHQsbil8fGxpbmVDb250YWluc1BvaW50KHQsbixyKTohMX1mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZCh0LGUsbil7dmFyIHI9ZS5kaXN0U3FyKG4pO2lmKDA9PT1yKXJldHVybiB0LmRpc3RTcXIoZSk7dmFyIG89KCh0LngtZS54KSoobi54LWUueCkrKHQueS1lLnkpKihuLnktZS55KSkvcjtyZXR1cm4gMD5vP3QuZGlzdFNxcihlKTpvPjE/dC5kaXN0U3FyKG4pOnQuZGlzdFNxcihuLnN1YihlKS5fbXVsdChvKS5fYWRkKGUpKX1mdW5jdGlvbiBsaW5lQ29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0xO3M8aS5sZW5ndGg7cysrKXt2YXIgYT1pW3MtMV0sdT1pW3NdO2lmKGRpc3RUb1NlZ21lbnRTcXVhcmVkKGUsYSx1KTxyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHBvbHlDb250YWluc1BvaW50KHQsZSl7Zm9yKHZhciBuLHIsbyxpPSExLHM9MDtzPHQubGVuZ3RoO3MrKyl7bj10W3NdO2Zvcih2YXIgYT0wLHU9bi5sZW5ndGgtMTthPG4ubGVuZ3RoO3U9YSsrKXI9blthXSxvPW5bdV0sci55PmUueSE9by55PmUueSYmZS54PChvLngtci54KSooZS55LXIueSkvKG8ueS1yLnkpK3IueCYmKGk9IWkpfXJldHVybiBpfWZ1bmN0aW9uIHBvaW50Q29udGFpbnNQb2ludCh0LGUsbil7Zm9yKHZhciByPW4qbixvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKHZhciBpPXRbb10scz0wO3M8aS5sZW5ndGg7cysrKWlmKGlbc10uZGlzdFNxcihlKTw9cilyZXR1cm4hMDtyZXR1cm4hMX12YXIgcmJ1c2g9cmVxdWlyZShcInJidXNoXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSx2dD1yZXF1aXJlKFwidmVjdG9yLXRpbGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUZlYXR1cmVUcmVlLEZlYXR1cmVUcmVlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlLG4pe3QubGF5ZXJzPWUsdC5mZWF0dXJlPW4sdGhpcy50b0JlSW5zZXJ0ZWQucHVzaCh0KX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLl9sb2FkPWZ1bmN0aW9uKCl7dGhpcy5ydHJlZS5sb2FkKHRoaXMudG9CZUluc2VydGVkKSx0aGlzLnRvQmVJbnNlcnRlZD1bXX0sRmVhdHVyZVRyZWUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSl7dGhpcy50b0JlSW5zZXJ0ZWQubGVuZ3RoJiZ0aGlzLl9sb2FkKCk7dmFyIG4scixvPXQucGFyYW1zfHx7fSxpPXQueCxzPXQueSxhPVtdO1widW5kZWZpbmVkXCIhPXR5cGVvZiBpJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygcz8obj0oby5yYWRpdXN8fDApKih0LnRpbGVFeHRlbnR8fDQwOTYpL3Quc2NhbGUscj1baS1uLHMtbixpK24scytuXSk6cj1bdC5taW5YLHQubWluWSx0Lm1heFgsdC5tYXhZXTtmb3IodmFyIHU9dGhpcy5ydHJlZS5zZWFyY2gociksbD0wO2w8dS5sZW5ndGg7bCsrKXt2YXIgeT11W2xdLmZlYXR1cmUseD11W2xdLmxheWVycyxmPXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3kudHlwZV07aWYoKCFvLiR0eXBlfHxmPT09by4kdHlwZSkmJighbnx8Z2VvbWV0cnlDb250YWluc1BvaW50KHkubG9hZEdlb21ldHJ5KCksZixuZXcgUG9pbnQoaSxzKSxuKSkmJmdlb21ldHJ5SW50ZXJzZWN0c0JveCh5LmxvYWRHZW9tZXRyeSgpLGYscikpe3ZhciBoPXkudG9HZW9KU09OKHRoaXMueCx0aGlzLnksdGhpcy56KTtvLmluY2x1ZGVHZW9tZXRyeXx8KGguZ2VvbWV0cnk9bnVsbCk7Zm9yKHZhciBkPTA7ZDx4Lmxlbmd0aDtkKyspe3ZhciBnPXhbZF07by5sYXllcklkcyYmby5sYXllcklkcy5pbmRleE9mKGcpPDB8fGEucHVzaCh1dGlsLmV4dGVuZCh7bGF5ZXI6Z30saCkpfX19ZShudWxsLGEpfTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJyYnVzaFwiOjEzOSxcInZlY3Rvci10aWxlXCI6MTQ0fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gRmlsbEJ1Y2tldChlKXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5maWxsVmVydGV4LGUuZmlsbEVsZW1lbnQsZS5vdXRsaW5lRWxlbWVudCl9dmFyIEVsZW1lbnRHcm91cHM9cmVxdWlyZShcIi4vZWxlbWVudF9ncm91cHNcIik7bW9kdWxlLmV4cG9ydHM9RmlsbEJ1Y2tldCxGaWxsQnVja2V0LnByb3RvdHlwZS5hZGRGZWF0dXJlcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmZlYXR1cmVzLHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIGw9ZVt0XSxyPWwubG9hZEdlb21ldHJ5KCk7ciYmdGhpcy5hZGRGZWF0dXJlKHIpfX0sRmlsbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLmFkZEZpbGwoZVt0XSl9LEZpbGxCdWNrZXQucHJvdG90eXBlLmFkZEZpbGw9ZnVuY3Rpb24oZSl7aWYoIShlLmxlbmd0aDwzKSl7dmFyIHQ9ZS5sZW5ndGg7dGhpcy5lbGVtZW50R3JvdXBzLm1ha2VSb29tRm9yKHQrMSk7Zm9yKHZhciBsLHIsbixpPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LG89dGhpcy5idWZmZXJzLmZpbGxWZXJ0ZXgsdT10aGlzLmJ1ZmZlcnMuZmlsbEVsZW1lbnQscz10aGlzLmJ1ZmZlcnMub3V0bGluZUVsZW1lbnQsZD1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxhPTA7YTxlLmxlbmd0aDthKyspcj1vLmluZGV4LWkudmVydGV4U3RhcnRJbmRleCxuPWVbYV0sby5hZGQobi54LG4ueSksaS52ZXJ0ZXhMZW5ndGgrKyxhPj0yJiYobi54IT09ZVswXS54fHxuLnkhPT1lWzBdLnkpJiYodS5hZGQoZCxsLHIpLGkuZWxlbWVudExlbmd0aCsrKSxhPj0xJiYocy5hZGQobCxyKSxpLnNlY29uZEVsZW1lbnRMZW5ndGgrKyksbD1yfX07XG59LHtcIi4vZWxlbWVudF9ncm91cHNcIjoxNH1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVCdWNrZXQoZSx0KXt0aGlzLmJ1ZmZlcnM9ZSx0aGlzLmVsZW1lbnRHcm91cHM9bmV3IEVsZW1lbnRHcm91cHMoZS5saW5lVmVydGV4LGUubGluZUVsZW1lbnQpLHRoaXMubGF5b3V0UHJvcGVydGllcz10fXZhciBFbGVtZW50R3JvdXBzPXJlcXVpcmUoXCIuL2VsZW1lbnRfZ3JvdXBzXCIpO21vZHVsZS5leHBvcnRzPUxpbmVCdWNrZXQsTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5mZWF0dXJlcyx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0saT1yLmxvYWRHZW9tZXRyeSgpO2kmJnRoaXMuYWRkRmVhdHVyZShpKX19LExpbmVCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxyPTA7cjxlLmxlbmd0aDtyKyspdGhpcy5hZGRMaW5lKGVbcl0sdFtcImxpbmUtam9pblwiXSx0W1wibGluZS1jYXBcIl0sdFtcImxpbmUtbWl0ZXItbGltaXRcIl0sdFtcImxpbmUtcm91bmQtbGltaXRcIl0pfSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKGUsdCxyLGkscyl7Zm9yKHZhciBuPWUubGVuZ3RoO24+MiYmZVtuLTFdLmVxdWFscyhlW24tMl0pOyluLS07aWYoIShlLmxlbmd0aDwyKSl7XCJiZXZlbFwiPT09dCYmKGk9MS4wNSk7dmFyIHU9ZVswXSxoPWVbbi0xXSxkPXUuZXF1YWxzKGgpO2lmKHRoaXMuZWxlbWVudEdyb3Vwcy5tYWtlUm9vbUZvcigxMCpuKSwyIT09bnx8IWQpe3ZhciBhLGwsbyxmLG0scCx4LHY9cixjPWQ/XCJidXR0XCI6cixWPTEsYj0wLF89ITA7dGhpcy5lMT10aGlzLmUyPXRoaXMuZTM9LTEsZCYmKGE9ZVtuLTJdLG09dS5zdWIoYSkuX3VuaXQoKS5fcGVycCgpKTtmb3IodmFyIHk9MDtuPnk7eSsrKWlmKG89ZCYmeT09PW4tMT9lWzFdOmVbeSsxXSwhb3x8IWVbeV0uZXF1YWxzKG8pKXttJiYoZj1tKSxhJiYobD1hKSxhPWVbeV0sbCYmKGIrPWEuZGlzdChsKSksbT1vP28uc3ViKGEpLl91bml0KCkuX3BlcnAoKTpmLGY9Znx8bTt2YXIgTD1mLmFkZChtKS5fdW5pdCgpLEM9TC54Km0ueCtMLnkqbS55LGc9MS9DLGs9bCYmbyxHPWs/dDpvP3Y6YztpZihrJiZcInJvdW5kXCI9PT1HJiYocz5nP0c9XCJtaXRlclwiOjI+PWcmJihHPVwiZmFrZXJvdW5kXCIpKSxcIm1pdGVyXCI9PT1HJiZnPmkmJihHPVwiYmV2ZWxcIiksXCJiZXZlbFwiPT09RyYmKGc+MiYmKEc9XCJmbGlwYmV2ZWxcIiksaT5nJiYoRz1cIm1pdGVyXCIpKSxcIm1pdGVyXCI9PT1HKUwuX211bHQoZyksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLEwsMCwwLCExKTtlbHNlIGlmKFwiZmxpcGJldmVsXCI9PT1HKXtpZihnPjEwMClMPW0uY2xvbmUoKTtlbHNle3ZhciBCPWYueCptLnktZi55Km0ueD4wPy0xOjEscT1nKmYuYWRkKG0pLm1hZygpL2Yuc3ViKG0pLm1hZygpO0wuX3BlcnAoKS5fbXVsdChxKkIpfXRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixMLDAsMCwhMSksVj0tVn1lbHNlIGlmKFwiYmV2ZWxcIj09PUd8fFwiZmFrZXJvdW5kXCI9PT1HKXt2YXIgUD1WKihmLngqbS55LWYueSptLngpPjAsUz0tTWF0aC5zcXJ0KGcqZy0xKTtpZihQPyh4PTAscD1TKToocD0wLHg9UyksX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYscCx4LCExKSxcImZha2Vyb3VuZFwiPT09Ryl7Zm9yKHZhciBFLEY9TWF0aC5mbG9vcig4KiguNS0oQy0uNSkpKSxJPTA7Rj5JO0krKylFPW0ubXVsdCgoSSsxKS8oRisxKSkuX2FkZChmKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKTt0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGEsVixiLEwsUCk7Zm9yKHZhciBNPUYtMTtNPj0wO00tLSlFPWYubXVsdCgoTSsxKS8oRisxKSkuX2FkZChtKS5fdW5pdCgpLHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoYSxWLGIsRSxQKX1vJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwtcCwteCwhMSl9ZWxzZVwiYnV0dFwiPT09Rz8oX3x8dGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMCwwLCExKSxvJiZ0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoYSxWLGIsbSwwLDAsITEpKTpcInNxdWFyZVwiPT09Rz8oX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDEsMSwhMSksdGhpcy5lMT10aGlzLmUyPS0xLFY9MSksbyYmdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITEpKTpcInJvdW5kXCI9PT1HJiYoX3x8KHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixmLDAsMCwhMSksdGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLGYsMSwxLCEwKSx0aGlzLmUxPXRoaXMuZTI9LTEsVj0xKSxvJiYodGhpcy5hZGRDdXJyZW50VmVydGV4KGEsVixiLG0sLTEsLTEsITApLHRoaXMuYWRkQ3VycmVudFZlcnRleChhLFYsYixtLDAsMCwhMSkpKTtfPSExfX19fSxMaW5lQnVja2V0LnByb3RvdHlwZS5hZGRDdXJyZW50VmVydGV4PWZ1bmN0aW9uKGUsdCxyLGkscyxuLHUpe3ZhciBoLGQ9dT8xOjAsYT10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCxsPXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxvPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGY9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleDtoPWkubXVsdCh0KSxzJiZoLl9zdWIoaS5wZXJwKCkuX211bHQocykpLHRoaXMuZTM9YS5hZGQoZSxoLGQsMCxyKS1mLHRoaXMuZTE+PTAmJnRoaXMuZTI+PTAmJihsLmFkZCh0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksby5lbGVtZW50TGVuZ3RoKyspLHRoaXMuZTE9dGhpcy5lMix0aGlzLmUyPXRoaXMuZTMsaD1pLm11bHQoLXQpLG4mJmguX3N1YihpLnBlcnAoKS5fbXVsdChuKSksdGhpcy5lMz1hLmFkZChlLGgsZCwxLHIpLWYsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKGwuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxvLmVsZW1lbnRMZW5ndGgrKyksdGhpcy5lMT10aGlzLmUyLHRoaXMuZTI9dGhpcy5lMyxvLnZlcnRleExlbmd0aCs9Mn0sTGluZUJ1Y2tldC5wcm90b3R5cGUuYWRkUGllU2xpY2VWZXJ0ZXg9ZnVuY3Rpb24oZSx0LHIsaSxzKXt2YXIgbj10aGlzLmJ1ZmZlcnMubGluZVZlcnRleCx1PXRoaXMuYnVmZmVycy5saW5lRWxlbWVudCxoPXRoaXMuZWxlbWVudEdyb3Vwcy5jdXJyZW50LGQ9dGhpcy5lbGVtZW50R3JvdXBzLmN1cnJlbnQudmVydGV4U3RhcnRJbmRleCxhPXM7aT1pLm11bHQodCoocz8tMToxKSksdGhpcy5lMz1uLmFkZChlLGksMCxhLHIpLWQsaC52ZXJ0ZXhMZW5ndGgrPTEsdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKHUuYWRkKHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxoLmVsZW1lbnRMZW5ndGgrKykscz90aGlzLmUyPXRoaXMuZTM6dGhpcy5lMT10aGlzLmUzfTtcbn0se1wiLi9lbGVtZW50X2dyb3Vwc1wiOjE0fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ltYm9sQnVja2V0KGUsdCxvLGkscyl7dGhpcy5idWZmZXJzPWUsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzPXQsdGhpcy5vdmVyc2NhbGluZz1vLHRoaXMuem9vbT1pLHRoaXMuY29sbGlzaW9uRGVidWc9czt2YXIgbj01MTIqbyxhPTQwOTY7dGhpcy50aWxlUGl4ZWxSYXRpbz1hL24sdGhpcy5jb21wYXJlVGV4dD17fSx0aGlzLnN5bWJvbEluc3RhbmNlcz1bXX1mdW5jdGlvbiBTeW1ib2xJbnN0YW5jZShlLHQsbyxpLHMsbixhLGwscixjLGgsdSl7dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuaGFzVGV4dD0hIW8sdGhpcy5oYXNJY29uPSEhaSx0aGlzLmhhc1RleHQmJih0aGlzLmdseXBoUXVhZHM9bj9nZXRHbHlwaFF1YWRzKGUsbyxhLHQscyxyKTpbXSx0aGlzLnRleHRDb2xsaXNpb25GZWF0dXJlPW5ldyBDb2xsaXNpb25GZWF0dXJlKHQsZSxvLGEsbCxyKSksdGhpcy5oYXNJY29uJiYodGhpcy5pY29uUXVhZHM9bj9nZXRJY29uUXVhZHMoZSxpLGMsdCxzLHUpOltdLHRoaXMuaWNvbkNvbGxpc2lvbkZlYXR1cmU9bmV3IENvbGxpc2lvbkZlYXR1cmUodCxlLGksYyxoLHUpKX12YXIgRWxlbWVudEdyb3Vwcz1yZXF1aXJlKFwiLi9lbGVtZW50X2dyb3Vwc1wiKSxBbmNob3I9cmVxdWlyZShcIi4uL3N5bWJvbC9hbmNob3JcIiksZ2V0QW5jaG9ycz1yZXF1aXJlKFwiLi4vc3ltYm9sL2dldF9hbmNob3JzXCIpLHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIiksUXVhZHM9cmVxdWlyZShcIi4uL3N5bWJvbC9xdWFkc1wiKSxTaGFwaW5nPXJlcXVpcmUoXCIuLi9zeW1ib2wvc2hhcGluZ1wiKSxyZXNvbHZlVGV4dD1yZXF1aXJlKFwiLi4vc3ltYm9sL3Jlc29sdmVfdGV4dFwiKSxyZXNvbHZlSWNvbnM9cmVxdWlyZShcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCIpLG1lcmdlTGluZXM9cmVxdWlyZShcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCIpLHNoYXBlVGV4dD1TaGFwaW5nLnNoYXBlVGV4dCxzaGFwZUljb249U2hhcGluZy5zaGFwZUljb24sZ2V0R2x5cGhRdWFkcz1RdWFkcy5nZXRHbHlwaFF1YWRzLGdldEljb25RdWFkcz1RdWFkcy5nZXRJY29uUXVhZHMsY2xpcExpbmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jbGlwX2xpbmVcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvbGxpc2lvbkZlYXR1cmU9cmVxdWlyZShcIi4uL3N5bWJvbC9jb2xsaXNpb25fZmVhdHVyZVwiKTttb2R1bGUuZXhwb3J0cz1TeW1ib2xCdWNrZXQsU3ltYm9sQnVja2V0LnByb3RvdHlwZS5uZWVkc1BsYWNlbWVudD0hMCxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGF5b3V0UHJvcGVydGllcyxvPXRoaXMuZmVhdHVyZXMsaT10aGlzLnRleHRGZWF0dXJlcyxzPS41LG49LjU7c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwicmlnaHRcIjpjYXNlXCJ0b3AtcmlnaHRcIjpjYXNlXCJib3R0b20tcmlnaHRcIjpzPTE7YnJlYWs7Y2FzZVwibGVmdFwiOmNhc2VcInRvcC1sZWZ0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpzPTB9c3dpdGNoKHRbXCJ0ZXh0LWFuY2hvclwiXSl7Y2FzZVwiYm90dG9tXCI6Y2FzZVwiYm90dG9tLXJpZ2h0XCI6Y2FzZVwiYm90dG9tLWxlZnRcIjpuPTE7YnJlYWs7Y2FzZVwidG9wXCI6Y2FzZVwidG9wLXJpZ2h0XCI6Y2FzZVwidG9wLWxlZnRcIjpuPTB9Zm9yKHZhciBhPVwicmlnaHRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MTpcImxlZnRcIj09PXRbXCJ0ZXh0LWp1c3RpZnlcIl0/MDouNSxsPTI0LHI9dFtcInRleHQtbGluZS1oZWlnaHRcIl0qbCxjPVwibGluZVwiIT09dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0/dFtcInRleHQtbWF4LXdpZHRoXCJdKmw6MCxoPXRbXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCJdKmwsdT1bdFtcInRleHQtb2Zmc2V0XCJdWzBdKmwsdFtcInRleHQtb2Zmc2V0XCJdWzFdKmxdLG09dFtcInRleHQtZm9udFwiXS5qb2luKFwiLFwiKSxwPVtdLHg9MDt4PG8ubGVuZ3RoO3grKylwLnB1c2gob1t4XS5sb2FkR2VvbWV0cnkoKSk7aWYoXCJsaW5lXCI9PT10W1wic3ltYm9sLXBsYWNlbWVudFwiXSl7dmFyIHk9bWVyZ2VMaW5lcyhvLGkscCk7cD15Lmdlb21ldHJpZXMsbz15LmZlYXR1cmVzLGk9eS50ZXh0RmVhdHVyZXN9Zm9yKHZhciBkLGcsZj0wO2Y8by5sZW5ndGg7ZisrKWlmKHBbZl0pe2lmKGQ9aVtmXT9zaGFwZVRleHQoaVtmXSx0aGlzLnN0YWNrc1ttXSxjLHIscyxuLGEsaCx1KTpudWxsLHRbXCJpY29uLWltYWdlXCJdKXt2YXIgYj1yZXNvbHZlVG9rZW5zKG9bZl0ucHJvcGVydGllcyx0W1wiaWNvbi1pbWFnZVwiXSksdj10aGlzLmljb25zW2JdO2c9c2hhcGVJY29uKHYsdCksdiYmKHZvaWQgMD09PXRoaXMuc2RmSWNvbnM/dGhpcy5zZGZJY29ucz12LnNkZjp0aGlzLnNkZkljb25zIT09di5zZGYmJmNvbnNvbGUud2FybihcIlN0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWNrZXRcIikpfWVsc2UgZz1udWxsOyhkfHxnKSYmdGhpcy5hZGRGZWF0dXJlKHBbZl0sZCxnKX10aGlzLnBsYWNlRmVhdHVyZXMoZSx0aGlzLmJ1ZmZlcnMsdGhpcy5jb2xsaXNpb25EZWJ1Zyl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5sYXlvdXRQcm9wZXJ0aWVzLHM9MjQsbj1pW1widGV4dC1zaXplXCJdL3MsYT10aGlzLnRpbGVQaXhlbFJhdGlvKm4sbD10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJ0ZXh0LW1heC1zaXplXCJdL3Mscj10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJpY29uLXNpemVcIl0sYz10aGlzLnRpbGVQaXhlbFJhdGlvKmlbXCJzeW1ib2wtc3BhY2luZ1wiXSxoPWlbXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0sdT1pW1widGV4dC1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8sbT1pW1wiaWNvbi1wYWRkaW5nXCJdKnRoaXMudGlsZVBpeGVsUmF0aW8scD1pW1widGV4dC1tYXgtYW5nbGVcIl0vMTgwKk1hdGguUEkseD1cIm1hcFwiPT09aVtcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHk9XCJtYXBcIj09PWlbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSYmXCJsaW5lXCI9PT1pW1wic3ltYm9sLXBsYWNlbWVudFwiXSxkPWlbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fGlbXCJpY29uLWFsbG93LW92ZXJsYXBcIl18fGlbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl18fGlbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0sZz1cImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLGY9Yy8yO2cmJihlPWNsaXBMaW5lKGUsMCwwLDQwOTYsNDA5NikpO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWZvcih2YXIgdj1lW2JdLEk9Zz9nZXRBbmNob3JzKHYsYyxwLHQsbyxzLGwsdGhpcy5vdmVyc2NhbGluZyk6W25ldyBBbmNob3IodlswXS54LHZbMF0ueSwwKV0sUz0wLEY9SS5sZW5ndGg7Rj5TO1MrKyl7dmFyIFA9SVtTXTtpZighKHQmJmcmJnRoaXMuYW5jaG9ySXNUb29DbG9zZSh0LnRleHQsZixQKSkpe3ZhciBNPSEoUC54PDB8fFAueD40MDk2fHxQLnk8MHx8UC55PjQwOTYpO2lmKCFofHxNKXt2YXIgaz1NfHxkO3RoaXMuc3ltYm9sSW5zdGFuY2VzLnB1c2gobmV3IFN5bWJvbEluc3RhbmNlKFAsdix0LG8saSxrLGEsdSx4LHIsbSx5KSl9fX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYW5jaG9ySXNUb29DbG9zZT1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5jb21wYXJlVGV4dDtpZihlIGluIGkpe2Zvcih2YXIgcz1pW2VdLG49cy5sZW5ndGgtMTtuPj0wO24tLSlpZihvLmRpc3Qoc1tuXSk8dClyZXR1cm4hMH1lbHNlIGlbZV09W107cmV0dXJuIGlbZV0ucHVzaChvKSwhMX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5wbGFjZUZlYXR1cmVzPWZ1bmN0aW9uKGUsdCxvKXt0aGlzLmJ1ZmZlcnM9dDt2YXIgaT10aGlzLmVsZW1lbnRHcm91cHM9e3RleHQ6bmV3IEVsZW1lbnRHcm91cHModC5nbHlwaFZlcnRleCx0LmdseXBoRWxlbWVudCksaWNvbjpuZXcgRWxlbWVudEdyb3Vwcyh0Lmljb25WZXJ0ZXgsdC5pY29uRWxlbWVudCksc2RmSWNvbnM6dGhpcy5zZGZJY29uc30scz10aGlzLmxheW91dFByb3BlcnRpZXMsbj1lLm1heFNjYWxlO2kudGV4dFtcInRleHQtc2l6ZVwiXT1zW1widGV4dC1zaXplXCJdLGkuaWNvbltcImljb24tc2l6ZVwiXT1zW1wiaWNvbi1zaXplXCJdO3ZhciBhPVwibWFwXCI9PT1zW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09c1tcInN5bWJvbC1wbGFjZW1lbnRcIl0sbD1cIm1hcFwiPT09c1tcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PXNbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHI9c1tcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8c1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXXx8c1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8c1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXTtpZihyKXt2YXIgYz1lLmFuZ2xlLGg9TWF0aC5zaW4oYyksdT1NYXRoLmNvcyhjKTt0aGlzLnN5bWJvbEluc3RhbmNlcy5zb3J0KGZ1bmN0aW9uKGUsdCl7dmFyIG89aCplLngrdSplLnksaT1oKnQueCt1KnQueTtyZXR1cm4gaS1vfSl9Zm9yKHZhciBtPTA7bTx0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7bSsrKXt2YXIgcD10aGlzLnN5bWJvbEluc3RhbmNlc1ttXSx4PXAuaGFzVGV4dCx5PXAuaGFzSWNvbixkPXNbXCJ0ZXh0LW9wdGlvbmFsXCJdfHwheCxnPXNbXCJpY29uLW9wdGlvbmFsXCJdfHwheSxmPXgmJiFzW1widGV4dC1hbGxvdy1vdmVybGFwXCJdP2UucGxhY2VDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUpOmUubWluU2NhbGUsYj15JiYhc1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXT9lLnBsYWNlQ29sbGlzaW9uRmVhdHVyZShwLmljb25Db2xsaXNpb25GZWF0dXJlKTplLm1pblNjYWxlO2R8fGc/IWcmJmY/Zj1NYXRoLm1heChiLGYpOiFkJiZiJiYoYj1NYXRoLm1heChiLGYpKTpiPWY9TWF0aC5tYXgoYixmKSx4JiYoc1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAudGV4dENvbGxpc2lvbkZlYXR1cmUsZiksbj49ZiYmdGhpcy5hZGRTeW1ib2xzKHQuZ2x5cGhWZXJ0ZXgsdC5nbHlwaEVsZW1lbnQsaS50ZXh0LHAuZ2x5cGhRdWFkcyxmLHNbXCJ0ZXh0LWtlZXAtdXByaWdodFwiXSxhLGUuYW5nbGUpKSx5JiYoc1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXXx8ZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKHAuaWNvbkNvbGxpc2lvbkZlYXR1cmUsYiksbj49YiYmdGhpcy5hZGRTeW1ib2xzKHQuaWNvblZlcnRleCx0Lmljb25FbGVtZW50LGkuaWNvbixwLmljb25RdWFkcyxiLHNbXCJpY29uLWtlZXAtdXByaWdodFwiXSxsLGUuYW5nbGUpKX1vJiZ0aGlzLmFkZFRvRGVidWdCdWZmZXJzKGUpfSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZFN5bWJvbHM9ZnVuY3Rpb24oZSx0LG8saSxzLG4sYSxsKXtvLm1ha2VSb29tRm9yKDQqaS5sZW5ndGgpO2Zvcih2YXIgcj1vLmN1cnJlbnQsYz10aGlzLnpvb20saD1NYXRoLm1heChNYXRoLmxvZyhzKS9NYXRoLkxOMitjLDApLHU9MDt1PGkubGVuZ3RoO3UrKyl7dmFyIG09aVt1XSxwPW0uYW5nbGUseD0ocCtsK01hdGguUEkpJSgyKk1hdGguUEkpO2lmKCEobiYmYSYmKHg8PU1hdGguUEkvMnx8eD4zKk1hdGguUEkvMikpKXt2YXIgeT1tLnRsLGQ9bS50cixnPW0uYmwsZj1tLmJyLGI9bS50ZXgsdj1tLmFuY2hvclBvaW50LEk9TWF0aC5tYXgoYytNYXRoLmxvZyhtLm1pblNjYWxlKS9NYXRoLkxOMixoKSxTPU1hdGgubWluKGMrTWF0aC5sb2cobS5tYXhTY2FsZSkvTWF0aC5MTjIsMjUpO2lmKCEoST49Uykpe0k9PT1oJiYoST0wKTt2YXIgRj1lLmluZGV4LXIudmVydGV4U3RhcnRJbmRleDtlLmFkZCh2Lngsdi55LHkueCx5LnksYi54LGIueSxJLFMsaCksZS5hZGQodi54LHYueSxkLngsZC55LGIueCtiLncsYi55LEksUyxoKSxlLmFkZCh2Lngsdi55LGcueCxnLnksYi54LGIueStiLmgsSSxTLGgpLGUuYWRkKHYueCx2LnksZi54LGYueSxiLngrYi53LGIueStiLmgsSSxTLGgpLHIudmVydGV4TGVuZ3RoKz00LHQuYWRkKEYsRisxLEYrMiksdC5hZGQoRisxLEYrMixGKzMpLHIuZWxlbWVudExlbmd0aCs9Mn19fX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXREZXBlbmRlbmNpZXM9ZnVuY3Rpb24oZSx0LG8pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGV8fHM/byhlKTp2b2lkKHM9ITApfXZhciBzPSExO3RoaXMuZ2V0VGV4dERlcGVuZGVuY2llcyhlLHQsaSksdGhpcy5nZXRJY29uRGVwZW5kZW5jaWVzKGUsdCxpKX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5nZXRJY29uRGVwZW5kZW5jaWVzPWZ1bmN0aW9uKGUsdCxvKXtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIGU/byhlKToodGhpcy5pY29ucz10LHZvaWQgbygpKX1pZih0aGlzLmxheW91dFByb3BlcnRpZXNbXCJpY29uLWltYWdlXCJdKXt2YXIgcz10aGlzLmZlYXR1cmVzLG49cmVzb2x2ZUljb25zKHMsdGhpcy5sYXlvdXRQcm9wZXJ0aWVzKTtuLmxlbmd0aD90LnNlbmQoXCJnZXQgaWNvbnNcIix7aWNvbnM6bn0saS5iaW5kKHRoaXMpKTpvKCl9ZWxzZSBvKCl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuZ2V0VGV4dERlcGVuZGVuY2llcz1mdW5jdGlvbihlLHQsbyl7dmFyIGk9dGhpcy5mZWF0dXJlcyxzPXRoaXMubGF5b3V0UHJvcGVydGllc1tcInRleHQtZm9udFwiXSxuPXRoaXMuc3RhY2tzPWUuc3RhY2tzO3ZvaWQgMD09PW5bc10mJihuW3NdPXt9KTt2YXIgYT1uW3NdLGw9cmVzb2x2ZVRleHQoaSx0aGlzLmxheW91dFByb3BlcnRpZXMsYSk7dGhpcy50ZXh0RmVhdHVyZXM9bC50ZXh0RmVhdHVyZXMsdC5zZW5kKFwiZ2V0IGdseXBoc1wiLHt1aWQ6ZS51aWQsZm9udHN0YWNrOnMsY29kZXBvaW50czpsLmNvZGVwb2ludHN9LGZ1bmN0aW9uKGUsdCl7aWYoZSlyZXR1cm4gbyhlKTtmb3IodmFyIGkgaW4gdClhW2ldPXRbaV07bygpfSl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnM9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveD1uZXcgRWxlbWVudEdyb3Vwcyh0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4KSx0aGlzLmVsZW1lbnRHcm91cHMuY29sbGlzaW9uQm94Lm1ha2VSb29tRm9yKDApO2Zvcih2YXIgdD10aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LG89LWUuYW5nbGUsaT1lLnlTdHJldGNoLHM9MDtzPHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDtzKyspZm9yKHZhciBuPTA7Mj5uO24rKyl7dmFyIGE9dGhpcy5zeW1ib2xJbnN0YW5jZXNbc11bMD09PW4/XCJ0ZXh0Q29sbGlzaW9uRmVhdHVyZVwiOlwiaWNvbkNvbGxpc2lvbkZlYXR1cmVcIl07aWYoYSlmb3IodmFyIGw9YS5ib3hlcyxyPTA7cjxsLmxlbmd0aDtyKyspe3ZhciBjPWxbcl0saD1jLmFuY2hvclBvaW50LHU9bmV3IFBvaW50KGMueDEsYy55MSppKS5fcm90YXRlKG8pLG09bmV3IFBvaW50KGMueDIsYy55MSppKS5fcm90YXRlKG8pLHA9bmV3IFBvaW50KGMueDEsYy55MippKS5fcm90YXRlKG8pLHg9bmV3IFBvaW50KGMueDIsYy55MippKS5fcm90YXRlKG8pLHk9TWF0aC5tYXgoMCxNYXRoLm1pbigyNSx0aGlzLnpvb20rTWF0aC5sb2coYy5tYXhTY2FsZSkvTWF0aC5MTjIpKSxkPU1hdGgubWF4KDAsTWF0aC5taW4oMjUsdGhpcy56b29tK01hdGgubG9nKGMucGxhY2VtZW50U2NhbGUpL01hdGguTE4yKSk7dC5hZGQoaCx1LHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCxtLHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCx4LHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCxwLHksZCksdC5hZGQoaCx1LHksZCksdGhpcy5lbGVtZW50R3JvdXBzLmNvbGxpc2lvbkJveC5jdXJyZW50LnZlcnRleExlbmd0aCs9OH19fTtcbn0se1wiLi4vc3ltYm9sL2FuY2hvclwiOjYyLFwiLi4vc3ltYm9sL2NsaXBfbGluZVwiOjY1LFwiLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlXCI6NjcsXCIuLi9zeW1ib2wvZ2V0X2FuY2hvcnNcIjo2OSxcIi4uL3N5bWJvbC9tZXJnZWxpbmVzXCI6NzIsXCIuLi9zeW1ib2wvcXVhZHNcIjo3MyxcIi4uL3N5bWJvbC9yZXNvbHZlX2ljb25zXCI6NzQsXCIuLi9zeW1ib2wvcmVzb2x2ZV90ZXh0XCI6NzUsXCIuLi9zeW1ib2wvc2hhcGluZ1wiOjc2LFwiLi4vdXRpbC90b2tlblwiOjEwNSxcIi4vZWxlbWVudF9ncm91cHNcIjoxNCxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29vcmRpbmF0ZShvLHQsbil7dGhpcy5jb2x1bW49byx0aGlzLnJvdz10LHRoaXMuem9vbT1ufW1vZHVsZS5leHBvcnRzPUNvb3JkaW5hdGUsQ29vcmRpbmF0ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLHRoaXMucm93LHRoaXMuem9vbSl9LHpvb21UbzpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8obyl9LHN1YjpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIobyl9LF96b29tVG86ZnVuY3Rpb24obyl7dmFyIHQ9TWF0aC5wb3coMixvLXRoaXMuem9vbSk7cmV0dXJuIHRoaXMuY29sdW1uKj10LHRoaXMucm93Kj10LHRoaXMuem9vbT1vLHRoaXN9LF9zdWI6ZnVuY3Rpb24obyl7cmV0dXJuIG89by56b29tVG8odGhpcy56b29tKSx0aGlzLmNvbHVtbi09by5jb2x1bW4sdGhpcy5yb3ctPW8ucm93LHRoaXN9fTtcbn0se31dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExuZ0xhdCh0LG4pe2lmKGlzTmFOKHQpfHxpc05hTihuKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExuZ0xhdCBvYmplY3Q6IChcIit0K1wiLCBcIituK1wiKVwiKTtpZih0aGlzLmxuZz0rdCx0aGlzLmxhdD0rbix0aGlzLmxhdD45MHx8dGhpcy5sYXQ8LTkwKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MFwiKX1tb2R1bGUuZXhwb3J0cz1MbmdMYXQ7dmFyIHdyYXA9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKS53cmFwO0xuZ0xhdC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsLTE4MCwxODApLHRoaXMubGF0KX0sTG5nTGF0LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBMbmdMYXQ/dDpBcnJheS5pc0FycmF5KHQpP25ldyBMbmdMYXQodFswXSx0WzFdKTp0fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTG5nTGF0Qm91bmRzKHQsbil7aWYodClmb3IodmFyIGU9bj9bdCxuXTp0LHM9MCxpPWUubGVuZ3RoO2k+cztzKyspdGhpcy5leHRlbmQoZVtzXSl9bW9kdWxlLmV4cG9ydHM9TG5nTGF0Qm91bmRzO3ZhciBMbmdMYXQ9cmVxdWlyZShcIi4vbG5nX2xhdFwiKTtMbmdMYXRCb3VuZHMucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIG4sZSxzPXRoaXMuX3N3LGk9dGhpcy5fbmU7aWYodCBpbnN0YW5jZW9mIExuZ0xhdCluPXQsZT10O2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSlyZXR1cm4gdD90aGlzLmV4dGVuZChMbmdMYXQuY29udmVydCh0KXx8TG5nTGF0Qm91bmRzLmNvbnZlcnQodCkpOnRoaXM7aWYobj10Ll9zdyxlPXQuX25lLCFufHwhZSlyZXR1cm4gdGhpc31yZXR1cm4gc3x8aT8ocy5sbmc9TWF0aC5taW4obi5sbmcscy5sbmcpLHMubGF0PU1hdGgubWluKG4ubGF0LHMubGF0KSxpLmxuZz1NYXRoLm1heChlLmxuZyxpLmxuZyksaS5sYXQ9TWF0aC5tYXgoZS5sYXQsaS5sYXQpKToodGhpcy5fc3c9bmV3IExuZ0xhdChuLmxuZyxuLmxhdCksdGhpcy5fbmU9bmV3IExuZ0xhdChlLmxuZyxlLmxhdCkpLHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcrdGhpcy5fbmUubG5nKS8yLCh0aGlzLl9zdy5sYXQrdGhpcy5fbmUubGF0KS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSxnZXROb3J0aEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV9LGdldE5vcnRoV2VzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0Tm9ydGgoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0U291dGgoKSl9LGdldFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3cubG5nfSxnZXRTb3V0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdy5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmUubG5nfSxnZXROb3J0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZS5sYXR9fSxMbmdMYXRCb3VuZHMuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcz90Om5ldyBMbmdMYXRCb3VuZHModCl9O1xufSx7XCIuL2xuZ19sYXRcIjoyMH1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRyYW5zZm9ybSh0LGkpe3RoaXMudGlsZVNpemU9NTEyLHRoaXMuX21pblpvb209dHx8MCx0aGlzLl9tYXhab29tPWl8fDIyLHRoaXMubGF0UmFuZ2U9Wy04NS4wNTExMyw4NS4wNTExM10sdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy56b29tPTAsdGhpcy5jZW50ZXI9bmV3IExuZ0xhdCgwLDApLHRoaXMuYW5nbGU9MCx0aGlzLl9hbHRpdHVkZT0xLjUsdGhpcy5fcGl0Y2g9MH12YXIgTG5nTGF0PXJlcXVpcmUoXCIuL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENvb3JkaW5hdGU9cmVxdWlyZShcIi4vY29vcmRpbmF0ZVwiKSx3cmFwPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIikud3JhcCxpbnRlcnA9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksdmVjND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLnZlYzQsbWF0ND1yZXF1aXJlKFwiZ2wtbWF0cml4XCIpLm1hdDQ7bW9kdWxlLmV4cG9ydHM9VHJhbnNmb3JtLFRyYW5zZm9ybS5wcm90b3R5cGU9e2dldCBtaW5ab29tKCl7cmV0dXJuIHRoaXMuX21pblpvb219LHNldCBtaW5ab29tKHQpe3RoaXMuX21pblpvb209dCx0aGlzLnpvb209TWF0aC5tYXgodGhpcy56b29tLHQpfSxnZXQgbWF4Wm9vbSgpe3JldHVybiB0aGlzLl9tYXhab29tfSxzZXQgbWF4Wm9vbSh0KXt0aGlzLl9tYXhab29tPXQsdGhpcy56b29tPU1hdGgubWluKHRoaXMuem9vbSx0KX0sZ2V0IHdvcmxkU2l6ZSgpe3JldHVybiB0aGlzLnRpbGVTaXplKnRoaXMuc2NhbGV9LGdldCBjZW50ZXJQb2ludCgpe3JldHVybiB0aGlzLnNpemUuX2RpdigyKX0sZ2V0IHNpemUoKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxnZXQgYmVhcmluZygpe3JldHVybi10aGlzLmFuZ2xlL01hdGguUEkqMTgwfSxzZXQgYmVhcmluZyh0KXt0aGlzLmFuZ2xlPS13cmFwKHQsLTE4MCwxODApKk1hdGguUEkvMTgwfSxnZXQgcGl0Y2goKXtyZXR1cm4gdGhpcy5fcGl0Y2gvTWF0aC5QSSoxODB9LHNldCBwaXRjaCh0KXt0aGlzLl9waXRjaD1NYXRoLm1pbig2MCx0KS8xODAqTWF0aC5QSX0sZ2V0IGFsdGl0dWRlKCl7cmV0dXJuIHRoaXMuX2FsdGl0dWRlfSxzZXQgYWx0aXR1ZGUodCl7dGhpcy5fYWx0aXR1ZGU9TWF0aC5tYXgoLjc1LHQpfSxnZXQgem9vbSgpe3JldHVybiB0aGlzLl96b29tfSxzZXQgem9vbSh0KXt0PU1hdGgubWluKE1hdGgubWF4KHQsdGhpcy5taW5ab29tKSx0aGlzLm1heFpvb20pLHRoaXMuX3pvb209dCx0aGlzLnNjYWxlPXRoaXMuem9vbVNjYWxlKHQpLHRoaXMudGlsZVpvb209TWF0aC5mbG9vcih0KSx0aGlzLnpvb21GcmFjdGlvbj10LXRoaXMudGlsZVpvb20sdGhpcy5fY29uc3RyYWluKCl9LGdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5fY2VudGVyfSxzZXQgY2VudGVyKHQpe3RoaXMuX2NlbnRlcj10LHRoaXMuX2NvbnN0cmFpbigpfSx6b29tU2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsdCl9LHNjYWxlWm9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LHByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMubG5nWCh0LmxuZyxpKSx0aGlzLmxhdFkodC5sYXQsaSkpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IExuZ0xhdCh0aGlzLnhMbmcodC54LGkpLHRoaXMueUxhdCh0LnksaSkpfSxnZXQgeCgpe3JldHVybiB0aGlzLmxuZ1godGhpcy5jZW50ZXIubG5nKX0sZ2V0IHkoKXtyZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCl9LGdldCBwb2ludCgpe3JldHVybiBuZXcgUG9pbnQodGhpcy54LHRoaXMueSl9LGxuZ1g6ZnVuY3Rpb24odCxpKXtyZXR1cm4oMTgwK3QpKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSxsYXRZOmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwL01hdGguUEkqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K3QqTWF0aC5QSS8zNjApKTtyZXR1cm4oMTgwLW4pKihpfHx0aGlzLndvcmxkU2l6ZSkvMzYwfSx4TG5nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIDM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSktMTgwfSx5TGF0OmZ1bmN0aW9uKHQsaSl7dmFyIG49MTgwLTM2MCp0LyhpfHx0aGlzLndvcmxkU2l6ZSk7cmV0dXJuIDM2MC9NYXRoLlBJKk1hdGguYXRhbihNYXRoLmV4cChuKk1hdGguUEkvMTgwKSktOTB9LHBhbkJ5OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY2VudGVyUG9pbnQuX2FkZCh0KTt0aGlzLmNlbnRlcj10aGlzLnBvaW50TG9jYXRpb24oaSl9LHNldExvY2F0aW9uQXRQb2ludDpmdW5jdGlvbih0LGkpe3ZhciBuPXRoaXMubG9jYXRpb25Db29yZGluYXRlKHQpLG89dGhpcy5wb2ludENvb3JkaW5hdGUoaSksZT10aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KSxhPW8uX3N1YihuKTt0aGlzLmNlbnRlcj10aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihlLl9zdWIoYSkpfSxzZXRab29tQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLnpvb209dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxzZXRCZWFyaW5nQXJvdW5kOmZ1bmN0aW9uKHQsaSl7dmFyIG47aSYmKG49dGhpcy5sb2NhdGlvblBvaW50KGkpKSx0aGlzLmJlYXJpbmc9dCxpJiZ0aGlzLnNldExvY2F0aW9uQXRQb2ludChpLG4pfSxsb2NhdGlvblBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KSl9LHBvaW50TG9jYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQpKX0sbG9jYXRpb25Db29yZGluYXRlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuem9vbVNjYWxlKHRoaXMudGlsZVpvb20pL3RoaXMud29ybGRTaXplLG49TG5nTGF0LmNvbnZlcnQodCk7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMubG5nWChuLmxuZykqaSx0aGlzLmxhdFkobi5sYXQpKmksdGhpcy50aWxlWm9vbSl9LGNvb3JkaW5hdGVMb2NhdGlvbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLnpvb21TY2FsZSh0Lnpvb20pO3JldHVybiBuZXcgTG5nTGF0KHRoaXMueExuZyh0LmNvbHVtbixpKSx0aGlzLnlMYXQodC5yb3csaSkpfSxwb2ludENvb3JkaW5hdGU6ZnVuY3Rpb24odCxpKXt2b2lkIDA9PT1pJiYoaT0wKTt2YXIgbj10aGlzLmNvb3JkaW5hdGVQb2ludE1hdHJpeCh0aGlzLnRpbGVab29tKSxvPW1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLG4pO2lmKCFvKXRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO3ZhciBlPXZlYzQudHJhbnNmb3JtTWF0NChbXSxbdC54LHQueSwwLDFdLG8pLGE9dmVjNC50cmFuc2Zvcm1NYXQ0KFtdLFt0LngsdC55LDEsMV0sbykscj1lWzNdLGg9YVszXSxzPWVbMF0vcixjPWFbMF0vaCx1PWVbMV0vcixsPWFbMV0vaCxtPWVbMl0vcixnPWFbMl0vaCxmPW09PT1nPzA6KGktbSkvKGctbSk7cmV0dXJuIG5ldyBDb29yZGluYXRlKGludGVycChzLGMsZiksaW50ZXJwKHUsbCxmKSx0aGlzLnRpbGVab29tKX0sY29vcmRpbmF0ZVBvaW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY29vcmRpbmF0ZVBvaW50TWF0cml4KHQuem9vbSksbj12ZWM0LnRyYW5zZm9ybU1hdDQoW10sW3QuY29sdW1uLHQucm93LDAsMV0saSk7cmV0dXJuIG5ldyBQb2ludChuWzBdL25bM10sblsxXS9uWzNdKX0sY29vcmRpbmF0ZVBvaW50TWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0UHJvak1hdHJpeCgpLG49dGhpcy53b3JsZFNpemUvdGhpcy56b29tU2NhbGUodCk7cmV0dXJuIG1hdDQuc2NhbGUoaSxpLFtuLG4sMV0pLG1hdDQubXVsdGlwbHkoaSx0aGlzLmdldFBpeGVsTWF0cml4KCksaSksaX0sZ2V0UGl4ZWxNYXRyaXg6ZnVuY3Rpb24oKXt2YXIgdD1tYXQ0LmNyZWF0ZSgpO3JldHVybiBtYXQ0LnNjYWxlKHQsdCxbdGhpcy53aWR0aC8yLC10aGlzLmhlaWdodC8yLDFdKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzEsLTEsMF0pLHR9LF9jb25zdHJhaW46ZnVuY3Rpb24oKXtpZih0aGlzLmNlbnRlciYmdGhpcy53aWR0aCYmdGhpcy5oZWlnaHQmJiF0aGlzLl9jb25zdHJhaW5pbmcpe3RoaXMuX2NvbnN0cmFpbmluZz0hMDt2YXIgdCxpLG4sbyxlLGEscixoLHM9dGhpcy5zaXplO3RoaXMubGF0UmFuZ2UmJih0PXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKSxpPXRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzBdKSxlPWktdDxzLnk/cy55LyhpLXQpOjApLHRoaXMubG5nUmFuZ2UmJihuPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKSxvPXRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzFdKSxhPW8tbjxzLng/cy54LyhvLW4pOjApO3ZhciBjPU1hdGgubWF4KGF8fDAsZXx8MCk7aWYoYylyZXR1cm4gdGhpcy5jZW50ZXI9dGhpcy51bnByb2plY3QobmV3IFBvaW50KGE/KG8rbikvMjp0aGlzLngsZT8oaSt0KS8yOnRoaXMueSkpLHRoaXMuem9vbSs9dGhpcy5zY2FsZVpvb20oYyksdm9pZCh0aGlzLl9jb25zdHJhaW5pbmc9ITEpO2lmKHRoaXMubGF0UmFuZ2Upe3ZhciB1PXRoaXMueSxsPXMueS8yO3Q+dS1sJiYoaD10K2wpLHUrbD5pJiYoaD1pLWwpfWlmKHRoaXMubG5nUmFuZ2Upe3ZhciBtPXRoaXMueCxnPXMueC8yO24+bS1nJiYocj1uK2cpLG0rZz5vJiYocj1vLWcpfSh2b2lkIDAhPT1yfHx2b2lkIDAhPT1oKSYmKHRoaXMuY2VudGVyPXRoaXMudW5wcm9qZWN0KG5ldyBQb2ludCh2b2lkIDAhPT1yP3I6dGhpcy54LHZvaWQgMCE9PWg/aDp0aGlzLnkpKSksdGhpcy5fY29uc3RyYWluaW5nPSExfX0sZ2V0UHJvak1hdHJpeDpmdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDY0QXJyYXkoMTYpLGk9TWF0aC5hdGFuKC41L3RoaXMuYWx0aXR1ZGUpLG49TWF0aC5zaW4oaSkqdGhpcy5hbHRpdHVkZS9NYXRoLnNpbihNYXRoLlBJLzItdGhpcy5fcGl0Y2gtaSksbz1NYXRoLmNvcyhNYXRoLlBJLzItdGhpcy5fcGl0Y2gpKm4rdGhpcy5hbHRpdHVkZTtyZXR1cm4gbWF0NC5wZXJzcGVjdGl2ZSh0LDIqTWF0aC5hdGFuKHRoaXMuaGVpZ2h0LzIvdGhpcy5hbHRpdHVkZSksdGhpcy53aWR0aC90aGlzLmhlaWdodCwuMSxvKSxtYXQ0LnRyYW5zbGF0ZSh0LHQsWzAsMCwtdGhpcy5hbHRpdHVkZV0pLG1hdDQuc2NhbGUodCx0LFsxLC0xLDEvdGhpcy5oZWlnaHRdKSxtYXQ0LnJvdGF0ZVgodCx0LHRoaXMuX3BpdGNoKSxtYXQ0LnJvdGF0ZVoodCx0LHRoaXMuYW5nbGUpLG1hdDQudHJhbnNsYXRlKHQsdCxbLXRoaXMueCwtdGhpcy55LDBdKSx0fX07XG59LHtcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIjoxMDIsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2Nvb3JkaW5hdGVcIjoxOSxcIi4vbG5nX2xhdFwiOjIwLFwiZ2wtbWF0cml4XCI6MTE2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgc2ltcGxleEZvbnQ9e1wiIFwiOlsxNixbXV0sXCIhXCI6WzEwLFs1LDIxLDUsNywtMSwtMSw1LDIsNCwxLDUsMCw2LDEsNSwyXV0sJ1wiJzpbMTYsWzQsMjEsNCwxNCwtMSwtMSwxMiwyMSwxMiwxNF1dLFwiI1wiOlsyMSxbMTEsMjUsNCwtNywtMSwtMSwxNywyNSwxMCwtNywtMSwtMSw0LDEyLDE4LDEyLC0xLC0xLDMsNiwxNyw2XV0sJDpbMjAsWzgsMjUsOCwtNCwtMSwtMSwxMiwyNSwxMiwtNCwtMSwtMSwxNywxOCwxNSwyMCwxMiwyMSw4LDIxLDUsMjAsMywxOCwzLDE2LDQsMTQsNSwxMyw3LDEyLDEzLDEwLDE1LDksMTYsOCwxNyw2LDE3LDMsMTUsMSwxMiwwLDgsMCw1LDEsMywzXV0sXCIlXCI6WzI0LFsyMSwyMSwzLDAsLTEsLTEsOCwyMSwxMCwxOSwxMCwxNyw5LDE1LDcsMTQsNSwxNCwzLDE2LDMsMTgsNCwyMCw2LDIxLDgsMjEsMTAsMjAsMTMsMTksMTYsMTksMTksMjAsMjEsMjEsLTEsLTEsMTcsNywxNSw2LDE0LDQsMTQsMiwxNiwwLDE4LDAsMjAsMSwyMSwzLDIxLDUsMTksNywxNyw3XV0sXCImXCI6WzI2LFsyMywxMiwyMywxMywyMiwxNCwyMSwxNCwyMCwxMywxOSwxMSwxNyw2LDE1LDMsMTMsMSwxMSwwLDcsMCw1LDEsNCwyLDMsNCwzLDYsNCw4LDUsOSwxMiwxMywxMywxNCwxNCwxNiwxNCwxOCwxMywyMCwxMSwyMSw5LDIwLDgsMTgsOCwxNiw5LDEzLDExLDEwLDE2LDMsMTgsMSwyMCwwLDIyLDAsMjMsMSwyMywyXV0sXCInXCI6WzEwLFs1LDE5LDQsMjAsNSwyMSw2LDIwLDYsMTgsNSwxNiw0LDE1XV0sXCIoXCI6WzE0LFsxMSwyNSw5LDIzLDcsMjAsNSwxNiw0LDExLDQsNyw1LDIsNywtMiw5LC01LDExLC03XV0sXCIpXCI6WzE0LFszLDI1LDUsMjMsNywyMCw5LDE2LDEwLDExLDEwLDcsOSwyLDcsLTIsNSwtNSwzLC03XV0sXCIqXCI6WzE2LFs4LDIxLDgsOSwtMSwtMSwzLDE4LDEzLDEyLC0xLC0xLDEzLDE4LDMsMTJdXSxcIitcIjpbMjYsWzEzLDE4LDEzLDAsLTEsLTEsNCw5LDIyLDldXSxcIixcIjpbMTAsWzYsMSw1LDAsNCwxLDUsMiw2LDEsNiwtMSw1LC0zLDQsLTRdXSxcIi1cIjpbMjYsWzQsOSwyMiw5XV0sXCIuXCI6WzEwLFs1LDIsNCwxLDUsMCw2LDEsNSwyXV0sXCIvXCI6WzIyLFsyMCwyNSwyLC03XV0sMDpbMjAsWzksMjEsNiwyMCw0LDE3LDMsMTIsMyw5LDQsNCw2LDEsOSwwLDExLDAsMTQsMSwxNiw0LDE3LDksMTcsMTIsMTYsMTcsMTQsMjAsMTEsMjEsOSwyMV1dLDE6WzIwLFs2LDE3LDgsMTgsMTEsMjEsMTEsMF1dLDI6WzIwLFs0LDE2LDQsMTcsNSwxOSw2LDIwLDgsMjEsMTIsMjEsMTQsMjAsMTUsMTksMTYsMTcsMTYsMTUsMTUsMTMsMTMsMTAsMywwLDE3LDBdXSwzOlsyMCxbNSwyMSwxNiwyMSwxMCwxMywxMywxMywxNSwxMiwxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNDpbMjAsWzEzLDIxLDMsNywxOCw3LC0xLC0xLDEzLDIxLDEzLDBdXSw1OlsyMCxbMTUsMjEsNSwyMSw0LDEyLDUsMTMsOCwxNCwxMSwxNCwxNCwxMywxNiwxMSwxNyw4LDE3LDYsMTYsMywxNCwxLDExLDAsOCwwLDUsMSw0LDIsMyw0XV0sNjpbMjAsWzE2LDE4LDE1LDIwLDEyLDIxLDEwLDIxLDcsMjAsNSwxNyw0LDEyLDQsNyw1LDMsNywxLDEwLDAsMTEsMCwxNCwxLDE2LDMsMTcsNiwxNyw3LDE2LDEwLDE0LDEyLDExLDEzLDEwLDEzLDcsMTIsNSwxMCw0LDddXSw3OlsyMCxbMTcsMjEsNywwLC0xLC0xLDMsMjEsMTcsMjFdXSw4OlsyMCxbOCwyMSw1LDIwLDQsMTgsNCwxNiw1LDE0LDcsMTMsMTEsMTIsMTQsMTEsMTYsOSwxNyw3LDE3LDQsMTYsMiwxNSwxLDEyLDAsOCwwLDUsMSw0LDIsMyw0LDMsNyw0LDksNiwxMSw5LDEyLDEzLDEzLDE1LDE0LDE2LDE2LDE2LDE4LDE1LDIwLDEyLDIxLDgsMjFdXSw5OlsyMCxbMTYsMTQsMTUsMTEsMTMsOSwxMCw4LDksOCw2LDksNCwxMSwzLDE0LDMsMTUsNCwxOCw2LDIwLDksMjEsMTAsMjEsMTMsMjAsMTUsMTgsMTYsMTQsMTYsOSwxNSw0LDEzLDEsMTAsMCw4LDAsNSwxLDQsM11dLFwiOlwiOlsxMCxbNSwxNCw0LDEzLDUsMTIsNiwxMyw1LDE0LC0xLC0xLDUsMiw0LDEsNSwwLDYsMSw1LDJdXSxcIjtcIjpbMTAsWzUsMTQsNCwxMyw1LDEyLDYsMTMsNSwxNCwtMSwtMSw2LDEsNSwwLDQsMSw1LDIsNiwxLDYsLTEsNSwtMyw0LC00XV0sXCI8XCI6WzI0LFsyMCwxOCw0LDksMjAsMF1dLFwiPVwiOlsyNixbNCwxMiwyMiwxMiwtMSwtMSw0LDYsMjIsNl1dLFwiPlwiOlsyNCxbNCwxOCwyMCw5LDQsMF1dLFwiP1wiOlsxOCxbMywxNiwzLDE3LDQsMTksNSwyMCw3LDIxLDExLDIxLDEzLDIwLDE0LDE5LDE1LDE3LDE1LDE1LDE0LDEzLDEzLDEyLDksMTAsOSw3LC0xLC0xLDksMiw4LDEsOSwwLDEwLDEsOSwyXV0sXCJAXCI6WzI3LFsxOCwxMywxNywxNSwxNSwxNiwxMiwxNiwxMCwxNSw5LDE0LDgsMTEsOCw4LDksNiwxMSw1LDE0LDUsMTYsNiwxNyw4LC0xLC0xLDEyLDE2LDEwLDE0LDksMTEsOSw4LDEwLDYsMTEsNSwtMSwtMSwxOCwxNiwxNyw4LDE3LDYsMTksNSwyMSw1LDIzLDcsMjQsMTAsMjQsMTIsMjMsMTUsMjIsMTcsMjAsMTksMTgsMjAsMTUsMjEsMTIsMjEsOSwyMCw3LDE5LDUsMTcsNCwxNSwzLDEyLDMsOSw0LDYsNSw0LDcsMiw5LDEsMTIsMCwxNSwwLDE4LDEsMjAsMiwyMSwzLC0xLC0xLDE5LDE2LDE4LDgsMTgsNiwxOSw1XV0sQTpbMTgsWzksMjEsMSwwLC0xLC0xLDksMjEsMTcsMCwtMSwtMSw0LDcsMTQsN11dLEI6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDEzLDIxLDE2LDIwLDE3LDE5LDE4LDE3LDE4LDE1LDE3LDEzLDE2LDEyLDEzLDExLC0xLC0xLDQsMTEsMTMsMTEsMTYsMTAsMTcsOSwxOCw3LDE4LDQsMTcsMiwxNiwxLDEzLDAsNCwwXV0sQzpbMjEsWzE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDVdXSxEOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMSwyMSwxNCwyMCwxNiwxOCwxNywxNiwxOCwxMywxOCw4LDE3LDUsMTYsMywxNCwxLDExLDAsNCwwXV0sRTpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTcsMjEsLTEsLTEsNCwxMSwxMiwxMSwtMSwtMSw0LDAsMTcsMF1dLEY6WzE4LFs0LDIxLDQsMCwtMSwtMSw0LDIxLDE3LDIxLC0xLC0xLDQsMTEsMTIsMTFdXSxHOlsyMSxbMTgsMTYsMTcsMTgsMTUsMjAsMTMsMjEsOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOCw4LC0xLC0xLDEzLDgsMTgsOF1dLEg6WzIyLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSwxOCwwLC0xLC0xLDQsMTEsMTgsMTFdXSxJOls4LFs0LDIxLDQsMF1dLEo6WzE2LFsxMiwyMSwxMiw1LDExLDIsMTAsMSw4LDAsNiwwLDQsMSwzLDIsMiw1LDIsN11dLEs6WzIxLFs0LDIxLDQsMCwtMSwtMSwxOCwyMSw0LDcsLTEsLTEsOSwxMiwxOCwwXV0sTDpbMTcsWzQsMjEsNCwwLC0xLC0xLDQsMCwxNiwwXV0sTTpbMjQsWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTIsMCwtMSwtMSwyMCwyMSwxMiwwLC0xLC0xLDIwLDIxLDIwLDBdXSxOOlsyMixbNCwyMSw0LDAsLTEsLTEsNCwyMSwxOCwwLC0xLC0xLDE4LDIxLDE4LDBdXSxPOlsyMixbOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOSw4LDE5LDEzLDE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjFdXSxQOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNCwxNywxMiwxNiwxMSwxMywxMCw0LDEwXV0sUTpbMjIsWzksMjEsNywyMCw1LDE4LDQsMTYsMywxMywzLDgsNCw1LDUsMyw3LDEsOSwwLDEzLDAsMTUsMSwxNywzLDE4LDUsMTksOCwxOSwxMywxOCwxNiwxNywxOCwxNSwyMCwxMywyMSw5LDIxLC0xLC0xLDEyLDQsMTgsLTJdXSxSOlsyMSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMywyMSwxNiwyMCwxNywxOSwxOCwxNywxOCwxNSwxNywxMywxNiwxMiwxMywxMSw0LDExLC0xLC0xLDExLDExLDE4LDBdXSxTOlsyMCxbMTcsMTgsMTUsMjAsMTIsMjEsOCwyMSw1LDIwLDMsMTgsMywxNiw0LDE0LDUsMTMsNywxMiwxMywxMCwxNSw5LDE2LDgsMTcsNiwxNywzLDE1LDEsMTIsMCw4LDAsNSwxLDMsM11dLFQ6WzE2LFs4LDIxLDgsMCwtMSwtMSwxLDIxLDE1LDIxXV0sVTpbMjIsWzQsMjEsNCw2LDUsMyw3LDEsMTAsMCwxMiwwLDE1LDEsMTcsMywxOCw2LDE4LDIxXV0sVjpbMTgsWzEsMjEsOSwwLC0xLC0xLDE3LDIxLDksMF1dLFc6WzI0LFsyLDIxLDcsMCwtMSwtMSwxMiwyMSw3LDAsLTEsLTEsMTIsMjEsMTcsMCwtMSwtMSwyMiwyMSwxNywwXV0sWDpbMjAsWzMsMjEsMTcsMCwtMSwtMSwxNywyMSwzLDBdXSxZOlsxOCxbMSwyMSw5LDExLDksMCwtMSwtMSwxNywyMSw5LDExXV0sWjpbMjAsWzE3LDIxLDMsMCwtMSwtMSwzLDIxLDE3LDIxLC0xLC0xLDMsMCwxNywwXV0sXCJbXCI6WzE0LFs0LDI1LDQsLTcsLTEsLTEsNSwyNSw1LC03LC0xLC0xLDQsMjUsMTEsMjUsLTEsLTEsNCwtNywxMSwtN11dLFwiXFxcXFwiOlsxNCxbMCwyMSwxNCwtM11dLFwiXVwiOlsxNCxbOSwyNSw5LC03LC0xLC0xLDEwLDI1LDEwLC03LC0xLC0xLDMsMjUsMTAsMjUsLTEsLTEsMywtNywxMCwtN11dLFwiXlwiOlsxNixbNiwxNSw4LDE4LDEwLDE1LC0xLC0xLDMsMTIsOCwxNywxMywxMiwtMSwtMSw4LDE3LDgsMF1dLF86WzE2LFswLC0yLDE2LC0yXV0sXCJgXCI6WzEwLFs2LDIxLDUsMjAsNCwxOCw0LDE2LDUsMTUsNiwxNiw1LDE3XV0sYTpbMTksWzE1LDE0LDE1LDAsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGI6WzE5LFs0LDIxLDQsMCwtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxjOlsxOCxbMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGQ6WzE5LFsxNSwyMSwxNSwwLC0xLC0xLDE1LDExLDEzLDEzLDExLDE0LDgsMTQsNiwxMyw0LDExLDMsOCwzLDYsNCwzLDYsMSw4LDAsMTEsMCwxMywxLDE1LDNdXSxlOlsxOCxbMyw4LDE1LDgsMTUsMTAsMTQsMTIsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGY6WzEyLFsxMCwyMSw4LDIxLDYsMjAsNSwxNyw1LDAsLTEsLTEsMiwxNCw5LDE0XV0sZzpbMTksWzE1LDE0LDE1LC0yLDE0LC01LDEzLC02LDExLC03LDgsLTcsNiwtNiwtMSwtMSwxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0saDpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMTAsNywxMyw5LDE0LDEyLDE0LDE0LDEzLDE1LDEwLDE1LDBdXSxpOls4LFszLDIxLDQsMjAsNSwyMSw0LDIyLDMsMjEsLTEsLTEsNCwxNCw0LDBdXSxqOlsxMCxbNSwyMSw2LDIwLDcsMjEsNiwyMiw1LDIxLC0xLC0xLDYsMTQsNiwtMyw1LC02LDMsLTcsMSwtN11dLGs6WzE3LFs0LDIxLDQsMCwtMSwtMSwxNCwxNCw0LDQsLTEsLTEsOCw4LDE1LDBdXSxsOls4LFs0LDIxLDQsMF1dLG06WzMwLFs0LDE0LDQsMCwtMSwtMSw0LDEwLDcsMTMsOSwxNCwxMiwxNCwxNCwxMywxNSwxMCwxNSwwLC0xLC0xLDE1LDEwLDE4LDEzLDIwLDE0LDIzLDE0LDI1LDEzLDI2LDEwLDI2LDBdXSxuOlsxOSxbNCwxNCw0LDAsLTEsLTEsNCwxMCw3LDEzLDksMTQsMTIsMTQsMTQsMTMsMTUsMTAsMTUsMF1dLG86WzE5LFs4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzLDE2LDYsMTYsOCwxNSwxMSwxMywxMywxMSwxNCw4LDE0XV0scDpbMTksWzQsMTQsNCwtNywtMSwtMSw0LDExLDYsMTMsOCwxNCwxMSwxNCwxMywxMywxNSwxMSwxNiw4LDE2LDYsMTUsMywxMywxLDExLDAsOCwwLDYsMSw0LDNdXSxxOlsxOSxbMTUsMTQsMTUsLTcsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLHI6WzEzLFs0LDE0LDQsMCwtMSwtMSw0LDgsNSwxMSw3LDEzLDksMTQsMTIsMTRdXSxzOlsxNyxbMTQsMTEsMTMsMTMsMTAsMTQsNywxNCw0LDEzLDMsMTEsNCw5LDYsOCwxMSw3LDEzLDYsMTQsNCwxNCwzLDEzLDEsMTAsMCw3LDAsNCwxLDMsM11dLHQ6WzEyLFs1LDIxLDUsNCw2LDEsOCwwLDEwLDAsLTEsLTEsMiwxNCw5LDE0XV0sdTpbMTksWzQsMTQsNCw0LDUsMSw3LDAsMTAsMCwxMiwxLDE1LDQsLTEsLTEsMTUsMTQsMTUsMF1dLHY6WzE2LFsyLDE0LDgsMCwtMSwtMSwxNCwxNCw4LDBdXSx3OlsyMixbMywxNCw3LDAsLTEsLTEsMTEsMTQsNywwLC0xLC0xLDExLDE0LDE1LDAsLTEsLTEsMTksMTQsMTUsMF1dLHg6WzE3LFszLDE0LDE0LDAsLTEsLTEsMTQsMTQsMywwXV0seTpbMTYsWzIsMTQsOCwwLC0xLC0xLDE0LDE0LDgsMCw2LC00LDQsLTYsMiwtNywxLC03XV0sejpbMTcsWzE0LDE0LDMsMCwtMSwtMSwzLDE0LDE0LDE0LC0xLC0xLDMsMCwxNCwwXV0sXCJ7XCI6WzE0LFs5LDI1LDcsMjQsNiwyMyw1LDIxLDUsMTksNiwxNyw3LDE2LDgsMTQsOCwxMiw2LDEwLC0xLC0xLDcsMjQsNiwyMiw2LDIwLDcsMTgsOCwxNyw5LDE1LDksMTMsOCwxMSw0LDksOCw3LDksNSw5LDMsOCwxLDcsMCw2LC0yLDYsLTQsNywtNiwtMSwtMSw2LDgsOCw2LDgsNCw3LDIsNiwxLDUsLTEsNSwtMyw2LC01LDcsLTYsOSwtN11dLFwifFwiOls4LFs0LDI1LDQsLTddXSxcIn1cIjpbMTQsWzUsMjUsNywyNCw4LDIzLDksMjEsOSwxOSw4LDE3LDcsMTYsNiwxNCw2LDEyLDgsMTAsLTEsLTEsNywyNCw4LDIyLDgsMjAsNywxOCw2LDE3LDUsMTUsNSwxMyw2LDExLDEwLDksNiw3LDUsNSw1LDMsNiwxLDcsMCw4LC0yLDgsLTQsNywtNiwtMSwtMSw4LDgsNiw2LDYsNCw3LDIsOCwxLDksLTEsOSwtMyw4LC01LDcsLTYsNSwtN11dLFwiflwiOlsyNCxbMyw2LDMsOCw0LDExLDYsMTIsOCwxMiwxMCwxMSwxNCw4LDE2LDcsMTgsNywyMCw4LDIxLDEwLC0xLC0xLDMsOCw0LDEwLDYsMTEsOCwxMSwxMCwxMCwxNCw3LDE2LDYsMTgsNiwyMCw3LDIxLDEwLDIxLDEyXV19O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGwsbix0LGUpe2U9ZXx8MTt2YXIgcixvLHUscyxpLHgsZixwLGg9W107Zm9yKHI9MCxvPWwubGVuZ3RoO28+cjtyKyspaWYoaT1zaW1wbGV4Rm9udFtsW3JdXSl7Zm9yKHA9bnVsbCx1PTAscz1pWzFdLmxlbmd0aDtzPnU7dSs9MiktMT09PWlbMV1bdV0mJi0xPT09aVsxXVt1KzFdP3A9bnVsbDooeD1uK2lbMV1bdV0qZSxmPXQtaVsxXVt1KzFdKmUscCYmaC5wdXNoKHAueCxwLnkseCxmKSxwPXt4OngseTpmfSk7bis9aVswXSplfXJldHVybiBofTtcbn0se31dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBtYXBib3hnbD1tb2R1bGUuZXhwb3J0cz17fTttYXBib3hnbC5NYXA9cmVxdWlyZShcIi4vdWkvbWFwXCIpLG1hcGJveGdsLkNvbnRyb2w9cmVxdWlyZShcIi4vdWkvY29udHJvbC9jb250cm9sXCIpLG1hcGJveGdsLk5hdmlnYXRpb249cmVxdWlyZShcIi4vdWkvY29udHJvbC9uYXZpZ2F0aW9uXCIpLG1hcGJveGdsLkF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIiksbWFwYm94Z2wuUG9wdXA9cmVxdWlyZShcIi4vdWkvcG9wdXBcIiksbWFwYm94Z2wuR2VvSlNPTlNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIiksbWFwYm94Z2wuVmlkZW9Tb3VyY2U9cmVxdWlyZShcIi4vc291cmNlL3ZpZGVvX3NvdXJjZVwiKSxtYXBib3hnbC5JbWFnZVNvdXJjZT1yZXF1aXJlKFwiLi9zb3VyY2UvaW1hZ2Vfc291cmNlXCIpLG1hcGJveGdsLlN0eWxlPXJlcXVpcmUoXCIuL3N0eWxlL3N0eWxlXCIpLG1hcGJveGdsLkxuZ0xhdD1yZXF1aXJlKFwiLi9nZW8vbG5nX2xhdFwiKSxtYXBib3hnbC5MbmdMYXRCb3VuZHM9cmVxdWlyZShcIi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLG1hcGJveGdsLlBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxtYXBib3hnbC5FdmVudGVkPXJlcXVpcmUoXCIuL3V0aWwvZXZlbnRlZFwiKSxtYXBib3hnbC51dGlsPXJlcXVpcmUoXCIuL3V0aWwvdXRpbFwiKSxtYXBib3hnbC5zdXBwb3J0ZWQ9cmVxdWlyZShcIi4vdXRpbC9icm93c2VyXCIpLnN1cHBvcnRlZDt2YXIgYWpheD1yZXF1aXJlKFwiLi91dGlsL2FqYXhcIik7bWFwYm94Z2wudXRpbC5nZXRKU09OPWFqYXguZ2V0SlNPTixtYXBib3hnbC51dGlsLmdldEFycmF5QnVmZmVyPWFqYXguZ2V0QXJyYXlCdWZmZXI7dmFyIGNvbmZpZz1yZXF1aXJlKFwiLi91dGlsL2NvbmZpZ1wiKTttYXBib3hnbC5jb25maWc9Y29uZmlnLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXBib3hnbCxcImFjY2Vzc1Rva2VuXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBjb25maWcuQUNDRVNTX1RPS0VOfSxzZXQ6ZnVuY3Rpb24oZSl7Y29uZmlnLkFDQ0VTU19UT0tFTj1lfX0pO1xufSx7XCIuL2dlby9sbmdfbGF0XCI6MjAsXCIuL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vc291cmNlL2ltYWdlX3NvdXJjZVwiOjQxLFwiLi9zb3VyY2UvdmlkZW9fc291cmNlXCI6NDgsXCIuL3N0eWxlL3N0eWxlXCI6NTYsXCIuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25cIjo3OSxcIi4vdWkvY29udHJvbC9jb250cm9sXCI6ODAsXCIuL3VpL2NvbnRyb2wvbmF2aWdhdGlvblwiOjgxLFwiLi91aS9tYXBcIjo5MSxcIi4vdWkvcG9wdXBcIjo5MixcIi4vdXRpbC9hamF4XCI6OTQsXCIuL3V0aWwvYnJvd3NlclwiOjk1LFwiLi91dGlsL2NvbmZpZ1wiOjk5LFwiLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0JhY2tncm91bmQodCxhLHIpe3ZhciBlLGk9dC5nbCxvPWEucGFpbnRbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLG49YS5wYWludFtcImJhY2tncm91bmQtcGF0dGVyblwiXSxsPWEucGFpbnRbXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0sdT1uP3Quc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24obi5mcm9tLCEwKTpudWxsLG09bj90LnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKG4udG8sITApOm51bGw7aWYodSYmbSl7ZT10LnBhdHRlcm5TaGFkZXIsaS5zd2l0Y2hTaGFkZXIoZSxyKSxpLnVuaWZvcm0xaShlLnVfaW1hZ2UsMCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2EsdS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2EsdS5iciksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX3RsX2IsbS50bCksaS51bmlmb3JtMmZ2KGUudV9wYXR0ZXJuX2JyX2IsbS5iciksaS51bmlmb3JtMWYoZS51X29wYWNpdHksbCk7dmFyIGM9dC50cmFuc2Zvcm0sZj11LnNpemUscz1tLnNpemUsXz1jLmxvY2F0aW9uQ29vcmRpbmF0ZShjLmNlbnRlciksUz0xL01hdGgucG93KDIsYy56b29tRnJhY3Rpb24pO2kudW5pZm9ybTFmKGUudV9taXgsbi50KTt2YXIgZD1tYXQzLmNyZWF0ZSgpO21hdDMuc2NhbGUoZCxkLFsxLyhmWzBdKm4uZnJvbVNjYWxlKSwxLyhmWzFdKm4uZnJvbVNjYWxlKV0pLG1hdDMudHJhbnNsYXRlKGQsZCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoZlswXSpuLmZyb21TY2FsZSksXy5yb3cqYy50aWxlU2l6ZSUoZlsxXSpuLmZyb21TY2FsZSldKSxtYXQzLnJvdGF0ZShkLGQsLWMuYW5nbGUpLG1hdDMuc2NhbGUoZCxkLFtTKmMud2lkdGgvMiwtUypjLmhlaWdodC8yXSk7dmFyIHA9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKHAscCxbMS8oc1swXSpuLnRvU2NhbGUpLDEvKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMudHJhbnNsYXRlKHAscCxbXy5jb2x1bW4qYy50aWxlU2l6ZSUoc1swXSpuLnRvU2NhbGUpLF8ucm93KmMudGlsZVNpemUlKHNbMV0qbi50b1NjYWxlKV0pLG1hdDMucm90YXRlKHAscCwtYy5hbmdsZSksbWF0My5zY2FsZShwLHAsW1MqYy53aWR0aC8yLC1TKmMuaGVpZ2h0LzJdKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYSwhMSxkKSxpLnVuaWZvcm1NYXRyaXgzZnYoZS51X3BhdHRlcm5tYXRyaXhfYiwhMSxwKSx0LnNwcml0ZUF0bGFzLmJpbmQoaSwhMCl9ZWxzZSBlPXQuZmlsbFNoYWRlcixpLnN3aXRjaFNoYWRlcihlLHIpLGkudW5pZm9ybTRmdihlLnVfY29sb3Isbyk7aS5kaXNhYmxlKGkuU1RFTkNJTF9URVNUKSxpLmJpbmRCdWZmZXIoaS5BUlJBWV9CVUZGRVIsdC5iYWNrZ3JvdW5kQnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hX3Bvcyx0LmJhY2tncm91bmRCdWZmZXIuaXRlbVNpemUsaS5TSE9SVCwhMSwwLDApLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsdC5iYWNrZ3JvdW5kQnVmZmVyLml0ZW1Db3VudCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3RlbmNpbE1hc2soMCksaS5zdGVuY2lsRnVuYyhpLkVRVUFMLDEyOCwxMjgpfXZhciBtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3QmFja2dyb3VuZDtcbn0se1wiZ2wtbWF0cml4XCI6MTE2fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0NpcmNsZXMoZSxyLGksYSl7aWYoYS5idWZmZXJzKXtpPWUudHJhbnNsYXRlTWF0cml4KGksYSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSxyLnBhaW50W1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciB0PWEuZWxlbWVudEdyb3Vwc1tyLnJlZnx8ci5pZF07aWYodCl7dmFyIGw9ZS5nbDtsLmRpc2FibGUobC5TVEVOQ0lMX1RFU1QpLGwuc3dpdGNoU2hhZGVyKGUuY2lyY2xlU2hhZGVyLGksYS5leE1hdHJpeCk7dmFyIGM9YS5idWZmZXJzLmNpcmNsZVZlcnRleCxuPWUuY2lyY2xlU2hhZGVyLHM9YS5idWZmZXJzLmNpcmNsZUVsZW1lbnQsdT0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpby9yLnBhaW50W1wiY2lyY2xlLXJhZGl1c1wiXTtsLnVuaWZvcm00ZnYobi51X2NvbG9yLHIucGFpbnRbXCJjaXJjbGUtY29sb3JcIl0pLGwudW5pZm9ybTFmKG4udV9ibHVyLE1hdGgubWF4KHIucGFpbnRbXCJjaXJjbGUtYmx1clwiXSx1KSksbC51bmlmb3JtMWYobi51X3NpemUsci5wYWludFtcImNpcmNsZS1yYWRpdXNcIl0pO2Zvcih2YXIgbz0wO288dC5ncm91cHMubGVuZ3RoO28rKyl7dmFyIGY9dC5ncm91cHNbb10sZD1mLnZlcnRleFN0YXJ0SW5kZXgqYy5pdGVtU2l6ZTtjLmJpbmQobCxuLGQpLHMuYmluZChsLG4sZCk7dmFyIFM9MypmLmVsZW1lbnRMZW5ndGgsYj1mLmVsZW1lbnRTdGFydEluZGV4KnMuaXRlbVNpemU7bC5kcmF3RWxlbWVudHMobC5UUklBTkdMRVMsUyxsLlVOU0lHTkVEX1NIT1JULGIpfWwuZW5hYmxlKGwuU1RFTkNJTF9URVNUKX19fXZhciBicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXIuanNcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd0NpcmNsZXM7XG59LHtcIi4uL3V0aWwvYnJvd3Nlci5qc1wiOjk1fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1BsYWNlbWVudERlYnVnKHIsZSxvLHQpe3ZhciBhPXQuZWxlbWVudEdyb3Vwc1tlLnJlZnx8ZS5pZF0uY29sbGlzaW9uQm94O2lmKGEpe3ZhciBpPXIuZ2wsbj10LmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LHM9ci5jb2xsaXNpb25Cb3hTaGFkZXI7aS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpLGkuc3dpdGNoU2hhZGVyKHMsbyksbi5iaW5kKGkscyksaS5saW5lV2lkdGgoMSk7dmFyIHU9MTI7aS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9wb3MsMixpLlNIT1JULCExLHUsMCksaS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMuYV9leHRydWRlLDIsaS5TSE9SVCwhMSx1LDQpLGkudmVydGV4QXR0cmliUG9pbnRlcihzLmFfZGF0YSwyLGkuVU5TSUdORURfQllURSwhMSx1LDgpLGkudW5pZm9ybTFmKHMudV9zY2FsZSxNYXRoLnBvdygyLHIudHJhbnNmb3JtLnpvb20tdC5jb29yZC56KSksaS51bmlmb3JtMWYocy51X3pvb20sMTAqci50cmFuc2Zvcm0uem9vbSksaS51bmlmb3JtMWYocy51X21heHpvb20sMTAqKHQuY29vcmQueisxKSk7dmFyIGQ9YS5ncm91cHNbMF0udmVydGV4U3RhcnRJbmRleCxsPWEuZ3JvdXBzWzBdLnZlcnRleExlbmd0aDtpLmRyYXdBcnJheXMoaS5MSU5FUyxkLGwpLGkuZGlzYWJsZShpLlNURU5DSUxfVEVTVCl9fW1vZHVsZS5leHBvcnRzPWRyYXdQbGFjZW1lbnREZWJ1Zztcbn0se31dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXdEZWJ1ZyhlLHIpe3ZhciB0PWUuZ2w7dC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN3aXRjaFNoYWRlcihlLmRlYnVnU2hhZGVyLHIucG9zTWF0cml4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsZS5kZWJ1Z0J1ZmZlciksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGYoZS5kZWJ1Z1NoYWRlci51X2NvbG9yLDEsMCwwLDEpLHQubGluZVdpZHRoKDQpLHQuZHJhd0FycmF5cyh0LkxJTkVfU1RSSVAsMCxlLmRlYnVnQnVmZmVyLml0ZW1Db3VudCk7dmFyIGk9dGV4dFZlcnRpY2VzKHIuY29vcmQudG9TdHJpbmcoKSw1MCwyMDAsNSk7dC5iaW5kQnVmZmVyKHQuQVJSQVlfQlVGRkVSLGUuZGVidWdUZXh0QnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoaSksdC5TVFJFQU1fRFJBVyksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZGVidWdTaGFkZXIuYV9wb3MsZS5kZWJ1Z1RleHRCdWZmZXIuaXRlbVNpemUsdC5TSE9SVCwhMSwwLDApLHQubGluZVdpZHRoKDgqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSx0LnVuaWZvcm00ZihlLmRlYnVnU2hhZGVyLnVfY29sb3IsMSwxLDEsMSksdC5kcmF3QXJyYXlzKHQuTElORVMsMCxpLmxlbmd0aC9lLmRlYnVnVGV4dEJ1ZmZlci5pdGVtU2l6ZSksdC5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLHQudW5pZm9ybTRmKGUuZGVidWdTaGFkZXIudV9jb2xvciwwLDAsMCwxKSx0LmRyYXdBcnJheXModC5MSU5FUywwLGkubGVuZ3RoL2UuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpfXZhciB0ZXh0VmVydGljZXM9cmVxdWlyZShcIi4uL2xpYi9kZWJ1Z3RleHRcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpO21vZHVsZS5leHBvcnRzPWRyYXdEZWJ1Zztcbn0se1wiLi4vbGliL2RlYnVndGV4dFwiOjIzLFwiLi4vdXRpbC9icm93c2VyXCI6OTV9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3RmlsbChlLHQscixpKXtpZihpLmJ1ZmZlcnMpe3ZhciBhPWkuZWxlbWVudEdyb3Vwc1t0LnJlZnx8dC5pZF07aWYoYSl7dmFyIGwsbixvLGYscz1lLmdsLHU9ZS50cmFuc2xhdGVNYXRyaXgocixpLHQucGFpbnRbXCJmaWxsLXRyYW5zbGF0ZVwiXSx0LnBhaW50W1wiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCJdKSxjPXQucGFpbnRbXCJmaWxsLWNvbG9yXCJdO3Muc3RlbmNpbE1hc2soNjMpLHMuY2xlYXIocy5TVEVOQ0lMX0JVRkZFUl9CSVQpLHMuc3RlbmNpbEZ1bmMocy5OT1RFUVVBTCwxMjgsMTI4KSxzLnN0ZW5jaWxPcFNlcGFyYXRlKHMuRlJPTlQscy5JTkNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsT3BTZXBhcmF0ZShzLkJBQ0sscy5ERUNSX1dSQVAscy5LRUVQLHMuS0VFUCkscy5jb2xvck1hc2soITEsITEsITEsITEpLHMuc3dpdGNoU2hhZGVyKGUuZmlsbFNoYWRlcix1KSxsPWkuYnVmZmVycy5maWxsVmVydGV4LGwuYmluZChzKSxuPWkuYnVmZmVycy5maWxsRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBtLFMsRT0wO0U8YS5ncm91cHMubGVuZ3RoO0UrKylvPWEuZ3JvdXBzW0VdLG09by52ZXJ0ZXhTdGFydEluZGV4KmwuaXRlbVNpemUscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuZmlsbFNoYWRlci5hX3BvcywyLHMuU0hPUlQsITEsNCxtKzApLGY9MypvLmVsZW1lbnRMZW5ndGgsUz1vLmVsZW1lbnRTdGFydEluZGV4Km4uaXRlbVNpemUscy5kcmF3RWxlbWVudHMocy5UUklBTkdMRVMsZixzLlVOU0lHTkVEX1NIT1JULFMpO3MuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxzLnN0ZW5jaWxPcChzLktFRVAscy5LRUVQLHMuS0VFUCkscy5zdGVuY2lsTWFzaygwKTt2YXIgZD10LnBhaW50W1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdO2lmKHQucGFpbnRbXCJmaWxsLWFudGlhbGlhc1wiXT09PSEwJiYoIXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl18fGQpKXtzLnN3aXRjaFNoYWRlcihlLm91dGxpbmVTaGFkZXIsdSkscy5saW5lV2lkdGgoMipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLGQ/cy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpOnMuc3RlbmNpbEZ1bmMocy5FUVVBTCwxMjgsMTkxKSxzLnVuaWZvcm0yZihlLm91dGxpbmVTaGFkZXIudV93b3JsZCxzLmRyYXdpbmdCdWZmZXJXaWR0aCxzLmRyYXdpbmdCdWZmZXJIZWlnaHQpLHMudW5pZm9ybTRmdihlLm91dGxpbmVTaGFkZXIudV9jb2xvcixkP2Q6YyksbD1pLmJ1ZmZlcnMuZmlsbFZlcnRleCxuPWkuYnVmZmVycy5vdXRsaW5lRWxlbWVudCxuLmJpbmQocyk7Zm9yKHZhciBwPTA7cDxhLmdyb3Vwcy5sZW5ndGg7cCsrKW89YS5ncm91cHNbcF0sbT1vLnZlcnRleFN0YXJ0SW5kZXgqbC5pdGVtU2l6ZSxzLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5vdXRsaW5lU2hhZGVyLmFfcG9zLDIscy5TSE9SVCwhMSw0LG0rMCksZj0yKm8uc2Vjb25kRWxlbWVudExlbmd0aCxTPW8uc2Vjb25kRWxlbWVudFN0YXJ0SW5kZXgqbi5pdGVtU2l6ZSxzLmRyYXdFbGVtZW50cyhzLkxJTkVTLGYscy5VTlNJR05FRF9TSE9SVCxTKX12YXIgXyxoPXQucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0sdj10LnBhaW50W1wiZmlsbC1vcGFjaXR5XCJdfHwxO2lmKGgpe3ZhciB4PWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC5mcm9tLCEwKSxiPWUuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaC50bywhMCk7aWYoIXh8fCFiKXJldHVybjtfPWUucGF0dGVyblNoYWRlcixzLnN3aXRjaFNoYWRlcihfLHIpLHMudW5pZm9ybTFpKF8udV9pbWFnZSwwKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYSx4LnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYSx4LmJyKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fdGxfYixiLnRsKSxzLnVuaWZvcm0yZnYoXy51X3BhdHRlcm5fYnJfYixiLmJyKSxzLnVuaWZvcm0xZihfLnVfb3BhY2l0eSx2KSxzLnVuaWZvcm0xZihfLnVfbWl4LGgudCk7dmFyIEE9aS50aWxlRXh0ZW50L2kudGlsZVNpemUvTWF0aC5wb3coMixlLnRyYW5zZm9ybS50aWxlWm9vbS1pLmNvb3JkLnopLFI9bWF0My5jcmVhdGUoKTttYXQzLnNjYWxlKFIsUixbMS8oeC5zaXplWzBdKkEqaC5mcm9tU2NhbGUpLDEvKHguc2l6ZVsxXSpBKmguZnJvbVNjYWxlKV0pO3ZhciBnPW1hdDMuY3JlYXRlKCk7bWF0My5zY2FsZShnLGcsWzEvKGIuc2l6ZVswXSpBKmgudG9TY2FsZSksMS8oYi5zaXplWzFdKkEqaC50b1NjYWxlKV0pLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9hLCExLFIpLHMudW5pZm9ybU1hdHJpeDNmdihfLnVfcGF0dGVybm1hdHJpeF9iLCExLGcpLGUuc3ByaXRlQXRsYXMuYmluZChzLCEwKX1lbHNlIF89ZS5maWxsU2hhZGVyLHMuc3dpdGNoU2hhZGVyKF8scikscy51bmlmb3JtNGZ2KF8udV9jb2xvcixjKTtzLnN0ZW5jaWxGdW5jKHMuTk9URVFVQUwsMCw2Mykscy5iaW5kQnVmZmVyKHMuQVJSQVlfQlVGRkVSLGUudGlsZUV4dGVudEJ1ZmZlcikscy52ZXJ0ZXhBdHRyaWJQb2ludGVyKF8uYV9wb3MsZS50aWxlRXh0ZW50QnVmZmVyLml0ZW1TaXplLHMuU0hPUlQsITEsMCwwKSxzLmRyYXdBcnJheXMocy5UUklBTkdMRV9TVFJJUCwwLGUudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQpLHMuc3RlbmNpbE1hc2soMCkscy5zdGVuY2lsRnVuYyhzLkVRVUFMLDEyOCwxMjgpfX19dmFyIGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQzPXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0Mzttb2R1bGUuZXhwb3J0cz1kcmF3RmlsbDtcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDI9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsaSxlLHIpe2lmKHIuYnVmZmVycyl7dmFyIGE9ci5lbGVtZW50R3JvdXBzW2kucmVmfHxpLmlkXTtpZihhKXt2YXIgbj10LmdsO2lmKCEoaS5wYWludFtcImxpbmUtd2lkdGhcIl08PTApKXt2YXIgbz0xL2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxmPWkucGFpbnRbXCJsaW5lLWJsdXJcIl0rbyxsPWkucGFpbnRbXCJsaW5lLXdpZHRoXCJdLzIsdT0tMSxtPTAscz0wO2kucGFpbnRbXCJsaW5lLWdhcC13aWR0aFwiXT4wJiYodT1pLnBhaW50W1wibGluZS1nYXAtd2lkdGhcIl0vMisuNSpvLGw9aS5wYWludFtcImxpbmUtd2lkdGhcIl0sbT11LW8vMik7dmFyIF89bStsK28vMitzLGg9aS5wYWludFtcImxpbmUtY29sb3JcIl0sZD10LnRyYW5zZm9ybS5zY2FsZS8oMTw8ci5jb29yZC56KS8oci50aWxlRXh0ZW50L3IudGlsZVNpemUpLHA9dC50cmFuc2xhdGVNYXRyaXgoZSxyLGkucGFpbnRbXCJsaW5lLXRyYW5zbGF0ZVwiXSxpLnBhaW50W1wibGluZS10cmFuc2xhdGUtYW5jaG9yXCJdKSx2PXQudHJhbnNmb3JtLGM9bWF0Mi5jcmVhdGUoKTttYXQyLnNjYWxlKGMsYyxbMSxNYXRoLmNvcyh2Ll9waXRjaCldKSxtYXQyLnJvdGF0ZShjLGMsdC50cmFuc2Zvcm0uYW5nbGUpO3ZhciB4LGI9TWF0aC5zcXJ0KHYuaGVpZ2h0KnYuaGVpZ2h0LzQqKDErdi5hbHRpdHVkZSp2LmFsdGl0dWRlKSksdz12LmhlaWdodC8yKk1hdGgudGFuKHYuX3BpdGNoKSxnPShiK3cpL2ItMSxTPXIudGlsZVNpemUvdC50cmFuc2Zvcm0udGlsZVNpemUsTT1pLnBhaW50W1wibGluZS1kYXNoYXJyYXlcIl0sej1pLnBhaW50W1wibGluZS1wYXR0ZXJuXCJdO2lmKE0pe3g9dC5saW5lc2RmcGF0dGVyblNoYWRlcixuLnN3aXRjaFNoYWRlcih4LHAsci5leE1hdHJpeCksbi51bmlmb3JtMmZ2KHgudV9saW5ld2lkdGgsW18sdV0pLG4udW5pZm9ybTFmKHgudV9yYXRpbyxkKSxuLnVuaWZvcm0xZih4LnVfYmx1cixmKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBBPXQubGluZUF0bGFzLmdldERhc2goTS5mcm9tLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pLHk9dC5saW5lQXRsYXMuZ2V0RGFzaChNLnRvLFwicm91bmRcIj09PWkubGF5b3V0W1wibGluZS1jYXBcIl0pO3QubGluZUF0bGFzLmJpbmQobik7dmFyIEU9TWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKHQudHJhbnNmb3JtLnNjYWxlKS9NYXRoLkxOMiktci5jb29yZC56KS84KlMsUD1bRS9BLndpZHRoL00uZnJvbVNjYWxlLC1BLmhlaWdodC8yXSxSPXQubGluZUF0bGFzLndpZHRoLyhNLmZyb21TY2FsZSpBLndpZHRoKjI1Nipicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLzIsST1bRS95LndpZHRoL00udG9TY2FsZSwteS5oZWlnaHQvMl0sTj10LmxpbmVBdGxhcy53aWR0aC8oTS50b1NjYWxlKnkud2lkdGgqMjU2KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykvMjtuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5zY2FsZV9hLFApLG4udW5pZm9ybTFmKHgudV90ZXhfeV9hLEEueSksbi51bmlmb3JtMmZ2KHgudV9wYXR0ZXJuc2NhbGVfYixJKSxuLnVuaWZvcm0xZih4LnVfdGV4X3lfYix5LnkpLG4udW5pZm9ybTFpKHgudV9pbWFnZSwwKSxuLnVuaWZvcm0xZih4LnVfc2RmZ2FtbWEsTWF0aC5tYXgoUixOKSksbi51bmlmb3JtMWYoeC51X21peCxNLnQpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIGlmKHope3ZhciBUPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei5mcm9tLCEwKSxxPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oei50bywhMCk7aWYoIVR8fCFxKXJldHVybjt2YXIgRD1yLnRpbGVFeHRlbnQvci50aWxlU2l6ZS9NYXRoLnBvdygyLHQudHJhbnNmb3JtLnRpbGVab29tLXIuY29vcmQueikqUzt0LnNwcml0ZUF0bGFzLmJpbmQobiwhMCkseD10LmxpbmVwYXR0ZXJuU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2EsW1Quc2l6ZVswXSpEKnouZnJvbVNjYWxlLHEuc2l6ZVsxXV0pLG4udW5pZm9ybTJmdih4LnVfcGF0dGVybl9zaXplX2IsW3Euc2l6ZVswXSpEKnoudG9TY2FsZSxxLnNpemVbMV1dKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYSxULnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYSxULmJyKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fdGxfYixxLnRsKSxuLnVuaWZvcm0yZnYoeC51X3BhdHRlcm5fYnJfYixxLmJyKSxuLnVuaWZvcm0xZih4LnVfZmFkZSx6LnQpLG4udW5pZm9ybTFmKHgudV9vcGFjaXR5LGkucGFpbnRbXCJsaW5lLW9wYWNpdHlcIl0pLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKX1lbHNlIHg9dC5saW5lU2hhZGVyLG4uc3dpdGNoU2hhZGVyKHgscCxyLmV4TWF0cml4KSxuLnVuaWZvcm0yZnYoeC51X2xpbmV3aWR0aCxbXyx1XSksbi51bmlmb3JtMWYoeC51X3JhdGlvLGQpLG4udW5pZm9ybTFmKHgudV9ibHVyLGYpLG4udW5pZm9ybTFmKHgudV9leHRyYSxnKSxuLnVuaWZvcm1NYXRyaXgyZnYoeC51X2FudGlhbGlhc2luZ21hdHJpeCwhMSxjKSxuLnVuaWZvcm00ZnYoeC51X2NvbG9yLGgpO3ZhciBHPXIuYnVmZmVycy5saW5lVmVydGV4O0cuYmluZChuKTt2YXIgTD1yLmJ1ZmZlcnMubGluZUVsZW1lbnQ7TC5iaW5kKG4pO2Zvcih2YXIgSD0wO0g8YS5ncm91cHMubGVuZ3RoO0grKyl7dmFyIE89YS5ncm91cHNbSF0sQj1PLnZlcnRleFN0YXJ0SW5kZXgqRy5pdGVtU2l6ZTtuLnZlcnRleEF0dHJpYlBvaW50ZXIoeC5hX3BvcywyLG4uU0hPUlQsITEsOCxCKzApLG4udmVydGV4QXR0cmliUG9pbnRlcih4LmFfZGF0YSw0LG4uQllURSwhMSw4LEIrNCk7dmFyIFU9MypPLmVsZW1lbnRMZW5ndGgsVj1PLmVsZW1lbnRTdGFydEluZGV4KkwuaXRlbVNpemU7bi5kcmF3RWxlbWVudHMobi5UUklBTkdMRVMsVSxuLlVOU0lHTkVEX1NIT1JULFYpfX19fX07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1Jhc3Rlcih0LHIsZSxhKXt2YXIgaT10LmdsO2kuZGlzYWJsZShpLlNURU5DSUxfVEVTVCk7dmFyIG89dC5yYXN0ZXJTaGFkZXI7aS5zd2l0Y2hTaGFkZXIobyxlKSxpLnVuaWZvcm0xZihvLnVfYnJpZ2h0bmVzc19sb3csci5wYWludFtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksaS51bmlmb3JtMWYoby51X2JyaWdodG5lc3NfaGlnaCxyLnBhaW50W1wicmFzdGVyLWJyaWdodG5lc3MtbWF4XCJdKSxpLnVuaWZvcm0xZihvLnVfc2F0dXJhdGlvbl9mYWN0b3Isc2F0dXJhdGlvbkZhY3RvcihyLnBhaW50W1wicmFzdGVyLXNhdHVyYXRpb25cIl0pKSxpLnVuaWZvcm0xZihvLnVfY29udHJhc3RfZmFjdG9yLGNvbnRyYXN0RmFjdG9yKHIucGFpbnRbXCJyYXN0ZXItY29udHJhc3RcIl0pKSxpLnVuaWZvcm0zZnYoby51X3NwaW5fd2VpZ2h0cyxzcGluV2VpZ2h0cyhyLnBhaW50W1wicmFzdGVyLWh1ZS1yb3RhdGVcIl0pKTt2YXIgbix1LHM9YS5zb3VyY2UmJmEuc291cmNlLl9weXJhbWlkLmZpbmRMb2FkZWRQYXJlbnQoYS5jb29yZCwwLHt9KSxjPWdldE9wYWNpdGllcyhhLHMscix0LnRyYW5zZm9ybSk7aS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTApLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGEudGV4dHVyZSkscz8oaS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTEpLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELHMudGV4dHVyZSksbj1NYXRoLnBvdygyLHMuY29vcmQuei1hLmNvb3JkLnopLHU9W2EuY29vcmQueCpuJTEsYS5jb29yZC55Km4lMV0pOmNbMV09MCxpLnVuaWZvcm0yZnYoby51X3RsX3BhcmVudCx1fHxbMCwwXSksaS51bmlmb3JtMWYoby51X3NjYWxlX3BhcmVudCxufHwxKSxpLnVuaWZvcm0xZihvLnVfYnVmZmVyX3NjYWxlLDEpLGkudW5pZm9ybTFmKG8udV9vcGFjaXR5MCxjWzBdKSxpLnVuaWZvcm0xZihvLnVfb3BhY2l0eTEsY1sxXSksaS51bmlmb3JtMWkoby51X2ltYWdlMCwwKSxpLnVuaWZvcm0xaShvLnVfaW1hZ2UxLDEpLGkuYmluZEJ1ZmZlcihpLkFSUkFZX0JVRkZFUixhLmJvdW5kc0J1ZmZlcnx8dC50aWxlRXh0ZW50QnVmZmVyKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3BvcywyLGkuU0hPUlQsITEsOCwwKSxpLnZlcnRleEF0dHJpYlBvaW50ZXIoby5hX3RleHR1cmVfcG9zLDIsaS5TSE9SVCwhMSw4LDQpLGkuZHJhd0FycmF5cyhpLlRSSUFOR0xFX1NUUklQLDAsNCksaS5lbmFibGUoaS5TVEVOQ0lMX1RFU1QpfWZ1bmN0aW9uIHNwaW5XZWlnaHRzKHQpe3QqPU1hdGguUEkvMTgwO3ZhciByPU1hdGguc2luKHQpLGU9TWF0aC5jb3ModCk7cmV0dXJuWygyKmUrMSkvMywoLU1hdGguc3FydCgzKSpyLWUrMSkvMywoTWF0aC5zcXJ0KDMpKnItZSsxKS8zXX1mdW5jdGlvbiBjb250cmFzdEZhY3Rvcih0KXtyZXR1cm4gdD4wPzEvKDEtdCk6MSt0fWZ1bmN0aW9uIHNhdHVyYXRpb25GYWN0b3IodCl7cmV0dXJuIHQ+MD8xLTEvKDEuMDAxLXQpOi10fWZ1bmN0aW9uIGdldE9wYWNpdGllcyh0LHIsZSxhKXtpZighdC5zb3VyY2UpcmV0dXJuWzEsMF07dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCksbz1lLnBhaW50W1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl0sbj0oaS10LnRpbWVBZGRlZCkvbyx1PXI/KGktci50aW1lQWRkZWQpL286LTEscz10LnNvdXJjZS5fcHlyYW1pZC5jb3ZlcmluZ1pvb21MZXZlbChhKSxjPXI/TWF0aC5hYnMoci5jb29yZC56LXMpPk1hdGguYWJzKHQuY29vcmQuei1zKTohMSxmPVtdOyFyfHxjPyhmWzBdPXV0aWwuY2xhbXAobiwwLDEpLGZbMV09MS1mWzBdKTooZlswXT11dGlsLmNsYW1wKDEtdSwwLDEpLGZbMV09MS1mWzBdKTt2YXIgZD1lLnBhaW50W1wicmFzdGVyLW9wYWNpdHlcIl07cmV0dXJuIGZbMF0qPWQsZlsxXSo9ZCxmfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd1Jhc3Rlcjtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2fV0sMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1N5bWJvbHMoZSx0LHIsYSl7aWYoYS5idWZmZXJzKXt2YXIgbz1hLmVsZW1lbnRHcm91cHNbdC5yZWZ8fHQuaWRdO2lmKG8pe3ZhciBpPSEodC5sYXlvdXRbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl18fHQubGF5b3V0W1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdfHx0LmxheW91dFtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8dC5sYXlvdXRbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLG49ZS5nbDtpJiZuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpLG8udGV4dC5ncm91cHMubGVuZ3RoJiZkcmF3U3ltYm9sKGUsdCxyLGEsby50ZXh0LFwidGV4dFwiLCEwKSxvLmljb24uZ3JvdXBzLmxlbmd0aCYmZHJhd1N5bWJvbChlLHQscixhLG8uaWNvbixcImljb25cIixvLnNkZkljb25zKSxkcmF3Q29sbGlzaW9uRGVidWcoZSx0LHIsYSksaSYmbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpfX19ZnVuY3Rpb24gZHJhd1N5bWJvbChlLHQscixhLG8saSxuKXt2YXIgbD1lLmdsO3I9ZS50cmFuc2xhdGVNYXRyaXgocixhLHQucGFpbnRbaStcIi10cmFuc2xhdGVcIl0sdC5wYWludFtpK1wiLXRyYW5zbGF0ZS1hbmNob3JcIl0pO3ZhciBtLGYsdSxzPWUudHJhbnNmb3JtLGQ9XCJtYXBcIj09PXQubGF5b3V0W2krXCItcm90YXRpb24tYWxpZ25tZW50XCJdLGg9ZDtoPyhtPW1hdDQuY3JlYXRlKCksZj1hLnRpbGVFeHRlbnQvYS50aWxlU2l6ZS9NYXRoLnBvdygyLGUudHJhbnNmb3JtLnpvb20tYS5jb29yZC56KSx1PTEvTWF0aC5jb3Mocy5fcGl0Y2gpKToobT1tYXQ0LmNsb25lKGEuZXhNYXRyaXgpLGY9ZS50cmFuc2Zvcm0uYWx0aXR1ZGUsdT0xKSxtYXQ0LnNjYWxlKG0sbSxbZixmLDFdKTt2YXIgcD10LnBhaW50W2krXCItc2l6ZVwiXSxnPXAvZGVmYXVsdFNpemVzW2ldO21hdDQuc2NhbGUobSxtLFtnLGcsMV0pO3ZhciBTLGMseCxiLHY9TWF0aC5zcXJ0KHMuaGVpZ2h0KnMuaGVpZ2h0LzQqKDErcy5hbHRpdHVkZSpzLmFsdGl0dWRlKSksXz1zLmhlaWdodC8yKk1hdGgudGFuKHMuX3BpdGNoKSx6PSh2K18pL3YtMSx3PVwidGV4dFwiPT09aTtpZih3fHxlLnN0eWxlLnNwcml0ZS5sb2FkZWQoKSl7bC5hY3RpdmVUZXh0dXJlKGwuVEVYVFVSRTApLFM9bj9lLnNkZlNoYWRlcjplLmljb25TaGFkZXIsdz8oZS5nbHlwaEF0bGFzLnVwZGF0ZVRleHR1cmUobCksYz1hLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgseD1hLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LGI9W2UuZ2x5cGhBdGxhcy53aWR0aC80LGUuZ2x5cGhBdGxhcy5oZWlnaHQvNF0pOihlLnNwcml0ZUF0bGFzLmJpbmQobCxkfHxlLm9wdGlvbnMucm90YXRpbmd8fGUub3B0aW9ucy56b29taW5nfHwxIT09Z3x8bnx8ZS50cmFuc2Zvcm0ucGl0Y2gpLGM9YS5idWZmZXJzLmljb25WZXJ0ZXgseD1hLmJ1ZmZlcnMuaWNvbkVsZW1lbnQsYj1bZS5zcHJpdGVBdGxhcy53aWR0aC80LGUuc3ByaXRlQXRsYXMuaGVpZ2h0LzRdKSxsLnN3aXRjaFNoYWRlcihTLHIsbSksbC51bmlmb3JtMWkoUy51X3RleHR1cmUsMCksbC51bmlmb3JtMmZ2KFMudV90ZXhzaXplLGIpLGwudW5pZm9ybTFpKFMudV9za2V3ZWQsaCksbC51bmlmb3JtMWYoUy51X2V4dHJhLHopO3ZhciB5PU1hdGgubG9nKHAvb1tpK1wiLXNpemVcIl0pL01hdGguTE4yfHwwO2wudW5pZm9ybTFmKFMudV96b29tLDEwKihlLnRyYW5zZm9ybS56b29tLXkpKTt2YXIgRT1lLmZyYW1lSGlzdG9yeS5nZXRGYWRlUHJvcGVydGllcygzMDApO2wudW5pZm9ybTFmKFMudV9mYWRlZGlzdCwxMCpFLmZhZGVkaXN0KSxsLnVuaWZvcm0xZihTLnVfbWluZmFkZXpvb20sTWF0aC5mbG9vcigxMCpFLm1pbmZhZGV6b29tKSksbC51bmlmb3JtMWYoUy51X21heGZhZGV6b29tLE1hdGguZmxvb3IoMTAqRS5tYXhmYWRlem9vbSkpLGwudW5pZm9ybTFmKFMudV9mYWRlem9vbSwxMCooZS50cmFuc2Zvcm0uem9vbStFLmJ1bXApKTt2YXIgVCxJLE4sTTtpZih4LmJpbmQobCksbil7dmFyIEE9OCxMPTEuMTksUj02LEc9LjEwNSpkZWZhdWx0U2l6ZXNbaV0vcC9icm93c2VyLmRldmljZVBpeGVsUmF0aW87bC51bmlmb3JtMWYoUy51X2dhbW1hLEcqdSksbC51bmlmb3JtNGZ2KFMudV9jb2xvcix0LnBhaW50W2krXCItY29sb3JcIl0pLGwudW5pZm9ybTFmKFMudV9idWZmZXIsLjc1KTtmb3IodmFyIEQ9MDtEPG8uZ3JvdXBzLmxlbmd0aDtEKyspVD1vLmdyb3Vwc1tEXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSk7aWYodC5wYWludFtpK1wiLWhhbG8td2lkdGhcIl0pe2wudW5pZm9ybTFmKFMudV9nYW1tYSwodC5wYWludFtpK1wiLWhhbG8tYmx1clwiXSpML2cvQStHKSp1KSxsLnVuaWZvcm00ZnYoUy51X2NvbG9yLHQucGFpbnRbaStcIi1oYWxvLWNvbG9yXCJdKSxsLnVuaWZvcm0xZihTLnVfYnVmZmVyLChSLXQucGFpbnRbaStcIi1oYWxvLXdpZHRoXCJdL2cpL0EpO2Zvcih2YXIgcT0wO3E8by5ncm91cHMubGVuZ3RoO3ErKylUPW8uZ3JvdXBzW3FdLEk9VC52ZXJ0ZXhTdGFydEluZGV4KmMuaXRlbVNpemUsYy5iaW5kKGwsUyxJKSxOPTMqVC5lbGVtZW50TGVuZ3RoLE09VC5lbGVtZW50U3RhcnRJbmRleCp4Lml0ZW1TaXplLGwuZHJhd0VsZW1lbnRzKGwuVFJJQU5HTEVTLE4sbC5VTlNJR05FRF9TSE9SVCxNKX19ZWxzZXtsLnVuaWZvcm0xZihTLnVfb3BhY2l0eSx0LnBhaW50W1wiaWNvbi1vcGFjaXR5XCJdKTtmb3IodmFyIEM9MDtDPG8uZ3JvdXBzLmxlbmd0aDtDKyspVD1vLmdyb3Vwc1tDXSxJPVQudmVydGV4U3RhcnRJbmRleCpjLml0ZW1TaXplLGMuYmluZChsLFMsSSksTj0zKlQuZWxlbWVudExlbmd0aCxNPVQuZWxlbWVudFN0YXJ0SW5kZXgqeC5pdGVtU2l6ZSxsLmRyYXdFbGVtZW50cyhsLlRSSUFOR0xFUyxOLGwuVU5TSUdORURfU0hPUlQsTSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0LGRyYXdDb2xsaXNpb25EZWJ1Zz1yZXF1aXJlKFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiKTttb2R1bGUuZXhwb3J0cz1kcmF3U3ltYm9sczt2YXIgZGVmYXVsdFNpemVzPXtpY29uOjEsdGV4dDoyNH07XG59LHtcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiOjI3LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd1ZlcnRpY2VzKGUscix0LGkpe2Z1bmN0aW9uIG8ocix0LGksbyl7Zi5zd2l0Y2hTaGFkZXIoZS5kb3RTaGFkZXIsaSksZi51bmlmb3JtMWYoZS5kb3RTaGFkZXIudV9zaXplLDQqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSxmLnVuaWZvcm0xZihlLmRvdFNoYWRlci51X2JsdXIsLjI1KSxmLnVuaWZvcm00ZnYoZS5kb3RTaGFkZXIudV9jb2xvcixbLjEsMCwwLC4xXSksci5iaW5kKGYsZS5kb3RTaGFkZXIsMCk7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRbYV0sdT1zLnZlcnRleFN0YXJ0SW5kZXgsZD1zLnZlcnRleExlbmd0aDtmLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5kb3RTaGFkZXIuYV9wb3MsMixmLlNIT1JULCExLG8sMCksZi5kcmF3QXJyYXlzKGYuUE9JTlRTLHUsZCl9fXZhciBmPWUuZ2w7aWYoaSYmaS5idWZmZXJzKXt2YXIgYT1pLmVsZW1lbnRHcm91cHNbci5yZWZ8fHIuaWRdO2lmKGEpe2lmKGYuYmxlbmRGdW5jKGYuT05FLGYuT05FX01JTlVTX1NSQ19BTFBIQSksXCJmaWxsXCI9PT1yLnR5cGUpbyhpLmJ1ZmZlcnMuZmlsbFZlcnRleCxhLmdyb3Vwcyx0LDQpO2Vsc2UgaWYoXCJzeW1ib2xcIj09PXIudHlwZSlvKGkuYnVmZmVycy5pY29uVmVydGV4LGEuaWNvbi5ncm91cHMsdCwxNiksbyhpLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsYS50ZXh0Lmdyb3Vwcyx0LDE2KTtlbHNlIGlmKFwibGluZVwiPT09ci50eXBlKXt2YXIgcz1tYXQ0LmNsb25lKHQpO21hdDQuc2NhbGUocyxzLFsuNSwuNSwxXSksbyhpLmJ1ZmZlcnMubGluZVZlcnRleCxhLmdyb3VwcyxzLDgpfWYuYmxlbmRGdW5jKGYuT05FX01JTlVTX0RTVF9BTFBIQSxmLk9ORSl9fX12YXIgYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLG1hdDQ9cmVxdWlyZShcImdsLW1hdHJpeFwiKS5tYXQ0O21vZHVsZS5leHBvcnRzPWRyYXdWZXJ0aWNlcztcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6OTUsXCJnbC1tYXRyaXhcIjoxMTZ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBGcmFtZUhpc3RvcnkoKXt0aGlzLmZyYW1lSGlzdG9yeT1bXX1tb2R1bGUuZXhwb3J0cz1GcmFtZUhpc3RvcnksRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5nZXRGYWRlUHJvcGVydGllcz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0zMDApO2Zvcih2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGg+MyYmdGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGU7KXRoaXMuZnJhbWVIaXN0b3J5LnNoaWZ0KCk7dGhpcy5mcmFtZUhpc3RvcnlbMV0udGltZSt0PGUmJih0aGlzLmZyYW1lSGlzdG9yeVswXS56PXRoaXMuZnJhbWVIaXN0b3J5WzFdLnopO3ZhciByPXRoaXMuZnJhbWVIaXN0b3J5Lmxlbmd0aDszPnImJmNvbnNvbGUud2FybihcInRoZXJlIHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4gdGhyZWUgZnJhbWVzIGluIHRoZSBoaXN0b3J5XCIpO3ZhciBpPXRoaXMuZnJhbWVIaXN0b3J5WzBdLnoscz10aGlzLmZyYW1lSGlzdG9yeVtyLTFdLG89cy56LGE9TWF0aC5taW4oaSxvKSxtPU1hdGgubWF4KGksbyksaD1zLnotdGhpcy5mcmFtZUhpc3RvcnlbMV0ueixmPXMudGltZS10aGlzLmZyYW1lSGlzdG9yeVsxXS50aW1lLHk9aC8oZi90KTtpc05hTih5KSYmY29uc29sZS53YXJuKFwiZmFkZWRpc3Qgc2hvdWxkIG5ldmVyIGJlIE5hTlwiKTt2YXIgbj0oZS1zLnRpbWUpL3QqeTtyZXR1cm57ZmFkZWRpc3Q6eSxtaW5mYWRlem9vbTphLG1heGZhZGV6b29tOm0sYnVtcDpufX0sRnJhbWVIaXN0b3J5LnByb3RvdHlwZS5yZWNvcmQ9ZnVuY3Rpb24odCl7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOjAsejp0fSx7dGltZTowLHo6dH0pLCgyPT09dGhpcy5mcmFtZUhpc3RvcnkubGVuZ3RofHx0aGlzLmZyYW1lSGlzdG9yeVt0aGlzLmZyYW1lSGlzdG9yeS5sZW5ndGgtMV0ueiE9PXQpJiZ0aGlzLmZyYW1lSGlzdG9yeS5wdXNoKHt0aW1lOmUsejp0fSl9O1xufSx7fV0sMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHNoYWRlcnM9cmVxdWlyZShcIi4vc2hhZGVyc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7ZXhwb3J0cy5leHRlbmQ9ZnVuY3Rpb24ocil7dmFyIHQ9ci5saW5lV2lkdGgsZT1yLmdldFBhcmFtZXRlcihyLkFMSUFTRURfTElORV9XSURUSF9SQU5HRSk7cmV0dXJuIHIubGluZVdpZHRoPWZ1bmN0aW9uKGkpe3QuY2FsbChyLHV0aWwuY2xhbXAoaSxlWzBdLGVbMV0pKX0sci5nZXRTaGFkZXI9ZnVuY3Rpb24ocix0KXt2YXIgZT10PT09dGhpcy5GUkFHTUVOVF9TSEFERVI/XCJmcmFnbWVudFwiOlwidmVydGV4XCI7aWYoIXNoYWRlcnNbcl18fCFzaGFkZXJzW3JdW2VdKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHNoYWRlciBcIityKTt2YXIgaT10aGlzLmNyZWF0ZVNoYWRlcih0KSxhPXNoYWRlcnNbcl1bZV07aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIG9yaWVudGF0aW9uJiYoYT1hLnJlcGxhY2UoLyBoaWdocCAvZyxcIiBcIikpLHRoaXMuc2hhZGVyU291cmNlKGksYSksdGhpcy5jb21waWxlU2hhZGVyKGkpLCF0aGlzLmdldFNoYWRlclBhcmFtZXRlcihpLHRoaXMuQ09NUElMRV9TVEFUVVMpKXRocm93IG5ldyBFcnJvcih0aGlzLmdldFNoYWRlckluZm9Mb2coaSkpO3JldHVybiBpfSxyLmluaXRpYWxpemVTaGFkZXI9ZnVuY3Rpb24ocix0LGUpe3ZhciBpPXtwcm9ncmFtOnRoaXMuY3JlYXRlUHJvZ3JhbSgpLGZyYWdtZW50OnRoaXMuZ2V0U2hhZGVyKHIsdGhpcy5GUkFHTUVOVF9TSEFERVIpLHZlcnRleDp0aGlzLmdldFNoYWRlcihyLHRoaXMuVkVSVEVYX1NIQURFUiksYXR0cmlidXRlczpbXX07aWYodGhpcy5hdHRhY2hTaGFkZXIoaS5wcm9ncmFtLGkudmVydGV4KSx0aGlzLmF0dGFjaFNoYWRlcihpLnByb2dyYW0saS5mcmFnbWVudCksdGhpcy5saW5rUHJvZ3JhbShpLnByb2dyYW0pLHRoaXMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihpLnByb2dyYW0sdGhpcy5MSU5LX1NUQVRVUykpe2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWlbdFthXV09dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihpLnByb2dyYW0sdFthXSksaS5hdHRyaWJ1dGVzLnB1c2goaVt0W2FdXSk7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspaVtlW2hdXT10aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihpLnByb2dyYW0sZVtoXSl9ZWxzZSBjb25zb2xlLmVycm9yKHRoaXMuZ2V0UHJvZ3JhbUluZm9Mb2coaS5wcm9ncmFtKSk7cmV0dXJuIGl9LHIuc3dpdGNoU2hhZGVyPWZ1bmN0aW9uKHIsdCxlKXtpZih0fHxjb25zb2xlLnRyYWNlKFwicG9zTWF0cml4IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgYXJndW1lbnRcIiksdGhpcy5jdXJyZW50U2hhZGVyIT09cil7dGhpcy51c2VQcm9ncmFtKHIucHJvZ3JhbSk7Zm9yKHZhciBpPXRoaXMuY3VycmVudFNoYWRlcj90aGlzLmN1cnJlbnRTaGFkZXIuYXR0cmlidXRlczpbXSxhPXIuYXR0cmlidXRlcyxoPTA7aDxpLmxlbmd0aDtoKyspYS5pbmRleE9mKGlbaF0pPDAmJnRoaXMuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGlbaF0pO2Zvcih2YXIgbz0wO288YS5sZW5ndGg7bysrKWkuaW5kZXhPZihhW29dKTwwJiZ0aGlzLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFbb10pO3RoaXMuY3VycmVudFNoYWRlcj1yfXIucG9zTWF0cml4IT09dCYmKHRoaXMudW5pZm9ybU1hdHJpeDRmdihyLnVfbWF0cml4LCExLHQpLHIucG9zTWF0cml4PXQpLGUmJnIuZXhNYXRyaXghPT1lJiZyLnVfZXhtYXRyaXgmJih0aGlzLnVuaWZvcm1NYXRyaXg0ZnYoci51X2V4bWF0cml4LCExLGUpLHIuZXhNYXRyaXg9ZSl9LHIudmVydGV4QXR0cmliMmZ2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIyZih0LGVbMF0sZVsxXSl9LHIudmVydGV4QXR0cmliM2Z2PWZ1bmN0aW9uKHQsZSl7ci52ZXJ0ZXhBdHRyaWIzZih0LGVbMF0sZVsxXSxlWzJdKX0sci52ZXJ0ZXhBdHRyaWI0ZnY9ZnVuY3Rpb24odCxlKXtyLnZlcnRleEF0dHJpYjRmKHQsZVswXSxlWzFdLGVbMl0sZVszXSl9LHJ9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3NoYWRlcnNcIjozOH1dLDM2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIExpbmVBdGxhcyh0LGkpe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1pLHRoaXMubmV4dFJvdz0wLHRoaXMuYnl0ZXM9NCx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy53aWR0aCp0aGlzLmhlaWdodCp0aGlzLmJ5dGVzKSx0aGlzLnBvc2l0aW9ucz17fX1tb2R1bGUuZXhwb3J0cz1MaW5lQXRsYXMsTGluZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sTGluZUF0bGFzLnByb3RvdHlwZS5nZXREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9dC5qb2luKFwiLFwiKStpO3JldHVybiB0aGlzLnBvc2l0aW9uc1tlXXx8KHRoaXMucG9zaXRpb25zW2VdPXRoaXMuYWRkRGFzaCh0LGkpKSx0aGlzLnBvc2l0aW9uc1tlXX0sTGluZUF0bGFzLnByb3RvdHlwZS5hZGREYXNoPWZ1bmN0aW9uKHQsaSl7dmFyIGU9aT83OjAsaD0yKmUrMSxzPTEyODtpZih0aGlzLm5leHRSb3craD50aGlzLmhlaWdodClyZXR1cm4gY29uc29sZS53YXJuKFwiTGluZUF0bGFzIG91dCBvZiBzcGFjZVwiKSxudWxsO2Zvcih2YXIgYT0wLHI9MDtyPHQubGVuZ3RoO3IrKylhKz10W3JdO2Zvcih2YXIgbj10aGlzLndpZHRoL2Esbz1uLzIsZD10Lmxlbmd0aCUyPT09MSxFPS1lO2U+PUU7RSsrKWZvcih2YXIgVD10aGlzLm5leHRSb3crZStFLGw9dGhpcy53aWR0aCpULFI9ZD8tdFt0Lmxlbmd0aC0xXTowLHU9dFswXSxnPTEscD0wO3A8dGhpcy53aWR0aDtwKyspe2Zvcig7cC9uPnU7KVI9dSx1Kz10W2ddLGQmJmc9PT10Lmxlbmd0aC0xJiYodSs9dFswXSksZysrO3ZhciB4LGY9TWF0aC5hYnMocC1SKm4pLEE9TWF0aC5hYnMocC11Km4pLHc9TWF0aC5taW4oZixBKSxfPWclMj09PTE7aWYoaSl7dmFyIHk9ZT9FL2UqKG8rMSk6MDtpZihfKXt2YXIgRD1vLU1hdGguYWJzKHkpO3g9TWF0aC5zcXJ0KHcqdytEKkQpfWVsc2UgeD1vLU1hdGguc3FydCh3KncreSp5KX1lbHNlIHg9KF8/MTotMSkqdzt0aGlzLmRhdGFbMys0KihsK3ApXT1NYXRoLm1heCgwLE1hdGgubWluKDI1NSx4K3MpKX12YXIgYz17eToodGhpcy5uZXh0Um93K2UrLjUpL3RoaXMuaGVpZ2h0LGhlaWdodDoyKmUvdGhpcy5oZWlnaHQsd2lkdGg6YX07cmV0dXJuIHRoaXMubmV4dFJvdys9aCx0aGlzLmRpcnR5PSEwLGN9LExpbmVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt0aGlzLnRleHR1cmU/KHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdGhpcy5kaXJ0eSYmKHRoaXMuZGlydHk9ITEsdC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsdGhpcy5kYXRhKSkpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5SRVBFQVQpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfVCx0LlJFUEVBVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LDAsdC5SR0JBLHQuVU5TSUdORURfQllURSx0aGlzLmRhdGEpKX0sTGluZUF0bGFzLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0LnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0LnN0eWxlLnRvcD0wLHQuc3R5bGUubGVmdD0wLHQuc3R5bGUuYmFja2dyb3VuZD1cIiNmZjBcIix0LndpZHRoPXRoaXMud2lkdGgsdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7Zm9yKHZhciBpPXQuZ2V0Q29udGV4dChcIjJkXCIpLGU9aS5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGg9MDtoPHRoaXMuZGF0YS5sZW5ndGg7aCsrKWlmKHRoaXMuc2RmKXt2YXIgcz00Kmg7ZS5kYXRhW3NdPWUuZGF0YVtzKzFdPWUuZGF0YVtzKzJdPTAsZS5kYXRhW3MrM109dGhpcy5kYXRhW2hdfWVsc2UgZS5kYXRhW2hdPXRoaXMuZGF0YVtoXTtpLnB1dEltYWdlRGF0YShlLDAsMCl9O1xufSx7fV0sMzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGFpbnRlcih0LGUpe3RoaXMuZ2w9Z2x1dGlsLmV4dGVuZCh0KSx0aGlzLnRyYW5zZm9ybT1lLHRoaXMucmV1c2FibGVUZXh0dXJlcz17fSx0aGlzLnByZUZib3M9e30sdGhpcy5mcmFtZUhpc3Rvcnk9bmV3IEZyYW1lSGlzdG9yeSx0aGlzLnNldHVwKCl9dmFyIGdsdXRpbD1yZXF1aXJlKFwiLi9nbF91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxtYXQ0PXJlcXVpcmUoXCJnbC1tYXRyaXhcIikubWF0NCxGcmFtZUhpc3Rvcnk9cmVxdWlyZShcIi4vZnJhbWVfaGlzdG9yeVwiKTttb2R1bGUuZXhwb3J0cz1QYWludGVyLFBhaW50ZXIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2w7dGhpcy53aWR0aD10KmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyx0aGlzLmhlaWdodD1lKmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxpLnZpZXdwb3J0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sUGFpbnRlci5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QudmVyYm9zZT0hMCx0LmVuYWJsZSh0LkJMRU5EKSx0LmJsZW5kRnVuYyh0Lk9ORV9NSU5VU19EU1RfQUxQSEEsdC5PTkUpLHQuZW5hYmxlKHQuU1RFTkNJTF9URVNUKSx0aGlzLmRlYnVnU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImRlYnVnXCIsW1wiYV9wb3NcIl0sW1widV9tYXRyaXhcIixcInVfY29sb3JcIl0pLHRoaXMucmFzdGVyU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInJhc3RlclwiLFtcImFfcG9zXCIsXCJhX3RleHR1cmVfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2JyaWdodG5lc3NfbG93XCIsXCJ1X2JyaWdodG5lc3NfaGlnaFwiLFwidV9zYXR1cmF0aW9uX2ZhY3RvclwiLFwidV9zcGluX3dlaWdodHNcIixcInVfY29udHJhc3RfZmFjdG9yXCIsXCJ1X29wYWNpdHkwXCIsXCJ1X29wYWNpdHkxXCIsXCJ1X2ltYWdlMFwiLFwidV9pbWFnZTFcIixcInVfdGxfcGFyZW50XCIsXCJ1X3NjYWxlX3BhcmVudFwiLFwidV9idWZmZXJfc2NhbGVcIl0pLHRoaXMuY2lyY2xlU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImNpcmNsZVwiLFtcImFfcG9zXCJdLFtcInVfbWF0cml4XCIsXCJ1X2V4bWF0cml4XCIsXCJ1X2JsdXJcIixcInVfc2l6ZVwiLFwidV9jb2xvclwiXSksdGhpcy5saW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImxpbmVcIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X2V4dHJhXCIsXCJ1X2FudGlhbGlhc2luZ21hdHJpeFwiXSksdGhpcy5saW5lcGF0dGVyblNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJsaW5lcGF0dGVyblwiLFtcImFfcG9zXCIsXCJhX2RhdGFcIl0sW1widV9tYXRyaXhcIixcInVfbGluZXdpZHRoXCIsXCJ1X3JhdGlvXCIsXCJ1X3BhdHRlcm5fc2l6ZV9hXCIsXCJ1X3BhdHRlcm5fc2l6ZV9iXCIsXCJ1X3BhdHRlcm5fdGxfYVwiLFwidV9wYXR0ZXJuX2JyX2FcIixcInVfcGF0dGVybl90bF9iXCIsXCJ1X3BhdHRlcm5fYnJfYlwiLFwidV9ibHVyXCIsXCJ1X2ZhZGVcIixcInVfb3BhY2l0eVwiLFwidV9leHRyYVwiLFwidV9hbnRpYWxpYXNpbmdtYXRyaXhcIl0pLHRoaXMubGluZXNkZnBhdHRlcm5TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwibGluZXNkZnBhdHRlcm5cIixbXCJhX3Bvc1wiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X2xpbmV3aWR0aFwiLFwidV9jb2xvclwiLFwidV9yYXRpb1wiLFwidV9ibHVyXCIsXCJ1X3BhdHRlcm5zY2FsZV9hXCIsXCJ1X3RleF95X2FcIixcInVfcGF0dGVybnNjYWxlX2JcIixcInVfdGV4X3lfYlwiLFwidV9pbWFnZVwiLFwidV9zZGZnYW1tYVwiLFwidV9taXhcIixcInVfZXh0cmFcIixcInVfYW50aWFsaWFzaW5nbWF0cml4XCJdKSx0aGlzLmRvdFNoYWRlcj10LmluaXRpYWxpemVTaGFkZXIoXCJkb3RcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9zaXplXCIsXCJ1X2NvbG9yXCIsXCJ1X2JsdXJcIl0pLHRoaXMuc2RmU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInNkZlwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfY29sb3JcIixcInVfZ2FtbWFcIixcInVfYnVmZmVyXCIsXCJ1X3pvb21cIixcInVfZmFkZWRpc3RcIixcInVfbWluZmFkZXpvb21cIixcInVfbWF4ZmFkZXpvb21cIixcInVfZmFkZXpvb21cIixcInVfc2tld2VkXCIsXCJ1X2V4dHJhXCJdKSx0aGlzLmljb25TaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiaWNvblwiLFtcImFfcG9zXCIsXCJhX29mZnNldFwiLFwiYV9kYXRhMVwiLFwiYV9kYXRhMlwiXSxbXCJ1X21hdHJpeFwiLFwidV9leG1hdHJpeFwiLFwidV90ZXh0dXJlXCIsXCJ1X3RleHNpemVcIixcInVfem9vbVwiLFwidV9mYWRlZGlzdFwiLFwidV9taW5mYWRlem9vbVwiLFwidV9tYXhmYWRlem9vbVwiLFwidV9mYWRlem9vbVwiLFwidV9vcGFjaXR5XCIsXCJ1X3NrZXdlZFwiLFwidV9leHRyYVwiXSksdGhpcy5vdXRsaW5lU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcIm91dGxpbmVcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiLFwidV93b3JsZFwiXSksdGhpcy5wYXR0ZXJuU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcInBhdHRlcm5cIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9wYXR0ZXJuX3RsX2FcIixcInVfcGF0dGVybl9icl9hXCIsXCJ1X3BhdHRlcm5fdGxfYlwiLFwidV9wYXR0ZXJuX2JyX2JcIixcInVfbWl4XCIsXCJ1X3BhdHRlcm5tYXRyaXhfYVwiLFwidV9wYXR0ZXJubWF0cml4X2JcIixcInVfb3BhY2l0eVwiLFwidV9pbWFnZVwiXSksdGhpcy5maWxsU2hhZGVyPXQuaW5pdGlhbGl6ZVNoYWRlcihcImZpbGxcIixbXCJhX3Bvc1wiXSxbXCJ1X21hdHJpeFwiLFwidV9jb2xvclwiXSksdGhpcy5jb2xsaXNpb25Cb3hTaGFkZXI9dC5pbml0aWFsaXplU2hhZGVyKFwiY29sbGlzaW9uYm94XCIsW1wiYV9wb3NcIixcImFfZXh0cnVkZVwiLFwiYV9kYXRhXCJdLFtcInVfbWF0cml4XCIsXCJ1X3NjYWxlXCIsXCJ1X3pvb21cIixcInVfbWF4em9vbVwiXSksdGhpcy5pZGVudGl0eU1hdHJpeD1tYXQ0LmNyZWF0ZSgpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtQ291bnQ9NCx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LmJ1ZmZlckRhdGEodC5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWy0xLC0xLDEsLTEsLTEsMSwxLDFdKSx0LlNUQVRJQ19EUkFXKSx0aGlzLnNldEV4dGVudCg0MDk2KSx0aGlzLmRlYnVnVGV4dEJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHRoaXMuZGVidWdUZXh0QnVmZmVyLml0ZW1TaXplPTJ9LFBhaW50ZXIucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0KXtpZih0JiZ0IT09dGhpcy50aWxlRXh0ZW50KXt0aGlzLnRpbGVFeHRlbnQ9dDt2YXIgZT10aGlzLmdsO3RoaXMudGlsZUV4dGVudEJ1ZmZlcj1lLmNyZWF0ZUJ1ZmZlcigpLHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtU2l6ZT00LHRoaXMudGlsZUV4dGVudEJ1ZmZlci5pdGVtQ291bnQ9NCxlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdGhpcy50aWxlRXh0ZW50QnVmZmVyKSxlLmJ1ZmZlckRhdGEoZS5BUlJBWV9CVUZGRVIsbmV3IEludDE2QXJyYXkoWzAsMCwwLDAsdGhpcy50aWxlRXh0ZW50LDAsMzI3NjcsMCwwLHRoaXMudGlsZUV4dGVudCwwLDMyNzY3LHRoaXMudGlsZUV4dGVudCx0aGlzLnRpbGVFeHRlbnQsMzI3NjcsMzI3NjddKSxlLlNUQVRJQ19EUkFXKSx0aGlzLmRlYnVnQnVmZmVyPWUuY3JlYXRlQnVmZmVyKCksdGhpcy5kZWJ1Z0J1ZmZlci5pdGVtU2l6ZT0yLHRoaXMuZGVidWdCdWZmZXIuaXRlbUNvdW50PTUsZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMuZGVidWdCdWZmZXIpLGUuYnVmZmVyRGF0YShlLkFSUkFZX0JVRkZFUixuZXcgSW50MTZBcnJheShbMCwwLHRoaXMudGlsZUV4dGVudC0xLDAsdGhpcy50aWxlRXh0ZW50LTEsdGhpcy50aWxlRXh0ZW50LTEsMCx0aGlzLnRpbGVFeHRlbnQtMSwwLDBdKSxlLlNUQVRJQ19EUkFXKX19LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuY2xlYXJDb2xvcigwLDAsMCwwKSx0LmNsZWFyKHQuQ09MT1JfQlVGRkVSX0JJVCl9LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2w7dC5jbGVhclN0ZW5jaWwoMCksdC5zdGVuY2lsTWFzaygyNTUpLHQuY2xlYXIodC5TVEVOQ0lMX0JVRkZFUl9CSVQpfSxQYWludGVyLnByb3RvdHlwZS5kcmF3Q2xpcHBpbmdNYXNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2w7ZS5zd2l0Y2hTaGFkZXIodGhpcy5maWxsU2hhZGVyLHQucG9zTWF0cml4KSxlLmNvbG9yTWFzayghMSwhMSwhMSwhMSksZS5jbGVhclN0ZW5jaWwoMCksZS5zdGVuY2lsTWFzaygxOTEpLGUuY2xlYXIoZS5TVEVOQ0lMX0JVRkZFUl9CSVQpLGUuc3RlbmNpbEZ1bmMoZS5FUVVBTCwxOTIsNjQpLGUuc3RlbmNpbE1hc2soMTkyKSxlLnN0ZW5jaWxPcChlLlJFUExBQ0UsZS5LRUVQLGUuS0VFUCksZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHRoaXMudGlsZUV4dGVudEJ1ZmZlciksZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuZmlsbFNoYWRlci5hX3Bvcyx0aGlzLnRpbGVFeHRlbnRCdWZmZXIuaXRlbVNpemUsZS5TSE9SVCwhMSw4LDApLGUuZHJhd0FycmF5cyhlLlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksZS5zdGVuY2lsRnVuYyhlLkVRVUFMLDEyOCwxMjgpLGUuc3RlbmNpbE9wKGUuS0VFUCxlLktFRVAsZS5SRVBMQUNFKSxlLnN0ZW5jaWxNYXNrKDApLGUuY29sb3JNYXNrKCEwLCEwLCEwLCEwKX0sUGFpbnRlci5wcm90b3R5cGUucHJlcGFyZUJ1ZmZlcnM9ZnVuY3Rpb24oKXt9LFBhaW50ZXIucHJvdG90eXBlLmJpbmREZWZhdWx0RnJhbWVidWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsbnVsbCl9O3ZhciBkcmF3PXtzeW1ib2w6cmVxdWlyZShcIi4vZHJhd19zeW1ib2xcIiksY2lyY2xlOnJlcXVpcmUoXCIuL2RyYXdfY2lyY2xlXCIpLGxpbmU6cmVxdWlyZShcIi4vZHJhd19saW5lXCIpLGZpbGw6cmVxdWlyZShcIi4vZHJhd19maWxsXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9kcmF3X3Jhc3RlclwiKSxiYWNrZ3JvdW5kOnJlcXVpcmUoXCIuL2RyYXdfYmFja2dyb3VuZFwiKSxkZWJ1ZzpyZXF1aXJlKFwiLi9kcmF3X2RlYnVnXCIpLHZlcnRpY2VzOnJlcXVpcmUoXCIuL2RyYXdfdmVydGljZXNcIil9O1BhaW50ZXIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbih0LGUpe3RoaXMuc3R5bGU9dCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmxpbmVBdGxhcz10LmxpbmVBdGxhcyx0aGlzLnNwcml0ZUF0bGFzPXQuc3ByaXRlQXRsYXMsdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUodC5zcHJpdGUpLHRoaXMuZ2x5cGhBdGxhcz10LmdseXBoQXRsYXMsdGhpcy5nbHlwaEF0bGFzLmJpbmQodGhpcy5nbCksdGhpcy5mcmFtZUhpc3RvcnkucmVjb3JkKHRoaXMudHJhbnNmb3JtLnpvb20pLHRoaXMucHJlcGFyZUJ1ZmZlcnMoKSx0aGlzLmNsZWFyQ29sb3IoKTtmb3IodmFyIGk9dC5fZ3JvdXBzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcj10Ll9ncm91cHNbaV0sYT10LnNvdXJjZXNbci5zb3VyY2VdO2E/KHRoaXMuY2xlYXJTdGVuY2lsKCksYS5yZW5kZXIocix0aGlzKSk6dm9pZCAwPT09ci5zb3VyY2UmJnRoaXMuZHJhd0xheWVycyhyLHRoaXMuaWRlbnRpdHlNYXRyaXgpfX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd1RpbGU9ZnVuY3Rpb24odCxlKXt0aGlzLnNldEV4dGVudCh0LnRpbGVFeHRlbnQpLHRoaXMuZHJhd0NsaXBwaW5nTWFzayh0KSx0aGlzLmRyYXdMYXllcnMoZSx0LnBvc01hdHJpeCx0KSx0aGlzLm9wdGlvbnMuZGVidWcmJmRyYXcuZGVidWcodGhpcyx0KX0sUGFpbnRlci5wcm90b3R5cGUuZHJhd0xheWVycz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBhPXRbcl07YS5oaWRkZW58fChkcmF3W2EudHlwZV0odGhpcyxhLGUsaSksdGhpcy5vcHRpb25zLnZlcnRpY2VzJiZkcmF3LnZlcnRpY2VzKHRoaXMsYSxlLGkpKX19LFBhaW50ZXIucHJvdG90eXBlLmRyYXdTdGVuY2lsQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbDt0LnN3aXRjaFNoYWRlcih0aGlzLmZpbGxTaGFkZXIsdGhpcy5pZGVudGl0eU1hdHJpeCksdC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnN0ZW5jaWxNYXNrKDApLHQuc3RlbmNpbEZ1bmModC5FUVVBTCwxMjgsMTI4KSx0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsdGhpcy5iYWNrZ3JvdW5kQnVmZmVyKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5maWxsU2hhZGVyLmFfcG9zLHRoaXMuYmFja2dyb3VuZEJ1ZmZlci5pdGVtU2l6ZSx0LlNIT1JULCExLDAsMCksdC51bmlmb3JtNGZ2KHRoaXMuZmlsbFNoYWRlci51X2NvbG9yLFswLDAsMCwuNV0pLHQuZHJhd0FycmF5cyh0LlRSSUFOR0xFX1NUUklQLDAsdGhpcy50aWxlRXh0ZW50QnVmZmVyLml0ZW1Db3VudCksdC5ibGVuZEZ1bmModC5PTkVfTUlOVVNfRFNUX0FMUEhBLHQuT05FKX0sUGFpbnRlci5wcm90b3R5cGUudHJhbnNsYXRlTWF0cml4PWZ1bmN0aW9uKHQsZSxpLHIpe2lmKCFpWzBdJiYhaVsxXSlyZXR1cm4gdDtpZihcInZpZXdwb3J0XCI9PT1yKXt2YXIgYT1NYXRoLnNpbigtdGhpcy50cmFuc2Zvcm0uYW5nbGUpLHM9TWF0aC5jb3MoLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtpPVtpWzBdKnMtaVsxXSphLGlbMF0qYStpWzFdKnNdfXZhciB1PXRoaXMudHJhbnNmb3JtLnNjYWxlLygxPDxlLmNvb3JkLnopLyhlLnRpbGVFeHRlbnQvZS50aWxlU2l6ZSksbj1baVswXS91LGlbMV0vdSwwXSxfPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBtYXQ0LnRyYW5zbGF0ZShfLHQsbiksX30sUGFpbnRlci5wcm90b3R5cGUuc2F2ZVRleHR1cmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV07ZT9lLnB1c2godCk6dGhpcy5yZXVzYWJsZVRleHR1cmVzW3Quc2l6ZV09W3RdfSxQYWludGVyLnByb3RvdHlwZS5nZXRUZXh0dXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmV1c2FibGVUZXh0dXJlc1t0XTtyZXR1cm4gZSYmZS5sZW5ndGg+MD9lLnBvcCgpOm51bGx9O1xufSx7XCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4vZHJhd19iYWNrZ3JvdW5kXCI6MjUsXCIuL2RyYXdfY2lyY2xlXCI6MjYsXCIuL2RyYXdfZGVidWdcIjoyOCxcIi4vZHJhd19maWxsXCI6MjksXCIuL2RyYXdfbGluZVwiOjMwLFwiLi9kcmF3X3Jhc3RlclwiOjMxLFwiLi9kcmF3X3N5bWJvbFwiOjMyLFwiLi9kcmF3X3ZlcnRpY2VzXCI6MzMsXCIuL2ZyYW1lX2hpc3RvcnlcIjozNCxcIi4vZ2xfdXRpbFwiOjM1LFwiZ2wtbWF0cml4XCI6MTE2fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdsaWZ5PXZvaWQgMDttb2R1bGUuZXhwb3J0cz17ZGVidWc6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHN0ZXAoMzI3NjcuLGFfcG9zLngpLDEpO31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj11X2NvbG9yO31cIn0sZG90Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3NpemU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2dsX1BvaW50U2l6ZT11X3NpemU7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2JsdXI7dm9pZCBtYWluKCl7ZmxvYXQgYSxiO2E9bGVuZ3RoKGdsX1BvaW50Q29vcmQtLjUpO2I9c21vb3Roc3RlcCguNSwuNS11X2JsdXIsYSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYjt9XCJ9LGZpbGw6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXVfY29sb3I7fVwifSxjaXJjbGU6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gZmxvYXQgdV9zaXplO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeCx1X2V4bWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZvaWQgbWFpbigpe2E9dmVjMihtb2QoYV9wb3MsMi4pKjIuLTEuKTt2ZWM0IGI9dV9leG1hdHJpeCp2ZWM0KGEqdV9zaXplLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSksMCwxKTtnbF9Qb3NpdGlvbis9YipnbF9Qb3NpdGlvbi53O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2l6ZTt2YXJ5aW5nIHZlYzIgYTt2b2lkIG1haW4oKXtmbG9hdCBiPXNtb290aHN0ZXAoMS4tdV9ibHVyLDEuLGxlbmd0aChhKSk7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqKDEuLWIpO31cIn0sbGluZTp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfcmF0aW8sdV9leHRyYTt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGg7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe3ZlYzIgZCxlO2Q9YV9kYXRhLnh5O2U9bW9kKGFfcG9zLDIuKTtlLnk9c2lnbihlLnktLjUpO2E9ZTt2ZWM0IGY9dmVjNCh1X2xpbmV3aWR0aC5zKmQqLjAxNTg3MzAxNiwwLDApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoZmxvb3IoYV9wb3MqLjUpK2YueHkvdV9yYXRpbywwLDEpO2Zsb2F0IGcsaCxpO2c9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2g9bGVuZ3RoKGQpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCpkKTtpPTEuLygxLi1taW4oZyp1X2V4dHJhLC45KSk7Yz1pKmg7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7ZT11X2JsdXIqYztmPWNsYW1wKG1pbihkLSh1X2xpbmV3aWR0aC50LWUpLHVfbGluZXdpZHRoLnMtZCkvZSwwLiwxLik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqZjt9XCJ9LGxpbmVwYXR0ZXJuOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBoaWdocCBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X2V4dHJhO3VuaWZvcm0gdmVjMiB1X2xpbmV3aWR0aDt1bmlmb3JtIHZlYzQgdV9jb2xvcjt1bmlmb3JtIG1hdDIgdV9hbnRpYWxpYXNpbmdtYXRyaXg7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGYsZyxoO2Q9YV9kYXRhLnh5O2Zsb2F0IGUsaSxqLGs7ZT1hX2RhdGEueioxMjguK2FfZGF0YS53O2Y9bW9kKGFfcG9zLDIuKTtmLnk9c2lnbihmLnktLjUpO2E9ZjtnPWQqLjAxNTg3MzAxNjtoPXVfbGluZXdpZHRoLnMqZztnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGZsb29yKGFfcG9zKi41KStoLnh5L3VfcmF0aW8sMCwxKTtiPWU7aT1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7aj1sZW5ndGgoZCkvbGVuZ3RoKHVfYW50aWFsaWFzaW5nbWF0cml4KmQpO2s9MS4vKDEuLW1pbihpKnVfZXh0cmEsLjkpKTtjPWsqajt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuX3NpemVfYSx1X3BhdHRlcm5fc2l6ZV9iLHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gZmxvYXQgdV9wb2ludCx1X2JsdXIsdV9mYWRlLHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmLGcsaCxpLGo7ZD1sZW5ndGgoYSkqdV9saW5ld2lkdGgucztlPXVfYmx1cipjO2Y9Y2xhbXAobWluKGQtKHVfbGluZXdpZHRoLnQtZSksdV9saW5ld2lkdGgucy1kKS9lLDAuLDEuKTtnPW1vZChiL3VfcGF0dGVybl9zaXplX2EueCwxLik7aD1tb2QoYi91X3BhdHRlcm5fc2l6ZV9iLngsMS4pO2k9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYS55O2o9LjUrYS55KnVfbGluZXdpZHRoLnMvdV9wYXR0ZXJuX3NpemVfYi55O3ZlYzIgayxsO2s9bWl4KHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHZlYzIoZyxpKSk7bD1taXgodV9wYXR0ZXJuX3RsX2IsdV9wYXR0ZXJuX2JyX2IsdmVjMihoLGopKTt2ZWM0IG09bWl4KHRleHR1cmUyRCh1X2ltYWdlLGspLHRleHR1cmUyRCh1X2ltYWdlLGwpLHVfZmFkZSk7Zio9dV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj1tKmY7fVwifSxsaW5lc2RmcGF0dGVybjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9saW5ld2lkdGgsdV9wYXR0ZXJuc2NhbGVfYSx1X3BhdHRlcm5zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV9yYXRpbyx1X3RleF95X2EsdV90ZXhfeV9iLHVfZXh0cmE7dW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O3ZhcnlpbmcgdmVjMiBhLGIsYzt2YXJ5aW5nIGZsb2F0IGQ7dm9pZCBtYWluKCl7dmVjMiBlLGc7ZT1hX2RhdGEueHk7ZmxvYXQgZixpLGosaztmPWFfZGF0YS56KjEyOC4rYV9kYXRhLnc7Zz1tb2QoYV9wb3MsMi4pO2cueT1zaWduKGcueS0uNSk7YT1nO3ZlYzQgaD12ZWM0KHVfbGluZXdpZHRoLnMqZSouMDE1ODczMDE2LDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChmbG9vcihhX3BvcyouNSkraC54eS91X3JhdGlvLDAsMSk7Yj12ZWMyKGYqdV9wYXR0ZXJuc2NhbGVfYS54LGcueSp1X3BhdHRlcm5zY2FsZV9hLnkrdV90ZXhfeV9hKTtjPXZlYzIoZip1X3BhdHRlcm5zY2FsZV9iLngsZy55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO2k9Z2xfUG9zaXRpb24ueS9nbF9Qb3NpdGlvbi53O2o9bGVuZ3RoKGUpL2xlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCplKTtrPTEuLygxLi1taW4oaSp1X2V4dHJhLC45KSk7ZD1rKmo7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWMyIHVfbGluZXdpZHRoO3VuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9ibHVyLHVfc2RmZ2FtbWEsdV9taXg7dW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgYSxiLGM7dmFyeWluZyBmbG9hdCBkO3ZvaWQgbWFpbigpe2Zsb2F0IGUsZixnLGgsaSxqO2U9bGVuZ3RoKGEpKnVfbGluZXdpZHRoLnM7Zj11X2JsdXIqZDtnPWNsYW1wKG1pbihlLSh1X2xpbmV3aWR0aC50LWYpLHVfbGluZXdpZHRoLnMtZSkvZiwwLiwxLik7aD10ZXh0dXJlMkQodV9pbWFnZSxiKS5hO2k9dGV4dHVyZTJEKHVfaW1hZ2UsYykuYTtqPW1peChoLGksdV9taXgpO2cqPXNtb290aHN0ZXAoLjUtdV9zZGZnYW1tYSwuNSt1X3NkZmdhbW1hLGopO2dsX0ZyYWdDb2xvcj11X2NvbG9yKmc7fVwifSxvdXRsaW5lOnt2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGdsX1Bvc2l0aW9uLnh5L2dsX1Bvc2l0aW9uLncrMS4pLzIuKnVfd29ybGQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dmFyeWluZyB2ZWMyIGE7dm9pZCBtYWluKCl7ZmxvYXQgYixjO2I9bGVuZ3RoKGEtZ2xfRnJhZ0Nvb3JkLnh5KTtjPXNtb290aHN0ZXAoMS4sMC4sYik7Z2xfRnJhZ0NvbG9yPXVfY29sb3IqYzt9XCJ9LHBhdHRlcm46e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDMgdV9wYXR0ZXJubWF0cml4X2EsdV9wYXR0ZXJubWF0cml4X2I7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7YT0odV9wYXR0ZXJubWF0cml4X2EqdmVjMyhhX3BvcywxKSkueHk7Yj0odV9wYXR0ZXJubWF0cml4X2IqdmVjMyhhX3BvcywxKSkueHk7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHksdV9taXg7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hLHVfcGF0dGVybl9icl9hLHVfcGF0dGVybl90bF9iLHVfcGF0dGVybl9icl9iO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIGEsYjt2b2lkIG1haW4oKXt2ZWMyIGMsZCxmLGc7Yz1tb2QoYSwxLik7ZD1taXgodV9wYXR0ZXJuX3RsX2EsdV9wYXR0ZXJuX2JyX2EsYyk7dmVjNCBlLGg7ZT10ZXh0dXJlMkQodV9pbWFnZSxkKTtmPW1vZChiLDEuKTtnPW1peCh1X3BhdHRlcm5fdGxfYix1X3BhdHRlcm5fYnJfYixmKTtoPXRleHR1cmUyRCh1X2ltYWdlLGcpO2dsX0ZyYWdDb2xvcj1taXgoZSxoLHVfbWl4KSp1X29wYWNpdHk7fVwifSxyYXN0ZXI6e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV90bF9wYXJlbnQ7dW5pZm9ybSBmbG9hdCB1X3NjYWxlX3BhcmVudCx1X2J1ZmZlcl9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2E9KGFfdGV4dHVyZV9wb3MvMzI3NjcuLS41KS91X2J1ZmZlcl9zY2FsZSsuNTtiPWEqdV9zY2FsZV9wYXJlbnQrdV90bF9wYXJlbnQ7fVwiLGZyYWdtZW50OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHkwLHVfb3BhY2l0eTEsdV9icmlnaHRuZXNzX2xvdyx1X2JyaWdodG5lc3NfaGlnaCx1X3NhdHVyYXRpb25fZmFjdG9yLHVfY29udHJhc3RfZmFjdG9yO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2UwLHVfaW1hZ2UxO3ZhcnlpbmcgdmVjMiBhLGI7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpe3ZlYzQgYyxkLGU7Yz10ZXh0dXJlMkQodV9pbWFnZTAsYSk7ZD10ZXh0dXJlMkQodV9pbWFnZTEsYik7ZT1jKnVfb3BhY2l0eTArZCp1X29wYWNpdHkxO3ZlYzMgZixoLGk7Zj1lLnJnYjtmPXZlYzMoZG90KGYsdV9zcGluX3dlaWdodHMueHl6KSxkb3QoZix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChmLHVfc3Bpbl93ZWlnaHRzLnl6eCkpO2Zsb2F0IGc9KGUucitlLmcrZS5iKS8zLjtmKz0oZy1mKSp1X3NhdHVyYXRpb25fZmFjdG9yO2Y9KGYtLjUpKnVfY29udHJhc3RfZmFjdG9yKy41O2g9dmVjMyh1X2JyaWdodG5lc3NfbG93KTtpPXZlYzModV9icmlnaHRuZXNzX2hpZ2gpO2dsX0ZyYWdDb2xvcj12ZWM0KG1peChoLGksZiksZS5hKTt9XCJ9LGljb246e3ZlcnRleDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O2F0dHJpYnV0ZSB2ZWMyIGFfcG9zLGFfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTEsYV9kYXRhMjt1bmlmb3JtIGhpZ2hwIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfZXhtYXRyaXg7dW5pZm9ybSBmbG9hdCB1X3pvb20sdV9mYWRlZGlzdCx1X21pbmZhZGV6b29tLHVfbWF4ZmFkZXpvb20sdV9mYWRlem9vbSx1X29wYWNpdHksdV9leHRyYTt1bmlmb3JtIGJvb2wgdV9za2V3ZWQ7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7dmVjMiBjLGU7Yz1hX2RhdGExLnh5O2Zsb2F0IGQsZixnLGgsaSxqO2Q9YV9kYXRhMVsyXTtlPWFfZGF0YTIuc3Q7Zj1lWzBdO2c9ZVsxXTtoPTEwLjtpPTIuLXN0ZXAoZix1X3pvb20pLSgxLi1zdGVwKGcsdV96b29tKSk7aj1jbGFtcCgodV9mYWRlem9vbS1kKS91X2ZhZGVkaXN0LDAuLDEuKTtpZih1X2ZhZGVkaXN0Pj0wLiliPWo7ZWxzZSBiPTEuLWo7aWYodV9tYXhmYWRlem9vbTxkKWI9MC47aWYodV9taW5mYWRlem9vbT49ZCliPTEuO2krPXN0ZXAoYiwwLik7aWYodV9za2V3ZWQpe3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLDAsMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcytrLnh5LDAsMSk7Z2xfUG9zaXRpb24ueis9aSpnbF9Qb3NpdGlvbi53O31lbHNle3ZlYzQgaz11X2V4bWF0cml4KnZlYzQoYV9vZmZzZXQvNjQuLGksMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpK2s7fWE9Yy91X3RleHNpemU7Yio9dV9vcGFjaXR5O31cIixmcmFnbWVudDpcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt2YXJ5aW5nIHZlYzIgYTt2YXJ5aW5nIGZsb2F0IGI7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXRleHR1cmUyRCh1X3RleHR1cmUsYSkqYjt9XCJ9LHNkZjp7dmVydGV4OlwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7YXR0cmlidXRlIHZlYzIgYV9wb3MsYV9vZmZzZXQ7YXR0cmlidXRlIHZlYzQgYV9kYXRhMSxhX2RhdGEyO3VuaWZvcm0gaGlnaHAgbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9leG1hdHJpeDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X2ZhZGVkaXN0LHVfbWluZmFkZXpvb20sdV9tYXhmYWRlem9vbSx1X2ZhZGV6b29tLHVfZXh0cmE7dW5pZm9ybSBib29sIHVfc2tld2VkO3VuaWZvcm0gdmVjMiB1X3RleHNpemU7dmFyeWluZyB2ZWMyIGE7dmFyeWluZyBmbG9hdCBiLGM7dm9pZCBtYWluKCl7dmVjMiBkLGY7ZD1hX2RhdGExLnh5O2Zsb2F0IGUsZyxoLGksaixrLGw7ZT1hX2RhdGExWzJdO2Y9YV9kYXRhMi5zdDtnPWZbMF07aD1mWzFdO2k9Mi4tc3RlcChnLHVfem9vbSktKDEuLXN0ZXAoaCx1X3pvb20pKTtqPWNsYW1wKCh1X2ZhZGV6b29tLWUpL3VfZmFkZWRpc3QsMC4sMS4pO2lmKHVfZmFkZWRpc3Q+PTAuKWI9ajtlbHNlIGI9MS4tajtpZih1X21heGZhZGV6b29tPGUpYj0wLjtpZih1X21pbmZhZGV6b29tPj1lKWI9MS47aSs9c3RlcChiLDAuKTtpZih1X3NrZXdlZCl7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4sMCwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zK2sueHksMCwxKTtnbF9Qb3NpdGlvbi56Kz1pKmdsX1Bvc2l0aW9uLnc7fWVsc2V7dmVjNCBrPXVfZXhtYXRyaXgqdmVjNChhX29mZnNldC82NC4saSwwKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSkrazt9az1nbF9Qb3NpdGlvbi55L2dsX1Bvc2l0aW9uLnc7bD0xLi8oMS4tayp1X2V4dHJhKTtjPWw7YT1kL3VfdGV4c2l6ZTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dW5pZm9ybSB2ZWM0IHVfY29sb3I7dW5pZm9ybSBmbG9hdCB1X2J1ZmZlcix1X2dhbW1hO3ZhcnlpbmcgdmVjMiBhO3ZhcnlpbmcgZmxvYXQgYixjO3ZvaWQgbWFpbigpe2Zsb2F0IGQsZSxmO2Q9dV9nYW1tYSpjO2U9dGV4dHVyZTJEKHVfdGV4dHVyZSxhKS5hO2Y9c21vb3Roc3RlcCh1X2J1ZmZlci1kLHVfYnVmZmVyK2QsZSkqYjtnbF9GcmFnQ29sb3I9dV9jb2xvcipmO31cIn0sY29sbGlzaW9uYm94Ont2ZXJ0ZXg6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDthdHRyaWJ1dGUgdmVjMiBhX3BvcyxhX2V4dHJ1ZGUsYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfc2NhbGU7dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcythX2V4dHJ1ZGUvdV9zY2FsZSwwLDEpO2E9YV9kYXRhLng7Yj1hX2RhdGEueTt9XCIsZnJhZ21lbnQ6XCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDt1bmlmb3JtIGZsb2F0IHVfem9vbSx1X21heHpvb207dmFyeWluZyBmbG9hdCBhLGI7dm9pZCBtYWluKCl7ZmxvYXQgYz0uNTtnbF9GcmFnQ29sb3I9dmVjNCgwLDEsMCwxKSpjO2lmKGI+dV96b29tKWdsX0ZyYWdDb2xvcj12ZWM0KDEsMCwwLDEpKmM7aWYodV96b29tPj1hKWdsX0ZyYWdDb2xvcj12ZWM0KDAsMCwwLDEpKmMqLjI1O2lmKGI+PXVfbWF4em9vbSlnbF9GcmFnQ29sb3I9dmVjNCgwLDAsMSwxKSpjKi4yO31cIn19O1xufSx7fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gR2VvSlNPTlNvdXJjZShpKXtpPWl8fHt9LHRoaXMuX2RhdGE9aS5kYXRhLHZvaWQgMCE9PWkubWF4em9vbSYmKHRoaXMubWF4em9vbT1pLm1heHpvb20pLHRoaXMuZ2VvanNvblZ0T3B0aW9ucz17bWF4Wm9vbTp0aGlzLm1heHpvb219LHZvaWQgMCE9PWkuYnVmZmVyJiYodGhpcy5nZW9qc29uVnRPcHRpb25zLmJ1ZmZlcj1pLmJ1ZmZlciksdm9pZCAwIT09aS50b2xlcmFuY2UmJih0aGlzLmdlb2pzb25WdE9wdGlvbnMudG9sZXJhbmNlPWkudG9sZXJhbmNlKSx0aGlzLl9weXJhbWlkPW5ldyBUaWxlUHlyYW1pZCh7dGlsZVNpemU6NTEyLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLGNhY2hlU2l6ZToyMCxsb2FkOnRoaXMuX2xvYWRUaWxlLmJpbmQodGhpcyksYWJvcnQ6dGhpcy5fYWJvcnRUaWxlLmJpbmQodGhpcyksdW5sb2FkOnRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSxhZGQ6dGhpcy5fYWRkVGlsZS5iaW5kKHRoaXMpLHJlbW92ZTp0aGlzLl9yZW1vdmVUaWxlLmJpbmQodGhpcyl9KX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksU291cmNlPXJlcXVpcmUoXCIuL3NvdXJjZVwiKSx1cmxSZXNvbHZlPXJlcXVpcmUoXCJyZXNvbHZlLXVybFwiKTttb2R1bGUuZXhwb3J0cz1HZW9KU09OU291cmNlLEdlb0pTT05Tb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToxNCxfZGlydHk6ITAsc2V0RGF0YTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fZGF0YT1pLHRoaXMuX2RpcnR5PSEwLHRoaXMuZmlyZShcImNoYW5nZVwiKSx0aGlzLm1hcCYmdGhpcy51cGRhdGUodGhpcy5tYXAudHJhbnNmb3JtKSx0aGlzfSxvbkFkZDpmdW5jdGlvbihpKXt0aGlzLm1hcD1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oaSl7dGhpcy5fZGlydHkmJnRoaXMuX3VwZGF0ZURhdGEoKSx0aGlzLl9sb2FkZWQmJnRoaXMuX3B5cmFtaWQudXBkYXRlKHRoaXMudXNlZCxpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fbG9hZGVkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfdXBkYXRlRGF0YTpmdW5jdGlvbigpe3RoaXMuX2RpcnR5PSExO3ZhciBpPXRoaXMuX2RhdGE7XCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPXVybFJlc29sdmUod2luZG93LmxvY2F0aW9uLmhyZWYsaSkpLHRoaXMud29ya2VySUQ9dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJwYXJzZSBnZW9qc29uXCIse2RhdGE6aSx0aWxlU2l6ZTo1MTIsc291cmNlOnRoaXMuaWQsZ2VvanNvblZ0T3B0aW9uczp0aGlzLmdlb2pzb25WdE9wdGlvbnN9LGZ1bmN0aW9uKGkpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5fcHlyYW1pZC5yZWxvYWQoKSx2b2lkIHRoaXMuZmlyZShcImNoYW5nZVwiKSl9LmJpbmQodGhpcykpfSxfbG9hZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIHQ9aS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGkuY29vcmQuei10aGlzLm1heHpvb20pOjEsZT17dWlkOmkudWlkLGNvb3JkOmkuY29vcmQsem9vbTppLmNvb3JkLnosbWF4Wm9vbTp0aGlzLm1heHpvb20sdGlsZVNpemU6NTEyLHNvdXJjZTp0aGlzLmlkLG92ZXJzY2FsaW5nOnQsYW5nbGU6dGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLHBpdGNoOnRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxjb2xsaXNpb25EZWJ1Zzp0aGlzLm1hcC5jb2xsaXNpb25EZWJ1Z307aS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgZ2VvanNvbiB0aWxlXCIsZSxmdW5jdGlvbih0LGUpe2lmKGkudW5sb2FkVmVjdG9yRGF0YSh0aGlzLm1hcC5wYWludGVyKSwhaS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTppfSk7aS5sb2FkVmVjdG9yRGF0YShlKSx0aGlzLmZpcmUoXCJ0aWxlLmxvYWRcIix7dGlsZTppfSl9fS5iaW5kKHRoaXMpLHRoaXMud29ya2VySUQpfSxfYWJvcnRUaWxlOmZ1bmN0aW9uKGkpe2kuYWJvcnRlZD0hMH0sX2FkZFRpbGU6ZnVuY3Rpb24oaSl7dGhpcy5maXJlKFwidGlsZS5hZGRcIix7dGlsZTppfSl9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKGkpe3RoaXMuZmlyZShcInRpbGUucmVtb3ZlXCIse3RpbGU6aX0pfSxfdW5sb2FkVGlsZTpmdW5jdGlvbihpKXtpLnVubG9hZFZlY3RvckRhdGEodGhpcy5tYXAucGFpbnRlciksdGhpcy5nbHlwaEF0bGFzLnJlbW92ZUdseXBocyhpLnVpZCksdGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZW1vdmUgdGlsZVwiLHt1aWQ6aS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsaS53b3JrZXJJRCl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwicmVzb2x2ZS11cmxcIjoxNDB9XSw0MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHZW9KU09OV3JhcHBlcihlKXt0aGlzLmZlYXR1cmVzPWUsdGhpcy5sZW5ndGg9ZS5sZW5ndGh9ZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIoZSl7dGhpcy50eXBlPWUudHlwZSx0aGlzLnJhd0dlb21ldHJ5PTE9PT1lLnR5cGU/W2UuZ2VvbWV0cnldOmUuZ2VvbWV0cnksdGhpcy5wcm9wZXJ0aWVzPWUudGFncyx0aGlzLmV4dGVudD00MDk2fXZhciBQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlO21vZHVsZS5leHBvcnRzPUdlb0pTT05XcmFwcGVyLEdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5mZWF0dXJlc1tlXSl9LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhd0dlb21ldHJ5O3RoaXMuZ2VvbWV0cnk9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcih2YXIgcj1lW3RdLG89W10sYT0wO2E8ci5sZW5ndGg7YSsrKW8ucHVzaChuZXcgUG9pbnQoclthXVswXSxyW2FdWzFdKSk7dGhpcy5nZW9tZXRyeS5wdXNoKG8pfXJldHVybiB0aGlzLmdlb21ldHJ5fSxGZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnl8fHRoaXMubG9hZEdlb21ldHJ5KCk7Zm9yKHZhciBlPXRoaXMuZ2VvbWV0cnksdD0xLzAscj0tKDEvMCksbz0xLzAsYT0tKDEvMCkscD0wO3A8ZS5sZW5ndGg7cCsrKWZvcih2YXIgaT1lW3BdLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGg9aVtuXTt0PU1hdGgubWluKHQsaC54KSxyPU1hdGgubWF4KHIsaC54KSxvPU1hdGgubWluKG8saC55KSxhPU1hdGgubWF4KGEsaC55KX1yZXR1cm5bdCxvLHIsYV19LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT049VmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzcsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDQxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldEltYWdlKGUudXJsLGZ1bmN0aW9uKGUsdCl7ZXx8KHRoaXMuaW1hZ2U9dCx0aGlzLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsZnVuY3Rpb24oKXt0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy5fbG9hZGVkPSEwLHRoaXMubWFwJiYodGhpcy5jcmVhdGVUaWxlKCksdGhpcy5maXJlKFwiY2hhbmdlXCIpKSl9LmJpbmQodGhpcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIik7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTb3VyY2UsSW1hZ2VTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHtvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMuaW1hZ2UmJnRoaXMuY3JlYXRlVGlsZSgpfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXAsdD10aGlzLmNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbih0KXt2YXIgaT1MbmdMYXQuY29udmVydCh0KTtyZXR1cm4gZS50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKGkpLnpvb21UbygwKX0pLGk9dXRpbC5nZXRDb29yZGluYXRlc0NlbnRlcih0KSxyPTQwOTYsYT10Lm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLnpvb21UbyhpLnpvb20pO3JldHVybiBuZXcgUG9pbnQoTWF0aC5yb3VuZCgodC5jb2x1bW4taS5jb2x1bW4pKnIpLE1hdGgucm91bmQoKHQucm93LWkucm93KSpyKSl9KSxuPWUucGFpbnRlci5nbCxvPTMyNzY3LHU9bmV3IEludDE2QXJyYXkoW2FbMF0ueCxhWzBdLnksMCwwLGFbMV0ueCxhWzFdLnksbywwLGFbM10ueCxhWzNdLnksMCxvLGFbMl0ueCxhWzJdLnksbyxvXSk7dGhpcy50aWxlPW5ldyBUaWxlLHRoaXMudGlsZS5idWNrZXRzPXt9LHRoaXMudGlsZS5ib3VuZHNCdWZmZXI9bi5jcmVhdGVCdWZmZXIoKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsdGhpcy50aWxlLmJvdW5kc0J1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLHUsbi5TVEFUSUNfRFJBVyksdGhpcy5jZW50ZXI9aX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2UmJnRoaXMuaW1hZ2UuY29tcGxldGV9LHVwZGF0ZTpmdW5jdGlvbigpe30scmVsb2FkOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9sb2FkZWQmJnRoaXMubG9hZGVkKCkpe3ZhciBpPXRoaXMuY2VudGVyO3RoaXMudGlsZS5jYWxjdWxhdGVNYXRyaWNlcyhpLnpvb20saS5jb2x1bW4saS5yb3csdGhpcy5tYXAudHJhbnNmb3JtLHQpO3ZhciByPXQuZ2w7dGhpcy50aWxlLnRleHR1cmU/KHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy5pbWFnZSkpOih0aGlzLnRpbGUudGV4dHVyZT1yLmNyZWF0ZVRleHR1cmUoKSxyLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCx0aGlzLnRpbGUudGV4dHVyZSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLkxJTkVBUiksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfTUFHX0ZJTFRFUixyLkxJTkVBUiksci50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLHIuUkdCQSxyLlJHQkEsci5VTlNJR05FRF9CWVRFLHRoaXMuaW1hZ2UpKSx0LmRyYXdMYXllcnMoZSx0aGlzLnRpbGUucG9zTWF0cml4LHRoaXMudGlsZSl9fSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFJhc3RlclRpbGVTb3VyY2UoZSl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2soZSxbXCJ1cmxcIixcInRpbGVTaXplXCJdKSksU291cmNlLl9sb2FkVGlsZUpTT04uY2FsbCh0aGlzLGUpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplVGlsZVVSTDttb2R1bGUuZXhwb3J0cz1SYXN0ZXJUaWxlU291cmNlLFJhc3RlclRpbGVTb3VyY2UucHJvdG90eXBlPXV0aWwuaW5oZXJpdChFdmVudGVkLHttaW56b29tOjAsbWF4em9vbToyMixyb3VuZFpvb206ITAsdGlsZVNpemU6NTEyLF9sb2FkZWQ6ITEsb25BZGQ6ZnVuY3Rpb24oZSl7dGhpcy5tYXA9ZX0sbG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B5cmFtaWQmJnRoaXMuX3B5cmFtaWQubG9hZGVkKCl9LHVwZGF0ZTpmdW5jdGlvbihlKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnVwZGF0ZSh0aGlzLnVzZWQsZSx0aGlzLm1hcC5zdHlsZS5yYXN0ZXJGYWRlRHVyYXRpb24pfSxyZWxvYWQ6ZnVuY3Rpb24oKXt9LHJlbmRlcjpTb3VyY2UuX3JlbmRlclRpbGVzLF9sb2FkVGlsZTpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsaSl7aWYoZGVsZXRlIGUucmVxdWVzdCwhZS5hYm9ydGVkKXtpZih0KXJldHVybiB2b2lkIHRoaXMuZmlyZShcInRpbGUuZXJyb3JcIix7dGlsZTplfSk7dmFyIHI9dGhpcy5tYXAucGFpbnRlci5nbDtlLnRleHR1cmU9dGhpcy5tYXAucGFpbnRlci5nZXRUZXh0dXJlKGkud2lkdGgpLGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSkpOihlLnRleHR1cmU9ci5jcmVhdGVUZXh0dXJlKCksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSX01JUE1BUF9ORUFSRVNUKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsaSksZS50ZXh0dXJlLnNpemU9aS53aWR0aCksci5nZW5lcmF0ZU1pcG1hcChyLlRFWFRVUkVfMkQpLGUudGltZUFkZGVkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMubWFwLmFuaW1hdGlvbkxvb3Auc2V0KHRoaXMuc3R5bGUucmFzdGVyRmFkZUR1cmF0aW9uKSxlLnNvdXJjZT10aGlzLGUubG9hZGVkPSEwLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KX19dmFyIGk9bm9ybWFsaXplVVJMKGUuY29vcmQudXJsKHRoaXMudGlsZXMpLHRoaXMudXJsKTtlLnJlcXVlc3Q9YWpheC5nZXRJbWFnZShpLHQuYmluZCh0aGlzKSl9LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLGUucmVxdWVzdCYmKGUucmVxdWVzdC5hYm9ydCgpLGRlbGV0ZSBlLnJlcXVlc3QpfSxfYWRkVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLmFkZFwiLHt0aWxlOmV9KX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24oZSl7dGhpcy5maXJlKFwidGlsZS5yZW1vdmVcIix7dGlsZTplfSl9LF91bmxvYWRUaWxlOmZ1bmN0aW9uKGUpe2UudGV4dHVyZSYmdGhpcy5tYXAucGFpbnRlci5zYXZlVGV4dHVyZShlLnRleHR1cmUpfSxmZWF0dXJlc0F0OmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtpKG51bGwsW10pfX0pO1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9zb3VyY2VcIjo0M31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxUaWxlUHlyYW1pZD1yZXF1aXJlKFwiLi90aWxlX3B5cmFtaWRcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTb3VyY2VVUkw7ZXhwb3J0cy5fbG9hZFRpbGVKU09OPWZ1bmN0aW9uKGkpe3ZhciBlPWZ1bmN0aW9uKGkpe3RoaXMuX3B5cmFtaWQ9bmV3IFRpbGVQeXJhbWlkKHtpbmRleDppLHRpbGVTaXplOnRoaXMudGlsZVNpemUsY2FjaGVTaXplOjIwLG1pbnpvb206dGhpcy5taW56b29tLG1heHpvb206dGhpcy5tYXh6b29tLHJvdW5kWm9vbTp0aGlzLnJvdW5kWm9vbSxyZXBhcnNlT3ZlcnNjYWxlZDp0aGlzLnJlcGFyc2VPdmVyc2NhbGVkLGxvYWQ6dGhpcy5fbG9hZFRpbGUuYmluZCh0aGlzKSxhYm9ydDp0aGlzLl9hYm9ydFRpbGUuYmluZCh0aGlzKSx1bmxvYWQ6dGhpcy5fdW5sb2FkVGlsZS5iaW5kKHRoaXMpLGFkZDp0aGlzLl9hZGRUaWxlLmJpbmQodGhpcykscmVtb3ZlOnRoaXMuX3JlbW92ZVRpbGUuYmluZCh0aGlzKSxyZWRvUGxhY2VtZW50OnRoaXMuX3JlZG9UaWxlUGxhY2VtZW50P3RoaXMuX3JlZG9UaWxlUGxhY2VtZW50LmJpbmQodGhpcyk6dm9pZCAwfSl9LmJpbmQodGhpcykscj1mdW5jdGlvbihpLHIpe3JldHVybiBpP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6aX0pOih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhyLFtcInRpbGVzXCIsXCJtaW56b29tXCIsXCJtYXh6b29tXCIsXCJhdHRyaWJ1dGlvblwiXSkpLHZvaWQoci5pbmRleD9hamF4LmdldEpTT04obm9ybWFsaXplVVJMKHIuaW5kZXgpLGZ1bmN0aW9uKGkscil7cmV0dXJuIGk/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjppfSk6KGUoci5pbmRleCksdm9pZCB0aGlzLmZpcmUoXCJsb2FkXCIpKX0uYmluZCh0aGlzKSk6KGUoKSx0aGlzLmZpcmUoXCJsb2FkXCIpKSkpfS5iaW5kKHRoaXMpO2kudXJsP2FqYXguZ2V0SlNPTihub3JtYWxpemVVUkwoaS51cmwpLHIpOmJyb3dzZXIuZnJhbWUoci5iaW5kKHRoaXMsbnVsbCxpKSl9LGV4cG9ydHMuX3JlbmRlclRpbGVzPWZ1bmN0aW9uKGksZSl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIHI9dGhpcy5fcHlyYW1pZC5yZW5kZXJlZElEcygpLHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG89dGhpcy5fcHlyYW1pZC5nZXRUaWxlKHJbdF0pLG49VGlsZUNvb3JkLmZyb21JRChyW3RdKSxhPW4ueixzPW4ueCxsPW4ueSxkPW4udzthPU1hdGgubWluKGEsdGhpcy5tYXh6b29tKSwoby50aWxlRXh0ZW50PjQwOTZ8fG8ucGFyZW50SWQpJiYoby50aWxlRXh0ZW50PTQwOTYpLHMrPWQqKDE8PGEpLG8uY2FsY3VsYXRlTWF0cmljZXMoYSxzLGwsZS50cmFuc2Zvcm0sZSksZS5kcmF3VGlsZShvLGkpfX0sZXhwb3J0cy5fdmVjdG9yRmVhdHVyZXNBdD1mdW5jdGlvbihpLGUscil7aWYoIXRoaXMuX3B5cmFtaWQpcmV0dXJuIHIobnVsbCxbXSk7dmFyIHQ9dGhpcy5fcHlyYW1pZC50aWxlQXQoaSk7cmV0dXJuIHQ/dm9pZCB0aGlzLmRpc3BhdGNoZXIuc2VuZChcInF1ZXJ5IGZlYXR1cmVzXCIse3VpZDp0LnRpbGUudWlkLHg6dC54LHk6dC55LHRpbGVFeHRlbnQ6dC50aWxlLnRpbGVFeHRlbnQsc2NhbGU6dC5zY2FsZSxzb3VyY2U6dGhpcy5pZCxwYXJhbXM6ZX0scix0LnRpbGUud29ya2VySUQpOnIobnVsbCxbXSl9LGV4cG9ydHMuX3ZlY3RvckZlYXR1cmVzSW49ZnVuY3Rpb24oaSxlLHIpe2lmKCF0aGlzLl9weXJhbWlkKXJldHVybiByKG51bGwsW10pO3ZhciB0PXRoaXMuX3B5cmFtaWQudGlsZXNJbihpKTtyZXR1cm4gdD92b2lkIHV0aWwuYXN5bmNBbGwodCxmdW5jdGlvbihpLHIpe3RoaXMuZGlzcGF0Y2hlci5zZW5kKFwicXVlcnkgZmVhdHVyZXNcIix7dWlkOmkudGlsZS51aWQsc291cmNlOnRoaXMuaWQsbWluWDppLm1pblgsbWF4WDppLm1heFgsbWluWTppLm1pblksbWF4WTppLm1heFkscGFyYW1zOmV9LHIsaS50aWxlLndvcmtlcklEKX0uYmluZCh0aGlzKSxmdW5jdGlvbihpLGUpe3IoaSxBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpKX0pOnIobnVsbCxbXSl9LGV4cG9ydHMuY3JlYXRlPWZ1bmN0aW9uKGkpe3ZhciBlPXt2ZWN0b3I6cmVxdWlyZShcIi4vdmVjdG9yX3RpbGVfc291cmNlXCIpLHJhc3RlcjpyZXF1aXJlKFwiLi9yYXN0ZXJfdGlsZV9zb3VyY2VcIiksZ2VvanNvbjpyZXF1aXJlKFwiLi9nZW9qc29uX3NvdXJjZVwiKSx2aWRlbzpyZXF1aXJlKFwiLi92aWRlb19zb3VyY2VcIiksaW1hZ2U6cmVxdWlyZShcIi4vaW1hZ2Vfc291cmNlXCIpfTtmb3IodmFyIHIgaW4gZSlpZihpIGluc3RhbmNlb2YgZVtyXSlyZXR1cm4gaTtyZXR1cm4gbmV3IGVbaS50eXBlXShpKX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl9zb3VyY2VcIjozOSxcIi4vaW1hZ2Vfc291cmNlXCI6NDEsXCIuL3Jhc3Rlcl90aWxlX3NvdXJjZVwiOjQyLFwiLi90aWxlX2Nvb3JkXCI6NDUsXCIuL3RpbGVfcHlyYW1pZFwiOjQ2LFwiLi92ZWN0b3JfdGlsZV9zb3VyY2VcIjo0NyxcIi4vdmlkZW9fc291cmNlXCI6NDh9XSw0NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBUaWxlKHQsZSl7dGhpcy5jb29yZD10LHRoaXMudWlkPXV0aWwudW5pcXVlSWQoKSx0aGlzLmxvYWRlZD0hMSx0aGlzLnVzZXM9MCx0aGlzLnRpbGVTaXplPWV9dmFyIGdsbWF0cml4PXJlcXVpcmUoXCJnbC1tYXRyaXhcIiksbWF0Mj1nbG1hdHJpeC5tYXQyLG1hdDQ9Z2xtYXRyaXgubWF0NCx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksQnVmZmVyU2V0PXJlcXVpcmUoXCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCIpO21vZHVsZS5leHBvcnRzPVRpbGUsVGlsZS5wcm90b3R5cGU9e3RpbGVFeHRlbnQ6NDA5NixjYWxjdWxhdGVNYXRyaWNlczpmdW5jdGlvbih0LGUsaSxyKXt2YXIgcz1NYXRoLnBvdygyLHQpLG89ci53b3JsZFNpemUvczt0aGlzLnNjYWxlPW8sdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0NjRBcnJheSgxNiksbWF0NC5pZGVudGl0eSh0aGlzLnBvc01hdHJpeCksbWF0NC50cmFuc2xhdGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW2UqbyxpKm8sMF0pLG1hdDQuc2NhbGUodGhpcy5wb3NNYXRyaXgsdGhpcy5wb3NNYXRyaXgsW28vdGhpcy50aWxlRXh0ZW50LG8vdGhpcy50aWxlRXh0ZW50LDFdKSxtYXQ0Lm11bHRpcGx5KHRoaXMucG9zTWF0cml4LHIuZ2V0UHJvak1hdHJpeCgpLHRoaXMucG9zTWF0cml4KSx0aGlzLmV4TWF0cml4PW1hdDQuY3JlYXRlKCksbWF0NC5vcnRobyh0aGlzLmV4TWF0cml4LDAsci53aWR0aCxyLmhlaWdodCwwLDAsLTEpLHRoaXMucm90YXRpb25NYXRyaXg9bWF0Mi5jcmVhdGUoKSxtYXQyLnJvdGF0ZSh0aGlzLnJvdGF0aW9uTWF0cml4LHRoaXMucm90YXRpb25NYXRyaXgsci5hbmdsZSksdGhpcy5wb3NNYXRyaXg9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc01hdHJpeCl9LHBvc2l0aW9uQXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10Lnpvb21UbyhNYXRoLm1pbih0aGlzLmNvb3JkLnosZSkpLHt4Oih0LmNvbHVtbi10aGlzLmNvb3JkLngpKnRoaXMudGlsZUV4dGVudCx5Oih0LnJvdy10aGlzLmNvb3JkLnkpKnRoaXMudGlsZUV4dGVudCxzY2FsZTp0aGlzLnNjYWxlfX0sbG9hZFZlY3RvckRhdGE6ZnVuY3Rpb24odCl7dGhpcy5sb2FkZWQ9ITAsdCYmKHRoaXMuYnVmZmVycz1uZXcgQnVmZmVyU2V0KHQuYnVmZmVycyksdGhpcy5lbGVtZW50R3JvdXBzPXQuZWxlbWVudEdyb3Vwcyx0aGlzLnRpbGVFeHRlbnQ9dC5leHRlbnQpfSxyZWxvYWRTeW1ib2xEYXRhOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5idWZmZXJzKXt0aGlzLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuZ2x5cGhFbGVtZW50LmRlc3Ryb3koZS5nbCksdGhpcy5idWZmZXJzLmljb25WZXJ0ZXguZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuaWNvbkVsZW1lbnQuZGVzdHJveShlLmdsKSx0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94VmVydGV4LmRlc3Ryb3koZS5nbCk7dmFyIGk9bmV3IEJ1ZmZlclNldCh0LmJ1ZmZlcnMpO3RoaXMuYnVmZmVycy5nbHlwaFZlcnRleD1pLmdseXBoVmVydGV4LHRoaXMuYnVmZmVycy5nbHlwaEVsZW1lbnQ9aS5nbHlwaEVsZW1lbnQsdGhpcy5idWZmZXJzLmljb25WZXJ0ZXg9aS5pY29uVmVydGV4LHRoaXMuYnVmZmVycy5pY29uRWxlbWVudD1pLmljb25FbGVtZW50LHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXg9aS5jb2xsaXNpb25Cb3hWZXJ0ZXg7Zm9yKHZhciByIGluIHQuZWxlbWVudEdyb3Vwcyl0aGlzLmVsZW1lbnRHcm91cHNbcl09dC5lbGVtZW50R3JvdXBzW3JdfX0sdW5sb2FkVmVjdG9yRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5idWZmZXJzKXRoaXMuYnVmZmVyc1tlXS5kZXN0cm95KHQuZ2wpO3RoaXMuYnVmZmVycz1udWxsfX07XG59LHtcIi4uL2RhdGEvYnVmZmVyL2J1ZmZlcl9zZXRcIjoyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiZ2wtbWF0cml4XCI6MTE2fV0sNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVGlsZUNvb3JkKHQsaSxvLHIpe2lzTmFOKHIpJiYocj0wKSx0aGlzLno9K3QsdGhpcy54PStpLHRoaXMueT0rbyx0aGlzLnc9K3Iscio9MiwwPnImJihyPS0xKnItMSk7dmFyIGU9MTw8dGhpcy56O3RoaXMuaWQ9MzIqKGUqZSpyK2UqdGhpcy55K3RoaXMueCkrdGhpcy56fWZ1bmN0aW9uIGVkZ2UodCxpKXtpZih0LnJvdz5pLnJvdyl7dmFyIG89dDt0PWksaT1vfXJldHVybnt4MDp0LmNvbHVtbix5MDp0LnJvdyx4MTppLmNvbHVtbix5MTppLnJvdyxkeDppLmNvbHVtbi10LmNvbHVtbixkeTppLnJvdy10LnJvd319ZnVuY3Rpb24gc2NhblNwYW5zKHQsaSxvLHIsZSl7dmFyIG49TWF0aC5tYXgobyxNYXRoLmZsb29yKGkueTApKSxoPU1hdGgubWluKHIsTWF0aC5jZWlsKGkueTEpKTtpZih0LngwPT09aS54MCYmdC55MD09PWkueTA/dC54MCtpLmR5L3QuZHkqdC5keDxpLngxOnQueDEtaS5keS90LmR5KnQuZHg8aS54MCl7dmFyIHM9dDt0PWksaT1zfWZvcih2YXIgZD10LmR4L3QuZHksYT1pLmR4L2kuZHksbD10LmR4PjAseT1pLmR4PDAseD1uO2g+eDt4Kyspe3ZhciBjPWQqTWF0aC5tYXgoMCxNYXRoLm1pbih0LmR5LHgrbC10LnkwKSkrdC54MCx1PWEqTWF0aC5tYXgoMCxNYXRoLm1pbihpLmR5LHgreS1pLnkwKSkraS54MDtlKE1hdGguZmxvb3IodSksTWF0aC5jZWlsKGMpLHgpfX1mdW5jdGlvbiBzY2FuVHJpYW5nbGUodCxpLG8scixlLG4pe3ZhciBoLHM9ZWRnZSh0LGkpLGQ9ZWRnZShpLG8pLGE9ZWRnZShvLHQpO3MuZHk+ZC5keSYmKGg9cyxzPWQsZD1oKSxzLmR5PmEuZHkmJihoPXMscz1hLGE9aCksZC5keT5hLmR5JiYoaD1kLGQ9YSxhPWgpLHMuZHkmJnNjYW5TcGFucyhhLHMscixlLG4pLGQuZHkmJnNjYW5TcGFucyhhLGQscixlLG4pfW1vZHVsZS5leHBvcnRzPVRpbGVDb29yZCxUaWxlQ29vcmQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueitcIi9cIit0aGlzLngrXCIvXCIrdGhpcy55fSxUaWxlQ29vcmQuZnJvbUlEPWZ1bmN0aW9uKHQpe3ZhciBpPXQlMzIsbz0xPDxpLHI9KHQtaSkvMzIsZT1yJW8sbj0oci1lKS9vJW8saD1NYXRoLmZsb29yKHIvKG8qbykpO3JldHVybiBoJTIhPT0wJiYoaD0tMSpoLTEpLGgvPTIsbmV3IFRpbGVDb29yZChpLGUsbixoKX0sVGlsZUNvb3JkLnByb3RvdHlwZS51cmw9ZnVuY3Rpb24odCxpKXtyZXR1cm4gdFsodGhpcy54K3RoaXMueSkldC5sZW5ndGhdLnJlcGxhY2UoXCJ7cHJlZml4fVwiLCh0aGlzLnglMTYpLnRvU3RyaW5nKDE2KSsodGhpcy55JTE2KS50b1N0cmluZygxNikpLnJlcGxhY2UoXCJ7en1cIixNYXRoLm1pbih0aGlzLnosaXx8dGhpcy56KSkucmVwbGFjZShcInt4fVwiLHRoaXMueCkucmVwbGFjZShcInt5fVwiLHRoaXMueSl9LFRpbGVDb29yZC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy56P251bGw6dGhpcy56PnQ/bmV3IFRpbGVDb29yZCh0aGlzLnotMSx0aGlzLngsdGhpcy55LHRoaXMudyk6bmV3IFRpbGVDb29yZCh0aGlzLnotMSxNYXRoLmZsb29yKHRoaXMueC8yKSxNYXRoLmZsb29yKHRoaXMueS8yKSx0aGlzLncpfSxUaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosdGhpcy54LHRoaXMueSwwKX0sVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih0KXtpZih0aGlzLno+PXQpcmV0dXJuW25ldyBUaWxlQ29vcmQodGhpcy56KzEsdGhpcy54LHRoaXMueSx0aGlzLncpXTt2YXIgaT10aGlzLnorMSxvPTIqdGhpcy54LHI9Mip0aGlzLnk7cmV0dXJuW25ldyBUaWxlQ29vcmQoaSxvLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbyxyKzEsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIrMSx0aGlzLncpXX0sVGlsZUNvb3JkLmNvdmVyPWZ1bmN0aW9uKHQsaSxvKXtmdW5jdGlvbiByKHQsaSxyKXt2YXIgaCxzLGQ7aWYocj49MCYmZT49cilmb3IoaD10O2k+aDtoKyspcz0oaCVlK2UpJWUsZD1uZXcgVGlsZUNvb3JkKG8scyxyLE1hdGguZmxvb3IoaC9lKSksbltkLmlkXT1kfXZhciBlPTE8PHQsbj17fTtyZXR1cm4gc2NhblRyaWFuZ2xlKGlbMF0saVsxXSxpWzJdLDAsZSxyKSxzY2FuVHJpYW5nbGUoaVsyXSxpWzNdLGlbMF0sMCxlLHIpLE9iamVjdC5rZXlzKG4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pfTtcbn0se31dLDQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRpbGVQeXJhbWlkKGkpe3RoaXMudGlsZVNpemU9aS50aWxlU2l6ZSx0aGlzLm1pbnpvb209aS5taW56b29tLHRoaXMubWF4em9vbT1pLm1heHpvb20sdGhpcy5yb3VuZFpvb209aS5yb3VuZFpvb20sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD1pLnJlcGFyc2VPdmVyc2NhbGVkLHRoaXMuaW5kZXg9aS5pbmRleCx0aGlzLl9sb2FkPWkubG9hZCx0aGlzLl9hYm9ydD1pLmFib3J0LHRoaXMuX3VubG9hZD1pLnVubG9hZCx0aGlzLl9hZGQ9aS5hZGQsdGhpcy5fcmVtb3ZlPWkucmVtb3ZlLHRoaXMuX3JlZG9QbGFjZW1lbnQ9aS5yZWRvUGxhY2VtZW50LHRoaXMuX3RpbGVzPXt9LHRoaXMuX2NhY2hlPW5ldyBDYWNoZShpLmNhY2hlU2l6ZSxmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdW5sb2FkKGkpfS5iaW5kKHRoaXMpKX12YXIgVGlsZT1yZXF1aXJlKFwiLi90aWxlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpLFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxDYWNoZT1yZXF1aXJlKFwiLi4vdXRpbC9tcnVfY2FjaGVcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPVRpbGVQeXJhbWlkLFRpbGVQeXJhbWlkLnByb3RvdHlwZT17bG9hZGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHRoaXMuX3RpbGVzKWlmKCF0aGlzLl90aWxlc1tpXS5sb2FkZWQpcmV0dXJuITE7cmV0dXJuITB9LG9yZGVyZWRJRHM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fdGlsZXMpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gZSUzMi1pJTMyfSkubWFwKGZ1bmN0aW9uKGkpe3JldHVybitpfSl9LHJlbmRlcmVkSURzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JkZXJlZElEcygpLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5fdGlsZXNbaV0ubG9hZGVkJiYhdGhpcy5fY292ZXJlZFRpbGVzW2ldfS5iaW5kKHRoaXMpKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGUucmVzZXQoKTtmb3IodmFyIGkgaW4gdGhpcy5fdGlsZXMpdGhpcy5fbG9hZCh0aGlzLl90aWxlc1tpXSl9LGdldFRpbGU6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuX3RpbGVzW2ldfSxnZXRab29tOmZ1bmN0aW9uKGkpe3JldHVybiBpLnpvb20rTWF0aC5sb2coaS50aWxlU2l6ZS90aGlzLnRpbGVTaXplKS9NYXRoLkxOMn0sY292ZXJpbmdab29tTGV2ZWw6ZnVuY3Rpb24oaSl7cmV0dXJuKHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGkpKX0sY292ZXJpbmdUaWxlczpmdW5jdGlvbihpKXt2YXIgZT10aGlzLmNvdmVyaW5nWm9vbUxldmVsKGkpLHQ9ZTtpZihlPHRoaXMubWluem9vbSlyZXR1cm5bXTtlPnRoaXMubWF4em9vbSYmKGU9dGhpcy5tYXh6b29tKTt2YXIgbz1pLHI9by5sb2NhdGlvbkNvb3JkaW5hdGUoby5jZW50ZXIpLl96b29tVG8oZSksbj1uZXcgUG9pbnQoci5jb2x1bW4tLjUsci5yb3ctLjUpO3JldHVybiBUaWxlQ29vcmQuY292ZXIoZSxbby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsMCkpLl96b29tVG8oZSksby5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KG8ud2lkdGgsby5oZWlnaHQpKS5fem9vbVRvKGUpLG8ucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLG8uaGVpZ2h0KSkuX3pvb21UbyhlKV0sdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZD90OmUpLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gbi5kaXN0KGkpLW4uZGlzdChlKX0pfSxmaW5kTG9hZGVkQ2hpbGRyZW46ZnVuY3Rpb24oaSxlLHQpe2Zvcih2YXIgbz0hMCxyPWkueixuPWkuY2hpbGRyZW4odGhpcy5tYXh6b29tKSxzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBkPW5bc10uaWQ7dGhpcy5fdGlsZXNbZF0mJnRoaXMuX3RpbGVzW2RdLmxvYWRlZD90W2RdPSEwOihvPSExLGU+ciYmdGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4obltzXSxlLHQpKX1yZXR1cm4gb30sZmluZExvYWRlZFBhcmVudDpmdW5jdGlvbihpLGUsdCl7Zm9yKHZhciBvPWkuei0xO28+PWU7by0tKXtpPWkucGFyZW50KHRoaXMubWF4em9vbSk7dmFyIHI9dGhpcy5fdGlsZXNbaS5pZF07aWYociYmci5sb2FkZWQpcmV0dXJuIHRbaS5pZF09ITAscn19LHVwZGF0ZTpmdW5jdGlvbihpLGUsdCl7dmFyIG8scixuLHM9KHRoaXMucm91bmRab29tP01hdGgucm91bmQ6TWF0aC5mbG9vcikodGhpcy5nZXRab29tKGUpKSxkPXV0aWwuY2xhbXAocy0xMCx0aGlzLm1pbnpvb20sdGhpcy5tYXh6b29tKSxoPXV0aWwuY2xhbXAocysxLHRoaXMubWluem9vbSx0aGlzLm1heHpvb20pLGE9e30sbD0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLl9jb3ZlcmVkVGlsZXM9e307dmFyIG09aT90aGlzLmNvdmVyaW5nVGlsZXMoZSk6W107Zm9yKG89MDtvPG0ubGVuZ3RoO28rKylyPW1bb10sbj10aGlzLmFkZFRpbGUociksYVtyLmlkXT0hMCxuLmxvYWRlZHx8dGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpfHx0aGlzLmZpbmRMb2FkZWRQYXJlbnQocixkLGEpO2Zvcih2YXIgdSBpbiBhKXI9VGlsZUNvb3JkLmZyb21JRCh1KSxuPXRoaXMuX3RpbGVzW3VdLG4mJm4udGltZUFkZGVkPmwtKHR8fDApJiYodGhpcy5maW5kTG9hZGVkQ2hpbGRyZW4ocixoLGEpPyh0aGlzLl9jb3ZlcmVkVGlsZXNbdV09ITAsYVt1XT0hMCk6dGhpcy5maW5kTG9hZGVkUGFyZW50KHIsZCxhKSk7dmFyIGM9dXRpbC5rZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcyxhKTtmb3Iobz0wO288Yy5sZW5ndGg7bysrKXRoaXMucmVtb3ZlVGlsZSgrY1tvXSl9LGFkZFRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaS5pZF07aWYoZSlyZXR1cm4gZTt2YXIgdD1pLndyYXBwZWQoKTtpZihlPXRoaXMuX3RpbGVzW3QuaWRdLGV8fChlPXRoaXMuX2NhY2hlLmdldCh0LmlkKSxlJiZ0aGlzLl9yZWRvUGxhY2VtZW50JiZ0aGlzLl9yZWRvUGxhY2VtZW50KGUpKSwhZSl7dmFyIG89aS56LHI9bz50aGlzLm1heHpvb20/TWF0aC5wb3coMixvLXRoaXMubWF4em9vbSk6MTtlPW5ldyBUaWxlKHQsdGhpcy50aWxlU2l6ZSpyKSx0aGlzLmluZGV4JiYoZS5wYXJlbnRJZD10aGlzLmluZGV4U2VhcmNoKGkuaWQpKSx0aGlzLl9sb2FkKGUpfXJldHVybiBlLnVzZXMrKyx0aGlzLl90aWxlc1tpLmlkXT1lLHRoaXMuX2FkZChlLGkpLGV9LHJlbW92ZVRpbGU6ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcy5fdGlsZXNbaV07ZSYmKGUudXNlcy0tLGRlbGV0ZSB0aGlzLl90aWxlc1tpXSx0aGlzLl9yZW1vdmUoZSksZS51c2VzPjB8fChlLmxvYWRlZD90aGlzLl9jYWNoZS5hZGQoZS5jb29yZC53cmFwcGVkKCkuaWQsZSk6KHRoaXMuX2Fib3J0KGUpLHRoaXMuX3VubG9hZChlKSkpKX0sY2xlYXJUaWxlczpmdW5jdGlvbigpe2Zvcih2YXIgaSBpbiB0aGlzLl90aWxlcyl0aGlzLnJlbW92ZVRpbGUoaSk7dGhpcy5fY2FjaGUucmVzZXQoKX0sdGlsZUF0OmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT10aGlzLm9yZGVyZWRJRHMoKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBvPXRoaXMuX3RpbGVzW2VbdF1dLHI9by5wb3NpdGlvbkF0KGksdGhpcy5tYXh6b29tKTtpZihyJiZyLng+PTAmJnIueDxvLnRpbGVFeHRlbnQmJnIueT49MCYmci55PG8udGlsZUV4dGVudClyZXR1cm57dGlsZTpvLHg6ci54LHk6ci55LHNjYWxlOnIuc2NhbGV9fX0sdGlsZXNJbjpmdW5jdGlvbihpKXtmb3IodmFyIGU9W10sdD10aGlzLm9yZGVyZWRJRHMoKSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPXRoaXMuX3RpbGVzW3Rbb11dLG49W3IucG9zaXRpb25BdChpWzBdLHRoaXMubWF4em9vbSksci5wb3NpdGlvbkF0KGlbMV0sdGhpcy5tYXh6b29tKV07blswXS54PHIudGlsZUV4dGVudCYmblswXS55PHIudGlsZUV4dGVudCYmblsxXS54Pj0wJiZuWzFdLnk+PTAmJmUucHVzaCh7dGlsZTpyLG1pblg6blswXS54LG1heFg6blsxXS54LG1pblk6blswXS55LG1heFk6blsxXS55fSl9cmV0dXJuIGV9LGluZGV4U2VhcmNoOmZ1bmN0aW9uKGkpe2Zvcih2YXIgZT1UaWxlQ29vcmQuZnJvbUlEKGkpLHQ9W2ldLG89ZTswIT09by56OylvPW8ucGFyZW50KCksdC5wdXNoKG8uaWQpO2Zvcih2YXIgcixuPXRoaXMuaW5kZXgscz10LnBvcCgpLGQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuaWR9O3QubGVuZ3RoOylpZihpPXQucG9wKCksZT1UaWxlQ29vcmQuZnJvbUlEKHMpLHI9ZS5jaGlsZHJlbih0aGlzLm1heHpvb20pLm1hcChkKS5pbmRleE9mKGkpLG4pe2lmKDA9PT1uW3JdKXtzPWk7YnJlYWt9aWYoMT09PW5bcl0pe3M9aTticmVha31zPWksbj1uW3JdfXJldHVybiAwPT09dC5sZW5ndGg/bnVsbDpzfX07XG59LHtcIi4uL3V0aWwvbXJ1X2NhY2hlXCI6MTA0LFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCIuL3RpbGVfY29vcmRcIjo0NSxcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZVNvdXJjZShlKXtpZih1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhlLFtcInVybFwiLFwidGlsZVNpemVcIl0pKSw1MTIhPT10aGlzLnRpbGVTaXplKXRocm93IG5ldyBFcnJvcihcInZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyXCIpO1NvdXJjZS5fbG9hZFRpbGVKU09OLmNhbGwodGhpcyxlKX12YXIgdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9cmVxdWlyZShcIi4uL3V0aWwvZXZlbnRlZFwiKSxTb3VyY2U9cmVxdWlyZShcIi4vc291cmNlXCIpLFRpbGVDb29yZD1yZXF1aXJlKFwiLi90aWxlX2Nvb3JkXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVTb3VyY2UsVmVjdG9yVGlsZVNvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse21pbnpvb206MCxtYXh6b29tOjIyLHRpbGVTaXplOjUxMixyZXBhcnNlT3ZlcnNjYWxlZDohMCxfbG9hZGVkOiExLG9uQWRkOmZ1bmN0aW9uKGUpe3RoaXMubWFwPWV9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLmxvYWRlZCgpfSx1cGRhdGU6ZnVuY3Rpb24oZSl7dGhpcy5fcHlyYW1pZCYmdGhpcy5fcHlyYW1pZC51cGRhdGUodGhpcy51c2VkLGUpfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl9weXJhbWlkJiZ0aGlzLl9weXJhbWlkLnJlbG9hZCgpfSxyZWRvUGxhY2VtZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5fcHlyYW1pZClmb3IodmFyIGU9dGhpcy5fcHlyYW1pZC5vcmRlcmVkSURzKCksaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgdD10aGlzLl9weXJhbWlkLmdldFRpbGUoZVtpXSk7dGhpcy5fcmVkb1RpbGVQbGFjZW1lbnQodCl9fSxyZW5kZXI6U291cmNlLl9yZW5kZXJUaWxlcyxmZWF0dXJlc0F0OlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNBdCxmZWF0dXJlc0luOlNvdXJjZS5fdmVjdG9yRmVhdHVyZXNJbixfbG9hZFRpbGU6ZnVuY3Rpb24oZSl7dmFyIGk9ZS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGUuY29vcmQuei10aGlzLm1heHpvb20pOjEsdD17dXJsOmUuY29vcmQudXJsKHRoaXMudGlsZXMsdGhpcy5tYXh6b29tKSx1aWQ6ZS51aWQsY29vcmQ6ZS5jb29yZCx6b29tOmUuY29vcmQueixtYXhab29tOnRoaXMubWF4em9vbSx0aWxlU2l6ZTp0aGlzLnRpbGVTaXplKmksc291cmNlOnRoaXMuaWQsb3ZlcnNjYWxpbmc6aSxhbmdsZTp0aGlzLm1hcC50cmFuc2Zvcm0uYW5nbGUscGl0Y2g6dGhpcy5tYXAudHJhbnNmb3JtLnBpdGNoLGNvbGxpc2lvbkRlYnVnOnRoaXMubWFwLmNvbGxpc2lvbkRlYnVnLHBhcmVudElkOmUucGFyZW50SWR9O2UucGFyZW50SWQmJih0LnVybD1UaWxlQ29vcmQuZnJvbUlEKGUucGFyZW50SWQpLnVybCh0aGlzLnRpbGVzLHRoaXMubWF4em9vbSkpLGUud29ya2VySUQ/dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZWxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSksZS53b3JrZXJJRCk6ZS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWQgdGlsZVwiLHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsZSkpfSxfdGlsZUxvYWRlZDpmdW5jdGlvbihlLGksdCl7aWYoIWUuYWJvcnRlZCl7aWYoaSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUoXCJ0aWxlLmVycm9yXCIse3RpbGU6ZX0pO2UubG9hZFZlY3RvckRhdGEodCksZS5yZWRvV2hlbkRvbmUmJihlLnJlZG9XaGVuRG9uZT0hMSx0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSksdGhpcy5maXJlKFwidGlsZS5sb2FkXCIse3RpbGU6ZX0pLHRoaXMuZmlyZShcInRpbGUuc3RhdHNcIix0LmJ1Y2tldFN0YXRzKX19LF9hYm9ydFRpbGU6ZnVuY3Rpb24oZSl7ZS5hYm9ydGVkPSEwLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwiYWJvcnQgdGlsZVwiLHt1aWQ6ZS51aWQsc291cmNlOnRoaXMuaWR9LG51bGwsZS53b3JrZXJJRCl9LF9hZGRUaWxlOmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInRpbGUuYWRkXCIse3RpbGU6ZX0pfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbihlKXt0aGlzLmZpcmUoXCJ0aWxlLnJlbW92ZVwiLHt0aWxlOmV9KX0sX3VubG9hZFRpbGU6ZnVuY3Rpb24oZSl7ZS51bmxvYWRWZWN0b3JEYXRhKHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZ2x5cGhBdGxhcy5yZW1vdmVHbHlwaHMoZS51aWQpLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVtb3ZlIHRpbGVcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkfSxudWxsLGUud29ya2VySUQpfSxfcmVkb1RpbGVQbGFjZW1lbnQ6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShpLHQpe2UucmVsb2FkU3ltYm9sRGF0YSh0LHRoaXMubWFwLnBhaW50ZXIpLHRoaXMuZmlyZShcInRpbGUubG9hZFwiLHt0aWxlOmV9KSxlLnJlZG9pbmdQbGFjZW1lbnQ9ITEsZS5yZWRvV2hlbkRvbmUmJih0aGlzLl9yZWRvVGlsZVBsYWNlbWVudChlKSxlLnJlZG9XaGVuRG9uZT0hMSl9cmV0dXJuIWUubG9hZGVkfHxlLnJlZG9pbmdQbGFjZW1lbnQ/dm9pZChlLnJlZG9XaGVuRG9uZT0hMCk6KGUucmVkb2luZ1BsYWNlbWVudD0hMCx2b2lkIHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVkbyBwbGFjZW1lbnRcIix7dWlkOmUudWlkLHNvdXJjZTp0aGlzLmlkLGFuZ2xlOnRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxwaXRjaDp0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsY29sbGlzaW9uRGVidWc6dGhpcy5tYXAuY29sbGlzaW9uRGVidWd9LGkuYmluZCh0aGlzKSxlLndvcmtlcklEKSl9fSk7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vc291cmNlXCI6NDMsXCIuL3RpbGVfY29vcmRcIjo0NX1dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZpZGVvU291cmNlKGUpe3RoaXMuY29vcmRpbmF0ZXM9ZS5jb29yZGluYXRlcyxhamF4LmdldFZpZGVvKGUudXJscyxmdW5jdGlvbihlLHQpe2lmKCFlKXt0aGlzLnZpZGVvPXQsdGhpcy52aWRlby5sb29wPSEwO3ZhciBpO3RoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlpbmdcIixmdW5jdGlvbigpe2k9dGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5zZXQoMS8wKSx0aGlzLm1hcC5fcmVyZW5kZXIoKX0uYmluZCh0aGlzKSksdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGF1c2VcIixmdW5jdGlvbigpe3RoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3AuY2FuY2VsKGkpfS5iaW5kKHRoaXMpKSx0aGlzLl9sb2FkZWQ9ITAsdGhpcy5tYXAmJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSx0aGlzLmZpcmUoXCJjaGFuZ2VcIikpfX0uYmluZCh0aGlzKSl9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxUaWxlPXJlcXVpcmUoXCIuL3RpbGVcIiksTG5nTGF0PXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdFwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKTttb2R1bGUuZXhwb3J0cz1WaWRlb1NvdXJjZSxWaWRlb1NvdXJjZS5wcm90b3R5cGU9dXRpbC5pbmhlcml0KEV2ZW50ZWQse3JvdW5kWm9vbTohMCxnZXRWaWRlbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvfSxvbkFkZDpmdW5jdGlvbihlKXt0aGlzLm1hcD1lLHRoaXMudmlkZW8mJih0aGlzLnZpZGVvLnBsYXkoKSx0aGlzLmNyZWF0ZVRpbGUoKSl9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm1hcCx0PXRoaXMuY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKHQpe3ZhciBpPUxuZ0xhdC5jb252ZXJ0KHQpO3JldHVybiBlLnRyYW5zZm9ybS5sb2NhdGlvbkNvb3JkaW5hdGUoaSkuem9vbVRvKDApfSksaT11dGlsLmdldENvb3JkaW5hdGVzQ2VudGVyKHQpLHI9NDA5NixvPXQubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUuem9vbVRvKGkuem9vbSk7cmV0dXJuIG5ldyBQb2ludChNYXRoLnJvdW5kKCh0LmNvbHVtbi1pLmNvbHVtbikqciksTWF0aC5yb3VuZCgodC5yb3ctaS5yb3cpKnIpKX0pLG49ZS5wYWludGVyLmdsLGE9MzI3NjcsdT1uZXcgSW50MTZBcnJheShbb1swXS54LG9bMF0ueSwwLDAsb1sxXS54LG9bMV0ueSxhLDAsb1szXS54LG9bM10ueSwwLGEsb1syXS54LG9bMl0ueSxhLGFdKTt0aGlzLnRpbGU9bmV3IFRpbGUsdGhpcy50aWxlLmJ1Y2tldHM9e30sdGhpcy50aWxlLmJvdW5kc0J1ZmZlcj1uLmNyZWF0ZUJ1ZmZlcigpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUix0aGlzLnRpbGUuYm91bmRzQnVmZmVyKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdSxuLlNUQVRJQ19EUkFXKSx0aGlzLmNlbnRlcj1pfSxsb2FkZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlbyYmdGhpcy52aWRlby5yZWFkeVN0YXRlPj0yfSx1cGRhdGU6ZnVuY3Rpb24oKXt9LHJlbG9hZDpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fbG9hZGVkJiYhKHRoaXMudmlkZW8ucmVhZHlTdGF0ZTwyKSl7dmFyIGk9dGhpcy5jZW50ZXI7dGhpcy50aWxlLmNhbGN1bGF0ZU1hdHJpY2VzKGkuem9vbSxpLmNvbHVtbixpLnJvdyx0aGlzLm1hcC50cmFuc2Zvcm0sdCk7dmFyIHI9dC5nbDt0aGlzLnRpbGUudGV4dHVyZT8oci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsdGhpcy50aWxlLnRleHR1cmUpLHIudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsci5SR0JBLHIuVU5TSUdORURfQllURSx0aGlzLnZpZGVvKSk6KHRoaXMudGlsZS50ZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHRoaXMudGlsZS50ZXh0dXJlKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1Qsci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTElORUFSKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTElORUFSKSxyLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsci5SR0JBLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsdGhpcy52aWRlbykpLHQuZHJhd0xheWVycyhlLHRoaXMudGlsZS5wb3NNYXRyaXgsdGhpcy50aWxlKX19LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LGkpe3JldHVybiBpKG51bGwsW10pfSxmZWF0dXJlc0luOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gaShudWxsLFtdKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi90aWxlXCI6NDQsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlcihlKXt0aGlzLnNlbGY9ZSx0aGlzLmFjdG9yPW5ldyBBY3RvcihlLHRoaXMpLHRoaXMubG9hZGluZz17fSx0aGlzLmxvYWRlZD17fSx0aGlzLmxheWVycz1bXSx0aGlzLmdlb0pTT05JbmRleGVzPXt9fXZhciBBY3Rvcj1yZXF1aXJlKFwiLi4vdXRpbC9hY3RvclwiKSxXb3JrZXJUaWxlPXJlcXVpcmUoXCIuL3dvcmtlcl90aWxlXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxhamF4PXJlcXVpcmUoXCIuLi91dGlsL2FqYXhcIiksdnQ9cmVxdWlyZShcInZlY3Rvci10aWxlXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIiksVGlsZUNvb3JkPXJlcXVpcmUoXCIuL3RpbGVfY29vcmRcIiksZ2VvanNvbnZ0PXJlcXVpcmUoXCJnZW9qc29uLXZ0XCIpLEdlb0pTT05XcmFwcGVyPXJlcXVpcmUoXCIuL2dlb2pzb25fd3JhcHBlclwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdvcmtlcihlKX0sdXRpbC5leHRlbmQoV29ya2VyLnByb3RvdHlwZSx7XCJzZXQgbGF5ZXJzXCI6ZnVuY3Rpb24oZSl7dGhpcy5sYXllcnM9ZX0sXCJsb2FkIHRpbGVcIjpmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIHQodCxzKXtpZihkZWxldGUgdGhpcy5sb2FkaW5nW29dW2ldLHQpcmV0dXJuIHIodCk7aWYoYS5kYXRhPW5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShzKSkpLGUucGFyZW50SWQmJmEuZGF0YS5sYXllcnMpe3ZhciBsPXRoaXMuZ2V0Q2hpbGRQb3NpdGlvbihlLmNvb3JkLmlkLGUucGFyZW50SWQpO2EucGFyc2UoYS5kYXRhLHRoaXMubGF5ZXJzLHRoaXMuYWN0b3IscixsLmR6LGwueFBvcyxsLnlQb3MpfWVsc2UgYS5wYXJzZShhLmRhdGEsdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKTt0aGlzLmxvYWRlZFtvXT10aGlzLmxvYWRlZFtvXXx8e30sdGhpcy5sb2FkZWRbb11baV09YX12YXIgbz1lLnNvdXJjZSxpPWUudWlkO3RoaXMubG9hZGluZ1tvXXx8KHRoaXMubG9hZGluZ1tvXT17fSk7dmFyIGE9dGhpcy5sb2FkaW5nW29dW2ldPW5ldyBXb3JrZXJUaWxlKGUpO2EueGhyPWFqYXguZ2V0QXJyYXlCdWZmZXIoZS51cmwsdC5iaW5kKHRoaXMpKX0sXCJyZWxvYWQgdGlsZVwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9dGhpcy5sb2FkZWRbZS5zb3VyY2VdLG89ZS51aWQ7aWYodCYmdFtvXSl7dmFyIGk9dFtvXTtpLnBhcnNlKGkuZGF0YSx0aGlzLmxheWVycyx0aGlzLmFjdG9yLHIpfX0sXCJhYm9ydCB0aWxlXCI6ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5sb2FkaW5nW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJihyW3RdLnhoci5hYm9ydCgpLGRlbGV0ZSByW3RdKX0sXCJyZW1vdmUgdGlsZVwiOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMubG9hZGVkW2Uuc291cmNlXSx0PWUudWlkO3ImJnJbdF0mJmRlbGV0ZSByW3RdfSxcInJlZG8gcGxhY2VtZW50XCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD10aGlzLmxvYWRlZFtlLnNvdXJjZV0sbz10aGlzLmxvYWRpbmdbZS5zb3VyY2VdLGk9ZS51aWQ7aWYodCYmdFtpXSl7dmFyIGE9dFtpXSxzPWEucmVkb1BsYWNlbWVudChlLmFuZ2xlLGUucGl0Y2gsZS5jb2xsaXNpb25EZWJ1Zyk7cy5yZXN1bHQmJnIobnVsbCxzLnJlc3VsdCxzLnRyYW5zZmVyYWJsZXMpfWVsc2UgbyYmb1tpXSYmKG9baV0uYW5nbGU9ZS5hbmdsZSl9LFwicGFyc2UgZ2VvanNvblwiOmZ1bmN0aW9uKGUscil7dmFyIHQ9ZnVuY3Rpb24odCxvKXtyZXR1cm4gdD9yKHQpOih0aGlzLmdlb0pTT05JbmRleGVzW2Uuc291cmNlXT1nZW9qc29udnQobyxlLmdlb2pzb25WdE9wdGlvbnMpLHZvaWQgcihudWxsKSl9LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGUuZGF0YT9hamF4LmdldEpTT04oZS5kYXRhLHQpOnQobnVsbCxlLmRhdGEpfSxcImxvYWQgZ2VvanNvbiB0aWxlXCI6ZnVuY3Rpb24oZSxyKXt2YXIgdD1lLnNvdXJjZSxvPWUuY29vcmQsaT10aGlzLmdlb0pTT05JbmRleGVzW3RdLmdldFRpbGUoby56LG8ueCxvLnkpO2lmKCFpKXJldHVybiByKG51bGwsbnVsbCk7dmFyIGE9bmV3IFdvcmtlclRpbGUoZSk7YS5wYXJzZShuZXcgR2VvSlNPTldyYXBwZXIoaS5mZWF0dXJlcyksdGhpcy5sYXllcnMsdGhpcy5hY3RvcixyKSx0aGlzLmxvYWRlZFt0XT10aGlzLmxvYWRlZFt0XXx8e30sdGhpcy5sb2FkZWRbdF1bZS51aWRdPWF9LFwicXVlcnkgZmVhdHVyZXNcIjpmdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMubG9hZGVkW2Uuc291cmNlXSYmdGhpcy5sb2FkZWRbZS5zb3VyY2VdW2UudWlkXTt0P3QuZmVhdHVyZVRyZWUucXVlcnkoZSxyKTpyKG51bGwsW10pfSxnZXRDaGlsZFBvc2l0aW9uOmZ1bmN0aW9uKGUscil7dmFyIHQ9VGlsZUNvb3JkLmZyb21JRChlKSxvPVRpbGVDb29yZC5mcm9tSUQociksaT10Lnotby56LGE9dC54JigxPDxpKS0xLHM9dC55JigxPDxpKS0xO3JldHVybntkejppLHhQb3M6YSx5UG9zOnN9fX0pO1xufSx7XCIuLi91dGlsL2FjdG9yXCI6OTMsXCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvdXRpbFwiOjEwNixcIi4vZ2VvanNvbl93cmFwcGVyXCI6NDAsXCIuL3RpbGVfY29vcmRcIjo0NSxcIi4vd29ya2VyX3RpbGVcIjo1MCxcImdlb2pzb24tdnRcIjoxMTEsXCJwYmZcIjoxMzYsXCJ2ZWN0b3ItdGlsZVwiOjE0NH1dLDUwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdvcmtlclRpbGUoZSl7dGhpcy5jb29yZD1lLmNvb3JkLHRoaXMudWlkPWUudWlkLHRoaXMuem9vbT1lLnpvb20sdGhpcy5tYXhab29tPWUubWF4Wm9vbSx0aGlzLnRpbGVTaXplPWUudGlsZVNpemUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMuYW5nbGU9ZS5hbmdsZSx0aGlzLnBpdGNoPWUucGl0Y2gsdGhpcy5jb2xsaXNpb25EZWJ1Zz1lLmNvbGxpc2lvbkRlYnVnLHRoaXMuc3RhY2tzPXt9fXZhciBGZWF0dXJlVHJlZT1yZXF1aXJlKFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIiksQ29sbGlzaW9uVGlsZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCIpLEJ1ZmZlclNldD1yZXF1aXJlKFwiLi4vZGF0YS9idWZmZXIvYnVmZmVyX3NldFwiKSxjcmVhdGVCdWNrZXQ9cmVxdWlyZShcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiKTttb2R1bGUuZXhwb3J0cz1Xb3JrZXJUaWxlLFdvcmtlclRpbGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxyLGkscyxvLG4pe2Z1bmN0aW9uIGEoZSx0LHIsaSxzKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIG49ZS5mZWF0dXJlKG8pO24uZHo9cixuLnhQb3M9aSxuLnlQb3M9cztmb3IodmFyIGEgaW4gdCl7dmFyIGw9dFthXTtsLmZpbHRlcihuKSYmbC5mZWF0dXJlcy5wdXNoKG4pfX19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5kZXBlbmRlbmNpZXNMb2FkZWQ9ITAsdSh2LGUsdCl9fWZ1bmN0aW9uIHUoZSx0LHIpe2lmKCghdC5nZXREZXBlbmRlbmNpZXN8fHQuZGVwZW5kZW5jaWVzTG9hZGVkKSYmKCF0Lm5lZWRzUGxhY2VtZW50fHx0LnByZXZpb3VzUGxhY2VkKSl7aWYoIXIpe3ZhciBpPURhdGUubm93KCk7dC5mZWF0dXJlcy5sZW5ndGgmJnQuYWRkRmVhdHVyZXMoZyk7dmFyIHM9RGF0ZS5ub3coKS1pO2lmKHQuaW50ZXJhY3RpdmUpZm9yKHZhciBvPTA7bzx0LmZlYXR1cmVzLmxlbmd0aDtvKyspe3ZhciBuPXQuZmVhdHVyZXNbb107ZS5mZWF0dXJlVHJlZS5pbnNlcnQobi5iYm94KCksdC5sYXllcnMsbil9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJihzZWxmLmJ1Y2tldFN0YXRzPXNlbGYuYnVja2V0U3RhdHN8fHtfdG90YWw6MH0sc2VsZi5idWNrZXRTdGF0cy5fdG90YWwrPXMsc2VsZi5idWNrZXRTdGF0c1t0LmlkXT0oc2VsZi5idWNrZXRTdGF0c1t0LmlkXXx8MCkrcyksdC5mZWF0dXJlcz1udWxsfXJldHVybiB3LS0sdz92b2lkKHQubmV4dCYmKHQubmV4dC5wcmV2aW91c1BsYWNlZD0hMCx1KGUsdC5uZXh0KSkpOnZvaWQgZigpfX1mdW5jdGlvbiBmKCl7aWYodi5zdGF0dXM9XCJkb25lXCIsdi5yZWRvUGxhY2VtZW50QWZ0ZXJEb25lKXt2YXIgZT12LnJlZG9QbGFjZW1lbnQodi5hbmdsZSx2LnBpdGNoKS5yZXN1bHQ7bS5nbHlwaFZlcnRleD1lLmJ1ZmZlcnMuZ2x5cGhWZXJ0ZXgsbS5pY29uVmVydGV4PWUuYnVmZmVycy5pY29uVmVydGV4LG0uY29sbGlzaW9uQm94VmVydGV4PWUuYnVmZmVycy5jb2xsaXNpb25Cb3hWZXJ0ZXh9dmFyIHQ9W10scj17fTtmb3IoZCBpbiBtKXQucHVzaChtW2RdLmFycmF5KTtmb3IoZCBpbiBiKXJbZF09YltkXS5lbGVtZW50R3JvdXBzO2kobnVsbCx7ZWxlbWVudEdyb3VwczpyLGJ1ZmZlcnM6bSxleHRlbnQ6VCxidWNrZXRTdGF0czpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmLmJ1Y2tldFN0YXRzOm51bGx9LHQpfXRoaXMuc3RhdHVzPVwicGFyc2luZ1wiLHRoaXMuZmVhdHVyZVRyZWU9bmV3IEZlYXR1cmVUcmVlKHRoaXMuY29vcmQsdGhpcy5vdmVyc2NhbGluZyk7dmFyIGMsZCxoLHAsdj10aGlzLG09bmV3IEJ1ZmZlclNldCxnPW5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsdGhpcy5waXRjaCksYj17fSx4PXRoaXMuYnVja2V0c0luT3JkZXI9W10seT17fTtmb3IoYz0wO2M8dC5sZW5ndGg7YysrKWlmKGg9dFtjXSxoLnNvdXJjZT09PXRoaXMuc291cmNlJiYhaC5yZWYpe3ZhciBrPWgubWluem9vbTtpZighKGsmJnRoaXMuem9vbTxrJiZrPHRoaXMubWF4Wm9vbSkpe3ZhciBQPWgubWF4em9vbTtpZighKFAmJnRoaXMuem9vbT49UCkpe3ZhciBTPWgubGF5b3V0LnZpc2liaWxpdHk7aWYoXCJub25lXCIhPT1TKWlmKHA9Y3JlYXRlQnVja2V0KGgsbSx0aGlzLnpvb20sdGhpcy5vdmVyc2NhbGluZyx0aGlzLmNvbGxpc2lvbkRlYnVnKSxwLmxheWVycz1baC5pZF0sYltwLmlkXT1wLHgucHVzaChwKSxlLmxheWVycyl7dmFyIEQ9aFtcInNvdXJjZS1sYXllclwiXTt5W0RdfHwoeVtEXT17fSkseVtEXVtwLmlkXT1wfWVsc2UgeVtwLmlkXT1wfX19Zm9yKGM9MDtjPHQubGVuZ3RoO2MrKyloPXRbY10saC5zb3VyY2U9PT10aGlzLnNvdXJjZSYmaC5yZWYmJihwPWJbaC5yZWZdLHAmJnAubGF5ZXJzLnB1c2goaC5pZCkpO3ZhciBUPTQwOTY7aWYoZS5sYXllcnMpZm9yKGQgaW4geSloPWUubGF5ZXJzW2RdLGgmJihoLmV4dGVudCYmKFQ9aC5leHRlbnQpLGEoaCx5W2RdLHMsbyxuKSk7ZWxzZSBhKGUseSk7dmFyIHosdz14Lmxlbmd0aDtmb3IoYz14Lmxlbmd0aC0xO2M+PTA7Yy0tKXA9eFtjXSxwLm5lZWRzUGxhY2VtZW50JiYoej96Lm5leHQ9cDpwLnByZXZpb3VzUGxhY2VkPSEwLHo9cCkscC5nZXREZXBlbmRlbmNpZXMmJnAuZ2V0RGVwZW5kZW5jaWVzKHRoaXMscixsKHApKSxwLm5lZWRzUGxhY2VtZW50fHxwLmdldERlcGVuZGVuY2llc3x8dSh2LHApfSxXb3JrZXJUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50PWZ1bmN0aW9uKGUsdCxyKXtpZihcImRvbmVcIiE9PXRoaXMuc3RhdHVzKXJldHVybiB0aGlzLnJlZG9QbGFjZW1lbnRBZnRlckRvbmU9ITAsdGhpcy5hbmdsZT1lLHt9O2Zvcih2YXIgaT1uZXcgQnVmZmVyU2V0LHM9W10sbz17fSxuPW5ldyBDb2xsaXNpb25UaWxlKGUsdCksYT10aGlzLmJ1Y2tldHNJbk9yZGVyLGw9YS5sZW5ndGgtMTtsPj0wO2wtLSl7dmFyIHU9YVtsXTtcInN5bWJvbFwiPT09dS50eXBlJiYodS5wbGFjZUZlYXR1cmVzKG4saSxyKSxvW3UuaWRdPXUuZWxlbWVudEdyb3Vwcyl9Zm9yKHZhciBmIGluIGkpcy5wdXNoKGlbZl0uYXJyYXkpO3JldHVybntyZXN1bHQ6e2VsZW1lbnRHcm91cHM6byxidWZmZXJzOml9LHRyYW5zZmVyYWJsZXM6c319O1xufSx7XCIuLi9kYXRhL2J1ZmZlci9idWZmZXJfc2V0XCI6MixcIi4uL2RhdGEvY3JlYXRlX2J1Y2tldFwiOjEzLFwiLi4vZGF0YS9mZWF0dXJlX3RyZWVcIjoxNSxcIi4uL3N5bWJvbC9jb2xsaXNpb25fdGlsZVwiOjY4fV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQW5pbWF0aW9uTG9vcCgpe3RoaXMubj0wLHRoaXMudGltZXM9W119bW9kdWxlLmV4cG9ydHM9QW5pbWF0aW9uTG9vcCxBbmltYXRpb25Mb29wLnByb3RvdHlwZS5zdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZXM9dGhpcy50aW1lcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQudGltZT49KG5ldyBEYXRlKS5nZXRUaW1lKCl9KSwhdGhpcy50aW1lcy5sZW5ndGh9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lcy5wdXNoKHtpZDp0aGlzLm4sdGltZTp0KyhuZXcgRGF0ZSkuZ2V0VGltZSgpfSksdGhpcy5uKyt9LEFuaW1hdGlvbkxvb3AucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbih0KXt0aGlzLnRpbWVzPXRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpLmlkIT09dH0pfTtcbn0se31dLDUyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEltYWdlU3ByaXRlKHQpe3RoaXMuYmFzZT10LHRoaXMucmV0aW5hPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz4xO3ZhciBpPXRoaXMucmV0aW5hP1wiQDJ4XCI6XCJcIjthamF4LmdldEpTT04obm9ybWFsaXplVVJMKHQsaSxcIi5qc29uXCIpLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ/dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjp0fSk6KHRoaXMuZGF0YT1pLHZvaWQodGhpcy5pbWcmJnRoaXMuZmlyZShcImxvYWRcIikpKX0uYmluZCh0aGlzKSksYWpheC5nZXRJbWFnZShub3JtYWxpemVVUkwodCxpLFwiLnBuZ1wiKSxmdW5jdGlvbih0LGkpe2lmKHQpcmV0dXJuIHZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6dH0pO2Zvcih2YXIgZT1pLmdldERhdGEoKSxyPWkuZGF0YT1uZXcgVWludDhBcnJheShlLmxlbmd0aCksYT0wO2E8ZS5sZW5ndGg7YSs9NCl7dmFyIG89ZVthKzNdLzI1NTtyW2ErMF09ZVthKzBdKm8sclthKzFdPWVbYSsxXSpvLHJbYSsyXT1lW2ErMl0qbyxyW2ErM109ZVthKzNdfXRoaXMuaW1nPWksdGhpcy5kYXRhJiZ0aGlzLmZpcmUoXCJsb2FkXCIpfS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBTcHJpdGVQb3NpdGlvbigpe312YXIgRXZlbnRlZD1yZXF1aXJlKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKSxicm93c2VyPXJlcXVpcmUoXCIuLi91dGlsL2Jyb3dzZXJcIiksbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTcHJpdGVVUkw7bW9kdWxlLmV4cG9ydHM9SW1hZ2VTcHJpdGUsSW1hZ2VTcHJpdGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXZlbnRlZCksSW1hZ2VTcHJpdGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2V9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5sb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLmRhdGF8fCF0aGlzLmltZyl9LEltYWdlU3ByaXRlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXtpZihicm93c2VyLmRldmljZVBpeGVsUmF0aW8+MSE9PXRoaXMucmV0aW5hKXt2YXIgdD1uZXcgSW1hZ2VTcHJpdGUodGhpcy5iYXNlKTt0Lm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7dGhpcy5pbWc9dC5pbWcsdGhpcy5kYXRhPXQuZGF0YSx0aGlzLnJldGluYT10LnJldGluYX0uYmluZCh0aGlzKSl9fSxTcHJpdGVQb3NpdGlvbi5wcm90b3R5cGU9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxwaXhlbFJhdGlvOjEsc2RmOiExfSxJbWFnZVNwcml0ZS5wcm90b3R5cGUuZ2V0U3ByaXRlUG9zaXRpb249ZnVuY3Rpb24odCl7aWYoIXRoaXMubG9hZGVkKCkpcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbjt2YXIgaT10aGlzLmRhdGEmJnRoaXMuZGF0YVt0XTtyZXR1cm4gaSYmdGhpcy5pbWc/aTpuZXcgU3ByaXRlUG9zaXRpb259O1xufSx7XCIuLi91dGlsL2FqYXhcIjo5NCxcIi4uL3V0aWwvYnJvd3NlclwiOjk1LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC9tYXBib3hcIjoxMDN9XSw1MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgcmVmZXJlbmNlPXJlcXVpcmUoXCIuL3JlZmVyZW5jZVwiKTttb2R1bGUuZXhwb3J0cz17fSxyZWZlcmVuY2UubGF5b3V0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciByIGluIGUpdGhpc1tyXT1lW3JdfSxvPXJlZmVyZW5jZVtlXTtmb3IodmFyIHQgaW4gbyl2b2lkIDAhPT1vW3RdW1wiZGVmYXVsdFwiXSYmKHIucHJvdG90eXBlW3RdPW9bdF1bXCJkZWZhdWx0XCJdKTttb2R1bGUuZXhwb3J0c1tlLnJlcGxhY2UoXCJsYXlvdXRfXCIsXCJcIildPXJ9KTtcbn0se1wiLi9yZWZlcmVuY2VcIjo1NX1dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLHBhcnNlQ1NTQ29sb3I9cmVxdWlyZShcImNzc2NvbG9ycGFyc2VyXCIpLnBhcnNlQ1NTQ29sb3I7bW9kdWxlLmV4cG9ydHM9e30scmVmZXJlbmNlLnBhaW50LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb24oKXt9LG89cmVmZXJlbmNlW2VdO2Zvcih2YXIgcCBpbiBvKXt2YXIgdD1vW3BdLGE9dFtcImRlZmF1bHRcIl07dm9pZCAwIT09YSYmKFwiY29sb3JcIj09PXQudHlwZSYmKGE9cGFyc2VDU1NDb2xvcihhKSksci5wcm90b3R5cGVbcF09YSl9ci5wcm90b3R5cGUuaGlkZGVuPSExLG1vZHVsZS5leHBvcnRzW2UucmVwbGFjZShcInBhaW50X1wiLFwiXCIpXT1yfSk7XG59LHtcIi4vcmVmZXJlbmNlXCI6NTUsXCJjc3Njb2xvcnBhcnNlclwiOjEwN31dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCIpO1xufSx7XCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0XCI6MTMxfV0sNTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGUoZSx0KXt0aGlzLmFuaW1hdGlvbkxvb3A9dHx8bmV3IEFuaW1hdGlvbkxvb3AsdGhpcy5kaXNwYXRjaGVyPW5ldyBEaXNwYXRjaGVyKE1hdGgubWF4KGJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeS0xLDEpLHRoaXMpLHRoaXMuZ2x5cGhBdGxhcz1uZXcgR2x5cGhBdGxhcygxMDI0LDEwMjQpLHRoaXMuc3ByaXRlQXRsYXM9bmV3IFNwcml0ZUF0bGFzKDUxMiw1MTIpLHRoaXMuc3ByaXRlQXRsYXMucmVzaXplKGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5saW5lQXRsYXM9bmV3IExpbmVBdGxhcygyNTYsNTEyKSx0aGlzLl9sYXllcnM9e30sdGhpcy5fb3JkZXI9W10sdGhpcy5fZ3JvdXBzPVtdLHRoaXMuc291cmNlcz17fSx0aGlzLnpvb21IaXN0b3J5PXt9LHV0aWwuYmluZEFsbChbXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZFRpbGVFdmVudFwiLFwiX3JlZG9QbGFjZW1lbnRcIl0sdGhpcyk7dmFyIHI9ZnVuY3Rpb24oZSx0KXtpZihlKXJldHVybiB2b2lkIHRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOmV9KTt2YXIgcj12YWxpZGF0ZSh0KTtpZihyLmxlbmd0aClmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IocltpXS5tZXNzYWdlKX0pO2Vsc2V7dGhpcy5fbG9hZGVkPSEwLHRoaXMuc3R5bGVzaGVldD10O3ZhciBzPXQuc291cmNlcztmb3IodmFyIG8gaW4gcyl0aGlzLmFkZFNvdXJjZShvLHNbb10pO3Quc3ByaXRlJiYodGhpcy5zcHJpdGU9bmV3IEltYWdlU3ByaXRlKHQuc3ByaXRlKSx0aGlzLnNwcml0ZS5vbihcImxvYWRcIix0aGlzLmZpcmUuYmluZCh0aGlzLFwiY2hhbmdlXCIpKSksdGhpcy5nbHlwaFNvdXJjZT1uZXcgR2x5cGhTb3VyY2UodC5nbHlwaHMsdGhpcy5nbHlwaEF0bGFzKSx0aGlzLl9yZXNvbHZlKCksdGhpcy5maXJlKFwibG9hZFwiKX19LmJpbmQodGhpcyk7XCJzdHJpbmdcIj09dHlwZW9mIGU/YWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChlKSxyKTpicm93c2VyLmZyYW1lKHIuYmluZCh0aGlzLG51bGwsZSkpfXZhciBFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksc3R5bGVCYXRjaD1yZXF1aXJlKFwiLi9zdHlsZV9iYXRjaFwiKSxTdHlsZUxheWVyPXJlcXVpcmUoXCIuL3N0eWxlX2xheWVyXCIpLEltYWdlU3ByaXRlPXJlcXVpcmUoXCIuL2ltYWdlX3Nwcml0ZVwiKSxHbHlwaFNvdXJjZT1yZXF1aXJlKFwiLi4vc3ltYm9sL2dseXBoX3NvdXJjZVwiKSxHbHlwaEF0bGFzPXJlcXVpcmUoXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIiksU3ByaXRlQXRsYXM9cmVxdWlyZShcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIiksTGluZUF0bGFzPXJlcXVpcmUoXCIuLi9yZW5kZXIvbGluZV9hdGxhc1wiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksYWpheD1yZXF1aXJlKFwiLi4vdXRpbC9hamF4XCIpLG5vcm1hbGl6ZVVSTD1yZXF1aXJlKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplU3R5bGVVUkwsYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLERpc3BhdGNoZXI9cmVxdWlyZShcIi4uL3V0aWwvZGlzcGF0Y2hlclwiKSxBbmltYXRpb25Mb29wPXJlcXVpcmUoXCIuL2FuaW1hdGlvbl9sb29wXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCJtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvbGF0ZXN0XCIpO21vZHVsZS5leHBvcnRzPVN0eWxlLFN0eWxlLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7X2xvYWRlZDohMSxsb2FkZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fbG9hZGVkKXJldHVybiExO2Zvcih2YXIgZSBpbiB0aGlzLnNvdXJjZXMpaWYoIXRoaXMuc291cmNlc1tlXS5sb2FkZWQoKSlyZXR1cm4hMTtyZXR1cm4gdGhpcy5zcHJpdGUmJiF0aGlzLnNwcml0ZS5sb2FkZWQoKT8hMTohMH0sX3Jlc29sdmU6ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXMuX2xheWVycz17fSx0aGlzLl9vcmRlcj1bXTtmb3IodmFyIHI9MDtyPHRoaXMuc3R5bGVzaGVldC5sYXllcnMubGVuZ3RoO3IrKyl0PW5ldyBTdHlsZUxheWVyKHRoaXMuc3R5bGVzaGVldC5sYXllcnNbcl0pLHRoaXMuX2xheWVyc1t0LmlkXT10LHRoaXMuX29yZGVyLnB1c2godC5pZCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlTGF5b3V0KCk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1tlXS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMuX2xheWVycyksdGhpcy5fbGF5ZXJzW2VdLnJlc29sdmVQYWludCgpO3RoaXMuX2dyb3VwTGF5ZXJzKCksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzKCl9LF9ncm91cExheWVyczpmdW5jdGlvbigpe3ZhciBlO3RoaXMuX2dyb3Vwcz1bXTtmb3IodmFyIHQ9MDt0PHRoaXMuX29yZGVyLmxlbmd0aDsrK3Qpe3ZhciByPXRoaXMuX2xheWVyc1t0aGlzLl9vcmRlclt0XV07ZSYmci5zb3VyY2U9PT1lLnNvdXJjZXx8KGU9W10sZS5zb3VyY2U9ci5zb3VyY2UsdGhpcy5fZ3JvdXBzLnB1c2goZSkpLGUucHVzaChyKX19LF9icm9hZGNhc3RMYXllcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKWUucHVzaCh0aGlzLl9sYXllcnNbdF0uanNvbigpKTt0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0IGxheWVyc1wiLGUpfSxfY2FzY2FkZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX2xvYWRlZCl7dD10fHx7dHJhbnNpdGlvbjohMH07Zm9yKHZhciByIGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbcl0uY2FzY2FkZShlLHQsdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb258fHt9LHRoaXMuYW5pbWF0aW9uTG9vcCk7dGhpcy5maXJlKFwiY2hhbmdlXCIpfX0sX3JlY2FsY3VsYXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVzZWQ9ITE7dGhpcy5fdXBkYXRlWm9vbUhpc3RvcnkoZSksdGhpcy5yYXN0ZXJGYWRlRHVyYXRpb249MzAwO2Zvcih0IGluIHRoaXMuX2xheWVycyl7dmFyIHI9dGhpcy5fbGF5ZXJzW3RdO3IucmVjYWxjdWxhdGUoZSx0aGlzLnpvb21IaXN0b3J5KSYmci5zb3VyY2UmJih0aGlzLnNvdXJjZXNbci5zb3VyY2VdLnVzZWQ9ITApfXZhciBpPTMwMDtNYXRoLmZsb29yKHRoaXMueikhPT1NYXRoLmZsb29yKGUpJiZ0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KGkpLHRoaXMuej1lLHRoaXMuZmlyZShcInpvb21cIil9LF91cGRhdGVab29tSGlzdG9yeTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnpvb21IaXN0b3J5O3ZvaWQgMD09PXQubGFzdEludGVnZXJab29tJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9MCx0Lmxhc3Rab29tPWUpLE1hdGguZmxvb3IodC5sYXN0Wm9vbSk8TWF0aC5mbG9vcihlKT8odC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9RGF0ZS5ub3coKSk6TWF0aC5mbG9vcih0Lmxhc3Rab29tKT5NYXRoLmZsb29yKGUpJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKzEpLHQubGFzdEludGVnZXJab29tVGltZT1EYXRlLm5vdygpKSx0Lmxhc3Rab29tPWV9LGJhdGNoOmZ1bmN0aW9uKGUpe3N0eWxlQmF0Y2godGhpcyxlKX0sYWRkU291cmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5hZGRTb3VyY2UoZSx0KX0pLHRoaXN9LHJlbW92ZVNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbih0KXt0LnJlbW92ZVNvdXJjZShlKX0pLHRoaXN9LGdldFNvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zb3VyY2VzW2VdfSxhZGRMYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3IuYWRkTGF5ZXIoZSx0KX0pLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHQpe3QucmVtb3ZlTGF5ZXIoZSl9KSx0aGlzfSxnZXRMYXllcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSxnZXRSZWZlcmVudExheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGF5ZXIoZSk7cmV0dXJuIHQucmVmJiYodD10aGlzLmdldExheWVyKHQucmVmKSksdH0sc2V0RmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYmF0Y2goZnVuY3Rpb24ocil7ci5zZXRGaWx0ZXIoZSx0KX0pLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihpKXtpLnNldExheWVyWm9vbVJhbmdlKGUsdCxyKX0pLHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmZpbHRlcn0sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZXRSZWZlcmVudExheWVyKGUpLmdldExheW91dFByb3BlcnR5KHQpfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5nZXRMYXllcihlKS5nZXRQYWludFByb3BlcnR5KHQscil9LGZlYXR1cmVzQXQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcklkcz1BcnJheS5pc0FycmF5KHQubGF5ZXIpP3QubGF5ZXI6W3QubGF5ZXJdKSx1dGlsLmFzeW5jRWFjaChPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLGZ1bmN0aW9uKHIsbyl7dmFyIGE9dGhpcy5zb3VyY2VzW3JdO2EuZmVhdHVyZXNBdChlLHQsZnVuY3Rpb24oZSx0KXt0JiYoaT1pLmNvbmNhdCh0KSksZSYmKHM9ZSksbygpfSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtyZXR1cm4gcz9yKHMpOnZvaWQgcihudWxsLGkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9sYXllcnNbZS5sYXllcl19LmJpbmQodGhpcykpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5sYXllcj10aGlzLl9sYXllcnNbZS5sYXllcl0uanNvbigpLGV9LmJpbmQodGhpcykpKX0uYmluZCh0aGlzKSl9LGZlYXR1cmVzSW46ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPVtdLHM9bnVsbDt0LmxheWVyJiYodC5sYXllcj17aWQ6dC5sYXllcn0pLHV0aWwuYXN5bmNFYWNoKE9iamVjdC5rZXlzKHRoaXMuc291cmNlcyksZnVuY3Rpb24ocixvKXt2YXIgYT10aGlzLnNvdXJjZXNbcl07YS5mZWF0dXJlc0luKGUsdCxmdW5jdGlvbihlLHQpe3QmJihpPWkuY29uY2F0KHQpKSxlJiYocz1lKSxvKCl9KX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3JldHVybiBzP3Iocyk6dm9pZCByKG51bGwsaS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX2xheWVyc1tlLmxheWVyXX0uYmluZCh0aGlzKSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxheWVyPXRoaXMuX2xheWVyc1tlLmxheWVyXS5qc29uKCksZX0uYmluZCh0aGlzKSkpfS5iaW5kKHRoaXMpKX0sX3JlbW92ZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKX0sX3JlbG9hZFNvdXJjZTpmdW5jdGlvbihlKXt0aGlzLnNvdXJjZXNbZV0ucmVsb2FkKCl9LF91cGRhdGVTb3VyY2VzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnNvdXJjZXMpdGhpcy5zb3VyY2VzW3RdLnVwZGF0ZShlKX0sX3JlZG9QbGFjZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5zb3VyY2VzKXRoaXMuc291cmNlc1tlXS5yZWRvUGxhY2VtZW50JiZ0aGlzLnNvdXJjZXNbZV0ucmVkb1BsYWNlbWVudCgpfSxfZm9yd2FyZFNvdXJjZUV2ZW50OmZ1bmN0aW9uKGUpe3RoaXMuZmlyZShcInNvdXJjZS5cIitlLnR5cGUsdXRpbC5leHRlbmQoe3NvdXJjZTplLnRhcmdldH0sZSkpfSxfZm9yd2FyZFRpbGVFdmVudDpmdW5jdGlvbihlKXt0aGlzLmZpcmUoZS50eXBlLHV0aWwuZXh0ZW5kKHtzb3VyY2U6ZS50YXJnZXR9LGUpKX0sXCJnZXQgc3ByaXRlIGpzb25cIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlO3IubG9hZGVkKCk/dChudWxsLHtzcHJpdGU6ci5kYXRhLHJldGluYTpyLnJldGluYX0pOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXt0KG51bGwse3Nwcml0ZTpyLmRhdGEscmV0aW5hOnIucmV0aW5hfSl9KX0sXCJnZXQgaWNvbnNcIjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuc3ByaXRlLGk9dGhpcy5zcHJpdGVBdGxhcztyLmxvYWRlZCgpPyhpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCkpOnIub24oXCJsb2FkXCIsZnVuY3Rpb24oKXtpLnNldFNwcml0ZShyKSxpLmFkZEljb25zKGUuaWNvbnMsdCl9KX0sXCJnZXQgZ2x5cGhzXCI6ZnVuY3Rpb24oZSx0KXt0aGlzLmdseXBoU291cmNlLmdldFNpbXBsZUdseXBocyhlLmZvbnRzdGFjayxlLmNvZGVwb2ludHMsZS51aWQsdCl9fSk7XG59LHtcIi4uL3JlbmRlci9saW5lX2F0bGFzXCI6MzYsXCIuLi9zeW1ib2wvZ2x5cGhfYXRsYXNcIjo3MCxcIi4uL3N5bWJvbC9nbHlwaF9zb3VyY2VcIjo3MSxcIi4uL3N5bWJvbC9zcHJpdGVfYXRsYXNcIjo3NyxcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2Rpc3BhdGNoZXJcIjo5NyxcIi4uL3V0aWwvZXZlbnRlZFwiOjEwMCxcIi4uL3V0aWwvbWFwYm94XCI6MTAzLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9hbmltYXRpb25fbG9vcFwiOjUxLFwiLi9pbWFnZV9zcHJpdGVcIjo1MixcIi4vc3R5bGVfYmF0Y2hcIjo1NyxcIi4vc3R5bGVfbGF5ZXJcIjo2MCxcIm1hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS9sYXRlc3RcIjoxMjl9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBzdHlsZUJhdGNoKGUsdCl7aWYoIWUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO3ZhciByPU9iamVjdC5jcmVhdGUoc3R5bGVCYXRjaC5wcm90b3R5cGUpO3IuX3N0eWxlPWUsci5fZ3JvdXBMYXllcnM9ITEsci5fYnJvYWRjYXN0TGF5ZXJzPSExLHIuX3JlbG9hZFNvdXJjZXM9e30sci5fZXZlbnRzPVtdLHIuX2NoYW5nZT0hMSx0KHIpLHIuX2dyb3VwTGF5ZXJzJiZyLl9zdHlsZS5fZ3JvdXBMYXllcnMoKSxyLl9icm9hZGNhc3RMYXllcnMmJnIuX3N0eWxlLl9icm9hZGNhc3RMYXllcnMoKSxPYmplY3Qua2V5cyhyLl9yZWxvYWRTb3VyY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuX3N0eWxlLl9yZWxvYWRTb3VyY2UoZSl9KSxyLl9ldmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtyLl9zdHlsZS5maXJlLmFwcGx5KHIuX3N0eWxlLGUpfSksci5fY2hhbmdlJiZyLl9zdHlsZS5maXJlKFwiY2hhbmdlXCIpfXZhciBTb3VyY2U9cmVxdWlyZShcIi4uL3NvdXJjZS9zb3VyY2VcIiksU3R5bGVMYXllcj1yZXF1aXJlKFwiLi9zdHlsZV9sYXllclwiKTtzdHlsZUJhdGNoLnByb3RvdHlwZT17YWRkTGF5ZXI6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10aGlzLl9zdHlsZS5fbGF5ZXJzW2UuaWRdKXRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIGFscmVhZHkgYSBsYXllciB3aXRoIHRoaXMgSURcIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBTdHlsZUxheWVyfHwoZT1uZXcgU3R5bGVMYXllcihlKSksdGhpcy5fc3R5bGUuX2xheWVyc1tlLmlkXT1lLHRoaXMuX3N0eWxlLl9vcmRlci5zcGxpY2UodD90aGlzLl9zdHlsZS5fb3JkZXIuaW5kZXhPZih0KToxLzAsMCxlLmlkKSxlLnJlc29sdmVMYXlvdXQoKSxlLnJlc29sdmVSZWZlcmVuY2UodGhpcy5fc3R5bGUuX2xheWVycyksZS5yZXNvbHZlUGFpbnQoKSx0aGlzLl9ncm91cExheWVycz0hMCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fZXZlbnRzLnB1c2goW1wibGF5ZXIuYWRkXCIse2xheWVyOmV9XSksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0eWxlLl9sYXllcnNbZV07aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBsYXllciB3aXRoIHRoaXMgSURcIik7Zm9yKHZhciByIGluIHRoaXMuX3N0eWxlLl9sYXllcnMpdGhpcy5fc3R5bGUuX2xheWVyc1tyXS5yZWY9PT1lJiZ0aGlzLnJlbW92ZUxheWVyKHIpO3JldHVybiBkZWxldGUgdGhpcy5fc3R5bGUuX2xheWVyc1tlXSx0aGlzLl9zdHlsZS5fb3JkZXIuc3BsaWNlKHRoaXMuX3N0eWxlLl9vcmRlci5pbmRleE9mKGUpLDEpLHRoaXMuX2dyb3VwTGF5ZXJzPSEwLHRoaXMuX2Jyb2FkY2FzdExheWVycz0hMCx0aGlzLl9ldmVudHMucHVzaChbXCJsYXllci5yZW1vdmVcIix7bGF5ZXI6dH1dKSx0aGlzLl9jaGFuZ2U9ITAsdGhpc30sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbihlLHQscixzKXtyZXR1cm4gdGhpcy5fc3R5bGUuZ2V0TGF5ZXIoZSkuc2V0UGFpbnRQcm9wZXJ0eSh0LHIscyksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpLGUuc2V0TGF5b3V0UHJvcGVydHkodCxyKSx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuX3N0eWxlLmdldFJlZmVyZW50TGF5ZXIoZSksZS5maWx0ZXI9dCx0aGlzLl9icm9hZGNhc3RMYXllcnM9ITAsZS5zb3VyY2UmJih0aGlzLl9yZWxvYWRTb3VyY2VzW2Uuc291cmNlXT0hMCksdGhpcy5fY2hhbmdlPSEwLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgcz10aGlzLl9zdHlsZS5nZXRSZWZlcmVudExheWVyKGUpO3JldHVybiBudWxsIT10JiYocy5taW56b29tPXQpLG51bGwhPXImJihzLm1heHpvb209ciksdGhpcy5fYnJvYWRjYXN0TGF5ZXJzPSEwLHMuc291cmNlJiYodGhpcy5fcmVsb2FkU291cmNlc1tzLnNvdXJjZV09ITApLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxhZGRTb3VyY2U6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5fc3R5bGUuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nXCIpO2lmKHZvaWQgMCE9PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV0pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSURcIik7cmV0dXJuIHQ9U291cmNlLmNyZWF0ZSh0KSx0aGlzLl9zdHlsZS5zb3VyY2VzW2VdPXQsdC5pZD1lLHQuc3R5bGU9dGhpcy5fc3R5bGUsdC5kaXNwYXRjaGVyPXRoaXMuX3N0eWxlLmRpc3BhdGNoZXIsdC5nbHlwaEF0bGFzPXRoaXMuX3N0eWxlLmdseXBoQXRsYXMsdC5vbihcImxvYWRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub24oXCJjaGFuZ2VcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInRpbGUuYWRkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5lcnJvclwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUucmVtb3ZlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UuYWRkXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfSxyZW1vdmVTb3VyY2U6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09dGhpcy5fc3R5bGUuc291cmNlc1tlXSl0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO3ZhciB0PXRoaXMuX3N0eWxlLnNvdXJjZXNbZV07cmV0dXJuIGRlbGV0ZSB0aGlzLl9zdHlsZS5zb3VyY2VzW2VdLHQub2ZmKFwibG9hZFwiLHRoaXMuX3N0eWxlLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcImVycm9yXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwiY2hhbmdlXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRTb3VyY2VFdmVudCkub2ZmKFwidGlsZS5hZGRcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy5fc3R5bGUuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5yZW1vdmVcIix0aGlzLl9zdHlsZS5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5zdGF0c1wiLHRoaXMuX3N0eWxlLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLl9ldmVudHMucHVzaChbXCJzb3VyY2UucmVtb3ZlXCIse3NvdXJjZTp0fV0pLHRoaXMuX2NoYW5nZT0hMCx0aGlzfX0sbW9kdWxlLmV4cG9ydHM9c3R5bGVCYXRjaDtcbn0se1wiLi4vc291cmNlL3NvdXJjZVwiOjQzLFwiLi9zdHlsZV9sYXllclwiOjYwfV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVEZWNsYXJhdGlvbih0LHIpe3RoaXMudHlwZT10LnR5cGUsdGhpcy50cmFuc2l0aW9uYWJsZT10LnRyYW5zaXRpb24sbnVsbD09ciYmKHI9dFtcImRlZmF1bHRcIl0pLHRoaXMuanNvbj1KU09OLnN0cmluZ2lmeShyKSxcImNvbG9yXCI9PT10aGlzLnR5cGU/dGhpcy52YWx1ZT1wYXJzZUNvbG9yKHIpOnRoaXMudmFsdWU9cixcImludGVycG9sYXRlZFwiPT09dFtcImZ1bmN0aW9uXCJdP3RoaXMuY2FsY3VsYXRlPU1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHRoaXMudmFsdWUpOih0aGlzLmNhbGN1bGF0ZT1NYXBib3hHTEZ1bmN0aW9uW1wicGllY2V3aXNlLWNvbnN0YW50XCJdKHRoaXMudmFsdWUpLHQudHJhbnNpdGlvbiYmKHRoaXMuY2FsY3VsYXRlPXRyYW5zaXRpb25lZCh0aGlzLmNhbGN1bGF0ZSkpKX1mdW5jdGlvbiB0cmFuc2l0aW9uZWQodCl7cmV0dXJuIGZ1bmN0aW9uKHIsbyxlKXt2YXIgbixpLGEsbD1yJTEscz1NYXRoLm1pbigoRGF0ZS5ub3coKS1vLmxhc3RJbnRlZ2VyWm9vbVRpbWUpL2UsMSksYz0xLHU9MTtyZXR1cm4gcj5vLmxhc3RJbnRlZ2VyWm9vbT8obj1sKygxLWwpKnMsYyo9MixpPXQoci0xKSxhPXQocikpOihuPTEtKDEtcykqbCxhPXQociksaT10KHIrMSksYy89Mikse2Zyb206aSxmcm9tU2NhbGU6Yyx0bzphLHRvU2NhbGU6dSx0Om59fX1mdW5jdGlvbiBwYXJzZUNvbG9yKHQpe2lmKGNvbG9yQ2FjaGVbdF0pcmV0dXJuIGNvbG9yQ2FjaGVbdF07aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdDtpZih0LnN0b3BzKXJldHVybiB1dGlsLmV4dGVuZCh7fSx0LHtzdG9wczp0LnN0b3BzLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFswXSxwYXJzZUNvbG9yKHRbMV0pXX0pfSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciByPWNvbG9yRG93bmdyYWRlKHBhcnNlQ1NTQ29sb3IodCkpO3JldHVybiBjb2xvckNhY2hlW3RdPXIscn10aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbG9yIFwiK3QpfWZ1bmN0aW9uIGNvbG9yRG93bmdyYWRlKHQpe3JldHVyblt0WzBdLzI1NSx0WzFdLzI1NSx0WzJdLzI1NSx0WzNdLzFdfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLE1hcGJveEdMRnVuY3Rpb249cmVxdWlyZShcIm1hcGJveC1nbC1mdW5jdGlvblwiKSx1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9U3R5bGVEZWNsYXJhdGlvbjt2YXIgY29sb3JDYWNoZT17fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiY3NzY29sb3JwYXJzZXJcIjoxMDcsXCJtYXBib3gtZ2wtZnVuY3Rpb25cIjoxMjh9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBtYWtlQ29uc3RydWN0b3IodCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl92YWx1ZXM9e30sdGhpcy5fdHJhbnNpdGlvbnM9e307Zm9yKHZhciBlIGluIHQpdGhpc1tlXT10W2VdfXJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLG4se3NldDpmdW5jdGlvbih0KXt0aGlzLl92YWx1ZXNbbl09bmV3IFN0eWxlRGVjbGFyYXRpb24ocix0KX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlc1tuXS52YWx1ZX19KSxyLnRyYW5zaXRpb24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxuK1wiLXRyYW5zaXRpb25cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zaXRpb25zW25dPXR9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uc1tuXX19KX0pLGUucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92YWx1ZXN9LGUucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2l0aW9uc1t0XXx8e307cmV0dXJue2R1cmF0aW9uOnV0aWwuY29hbGVzY2Uobi5kdXJhdGlvbixlLmR1cmF0aW9uLDMwMCksZGVsYXk6dXRpbC5jb2FsZXNjZShuLmRlbGF5LGUuZGVsYXksMCl9fSxlLnByb3RvdHlwZS5qc29uPWZ1bmN0aW9uKCl7dmFyIHQ9e307Zm9yKHZhciBlIGluIHRoaXMuX3ZhbHVlcyl0W2VdPXRoaXMuX3ZhbHVlc1tlXS52YWx1ZTtmb3IodmFyIG4gaW4gdGhpcy5fdHJhbnNpdGlvbnMpdFtuK1wiLXRyYW5zaXRpb25cIl09dGhpcy5fdHJhbnNpdGlvbnNbZV07cmV0dXJuIHR9LGV9dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxyZWZlcmVuY2U9cmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpLFN0eWxlRGVjbGFyYXRpb249cmVxdWlyZShcIi4vc3R5bGVfZGVjbGFyYXRpb25cIiksbG9va3VwPXtwYWludDp7fSxsYXlvdXQ6e319O3JlZmVyZW5jZS5sYXllci50eXBlLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2xvb2t1cC5wYWludFt0XT1tYWtlQ29uc3RydWN0b3IocmVmZXJlbmNlW1wicGFpbnRfXCIrdF0pLGxvb2t1cC5sYXlvdXRbdF09bWFrZUNvbnN0cnVjdG9yKHJlZmVyZW5jZVtcImxheW91dF9cIit0XSl9KSxtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBsb29rdXBbdF1bZV0obil9O1xufSx7XCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL3JlZmVyZW5jZVwiOjU1LFwiLi9zdHlsZV9kZWNsYXJhdGlvblwiOjU4fV0sNjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3R5bGVMYXllcih0KXt0aGlzLl9sYXllcj10LHRoaXMuaWQ9dC5pZCx0aGlzLnJlZj10LnJlZix0aGlzLl9yZXNvbHZlZD17fSx0aGlzLl9jYXNjYWRlZD17fSx0aGlzLmFzc2lnbih0KX1mdW5jdGlvbiBwcmVtdWx0aXBseUxheWVyKHQsaSl7dmFyIGU9aStcIi1jb2xvclwiLGE9aStcIi1oYWxvLWNvbG9yXCIsbz1pK1wiLW91dGxpbmUtY29sb3JcIixyPXRbZV0scz10W2FdLG49dFtvXSxsPXRbaStcIi1vcGFjaXR5XCJdLHk9ciYmbCpyWzNdLHU9cyYmbCpzWzNdLGg9biYmbCpuWzNdO3ZvaWQgMCE9PXkmJjE+eSYmKHRbZV09dXRpbC5wcmVtdWx0aXBseShbclswXSxyWzFdLHJbMl0seV0pKSx2b2lkIDAhPT11JiYxPnUmJih0W2FdPXV0aWwucHJlbXVsdGlwbHkoW3NbMF0sc1sxXSxzWzJdLHVdKSksdm9pZCAwIT09aCYmMT5oJiYodFtvXT11dGlsLnByZW11bHRpcGx5KFtuWzBdLG5bMV0sblsyXSxoXSkpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksU3R5bGVUcmFuc2l0aW9uPXJlcXVpcmUoXCIuL3N0eWxlX3RyYW5zaXRpb25cIiksU3R5bGVEZWNsYXJhdGlvblNldD1yZXF1aXJlKFwiLi9zdHlsZV9kZWNsYXJhdGlvbl9zZXRcIiksTGF5b3V0UHJvcGVydGllcz1yZXF1aXJlKFwiLi9sYXlvdXRfcHJvcGVydGllc1wiKSxQYWludFByb3BlcnRpZXM9cmVxdWlyZShcIi4vcGFpbnRfcHJvcGVydGllc1wiKTttb2R1bGUuZXhwb3J0cz1TdHlsZUxheWVyLFN0eWxlTGF5ZXIucHJvdG90eXBlPXtyZXNvbHZlTGF5b3V0OmZ1bmN0aW9uKCl7dGhpcy5yZWZ8fCh0aGlzLmxheW91dD1uZXcgTGF5b3V0UHJvcGVydGllc1t0aGlzLnR5cGVdKHRoaXMuX2xheWVyLmxheW91dCksXCJsaW5lXCI9PT10aGlzLmxheW91dFtcInN5bWJvbC1wbGFjZW1lbnRcIl0mJih0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dC5oYXNPd25Qcm9wZXJ0eShcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpfHwodGhpcy5sYXlvdXRbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXT1cIm1hcFwiKSx0aGlzLmxheW91dFtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXT0hMCkpfSxzZXRMYXlvdXRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe251bGw9PWk/ZGVsZXRlIHRoaXMubGF5b3V0W3RdOnRoaXMubGF5b3V0W3RdPWl9LGdldExheW91dFByb3BlcnR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxheW91dFt0XX0scmVzb2x2ZVJlZmVyZW5jZTpmdW5jdGlvbih0KXt0aGlzLnJlZiYmdGhpcy5hc3NpZ24odFt0aGlzLnJlZl0pfSxyZXNvbHZlUGFpbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXIpe3ZhciBpPXQubWF0Y2goL15wYWludCg/OlxcLiguKikpPyQvKTtpJiYodGhpcy5fcmVzb2x2ZWRbaVsxXXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx0aGlzLl9sYXllclt0XSkpfX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGksZSl7dmFyIGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl07YXx8KGE9dGhpcy5fcmVzb2x2ZWRbZXx8XCJcIl09bmV3IFN0eWxlRGVjbGFyYXRpb25TZXQoXCJwYWludFwiLHRoaXMudHlwZSx7fSkpLGFbdF09aX0sZ2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX3Jlc29sdmVkW2l8fFwiXCJdO2lmKGUpcmV0dXJuIGVbdF19LGNhc2NhZGU6ZnVuY3Rpb24odCxpLGUsYSl7Zm9yKHZhciBvIGluIHRoaXMuX3Jlc29sdmVkKWlmKFwiXCI9PT1vfHx0W29dKXt2YXIgcj10aGlzLl9yZXNvbHZlZFtvXSxzPXIudmFsdWVzKCk7Zm9yKHZhciBuIGluIHMpe3ZhciBsPXNbbl0seT1pLnRyYW5zaXRpb24/dGhpcy5fY2FzY2FkZWRbbl06dm9pZCAwO2lmKCF5fHx5LmRlY2xhcmF0aW9uLmpzb24hPT1sLmpzb24pe3ZhciB1PXIudHJhbnNpdGlvbihuLGUpLGg9dGhpcy5fY2FzY2FkZWRbbl09bmV3IFN0eWxlVHJhbnNpdGlvbihsLHksdSk7aC5pbnN0YW50KCl8fChoLmxvb3BJRD1hLnNldChoLmVuZFRpbWUtKG5ldyBEYXRlKS5nZXRUaW1lKCkpKSx5JiZhLmNhbmNlbCh5Lmxvb3BJRCl9fX1pZihcInN5bWJvbFwiPT09dGhpcy50eXBlKXt2YXIgYz1uZXcgU3R5bGVEZWNsYXJhdGlvblNldChcImxheW91dFwiLHRoaXMudHlwZSx0aGlzLmxheW91dCk7dGhpcy5fY2FzY2FkZWRbXCJ0ZXh0LXNpemVcIl09bmV3IFN0eWxlVHJhbnNpdGlvbihjLnZhbHVlcygpW1widGV4dC1zaXplXCJdLHZvaWQgMCxlKSx0aGlzLl9jYXNjYWRlZFtcImljb24tc2l6ZVwiXT1uZXcgU3R5bGVUcmFuc2l0aW9uKGMudmFsdWVzKClbXCJpY29uLXNpemVcIl0sdm9pZCAwLGUpfX0scmVjYWxjdWxhdGU6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnR5cGUsYT10aGlzLnBhaW50PW5ldyBQYWludFByb3BlcnRpZXNbZV07Zm9yKHZhciBvIGluIHRoaXMuX2Nhc2NhZGVkKWFbb109dGhpcy5fY2FzY2FkZWRbb10uYXQodCxpKTtpZih0aGlzLmhpZGRlbj10aGlzLm1pbnpvb20mJnQ8dGhpcy5taW56b29tfHx0aGlzLm1heHpvb20mJnQ+PXRoaXMubWF4em9vbXx8XCJub25lXCI9PT10aGlzLmxheW91dC52aXNpYmlsaXR5LFwic3ltYm9sXCI9PT1lPzAhPT1hW1widGV4dC1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcInRleHQtZmllbGRcIl18fDAhPT1hW1wiaWNvbi1vcGFjaXR5XCJdJiZ0aGlzLmxheW91dFtcImljb24taW1hZ2VcIl0/KHByZW11bHRpcGx5TGF5ZXIoYSxcInRleHRcIikscHJlbXVsdGlwbHlMYXllcihhLFwiaWNvblwiKSk6dGhpcy5oaWRkZW49ITA6MD09PWFbZStcIi1vcGFjaXR5XCJdP3RoaXMuaGlkZGVuPSEwOnByZW11bHRpcGx5TGF5ZXIoYSxlKSx0aGlzLl9jYXNjYWRlZFtcImxpbmUtZGFzaGFycmF5XCJdKXt2YXIgcj1hW1wibGluZS1kYXNoYXJyYXlcIl0scz10aGlzLl9jYXNjYWRlZFtcImxpbmUtd2lkdGhcIl0/dGhpcy5fY2FzY2FkZWRbXCJsaW5lLXdpZHRoXCJdLmF0KE1hdGguZmxvb3IodCksMS8wKTphW1wibGluZS13aWR0aFwiXTtyLmZyb21TY2FsZSo9cyxyLnRvU2NhbGUqPXN9cmV0dXJuIXRoaXMuaGlkZGVufSxhc3NpZ246ZnVuY3Rpb24odCl7dXRpbC5leHRlbmQodGhpcyx1dGlsLnBpY2sodCxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0pKX0sanNvbjpmdW5jdGlvbigpe3JldHVybiB1dGlsLmV4dGVuZCh7fSx0aGlzLl9sYXllcix1dGlsLnBpY2sodGhpcyxbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwibWluem9vbVwiLFwibWF4em9vbVwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIixcInBhaW50XCJdKSl9fTtcbn0se1wiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9sYXlvdXRfcHJvcGVydGllc1wiOjUzLFwiLi9wYWludF9wcm9wZXJ0aWVzXCI6NTQsXCIuL3N0eWxlX2RlY2xhcmF0aW9uX3NldFwiOjU5LFwiLi9zdHlsZV90cmFuc2l0aW9uXCI6NjF9XSw2MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTdHlsZVRyYW5zaXRpb24odCxpLGUpe3RoaXMuZGVjbGFyYXRpb249dCx0aGlzLnN0YXJ0VGltZT10aGlzLmVuZFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIG49dC50eXBlO1wic3RyaW5nXCIhPT1uJiZcImFycmF5XCIhPT1ufHwhdC50cmFuc2l0aW9uYWJsZT90aGlzLmludGVycD1pbnRlcnBvbGF0ZVtuXTp0aGlzLmludGVycD1pbnRlcnBab29tVHJhbnNpdGlvbmVkLHRoaXMub2xkVHJhbnNpdGlvbj1pLHRoaXMuZHVyYXRpb249ZS5kdXJhdGlvbnx8MCx0aGlzLmRlbGF5PWUuZGVsYXl8fDAsdGhpcy5pbnN0YW50KCl8fCh0aGlzLmVuZFRpbWU9dGhpcy5zdGFydFRpbWUrdGhpcy5kdXJhdGlvbit0aGlzLmRlbGF5LHRoaXMuZWFzZT11dGlsLmVhc2VDdWJpY0luT3V0KSxpJiZpLmVuZFRpbWU8PXRoaXMuc3RhcnRUaW1lJiZkZWxldGUgaS5vbGRUcmFuc2l0aW9ufWZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQodCxpLGUpe3JldHVybntmcm9tOnQudG8sZnJvbVNjYWxlOnQudG9TY2FsZSx0bzppLnRvLHRvU2NhbGU6aS50b1NjYWxlLHQ6ZX19dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxpbnRlcnBvbGF0ZT1yZXF1aXJlKFwiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiKTttb2R1bGUuZXhwb3J0cz1TdHlsZVRyYW5zaXRpb24sU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5pbnN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMub2xkVHJhbnNpdGlvbnx8IXRoaXMuaW50ZXJwfHwwPT09dGhpcy5kdXJhdGlvbiYmMD09PXRoaXMuZGVsYXl9LFN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuZGVjbGFyYXRpb24uY2FsY3VsYXRlKHQsaSx0aGlzLmR1cmF0aW9uKTtpZih0aGlzLmluc3RhbnQoKSlyZXR1cm4gbjtpZihlPWV8fERhdGUubm93KCksZTx0aGlzLmVuZFRpbWUpe3ZhciByPXRoaXMub2xkVHJhbnNpdGlvbi5hdCh0LGksdGhpcy5zdGFydFRpbWUpLGE9dGhpcy5lYXNlKChlLXRoaXMuc3RhcnRUaW1lLXRoaXMuZGVsYXkpL3RoaXMuZHVyYXRpb24pO249dGhpcy5pbnRlcnAocixuLGEpfXJldHVybiBufTtcbn0se1wiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiOjEwMixcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDYyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEFuY2hvcih0LGUsbyxuKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLmFuZ2xlPW8sdm9pZCAwIT09biYmKHRoaXMuc2VnbWVudD1uKX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUFuY2hvcixBbmNob3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUG9pbnQucHJvdG90eXBlKSxBbmNob3IucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBbmNob3IodGhpcy54LHRoaXMueSx0aGlzLmFuZ2xlLHRoaXMuc2VnbWVudCl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDYzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEJpblBhY2soZSxoKXt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9aCx0aGlzLmZyZWU9W3t4OjAseTowLHc6ZSxoOmh9XX1tb2R1bGUuZXhwb3J0cz1CaW5QYWNrLEJpblBhY2sucHJvdG90eXBlLnJlbGVhc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciBoPTA7aDx0aGlzLmZyZWUubGVuZ3RoO2grKyl7dmFyIGk9dGhpcy5mcmVlW2hdO2lmKGkueT09PWUueSYmaS5oPT09ZS5oJiZpLngraS53PT09ZS54KWkudys9ZS53O2Vsc2UgaWYoaS54PT09ZS54JiZpLnc9PT1lLncmJmkueStpLmg9PT1lLnkpaS5oKz1lLmg7ZWxzZSBpZihlLnk9PT1pLnkmJmUuaD09PWkuaCYmZS54K2Uudz09PWkueClpLng9ZS54LGkudys9ZS53O2Vsc2V7aWYoZS54IT09aS54fHxlLnchPT1pLnd8fGUueStlLmghPT1pLnkpY29udGludWU7aS55PWUueSxpLmgrPWUuaH1yZXR1cm4gdGhpcy5mcmVlLnNwbGljZShoLDEpLHZvaWQgdGhpcy5yZWxlYXNlKGkpfXRoaXMuZnJlZS5wdXNoKGUpfSxCaW5QYWNrLnByb3RvdHlwZS5hbGxvY2F0ZT1mdW5jdGlvbihlLGgpe2Zvcih2YXIgaT17eDoxLzAseToxLzAsdzoxLzAsaDoxLzB9LHQ9LTEscz0wO3M8dGhpcy5mcmVlLmxlbmd0aDtzKyspe3ZhciByPXRoaXMuZnJlZVtzXTtlPD1yLncmJmg8PXIuaCYmci55PD1pLnkmJnIueDw9aS54JiYoaT1yLHQ9cyl9cmV0dXJuIDA+dD97eDotMSx5Oi0xfToodGhpcy5mcmVlLnNwbGljZSh0LDEpLGkudzxpLmg/KGkudz5lJiZ0aGlzLmZyZWUucHVzaCh7eDppLngrZSx5OmkueSx3Omkudy1lLGg6aH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmkudyxoOmkuaC1ofSkpOihpLnc+ZSYmdGhpcy5mcmVlLnB1c2goe3g6aS54K2UseTppLnksdzppLnctZSxoOmkuaH0pLGkuaD5oJiZ0aGlzLmZyZWUucHVzaCh7eDppLngseTppLnkraCx3OmUsaDppLmgtaH0pKSx7eDppLngseTppLnksdzplLGg6aH0pfTtcbn0se31dLDY0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNoZWNrTWF4QW5nbGUoZSx0LGEscixuKXtpZih2b2lkIDA9PT10LnNlZ21lbnQpcmV0dXJuITA7Zm9yKHZhciBpPXQscz10LnNlZ21lbnQrMSxmPTA7Zj4tYS8yOyl7aWYocy0tLDA+cylyZXR1cm4hMTtmLT1lW3NdLmRpc3QoaSksaT1lW3NdfWYrPWVbc10uZGlzdChlW3MrMV0pLHMrKztmb3IodmFyIGw9W10sbz0wO2EvMj5mOyl7dmFyIHU9ZVtzLTFdLGM9ZVtzXSxnPWVbcysxXTtpZighZylyZXR1cm4hMTt2YXIgaD11LmFuZ2xlVG8oYyktYy5hbmdsZVRvKGcpO2ZvcihoPShoKzMqTWF0aC5QSSklKDIqTWF0aC5QSSktTWF0aC5QSSxsLnB1c2goe2Rpc3RhbmNlOmYsYW5nbGVEZWx0YTpofSksbys9aDtmLWxbMF0uZGlzdGFuY2U+cjspby09bC5zaGlmdCgpLmFuZ2xlRGVsdGE7aWYoTWF0aC5hYnMobyk+bilyZXR1cm4hMTtzKyssZis9Yy5kaXN0KGcpfXJldHVybiEwfW1vZHVsZS5leHBvcnRzPWNoZWNrTWF4QW5nbGU7XG59LHt9XSw2NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjbGlwTGluZSh4LHksbixlLHQpe2Zvcih2YXIgaT1bXSxvPTA7bzx4Lmxlbmd0aDtvKyspZm9yKHZhciByLFA9eFtvXSx1PTA7dTxQLmxlbmd0aC0xO3UrKyl7dmFyIHc9UFt1XSxsPVBbdSsxXTt3Lng8eSYmbC54PHl8fCh3Lng8eT93PW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSk6bC54PHkmJihsPW5ldyBQb2ludCh5LHcueSsobC55LXcueSkqKCh5LXcueCkvKGwueC13LngpKSkpLHcueTxuJiZsLnk8bnx8KHcueTxuP3c9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKTpsLnk8biYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKChuLXcueSkvKGwueS13LnkpKSxuKSksdy54Pj1lJiZsLng+PWV8fCh3Lng+PWU/dz1uZXcgUG9pbnQoZSx3LnkrKGwueS13LnkpKigoZS13LngpLyhsLngtdy54KSkpOmwueD49ZSYmKGw9bmV3IFBvaW50KGUsdy55KyhsLnktdy55KSooKGUtdy54KS8obC54LXcueCkpKSksdy55Pj10JiZsLnk+PXR8fCh3Lnk+PXQ/dz1uZXcgUG9pbnQody54KyhsLngtdy54KSooKHQtdy55KS8obC55LXcueSkpLHQpOmwueT49dCYmKGw9bmV3IFBvaW50KHcueCsobC54LXcueCkqKCh0LXcueSkvKGwueS13LnkpKSx0KSksciYmdy5lcXVhbHMocltyLmxlbmd0aC0xXSl8fChyPVt3XSxpLnB1c2gocikpLHIucHVzaChsKSkpKSl9cmV0dXJuIGl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz1jbGlwTGluZTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw2NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBDb2xsaXNpb25Cb3goaSx0LHMsaCxvLGwpe3RoaXMuYW5jaG9yUG9pbnQ9aSx0aGlzLngxPXQsdGhpcy55MT1zLHRoaXMueDI9aCx0aGlzLnkyPW8sdGhpcy5tYXhTY2FsZT1sLHRoaXMucGxhY2VtZW50U2NhbGU9MCx0aGlzWzBdPXRoaXNbMV09dGhpc1syXT10aGlzWzNdPTB9bW9kdWxlLmV4cG9ydHM9Q29sbGlzaW9uQm94O1xufSx7fV0sNjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uRmVhdHVyZShvLGksdCxlLHIscyl7dmFyIG49dC50b3AqZS1yLGw9dC5ib3R0b20qZStyLGE9dC5sZWZ0KmUtcix1PXQucmlnaHQqZStyO2lmKHRoaXMuYm94ZXM9W10scyl7dmFyIGg9bC1uLHg9dS1hO2lmKDA+PWgpcmV0dXJuO2g9TWF0aC5tYXgoMTAqZSxoKSx0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQm94ZXMobyxpLHgsaCl9ZWxzZSB0aGlzLmJveGVzLnB1c2gobmV3IENvbGxpc2lvbkJveChuZXcgUG9pbnQoaS54LGkueSksYSxuLHUsbCwxLzApKX12YXIgQ29sbGlzaW9uQm94PXJlcXVpcmUoXCIuL2NvbGxpc2lvbl9ib3hcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPUNvbGxpc2lvbkZlYXR1cmUsQ29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcz1mdW5jdGlvbihvLGksdCxlKXt2YXIgcj1lLzIscz1NYXRoLmZsb29yKHQvciksbj0tZS8yLGw9dGhpcy5ib3hlcyxhPWksdT1pLnNlZ21lbnQrMSxoPW47ZG97aWYodS0tLDA+dSlyZXR1cm4gbDtoLT1vW3VdLmRpc3QoYSksYT1vW3VdfXdoaWxlKGg+LXQvMik7Zm9yKHZhciB4PW9bdV0uZGlzdChvW3UrMV0pLGQ9MDtzPmQ7ZCsrKXtmb3IodmFyIGY9LXQvMitkKnI7Zj5oK3g7KXtpZihoKz14LHUrKyx1KzE+PW8ubGVuZ3RoKXJldHVybiBsO3g9b1t1XS5kaXN0KG9bdSsxXSl9dmFyIEM9Zi1oLGI9b1t1XSxtPW9bdSsxXSxwPW0uc3ViKGIpLl91bml0KCkuX211bHQoQykuX2FkZChiKSx2PU1hdGgubWF4KE1hdGguYWJzKGYtbiktci8yLDApLF89dC8yL3Y7bC5wdXNoKG5ldyBDb2xsaXNpb25Cb3gocCwtZS8yLC1lLzIsZS8yLGUvMixfKSl9cmV0dXJuIGx9O1xufSx7XCIuL2NvbGxpc2lvbl9ib3hcIjo2NixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sNjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQ29sbGlzaW9uVGlsZSh0LGEpe3RoaXMudHJlZT1yYnVzaCgpLHRoaXMuYW5nbGU9dDt2YXIgZT1NYXRoLnNpbih0KSxpPU1hdGguY29zKHQpO3RoaXMucm90YXRpb25NYXRyaXg9W2ksLWUsZSxpXSx0aGlzLnlTdHJldGNoPTEvTWF0aC5jb3MoYS8xODAqTWF0aC5QSSksdGhpcy55U3RyZXRjaD1NYXRoLnBvdyh0aGlzLnlTdHJldGNoLDEuMyl9dmFyIHJidXNoPXJlcXVpcmUoXCJyYnVzaFwiKTttb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25UaWxlLENvbGxpc2lvblRpbGUucHJvdG90eXBlLm1pblNjYWxlPS4yNSxDb2xsaXNpb25UaWxlLnByb3RvdHlwZS5tYXhTY2FsZT0yLENvbGxpc2lvblRpbGUucHJvdG90eXBlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0KXtmb3IodmFyIGE9dGhpcy5taW5TY2FsZSxlPXRoaXMucm90YXRpb25NYXRyaXgsaT10aGlzLnlTdHJldGNoLG89MDtvPHQuYm94ZXMubGVuZ3RoO28rKyl7dmFyIGw9dC5ib3hlc1tvXSxyPWwuYW5jaG9yUG9pbnQubWF0TXVsdChlKSxzPXIueCxoPXIueTtsWzBdPXMrbC54MSxsWzFdPWgrbC55MSppLGxbMl09cytsLngyLGxbM109aCtsLnkyKmk7Zm9yKHZhciBuPXRoaXMudHJlZS5zZWFyY2gobCksYz0wO2M8bi5sZW5ndGg7YysrKXt2YXIgeD1uW2NdLG09eC5hbmNob3JQb2ludC5tYXRNdWx0KGUpLHk9KHgueDEtbC54MikvKHMtbS54KSx1PSh4LngyLWwueDEpLyhzLW0ueCksUz0oeC55MS1sLnkyKSppLyhoLW0ueSkscD0oeC55Mi1sLnkxKSppLyhoLW0ueSk7KGlzTmFOKHkpfHxpc05hTih1KSkmJih5PXU9MSksKGlzTmFOKFMpfHxpc05hTihwKSkmJihTPXA9MSk7dmFyIE09TWF0aC5taW4oTWF0aC5tYXgoeSx1KSxNYXRoLm1heChTLHApKTtpZihNPngubWF4U2NhbGUmJihNPXgubWF4U2NhbGUpLE0+bC5tYXhTY2FsZSYmKE09bC5tYXhTY2FsZSksTT5hJiZNPj14LnBsYWNlbWVudFNjYWxlJiYoYT1NKSxhPj10aGlzLm1heFNjYWxlKXJldHVybiBhfX1yZXR1cm4gYX0sQ29sbGlzaW9uVGlsZS5wcm90b3R5cGUuaW5zZXJ0Q29sbGlzaW9uRmVhdHVyZT1mdW5jdGlvbih0LGEpe2Zvcih2YXIgZT10LmJveGVzLGk9MDtpPGUubGVuZ3RoO2krKyllW2ldLnBsYWNlbWVudFNjYWxlPWE7YTx0aGlzLm1heFNjYWxlJiZ0aGlzLnRyZWUubG9hZChlKX07XG59LHtcInJidXNoXCI6MTM5fV0sNjk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZ2V0QW5jaG9ycyhlLHIsdCxhLG4sbyxsLGgpe3ZhciBpPWE/LjYqbypsOjAsYz1NYXRoLm1heChhP2EucmlnaHQtYS5sZWZ0OjAsbj9uLnJpZ2h0LW4ubGVmdDowKTtpZigwPT09ZVswXS54fHw0MDk2PT09ZVswXS54fHwwPT09ZVswXS55fHw0MDk2PT09ZVswXS55KXZhciB1PSEwO3IvND5yLWMqbCYmKHI9YypsK3IvNCk7dmFyIHM9MipvLGc9dT9yLzIqaCVyOihjLzIrcykqbCpoJXI7cmV0dXJuIHJlc2FtcGxlKGUsZyxyLGksdCxjKmwsdSwhMSl9ZnVuY3Rpb24gcmVzYW1wbGUoZSxyLHQsYSxuLG8sbCxoKXtmb3IodmFyIGk9MCxjPXItdCx1PVtdLHM9MDtzPGUubGVuZ3RoLTE7cysrKXtmb3IodmFyIGc9ZVtzXSxwPWVbcysxXSx4PWcuZGlzdChwKSxmPXAuYW5nbGVUbyhnKTtpK3g+Yyt0Oyl7Yys9dDt2YXIgdj0oYy1pKS94LG09aW50ZXJwb2xhdGUoZy54LHAueCx2KSxBPWludGVycG9sYXRlKGcueSxwLnksdik7aWYobT49MCYmNDA5Nj5tJiZBPj0wJiY0MDk2PkEpe209TWF0aC5yb3VuZChtKSxBPU1hdGgucm91bmQoQSk7dmFyIHk9bmV3IEFuY2hvcihtLEEsZixzKTsoIWF8fGNoZWNrTWF4QW5nbGUoZSx5LG8sYSxuKSkmJnUucHVzaCh5KX19aSs9eH1yZXR1cm4gaHx8dS5sZW5ndGh8fGx8fCh1PXJlc2FtcGxlKGUsaS8yLHQsYSxuLG8sbCwhMCkpLHV9dmFyIGludGVycG9sYXRlPXJlcXVpcmUoXCIuLi91dGlsL2ludGVycG9sYXRlXCIpLEFuY2hvcj1yZXF1aXJlKFwiLi4vc3ltYm9sL2FuY2hvclwiKSxjaGVja01heEFuZ2xlPXJlcXVpcmUoXCIuL2NoZWNrX21heF9hbmdsZVwiKTttb2R1bGUuZXhwb3J0cz1nZXRBbmNob3JzO1xufSx7XCIuLi9zeW1ib2wvYW5jaG9yXCI6NjIsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi9jaGVja19tYXhfYW5nbGVcIjo2NH1dLDcwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBoQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW5kZXg9e30sdGhpcy5pZHM9e30sdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHQqaSl9dmFyIEJpblBhY2s9cmVxdWlyZShcIi4vYmluX3BhY2tcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhBdGxhcyxHbHlwaEF0bGFzLnByb3RvdHlwZT17Z2V0IGRlYnVnKCl7cmV0dXJuXCJjYW52YXNcImluIHRoaXN9LHNldCBkZWJ1Zyh0KXt0JiYhdGhpcy5jYW52YXM/KHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdGhpcy5jYW52YXMud2lkdGg9dGhpcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LEdseXBoQXRsYXMucHJvdG90eXBlLmdldEdseXBocz1mdW5jdGlvbigpe3ZhciB0LGksZSxzPXt9O2Zvcih2YXIgaCBpbiB0aGlzLmlkcyl0PWguc3BsaXQoXCIjXCIpLGk9dFswXSxlPXRbMV0sc1tpXXx8KHNbaV09W10pLHNbaV0ucHVzaChlKTtyZXR1cm4gc30sR2x5cGhBdGxhcy5wcm90b3R5cGUuZ2V0UmVjdHM9ZnVuY3Rpb24oKXt2YXIgdCxpLGUscz17fTtmb3IodmFyIGggaW4gdGhpcy5pZHMpdD1oLnNwbGl0KFwiI1wiKSxpPXRbMF0sZT10WzFdLHNbaV18fChzW2ldPXt9KSxzW2ldW2VdPXRoaXMuaW5kZXhbaF07cmV0dXJuIHN9LEdseXBoQXRsYXMucHJvdG90eXBlLnJlbW92ZUdseXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdGhpcy5pZHMpe3ZhciBlPXRoaXMuaWRzW2ldLHM9ZS5pbmRleE9mKHQpO2lmKHM+PTAmJmUuc3BsaWNlKHMsMSksdGhpcy5pZHNbaV09ZSwhZS5sZW5ndGgpe2Zvcih2YXIgaD10aGlzLmluZGV4W2ldLGE9dGhpcy5kYXRhLHI9MDtyPGguaDtyKyspZm9yKHZhciBuPXRoaXMud2lkdGgqKGgueStyKStoLngsZD0wO2Q8aC53O2QrKylhW24rZF09MDt0aGlzLmRpcnR5PSEwLHRoaXMuYmluLnJlbGVhc2UoaCksZGVsZXRlIHRoaXMuaW5kZXhbaV0sZGVsZXRlIHRoaXMuaWRzW2ldfX10aGlzLnVwZGF0ZVRleHR1cmUodGhpcy5nbCl9LEdseXBoQXRsYXMucHJvdG90eXBlLmFkZEdseXBoPWZ1bmN0aW9uKHQsaSxlLHMpe2lmKCFlKXJldHVybiBudWxsO3ZhciBoPWkrXCIjXCIrZS5pZDtpZih0aGlzLmluZGV4W2hdKXJldHVybiB0aGlzLmlkc1toXS5pbmRleE9mKHQpPDAmJnRoaXMuaWRzW2hdLnB1c2godCksdGhpcy5pbmRleFtoXTtpZighZS5iaXRtYXApcmV0dXJuIG51bGw7dmFyIGE9ZS53aWR0aCsyKnMscj1lLmhlaWdodCsyKnMsbj0xLGQ9YSsyKm4sbD1yKzIqbjtkKz00LWQlNCxsKz00LWwlNDt2YXIgbz10aGlzLmJpbi5hbGxvY2F0ZShkLGwpO2lmKG8ueDwwKXJldHVybiBjb25zb2xlLndhcm4oXCJnbHlwaCBiaXRtYXAgb3ZlcmZsb3dcIikse2dseXBoOmUscmVjdDpudWxsfTt0aGlzLmluZGV4W2hdPW8sdGhpcy5pZHNbaF09W3RdO2Zvcih2YXIgYz10aGlzLmRhdGEscD1lLmJpdG1hcCx1PTA7cj51O3UrKylmb3IodmFyIHg9dGhpcy53aWR0aCooby55K3Urbikrby54K24sRT1hKnUsVD0wO2E+VDtUKyspY1t4K1RdPXBbRStUXTtyZXR1cm4gdGhpcy5kaXJ0eT0hMCxvfSxHbHlwaEF0bGFzLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3RoaXMuZ2w9dCx0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuQUxQSEEsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLG51bGwpKX0sR2x5cGhBdGxhcy5wcm90b3R5cGUudXBkYXRlVGV4dHVyZT1mdW5jdGlvbih0KXtpZih0aGlzLmJpbmQodCksdGhpcy5kaXJ0eSl7aWYodC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLHRoaXMuZGF0YSksdGhpcy5jdHgpe2Zvcih2YXIgaT10aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGU9MCxzPTA7ZTx0aGlzLmRhdGEubGVuZ3RoO2UrKyxzKz00KWkuZGF0YVtzXT10aGlzLmRhdGFbZV0saS5kYXRhW3MrMV09dGhpcy5kYXRhW2VdLGkuZGF0YVtzKzJdPXRoaXMuZGF0YVtlXSxpLmRhdGFbcyszXT0yNTU7dGhpcy5jdHgucHV0SW1hZ2VEYXRhKGksMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgaD0wO2g8dGhpcy5iaW4uZnJlZS5sZW5ndGg7aCsrKXt2YXIgYT10aGlzLmJpbi5mcmVlW2hdO3RoaXMuY3R4LnN0cm9rZVJlY3QoYS54LGEueSxhLncsYS5oKX19dGhpcy5kaXJ0eT0hMX19O1xufSx7XCIuL2Jpbl9wYWNrXCI6NjN9XSw3MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHbHlwaFNvdXJjZSh0LGUpe3RoaXMudXJsPXQmJm5vcm1hbGl6ZVVSTCh0KSx0aGlzLmdseXBoQXRsYXM9ZSx0aGlzLnN0YWNrcz1bXSx0aGlzLmxvYWRpbmc9e319ZnVuY3Rpb24gU2ltcGxlR2x5cGgodCxlLHIpe3ZhciBpPTE7dGhpcy5hZHZhbmNlPXQuYWR2YW5jZSx0aGlzLmxlZnQ9dC5sZWZ0LXItaSx0aGlzLnRvcD10LnRvcCtyK2ksdGhpcy5yZWN0PWV9ZnVuY3Rpb24gZ2x5cGhVcmwodCxlLHIsaSl7cmV0dXJuIGk9aXx8XCJhYmNcIixyLnJlcGxhY2UoXCJ7c31cIixpW3QubGVuZ3RoJWkubGVuZ3RoXSkucmVwbGFjZShcIntmb250c3RhY2t9XCIsdCkucmVwbGFjZShcIntyYW5nZX1cIixlKX12YXIgbm9ybWFsaXplVVJMPXJlcXVpcmUoXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVHbHlwaHNVUkwsZ2V0QXJyYXlCdWZmZXI9cmVxdWlyZShcIi4uL3V0aWwvYWpheFwiKS5nZXRBcnJheUJ1ZmZlcixHbHlwaHM9cmVxdWlyZShcIi4uL3V0aWwvZ2x5cGhzXCIpLFByb3RvYnVmPXJlcXVpcmUoXCJwYmZcIik7bW9kdWxlLmV4cG9ydHM9R2x5cGhTb3VyY2UsR2x5cGhTb3VyY2UucHJvdG90eXBlLmdldFNpbXBsZUdseXBocz1mdW5jdGlvbih0LGUscixpKXt2b2lkIDA9PT10aGlzLnN0YWNrc1t0XSYmKHRoaXMuc3RhY2tzW3RdPXt9KTtmb3IodmFyIGwsYT17fSxzPXRoaXMuc3RhY2tzW3RdLGg9dGhpcy5nbHlwaEF0bGFzLG89MyxuPXt9LHA9MCx1PTA7dTxlLmxlbmd0aDt1Kyspe3ZhciBmPWVbdV07aWYobD1NYXRoLmZsb29yKGYvMjU2KSxzW2xdKXt2YXIgeT1zW2xdLmdseXBoc1tmXSxjPWguYWRkR2x5cGgocix0LHksbyk7eSYmKGFbZl09bmV3IFNpbXBsZUdseXBoKHksYyxvKSl9ZWxzZSB2b2lkIDA9PT1uW2xdJiYobltsXT1bXSxwKyspLG5bbF0ucHVzaChmKX1wfHxpKHZvaWQgMCxhKTt2YXIgZz1mdW5jdGlvbihlLGwscyl7aWYoIWUpZm9yKHZhciB1PXRoaXMuc3RhY2tzW3RdW2xdPXMuc3RhY2tzWzBdLGY9MDtmPG5bbF0ubGVuZ3RoO2YrKyl7dmFyIHk9bltsXVtmXSxjPXUuZ2x5cGhzW3ldLGc9aC5hZGRHbHlwaChyLHQsYyxvKTtjJiYoYVt5XT1uZXcgU2ltcGxlR2x5cGgoYyxnLG8pKX1wLS0scHx8aSh2b2lkIDAsYSl9LmJpbmQodGhpcyk7Zm9yKHZhciBkIGluIG4pdGhpcy5sb2FkUmFuZ2UodCxkLGcpfSxHbHlwaFNvdXJjZS5wcm90b3R5cGUubG9hZFJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtpZigyNTYqZT42NTUzNSlyZXR1cm4gcihcImd5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZFwiKTt2b2lkIDA9PT10aGlzLmxvYWRpbmdbdF0mJih0aGlzLmxvYWRpbmdbdF09e30pO3ZhciBpPXRoaXMubG9hZGluZ1t0XTtpZihpW2VdKWlbZV0ucHVzaChyKTtlbHNle2lbZV09W3JdO3ZhciBsPTI1NiplK1wiLVwiKygyNTYqZSsyNTUpLGE9Z2x5cGhVcmwodCxsLHRoaXMudXJsKTtnZXRBcnJheUJ1ZmZlcihhLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBsPSF0JiZuZXcgR2x5cGhzKG5ldyBQcm90b2J1ZihuZXcgVWludDhBcnJheShyKSkpLGE9MDthPGlbZV0ubGVuZ3RoO2ErKylpW2VdW2FdKHQsZSxsKTtkZWxldGUgaVtlXX0pfX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjk0LFwiLi4vdXRpbC9nbHlwaHNcIjoxMDEsXCIuLi91dGlsL21hcGJveFwiOjEwMyxcInBiZlwiOjEzNn1dLDcyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKHIpe2wucHVzaChlW3JdKSxjLnB1c2gobltyXSksdi5wdXNoKHRbcl0pLGgrK31mdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1mW2VdO3JldHVybiBkZWxldGUgZltlXSxmW3RdPXIsY1tyXVswXS5wb3AoKSxjW3JdWzBdPWNbcl1bMF0uY29uY2F0KG5bMF0pLHJ9ZnVuY3Rpb24gaShlLHQsbil7dmFyIHI9YVt0XTtyZXR1cm4gZGVsZXRlIGFbdF0sYVtlXT1yLGNbcl1bMF0uc2hpZnQoKSxjW3JdWzBdPW5bMF0uY29uY2F0KGNbcl1bMF0pLHJ9ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHI9bj90WzBdW3RbMF0ubGVuZ3RoLTFdOnRbMF1bMF07cmV0dXJuIGUrXCI6XCIrci54K1wiOlwiK3IueX12YXIgcyxhPXt9LGY9e30sbD1bXSxjPVtdLHY9W10saD0wO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBwPW5bc10sZD10W3NdO2lmKHApaWYoZCl7dmFyIGc9byhkLHApLHg9byhkLHAsITApO2lmKGcgaW4gZiYmeCBpbiBhJiZmW2ddIT09YVt4XSl7dmFyIG09aShnLHgscCkseT11KGcseCxjW21dKTtkZWxldGUgYVtnXSxkZWxldGUgZlt4XSxmW28oZCxjW3ldLCEwKV09eSxjW21dPW51bGx9ZWxzZSBnIGluIGY/dShnLHgscCk6eCBpbiBhP2koZyx4LHApOihyKHMpLGFbZ109aC0xLGZbeF09aC0xKX1lbHNlIHIocyl9cmV0dXJue2ZlYXR1cmVzOmwsdGV4dEZlYXR1cmVzOnYsZ2VvbWV0cmllczpjfX07XG59LHt9XSw3MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTeW1ib2xRdWFkKHQsYSxlLG4saSxvLHIsaCxsKXt0aGlzLmFuY2hvclBvaW50PXQsdGhpcy50bD1hLHRoaXMudHI9ZSx0aGlzLmJsPW4sdGhpcy5icj1pLHRoaXMudGV4PW8sdGhpcy5hbmdsZT1yLHRoaXMubWluU2NhbGU9aCx0aGlzLm1heFNjYWxlPWx9ZnVuY3Rpb24gZ2V0SWNvblF1YWRzKHQsYSxlLG4saSxvKXt2YXIgcj1hLmltYWdlLnJlY3QsaD0xLGw9YS5sZWZ0LWgscz1sK3IudyxtPWEudG9wLWgsdT1tK3IuaCxjPW5ldyBQb2ludChsLG0pLGc9bmV3IFBvaW50KHMsbSksTT1uZXcgUG9pbnQocyx1KSxQPW5ldyBQb2ludChsLHUpLGY9aVtcImljb24tcm90YXRlXCJdKk1hdGguUEkvMTgwO2lmKG8pe3ZhciB5PW5bdC5zZWdtZW50XTtmKz1NYXRoLmF0YW4yKHQueS15LnksdC54LXkueCl9aWYoZil7dmFyIFM9TWF0aC5zaW4oZiksdj1NYXRoLmNvcyhmKSx4PVt2LC1TLFMsdl07Yz1jLm1hdE11bHQoeCksZz1nLm1hdE11bHQoeCksUD1QLm1hdE11bHQoeCksTT1NLm1hdE11bHQoeCl9cmV0dXJuW25ldyBTeW1ib2xRdWFkKG5ldyBQb2ludCh0LngsdC55KSxjLGcsUCxNLGEuaW1hZ2UucmVjdCwwLG1pblNjYWxlLDEvMCldfWZ1bmN0aW9uIGdldEdseXBoUXVhZHModCxhLGUsbixpLG8pe2Zvcih2YXIgcj1pW1widGV4dC1yb3RhdGVcIl0qTWF0aC5QSS8xODAsaD1pW1widGV4dC1rZWVwLXVwcmlnaHRcIl0sbD1hLnBvc2l0aW9uZWRHbHlwaHMscz1bXSxtPTA7bTxsLmxlbmd0aDttKyspe3ZhciB1PWxbbV0sYz11LmdseXBoLGc9Yy5yZWN0O2lmKGcpe3ZhciBNLFA9KHUueCtjLmFkdmFuY2UvMikqZSxmPW1pblNjYWxlO28/KE09W10sZj1nZXRTZWdtZW50R2x5cGhzKE0sdCxQLG4sdC5zZWdtZW50LCEwKSxoJiYoZj1NYXRoLm1pbihmLGdldFNlZ21lbnRHbHlwaHMoTSx0LFAsbix0LnNlZ21lbnQsITEpKSkpOk09W3thbmNob3JQb2ludDpuZXcgUG9pbnQodC54LHQueSksb2Zmc2V0OjAsYW5nbGU6MCxtYXhTY2FsZToxLzAsbWluU2NhbGU6bWluU2NhbGV9XTtmb3IodmFyIHk9dS54K2MubGVmdCxTPXUueS1jLnRvcCx2PXkrZy53LHg9UytnLmgscD1uZXcgUG9pbnQoeSxTKSx3PW5ldyBQb2ludCh2LFMpLGQ9bmV3IFBvaW50KHkseCksST1uZXcgUG9pbnQodix4KSxiPTA7YjxNLmxlbmd0aDtiKyspe3ZhciBRPU1bYl0sRz1wLGs9dyxxPWQsXz1JLGo9US5hbmdsZStyO2lmKGope3ZhciB6PU1hdGguc2luKGopLEE9TWF0aC5jb3MoaiksQj1bQSwteix6LEFdO0c9Ry5tYXRNdWx0KEIpLGs9ay5tYXRNdWx0KEIpLHE9cS5tYXRNdWx0KEIpLF89Xy5tYXRNdWx0KEIpfXZhciBDPU1hdGgubWF4KFEubWluU2NhbGUsZiksRD0odC5hbmdsZStyK1Eub2Zmc2V0KzIqTWF0aC5QSSklKDIqTWF0aC5QSSk7cy5wdXNoKG5ldyBTeW1ib2xRdWFkKFEuYW5jaG9yUG9pbnQsRyxrLHEsXyxnLEQsQyxRLm1heFNjYWxlKSl9fX1yZXR1cm4gc31mdW5jdGlvbiBnZXRTZWdtZW50R2x5cGhzKHQsYSxlLG4saSxvKXt2YXIgcj0hbzswPmUmJihvPSFvKSxvJiZpKys7dmFyIGg9bmV3IFBvaW50KGEueCxhLnkpLGw9bltpXSxzPTEvMDtlPU1hdGguYWJzKGUpO2Zvcih2YXIgbT1taW5TY2FsZTs7KXt2YXIgdT1oLmRpc3QobCksYz1lL3UsZz1NYXRoLmF0YW4yKGwueS1oLnksbC54LWgueCk7aWYob3x8KGcrPU1hdGguUEkpLHImJihnKz1NYXRoLlBJKSx0LnB1c2goe2FuY2hvclBvaW50Omgsb2Zmc2V0OnI/TWF0aC5QSTowLG1pblNjYWxlOmMsbWF4U2NhbGU6cyxhbmdsZTooZysyKk1hdGguUEkpJSgyKk1hdGguUEkpfSksbT49YylicmVhaztmb3IoaD1sO2guZXF1YWxzKGwpOylpZihpKz1vPzE6LTEsbD1uW2ldLCFsKXJldHVybiBjO3ZhciBNPWwuc3ViKGgpLl91bml0KCk7aD1oLnN1YihNLl9tdWx0KHUpKSxzPWN9cmV0dXJuIG19dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz17Z2V0SWNvblF1YWRzOmdldEljb25RdWFkcyxnZXRHbHlwaFF1YWRzOmdldEdseXBoUXVhZHN9O3ZhciBtaW5TY2FsZT0uNTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZXNvbHZlSWNvbnMoZSxyKXtmb3IodmFyIG89W10scz0wLG49ZS5sZW5ndGg7bj5zO3MrKyl7dmFyIHQ9cmVzb2x2ZVRva2VucyhlW3NdLnByb3BlcnRpZXMscltcImljb24taW1hZ2VcIl0pO3QmJm8uaW5kZXhPZih0KTwwJiZvLnB1c2godCl9cmV0dXJuIG99dmFyIHJlc29sdmVUb2tlbnM9cmVxdWlyZShcIi4uL3V0aWwvdG9rZW5cIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUljb25zO1xufSx7XCIuLi91dGlsL3Rva2VuXCI6MTA1fV0sNzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcmVzb2x2ZVRleHQoZSxyLHQpe2Zvcih2YXIgbz1bXSxzPVtdLG49MCx1PWUubGVuZ3RoO3U+bjtuKyspe3ZhciBhPXJlc29sdmVUb2tlbnMoZVtuXS5wcm9wZXJ0aWVzLHJbXCJ0ZXh0LWZpZWxkXCJdKTtpZihhKXthPWEudG9TdHJpbmcoKTt2YXIgbD1yW1widGV4dC10cmFuc2Zvcm1cIl07XCJ1cHBlcmNhc2VcIj09PWw/YT1hLnRvTG9jYWxlVXBwZXJDYXNlKCk6XCJsb3dlcmNhc2VcIj09PWwmJihhPWEudG9Mb2NhbGVMb3dlckNhc2UoKSk7Zm9yKHZhciBpPTAsdj1hLmxlbmd0aDt2Pmk7aSsrKXMucHVzaChhLmNoYXJDb2RlQXQoaSkpO29bbl09YX1lbHNlIG9bbl09bnVsbH1yZXR1cm4gcz11bmlxKHMsdCkse3RleHRGZWF0dXJlczpvLGNvZGVwb2ludHM6c319ZnVuY3Rpb24gdW5pcShlLHIpe3ZhciB0LG89W107ZS5zb3J0KHNvcnROdW1iZXJzKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyllW3NdIT09dCYmKHQ9ZVtzXSxyW3RdfHxvLnB1c2goZVtzXSkpO3JldHVybiBvfWZ1bmN0aW9uIHNvcnROdW1iZXJzKGUscil7cmV0dXJuIGUtcn12YXIgcmVzb2x2ZVRva2Vucz1yZXF1aXJlKFwiLi4vdXRpbC90b2tlblwiKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlVGV4dDtcbn0se1wiLi4vdXRpbC90b2tlblwiOjEwNX1dLDc2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvc2l0aW9uZWRHbHlwaCh0LGksbixlKXt0aGlzLmNvZGVQb2ludD10LHRoaXMueD1pLHRoaXMueT1uLHRoaXMuZ2x5cGg9ZX1mdW5jdGlvbiBTaGFwaW5nKHQsaSxuLGUsbyxoKXt0aGlzLnBvc2l0aW9uZWRHbHlwaHM9dCx0aGlzLnRleHQ9aSx0aGlzLnRvcD1uLHRoaXMuYm90dG9tPWUsdGhpcy5sZWZ0PW8sdGhpcy5yaWdodD1ofWZ1bmN0aW9uIHNoYXBlVGV4dCh0LGksbixlLG8saCxhLHMscil7Zm9yKHZhciBsPVtdLGY9bmV3IFNoYXBpbmcobCx0LHJbMV0sclsxXSxyWzBdLHJbMF0pLGM9LTE3LHA9clswXSx1PXJbMV0rYyxkPTA7ZDx0Lmxlbmd0aDtkKyspe3ZhciBnPXQuY2hhckNvZGVBdChkKSx2PWlbZ107diYmKGwucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGcscCx1LHYpKSxwKz12LmFkdmFuY2Urcyl9cmV0dXJuIGwubGVuZ3RoPyhsaW5ld3JhcChmLGksZSxuLG8saCxhKSxmKTohMX1mdW5jdGlvbiBsaW5ld3JhcCh0LGksbixlLG8saCxhKXt2YXIgcz1udWxsLHI9MCxsPTAsZj0wLGM9MCxwPXQucG9zaXRpb25lZEdseXBocztpZihlKWZvcih2YXIgdT0wO3U8cC5sZW5ndGg7dSsrKXt2YXIgZD1wW3VdO2lmKGQueC09cixkLnkrPW4qZixkLng+ZSYmbnVsbCE9PXMpe3ZhciBnPXBbcysxXS54O2M9TWF0aC5tYXgoZyxjKTtmb3IodmFyIHY9cysxO3U+PXY7disrKXBbdl0ueSs9bixwW3ZdLngtPWc7YSYmanVzdGlmeUxpbmUocCxpLGwscy0xLGEpLGw9cysxLHM9bnVsbCxyKz1nLGYrK31icmVha2FibGVbZC5jb2RlUG9pbnRdJiYocz11KX12YXIgeD1wW3AubGVuZ3RoLTFdLHk9eC54K2lbeC5jb2RlUG9pbnRdLmFkdmFuY2U7Yz1NYXRoLm1heChjLHkpO3ZhciBQPShmKzEpKm47anVzdGlmeUxpbmUocCxpLGwscC5sZW5ndGgtMSxhKSxhbGlnbihwLGEsbyxoLGMsbixmKSx0LnRvcCs9LWgqUCx0LmJvdHRvbT10LnRvcCtQLHQubGVmdCs9LW8qYyx0LnJpZ2h0PXQubGVmdCtjfWZ1bmN0aW9uIGp1c3RpZnlMaW5lKHQsaSxuLGUsbyl7Zm9yKHZhciBoPWlbdFtlXS5jb2RlUG9pbnRdLmFkdmFuY2UsYT0odFtlXS54K2gpKm8scz1uO2U+PXM7cysrKXRbc10ueC09YX1mdW5jdGlvbiBhbGlnbih0LGksbixlLG8saCxhKXtmb3IodmFyIHM9KGktbikqbyxyPSgtZSooYSsxKSsuNSkqaCxsPTA7bDx0Lmxlbmd0aDtsKyspdFtsXS54Kz1zLHRbbF0ueSs9cn1mdW5jdGlvbiBzaGFwZUljb24odCxpKXtpZighdHx8IXQucmVjdClyZXR1cm4gbnVsbDt2YXIgbj1pW1wiaWNvbi1vZmZzZXRcIl1bMF0sZT1pW1wiaWNvbi1vZmZzZXRcIl1bMV0sbz1uLXQud2lkdGgvMixoPW8rdC53aWR0aCxhPWUtdC5oZWlnaHQvMixzPWErdC5oZWlnaHQ7cmV0dXJuIG5ldyBQb3NpdGlvbmVkSWNvbih0LGEscyxvLGgpfWZ1bmN0aW9uIFBvc2l0aW9uZWRJY29uKHQsaSxuLGUsbyl7dGhpcy5pbWFnZT10LHRoaXMudG9wPWksdGhpcy5ib3R0b209bix0aGlzLmxlZnQ9ZSx0aGlzLnJpZ2h0PW99bW9kdWxlLmV4cG9ydHM9e3NoYXBlVGV4dDpzaGFwZVRleHQsc2hhcGVJY29uOnNoYXBlSWNvbn07dmFyIGJyZWFrYWJsZT17MzI6ITB9O1xufSx7fV0sNzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ByaXRlQXRsYXModCxpKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9aSx0aGlzLmJpbj1uZXcgQmluUGFjayh0LGkpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuZGF0YT0hMSx0aGlzLnRleHR1cmU9MCx0aGlzLmZpbHRlcj0wLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuZGlydHk9ITB9ZnVuY3Rpb24gY29weUJpdG1hcCh0LGksZSxoLGEscyxyLG8sbixsLHApe3ZhciBkLGMseD1oKmkrZSxmPW8qcytyO2lmKHApZm9yKGYtPXMsYz0tMTtsPj1jO2MrKyx4PSgoYytsKSVsK2gpKmkrZSxmKz1zKWZvcihkPS0xO24+PWQ7ZCsrKWFbZitkXT10W3grKGQrbiklbl07ZWxzZSBmb3IoYz0wO2w+YztjKysseCs9aSxmKz1zKWZvcihkPTA7bj5kO2QrKylhW2YrZF09dFt4K2RdfWZ1bmN0aW9uIEF0bGFzSW1hZ2UodCxpLGUsaCl7dGhpcy5yZWN0PXQsdGhpcy53aWR0aD1pLHRoaXMuaGVpZ2h0PWUsdGhpcy5zZGY9aH12YXIgQmluUGFjaz1yZXF1aXJlKFwiLi9iaW5fcGFja1wiKTttb2R1bGUuZXhwb3J0cz1TcHJpdGVBdGxhcyxTcHJpdGVBdGxhcy5wcm90b3R5cGU9e2dldCBkZWJ1Zygpe3JldHVyblwiY2FudmFzXCJpbiB0aGlzfSxzZXQgZGVidWcodCl7dCYmIXRoaXMuY2FudmFzPyh0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY2FudmFzLndpZHRoPXRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsdGhpcy5jYW52YXMuc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKTohdCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKSxkZWxldGUgdGhpcy5jdHgsZGVsZXRlIHRoaXMuY2FudmFzKX19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCl7aWYodGhpcy5waXhlbFJhdGlvPT09dClyZXR1cm4hMTt2YXIgaT10aGlzLnBpeGVsUmF0aW87aWYodGhpcy5waXhlbFJhdGlvPXQsdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD10aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLmRhdGEpe3ZhciBlPXRoaXMuZGF0YTt0aGlzLmRhdGE9ITEsdGhpcy5hbGxvY2F0ZSgpLHRoaXMudGV4dHVyZT0hMTtmb3IodmFyIGg9dGhpcy53aWR0aCppLGE9dGhpcy5oZWlnaHQqaSxzPXRoaXMud2lkdGgqdCxyPXRoaXMuaGVpZ2h0KnQsbz10aGlzLmRhdGEsbj1lLGw9MDtyPmw7bCsrKWZvcih2YXIgcD1NYXRoLmZsb29yKGwqYS9yKSpoLGQ9bCpzLGM9MDtzPmM7YysrKXt2YXIgeD1NYXRoLmZsb29yKGMqaC9zKTtvW2QrY109bltwK3hdfWU9bnVsbCx0aGlzLmRpcnR5PSEwfXJldHVybiB0aGlzLmRpcnR5fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYWxsb2NhdGVJbWFnZT1mdW5jdGlvbih0LGkpe3ZhciBlPTIsaD10K2UrKDQtKHQrZSklNCksYT1pK2UrKDQtKGkrZSklNCkscz10aGlzLmJpbi5hbGxvY2F0ZShoLGEpO3JldHVybiAwPT09cy53P3M6KHMub3JpZ2luYWxXaWR0aD10LHMub3JpZ2luYWxIZWlnaHQ9aSxzKX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQsaSl7aWYodGhpcy5pbWFnZXNbdF0pcmV0dXJuIHRoaXMuaW1hZ2VzW3RdO2lmKCF0aGlzLnNwcml0ZSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLnNwcml0ZS5nZXRTcHJpdGVQb3NpdGlvbih0KTtpZighZS53aWR0aHx8IWUuaGVpZ2h0KXJldHVybiBudWxsO3ZhciBoPWUud2lkdGgvZS5waXhlbFJhdGlvLGE9ZS5oZWlnaHQvZS5waXhlbFJhdGlvLHM9dGhpcy5hbGxvY2F0ZUltYWdlKGgsYSk7aWYoMD09PXMudylyZXR1cm4gczt2YXIgcj1uZXcgQXRsYXNJbWFnZShzLGgsYSxlLnNkZik7cmV0dXJuIHRoaXMuaW1hZ2VzW3RdPXIsdGhpcy5jb3B5KHMsZSxpKSxyfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLmdldEltYWdlKHQsaSksaD1lJiZlLnJlY3Q7aWYoIWgpcmV0dXJuIG51bGw7dmFyIGE9aT9lLndpZHRoOmgudyxzPWk/ZS5oZWlnaHQ6aC5oLHI9MTtyZXR1cm57c2l6ZTpbYSxzXSx0bDpbKGgueCtyKS90aGlzLndpZHRoLChoLnkrcikvdGhpcy5oZWlnaHRdLGJyOlsoaC54K3IrYSkvdGhpcy53aWR0aCwoaC55K3IrcykvdGhpcy5oZWlnaHRdfX0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFsbG9jYXRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGF0YSl7dmFyIHQ9TWF0aC5mbG9vcih0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyksaT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KnRoaXMucGl4ZWxSYXRpbyk7dGhpcy5kYXRhPW5ldyBVaW50MzJBcnJheSh0KmkpO2Zvcih2YXIgZT0wO2U8dGhpcy5kYXRhLmxlbmd0aDtlKyspdGhpcy5kYXRhW2VdPTB9fSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGksZSl7aWYodGhpcy5zcHJpdGUuaW1nLmRhdGEpe3ZhciBoPW5ldyBVaW50MzJBcnJheSh0aGlzLnNwcml0ZS5pbWcuZGF0YS5idWZmZXIpO3RoaXMuYWxsb2NhdGUoKTt2YXIgYT10aGlzLmRhdGEscz0xO2NvcHlCaXRtYXAoaCx0aGlzLnNwcml0ZS5pbWcud2lkdGgsaS54LGkueSxhLHRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLCh0LngrcykqdGhpcy5waXhlbFJhdGlvLCh0LnkrcykqdGhpcy5waXhlbFJhdGlvLGkud2lkdGgsaS5oZWlnaHQsZSksdGhpcy5kaXJ0eT0hMH19LFNwcml0ZUF0bGFzLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dGhpcy5zcHJpdGU9dH0sU3ByaXRlQXRsYXMucHJvdG90eXBlLmFkZEljb25zPWZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5nZXRJbWFnZSh0W2VdKTtpKG51bGwsdGhpcy5pbWFnZXMpfSxTcHJpdGVBdGxhcy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0LGkpe3ZhciBlPSExO3RoaXMudGV4dHVyZT90LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpOih0aGlzLnRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1MsdC5DTEFNUF9UT19FREdFKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9XUkFQX1QsdC5DTEFNUF9UT19FREdFKSxlPSEwKTt2YXIgaD1pP3QuTElORUFSOnQuTkVBUkVTVDtpZihoIT09dGhpcy5maWx0ZXImJih0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLGgpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsaCksdGhpcy5maWx0ZXI9aCksdGhpcy5kaXJ0eSYmKHRoaXMuYWxsb2NhdGUoKSxlP3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvLDAsdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk6dC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmhlaWdodCp0aGlzLnBpeGVsUmF0aW8sdC5SR0JBLHQuVU5TSUdORURfQllURSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5kaXJ0eT0hMSx0aGlzLmN0eCkpe3ZhciBhPXRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKTthLmRhdGEuc2V0KG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSksdGhpcy5jdHgucHV0SW1hZ2VEYXRhKGEsMCwwKSx0aGlzLmN0eC5zdHJva2VTdHlsZT1cInJlZFwiO2Zvcih2YXIgcz0wO3M8dGhpcy5iaW4uZnJlZS5sZW5ndGg7cysrKXt2YXIgcj10aGlzLmJpbi5mcmVlW3NdO3RoaXMuY3R4LnN0cm9rZVJlY3Qoci54KnRoaXMucGl4ZWxSYXRpbyxyLnkqdGhpcy5waXhlbFJhdGlvLHIudyp0aGlzLnBpeGVsUmF0aW8sci5oKnRoaXMucGl4ZWxSYXRpbyl9fX07XG59LHtcIi4vYmluX3BhY2tcIjo2M31dLDc4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsL3V0aWxcIiksaW50ZXJwb2xhdGU9cmVxdWlyZShcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vdXRpbC9icm93c2VyXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLENhbWVyYT1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe307dXRpbC5leHRlbmQoQ2FtZXJhLnByb3RvdHlwZSx7Z2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmNlbnRlcn0sc2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyOnR9KSx0aGlzfSxwYW5CeTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlcix1dGlsLmV4dGVuZCh7b2Zmc2V0OlBvaW50LmNvbnZlcnQodCkubXVsdCgtMSl9LGkpKSx0aGlzfSxwYW5UbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLHQ9TG5nTGF0LmNvbnZlcnQodCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwLGVhc2luZzp1dGlsLmVhc2Usb2Zmc2V0OlswLDBdfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLnJvdGF0ZSgtZS5hbmdsZSksbz1lLnBvaW50LHI9ZS5wcm9qZWN0KHQpLnN1YihuKTtyZXR1cm4gaS5ub01vdmVTdGFydHx8dGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpLHRoaXMuX2Vhc2UoZnVuY3Rpb24odCl7ZS5jZW50ZXI9ZS51bnByb2plY3Qoby5hZGQoci5zdWIobykubXVsdCh0KSkpLHRoaXMuZmlyZShcIm1vdmVcIil9LGZ1bmN0aW9uKCl7dGhpcy5maXJlKFwibW92ZWVuZFwiKX0saSksdGhpc30sZ2V0Wm9vbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybS56b29tfSxzZXRab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmp1bXBUbyh7em9vbTp0fSksdGhpc30sem9vbVRvOmZ1bmN0aW9uKHQsaSl7dGhpcy5zdG9wKCksaT11dGlsLmV4dGVuZCh7ZHVyYXRpb246NTAwfSxpKSxpLmVhc2luZz10aGlzLl91cGRhdGVFYXNpbmcoaS5kdXJhdGlvbix0LGkuZWFzaW5nKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPWUuY2VudGVyLG89ZS56b29tO3JldHVybiBpLmFyb3VuZD9uPUxuZ0xhdC5jb252ZXJ0KGkuYXJvdW5kKTppLm9mZnNldCYmKG49ZS5wb2ludExvY2F0aW9uKGUuY2VudGVyUG9pbnQuYWRkKFBvaW50LmNvbnZlcnQoaS5vZmZzZXQpKSkpLGkuYW5pbWF0ZT09PSExJiYoaS5kdXJhdGlvbj0wKSx0aGlzLnpvb21pbmd8fCh0aGlzLnpvb21pbmc9ITAsdGhpcy5maXJlKFwibW92ZXN0YXJ0XCIpKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKGkpe2Uuc2V0Wm9vbUFyb3VuZChpbnRlcnBvbGF0ZShvLHQsaSksbiksdGhpcy5maXJlKFwibW92ZVwiKS5maXJlKFwiem9vbVwiKX0sZnVuY3Rpb24oKXt0aGlzLmVhc2U9bnVsbCxpLmR1cmF0aW9uPj0yMDAmJih0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKSl9LGkpLGkuZHVyYXRpb248MjAwJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29uWm9vbUVuZCksdGhpcy5fb25ab29tRW5kPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpvb21pbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0uYmluZCh0aGlzKSwyMDApKSx0aGlzfSx6b29tSW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpKzEsdCksdGhpc30sem9vbU91dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCktMSx0KSx0aGlzfSxnZXRCZWFyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmd9LHNldEJlYXJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuanVtcFRvKHtiZWFyaW5nOnR9KSx0aGlzfSxyb3RhdGVUbzpmdW5jdGlvbih0LGkpe3RoaXMuc3RvcCgpLGk9dXRpbC5leHRlbmQoe2R1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSxpKTt2YXIgZT10aGlzLnRyYW5zZm9ybSxuPXRoaXMuZ2V0QmVhcmluZygpLG89ZS5jZW50ZXI7cmV0dXJuIGkuYXJvdW5kP289TG5nTGF0LmNvbnZlcnQoaS5hcm91bmQpOmkub2Zmc2V0JiYobz1lLnBvaW50TG9jYXRpb24oZS5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChpLm9mZnNldCkpKSksdD10aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQsbiksdGhpcy5yb3RhdGluZz0hMCx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbihpKXtlLnNldEJlYXJpbmdBcm91bmQoaW50ZXJwb2xhdGUobix0LGkpLG8pLHRoaXMuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKX0sZnVuY3Rpb24oKXt0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LGkpLHRoaXN9LHJlc2V0Tm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm90YXRlVG8oMCx1dGlsLmV4dGVuZCh7ZHVyYXRpb246MWUzfSx0KSksdGhpc30sc25hcFRvTm9ydGg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0QmVhcmluZygpKTx0aGlzLm9wdGlvbnMuYmVhcmluZ1NuYXA/dGhpcy5yZXNldE5vcnRoKHQpOnRoaXN9LGdldFBpdGNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNofSxzZXRQaXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5qdW1wVG8oe3BpdGNoOnR9KSx0aGlzfSxmaXRCb3VuZHM6ZnVuY3Rpb24odCxpKXtpPXV0aWwuZXh0ZW5kKHtwYWRkaW5nOjAsb2Zmc2V0OlswLDBdLG1heFpvb206MS8wfSxpKSx0PUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpO3ZhciBlPVBvaW50LmNvbnZlcnQoaS5vZmZzZXQpLG49dGhpcy50cmFuc2Zvcm0sbz1uLnByb2plY3QodC5nZXROb3J0aFdlc3QoKSkscj1uLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSkscz1yLnN1YihvKSxhPShuLndpZHRoLTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS54KSkvcy54LGg9KG4uaGVpZ2h0LTIqaS5wYWRkaW5nLTIqTWF0aC5hYnMoZS55KSkvcy55O3JldHVybiBpLmNlbnRlcj1uLnVucHJvamVjdChvLmFkZChyKS5kaXYoMikpLGkuem9vbT1NYXRoLm1pbihuLnNjYWxlWm9vbShuLnNjYWxlKk1hdGgubWluKGEsaCkpLGkubWF4Wm9vbSksaS5iZWFyaW5nPTAsaS5saW5lYXI/dGhpcy5lYXNlVG8oaSk6dGhpcy5mbHlUbyhpKX0sanVtcFRvOmZ1bmN0aW9uKHQpe3RoaXMuc3RvcCgpO3ZhciBpPXRoaXMudHJhbnNmb3JtLGU9ITEsbj0hMSxvPSExO3JldHVyblwiY2VudGVyXCJpbiB0JiYoaS5jZW50ZXI9TG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKSxcInpvb21cImluIHQmJmkuem9vbSE9PSt0Lnpvb20mJihlPSEwLGkuem9vbT0rdC56b29tKSxcImJlYXJpbmdcImluIHQmJmkuYmVhcmluZyE9PSt0LmJlYXJpbmcmJihuPSEwLGkuYmVhcmluZz0rdC5iZWFyaW5nKSxcInBpdGNoXCJpbiB0JiZpLnBpdGNoIT09K3QucGl0Y2gmJihvPSEwLGkucGl0Y2g9K3QucGl0Y2gpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKSxlJiZ0aGlzLmZpcmUoXCJ6b29tXCIpLG4mJnRoaXMuZmlyZShcInJvdGF0ZVwiKSxvJiZ0aGlzLmZpcmUoXCJwaXRjaFwiKSx0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpfSxlYXNlVG86ZnVuY3Rpb24odCl7dGhpcy5zdG9wKCksdD11dGlsLmV4dGVuZCh7b2Zmc2V0OlswLDBdLGR1cmF0aW9uOjUwMCxlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgaT10aGlzLnRyYW5zZm9ybSxlPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLnJvdGF0ZSgtaS5hbmdsZSksbj1pLnBvaW50LG89dGhpcy5nZXRab29tKCkscj10aGlzLmdldEJlYXJpbmcoKSxzPXRoaXMuZ2V0UGl0Y2goKSxhPVwiem9vbVwiaW4gdD8rdC56b29tOm8saD1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcscik6cix1PVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6cyxmPWkuem9vbVNjYWxlKGEtbyksYz1cImNlbnRlclwiaW4gdD9pLnByb2plY3QoTG5nTGF0LmNvbnZlcnQodC5jZW50ZXIpKS5zdWIoZS5kaXYoZikpOm4sbT1MbmdMYXQuY29udmVydCh0LmFyb3VuZCk7cmV0dXJuIGEhPT1vJiYodGhpcy56b29taW5nPSEwKSxyIT09aCYmKHRoaXMucm90YXRpbmc9ITApLHRoaXMuem9vbWluZyYmIW0mJihtPWkucG9pbnRMb2NhdGlvbihpLmNlbnRlclBvaW50LmFkZChjLnN1YihuKS5kaXYoMS0xL2YpKSkpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKHQpe3RoaXMuem9vbWluZz9pLnNldFpvb21Bcm91bmQoaW50ZXJwb2xhdGUobyxhLHQpLG0pOmkuY2VudGVyPWkudW5wcm9qZWN0KG4uYWRkKGMuc3ViKG4pLm11bHQodCkpKSx0aGlzLnJvdGF0aW5nJiYoaS5iZWFyaW5nPWludGVycG9sYXRlKHIsaCx0KSksdSE9PXMmJihpLnBpdGNoPWludGVycG9sYXRlKHMsdSx0KSksdGhpcy5maXJlKFwibW92ZVwiKSx0aGlzLnpvb21pbmcmJnRoaXMuZmlyZShcInpvb21cIiksdGhpcy5yb3RhdGluZyYmdGhpcy5maXJlKFwicm90YXRlXCIpfSxmdW5jdGlvbigpe3RoaXMuem9vbWluZz0hMSx0aGlzLnJvdGF0aW5nPSExLHRoaXMuZmlyZShcIm1vdmVlbmRcIil9LHQpLHRoaXN9LGZseVRvOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkodCl7dmFyIGk9KHoqei1iKmIrKHQ/LTE6MSkqTSpNKl8qXykvKDIqKHQ/ejpiKSpNKl8pO3JldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoaSppKzEpLWkpfWZ1bmN0aW9uIGUodCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBuKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gZSh0KS9uKHQpfXRoaXMuc3RvcCgpLHQ9dXRpbC5leHRlbmQoe29mZnNldDpbMCwwXSxzcGVlZDoxLjIsY3VydmU6MS40MixlYXNpbmc6dXRpbC5lYXNlfSx0KTt2YXIgcj10aGlzLnRyYW5zZm9ybSxzPVBvaW50LmNvbnZlcnQodC5vZmZzZXQpLGE9dGhpcy5nZXRab29tKCksaD10aGlzLmdldEJlYXJpbmcoKSx1PVwiY2VudGVyXCJpbiB0P0xuZ0xhdC5jb252ZXJ0KHQuY2VudGVyKTp0aGlzLmdldENlbnRlcigpLGY9XCJ6b29tXCJpbiB0Pyt0Lnpvb206YSxjPVwiYmVhcmluZ1wiaW4gdD90aGlzLl9ub3JtYWxpemVCZWFyaW5nKHQuYmVhcmluZyxoKTpoLG09ci56b29tU2NhbGUoZi1hKSxnPXIucG9pbnQsZD1yLnByb2plY3QodSkuc3ViKHMuZGl2KG0pKSxwPXIud29ybGRTaXplLGw9dC5jdXJ2ZSx2PXQuc3BlZWQsYj1NYXRoLm1heChyLndpZHRoLHIuaGVpZ2h0KSx6PWIvbSxfPWQuc3ViKGcpLm1hZygpLE09bCpsLEw9aSgwKSx4PWZ1bmN0aW9uKHQpe3JldHVybiBuKEwpL24oTCtsKnQpfSxUPWZ1bmN0aW9uKHQpe3JldHVybiBiKigobihMKSpvKEwrbCp0KS1lKEwpKS9NKS9ffSxCPShpKDEpLUwpL2w7aWYoTWF0aC5hYnMoXyk8MWUtNil7aWYoTWF0aC5hYnMoYi16KTwxZS02KXJldHVybiB0aGlzO3ZhciBqPWI+ej8tMToxO0I9TWF0aC5hYnMoTWF0aC5sb2coei9iKSkvbCxUPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZXhwKGoqbCp0KX19cmV0dXJuIHQuZHVyYXRpb249MWUzKkIvdix0aGlzLnpvb21pbmc9ITAsaCE9PWMmJih0aGlzLnJvdGF0aW5nPSEwKSx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksdGhpcy5fZWFzZShmdW5jdGlvbih0KXt2YXIgaT10KkIsZT1UKGkpO3Iuem9vbT1hK3Iuc2NhbGVab29tKDEveChpKSksci5jZW50ZXI9ci51bnByb2plY3QoZy5hZGQoZC5zdWIoZykubXVsdChlKSkscCksYyE9PWgmJihyLmJlYXJpbmc9aW50ZXJwb2xhdGUoaCxjLHQpKSx0aGlzLmZpcmUoXCJtb3ZlXCIpLmZpcmUoXCJ6b29tXCIpLGMhPT1oJiZ0aGlzLmZpcmUoXCJyb3RhdGVcIil9LGZ1bmN0aW9uKCl7dGhpcy56b29taW5nPSExLHRoaXMucm90YXRpbmc9ITEsdGhpcy5maXJlKFwibW92ZWVuZFwiKX0sdCksdGhpc30saXNFYXNpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2Fib3J0Rm59LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWJvcnRGbiYmKHRoaXMuX2Fib3J0Rm4oKSx0aGlzLl9maW5pc2hFYXNlKCkpLHRoaXN9LF9lYXNlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9maW5pc2hGbj1pLHRoaXMuX2Fib3J0Rm49YnJvd3Nlci50aW1lZChmdW5jdGlvbihpKXt0LmNhbGwodGhpcyxlLmVhc2luZyhpKSksMT09PWkmJnRoaXMuX2ZpbmlzaEVhc2UoKX0sZS5hbmltYXRlPT09ITE/MDplLmR1cmF0aW9uLHRoaXMpfSxfZmluaXNoRWFzZTpmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9hYm9ydEZuO3ZhciB0PXRoaXMuX2ZpbmlzaEZuO2RlbGV0ZSB0aGlzLl9maW5pc2hGbix0LmNhbGwodGhpcyl9LF9ub3JtYWxpemVCZWFyaW5nOmZ1bmN0aW9uKHQsaSl7dD11dGlsLndyYXAodCwtMTgwLDE4MCk7dmFyIGU9TWF0aC5hYnModC1pKTtyZXR1cm4gTWF0aC5hYnModC0zNjAtaSk8ZSYmKHQtPTM2MCksTWF0aC5hYnModCszNjAtaSk8ZSYmKHQrPTM2MCksdH0sX3VwZGF0ZUVhc2luZzpmdW5jdGlvbih0LGksZSl7dmFyIG47aWYodGhpcy5lYXNlKXt2YXIgbz10aGlzLmVhc2Uscj0oRGF0ZS5ub3coKS1vLnN0YXJ0KS9vLmR1cmF0aW9uLHM9by5lYXNpbmcocisuMDEpLW8uZWFzaW5nKHIpLGE9LjI3L01hdGguc3FydChzKnMrMWUtNCkqLjAxLGg9TWF0aC5zcXJ0KC4wNzI5LWEqYSk7bj11dGlsLmJlemllcihhLGgsLjI1LDEpfWVsc2Ugbj1lP3V0aWwuYmV6aWVyLmFwcGx5KHV0aWwsZSk6dXRpbC5lYXNlO3JldHVybiB0aGlzLmVhc2U9e3N0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpLHRvOk1hdGgucG93KDIsaSksZHVyYXRpb246dCxlYXNpbmc6bn0sbn19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL2dlby9sbmdfbGF0X2JvdW5kc1wiOjIxLFwiLi4vdXRpbC9icm93c2VyXCI6OTUsXCIuLi91dGlsL2ludGVycG9sYXRlXCI6MTAyLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw3OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBdHRyaWJ1dGlvbigpe312YXIgQ29udHJvbD1yZXF1aXJlKFwiLi9jb250cm9sXCIpLERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPUF0dHJpYnV0aW9uLEF0dHJpYnV0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJib3R0b20tcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIGk9XCJtYXBib3hnbC1jdHJsLWF0dHJpYlwiLGU9dGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixpLHQuZ2V0Q29udGFpbmVyKCkpO3JldHVybiB0aGlzLl91cGRhdGUoKSx0Lm9uKFwic291cmNlLmxvYWRcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcInNvdXJjZS5yZW1vdmVcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVFZGl0TGluay5iaW5kKHRoaXMpKSxlfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fbWFwLnN0eWxlKWZvcih2YXIgaSBpbiB0aGlzLl9tYXAuc3R5bGUuc291cmNlcyl7dmFyIGU9dGhpcy5fbWFwLnN0eWxlLnNvdXJjZXNbaV07ZS5hdHRyaWJ1dGlvbiYmdC5pbmRleE9mKGUuYXR0cmlidXRpb24pPDAmJnQucHVzaChlLmF0dHJpYnV0aW9uKX10aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXQuam9pbihcIiB8IFwiKSx0aGlzLl9lZGl0TGluaz10aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIm1hcGJveC1pbXByb3ZlLW1hcFwiKVswXSx0aGlzLl91cGRhdGVFZGl0TGluaygpfSxfdXBkYXRlRWRpdExpbms6ZnVuY3Rpb24oKXtpZih0aGlzLl9lZGl0TGluayl7dmFyIHQ9dGhpcy5fbWFwLmdldENlbnRlcigpO3RoaXMuX2VkaXRMaW5rLmhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8jL1wiK3QubG5nK1wiL1wiK3QubGF0K1wiL1wiK01hdGgucm91bmQodGhpcy5fbWFwLmdldFpvb20oKSsxKX19fSk7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDYsXCIuL2NvbnRyb2xcIjo4MH1dLDgwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENvbnRyb2woKXt9bW9kdWxlLmV4cG9ydHM9Q29udHJvbCxDb250cm9sLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24obyl7dGhpcy5fbWFwPW87dmFyIHQ9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQobyk7aWYodGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zaXRpb24pe3ZhciBpPXRoaXMub3B0aW9ucy5wb3NpdGlvbixuPW8uX2NvbnRyb2xDb3JuZXJzW2ldO3QuY2xhc3NOYW1lKz1cIiBtYXBib3hnbC1jdHJsXCIsLTEhPT1pLmluZGV4T2YoXCJib3R0b21cIik/bi5pbnNlcnRCZWZvcmUodCxuLmZpcnN0Q2hpbGQpOm4uYXBwZW5kQ2hpbGQodCl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXA9bnVsbCx0aGlzfX07XG59LHt9XSw4MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBOYXZpZ2F0aW9uKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpfXZhciBDb250cm9sPXJlcXVpcmUoXCIuL2NvbnRyb2xcIiksRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9TmF2aWdhdGlvbixOYXZpZ2F0aW9uLnByb3RvdHlwZT11dGlsLmluaGVyaXQoQ29udHJvbCx7b3B0aW9uczp7cG9zaXRpb246XCJ0b3AtcmlnaHRcIn0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIG89XCJtYXBib3hnbC1jdHJsXCIscz10aGlzLl9jb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLG8rXCItZ3JvdXBcIix0LmdldENvbnRhaW5lcigpKTt0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG8rXCItaWNvbiBcIitvK1wiLXpvb20taW5cIix0Lnpvb21Jbi5iaW5kKHQpKSx0aGlzLl96b29tT3V0QnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWljb24gXCIrbytcIi16b29tLW91dFwiLHQuem9vbU91dC5iaW5kKHQpKSx0aGlzLl9jb21wYXNzPXRoaXMuX2NyZWF0ZUJ1dHRvbihvK1wiLWNvbXBhc3NcIix0LnJlc2V0Tm9ydGguYmluZCh0KSk7dmFyIGU9dGhpcy5fY29tcGFzc0NhbnZhcz1ET00uY3JlYXRlKFwiY2FudmFzXCIsbytcIi1jb21wYXNzLWNhbnZhc1wiLHRoaXMuX2NvbXBhc3MpO3JldHVybiBlLnN0eWxlLmNzc1RleHQ9XCJ3aWR0aDozMHB4OyBoZWlnaHQ6MzBweDtcIixlLndpZHRoPTUyLGUuaGVpZ2h0PTUyLHRoaXMuX2NvbXBhc3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uQ29tcGFzc0Rvd24uYmluZCh0aGlzKSksdGhpcy5fb25Db21wYXNzTW92ZT10aGlzLl9vbkNvbXBhc3NNb3ZlLmJpbmQodGhpcyksdGhpcy5fb25Db21wYXNzVXA9dGhpcy5fb25Db21wYXNzVXAuYmluZCh0aGlzKSx0aGlzLl9jb21wYXNzQ3R4PWUuZ2V0Q29udGV4dChcIjJkXCIpLHQub24oXCJyb3RhdGVcIix0aGlzLl9kcmF3Tm9ydGguYmluZCh0aGlzKSksdGhpcy5fZHJhd05vcnRoKCksc30sX29uQ29tcGFzc0Rvd246ZnVuY3Rpb24odCl7RE9NLmRpc2FibGVEcmFnKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uQ29tcGFzc01vdmUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Db21wYXNzVXApLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0LnN0b3BQcm9wYWdhdGlvbigpfSxfb25Db21wYXNzTW92ZTpmdW5jdGlvbih0KXt2YXIgbz10LnNjcmVlblgscz0yPm8/LTU6bz53aW5kb3cuc2NyZWVuLndpZHRoLTI/NTooby10aGlzLl9wcmV2WCkvNDt0aGlzLl9tYXAuc2V0QmVhcmluZyh0aGlzLl9tYXAuZ2V0QmVhcmluZygpLXMpLHRoaXMuX3ByZXZYPXQuc2NyZWVuWCx0aGlzLl9tb3ZlZD0hMCx0LnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbXBhc3NVcDpmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbkNvbXBhc3NNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uQ29tcGFzc1VwKSxET00uZW5hYmxlRHJhZygpLHRoaXMuX21vdmVkJiYodGhpcy5fbW92ZWQ9ITEsRE9NLnN1cHByZXNzQ2xpY2soKSksdGhpcy5fbWFwLnNuYXBUb05vcnRoKCl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxvKXt2YXIgcz1ET00uY3JlYXRlKFwiYnV0dG9uXCIsdCx0aGlzLl9jb250YWluZXIpO3JldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7bygpfSksc30sX2RyYXdOb3J0aDpmdW5jdGlvbigpe3ZhciB0PTIwLG89OCxzPTI2LGU9dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZStNYXRoLlBJLzIsaT10aGlzLl9jb21wYXNzQ3R4O3RoaXMuX2NvbXBhc3NDYW52YXMud2lkdGg9dGhpcy5fY29tcGFzc0NhbnZhcy53aWR0aCxpLnRyYW5zbGF0ZShzLHMpLGkucm90YXRlKGUpLGkuYmVnaW5QYXRoKCksaS5maWxsU3R5bGU9XCIjMDAwXCIsaS5saW5lVG8oMCwtbyksaS5saW5lVG8oLXQsMCksaS5saW5lVG8oMCxvKSxpLmZpbGwoKSxpLmJlZ2luUGF0aCgpLGkuZmlsbFN0eWxlPVwiI2JiYlwiLGkubW92ZVRvKDAsMCksaS5saW5lVG8oMCxvKSxpLmxpbmVUbyh0LDApLGkubGluZVRvKDAsLW8pLGkuZmlsbCgpLGkuYmVnaW5QYXRoKCksaS5zdHJva2VTdHlsZT1cIiNmZmZcIixpLmxpbmVXaWR0aD00LGkubW92ZVRvKDAsLW8pLGkubGluZVRvKDAsbyksaS5zdHJva2UoKX19KTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcIi4vY29udHJvbFwiOjgwfV0sODI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQm94Wm9vbShvKXt0aGlzLl9tYXA9byx0aGlzLl9lbD1vLmdldENhbnZhc0NvbnRhaW5lcigpLHRoaXMuX2NvbnRhaW5lcj1vLmdldENvbnRhaW5lcigpLHV0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBET009cmVxdWlyZShcIi4uLy4uL3V0aWwvZG9tXCIpLExuZ0xhdEJvdW5kcz1yZXF1aXJlKFwiLi4vLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1Cb3hab29tLEJveFpvb20ucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uTW91c2VEb3duKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKG8peyhvLnNoaWZ0S2V5fHwxPT09by53aGljaCYmMT09PW8uYnV0dG9uKSYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0aGlzLl9vbktleURvd24sITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0aGlzLl9zdGFydFBvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsbyksdGhpcy5hY3RpdmU9ITApfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbyk7dGhpcy5fYm94fHwodGhpcy5fYm94PURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLWJveHpvb21cIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3Jvc3NoYWlyXCIpLERPTS5kaXNhYmxlRHJhZygpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbXN0YXJ0XCIpKTt2YXIgcz1NYXRoLm1pbihlLngsdC54KSxuPU1hdGgubWF4KGUueCx0LngpLGk9TWF0aC5taW4oZS55LHQueSksYT1NYXRoLm1heChlLnksdC55KTtET00uc2V0VHJhbnNmb3JtKHRoaXMuX2JveCxcInRyYW5zbGF0ZShcIitzK1wicHgsXCIraStcInB4KVwiKSx0aGlzLl9ib3guc3R5bGUud2lkdGg9bi1zK1wicHhcIix0aGlzLl9ib3guc3R5bGUuaGVpZ2h0PWEtaStcInB4XCJ9LF9vbk1vdXNlVXA6ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbykscz1uZXcgTG5nTGF0Qm91bmRzKHRoaXMuX21hcC51bnByb2plY3QoZSksdGhpcy5fbWFwLnVucHJvamVjdCh0KSk7dGhpcy5fZmluaXNoKCksdGhpcy5fbWFwLmZpdEJvdW5kcyhzLHtsaW5lYXI6ITB9KS5maXJlKFwiYm94em9vbWVuZFwiLHtib3hab29tQm91bmRzOnN9KX0sX29uS2V5RG93bjpmdW5jdGlvbihvKXsyNz09PW8ua2V5Q29kZSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21hcC5maXJlKFwiYm94em9vbWNhbmNlbFwiKSl9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9ib3gmJih0aGlzLmFjdGl2ZT0hMSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdGhpcy5fb25LZXlEb3duLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC1jcm9zc2hhaXJcIiksdGhpcy5fYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fYm94KSx0aGlzLl9ib3g9bnVsbCxET00uZW5hYmxlRHJhZygpKX19O1xufSx7XCIuLi8uLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjoyMSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEb3VibGVDbGlja1pvb20obyl7dGhpcy5fbWFwPW8sdGhpcy5fb25EYmxDbGljaz10aGlzLl9vbkRibENsaWNrLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9RG91YmxlQ2xpY2tab29tLERvdWJsZUNsaWNrWm9vbS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vbihcImRibGNsaWNrXCIsdGhpcy5fb25EYmxDbGljayl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24obyl7dGhpcy5fbWFwLnpvb21UbyhNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkpKzEse2Fyb3VuZDpvLmxuZ0xhdH0pfX07XG59LHt9XSw4NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEcmFnUGFuKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdQYW47dmFyIGluZXJ0aWFMaW5lYXJpdHk9LjI1LGluZXJ0aWFFYXNpbmc9dXRpbC5iZXppZXIoMCwwLGluZXJ0aWFMaW5lYXJpdHksMSksaW5lcnRpYU1heFNwZWVkPTNlMyxpbmVydGlhRGVjZWxlcmF0aW9uPTRlMztEcmFnUGFuLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24sITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uRG93biksdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24pfSxfb25Eb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0UG9zPXRoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5faW5lcnRpYT1bW0RhdGUubm93KCksdGhpcy5fcG9zXV0sZS50b3VjaGVzPzE9PT1lLnRvdWNoZXMubGVuZ3RoJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCwhMSkpOihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSkpfSxfb25Nb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcDtpZighKHQuYm94Wm9vbS5hY3RpdmV8fHQuZHJhZ1JvdGF0ZS5hY3RpdmV8fGUudG91Y2hlcyYmZS50b3VjaGVzLmxlbmd0aD4xKSl7dGhpcy5hY3RpdmU9ITA7dmFyIG49RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpLGk9dGhpcy5faW5lcnRpYSxvPURhdGUubm93KCk7Zm9yKGkucHVzaChbbyxuXSk7aS5sZW5ndGg+MiYmby1pWzBdWzBdPjUwOylpLnNoaWZ0KCk7dC5zdG9wKCksdC50cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KHQudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odGhpcy5fcG9zKSxuKSx0LmZpcmUoXCJtb3ZlXCIpLHRoaXMuX3Bvcz1uLGUucHJldmVudERlZmF1bHQoKX19LF9vblVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5lcnRpYTtpZihlLmxlbmd0aDwyKXJldHVybiB2b2lkIHRoaXMuX21hcC5maXJlKFwibW92ZWVuZFwiKTt2YXIgdD1lW2UubGVuZ3RoLTFdLG49ZVswXSxpPXRbMV0uc3ViKG5bMV0pLG89KHRbMF0tblswXSkvMWUzLHM9aS5tdWx0KGluZXJ0aWFMaW5lYXJpdHkvbyksYT1zLm1hZygpO2E+aW5lcnRpYU1heFNwZWVkJiYoYT1pbmVydGlhTWF4U3BlZWQscy5fdW5pdCgpLl9tdWx0KGEpKTt2YXIgcj1hLyhpbmVydGlhRGVjZWxlcmF0aW9uKmluZXJ0aWFMaW5lYXJpdHkpLHU9cy5tdWx0KC1yLzIpO3RoaXMuX21hcC5wYW5CeSh1LHtkdXJhdGlvbjoxZTMqcixlYXNpbmc6aW5lcnRpYUVhc2luZyxub01vdmVTdGFydDohMH0pLHRoaXMuYWN0aXZlPSExfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5fb25VcCgpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdmUsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKX0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9vblVwKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNn1dLDg1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIERyYWdSb3RhdGUodCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSxQb2ludD1yZXF1aXJlKFwicG9pbnQtZ2VvbWV0cnlcIiksdXRpbD1yZXF1aXJlKFwiLi4vLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPURyYWdSb3RhdGUsRHJhZ1JvdGF0ZS5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsdGhpcy5fb25Db250ZXh0TWVudSl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKHQpe3RoaXMuX21hcC5zdG9wKCksdGhpcy5fc3RhcnRQb3M9dGhpcy5fcG9zPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0LnByZXZlbnREZWZhdWx0KCl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdGFydFBvcyxvPXRoaXMuX3BvcyxuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxpPXRoaXMuX21hcCxzPWkudHJhbnNmb3JtLmNlbnRlclBvaW50LHI9ZS5zdWIocyksdT1yLm1hZygpO3RoaXMuYWN0aXZlPSEwLGkucm90YXRpbmd8fChpLmZpcmUoXCJtb3Zlc3RhcnRcIiksaS5yb3RhdGluZz0hMCksMjAwPnUmJihzPWUuYWRkKG5ldyBQb2ludCgtMjAwLDApLl9yb3RhdGUoci5hbmdsZSgpKSkpO3ZhciBhPW8uc3ViKHMpLmFuZ2xlV2l0aChuLnN1YihzKSkvTWF0aC5QSSoxODA7aS50cmFuc2Zvcm0uYmVhcmluZz1pLmdldEJlYXJpbmcoKS1hLGkuZmlyZShcIm1vdmVcIikuZmlyZShcInJvdGF0ZVwiKSxjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwyMDApLHRoaXMuX3Bvcz1ufSxfb25UaW1lb3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwO3Qucm90YXRpbmc9ITEsdC5zbmFwVG9Ob3J0aCgpLHQucm90YXRpbmd8fCh0Ll9yZXJlbmRlcigpLHQuZmlyZShcIm1vdmVlbmRcIikpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSl9fTtcbn0se1wiLi4vLi4vdXRpbC9kb21cIjo5OCxcIi4uLy4uL3V0aWwvdXRpbFwiOjEwNixcInBvaW50LWdlb21ldHJ5XCI6MTM3fV0sODY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gS2V5Ym9hcmQoZSl7dGhpcy5fbWFwPWUsdGhpcy5fZWw9ZS5nZXRDYW52YXNDb250YWluZXIoKSx0aGlzLl9vbktleURvd249dGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyl9bW9kdWxlLmV4cG9ydHM9S2V5Ym9hcmQ7dmFyIHBhbkRlbHRhPTgwLHJvdGF0ZURlbHRhPTI7S2V5Ym9hcmQucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biwhMSl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93bil9LF9vbktleURvd246ZnVuY3Rpb24oZSl7aWYoIShlLmFsdEtleXx8ZS5jdHJsS2V5fHxlLm1ldGFLZXkpKXt2YXIgYT10aGlzLl9tYXA7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA2MTpjYXNlIDEwNzpjYXNlIDE3MTpjYXNlIDE4NzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKSsoZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDE4OTpjYXNlIDEwOTpjYXNlIDE3MzphLnpvb21UbyhNYXRoLnJvdW5kKGEuZ2V0Wm9vbSgpKS0oZS5zaGlmdEtleT8yOjEpKTticmVhaztjYXNlIDM3OmUuc2hpZnRLZXk/YS5zZXRCZWFyaW5nKGEuZ2V0QmVhcmluZygpLXJvdGF0ZURlbHRhKTphLnBhbkJ5KFstcGFuRGVsdGEsMF0pO2JyZWFrO2Nhc2UgMzk6ZS5zaGlmdEtleT9hLnNldEJlYXJpbmcoYS5nZXRCZWFyaW5nKCkrcm90YXRlRGVsdGEpOmEucGFuQnkoW3BhbkRlbHRhLDBdKTticmVhaztjYXNlIDM4OmEucGFuQnkoWzAsLXBhbkRlbHRhXSk7YnJlYWs7Y2FzZSA0MDphLnBhbkJ5KFswLHBhbkRlbHRhXSl9fX19O1xufSx7fV0sODc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGluY2godCl7dGhpcy5fbWFwPXQsdGhpcy5fZWw9dC5nZXRDYW52YXNDb250YWluZXIoKSx1dGlsLmJpbmRIYW5kbGVycyh0aGlzKX12YXIgRE9NPXJlcXVpcmUoXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPXJlcXVpcmUoXCIuLi8uLi91dGlsL3V0aWxcIik7bW9kdWxlLmV4cG9ydHM9UGluY2gsUGluY2gucHJvdG90eXBlPXtlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uU3RhcnQsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vblN0YXJ0KX0sX29uU3RhcnQ6ZnVuY3Rpb24odCl7aWYoMj09PXQudG91Y2hlcy5sZW5ndGgpe3ZhciBlPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0LnRvdWNoZXNbMF0pLHM9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1sxXSk7dGhpcy5fc3RhcnRWZWM9ZS5zdWIocyksdGhpcy5fc3RhcnRTY2FsZT10aGlzLl9tYXAudHJhbnNmb3JtLnNjYWxlLHRoaXMuX3N0YXJ0QmVhcmluZz10aGlzLl9tYXAudHJhbnNmb3JtLmJlYXJpbmcsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQsITEpfX0sX29uTW92ZTpmdW5jdGlvbih0KXtpZigyPT09dC50b3VjaGVzLmxlbmd0aCl7dmFyIGU9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQudG91Y2hlc1swXSkscz1ET00ubW91c2VQb3ModGhpcy5fZWwsdC50b3VjaGVzWzFdKSxuPWUuYWRkKHMpLmRpdigyKSxvPWUuc3ViKHMpLGk9by5tYWcoKS90aGlzLl9zdGFydFZlYy5tYWcoKSxhPTE4MCpvLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykvTWF0aC5QSSxyPXRoaXMuX21hcDtyLmVhc2VUbyh7em9vbTpyLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSppKSxiZWFyaW5nOnRoaXMuX3N0YXJ0QmVhcmluZythLGR1cmF0aW9uOjAsYXJvdW5kOnIudW5wcm9qZWN0KG4pfSksdC5wcmV2ZW50RGVmYXVsdCgpfX0sX29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLnNuYXBUb05vcnRoKCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuX29uTW92ZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQpfX07XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBTY3JvbGxab29tKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kSGFuZGxlcnModGhpcyl9dmFyIERPTT1yZXF1aXJlKFwiLi4vLi4vdXRpbC9kb21cIiksYnJvd3Nlcj1yZXF1aXJlKFwiLi4vLi4vdXRpbC9icm93c2VyXCIpLHV0aWw9cmVxdWlyZShcIi4uLy4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1TY3JvbGxab29tO3ZhciB1YT1cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yP25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTpcIlwiLGZpcmVmb3g9LTEhPT11YS5pbmRleE9mKFwiZmlyZWZveFwiKSxzYWZhcmk9LTEhPT11YS5pbmRleE9mKFwic2FmYXJpXCIpJiYtMT09PXVhLmluZGV4T2YoXCJjaHJvbVwiKTtTY3JvbGxab29tLnByb3RvdHlwZT17ZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsdGhpcy5fb25XaGVlbCwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLHRoaXMuX29uV2hlZWwpLHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsdGhpcy5fb25XaGVlbCl9LF9vbldoZWVsOmZ1bmN0aW9uKGUpe3ZhciB0O1wid2hlZWxcIj09PWUudHlwZT8odD1lLmRlbHRhWSxmaXJlZm94JiZlLmRlbHRhTW9kZT09PXdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCYmKHQvPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksZS5kZWx0YU1vZGU9PT13aW5kb3cuV2hlZWxFdmVudC5ET01fREVMVEFfTElORSYmKHQqPTQwKSk6XCJtb3VzZXdoZWVsXCI9PT1lLnR5cGUmJih0PS1lLndoZWVsRGVsdGFZLHNhZmFyaSYmKHQvPTMpKTt2YXIgaT0od2luZG93LnBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKSxvPWktKHRoaXMuX3RpbWV8fDApO3RoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsZSksdGhpcy5fdGltZT1pLDAhPT10JiZ0JTQuMDAwMjQ0MTQwNjI1PT09MD8odGhpcy5fdHlwZT1cIndoZWVsXCIsdD1NYXRoLmZsb29yKHQvNCkpOjAhPT10JiZNYXRoLmFicyh0KTw0P3RoaXMuX3R5cGU9XCJ0cmFja3BhZFwiOm8+NDAwPyh0aGlzLl90eXBlPW51bGwsdGhpcy5fbGFzdFZhbHVlPXQsdGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCw0MCkpOnRoaXMuX3R5cGV8fCh0aGlzLl90eXBlPU1hdGguYWJzKG8qdCk8MjAwP1widHJhY2twYWRcIjpcIndoZWVsXCIsdGhpcy5fdGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PW51bGwsdCs9dGhpcy5fbGFzdFZhbHVlKSksZS5zaGlmdEtleSYmdCYmKHQvPTQpLHRoaXMuX3R5cGUmJnRoaXMuX3pvb20oLXQpLGUucHJldmVudERlZmF1bHQoKX0sX29uVGltZW91dDpmdW5jdGlvbigpe3RoaXMuX3R5cGU9XCJ3aGVlbFwiLHRoaXMuX3pvb20oLXRoaXMuX2xhc3RWYWx1ZSl9LF96b29tOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxpPTIvKDErTWF0aC5leHAoLU1hdGguYWJzKGUvMTAwKSkpOzA+ZSYmMCE9PWkmJihpPTEvaSk7dmFyIG89dC5lYXNlP3QuZWFzZS50bzp0LnRyYW5zZm9ybS5zY2FsZSxzPXQudHJhbnNmb3JtLnNjYWxlWm9vbShvKmkpO3Quem9vbVRvKHMse2R1cmF0aW9uOjAsYXJvdW5kOnQudW5wcm9qZWN0KHRoaXMuX3Bvcyl9KX19O1xufSx7XCIuLi8uLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uLy4uL3V0aWwvZG9tXCI6OTgsXCIuLi8uLi91dGlsL3V0aWxcIjoxMDZ9XSw4OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBIYXNoKCl7dXRpbC5iaW5kQWxsKFtcIl9vbkhhc2hDaGFuZ2VcIixcIl91cGRhdGVIYXNoXCJdLHRoaXMpfW1vZHVsZS5leHBvcnRzPUhhc2g7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTtIYXNoLnByb3RvdHlwZT17YWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcD10LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLHRoaXMuX29uSGFzaENoYW5nZSwhMSksdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLHRoaXMuX3VwZGF0ZUhhc2gpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIix0aGlzLl9vbkhhc2hDaGFuZ2UsITEpLHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsdGhpcy5fdXBkYXRlSGFzaCksZGVsZXRlIHRoaXMuX21hcCx0aGlzfSxfb25IYXNoQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9bG9jYXRpb24uaGFzaC5yZXBsYWNlKFwiI1wiLFwiXCIpLnNwbGl0KFwiL1wiKTtyZXR1cm4gdC5sZW5ndGg+PTM/KHRoaXMuX21hcC5qdW1wVG8oe2NlbnRlcjpbK3RbMl0sK3RbMV1dLHpvb206K3RbMF0sYmVhcmluZzorKHRbM118fDApfSksITApOiExfSxfdXBkYXRlSGFzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRDZW50ZXIoKSxlPXRoaXMuX21hcC5nZXRab29tKCksYT10aGlzLl9tYXAuZ2V0QmVhcmluZygpLGg9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTWF0aC5sb2coZSkvTWF0aC5MTjIpKSxuPVwiI1wiK01hdGgucm91bmQoMTAwKmUpLzEwMCtcIi9cIit0LmxhdC50b0ZpeGVkKGgpK1wiL1wiK3QubG5nLnRvRml4ZWQoaCkrKGE/XCIvXCIrTWF0aC5yb3VuZCgxMCphKS8xMDpcIlwiKTt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixcIlwiLG4pfX07XG59LHtcIi4uL3V0aWwvdXRpbFwiOjEwNn1dLDkwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEludGVyYWN0aW9uKGUpe3RoaXMuX21hcD1lLHRoaXMuX2VsPWUuZ2V0Q2FudmFzQ29udGFpbmVyKCk7Zm9yKHZhciB0IGluIGhhbmRsZXJzKWVbdF09bmV3IGhhbmRsZXJzW3RdKGUpO3V0aWwuYmluZEhhbmRsZXJzKHRoaXMpfXZhciBoYW5kbGVycz17c2Nyb2xsWm9vbTpyZXF1aXJlKFwiLi9oYW5kbGVyL3Njcm9sbF96b29tXCIpLGJveFpvb206cmVxdWlyZShcIi4vaGFuZGxlci9ib3hfem9vbVwiKSxkcmFnUm90YXRlOnJlcXVpcmUoXCIuL2hhbmRsZXIvZHJhZ19yb3RhdGVcIiksZHJhZ1BhbjpyZXF1aXJlKFwiLi9oYW5kbGVyL2RyYWdfcGFuXCIpLGtleWJvYXJkOnJlcXVpcmUoXCIuL2hhbmRsZXIva2V5Ym9hcmRcIiksZG91YmxlQ2xpY2tab29tOnJlcXVpcmUoXCIuL2hhbmRsZXIvZGJsY2xpY2tfem9vbVwiKSxwaW5jaDpyZXF1aXJlKFwiLi9oYW5kbGVyL3BpbmNoXCIpfSxET009cmVxdWlyZShcIi4uL3V0aWwvZG9tXCIpLHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKTttb2R1bGUuZXhwb3J0cz1JbnRlcmFjdGlvbixJbnRlcmFjdGlvbi5wcm90b3R5cGU9e2VuYWJsZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcC5vcHRpb25zLHQ9dGhpcy5fZWw7Zm9yKHZhciBuIGluIGhhbmRsZXJzKWVbbl0mJnRoaXMuX21hcFtuXS5lbmFibGUoKTt0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSwhMSksdC5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fbWFwLm9wdGlvbnMsdD10aGlzLl9lbDtmb3IodmFyIG4gaW4gaGFuZGxlcnMpZVtuXSYmdGhpcy5fbWFwW25dLmRpc2FibGUoKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93biksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uVG91Y2hTdGFydCksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdXNlTW92ZSksdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUpfSxfb25Nb3VzZURvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRQb3M9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKGUpeyF0aGlzLl9jb250ZXh0TWVudUZpcmVkfHx0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5hY3RpdmV8fHRoaXMuX21hcC5kcmFnUGFuLmFjdGl2ZXx8dGhpcy5fZmlyZUV2ZW50KFwiY29udGV4dG1lbnVcIixlKSx0aGlzLl9jb250ZXh0TWVudUZpcmVkPW51bGx9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZSl7IWUudG91Y2hlc3x8ZS50b3VjaGVzLmxlbmd0aD4xfHwodGhpcy5fdGFwcGVkPyhjbGVhclRpbWVvdXQodGhpcy5fdGFwcGVkKSx0aGlzLl90YXBwZWQ9bnVsbCx0aGlzLl9maXJlRXZlbnQoXCJkYmxjbGlja1wiLGUpKTp0aGlzLl90YXBwZWQ9c2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsMzAwKSl9LF9vblRpbWVvdXQ6ZnVuY3Rpb24oKXt0aGlzLl90YXBwZWQ9bnVsbH0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcCxuPXRoaXMuX2VsO2lmKCF0LmRyYWdQYW4uYWN0aXZlJiYhdC5kcmFnUm90YXRlLmFjdGl2ZSl7Zm9yKHZhciBvPWUudG9FbGVtZW50fHxlLnRhcmdldDtvJiZvIT09bjspbz1vLnBhcmVudE5vZGU7bz09PW4mJnRoaXMuX2ZpcmVFdmVudChcIm1vdXNlbW92ZVwiLGUpfX0sX29uQ2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpO3QuZXF1YWxzKHRoaXMuX3N0YXJ0UG9zKSYmdGhpcy5fZmlyZUV2ZW50KFwiY2xpY2tcIixlKX0sX29uRGJsQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KFwiZGJsY2xpY2tcIixlKSxlLnByZXZlbnREZWZhdWx0KCl9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dE1lbnVGaXJlZD0hMH0sX2ZpcmVFdmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KTt0aGlzLl9tYXAuZmlyZShlLHtsbmdMYXQ6dGhpcy5fbWFwLnVucHJvamVjdChuKSxwb2ludDpuLG9yaWdpbmFsRXZlbnQ6dH0pfX07XG59LHtcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL3V0aWxcIjoxMDYsXCIuL2hhbmRsZXIvYm94X3pvb21cIjo4MixcIi4vaGFuZGxlci9kYmxjbGlja196b29tXCI6ODMsXCIuL2hhbmRsZXIvZHJhZ19wYW5cIjo4NCxcIi4vaGFuZGxlci9kcmFnX3JvdGF0ZVwiOjg1LFwiLi9oYW5kbGVyL2tleWJvYXJkXCI6ODYsXCIuL2hhbmRsZXIvcGluY2hcIjo4NyxcIi4vaGFuZGxlci9zY3JvbGxfem9vbVwiOjg4fV0sOTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIENhbnZhcz1yZXF1aXJlKFwiLi4vdXRpbC9jYW52YXNcIiksdXRpbD1yZXF1aXJlKFwiLi4vdXRpbC91dGlsXCIpLGJyb3dzZXI9cmVxdWlyZShcIi4uL3V0aWwvYnJvd3NlclwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxTdHlsZT1yZXF1aXJlKFwiLi4vc3R5bGUvc3R5bGVcIiksQW5pbWF0aW9uTG9vcD1yZXF1aXJlKFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIiksUGFpbnRlcj1yZXF1aXJlKFwiLi4vcmVuZGVyL3BhaW50ZXJcIiksVHJhbnNmb3JtPXJlcXVpcmUoXCIuLi9nZW8vdHJhbnNmb3JtXCIpLEhhc2g9cmVxdWlyZShcIi4vaGFzaFwiKSxJbnRlcmFjdGlvbj1yZXF1aXJlKFwiLi9pbnRlcmFjdGlvblwiKSxDYW1lcmE9cmVxdWlyZShcIi4vY2FtZXJhXCIpLExuZ0xhdD1yZXF1aXJlKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPXJlcXVpcmUoXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpLEF0dHJpYnV0aW9uPXJlcXVpcmUoXCIuL2NvbnRyb2wvYXR0cmlidXRpb25cIiksTWFwPW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQ9dGhpcy5vcHRpb25zPXV0aWwuaW5oZXJpdCh0aGlzLm9wdGlvbnMsdCksdGhpcy5hbmltYXRpb25Mb29wPW5ldyBBbmltYXRpb25Mb29wLHRoaXMudHJhbnNmb3JtPW5ldyBUcmFuc2Zvcm0odC5taW5ab29tLHQubWF4Wm9vbSksdC5tYXhCb3VuZHMpe3ZhciBlPUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQubWF4Qm91bmRzKTt0aGlzLnRyYW5zZm9ybS5sbmdSYW5nZT1bZS5nZXRXZXN0KCksZS5nZXRFYXN0KCldLHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlPVtlLmdldFNvdXRoKCksZS5nZXROb3J0aCgpXX11dGlsLmJpbmRBbGwoW1wiX2ZvcndhcmRTdHlsZUV2ZW50XCIsXCJfZm9yd2FyZFNvdXJjZUV2ZW50XCIsXCJfZm9yd2FyZExheWVyRXZlbnRcIixcIl9mb3J3YXJkVGlsZUV2ZW50XCIsXCJfb25TdHlsZUxvYWRcIixcIl9vblN0eWxlQ2hhbmdlXCIsXCJfb25Tb3VyY2VBZGRcIixcIl9vblNvdXJjZVJlbW92ZVwiLFwiX29uU291cmNlVXBkYXRlXCIsXCJfb25XaW5kb3dSZXNpemVcIixcIm9uRXJyb3JcIixcInVwZGF0ZVwiLFwicmVuZGVyXCJdLHRoaXMpLHRoaXMuX3NldHVwQ29udGFpbmVyKCksdGhpcy5fc2V0dXBQYWludGVyKCksdGhpcy5vbihcIm1vdmVcIix0aGlzLnVwZGF0ZSksdGhpcy5vbihcInpvb21cIix0aGlzLnVwZGF0ZS5iaW5kKHRoaXMsITApKSx0aGlzLm9uKFwibW92ZWVuZFwiLGZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Mb29wLnNldCgzMDApLHRoaXMuX3JlcmVuZGVyKCl9LmJpbmQodGhpcykpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5fb25XaW5kb3dSZXNpemUsITEpLHRoaXMuaW50ZXJhY3Rpb249bmV3IEludGVyYWN0aW9uKHRoaXMpLHQuaW50ZXJhY3RpdmUmJnRoaXMuaW50ZXJhY3Rpb24uZW5hYmxlKCksdGhpcy5faGFzaD10Lmhhc2gmJihuZXcgSGFzaCkuYWRkVG8odGhpcyksdGhpcy5faGFzaCYmdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCl8fHRoaXMuanVtcFRvKHQpLHRoaXMuc291cmNlcz17fSx0aGlzLnN0YWNrcz17fSx0aGlzLl9jbGFzc2VzPXt9LHRoaXMucmVzaXplKCksdC5jbGFzc2VzJiZ0aGlzLnNldENsYXNzZXModC5jbGFzc2VzKSx0LnN0eWxlJiZ0aGlzLnNldFN0eWxlKHQuc3R5bGUpLHQuYXR0cmlidXRpb25Db250cm9sJiZ0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uKSx0aGlzLm9uKFwic3R5bGUuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJzb3VyY2UuZXJyb3JcIix0aGlzLm9uRXJyb3IpLHRoaXMub24oXCJ0aWxlLmVycm9yXCIsdGhpcy5vbkVycm9yKX07dXRpbC5leHRlbmQoTWFwLnByb3RvdHlwZSxFdmVudGVkKSx1dGlsLmV4dGVuZChNYXAucHJvdG90eXBlLENhbWVyYS5wcm90b3R5cGUpLHV0aWwuZXh0ZW5kKE1hcC5wcm90b3R5cGUse29wdGlvbnM6e2NlbnRlcjpbMCwwXSx6b29tOjAsYmVhcmluZzowLHBpdGNoOjAsbWluWm9vbTowLG1heFpvb206MjAsaW50ZXJhY3RpdmU6ITAsc2Nyb2xsWm9vbTohMCxib3hab29tOiEwLGRyYWdSb3RhdGU6ITAsZHJhZ1BhbjohMCxrZXlib2FyZDohMCxkb3VibGVDbGlja1pvb206ITAscGluY2g6ITAsYmVhcmluZ1NuYXA6NyxoYXNoOiExLGF0dHJpYnV0aW9uQ29udHJvbDohMCxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMX0sYWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxhZGRDbGFzczpmdW5jdGlvbih0LGUpe3RoaXMuX2NsYXNzZXNbdF18fCh0aGlzLl9jbGFzc2VzW3RdPSEwLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY2xhc3Nlc1t0XSYmKGRlbGV0ZSB0aGlzLl9jbGFzc2VzW3RdLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuX2Nhc2NhZGUodGhpcy5fY2xhc3NlcyxlKSl9LHNldENsYXNzZXM6ZnVuY3Rpb24odCxlKXt0aGlzLl9jbGFzc2VzPXt9O2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMuX2NsYXNzZXNbdFtpXV09ITA7dGhpcy5zdHlsZSYmdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzLGUpfSxoYXNDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuX2NsYXNzZXNbdF19LGdldENsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY2xhc3Nlcyl9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTAsZT0wO3JldHVybiB0aGlzLl9jb250YWluZXImJih0PXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aHx8NDAwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodHx8MzAwKSx0aGlzLl9jYW52YXMucmVzaXplKHQsZSksdGhpcy50cmFuc2Zvcm0ud2lkdGg9dCx0aGlzLnRyYW5zZm9ybS5oZWlnaHQ9ZSx0aGlzLnRyYW5zZm9ybS5fY29uc3RyYWluKCksdGhpcy5wYWludGVyLnJlc2l6ZSh0LGUpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwibW92ZVwiKS5maXJlKFwicmVzaXplXCIpLmZpcmUoXCJtb3ZlZW5kXCIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLDApKSx0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMudHJhbnNmb3JtLnNpemUpKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChMbmdMYXQuY29udmVydCh0KSl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHQpKX0sZmVhdHVyZXNBdDpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy51bnByb2plY3QodCkud3JhcCgpLHM9dGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKHIpO3JldHVybiB0aGlzLnN0eWxlLmZlYXR1cmVzQXQocyxlLGkpLHRoaXN9LGZlYXR1cmVzSW46ZnVuY3Rpb24odCxlLGkpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBpJiYoaT1lLGU9dCx0PVtQb2ludC5jb252ZXJ0KFswLDBdKSxQb2ludC5jb252ZXJ0KFt0aGlzLnRyYW5zZm9ybS53aWR0aCx0aGlzLnRyYW5zZm9ybS5oZWlnaHRdKV0pLHQ9dC5tYXAoUG9pbnQuY29udmVydC5iaW5kKFBvaW50KSksdD1bbmV3IFBvaW50KE1hdGgubWluKHRbMF0ueCx0WzFdLngpLE1hdGgubWluKHRbMF0ueSx0WzFdLnkpKSxuZXcgUG9pbnQoTWF0aC5tYXgodFswXS54LHRbMV0ueCksTWF0aC5tYXgodFswXS55LHRbMV0ueSkpXS5tYXAodGhpcy50cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlLmJpbmQodGhpcy50cmFuc2Zvcm0pKSx0aGlzLnN0eWxlLmZlYXR1cmVzSW4odCxlLGkpLHRoaXN9LGJhdGNoOmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuYmF0Y2godCksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzLnVwZGF0ZSghMCl9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlJiYodGhpcy5zdHlsZS5vZmYoXCJsb2FkXCIsdGhpcy5fb25TdHlsZUxvYWQpLm9mZihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9mZihcImNoYW5nZVwiLHRoaXMuX29uU3R5bGVDaGFuZ2UpLm9mZihcInNvdXJjZS5hZGRcIix0aGlzLl9vblNvdXJjZUFkZCkub2ZmKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vZmYoXCJzb3VyY2UubG9hZFwiLHRoaXMuX29uU291cmNlVXBkYXRlKS5vZmYoXCJzb3VyY2UuZXJyb3JcIix0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQpLm9mZihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub2ZmKFwibGF5ZXIuYWRkXCIsdGhpcy5fZm9yd2FyZExheWVyRXZlbnQpLm9mZihcImxheWVyLnJlbW92ZVwiLHRoaXMuX2ZvcndhcmRMYXllckV2ZW50KS5vZmYoXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9mZihcInRpbGUucmVtb3ZlXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkub2ZmKFwidGlsZS5sb2FkXCIsdGhpcy51cGRhdGUpLm9mZihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vZmYoXCJ0aWxlLnN0YXRzXCIsdGhpcy5fZm9yd2FyZFRpbGVFdmVudCkuX3JlbW92ZSgpLHRoaXMub2ZmKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vZmYoXCJwaXRjaFwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpKSx0Pyh0IGluc3RhbmNlb2YgU3R5bGU/dGhpcy5zdHlsZT10OnRoaXMuc3R5bGU9bmV3IFN0eWxlKHQsdGhpcy5hbmltYXRpb25Mb29wKSx0aGlzLnN0eWxlLm9uKFwibG9hZFwiLHRoaXMuX29uU3R5bGVMb2FkKS5vbihcImVycm9yXCIsdGhpcy5fZm9yd2FyZFN0eWxlRXZlbnQpLm9uKFwiY2hhbmdlXCIsdGhpcy5fb25TdHlsZUNoYW5nZSkub24oXCJzb3VyY2UuYWRkXCIsdGhpcy5fb25Tb3VyY2VBZGQpLm9uKFwic291cmNlLnJlbW92ZVwiLHRoaXMuX29uU291cmNlUmVtb3ZlKS5vbihcInNvdXJjZS5sb2FkXCIsdGhpcy5fb25Tb3VyY2VVcGRhdGUpLm9uKFwic291cmNlLmVycm9yXCIsdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KS5vbihcInNvdXJjZS5jaGFuZ2VcIix0aGlzLl9vblNvdXJjZVVwZGF0ZSkub24oXCJsYXllci5hZGRcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJsYXllci5yZW1vdmVcIix0aGlzLl9mb3J3YXJkTGF5ZXJFdmVudCkub24oXCJ0aWxlLmFkZFwiLHRoaXMuX2ZvcndhcmRUaWxlRXZlbnQpLm9uKFwidGlsZS5yZW1vdmVcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUubG9hZFwiLHRoaXMudXBkYXRlKS5vbihcInRpbGUuZXJyb3JcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KS5vbihcInRpbGUuc3RhdHNcIix0aGlzLl9mb3J3YXJkVGlsZUV2ZW50KSx0aGlzLm9uKFwicm90YXRlXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcy5vbihcInBpdGNoXCIsdGhpcy5zdHlsZS5fcmVkb1BsYWNlbWVudCksdGhpcyk6KHRoaXMuc3R5bGU9bnVsbCx0aGlzKX0sYWRkU291cmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuYWRkU291cmNlKHQsZSksdGhpc30scmVtb3ZlU291cmNlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZSh0KSx0aGlzfSxnZXRTb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpfSxhZGRMYXllcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLmFkZExheWVyKHQsZSksdGhpcy5zdHlsZS5fY2FzY2FkZSh0aGlzLl9jbGFzc2VzKSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVMYXllcih0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMpLHRoaXN9LHNldEZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLnNldEZpbHRlcih0LGUpLHRoaXN9LHNldExheWVyWm9vbVJhbmdlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRMYXllclpvb21SYW5nZSh0LGUsaSksdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcih0KX0sc2V0UGFpbnRQcm9wZXJ0eTpmdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbihzKXtzLnNldFBhaW50UHJvcGVydHkodCxlLGkscil9KSx0aGlzfSxnZXRQYWludFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KHQsZSxpKX0sc2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uKHIpe3Iuc2V0TGF5b3V0UHJvcGVydHkodCxlLGkpfSksdGhpc30sZ2V0TGF5b3V0UHJvcGVydHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eSh0LGUpfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRDYW52YXNDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyfSxnZXRDYW52YXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FudmFzLmdldEVsZW1lbnQoKX0sX3NldHVwQ29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmNvbnRhaW5lcixlPXRoaXMuX2NvbnRhaW5lcj1cInN0cmluZ1wiPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0O2UuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcFwiKTt2YXIgaT10aGlzLl9jYW52YXNDb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lclwiLGUpO3RoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmaS5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtaW50ZXJhY3RpdmVcIiksdGhpcy5fY2FudmFzPW5ldyBDYW52YXModGhpcyxpKTt2YXIgcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lclwiLGUpLHM9dGhpcy5fY29udHJvbENvcm5lcnM9e307W1widG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbdF09RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybC1cIit0LHIpfSl9LF9zZXR1cFBhaW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jYW52YXMuZ2V0V2ViR0xDb250ZXh0KHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OnRoaXMub3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp0aGlzLm9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyfSk7cmV0dXJuIHQ/dm9pZCh0aGlzLnBhaW50ZXI9bmV3IFBhaW50ZXIodCx0aGlzLnRyYW5zZm9ybSkpOnZvaWQgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpfSxfY29udGV4dExvc3Q6ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZyYW1lSWQmJmJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCl9LF9jb250ZXh0UmVzdG9yZWQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cFBhaW50ZXIoKSx0aGlzLnJlc2l6ZSgpLHRoaXMudXBkYXRlKCl9LGxvYWRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdHlsZURpcnR5fHx0aGlzLl9zb3VyY2VzRGlydHk/ITE6dGhpcy5zdHlsZSYmIXRoaXMuc3R5bGUubG9hZGVkKCk/ITE6ITB9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZT8odGhpcy5fc3R5bGVEaXJ0eT10aGlzLl9zdHlsZURpcnR5fHx0LHRoaXMuX3NvdXJjZXNEaXJ0eT0hMCx0aGlzLl9yZXJlbmRlcigpLHRoaXMpOnRoaXN9LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlJiZ0aGlzLl9zdHlsZURpcnR5JiYodGhpcy5fc3R5bGVEaXJ0eT0hMSx0aGlzLnN0eWxlLl9yZWNhbGN1bGF0ZSh0aGlzLnRyYW5zZm9ybS56b29tKSksdGhpcy5zdHlsZSYmdGhpcy5fc291cmNlc0RpcnR5JiYhdGhpcy5fc291cmNlc0RpcnR5VGltZW91dCYmKHRoaXMuX3NvdXJjZXNEaXJ0eT0hMSx0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9zb3VyY2VzRGlydHlUaW1lb3V0PW51bGx9LmJpbmQodGhpcyksNTApLHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pKSx0aGlzLnBhaW50ZXIucmVuZGVyKHRoaXMuc3R5bGUse2RlYnVnOnRoaXMuZGVidWcsdmVydGljZXM6dGhpcy52ZXJ0aWNlcyxyb3RhdGluZzp0aGlzLnJvdGF0aW5nLHpvb21pbmc6dGhpcy56b29taW5nfSksdGhpcy5maXJlKFwicmVuZGVyXCIpLHRoaXMubG9hZGVkKCkmJiF0aGlzLl9sb2FkZWQmJih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5maXJlKFwibG9hZFwiKSksdGhpcy5fZnJhbWVJZD1udWxsLHRoaXMuYW5pbWF0aW9uTG9vcC5zdG9wcGVkKCl8fCh0aGlzLl9zdHlsZURpcnR5PSEwKSwodGhpcy5fc291cmNlc0RpcnR5fHx0aGlzLl9yZXBhaW50fHwhdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkmJnRoaXMuX3JlcmVuZGVyKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2gmJnRoaXMuX2hhc2gucmVtb3ZlKCksYnJvd3Nlci5jYW5jZWxGcmFtZSh0aGlzLl9mcmFtZUlkKSxjbGVhclRpbWVvdXQodGhpcy5fc291cmNlc0RpcnR5VGltZW91dCksdGhpcy5zZXRTdHlsZShudWxsKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMuX29uV2luZG93UmVzaXplLCExKSx0aGlzfSxvbkVycm9yOmZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IodC5lcnJvcil9LF9yZXJlbmRlcjpmdW5jdGlvbigpe3RoaXMuc3R5bGUmJiF0aGlzLl9mcmFtZUlkJiYodGhpcy5fZnJhbWVJZD1icm93c2VyLmZyYW1lKHRoaXMucmVuZGVyKSl9LF9mb3J3YXJkU3R5bGVFdmVudDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoXCJzdHlsZS5cIit0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkU291cmNlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5maXJlKHQudHlwZSx1dGlsLmV4dGVuZCh7c3R5bGU6dC50YXJnZXR9LHQpKX0sX2ZvcndhcmRMYXllckV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9mb3J3YXJkVGlsZUV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUsdXRpbC5leHRlbmQoe3N0eWxlOnQudGFyZ2V0fSx0KSl9LF9vblN0eWxlTG9hZDpmdW5jdGlvbih0KXt2YXIgZT1uZXcgVHJhbnNmb3JtLGk9dGhpcy50cmFuc2Zvcm07aS5jZW50ZXIubG5nPT09ZS5jZW50ZXIubG5nJiZpLmNlbnRlci5sYXQ9PT1lLmNlbnRlci5sYXQmJmkuem9vbT09PWUuem9vbSYmaS5iZWFyaW5nPT09ZS5iZWFyaW5nJiZpLnBpdGNoPT09ZS5waXRjaCYmdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KSx0aGlzLnN0eWxlLl9jYXNjYWRlKHRoaXMuX2NsYXNzZXMse3RyYW5zaXRpb246ITF9KSx0aGlzLl9mb3J3YXJkU3R5bGVFdmVudCh0KX0sX29uU3R5bGVDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy51cGRhdGUoITApLHRoaXMuX2ZvcndhcmRTdHlsZUV2ZW50KHQpfSxfb25Tb3VyY2VBZGQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2U7ZS5vbkFkZCYmZS5vbkFkZCh0aGlzKSx0aGlzLl9mb3J3YXJkU291cmNlRXZlbnQodCl9LF9vblNvdXJjZVJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNvdXJjZTtlLm9uUmVtb3ZlJiZlLm9uUmVtb3ZlKHRoaXMpLHRoaXMuX2ZvcndhcmRTb3VyY2VFdmVudCh0KX0sX29uU291cmNlVXBkYXRlOmZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlKCksdGhpcy5fZm9yd2FyZFNvdXJjZUV2ZW50KHQpfSxfb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLnN0b3AoKS5yZXNpemUoKS51cGRhdGUoKX19KSx1dGlsLmV4dGVuZEFsbChNYXAucHJvdG90eXBlLHtfZGVidWc6ITEsZ2V0IGRlYnVnKCl7cmV0dXJuIHRoaXMuX2RlYnVnfSxzZXQgZGVidWcodCl7dGhpcy5fZGVidWc9dCx0aGlzLnVwZGF0ZSgpfSxfY29sbGlzaW9uRGVidWc6ITEsZ2V0IGNvbGxpc2lvbkRlYnVnKCl7cmV0dXJuIHRoaXMuX2NvbGxpc2lvbkRlYnVnfSxzZXQgY29sbGlzaW9uRGVidWcodCl7dGhpcy5fY29sbGlzaW9uRGVidWc9dCx0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KCl9LF9yZXBhaW50OiExLGdldCByZXBhaW50KCl7cmV0dXJuIHRoaXMuX3JlcGFpbnR9LHNldCByZXBhaW50KHQpe3RoaXMuX3JlcGFpbnQ9dCx0aGlzLnVwZGF0ZSgpfSxfdmVydGljZXM6ITEsZ2V0IHZlcnRpY2VzKCl7cmV0dXJuIHRoaXMuX3ZlcnRpY2VzfSxzZXQgdmVydGljZXModCl7dGhpcy5fdmVydGljZXM9dCx0aGlzLnVwZGF0ZSgpfX0pO1xufSx7XCIuLi9nZW8vbG5nX2xhdFwiOjIwLFwiLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCI6MjEsXCIuLi9nZW8vdHJhbnNmb3JtXCI6MjIsXCIuLi9yZW5kZXIvcGFpbnRlclwiOjM3LFwiLi4vc3R5bGUvYW5pbWF0aW9uX2xvb3BcIjo1MSxcIi4uL3N0eWxlL3N0eWxlXCI6NTYsXCIuLi91dGlsL2Jyb3dzZXJcIjo5NSxcIi4uL3V0aWwvY2FudmFzXCI6OTYsXCIuLi91dGlsL2RvbVwiOjk4LFwiLi4vdXRpbC9ldmVudGVkXCI6MTAwLFwiLi4vdXRpbC91dGlsXCI6MTA2LFwiLi9jYW1lcmFcIjo3OCxcIi4vY29udHJvbC9hdHRyaWJ1dGlvblwiOjc5LFwiLi9oYXNoXCI6ODksXCIuL2ludGVyYWN0aW9uXCI6OTAsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDkyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvcHVwKHQpe3V0aWwuc2V0T3B0aW9ucyh0aGlzLHQpLHV0aWwuYmluZEFsbChbXCJfdXBkYXRlUG9zaXRpb25cIixcIl9vbkNsaWNrQ2xvc2VcIl0sdGhpcyl9bW9kdWxlLmV4cG9ydHM9UG9wdXA7dmFyIHV0aWw9cmVxdWlyZShcIi4uL3V0aWwvdXRpbFwiKSxFdmVudGVkPXJlcXVpcmUoXCIuLi91dGlsL2V2ZW50ZWRcIiksRE9NPXJlcXVpcmUoXCIuLi91dGlsL2RvbVwiKSxMbmdMYXQ9cmVxdWlyZShcIi4uL2dlby9sbmdfbGF0XCIpO1BvcHVwLnByb3RvdHlwZT11dGlsLmluaGVyaXQoRXZlbnRlZCx7b3B0aW9uczp7Y2xvc2VCdXR0b246ITAsY2xvc2VPbkNsaWNrOiEwfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fbWFwLm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrJiZ0aGlzLl9tYXAub24oXCJjbGlja1wiLHRoaXMuX29uQ2xpY2tDbG9zZSksdGhpcy5fdXBkYXRlKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lciYmdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAmJih0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKSx0aGlzLl9tYXAub2ZmKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpLGRlbGV0ZSB0aGlzLl9tYXApLHRoaXN9LGdldExuZ0xhdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sbmdMYXR9LHNldExuZ0xhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbG5nTGF0PUxuZ0xhdC5jb252ZXJ0KHQpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9LHNldFRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXN9LHNldEhUTUw6ZnVuY3Rpb24odCl7dGhpcy5fY29udGVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIGksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtmb3IoZS5pbm5lckhUTUw9dDs7KXtpZihpPWUuZmlyc3RDaGlsZCwhaSlicmVhazt0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKGkpfXJldHVybiB0aGlzLl91cGRhdGVDb250ZW50KCksdGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cFwiLHRoaXMuX21hcC5nZXRDb250YWluZXIoKSksdGhpcy5fdGlwPURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLXBvcHVwLXRpcFwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fd3JhcHBlcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cC1jb250ZW50XCIsdGhpcy5fY29udGFpbmVyKSx0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJih0aGlzLl9jbG9zZUJ1dHRvbj1ET00uY3JlYXRlKFwiYnV0dG9uXCIsXCJtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b25cIix0aGlzLl93cmFwcGVyKSx0aGlzLl9jbG9zZUJ1dHRvbi5pbm5lckhUTUw9XCImIzIxNTtcIix0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpKSksdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe2lmKHRoaXMuX2NvbnRlbnQmJnRoaXMuX2NvbnRhaW5lcil7Zm9yKHZhciB0PXRoaXMuX3dyYXBwZXI7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24mJnQuYXBwZW5kQ2hpbGQodGhpcy5fY2xvc2VCdXR0b24pLHQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCl9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9sbmdMYXQmJnRoaXMuX2NvbnRhaW5lcil7dmFyIHQ9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5yb3VuZCgpLGk9dGhpcy5vcHRpb25zLmFuY2hvcjtpZighaSl7dmFyIGU9dGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLG89dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtpPXQueTxvP1tcInRvcFwiXTp0Lnk+dGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQtbz9bXCJib3R0b21cIl06W10sdC54PGUvMj9pLnB1c2goXCJsZWZ0XCIpOnQueD50aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoLWUvMiYmaS5wdXNoKFwicmlnaHRcIiksaT0wPT09aS5sZW5ndGg/XCJib3R0b21cIjppLmpvaW4oXCItXCIpLHRoaXMub3B0aW9ucy5hbmNob3I9aX12YXIgbj17dG9wOlwidHJhbnNsYXRlKC01MCUsMClcIixcInRvcC1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwwKVwiLFwidG9wLXJpZ2h0XCI6XCJ0cmFuc2xhdGUoLTEwMCUsMClcIixib3R0b206XCJ0cmFuc2xhdGUoLTUwJSwtMTAwJSlcIixcImJvdHRvbS1sZWZ0XCI6XCJ0cmFuc2xhdGUoMCwtMTAwJSlcIixcImJvdHRvbS1yaWdodFwiOlwidHJhbnNsYXRlKC0xMDAlLC0xMDAlKVwiLGxlZnQ6XCJ0cmFuc2xhdGUoMCwtNTAlKVwiLHJpZ2h0OlwidHJhbnNsYXRlKC0xMDAlLC01MCUpXCJ9LHM9dGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtmb3IodmFyIGEgaW4gbilzLnJlbW92ZShcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIithKTtzLmFkZChcIm1hcGJveGdsLXBvcHVwLWFuY2hvci1cIitpKSxET00uc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lcixuW2ldK1wiIHRyYW5zbGF0ZShcIit0LngrXCJweCxcIit0LnkrXCJweClcIil9fSxfb25DbGlja0Nsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUoKX19KTtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjoyMCxcIi4uL3V0aWwvZG9tXCI6OTgsXCIuLi91dGlsL2V2ZW50ZWRcIjoxMDAsXCIuLi91dGlsL3V0aWxcIjoxMDZ9XSw5MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBBY3Rvcih0LGUpe3RoaXMudGFyZ2V0PXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmNhbGxiYWNrSUQ9MCx0aGlzLnJlY2VpdmU9dGhpcy5yZWNlaXZlLmJpbmQodGhpcyksdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIix0aGlzLnJlY2VpdmUsITEpfW1vZHVsZS5leHBvcnRzPUFjdG9yLEFjdG9yLnByb3RvdHlwZS5yZWNlaXZlPWZ1bmN0aW9uKHQpe3ZhciBlLHM9dC5kYXRhO2lmKFwiPHJlc3BvbnNlPlwiPT09cy50eXBlKWU9dGhpcy5jYWxsYmFja3Nbcy5pZF0sZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3MuaWRdLGUocy5lcnJvcnx8bnVsbCxzLmRhdGEpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHMuaWQpe3ZhciBpPXMuaWQ7dGhpcy5wYXJlbnRbcy50eXBlXShzLmRhdGEsZnVuY3Rpb24odCxlLHMpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6XCI8cmVzcG9uc2U+XCIsaWQ6U3RyaW5nKGkpLGVycm9yOnQ/U3RyaW5nKHQpOm51bGwsZGF0YTplfSxzKX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhcmVudFtzLnR5cGVdKHMuZGF0YSl9LEFjdG9yLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHQsZSxzLGkpe3ZhciBhPW51bGw7cyYmKHRoaXMuY2FsbGJhY2tzW2E9dGhpcy5jYWxsYmFja0lEKytdPXMpLHRoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6dCxpZDpTdHJpbmcoYSksZGF0YTplfSxpKX0sQWN0b3IucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dHJ5e3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHQsZSl9Y2F0Y2gocyl7dGhpcy50YXJnZXQucG9zdE1lc3NhZ2UodCl9fTtcbn0se31dLDk0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNhbWVPcmlnaW4oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7cmV0dXJuIHQuaHJlZj1lLHQucHJvdG9jb2w9PT1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCYmdC5ob3N0PT09ZG9jdW1lbnQubG9jYXRpb24uaG9zdH1leHBvcnRzLmdldEpTT049ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4uc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLFwiYXBwbGljYXRpb24vanNvblwiKSxuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2Upe3ZhciBlO3RyeXtlPUpTT04ucGFyc2Uobi5yZXNwb25zZSl9Y2F0Y2gocil7cmV0dXJuIHQocil9dChudWxsLGUpfWVsc2UgdChuZXcgRXJyb3Iobi5zdGF0dXNUZXh0KSl9LG4uc2VuZCgpLG59LGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG4ub3BlbihcIkdFVFwiLGUsITApLG4ucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixuLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtuLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDAmJm4ucmVzcG9uc2U/dChudWxsLG4ucmVzcG9uc2UpOnQobmV3IEVycm9yKG4uc3RhdHVzVGV4dCkpfSxuLnNlbmQoKSxufSxleHBvcnRzLmdldEltYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIoZSxmdW5jdGlvbihlLG4pe2UmJnQoZSk7dmFyIHI9bmV3IEltYWdlO3Iub25sb2FkPWZ1bmN0aW9uKCl7dChudWxsLHIpLCh3aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMKS5yZXZva2VPYmplY3RVUkwoci5zcmMpfTt2YXIgbz1uZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkobildLHt0eXBlOlwiaW1hZ2UvcG5nXCJ9KTtyZXR1cm4gci5zcmM9KHdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChvKSxyLmdldERhdGE9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHQ9ZS5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIGUud2lkdGg9ci53aWR0aCxlLmhlaWdodD1yLmhlaWdodCx0LmRyYXdJbWFnZShyLDAsMCksdC5nZXRJbWFnZURhdGEoMCwwLHIud2lkdGgsci5oZWlnaHQpLmRhdGF9LHJ9KX0sZXhwb3J0cy5nZXRWaWRlbz1mdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtuLm9ubG9hZHN0YXJ0PWZ1bmN0aW9uKCl7dChudWxsLG4pfTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtzYW1lT3JpZ2luKGVbcl0pfHwobi5jcm9zc09yaWdpbj1cIkFub255bW91c1wiKSxvLnNyYz1lW3JdLG4uYXBwZW5kQ2hpbGQobyl9cmV0dXJuIG4uZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBufSxufTtcbn0se31dLDk1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBDYW52YXM9cmVxdWlyZShcIi4vY2FudmFzXCIpLGZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtleHBvcnRzLmZyYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBmcmFtZShlKX07dmFyIGNhbmNlbD13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtleHBvcnRzLmNhbmNlbEZyYW1lPWZ1bmN0aW9uKGUpe2NhbmNlbChlKX0sZXhwb3J0cy50aW1lZD1mdW5jdGlvbihlLHIsdCl7ZnVuY3Rpb24gbihhKXtvfHwod2luZG93LnBlcmZvcm1hbmNlfHwoYT1EYXRlLm5vdygpKSxhPj1pK3I/ZS5jYWxsKHQsMSk6KGUuY2FsbCh0LChhLWkpL3IpLGV4cG9ydHMuZnJhbWUobikpKX1pZighcilyZXR1cm4gZS5jYWxsKHQsMSksbnVsbDt2YXIgbz0hMSxpPXdpbmRvdy5wZXJmb3JtYW5jZT93aW5kb3cucGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKTtyZXR1cm4gZXhwb3J0cy5mcmFtZShuKSxmdW5jdGlvbigpe289ITB9fSxleHBvcnRzLnN1cHBvcnRlZD1mdW5jdGlvbihlKXtmb3IodmFyIHI9KFtmdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3d9LGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50fSxmdW5jdGlvbigpe3JldHVybiEhKEFycmF5LnByb3RvdHlwZSYmQXJyYXkucHJvdG90eXBlLmV2ZXJ5JiZBcnJheS5wcm90b3R5cGUuZmlsdGVyJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmQXJyYXkucHJvdG90eXBlLmluZGV4T2YmJkFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiYmQXJyYXkucHJvdG90eXBlLm1hcCYmQXJyYXkucHJvdG90eXBlLnNvbWUmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2UmJkFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCYmQXJyYXkuaXNBcnJheSl9LGZ1bmN0aW9uKCl7cmV0dXJuISghRnVuY3Rpb24ucHJvdG90eXBlfHwhRnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fCEoT2JqZWN0LmtleXMmJk9iamVjdC5jcmVhdGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMmJk9iamVjdC5pc1NlYWxlZCYmT2JqZWN0LmlzRnJvemVuJiZPYmplY3QuaXNFeHRlbnNpYmxlJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzJiZPYmplY3Quc2VhbCYmT2JqZWN0LmZyZWV6ZSYmT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSl9LGZ1bmN0aW9uKCl7cmV0dXJuXCJKU09OXCJpbiB3aW5kb3cmJlwicGFyc2VcImluIEpTT04mJlwic3RyaW5naWZ5XCJpbiBKU09OfSxmdW5jdGlvbigpe3JldHVybihuZXcgQ2FudmFzKS5zdXBwb3J0c1dlYkdMQ29udGV4dChlJiZlLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXR8fCExKX0sZnVuY3Rpb24oKXtyZXR1cm5cIldvcmtlclwiaW4gd2luZG93fV0pLHQ9MDt0PHIubGVuZ3RoO3QrKylpZighclt0XSgpKXJldHVybiExO3JldHVybiEwfSxleHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3k9bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l8fDgsT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJkZXZpY2VQaXhlbFJhdGlvXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb319KTtcbn0se1wiLi9jYW52YXNcIjo5Nn1dLDk2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIENhbnZhcyh0LGUpe3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdCYmZSYmKHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmNhbnZhcy5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY2FudmFzXCIpLHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdC5fY29udGV4dExvc3QuYmluZCh0KSwhMSksdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsdC5fY29udGV4dFJlc3RvcmVkLmJpbmQodCksITEpLHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsMCksZS5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcykpfXZhciB1dGlsPXJlcXVpcmUoXCIuLi91dGlsXCIpO21vZHVsZS5leHBvcnRzPUNhbnZhcyxDYW52YXMucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxO3RoaXMuY2FudmFzLndpZHRoPWEqdCx0aGlzLmNhbnZhcy5oZWlnaHQ9YSplLHRoaXMuY2FudmFzLnN0eWxlLndpZHRoPXQrXCJweFwiLHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodD1lK1wicHhcIn07dmFyIHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXM9e2FudGlhbGlhczohMSxhbHBoYTohMCxzdGVuY2lsOiEwLGRlcHRoOiExfTtDYW52YXMucHJvdG90eXBlLmdldFdlYkdMQ29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdD11dGlsLmV4dGVuZCh7fSx0LHJlcXVpcmVkQ29udGV4dEF0dHJpYnV0ZXMpLHRoaXMuY2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiLHQpfHx0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsdCl9LENhbnZhcy5wcm90b3R5cGUuc3VwcG9ydHNXZWJHTENvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9dXRpbC5leHRlbmQoe2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dH0scmVxdWlyZWRDb250ZXh0QXR0cmlidXRlcyk7cmV0dXJuXCJwcm9iYWJseVN1cHBvcnRzQ29udGV4dFwiaW4gdGhpcy5jYW52YXM/dGhpcy5jYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLGUpOlwic3VwcG9ydHNDb250ZXh0XCJpbiB0aGlzLmNhbnZhcz90aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLGUpfHx0aGlzLmNhbnZhcy5zdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIixlKTohIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQmJiEhdGhpcy5nZXRXZWJHTENvbnRleHQodCl9LENhbnZhcy5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhc307XG59LHtcIi4uL3V0aWxcIjoxMDZ9XSw5NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBEaXNwYXRjaGVyKHIsdCl7dGhpcy5hY3RvcnM9W10sdGhpcy5jdXJyZW50QWN0b3I9MDtmb3IodmFyIGU9MDtyPmU7ZSsrKXt2YXIgbz1uZXcgV2ViV29ya2lmeShyZXF1aXJlKFwiLi4vLi4vc291cmNlL3dvcmtlclwiKSkscz1uZXcgQWN0b3Iobyx0KTtzLm5hbWU9XCJXb3JrZXIgXCIrZSx0aGlzLmFjdG9ycy5wdXNoKHMpfX12YXIgQWN0b3I9cmVxdWlyZShcIi4uL2FjdG9yXCIpLFdlYldvcmtpZnk9cmVxdWlyZShcIndlYndvcmtpZnlcIik7bW9kdWxlLmV4cG9ydHM9RGlzcGF0Y2hlcixEaXNwYXRjaGVyLnByb3RvdHlwZT17YnJvYWRjYXN0OmZ1bmN0aW9uKHIsdCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmFjdG9ycy5sZW5ndGg7ZSsrKXRoaXMuYWN0b3JzW2VdLnNlbmQocix0KX0sc2VuZDpmdW5jdGlvbihyLHQsZSxvLHMpe3JldHVybihcIm51bWJlclwiIT10eXBlb2Ygb3x8aXNOYU4obykpJiYobz10aGlzLmN1cnJlbnRBY3Rvcj0odGhpcy5jdXJyZW50QWN0b3IrMSkldGhpcy5hY3RvcnMubGVuZ3RoKSx0aGlzLmFjdG9yc1tvXS5zZW5kKHIsdCxlLHMpLG99LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgcj0wO3I8dGhpcy5hY3RvcnMubGVuZ3RoO3IrKyl0aGlzLmFjdG9yc1tyXS50YXJnZXQudGVybWluYXRlKCk7dGhpcy5hY3RvcnM9W119fTtcbn0se1wiLi4vLi4vc291cmNlL3dvcmtlclwiOjQ5LFwiLi4vYWN0b3JcIjo5MyxcIndlYndvcmtpZnlcIjoxNDl9XSw5ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0ZXN0UHJvcChlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdaW4gZG9jU3R5bGUpcmV0dXJuIGVbdF19ZnVuY3Rpb24gc3VwcHJlc3NDbGljayhlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsc3VwcHJlc3NDbGljaywhMCl9dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKTtleHBvcnRzLmNyZWF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4gdCYmKG8uY2xhc3NOYW1lPXQpLHImJnIuYXBwZW5kQ2hpbGQobyksb307dmFyIGRvY1N0eWxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxzZWxlY3RQcm9wPXRlc3RQcm9wKFtcInVzZXJTZWxlY3RcIixcIk1velVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIm1zVXNlclNlbGVjdFwiXSksdXNlclNlbGVjdDtleHBvcnRzLmRpc2FibGVEcmFnPWZ1bmN0aW9uKCl7c2VsZWN0UHJvcCYmKHVzZXJTZWxlY3Q9ZG9jU3R5bGVbc2VsZWN0UHJvcF0sZG9jU3R5bGVbc2VsZWN0UHJvcF09XCJub25lXCIpfSxleHBvcnRzLmVuYWJsZURyYWc9ZnVuY3Rpb24oKXtzZWxlY3RQcm9wJiYoZG9jU3R5bGVbc2VsZWN0UHJvcF09dXNlclNlbGVjdCl9O3ZhciB0cmFuc2Zvcm1Qcm9wPXRlc3RQcm9wKFtcInRyYW5zZm9ybVwiLFwiV2Via2l0VHJhbnNmb3JtXCJdKTtleHBvcnRzLnNldFRyYW5zZm9ybT1mdW5jdGlvbihlLHQpe2Uuc3R5bGVbdHJhbnNmb3JtUHJvcF09dH0sZXhwb3J0cy5zdXBwcmVzc0NsaWNrPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApfSwwKX0sZXhwb3J0cy5tb3VzZVBvcz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQ9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LG5ldyBQb2ludCh0LmNsaWVudFgtci5sZWZ0LWUuY2xpZW50TGVmdCx0LmNsaWVudFktci50b3AtZS5jbGllbnRUb3ApfTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoxMzd9XSw5OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz17QVBJX1VSTDpcImh0dHBzOi8vYXBpLm1hcGJveC5jb21cIixSRVFVSVJFX0FDQ0VTU19UT0tFTjohMH07XG59LHt9XSwxMDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9cmVxdWlyZShcIi4vdXRpbFwiKSxFdmVudGVkPXtvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9ldmVudHNbdF09dGhpcy5fZXZlbnRzW3RdfHxbXSx0aGlzLl9ldmVudHNbdF0ucHVzaChlKSx0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50cyx0aGlzO2lmKCF0aGlzLmxpc3RlbnModCkpcmV0dXJuIHRoaXM7aWYoZSl7dmFyIHM9dGhpcy5fZXZlbnRzW3RdLmluZGV4T2YoZSk7cz49MCYmdGhpcy5fZXZlbnRzW3RdLnNwbGljZShzLDEpLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGh8fGRlbGV0ZSB0aGlzLl9ldmVudHNbdF19ZWxzZSBkZWxldGUgdGhpcy5fZXZlbnRzW3RdO3JldHVybiB0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSl7dmFyIHM9ZnVuY3Rpb24oaSl7dGhpcy5vZmYodCxzKSxlLmNhbGwodGhpcyxpKX0uYmluZCh0aGlzKTtyZXR1cm4gdGhpcy5vbih0LHMpLHRoaXN9LGZpcmU6ZnVuY3Rpb24odCxlKXtpZighdGhpcy5saXN0ZW5zKHQpKXJldHVybiB0aGlzO2U9dXRpbC5leHRlbmQoe30sZSksdXRpbC5leHRlbmQoZSx7dHlwZTp0LHRhcmdldDp0aGlzfSk7Zm9yKHZhciBzPXRoaXMuX2V2ZW50c1t0XS5zbGljZSgpLGk9MDtpPHMubGVuZ3RoO2krKylzW2ldLmNhbGwodGhpcyxlKTtyZXR1cm4gdGhpc30sbGlzdGVuczpmdW5jdGlvbih0KXtyZXR1cm4hKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdF0pfX07bW9kdWxlLmV4cG9ydHM9RXZlbnRlZDtcbn0se1wiLi91dGlsXCI6MTA2fV0sMTAxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdseXBocyhhLGUpe3RoaXMuc3RhY2tzPWEucmVhZEZpZWxkcyhyZWFkRm9udHN0YWNrcyxbXSxlKX1mdW5jdGlvbiByZWFkRm9udHN0YWNrcyhhLGUscil7aWYoMT09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEZvbnRzdGFjayx7Z2x5cGhzOnt9fSk7ZS5wdXNoKHQpfX1mdW5jdGlvbiByZWFkRm9udHN0YWNrKGEsZSxyKXtpZigxPT09YSllLm5hbWU9ci5yZWFkU3RyaW5nKCk7ZWxzZSBpZigyPT09YSllLnJhbmdlPXIucmVhZFN0cmluZygpO2Vsc2UgaWYoMz09PWEpe3ZhciB0PXIucmVhZE1lc3NhZ2UocmVhZEdseXBoLHt9KTtlLmdseXBoc1t0LmlkXT10fX1mdW5jdGlvbiByZWFkR2x5cGgoYSxlLHIpezE9PT1hP2UuaWQ9ci5yZWFkVmFyaW50KCk6Mj09PWE/ZS5iaXRtYXA9ci5yZWFkQnl0ZXMoKTozPT09YT9lLndpZHRoPXIucmVhZFZhcmludCgpOjQ9PT1hP2UuaGVpZ2h0PXIucmVhZFZhcmludCgpOjU9PT1hP2UubGVmdD1yLnJlYWRTVmFyaW50KCk6Nj09PWE/ZS50b3A9ci5yZWFkU1ZhcmludCgpOjc9PT1hJiYoZS5hZHZhbmNlPXIucmVhZFZhcmludCgpKX1tb2R1bGUuZXhwb3J0cz1HbHlwaHM7XG59LHt9XSwxMDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaW50ZXJwb2xhdGUodCxlLG4pe3JldHVybiB0KigxLW4pK2Uqbn1tb2R1bGUuZXhwb3J0cz1pbnRlcnBvbGF0ZSxpbnRlcnBvbGF0ZS5udW1iZXI9aW50ZXJwb2xhdGUsaW50ZXJwb2xhdGUudmVjMj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbildfSxpbnRlcnBvbGF0ZS5jb2xvcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW2ludGVycG9sYXRlKHRbMF0sZVswXSxuKSxpbnRlcnBvbGF0ZSh0WzFdLGVbMV0sbiksaW50ZXJwb2xhdGUodFsyXSxlWzJdLG4pLGludGVycG9sYXRlKHRbM10sZVszXSxuKV19LGludGVycG9sYXRlLmFycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gaW50ZXJwb2xhdGUodCxlW3JdLG4pfSl9O1xufSx7fV0sMTAzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIG5vcm1hbGl6ZVVSTChlLHIsbyl7aWYobz1vfHxjb25maWcuQUNDRVNTX1RPS0VOLCFvJiZjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9kZXZlbG9wZXJzL2FwaS8jYWNjZXNzLXRva2Vuc1wiKTtpZihlPWUucmVwbGFjZSgvXm1hcGJveDpcXC9cXC8vLGNvbmZpZy5BUElfVVJMK3IpLGUrPS0xIT09ZS5pbmRleE9mKFwiP1wiKT9cIiZhY2Nlc3NfdG9rZW49XCI6XCI/YWNjZXNzX3Rva2VuPVwiLGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTil7aWYoXCJzXCI9PT1vWzBdKXRocm93IG5ldyBFcnJvcihcIlVzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMIEpTLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnNcIik7ZSs9b31yZXR1cm4gZX12YXIgY29uZmlnPXJlcXVpcmUoXCIuL2NvbmZpZ1wiKSxicm93c2VyPXJlcXVpcmUoXCIuL2Jyb3dzZXJcIik7bW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU3R5bGVVUkw9ZnVuY3Rpb24oZSxyKXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zdHlsZXNcXC8vKSlyZXR1cm4gZTt2YXIgbz1lLnNwbGl0KFwiL1wiKSx0PW9bM10sbj1vWzRdLHM9b1s1XT9cIi9kcmFmdFwiOlwiXCI7cmV0dXJuIG5vcm1hbGl6ZVVSTChcIm1hcGJveDovL1wiK3QrXCIvXCIrbitzLFwiL3N0eWxlcy92MS9cIixyKX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMPWZ1bmN0aW9uKGUscil7cmV0dXJuIGUubWF0Y2goL15tYXBib3g6XFwvXFwvLyk/bm9ybWFsaXplVVJMKGUrXCIuanNvblwiLFwiL3Y0L1wiLHIpK1wiJnNlY3VyZVwiOmV9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZUdseXBoc1VSTD1mdW5jdGlvbihlLHIpe2lmKCFlLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pKXJldHVybiBlO3ZhciBvPWUuc3BsaXQoXCIvXCIpWzNdO3JldHVybiBub3JtYWxpemVVUkwoXCJtYXBib3g6Ly9cIitvK1wiL3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCIsXCIvZm9udHMvdjEvXCIscil9LG1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZVNwcml0ZVVSTD1mdW5jdGlvbihlLHIsbyx0KXtpZighZS5tYXRjaCgvXm1hcGJveDpcXC9cXC9zcHJpdGVzXFwvLykpcmV0dXJuIGUrcitvO3ZhciBuPWUuc3BsaXQoXCIvXCIpLHM9blszXSxhPW5bNF0saT1uWzVdP1wiL2RyYWZ0XCI6XCJcIjtyZXR1cm4gbm9ybWFsaXplVVJMKFwibWFwYm94Oi8vXCIrcytcIi9cIithK2krXCIvc3ByaXRlXCIrcitvLFwiL3N0eWxlcy92MS9cIix0KX0sbW9kdWxlLmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTD1mdW5jdGlvbihlLHIpe3JldHVybiByJiZyLm1hdGNoKC9ebWFwYm94OlxcL1xcLy8pP2UucmVwbGFjZSgvXFwuKCg/OnBuZ3xqcGcpXFxkKikoPz0kfFxcPykvLGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz49Mj9cIkAyeC4kMVwiOlwiLiQxXCIpOmV9O1xufSx7XCIuL2Jyb3dzZXJcIjo5NSxcIi4vY29uZmlnXCI6OTl9XSwxMDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gTVJVQ2FjaGUodCxlKXt0aGlzLm1heD10LHRoaXMub25SZW1vdmU9ZSx0aGlzLnJlc2V0KCl9bW9kdWxlLmV4cG9ydHM9TVJVQ2FjaGUsTVJVQ2FjaGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMubGlzdCl0aGlzLm9uUmVtb3ZlKHRoaXMubGlzdFt0XSk7cmV0dXJuIHRoaXMubGlzdD17fSx0aGlzLm9yZGVyPVtdLHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmxpc3RbdF09ZSx0aGlzLm9yZGVyLnB1c2godCksdGhpcy5vcmRlci5sZW5ndGg+dGhpcy5tYXgpe3ZhciBpPXRoaXMuZ2V0KHRoaXMub3JkZXJbMF0pO2kmJnRoaXMub25SZW1vdmUoaSl9cmV0dXJuIHRoaXN9LE1SVUNhY2hlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gdGhpcy5saXN0fSxNUlVDYWNoZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yZGVyfSxNUlVDYWNoZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLmxpc3RbdF07cmV0dXJuIGRlbGV0ZSB0aGlzLmxpc3RbdF0sdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKHQpLDEpLGV9O1xufSx7fV0sMTA1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHJlc29sdmVUb2tlbnMoZSxuKXtyZXR1cm4gbi5yZXBsYWNlKC97KFtee30oKVxcW1xcXTw+JD06Oy4sXl0rKX0vZyxmdW5jdGlvbihuLHIpe3JldHVybiByIGluIGU/ZVtyXTpcIlwifSl9bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZVRva2Vucztcbn0se31dLDEwNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgVW5pdEJlemllcj1yZXF1aXJlKFwidW5pdGJlemllclwiKSxDb29yZGluYXRlPXJlcXVpcmUoXCIuLi9nZW8vY29vcmRpbmF0ZVwiKTtleHBvcnRzLmVhc2VDdWJpY0luT3V0PWZ1bmN0aW9uKG4pe2lmKDA+PW4pcmV0dXJuIDA7aWYobj49MSlyZXR1cm4gMTt2YXIgdD1uKm4scj10Km47cmV0dXJuIDQqKC41Pm4/cjozKihuLXQpK3ItLjc1KX0sZXhwb3J0cy5iZXppZXI9ZnVuY3Rpb24obix0LHIsZSl7dmFyIG89bmV3IFVuaXRCZXppZXIobix0LHIsZSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvLnNvbHZlKG4pfX0sZXhwb3J0cy5lYXNlPWV4cG9ydHMuYmV6aWVyKC4yNSwuMSwuMjUsMSksZXhwb3J0cy5wcmVtdWx0aXBseT1mdW5jdGlvbihuKXtyZXR1cm4gblswXSo9blszXSxuWzFdKj1uWzNdLG5bMl0qPW5bM10sbn0sZXhwb3J0cy5jbGFtcD1mdW5jdGlvbihuLHQscil7cmV0dXJuIE1hdGgubWluKHIsTWF0aC5tYXgodCxuKSl9LGV4cG9ydHMud3JhcD1mdW5jdGlvbihuLHQscil7dmFyIGU9ci10LG89KChuLXQpJWUrZSklZSt0O3JldHVybiBvPT09dD9yOm99LGV4cG9ydHMuY29hbGVzY2U9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgdD1hcmd1bWVudHNbbl07aWYobnVsbCE9PXQmJnZvaWQgMCE9PXQpcmV0dXJuIHR9fSxleHBvcnRzLmFzeW5jRWFjaD1mdW5jdGlvbihuLHQscil7ZnVuY3Rpb24gZSgpezA9PT0tLW8mJnIoKX12YXIgbz1uLmxlbmd0aDtpZigwPT09bylyZXR1cm4gcigpO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXQobltpXSxlKX0sZXhwb3J0cy5hc3luY0FsbD1mdW5jdGlvbihuLHQscil7dmFyIGU9bi5sZW5ndGgsbz1uZXcgQXJyYXkobi5sZW5ndGgpLGk9bnVsbDtuLmZvckVhY2goZnVuY3Rpb24obix1KXt0KG4sZnVuY3Rpb24obix0KXtuJiYoaT1uKSxvW3VdPXQsMD09PS0tZSYmcihpLG8pfSl9KX0sZXhwb3J0cy5rZXlzRGlmZmVyZW5jZT1mdW5jdGlvbihuLHQpe3ZhciByPVtdO2Zvcih2YXIgZSBpbiBuKWUgaW4gdHx8ci5wdXNoKGUpO3JldHVybiByfSxleHBvcnRzLmV4dGVuZD1mdW5jdGlvbihuKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgcj1hcmd1bWVudHNbdF07Zm9yKHZhciBlIGluIHIpbltlXT1yW2VdfXJldHVybiBufSxleHBvcnRzLmV4dGVuZEFsbD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpKTtyZXR1cm4gbn0sZXhwb3J0cy5pbmhlcml0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9XCJmdW5jdGlvblwiPT10eXBlb2Ygbj9uLnByb3RvdHlwZTpuLGU9T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gZXhwb3J0cy5leHRlbmRBbGwoZSx0KSxlfSxleHBvcnRzLnBpY2s9ZnVuY3Rpb24obix0KXtmb3IodmFyIHI9e30sZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbz10W2VdO28gaW4gbiYmKHJbb109bltvXSl9cmV0dXJuIHJ9O3ZhciBpZD0xO2V4cG9ydHMudW5pcXVlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWQrK30sZXhwb3J0cy50aHJvdHRsZT1mdW5jdGlvbihuLHQscil7dmFyIGUsbyxpLHU7cmV0dXJuIHU9ZnVuY3Rpb24oKXtlPSExLG8mJihpLmFwcGx5KHIsbyksbz0hMSl9LGk9ZnVuY3Rpb24oKXtlP289YXJndW1lbnRzOihuLmFwcGx5KHIsYXJndW1lbnRzKSxzZXRUaW1lb3V0KHUsdCksZT0hMCl9fSxleHBvcnRzLmRlYm91bmNlPWZ1bmN0aW9uKG4sdCl7dmFyIHIsZTtyZXR1cm4gZnVuY3Rpb24oKXtlPWFyZ3VtZW50cyxjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5hcHBseShudWxsLGUpfSx0KX19LGV4cG9ydHMuYmluZEFsbD1mdW5jdGlvbihuLHQpe24uZm9yRWFjaChmdW5jdGlvbihuKXt0W25dPXRbbl0uYmluZCh0KX0pfSxleHBvcnRzLmJpbmRIYW5kbGVycz1mdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilcImZ1bmN0aW9uXCI9PXR5cGVvZiBuW3RdJiYwPT09dC5pbmRleE9mKFwiX29uXCIpJiYoblt0XT1uW3RdLmJpbmQobikpfSxleHBvcnRzLnNldE9wdGlvbnM9ZnVuY3Rpb24obix0KXtuLmhhc093blByb3BlcnR5KFwib3B0aW9uc1wiKXx8KG4ub3B0aW9ucz1uLm9wdGlvbnM/T2JqZWN0LmNyZWF0ZShuLm9wdGlvbnMpOnt9KTtmb3IodmFyIHIgaW4gdCluLm9wdGlvbnNbcl09dFtyXTtyZXR1cm4gbi5vcHRpb25zfSxleHBvcnRzLmdldENvb3JkaW5hdGVzQ2VudGVyPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD0xLzAscj0xLzAsZT0tKDEvMCksbz0tKDEvMCksaT0wO2k8bi5sZW5ndGg7aSsrKXQ9TWF0aC5taW4odCxuW2ldLmNvbHVtbikscj1NYXRoLm1pbihyLG5baV0ucm93KSxlPU1hdGgubWF4KGUsbltpXS5jb2x1bW4pLG89TWF0aC5tYXgobyxuW2ldLnJvdyk7dmFyIHU9ZS10LGE9by1yLGM9TWF0aC5tYXgodSxhKTtyZXR1cm4gbmV3IENvb3JkaW5hdGUoKHQrZSkvMiwocitvKS8yLDApLnpvb21UbyhNYXRoLmZsb29yKC1NYXRoLmxvZyhjKS9NYXRoLkxOMikpfTtcbn0se1wiLi4vZ2VvL2Nvb3JkaW5hdGVcIjoxOSxcInVuaXRiZXppZXJcIjoxNDF9XSwxMDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoZSl7cmV0dXJuIGU9TWF0aC5yb3VuZChlKSwwPmU/MDplPjI1NT8yNTU6ZX1mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZSl7cmV0dXJuIDA+ZT8wOmU+MT8xOmV9ZnVuY3Rpb24gcGFyc2VfY3NzX2ludChlKXtyZXR1cm4gY2xhbXBfY3NzX2J5dGUoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwKjI1NTpwYXJzZUludChlKSl9ZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KGUpe3JldHVybiBjbGFtcF9jc3NfZmxvYXQoXCIlXCI9PT1lW2UubGVuZ3RoLTFdP3BhcnNlRmxvYXQoZSkvMTAwOnBhcnNlRmxvYXQoZSkpfWZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKGUscixsKXtyZXR1cm4gMD5sP2wrPTE6bD4xJiYobC09MSksMT42Kmw/ZSsoci1lKSpsKjY6MT4yKmw/cjoyPjMqbD9lKyhyLWUpKigyLzMtbCkqNjplfWZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoZSl7dmFyIHI9ZS5yZXBsYWNlKC8gL2csXCJcIikudG9Mb3dlckNhc2UoKTtpZihyIGluIGtDU1NDb2xvclRhYmxlKXJldHVybiBrQ1NTQ29sb3JUYWJsZVtyXS5zbGljZSgpO2lmKFwiI1wiPT09clswXSl7aWYoND09PXIubGVuZ3RoKXt2YXIgbD1wYXJzZUludChyLnN1YnN0cigxKSwxNik7cmV0dXJuIGw+PTAmJjQwOTU+PWw/WygzODQwJmwpPj40fCgzODQwJmwpPj44LDI0MCZsfCgyNDAmbCk+PjQsMTUmbHwoMTUmbCk8PDQsMV06bnVsbH1pZig3PT09ci5sZW5ndGgpe3ZhciBsPXBhcnNlSW50KHIuc3Vic3RyKDEpLDE2KTtyZXR1cm4gbD49MCYmMTY3NzcyMTU+PWw/WygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLDFdOm51bGx9cmV0dXJuIG51bGx9dmFyIGE9ci5pbmRleE9mKFwiKFwiKSx0PXIuaW5kZXhPZihcIilcIik7aWYoLTEhPT1hJiZ0KzE9PT1yLmxlbmd0aCl7dmFyIG49ci5zdWJzdHIoMCxhKSxzPXIuc3Vic3RyKGErMSx0LShhKzEpKS5zcGxpdChcIixcIiksbz0xO3N3aXRjaChuKXtjYXNlXCJyZ2JhXCI6aWYoNCE9PXMubGVuZ3RoKXJldHVybiBudWxsO289cGFyc2VfY3NzX2Zsb2F0KHMucG9wKCkpO2Nhc2VcInJnYlwiOnJldHVybiAzIT09cy5sZW5ndGg/bnVsbDpbcGFyc2VfY3NzX2ludChzWzBdKSxwYXJzZV9jc3NfaW50KHNbMV0pLHBhcnNlX2Nzc19pbnQoc1syXSksb107Y2FzZVwiaHNsYVwiOmlmKDQhPT1zLmxlbmd0aClyZXR1cm4gbnVsbDtvPXBhcnNlX2Nzc19mbG9hdChzLnBvcCgpKTtjYXNlXCJoc2xcIjppZigzIT09cy5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9KHBhcnNlRmxvYXQoc1swXSklMzYwKzM2MCklMzYwLzM2MCx1PXBhcnNlX2Nzc19mbG9hdChzWzFdKSxnPXBhcnNlX2Nzc19mbG9hdChzWzJdKSxkPS41Pj1nP2cqKHUrMSk6Zyt1LWcqdSxjPTIqZy1kO3JldHVybltjbGFtcF9jc3NfYnl0ZSgyNTUqY3NzX2h1ZV90b19yZ2IoYyxkLGkrMS8zKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpKSksY2xhbXBfY3NzX2J5dGUoMjU1KmNzc19odWVfdG9fcmdiKGMsZCxpLTEvMykpLG9dO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXJldHVybiBudWxsfXZhciBrQ1NTQ29sb3JUYWJsZT17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07dHJ5e2V4cG9ydHMucGFyc2VDU1NDb2xvcj1wYXJzZUNTU0NvbG9yfWNhdGNoKGUpe31cbn0se31dLDEwODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbmZpeCh0KXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe3JldHVyblwiJHR5cGVcIj09PXI/XCJ0XCIrdCtWZWN0b3JUaWxlRmVhdHVyZVR5cGVzLmluZGV4T2YoaSk6XCJwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXVwiK3QrSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIHN0cmljdEluZml4KHQpe3ZhciBuPWluZml4KHQpO3JldHVybiBmdW5jdGlvbih0LHIsaSl7cmV0dXJuXCIkdHlwZVwiPT09cj9uKHQscixpKTpcInR5cGVvZihwW1wiK0pTT04uc3RyaW5naWZ5KHIpK1wiXSkgPT09IHR5cGVvZihcIitKU09OLnN0cmluZ2lmeShpKStcIikgJiYgXCIrbih0LHIsaSl9fWZ1bmN0aW9uIGNvbXBpbGUodCl7cmV0dXJuIG9wZXJhdG9yc1t0WzBdXS5hcHBseSh0LHQpfWZ1bmN0aW9uIHRydXRoKCl7cmV0dXJuITB9dmFyIFZlY3RvclRpbGVGZWF0dXJlVHlwZXM9W1wiVW5rbm93blwiLFwiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl0sb3BlcmF0b3JzPXtcIj09XCI6aW5maXgoXCI9PT1cIiksXCIhPVwiOmluZml4KFwiIT09XCIpLFwiPlwiOnN0cmljdEluZml4KFwiPlwiKSxcIjxcIjpzdHJpY3RJbmZpeChcIjxcIiksXCI8PVwiOnN0cmljdEluZml4KFwiPD1cIiksXCI+PVwiOnN0cmljdEluZml4KFwiPj1cIiksXCJpblwiOmZ1bmN0aW9uKHQsbil7cmV0dXJuXCIoZnVuY3Rpb24oKXtcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikubWFwKGZ1bmN0aW9uKHIpe3JldHVyblwiaWYgKFwiK29wZXJhdG9yc1tcIj09XCJdKHQsbixyKStcIikgcmV0dXJuIHRydWU7XCJ9KS5qb2luKFwiXCIpK1wicmV0dXJuIGZhbHNlO30pKClcIn0sXCIhaW5cIjpmdW5jdGlvbigpe3JldHVyblwiIShcIitvcGVyYXRvcnNbXCJpblwiXS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9LGFueTpmdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiKFwiK2NvbXBpbGUodCkrXCIpXCJ9KS5qb2luKFwifHxcIil8fFwiZmFsc2VcIn0sYWxsOmZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIoXCIrY29tcGlsZSh0KStcIilcIn0pLmpvaW4oXCImJlwiKXx8XCJ0cnVlXCJ9LG5vbmU6ZnVuY3Rpb24oKXtyZXR1cm5cIiEoXCIrb3BlcmF0b3JzLmFueS5hcHBseSh0aGlzLGFyZ3VtZW50cykrXCIpXCJ9fTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gdHJ1dGg7dmFyIG49XCJ2YXIgcCA9IGYucHJvcGVydGllcyB8fCBmLnRhZ3MgfHwge30sIHQgPSBmLnR5cGU7IHJldHVybiBcIitjb21waWxlKHQpK1wiO1wiO3JldHVybiBuZXcgRnVuY3Rpb24oXCJmXCIsbil9O1xufSx7fV0sMTA5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNsaXAoZSxuLHQscixsLHUsaSxzKXtpZih0Lz1uLHIvPW4saT49dCYmcj49cylyZXR1cm4gZTtpZihpPnJ8fHQ+cylyZXR1cm4gbnVsbDtmb3IodmFyIHA9W10saD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgYyxhLG89ZVtoXSxmPW8uZ2VvbWV0cnksZz1vLnR5cGU7aWYoYz1vLm1pbltsXSxhPW8ubWF4W2xdLGM+PXQmJnI+PWEpcC5wdXNoKG8pO2Vsc2UgaWYoIShjPnJ8fHQ+YSkpe3ZhciBtPTE9PT1nP2NsaXBQb2ludHMoZix0LHIsbCk6Y2xpcEdlb21ldHJ5KGYsdCxyLGwsdSwzPT09Zyk7bS5sZW5ndGgmJnAucHVzaCh7Z2VvbWV0cnk6bSx0eXBlOmcsdGFnczplW2hdLnRhZ3N8fG51bGwsbWluOm8ubWluLG1heDpvLm1heH0pfX1yZXR1cm4gcC5sZW5ndGg/cDpudWxsfWZ1bmN0aW9uIGNsaXBQb2ludHMoZSxuLHQscil7Zm9yKHZhciBsPVtdLHU9MDt1PGUubGVuZ3RoO3UrKyl7dmFyIGk9ZVt1XSxzPWlbcl07cz49biYmdD49cyYmbC5wdXNoKGkpfXJldHVybiBsfWZ1bmN0aW9uIGNsaXBHZW9tZXRyeShlLG4sdCxyLGwsdSl7Zm9yKHZhciBpPVtdLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHAsaCxjLGE9MCxvPTAsZj1udWxsLGc9ZVtzXSxtPWcuYXJlYSx2PWcuZGlzdCx3PWcubGVuZ3RoLHk9W107Zm9yKGg9MDt3LTE+aDtoKyspcD1mfHxnW2hdLGY9Z1toKzFdLGE9b3x8cFtyXSxvPWZbcl0sbj5hP28+dD8oeS5wdXNoKGwocCxmLG4pLGwocCxmLHQpKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOm8+PW4mJnkucHVzaChsKHAsZixuKSk6YT50P24+bz8oeS5wdXNoKGwocCxmLHQpLGwocCxmLG4pKSx1fHwoeT1uZXdTbGljZShpLHksbSx2KSkpOnQ+PW8mJnkucHVzaChsKHAsZix0KSk6KHkucHVzaChwKSxuPm8/KHkucHVzaChsKHAsZixuKSksdXx8KHk9bmV3U2xpY2UoaSx5LG0sdikpKTpvPnQmJih5LnB1c2gobChwLGYsdCkpLHV8fCh5PW5ld1NsaWNlKGkseSxtLHYpKSkpO3A9Z1t3LTFdLGE9cFtyXSxhPj1uJiZ0Pj1hJiZ5LnB1c2gocCksYz15W3kubGVuZ3RoLTFdLHUmJmMmJih5WzBdWzBdIT09Y1swXXx8eVswXVsxXSE9PWNbMV0pJiZ5LnB1c2goeVswXSksbmV3U2xpY2UoaSx5LG0sdil9cmV0dXJuIGl9ZnVuY3Rpb24gbmV3U2xpY2UoZSxuLHQscil7cmV0dXJuIG4ubGVuZ3RoJiYobi5hcmVhPXQsbi5kaXN0PXIsZS5wdXNoKG4pKSxbXX1tb2R1bGUuZXhwb3J0cz1jbGlwO1xufSx7fV0sMTEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvbnZlcnQoZSx0KXt2YXIgcj1bXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpZm9yKHZhciBvPTA7bzxlLmZlYXR1cmVzLmxlbmd0aDtvKyspY29udmVydEZlYXR1cmUocixlLmZlYXR1cmVzW29dLHQpO2Vsc2VcIkZlYXR1cmVcIj09PWUudHlwZT9jb252ZXJ0RmVhdHVyZShyLGUsdCk6Y29udmVydEZlYXR1cmUocix7Z2VvbWV0cnk6ZX0sdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZSx0LHIpe3ZhciBvLG4sYSxpPXQuZ2VvbWV0cnksYz1pLnR5cGUsbD1pLmNvb3JkaW5hdGVzLHU9dC5wcm9wZXJ0aWVzO2lmKFwiUG9pbnRcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDEsW3Byb2plY3RQb2ludChsKV0pKTtlbHNlIGlmKFwiTXVsdGlQb2ludFwiPT09YyllLnB1c2goY3JlYXRlKHUsMSxwcm9qZWN0KGwpKSk7ZWxzZSBpZihcIkxpbmVTdHJpbmdcIj09PWMpZS5wdXNoKGNyZWF0ZSh1LDIsW3Byb2plY3QobCxyKV0pKTtlbHNlIGlmKFwiTXVsdGlMaW5lU3RyaW5nXCI9PT1jfHxcIlBvbHlnb25cIj09PWMpe2ZvcihhPVtdLG89MDtvPGwubGVuZ3RoO28rKylhLnB1c2gocHJvamVjdChsW29dLHIpKTtlLnB1c2goY3JlYXRlKHUsXCJQb2x5Z29uXCI9PT1jPzM6MixhKSl9ZWxzZSBpZihcIk11bHRpUG9seWdvblwiPT09Yyl7Zm9yKGE9W10sbz0wO288bC5sZW5ndGg7bysrKWZvcihuPTA7bjxsW29dLmxlbmd0aDtuKyspYS5wdXNoKHByb2plY3QobFtvXVtuXSxyKSk7ZS5wdXNoKGNyZWF0ZSh1LDMsYSkpfWVsc2V7aWYoXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiE9PWMpdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIik7Zm9yKG89MDtvPGkuZ2VvbWV0cmllcy5sZW5ndGg7bysrKWNvbnZlcnRGZWF0dXJlKGUse2dlb21ldHJ5OmkuZ2VvbWV0cmllc1tvXSxwcm9wZXJ0aWVzOnV9LHIpfX1mdW5jdGlvbiBjcmVhdGUoZSx0LHIpe3ZhciBvPXtnZW9tZXRyeTpyLHR5cGU6dCx0YWdzOmV8fG51bGwsbWluOlsyLDFdLG1heDpbLTEsMF19O3JldHVybiBjYWxjQkJveChvKSxvfWZ1bmN0aW9uIHByb2plY3QoZSx0KXtmb3IodmFyIHI9W10sbz0wO288ZS5sZW5ndGg7bysrKXIucHVzaChwcm9qZWN0UG9pbnQoZVtvXSkpO3JldHVybiB0JiYoc2ltcGxpZnkocix0KSxjYWxjU2l6ZShyKSkscn1mdW5jdGlvbiBwcm9qZWN0UG9pbnQoZSl7dmFyIHQ9TWF0aC5zaW4oZVsxXSpNYXRoLlBJLzE4MCkscj1lWzBdLzM2MCsuNSxvPS41LS4yNSpNYXRoLmxvZygoMSt0KS8oMS10KSkvTWF0aC5QSTtyZXR1cm4gbz0tMT5vPy0xOm8+MT8xOm8sW3IsbywwXX1mdW5jdGlvbiBjYWxjU2l6ZShlKXtmb3IodmFyIHQscixvPTAsbj0wLGE9MDthPGUubGVuZ3RoLTE7YSsrKXQ9cnx8ZVthXSxyPWVbYSsxXSxvKz10WzBdKnJbMV0tclswXSp0WzFdLG4rPU1hdGguYWJzKHJbMF0tdFswXSkrTWF0aC5hYnMoclsxXS10WzFdKTtlLmFyZWE9TWF0aC5hYnMoby8yKSxlLmRpc3Q9bn1mdW5jdGlvbiBjYWxjQkJveChlKXt2YXIgdD1lLmdlb21ldHJ5LHI9ZS5taW4sbz1lLm1heDtpZigxPT09ZS50eXBlKWNhbGNSaW5nQkJveChyLG8sdCk7ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyljYWxjUmluZ0JCb3gocixvLHRbbl0pO3JldHVybiBlfWZ1bmN0aW9uIGNhbGNSaW5nQkJveChlLHQscil7Zm9yKHZhciBvLG49MDtuPHIubGVuZ3RoO24rKylvPXJbbl0sZVswXT1NYXRoLm1pbihvWzBdLGVbMF0pLHRbMF09TWF0aC5tYXgob1swXSx0WzBdKSxlWzFdPU1hdGgubWluKG9bMV0sZVsxXSksdFsxXT1NYXRoLm1heChvWzFdLHRbMV0pfW1vZHVsZS5leHBvcnRzPWNvbnZlcnQ7dmFyIHNpbXBsaWZ5PXJlcXVpcmUoXCIuL3NpbXBsaWZ5XCIpO1xufSx7XCIuL3NpbXBsaWZ5XCI6MTEyfV0sMTExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdlb2pzb252dChlLHQpe3JldHVybiBuZXcgR2VvSlNPTlZUKGUsdCl9ZnVuY3Rpb24gR2VvSlNPTlZUKGUsdCl7dD10aGlzLm9wdGlvbnM9ZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSx0KTt2YXIgaT10LmRlYnVnO2kmJmNvbnNvbGUudGltZShcInByZXByb2Nlc3MgZGF0YVwiKTt2YXIgbz0xPDx0Lm1heFpvb20sbj1jb252ZXJ0KGUsdC50b2xlcmFuY2UvKG8qdC5leHRlbnQpKTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxpJiYoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsdC5pbmRleE1heFpvb20sdC5pbmRleE1heFBvaW50cyksY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLG49d3JhcChuLHQuYnVmZmVyL3QuZXh0ZW50LGludGVyc2VjdFgpLG4ubGVuZ3RoJiZ0aGlzLnNwbGl0VGlsZShuLDAsMCwwKSxpJiYobi5sZW5ndGgmJmNvbnNvbGUubG9nKFwiZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkXCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKFwiZ2VuZXJhdGUgdGlsZXNcIiksY29uc29sZS5sb2coXCJ0aWxlcyBnZW5lcmF0ZWQ6XCIsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfWZ1bmN0aW9uIHRvSUQoZSx0LGkpe3JldHVybiAzMiooKDE8PGUpKmkrdCkrZX1mdW5jdGlvbiBpbnRlcnNlY3RYKGUsdCxpKXtyZXR1cm5baSwoaS1lWzBdKSoodFsxXS1lWzFdKS8odFswXS1lWzBdKStlWzFdLDFdfWZ1bmN0aW9uIGludGVyc2VjdFkoZSx0LGkpe3JldHVyblsoaS1lWzFdKSoodFswXS1lWzBdKS8odFsxXS1lWzFdKStlWzBdLGksMV19ZnVuY3Rpb24gZXh0ZW5kKGUsdCl7Zm9yKHZhciBpIGluIHQpZVtpXT10W2ldO3JldHVybiBlfWZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZShlLHQsaSl7dmFyIG89ZS5zb3VyY2U7aWYoMSE9PW8ubGVuZ3RoKXJldHVybiExO3ZhciBuPW9bMF07aWYoMyE9PW4udHlwZXx8bi5nZW9tZXRyeS5sZW5ndGg+MSlyZXR1cm4hMTt2YXIgcj1uLmdlb21ldHJ5WzBdLmxlbmd0aDtpZig1IT09cilyZXR1cm4hMTtmb3IodmFyIHM9MDtyPnM7cysrKXt2YXIgbD10cmFuc2Zvcm0ucG9pbnQobi5nZW9tZXRyeVswXVtzXSx0LGUuejIsZS54LGUueSk7aWYobFswXSE9PS1pJiZsWzBdIT09dCtpfHxsWzFdIT09LWkmJmxbMV0hPT10K2kpcmV0dXJuITF9cmV0dXJuITB9bW9kdWxlLmV4cG9ydHM9Z2VvanNvbnZ0O3ZhciBjb252ZXJ0PXJlcXVpcmUoXCIuL2NvbnZlcnRcIiksdHJhbnNmb3JtPXJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKSxjbGlwPXJlcXVpcmUoXCIuL2NsaXBcIiksd3JhcD1yZXF1aXJlKFwiLi93cmFwXCIpLGNyZWF0ZVRpbGU9cmVxdWlyZShcIi4vdGlsZVwiKTtHZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnM9e21heFpvb206MTQsaW5kZXhNYXhab29tOjUsaW5kZXhNYXhQb2ludHM6MWU1LHNvbGlkQ2hpbGRyZW46ITEsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGRlYnVnOjB9LEdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKGUsdCxpLG8sbixyLHMpe2Zvcih2YXIgbD1bZSx0LGksb10sYT10aGlzLm9wdGlvbnMsdT1hLmRlYnVnLGM9bnVsbDtsLmxlbmd0aDspe289bC5wb3AoKSxpPWwucG9wKCksdD1sLnBvcCgpLGU9bC5wb3AoKTt2YXIgcD0xPDx0LGQ9dG9JRCh0LGksbyksbT10aGlzLnRpbGVzW2RdLGY9dD09PWEubWF4Wm9vbT8wOmEudG9sZXJhbmNlLyhwKmEuZXh0ZW50KTtpZighbSYmKHU+MSYmY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksbT10aGlzLnRpbGVzW2RdPWNyZWF0ZVRpbGUoZSxwLGksbyxmLHQ9PT1hLm1heFpvb20pLHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OnQseDppLHk6b30pLHUpKXt1PjEmJihjb25zb2xlLmxvZyhcInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKVwiLHQsaSxvLG0ubnVtRmVhdHVyZXMsbS5udW1Qb2ludHMsbS5udW1TaW1wbGlmaWVkKSxjb25zb2xlLnRpbWVFbmQoXCJjcmVhdGlvblwiKSk7dmFyIGg9XCJ6XCIrdDt0aGlzLnN0YXRzW2hdPSh0aGlzLnN0YXRzW2hdfHwwKSsxLHRoaXMudG90YWwrK31pZihtLnNvdXJjZT1lLG4pe2lmKHQ9PT1hLm1heFpvb218fHQ9PT1uKWNvbnRpbnVlO3ZhciB4PTE8PG4tdDtpZihpIT09TWF0aC5mbG9vcihyL3gpfHxvIT09TWF0aC5mbG9vcihzL3gpKWNvbnRpbnVlfWVsc2UgaWYodD09PWEuaW5kZXhNYXhab29tfHxtLm51bVBvaW50czw9YS5pbmRleE1heFBvaW50cyljb250aW51ZTtpZihhLnNvbGlkQ2hpbGRyZW58fCFpc0NsaXBwZWRTcXVhcmUobSxhLmV4dGVudCxhLmJ1ZmZlcikpe20uc291cmNlPW51bGwsdT4xJiZjb25zb2xlLnRpbWUoXCJjbGlwcGluZ1wiKTt2YXIgZyx2LE0sVCxiLHksUz0uNSphLmJ1ZmZlci9hLmV4dGVudCxaPS41LVMscT0uNStTLHc9MStTO2c9dj1NPVQ9bnVsbCxiPWNsaXAoZSxwLGktUyxpK3EsMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSx5PWNsaXAoZSxwLGkrWixpK3csMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSxiJiYoZz1jbGlwKGIscCxvLVMsbytxLDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSksdj1jbGlwKGIscCxvK1osbyt3LDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSkpLHkmJihNPWNsaXAoeSxwLG8tUyxvK3EsMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSxUPWNsaXAoeSxwLG8rWixvK3csMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSksdT4xJiZjb25zb2xlLnRpbWVFbmQoXCJjbGlwcGluZ1wiKSxnJiZsLnB1c2goZyx0KzEsMippLDIqbyksdiYmbC5wdXNoKHYsdCsxLDIqaSwyKm8rMSksTSYmbC5wdXNoKE0sdCsxLDIqaSsxLDIqbyksVCYmbC5wdXNoKFQsdCsxLDIqaSsxLDIqbysxKX1lbHNlIG4mJihjPXQpfXJldHVybiBjfSxHZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24oZSx0LGkpe3ZhciBvPXRoaXMub3B0aW9ucyxuPW8uZXh0ZW50LHI9by5kZWJ1ZyxzPTE8PGU7dD0odCVzK3MpJXM7dmFyIGw9dG9JRChlLHQsaSk7aWYodGhpcy50aWxlc1tsXSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUodGhpcy50aWxlc1tsXSxuKTtyPjEmJmNvbnNvbGUubG9nKFwiZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWRcIixlLHQsaSk7Zm9yKHZhciBhLHU9ZSxjPXQscD1pOyFhJiZ1PjA7KXUtLSxjPU1hdGguZmxvb3IoYy8yKSxwPU1hdGguZmxvb3IocC8yKSxhPXRoaXMudGlsZXNbdG9JRCh1LGMscCldO2lmKCFhfHwhYS5zb3VyY2UpcmV0dXJuIG51bGw7aWYocj4xJiZjb25zb2xlLmxvZyhcImZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZFwiLHUsYyxwKSxpc0NsaXBwZWRTcXVhcmUoYSxuLG8uYnVmZmVyKSlyZXR1cm4gdHJhbnNmb3JtLnRpbGUoYSxuKTtyPjEmJmNvbnNvbGUudGltZShcImRyaWxsaW5nIGRvd25cIik7dmFyIGQ9dGhpcy5zcGxpdFRpbGUoYS5zb3VyY2UsdSxjLHAsZSx0LGkpO2lmKHI+MSYmY29uc29sZS50aW1lRW5kKFwiZHJpbGxpbmcgZG93blwiKSxudWxsIT09ZCl7dmFyIG09MTw8ZS1kO2w9dG9JRChkLE1hdGguZmxvb3IodC9tKSxNYXRoLmZsb29yKGkvbSkpfXJldHVybiB0aGlzLnRpbGVzW2xdP3RyYW5zZm9ybS50aWxlKHRoaXMudGlsZXNbbF0sbik6bnVsbH07XG59LHtcIi4vY2xpcFwiOjEwOSxcIi4vY29udmVydFwiOjExMCxcIi4vdGlsZVwiOjExMyxcIi4vdHJhbnNmb3JtXCI6MTE0LFwiLi93cmFwXCI6MTE1fV0sMTEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNpbXBsaWZ5KHQsaSl7dmFyIGUscCxyLHMsbz1pKmksZj10Lmxlbmd0aCx1PTAsbj1mLTEsZz1bXTtmb3IodFt1XVsyXT0xLHRbbl1bMl09MTtuOyl7Zm9yKHA9MCxlPXUrMTtuPmU7ZSsrKXI9Z2V0U3FTZWdEaXN0KHRbZV0sdFt1XSx0W25dKSxyPnAmJihzPWUscD1yKTtwPm8/KHRbc11bMl09cCxnLnB1c2godSksZy5wdXNoKHMpLHU9cyk6KG49Zy5wb3AoKSx1PWcucG9wKCkpfX1mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QodCxpLGUpe3ZhciBwPWlbMF0scj1pWzFdLHM9ZVswXSxvPWVbMV0sZj10WzBdLHU9dFsxXSxuPXMtcCxnPW8tcjtpZigwIT09bnx8MCE9PWcpe3ZhciBsPSgoZi1wKSpuKyh1LXIpKmcpLyhuKm4rZypnKTtsPjE/KHA9cyxyPW8pOmw+MCYmKHArPW4qbCxyKz1nKmwpfXJldHVybiBuPWYtcCxnPXUtcixuKm4rZypnfW1vZHVsZS5leHBvcnRzPXNpbXBsaWZ5O1xufSx7fV0sMTEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNyZWF0ZVRpbGUoZSxuLHQsbSxpLHUpe2Zvcih2YXIgcj17ZmVhdHVyZXM6W10sbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOjAsc291cmNlOm51bGwseDp0LHk6bSx6MjpuLHRyYW5zZm9ybWVkOiExLG1pbjpbMiwxXSxtYXg6Wy0xLDBdfSxhPTA7YTxlLmxlbmd0aDthKyspe3IubnVtRmVhdHVyZXMrKyxhZGRGZWF0dXJlKHIsZVthXSxpLHUpO3ZhciBzPWVbYV0ubWluLGw9ZVthXS5tYXg7c1swXTxyLm1pblswXSYmKHIubWluWzBdPXNbMF0pLHNbMV08ci5taW5bMV0mJihyLm1pblsxXT1zWzFdKSxsWzBdPnIubWF4WzBdJiYoci5tYXhbMF09bFswXSksbFsxXT5yLm1heFsxXSYmKHIubWF4WzFdPWxbMV0pfXJldHVybiByfWZ1bmN0aW9uIGFkZEZlYXR1cmUoZSxuLHQsbSl7dmFyIGksdSxyLGEscz1uLmdlb21ldHJ5LGw9bi50eXBlLG89W10sZj10KnQ7aWYoMT09PWwpZm9yKGk9MDtpPHMubGVuZ3RoO2krKylvLnB1c2goc1tpXSksZS5udW1Qb2ludHMrKyxlLm51bVNpbXBsaWZpZWQrKztlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspaWYocj1zW2ldLG18fCEoMj09PWwmJnIuZGlzdDx0fHwzPT09bCYmci5hcmVhPGYpKXt2YXIgZD1bXTtmb3IodT0wO3U8ci5sZW5ndGg7dSsrKWE9clt1XSwobXx8YVsyXT5mKSYmKGQucHVzaChhKSxlLm51bVNpbXBsaWZpZWQrKyksZS5udW1Qb2ludHMrKztvLnB1c2goZCl9ZWxzZSBlLm51bVBvaW50cys9ci5sZW5ndGg7by5sZW5ndGgmJmUuZmVhdHVyZXMucHVzaCh7Z2VvbWV0cnk6byx0eXBlOmwsdGFnczpuLnRhZ3N8fG51bGx9KX1tb2R1bGUuZXhwb3J0cz1jcmVhdGVUaWxlO1xufSx7fV0sMTE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHRyYW5zZm9ybVRpbGUocix0KXtpZihyLnRyYW5zZm9ybWVkKXJldHVybiByO3ZhciBuLGUsbyxmPXIuejIsYT1yLngscz1yLnk7Zm9yKG49MDtuPHIuZmVhdHVyZXMubGVuZ3RoO24rKyl7dmFyIGk9ci5mZWF0dXJlc1tuXSx1PWkuZ2VvbWV0cnksbT1pLnR5cGU7aWYoMT09PW0pZm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl1W2VdPXRyYW5zZm9ybVBvaW50KHVbZV0sdCxmLGEscyk7ZWxzZSBmb3IoZT0wO2U8dS5sZW5ndGg7ZSsrKXt2YXIgbD11W2VdO2ZvcihvPTA7bzxsLmxlbmd0aDtvKyspbFtvXT10cmFuc2Zvcm1Qb2ludChsW29dLHQsZixhLHMpfX1yZXR1cm4gci50cmFuc2Zvcm1lZD0hMCxyfWZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHIsdCxuLGUsbyl7dmFyIGY9TWF0aC5yb3VuZCh0KihyWzBdKm4tZSkpLGE9TWF0aC5yb3VuZCh0KihyWzFdKm4tbykpO3JldHVybltmLGFdfWV4cG9ydHMudGlsZT10cmFuc2Zvcm1UaWxlLGV4cG9ydHMucG9pbnQ9dHJhbnNmb3JtUG9pbnQ7XG59LHt9XSwxMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gd3JhcChyLHQsZSl7dmFyIG89cixhPWNsaXAociwxLC0xLXQsdCwwLGUsLTEsMikscz1jbGlwKHIsMSwxLXQsMit0LDAsZSwtMSwyKTtyZXR1cm4oYXx8cykmJihvPWNsaXAociwxLC10LDErdCwwLGUsLTEsMiksYSYmKG89c2hpZnRGZWF0dXJlQ29vcmRzKGEsMSkuY29uY2F0KG8pKSxzJiYobz1vLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocywtMSkpKSksb31mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMocix0KXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYSxzPXJbb10saT1zLnR5cGU7aWYoMT09PWkpYT1zaGlmdENvb3JkcyhzLmdlb21ldHJ5LHQpO2Vsc2V7YT1bXTtmb3IodmFyIG49MDtuPHMuZ2VvbWV0cnkubGVuZ3RoO24rKylhLnB1c2goc2hpZnRDb29yZHMocy5nZW9tZXRyeVtuXSx0KSl9ZS5wdXNoKHtnZW9tZXRyeTphLHR5cGU6aSx0YWdzOnMudGFncyxtaW46W3MubWluWzBdK3Qscy5taW5bMV1dLG1heDpbcy5tYXhbMF0rdCxzLm1heFsxXV19KX1yZXR1cm4gZX1mdW5jdGlvbiBzaGlmdENvb3JkcyhyLHQpe3ZhciBlPVtdO2UuYXJlYT1yLmFyZWEsZS5kaXN0PXIuZGlzdDtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyllLnB1c2goW3Jbb11bMF0rdCxyW29dWzFdLHJbb11bMl1dKTtyZXR1cm4gZX12YXIgY2xpcD1yZXF1aXJlKFwiLi9jbGlwXCIpO21vZHVsZS5leHBvcnRzPXdyYXA7XG59LHtcIi4vY2xpcFwiOjEwOX1dLDExNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5leHBvcnRzLmdsTWF0cml4PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIiksZXhwb3J0cy5tYXQyPXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCIpLGV4cG9ydHMubWF0MmQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDJkLmpzXCIpLGV4cG9ydHMubWF0Mz1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKSxleHBvcnRzLm1hdDQ9cmVxdWlyZShcIi4vZ2wtbWF0cml4L21hdDQuanNcIiksZXhwb3J0cy5xdWF0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC9xdWF0LmpzXCIpLGV4cG9ydHMudmVjMj1yZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKSxleHBvcnRzLnZlYzM9cmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzMuanNcIiksZXhwb3J0cy52ZWM0PXJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWM0LmpzXCIpO1xufSx7XCIuL2dsLW1hdHJpeC9jb21tb24uanNcIjoxMTcsXCIuL2dsLW1hdHJpeC9tYXQyLmpzXCI6MTE4LFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIjoxMTksXCIuL2dsLW1hdHJpeC9tYXQzLmpzXCI6MTIwLFwiLi9nbC1tYXRyaXgvbWF0NC5qc1wiOjEyMSxcIi4vZ2wtbWF0cml4L3F1YXQuanNcIjoxMjIsXCIuL2dsLW1hdHJpeC92ZWMyLmpzXCI6MTIzLFwiLi9nbC1tYXRyaXgvdmVjMy5qc1wiOjEyNCxcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIjoxMjV9XSwxMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXt9O2dsTWF0cml4LkVQU0lMT049MWUtNixnbE1hdHJpeC5BUlJBWV9UWVBFPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/RmxvYXQzMkFycmF5OkFycmF5LGdsTWF0cml4LlJBTkRPTT1NYXRoLnJhbmRvbSxnbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGU9ZnVuY3Rpb24ocil7R0xNQVRfQVJSQVlfVFlQRT1yfTt2YXIgZGVncmVlPU1hdGguUEkvMTgwO2dsTWF0cml4LnRvUmFkaWFuPWZ1bmN0aW9uKHIpe3JldHVybiByKmRlZ3JlZX0sbW9kdWxlLmV4cG9ydHM9Z2xNYXRyaXg7XG59LHt9XSwxMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQyPXt9O21hdDIuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxtYXQyLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPXRbM10sbn0sbWF0Mi5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0fSxtYXQyLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0sbWF0Mi50cmFuc3Bvc2U9ZnVuY3Rpb24odCxuKXtpZih0PT09bil7dmFyIHI9blsxXTt0WzFdPW5bMl0sdFsyXT1yfWVsc2UgdFswXT1uWzBdLHRbMV09blsyXSx0WzJdPW5bMV0sdFszXT1uWzNdO3JldHVybiB0fSxtYXQyLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLHU9blsyXSxvPW5bM10sZT1yKm8tdSphO3JldHVybiBlPyhlPTEvZSx0WzBdPW8qZSx0WzFdPS1hKmUsdFsyXT0tdSplLHRbM109ciplLHQpOm51bGx9LG1hdDIuYWRqb2ludD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF07cmV0dXJuIHRbMF09blszXSx0WzFdPS1uWzFdLHRbMl09LW5bMl0sdFszXT1yLHR9LG1hdDIuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzJdKnRbMV19LG1hdDIubXVsdGlwbHk9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXSxjPXJbMl0sZj1yWzNdO3JldHVybiB0WzBdPWEqaStvKm0sdFsxXT11KmkrZSptLHRbMl09YSpjK28qZix0WzNdPXUqYytlKmYsdH0sbWF0Mi5tdWw9bWF0Mi5tdWx0aXBseSxtYXQyLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSx1PW5bMV0sbz1uWzJdLGU9blszXSxpPU1hdGguc2luKHIpLG09TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09YSptK28qaSx0WzFdPXUqbStlKmksdFsyXT1hKi1pK28qbSx0WzNdPXUqLWkrZSptLHR9LG1hdDIuc2NhbGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sdT1uWzFdLG89blsyXSxlPW5bM10saT1yWzBdLG09clsxXTtyZXR1cm4gdFswXT1hKmksdFsxXT11KmksdFsyXT1vKm0sdFszXT1lKm0sdH0sbWF0Mi5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLnNpbihuKSxhPU1hdGguY29zKG4pO3JldHVybiB0WzBdPWEsdFsxXT1yLHRbMl09LXIsdFszXT1hLHR9LG1hdDIuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT1uWzFdLHR9LG1hdDIuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MihcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiKVwifSxtYXQyLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpKX0sbWF0Mi5MRFU9ZnVuY3Rpb24odCxuLHIsYSl7cmV0dXJuIHRbMl09YVsyXS9hWzBdLHJbMF09YVswXSxyWzFdPWFbMV0sclszXT1hWzNdLXRbMl0qclsxXSxbdCxuLHJdfSxtb2R1bGUuZXhwb3J0cz1tYXQyO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDExOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDJkPXt9O21hdDJkLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT0wLHRbNV09MCx0fSxtYXQyZC5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbn0sbWF0MmQuY29weT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bM10sdFs0XT1uWzRdLHRbNV09bls1XSx0fSxtYXQyZC5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0sbWF0MmQuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxlPW5bNF0saT1uWzVdLG09cip1LWEqbztyZXR1cm4gbT8obT0xL20sdFswXT11Km0sdFsxXT0tYSptLHRbMl09LW8qbSx0WzNdPXIqbSx0WzRdPShvKmktdSplKSptLHRbNV09KGEqZS1yKmkpKm0sdCk6bnVsbH0sbWF0MmQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzFdKnRbMl19LG1hdDJkLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXSxmPXJbMl0sbD1yWzNdLE09cls0XSxoPXJbNV07cmV0dXJuIHRbMF09YSpjK3UqZCx0WzFdPW8qYytlKmQsdFsyXT1hKmYrdSpsLHRbM109bypmK2UqbCx0WzRdPWEqTSt1KmgraSx0WzVdPW8qTStlKmgrbSx0fSxtYXQyZC5tdWw9bWF0MmQubXVsdGlwbHksbWF0MmQucm90YXRlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1NYXRoLnNpbihyKSxkPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWEqZCt1KmMsdFsxXT1vKmQrZSpjLHRbMl09YSotYyt1KmQsdFszXT1vKi1jK2UqZCx0WzRdPWksdFs1XT1tLHR9LG1hdDJkLnNjYWxlPWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sZT1uWzNdLGk9bls0XSxtPW5bNV0sYz1yWzBdLGQ9clsxXTtyZXR1cm4gdFswXT1hKmMsdFsxXT1vKmMsdFsyXT11KmQsdFszXT1lKmQsdFs0XT1pLHRbNV09bSx0fSxtYXQyZC50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxlPW5bM10saT1uWzRdLG09bls1XSxjPXJbMF0sZD1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPWUsdFs0XT1hKmMrdSpkK2ksdFs1XT1vKmMrZSpkK20sdH0sbWF0MmQuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPS1yLHRbM109YSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPTAsdFsyXT0wLHRbM109blsxXSx0WzRdPTAsdFs1XT0wLHR9LG1hdDJkLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdFs0XT1uWzBdLHRbNV09blsxXSx0fSxtYXQyZC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJtYXQyZChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiKVwifSxtYXQyZC5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrMSl9LG1vZHVsZS5leHBvcnRzPW1hdDJkO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLG1hdDM9e307bWF0My5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0ND1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPW5bMF0sdFsxXT1uWzFdLHRbMl09blsyXSx0WzNdPW5bNF0sdFs0XT1uWzVdLHRbNV09bls2XSx0WzZdPW5bOF0sdFs3XT1uWzldLHRbOF09blsxMF0sdH0sbWF0My5jbG9uZT1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxuWzhdPXRbOF0sbn0sbWF0My5jb3B5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMudHJhbnNwb3NlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pe3ZhciByPW5bMV0sYT1uWzJdLG89bls1XTt0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109cix0WzVdPW5bN10sdFs2XT1hLHRbN109b31lbHNlIHRbMF09blswXSx0WzFdPW5bM10sdFsyXT1uWzZdLHRbM109blsxXSx0WzRdPW5bNF0sdFs1XT1uWzddLHRbNl09blsyXSx0WzddPW5bNV0sdFs4XT1uWzhdO3JldHVybiB0fSxtYXQzLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1uWzRdLGU9bls1XSxpPW5bNl0sYz1uWzddLGY9bls4XSxsPWYqbS1lKmMsTT0tZip1K2UqaSx2PWMqdS1tKmksaD1yKmwrYSpNK28qdjtyZXR1cm4gaD8oaD0xL2gsdFswXT1sKmgsdFsxXT0oLWYqYStvKmMpKmgsdFsyXT0oZSphLW8qbSkqaCx0WzNdPU0qaCx0WzRdPShmKnItbyppKSpoLHRbNV09KC1lKnIrbyp1KSpoLHRbNl09dipoLHRbN109KC1jKnIrYSppKSpoLHRbOF09KG0qci1hKnUpKmgsdCk6bnVsbH0sbWF0My5hZGpvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9blswXSxhPW5bMV0sbz1uWzJdLHU9blszXSxtPW5bNF0sZT1uWzVdLGk9bls2XSxjPW5bN10sZj1uWzhdO3JldHVybiB0WzBdPW0qZi1lKmMsdFsxXT1vKmMtYSpmLHRbMl09YSplLW8qbSx0WzNdPWUqaS11KmYsdFs0XT1yKmYtbyppLHRbNV09byp1LXIqZSx0WzZdPXUqYy1tKmksdFs3XT1hKmktcipjLHRbOF09ciptLWEqdSx0fSxtYXQzLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3ZhciBuPXRbMF0scj10WzFdLGE9dFsyXSxvPXRbM10sdT10WzRdLG09dFs1XSxlPXRbNl0saT10WzddLGM9dFs4XTtyZXR1cm4gbiooYyp1LW0qaSkrciooLWMqbyttKmUpK2EqKGkqby11KmUpfSxtYXQzLm11bHRpcGx5PWZ1bmN0aW9uKHQsbixyKXt2YXIgYT1uWzBdLG89blsxXSx1PW5bMl0sbT1uWzNdLGU9bls0XSxpPW5bNV0sYz1uWzZdLGY9bls3XSxsPW5bOF0sTT1yWzBdLHY9clsxXSxoPXJbMl0scD1yWzNdLHM9cls0XSx3PXJbNV0sZD1yWzZdLFI9cls3XSxnPXJbOF07cmV0dXJuIHRbMF09TSphK3YqbStoKmMsdFsxXT1NKm8rdiplK2gqZix0WzJdPU0qdSt2KmkraCpsLHRbM109cCphK3MqbSt3KmMsdFs0XT1wKm8rcyplK3cqZix0WzVdPXAqdStzKmkrdypsLHRbNl09ZCphK1IqbStnKmMsdFs3XT1kKm8rUiplK2cqZix0WzhdPWQqdStSKmkrZypsLHR9LG1hdDMubXVsPW1hdDMubXVsdGlwbHksbWF0My50cmFuc2xhdGU9ZnVuY3Rpb24odCxuLHIpe3ZhciBhPW5bMF0sbz1uWzFdLHU9blsyXSxtPW5bM10sZT1uWzRdLGk9bls1XSxjPW5bNl0sZj1uWzddLGw9bls4XSxNPXJbMF0sdj1yWzFdO3JldHVybiB0WzBdPWEsdFsxXT1vLHRbMl09dSx0WzNdPW0sdFs0XT1lLHRbNV09aSx0WzZdPU0qYSt2Km0rYyx0WzddPU0qbyt2KmUrZix0WzhdPU0qdSt2KmkrbCx0fSxtYXQzLnJvdGF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGE9blswXSxvPW5bMV0sdT1uWzJdLG09blszXSxlPW5bNF0saT1uWzVdLGM9bls2XSxmPW5bN10sbD1uWzhdLE09TWF0aC5zaW4ociksdj1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT12KmErTSptLHRbMV09dipvK00qZSx0WzJdPXYqdStNKmksdFszXT12Km0tTSphLHRbNF09diplLU0qbyx0WzVdPXYqaS1NKnUsdFs2XT1jLHRbN109Zix0WzhdPWwsdH0sbWF0My5zY2FsZT1mdW5jdGlvbih0LG4scil7dmFyIGE9clswXSxvPXJbMV07cmV0dXJuIHRbMF09YSpuWzBdLHRbMV09YSpuWzFdLHRbMl09YSpuWzJdLHRbM109bypuWzNdLHRbNF09bypuWzRdLHRbNV09bypuWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHR9LG1hdDMuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09blswXSx0WzddPW5bMV0sdFs4XT0xLHR9LG1hdDMuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1hLHRbMV09cix0WzJdPTAsdFszXT0tcix0WzRdPWEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LG1hdDMuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09blsxXSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0sbWF0My5mcm9tTWF0MmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFswXT1uWzBdLHRbMV09blsxXSx0WzJdPTAsdFszXT1uWzJdLHRbNF09blszXSx0WzVdPTAsdFs2XT1uWzRdLHRbN109bls1XSx0WzhdPTEsdH0sbWF0My5mcm9tUXVhdD1mdW5jdGlvbih0LG4pe3ZhciByPW5bMF0sYT1uWzFdLG89blsyXSx1PW5bM10sbT1yK3IsZT1hK2EsaT1vK28sYz1yKm0sZj1hKm0sbD1hKmUsTT1vKm0sdj1vKmUsaD1vKmkscD11Km0scz11KmUsdz11Kmk7cmV0dXJuIHRbMF09MS1sLWgsdFszXT1mLXcsdFs2XT1NK3MsdFsxXT1mK3csdFs0XT0xLWMtaCx0WzddPXYtcCx0WzJdPU0tcyx0WzVdPXYrcCx0WzhdPTEtYy1sLHR9LG1hdDMubm9ybWFsRnJvbU1hdDQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1uWzBdLGE9blsxXSxvPW5bMl0sdT1uWzNdLG09bls0XSxlPW5bNV0saT1uWzZdLGM9bls3XSxmPW5bOF0sbD1uWzldLE09blsxMF0sdj1uWzExXSxoPW5bMTJdLHA9blsxM10scz1uWzE0XSx3PW5bMTVdLGQ9ciplLWEqbSxSPXIqaS1vKm0sZz1yKmMtdSptLHg9YSppLW8qZSx5PWEqYy11KmUsQT1vKmMtdSppLFk9ZipwLWwqaCxUPWYqcy1NKmgsaj1mKnctdipoLHE9bCpzLU0qcCxFPWwqdy12KnAsUD1NKnctdipzLF89ZCpQLVIqRStnKnEreCpqLXkqVCtBKlk7cmV0dXJuIF8/KF89MS9fLHRbMF09KGUqUC1pKkUrYypxKSpfLHRbMV09KGkqai1tKlAtYypUKSpfLHRbMl09KG0qRS1lKmorYypZKSpfLHRbM109KG8qRS1hKlAtdSpxKSpfLHRbNF09KHIqUC1vKmordSpUKSpfLHRbNV09KGEqai1yKkUtdSpZKSpfLHRbNl09KHAqQS1zKnkrdyp4KSpfLHRbN109KHMqZy1oKkEtdypSKSpfLHRbOF09KGgqeS1wKmcrdypkKSpfLHQpOm51bGx9LG1hdDMuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0MyhcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiKVwifSxtYXQzLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKSl9LG1vZHVsZS5leHBvcnRzPW1hdDM7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3fV0sMTIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksbWF0ND17fTttYXQ0LmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGE9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO3JldHVybiBhWzBdPXRbMF0sYVsxXT10WzFdLGFbMl09dFsyXSxhWzNdPXRbM10sYVs0XT10WzRdLGFbNV09dFs1XSxhWzZdPXRbNl0sYVs3XT10WzddLGFbOF09dFs4XSxhWzldPXRbOV0sYVsxMF09dFsxMF0sYVsxMV09dFsxMV0sYVsxMl09dFsxMl0sYVsxM109dFsxM10sYVsxNF09dFsxNF0sYVsxNV09dFsxNV0sYX0sbWF0NC5jb3B5PWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPWFbMV0sdFsyXT1hWzJdLHRbM109YVszXSx0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFs4XT1hWzhdLHRbOV09YVs5XSx0WzEwXT1hWzEwXSx0WzExXT1hWzExXSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxhKXtpZih0PT09YSl7dmFyIHI9YVsxXSxuPWFbMl0sbz1hWzNdLGU9YVs2XSxpPWFbN10sdT1hWzExXTt0WzFdPWFbNF0sdFsyXT1hWzhdLHRbM109YVsxMl0sdFs0XT1yLHRbNl09YVs5XSx0WzddPWFbMTNdLHRbOF09bix0WzldPWUsdFsxMV09YVsxNF0sdFsxMl09byx0WzEzXT1pLHRbMTRdPXV9ZWxzZSB0WzBdPWFbMF0sdFsxXT1hWzRdLHRbMl09YVs4XSx0WzNdPWFbMTJdLHRbNF09YVsxXSx0WzVdPWFbNV0sdFs2XT1hWzldLHRbN109YVsxM10sdFs4XT1hWzJdLHRbOV09YVs2XSx0WzEwXT1hWzEwXSx0WzExXT1hWzE0XSx0WzEyXT1hWzNdLHRbMTNdPWFbN10sdFsxNF09YVsxMV0sdFsxNV09YVsxNV07cmV0dXJuIHR9LG1hdDQuaW52ZXJ0PWZ1bmN0aW9uKHQsYSl7dmFyIHI9YVswXSxuPWFbMV0sbz1hWzJdLGU9YVszXSxpPWFbNF0sdT1hWzVdLE09YVs2XSxtPWFbN10saD1hWzhdLGM9YVs5XSxmPWFbMTBdLHM9YVsxMV0sbD1hWzEyXSx2PWFbMTNdLHA9YVsxNF0sdz1hWzE1XSxnPXIqdS1uKmksUD1yKk0tbyppLFI9ciptLWUqaSx4PW4qTS1vKnUsST1uKm0tZSp1LFM9byptLWUqTSxkPWgqdi1jKmwscT1oKnAtZipsLEU9aCp3LXMqbCxPPWMqcC1mKnYsYj1jKnctcyp2LFQ9Zip3LXMqcCxZPWcqVC1QKmIrUipPK3gqRS1JKnErUypkO3JldHVybiBZPyhZPTEvWSx0WzBdPSh1KlQtTSpiK20qTykqWSx0WzFdPShvKmItbipULWUqTykqWSx0WzJdPSh2KlMtcCpJK3cqeCkqWSx0WzNdPShmKkktYypTLXMqeCkqWSx0WzRdPShNKkUtaSpULW0qcSkqWSx0WzVdPShyKlQtbypFK2UqcSkqWSx0WzZdPShwKlItbCpTLXcqUCkqWSx0WzddPShoKlMtZipSK3MqUCkqWSx0WzhdPShpKmItdSpFK20qZCkqWSx0WzldPShuKkUtcipiLWUqZCkqWSx0WzEwXT0obCpJLXYqUit3KmcpKlksdFsxMV09KGMqUi1oKkktcypnKSpZLHRbMTJdPSh1KnEtaSpPLU0qZCkqWSx0WzEzXT0ocipPLW4qcStvKmQpKlksdFsxNF09KHYqUC1sKngtcCpnKSpZLHRbMTVdPShoKngtYypQK2YqZykqWSx0KTpudWxsfSxtYXQ0LmFkam9pbnQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9YVs0XSx1PWFbNV0sTT1hWzZdLG09YVs3XSxoPWFbOF0sYz1hWzldLGY9YVsxMF0scz1hWzExXSxsPWFbMTJdLHY9YVsxM10scD1hWzE0XSx3PWFbMTVdO3JldHVybiB0WzBdPXUqKGYqdy1zKnApLWMqKE0qdy1tKnApK3YqKE0qcy1tKmYpLHRbMV09LShuKihmKnctcypwKS1jKihvKnctZSpwKSt2KihvKnMtZSpmKSksdFsyXT1uKihNKnctbSpwKS11KihvKnctZSpwKSt2KihvKm0tZSpNKSx0WzNdPS0obiooTSpzLW0qZiktdSoobypzLWUqZikrYyoobyptLWUqTSkpLHRbNF09LShpKihmKnctcypwKS1oKihNKnctbSpwKStsKihNKnMtbSpmKSksdFs1XT1yKihmKnctcypwKS1oKihvKnctZSpwKStsKihvKnMtZSpmKSx0WzZdPS0ociooTSp3LW0qcCktaSoobyp3LWUqcCkrbCoobyptLWUqTSkpLHRbN109ciooTSpzLW0qZiktaSoobypzLWUqZikraCoobyptLWUqTSksdFs4XT1pKihjKnctcyp2KS1oKih1KnctbSp2KStsKih1KnMtbSpjKSx0WzldPS0ociooYyp3LXMqdiktaCoobip3LWUqdikrbCoobipzLWUqYykpLHRbMTBdPXIqKHUqdy1tKnYpLWkqKG4qdy1lKnYpK2wqKG4qbS1lKnUpLHRbMTFdPS0ocioodSpzLW0qYyktaSoobipzLWUqYykraCoobiptLWUqdSkpLHRbMTJdPS0oaSooYypwLWYqdiktaCoodSpwLU0qdikrbCoodSpmLU0qYykpLHRbMTNdPXIqKGMqcC1mKnYpLWgqKG4qcC1vKnYpK2wqKG4qZi1vKmMpLHRbMTRdPS0ocioodSpwLU0qdiktaSoobipwLW8qdikrbCoobipNLW8qdSkpLHRbMTVdPXIqKHUqZi1NKmMpLWkqKG4qZi1vKmMpK2gqKG4qTS1vKnUpLHR9LG1hdDQuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7dmFyIGE9dFswXSxyPXRbMV0sbj10WzJdLG89dFszXSxlPXRbNF0saT10WzVdLHU9dFs2XSxNPXRbN10sbT10WzhdLGg9dFs5XSxjPXRbMTBdLGY9dFsxMV0scz10WzEyXSxsPXRbMTNdLHY9dFsxNF0scD10WzE1XSx3PWEqaS1yKmUsZz1hKnUtbiplLFA9YSpNLW8qZSxSPXIqdS1uKmkseD1yKk0tbyppLEk9bipNLW8qdSxTPW0qbC1oKnMsZD1tKnYtYypzLHE9bSpwLWYqcyxFPWgqdi1jKmwsTz1oKnAtZipsLGI9YypwLWYqdjtyZXR1cm4gdypiLWcqTytQKkUrUipxLXgqZCtJKlN9LG1hdDQubXVsdGlwbHk9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPWFbMF0sbz1hWzFdLGU9YVsyXSxpPWFbM10sdT1hWzRdLE09YVs1XSxtPWFbNl0saD1hWzddLGM9YVs4XSxmPWFbOV0scz1hWzEwXSxsPWFbMTFdLHY9YVsxMl0scD1hWzEzXSx3PWFbMTRdLGc9YVsxNV0sUD1yWzBdLFI9clsxXSx4PXJbMl0sST1yWzNdO3JldHVybiB0WzBdPVAqbitSKnUreCpjK0kqdix0WzFdPVAqbytSKk0reCpmK0kqcCx0WzJdPVAqZStSKm0reCpzK0kqdyx0WzNdPVAqaStSKmgreCpsK0kqZyxQPXJbNF0sUj1yWzVdLHg9cls2XSxJPXJbN10sdFs0XT1QKm4rUip1K3gqYytJKnYsdFs1XT1QKm8rUipNK3gqZitJKnAsdFs2XT1QKmUrUiptK3gqcytJKncsdFs3XT1QKmkrUipoK3gqbCtJKmcsUD1yWzhdLFI9cls5XSx4PXJbMTBdLEk9clsxMV0sdFs4XT1QKm4rUip1K3gqYytJKnYsdFs5XT1QKm8rUipNK3gqZitJKnAsdFsxMF09UCplK1IqbSt4KnMrSSp3LHRbMTFdPVAqaStSKmgreCpsK0kqZyxQPXJbMTJdLFI9clsxM10seD1yWzE0XSxJPXJbMTVdLHRbMTJdPVAqbitSKnUreCpjK0kqdix0WzEzXT1QKm8rUipNK3gqZitJKnAsdFsxNF09UCplK1IqbSt4KnMrSSp3LHRbMTVdPVAqaStSKmgreCpsK0kqZyx0fSxtYXQ0Lm11bD1tYXQ0Lm11bHRpcGx5LG1hdDQudHJhbnNsYXRlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbixvLGUsaSx1LE0sbSxoLGMsZixzLGwsdj1yWzBdLHA9clsxXSx3PXJbMl07cmV0dXJuIGE9PT10Pyh0WzEyXT1hWzBdKnYrYVs0XSpwK2FbOF0qdythWzEyXSx0WzEzXT1hWzFdKnYrYVs1XSpwK2FbOV0qdythWzEzXSx0WzE0XT1hWzJdKnYrYVs2XSpwK2FbMTBdKncrYVsxNF0sdFsxNV09YVszXSp2K2FbN10qcCthWzExXSp3K2FbMTVdKToobj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9YVs0XSxNPWFbNV0sbT1hWzZdLGg9YVs3XSxjPWFbOF0sZj1hWzldLHM9YVsxMF0sbD1hWzExXSx0WzBdPW4sdFsxXT1vLHRbMl09ZSx0WzNdPWksdFs0XT11LHRbNV09TSx0WzZdPW0sdFs3XT1oLHRbOF09Yyx0WzldPWYsdFsxMF09cyx0WzExXT1sLHRbMTJdPW4qdit1KnArYyp3K2FbMTJdLHRbMTNdPW8qditNKnArZip3K2FbMTNdLHRbMTRdPWUqdittKnArcyp3K2FbMTRdLHRbMTVdPWkqditoKnArbCp3K2FbMTVdKSx0fSxtYXQ0LnNjYWxlPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1yWzBdLG89clsxXSxlPXJbMl07cmV0dXJuIHRbMF09YVswXSpuLHRbMV09YVsxXSpuLHRbMl09YVsyXSpuLHRbM109YVszXSpuLHRbNF09YVs0XSpvLHRbNV09YVs1XSpvLHRbNl09YVs2XSpvLHRbN109YVs3XSpvLHRbOF09YVs4XSplLHRbOV09YVs5XSplLHRbMTBdPWFbMTBdKmUsdFsxMV09YVsxMV0qZSx0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSx0fSxtYXQ0LnJvdGF0ZT1mdW5jdGlvbih0LGEscixuKXt2YXIgbyxlLGksdSxNLG0saCxjLGYscyxsLHYscCx3LGcsUCxSLHgsSSxTLGQscSxFLE8sYj1uWzBdLFQ9blsxXSxZPW5bMl0seT1NYXRoLnNxcnQoYipiK1QqVCtZKlkpO3JldHVybiBNYXRoLmFicyh5KTxnbE1hdHJpeC5FUFNJTE9OP251bGw6KHk9MS95LGIqPXksVCo9eSxZKj15LG89TWF0aC5zaW4ociksZT1NYXRoLmNvcyhyKSxpPTEtZSx1PWFbMF0sTT1hWzFdLG09YVsyXSxoPWFbM10sYz1hWzRdLGY9YVs1XSxzPWFbNl0sbD1hWzddLHY9YVs4XSxwPWFbOV0sdz1hWzEwXSxnPWFbMTFdLFA9YipiKmkrZSxSPVQqYippK1kqbyx4PVkqYippLVQqbyxJPWIqVCppLVkqbyxTPVQqVCppK2UsZD1ZKlQqaStiKm8scT1iKlkqaStUKm8sRT1UKlkqaS1iKm8sTz1ZKlkqaStlLHRbMF09dSpQK2MqUit2KngsdFsxXT1NKlArZipSK3AqeCx0WzJdPW0qUCtzKlIrdyp4LHRbM109aCpQK2wqUitnKngsdFs0XT11KkkrYypTK3YqZCx0WzVdPU0qSStmKlMrcCpkLHRbNl09bSpJK3MqUyt3KmQsdFs3XT1oKkkrbCpTK2cqZCx0WzhdPXUqcStjKkUrdipPLHRbOV09TSpxK2YqRStwKk8sdFsxMF09bSpxK3MqRSt3Kk8sdFsxMV09aCpxK2wqRStnKk8sYSE9PXQmJih0WzEyXT1hWzEyXSx0WzEzXT1hWzEzXSx0WzE0XT1hWzE0XSx0WzE1XT1hWzE1XSksdCl9LG1hdDQucm90YXRlWD1mdW5jdGlvbih0LGEscil7dmFyIG49TWF0aC5zaW4ociksbz1NYXRoLmNvcyhyKSxlPWFbNF0saT1hWzVdLHU9YVs2XSxNPWFbN10sbT1hWzhdLGg9YVs5XSxjPWFbMTBdLGY9YVsxMV07cmV0dXJuIGEhPT10JiYodFswXT1hWzBdLHRbMV09YVsxXSx0WzJdPWFbMl0sdFszXT1hWzNdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzRdPWUqbyttKm4sdFs1XT1pKm8raCpuLHRbNl09dSpvK2Mqbix0WzddPU0qbytmKm4sdFs4XT1tKm8tZSpuLHRbOV09aCpvLWkqbix0WzEwXT1jKm8tdSpuLHRbMTFdPWYqby1NKm4sdH0sbWF0NC5yb3RhdGVZPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1NYXRoLnNpbihyKSxvPU1hdGguY29zKHIpLGU9YVswXSxpPWFbMV0sdT1hWzJdLE09YVszXSxtPWFbOF0saD1hWzldLGM9YVsxMF0sZj1hWzExXTtyZXR1cm4gYSE9PXQmJih0WzRdPWFbNF0sdFs1XT1hWzVdLHRbNl09YVs2XSx0WzddPWFbN10sdFsxMl09YVsxMl0sdFsxM109YVsxM10sdFsxNF09YVsxNF0sdFsxNV09YVsxNV0pLHRbMF09ZSpvLW0qbix0WzFdPWkqby1oKm4sdFsyXT11Km8tYypuLHRbM109TSpvLWYqbix0WzhdPWUqbittKm8sdFs5XT1pKm4raCpvLHRbMTBdPXUqbitjKm8sdFsxMV09TSpuK2Yqbyx0fSxtYXQ0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLHIpe3ZhciBuPU1hdGguc2luKHIpLG89TWF0aC5jb3MociksZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09YVs0XSxoPWFbNV0sYz1hWzZdLGY9YVs3XTtyZXR1cm4gYSE9PXQmJih0WzhdPWFbOF0sdFs5XT1hWzldLHRbMTBdPWFbMTBdLHRbMTFdPWFbMTFdLHRbMTJdPWFbMTJdLHRbMTNdPWFbMTNdLHRbMTRdPWFbMTRdLHRbMTVdPWFbMTVdKSx0WzBdPWUqbyttKm4sdFsxXT1pKm8raCpuLHRbMl09dSpvK2Mqbix0WzNdPU0qbytmKm4sdFs0XT1tKm8tZSpuLHRbNV09aCpvLWkqbix0WzZdPWMqby11Km4sdFs3XT1mKm8tTSpuLHR9LG1hdDQuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09YVswXSx0WzEzXT1hWzFdLHRbMTRdPWFbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsYSl7cmV0dXJuIHRbMF09YVswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hWzFdLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT1hWzJdLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGEscil7dmFyIG4sbyxlLGk9clswXSx1PXJbMV0sTT1yWzJdLG09TWF0aC5zcXJ0KGkqaSt1KnUrTSpNKTtyZXR1cm4gTWF0aC5hYnMobSk8Z2xNYXRyaXguRVBTSUxPTj9udWxsOihtPTEvbSxpKj1tLHUqPW0sTSo9bSxuPU1hdGguc2luKGEpLG89TWF0aC5jb3MoYSksZT0xLW8sdFswXT1pKmkqZStvLHRbMV09dSppKmUrTSpuLHRbMl09TSppKmUtdSpuLHRbM109MCx0WzRdPWkqdSplLU0qbix0WzVdPXUqdSplK28sdFs2XT1NKnUqZStpKm4sdFs3XT0wLHRbOF09aSpNKmUrdSpuLHRbOV09dSpNKmUtaSpuLHRbMTBdPU0qTSplK28sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHQpfSxtYXQ0LmZyb21YUm90YXRpb249ZnVuY3Rpb24odCxhKXt2YXIgcj1NYXRoLnNpbihhKSxuPU1hdGguY29zKGEpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09bix0WzZdPXIsdFs3XT0wLHRbOF09MCx0WzldPS1yLHRbMTBdPW4sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LG1hdDQuZnJvbVlSb3RhdGlvbj1mdW5jdGlvbih0LGEpe3ZhciByPU1hdGguc2luKGEpLG49TWF0aC5jb3MoYSk7cmV0dXJuIHRbMF09bix0WzFdPTAsdFsyXT0tcix0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09cix0WzldPTAsdFsxMF09bix0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcm9tWlJvdGF0aW9uPWZ1bmN0aW9uKHQsYSl7dmFyIHI9TWF0aC5zaW4oYSksbj1NYXRoLmNvcyhhKTtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPTAsdFszXT0wLHRbNF09LXIsdFs1XT1uLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsYSxyKXt2YXIgbj1hWzBdLG89YVsxXSxlPWFbMl0saT1hWzNdLHU9bituLE09bytvLG09ZStlLGg9bip1LGM9bipNLGY9biptLHM9bypNLGw9byptLHY9ZSptLHA9aSp1LHc9aSpNLGc9aSptO3JldHVybiB0WzBdPTEtKHMrdiksdFsxXT1jK2csdFsyXT1mLXcsdFszXT0wLHRbNF09Yy1nLHRbNV09MS0oaCt2KSx0WzZdPWwrcCx0WzddPTAsdFs4XT1mK3csdFs5XT1sLXAsdFsxMF09MS0oaCtzKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH0sbWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlPWZ1bmN0aW9uKHQsYSxyLG4pe3ZhciBvPWFbMF0sZT1hWzFdLGk9YVsyXSx1PWFbM10sTT1vK28sbT1lK2UsaD1pK2ksYz1vKk0sZj1vKm0scz1vKmgsbD1lKm0sdj1lKmgscD1pKmgsdz11Kk0sZz11Km0sUD11KmgsUj1uWzBdLHg9blsxXSxJPW5bMl07cmV0dXJuIHRbMF09KDEtKGwrcCkpKlIsdFsxXT0oZitQKSpSLHRbMl09KHMtZykqUix0WzNdPTAsdFs0XT0oZi1QKSp4LHRbNV09KDEtKGMrcCkpKngsdFs2XT0odit3KSp4LHRbN109MCx0WzhdPShzK2cpKkksdFs5XT0odi13KSpJLHRbMTBdPSgxLShjK2wpKSpJLHRbMTFdPTAsdFsxMl09clswXSx0WzEzXT1yWzFdLHRbMTRdPXJbMl0sdFsxNV09MSx0fSxtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW49ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT1hWzBdLGk9YVsxXSx1PWFbMl0sTT1hWzNdLG09ZStlLGg9aStpLGM9dSt1LGY9ZSptLHM9ZSpoLGw9ZSpjLHY9aSpoLHA9aSpjLHc9dSpjLGc9TSptLFA9TSpoLFI9TSpjLHg9blswXSxJPW5bMV0sUz1uWzJdLGQ9b1swXSxxPW9bMV0sRT1vWzJdO3JldHVybiB0WzBdPSgxLSh2K3cpKSp4LHRbMV09KHMrUikqeCx0WzJdPShsLVApKngsdFszXT0wLHRbNF09KHMtUikqSSx0WzVdPSgxLShmK3cpKSpJLHRbNl09KHArZykqSSx0WzddPTAsdFs4XT0obCtQKSpTLHRbOV09KHAtZykqUyx0WzEwXT0oMS0oZit2KSkqUyx0WzExXT0wLHRbMTJdPXJbMF0rZC0odFswXSpkK3RbNF0qcSt0WzhdKkUpLHRbMTNdPXJbMV0rcS0odFsxXSpkK3RbNV0qcSt0WzldKkUpLHRbMTRdPXJbMl0rRS0odFsyXSpkK3RbNl0qcSt0WzEwXSpFKSx0WzE1XT0xLHR9LG1hdDQuZnJvbVF1YXQ9ZnVuY3Rpb24odCxhKXt2YXIgcj1hWzBdLG49YVsxXSxvPWFbMl0sZT1hWzNdLGk9cityLHU9bituLE09bytvLG09cippLGg9bippLGM9bip1LGY9byppLHM9byp1LGw9bypNLHY9ZSppLHA9ZSp1LHc9ZSpNO3JldHVybiB0WzBdPTEtYy1sLHRbMV09aCt3LHRbMl09Zi1wLHRbM109MCx0WzRdPWgtdyx0WzVdPTEtbS1sLHRbNl09cyt2LHRbN109MCx0WzhdPWYrcCx0WzldPXMtdix0WzEwXT0xLW0tYyx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0sbWF0NC5mcnVzdHVtPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKHItYSksTT0xLyhvLW4pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0yKmUqdSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0yKmUqTSx0WzZdPTAsdFs3XT0wLHRbOF09KHIrYSkqdSx0WzldPShvK24pKk0sdFsxMF09KGkrZSkqbSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09aSplKjIqbSx0WzE1XT0wLHR9LG1hdDQucGVyc3BlY3RpdmU9ZnVuY3Rpb24odCxhLHIsbixvKXt2YXIgZT0xL01hdGgudGFuKGEvMiksaT0xLyhuLW8pO3JldHVybiB0WzBdPWUvcix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1lLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0obytuKSppLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKm8qbippLHRbMTVdPTAsdH0sbWF0NC5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldz1mdW5jdGlvbih0LGEscixuKXt2YXIgbz1NYXRoLnRhbihhLnVwRGVncmVlcypNYXRoLlBJLzE4MCksZT1NYXRoLnRhbihhLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxpPU1hdGgudGFuKGEubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHU9TWF0aC50YW4oYS5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLE09Mi8oaSt1KSxtPTIvKG8rZSk7cmV0dXJuIHRbMF09TSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1tLHRbNl09MCx0WzddPTAsdFs4XT0tKChpLXUpKk0qLjUpLHRbOV09KG8tZSkqbSouNSx0WzEwXT1uLyhyLW4pLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT1uKnIvKHItbiksdFsxNV09MCx0fSxtYXQ0Lm9ydGhvPWZ1bmN0aW9uKHQsYSxyLG4sbyxlLGkpe3ZhciB1PTEvKGEtciksTT0xLyhuLW8pLG09MS8oZS1pKTtyZXR1cm4gdFswXT0tMip1LHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKk0sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqbSx0WzExXT0wLHRbMTJdPShhK3IpKnUsdFsxM109KG8rbikqTSx0WzE0XT0oaStlKSptLHRbMTVdPTEsdH0sbWF0NC5sb29rQXQ9ZnVuY3Rpb24odCxhLHIsbil7dmFyIG8sZSxpLHUsTSxtLGgsYyxmLHMsbD1hWzBdLHY9YVsxXSxwPWFbMl0sdz1uWzBdLGc9blsxXSxQPW5bMl0sUj1yWzBdLHg9clsxXSxJPXJbMl07cmV0dXJuIE1hdGguYWJzKGwtUik8Z2xNYXRyaXguRVBTSUxPTiYmTWF0aC5hYnModi14KTxnbE1hdHJpeC5FUFNJTE9OJiZNYXRoLmFicyhwLUkpPGdsTWF0cml4LkVQU0lMT04/bWF0NC5pZGVudGl0eSh0KTooaD1sLVIsYz12LXgsZj1wLUkscz0xL01hdGguc3FydChoKmgrYypjK2YqZiksaCo9cyxjKj1zLGYqPXMsbz1nKmYtUCpjLGU9UCpoLXcqZixpPXcqYy1nKmgscz1NYXRoLnNxcnQobypvK2UqZStpKmkpLHM/KHM9MS9zLG8qPXMsZSo9cyxpKj1zKToobz0wLGU9MCxpPTApLHU9YyppLWYqZSxNPWYqby1oKmksbT1oKmUtYypvLHM9TWF0aC5zcXJ0KHUqdStNKk0rbSptKSxzPyhzPTEvcyx1Kj1zLE0qPXMsbSo9cyk6KHU9MCxNPTAsbT0wKSx0WzBdPW8sdFsxXT11LHRbMl09aCx0WzNdPTAsdFs0XT1lLHRbNV09TSx0WzZdPWMsdFs3XT0wLHRbOF09aSx0WzldPW0sdFsxMF09Zix0WzExXT0wLHRbMTJdPS0obypsK2UqditpKnApLHRbMTNdPS0odSpsK00qdittKnApLHRbMTRdPS0oaCpsK2MqditmKnApLHRbMTVdPTEsdCl9LG1hdDQuc3RyPWZ1bmN0aW9uKHQpe3JldHVyblwibWF0NChcIit0WzBdK1wiLCBcIit0WzFdK1wiLCBcIit0WzJdK1wiLCBcIit0WzNdK1wiLCBcIit0WzRdK1wiLCBcIit0WzVdK1wiLCBcIit0WzZdK1wiLCBcIit0WzddK1wiLCBcIit0WzhdK1wiLCBcIit0WzldK1wiLCBcIit0WzEwXStcIiwgXCIrdFsxMV0rXCIsIFwiK3RbMTJdK1wiLCBcIit0WzEzXStcIiwgXCIrdFsxNF0rXCIsIFwiK3RbMTVdK1wiKVwifSxtYXQ0LmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKStNYXRoLnBvdyh0WzldLDIpK01hdGgucG93KHRbMTBdLDIpK01hdGgucG93KHRbMTFdLDIpK01hdGgucG93KHRbMTJdLDIpK01hdGgucG93KHRbMTNdLDIpK01hdGgucG93KHRbMTRdLDIpK01hdGgucG93KHRbMTVdLDIpKX0sbW9kdWxlLmV4cG9ydHM9bWF0NDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSxtYXQzPXJlcXVpcmUoXCIuL21hdDMuanNcIiksdmVjMz1yZXF1aXJlKFwiLi92ZWMzLmpzXCIpLHZlYzQ9cmVxdWlyZShcIi4vdmVjNC5qc1wiKSxxdWF0PXt9O3F1YXQuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MCx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxxdWF0LnJvdGF0aW9uVG89ZnVuY3Rpb24oKXt2YXIgdD12ZWMzLmNyZWF0ZSgpLGE9dmVjMy5mcm9tVmFsdWVzKDEsMCwwKSxlPXZlYzMuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKHIsdSxuKXt2YXIgYz12ZWMzLmRvdCh1LG4pO3JldHVybi0uOTk5OTk5PmM/KHZlYzMuY3Jvc3ModCxhLHUpLHZlYzMubGVuZ3RoKHQpPDFlLTYmJnZlYzMuY3Jvc3ModCxlLHUpLHZlYzMubm9ybWFsaXplKHQsdCkscXVhdC5zZXRBeGlzQW5nbGUocix0LE1hdGguUEkpLHIpOmM+Ljk5OTk5OT8oclswXT0wLHJbMV09MCxyWzJdPTAsclszXT0xLHIpOih2ZWMzLmNyb3NzKHQsdSxuKSxyWzBdPXRbMF0sclsxXT10WzFdLHJbMl09dFsyXSxyWzNdPTErYyxxdWF0Lm5vcm1hbGl6ZShyLHIpKX19KCkscXVhdC5zZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bWF0My5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oYSxlLHIsdSl7cmV0dXJuIHRbMF09clswXSx0WzNdPXJbMV0sdFs2XT1yWzJdLHRbMV09dVswXSx0WzRdPXVbMV0sdFs3XT11WzJdLHRbMl09LWVbMF0sdFs1XT0tZVsxXSx0WzhdPS1lWzJdLHF1YXQubm9ybWFsaXplKGEscXVhdC5mcm9tTWF0MyhhLHQpKX19KCkscXVhdC5jbG9uZT12ZWM0LmNsb25lLHF1YXQuZnJvbVZhbHVlcz12ZWM0LmZyb21WYWx1ZXMscXVhdC5jb3B5PXZlYzQuY29weSxxdWF0LnNldD12ZWM0LnNldCxxdWF0LmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0scXVhdC5zZXRBeGlzQW5nbGU9ZnVuY3Rpb24odCxhLGUpe2U9LjUqZTt2YXIgcj1NYXRoLnNpbihlKTtyZXR1cm4gdFswXT1yKmFbMF0sdFsxXT1yKmFbMV0sdFsyXT1yKmFbMl0sdFszXT1NYXRoLmNvcyhlKSx0fSxxdWF0LmFkZD12ZWM0LmFkZCxxdWF0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsYSxlKXt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9ZVswXSxvPWVbMV0scz1lWzJdLGk9ZVszXTtyZXR1cm4gdFswXT1yKmkrYypxK3Uqcy1uKm8sdFsxXT11KmkrYypvK24qcS1yKnMsdFsyXT1uKmkrYypzK3Iqby11KnEsdFszXT1jKmktcipxLXUqby1uKnMsdH0scXVhdC5tdWw9cXVhdC5tdWx0aXBseSxxdWF0LnNjYWxlPXZlYzQuc2NhbGUscXVhdC5yb3RhdGVYPWZ1bmN0aW9uKHQsYSxlKXtlKj0uNTt2YXIgcj1hWzBdLHU9YVsxXSxuPWFbMl0sYz1hWzNdLHE9TWF0aC5zaW4oZSksbz1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1yKm8rYypxLHRbMV09dSpvK24qcSx0WzJdPW4qby11KnEsdFszXT1jKm8tcipxLHR9LHF1YXQucm90YXRlWT1mdW5jdGlvbih0LGEsZSl7ZSo9LjU7dmFyIHI9YVswXSx1PWFbMV0sbj1hWzJdLGM9YVszXSxxPU1hdGguc2luKGUpLG89TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09cipvLW4qcSx0WzFdPXUqbytjKnEsdFsyXT1uKm8rcipxLHRbM109YypvLXUqcSx0fSxxdWF0LnJvdGF0ZVo9ZnVuY3Rpb24odCxhLGUpe2UqPS41O3ZhciByPWFbMF0sdT1hWzFdLG49YVsyXSxjPWFbM10scT1NYXRoLnNpbihlKSxvPU1hdGguY29zKGUpO3JldHVybiB0WzBdPXIqbyt1KnEsdFsxXT11Km8tcipxLHRbMl09bipvK2MqcSx0WzNdPWMqby1uKnEsdH0scXVhdC5jYWxjdWxhdGVXPWZ1bmN0aW9uKHQsYSl7dmFyIGU9YVswXSxyPWFbMV0sdT1hWzJdO3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09dSx0WzNdPU1hdGguc3FydChNYXRoLmFicygxLWUqZS1yKnItdSp1KSksdH0scXVhdC5kb3Q9dmVjNC5kb3QscXVhdC5sZXJwPXZlYzQubGVycCxxdWF0LnNsZXJwPWZ1bmN0aW9uKHQsYSxlLHIpe3ZhciB1LG4sYyxxLG8scz1hWzBdLGk9YVsxXSx2PWFbMl0sbD1hWzNdLGY9ZVswXSxoPWVbMV0sTT1lWzJdLG09ZVszXTtyZXR1cm4gbj1zKmYraSpoK3YqTStsKm0sMD5uJiYobj0tbixmPS1mLGg9LWgsTT0tTSxtPS1tKSwxLW4+MWUtNj8odT1NYXRoLmFjb3MobiksYz1NYXRoLnNpbih1KSxxPU1hdGguc2luKCgxLXIpKnUpL2Msbz1NYXRoLnNpbihyKnUpL2MpOihxPTEtcixvPXIpLHRbMF09cSpzK28qZix0WzFdPXEqaStvKmgsdFsyXT1xKnYrbypNLHRbM109cSpsK28qbSx0fSxxdWF0LnNxbGVycD1mdW5jdGlvbigpe3ZhciB0PXF1YXQuY3JlYXRlKCksYT1xdWF0LmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsdSxuLGMscSl7cmV0dXJuIHF1YXQuc2xlcnAodCxyLGMscSkscXVhdC5zbGVycChhLHUsbixxKSxxdWF0LnNsZXJwKGUsdCxhLDIqcSooMS1xKSksZX19KCkscXVhdC5pbnZlcnQ9ZnVuY3Rpb24odCxhKXt2YXIgZT1hWzBdLHI9YVsxXSx1PWFbMl0sbj1hWzNdLGM9ZSplK3Iqcit1KnUrbipuLHE9Yz8xL2M6MDtyZXR1cm4gdFswXT0tZSpxLHRbMV09LXIqcSx0WzJdPS11KnEsdFszXT1uKnEsdH0scXVhdC5jb25qdWdhdGU9ZnVuY3Rpb24odCxhKXtyZXR1cm4gdFswXT0tYVswXSx0WzFdPS1hWzFdLHRbMl09LWFbMl0sdFszXT1hWzNdLHR9LHF1YXQubGVuZ3RoPXZlYzQubGVuZ3RoLHF1YXQubGVuPXF1YXQubGVuZ3RoLHF1YXQuc3F1YXJlZExlbmd0aD12ZWM0LnNxdWFyZWRMZW5ndGgscXVhdC5zcXJMZW49cXVhdC5zcXVhcmVkTGVuZ3RoLHF1YXQubm9ybWFsaXplPXZlYzQubm9ybWFsaXplLHF1YXQuZnJvbU1hdDM9ZnVuY3Rpb24odCxhKXt2YXIgZSxyPWFbMF0rYVs0XSthWzhdO2lmKHI+MCllPU1hdGguc3FydChyKzEpLHRbM109LjUqZSxlPS41L2UsdFswXT0oYVs1XS1hWzddKSplLHRbMV09KGFbNl0tYVsyXSkqZSx0WzJdPShhWzFdLWFbM10pKmU7ZWxzZXt2YXIgdT0wO2FbNF0+YVswXSYmKHU9MSksYVs4XT5hWzMqdSt1XSYmKHU9Mik7dmFyIG49KHUrMSklMyxjPSh1KzIpJTM7ZT1NYXRoLnNxcnQoYVszKnUrdV0tYVszKm4rbl0tYVszKmMrY10rMSksdFt1XT0uNSplLGU9LjUvZSx0WzNdPShhWzMqbitjXS1hWzMqYytuXSkqZSx0W25dPShhWzMqbit1XSthWzMqdStuXSkqZSx0W2NdPShhWzMqYyt1XSthWzMqdStjXSkqZX1yZXR1cm4gdH0scXVhdC5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuXCJxdWF0KFwiK3RbMF0rXCIsIFwiK3RbMV0rXCIsIFwiK3RbMl0rXCIsIFwiK3RbM10rXCIpXCJ9LG1vZHVsZS5leHBvcnRzPXF1YXQ7XG59LHtcIi4vY29tbW9uLmpzXCI6MTE3LFwiLi9tYXQzLmpzXCI6MTIwLFwiLi92ZWMzLmpzXCI6MTI0LFwiLi92ZWM0LmpzXCI6MTI1fV0sMTIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBnbE1hdHJpeD1yZXF1aXJlKFwiLi9jb21tb24uanNcIiksdmVjMj17fTt2ZWMyLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBuPW5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO3JldHVybiBuWzBdPTAsblsxXT0wLG59LHZlYzIuY2xvbmU9ZnVuY3Rpb24obil7dmFyIGU9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZX0sdmVjMi5mcm9tVmFsdWVzPWZ1bmN0aW9uKG4sZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7cmV0dXJuIHJbMF09bixyWzFdPWUscn0sdmVjMi5jb3B5PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sbn0sdmVjMi5zZXQ9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWUsblsxXT1yLG59LHZlYzIuYWRkPWZ1bmN0aW9uKG4sZSxyKXtyZXR1cm4gblswXT1lWzBdK3JbMF0sblsxXT1lWzFdK3JbMV0sbn0sdmVjMi5zdWJ0cmFjdD1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXS1yWzBdLG5bMV09ZVsxXS1yWzFdLG59LHZlYzIuc3ViPXZlYzIuc3VidHJhY3QsdmVjMi5tdWx0aXBseT1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09ZVswXSpyWzBdLG5bMV09ZVsxXSpyWzFdLG59LHZlYzIubXVsPXZlYzIubXVsdGlwbHksdmVjMi5kaXZpZGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0vclswXSxuWzFdPWVbMV0vclsxXSxufSx2ZWMyLmRpdj12ZWMyLmRpdmlkZSx2ZWMyLm1pbj1mdW5jdGlvbihuLGUscil7cmV0dXJuIG5bMF09TWF0aC5taW4oZVswXSxyWzBdKSxuWzFdPU1hdGgubWluKGVbMV0sclsxXSksbn0sdmVjMi5tYXg9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPU1hdGgubWF4KGVbMF0sclswXSksblsxXT1NYXRoLm1heChlWzFdLHJbMV0pLG59LHZlYzIuc2NhbGU9ZnVuY3Rpb24obixlLHIpe3JldHVybiBuWzBdPWVbMF0qcixuWzFdPWVbMV0qcixufSx2ZWMyLnNjYWxlQW5kQWRkPWZ1bmN0aW9uKG4sZSxyLHQpe3JldHVybiBuWzBdPWVbMF0rclswXSp0LG5bMV09ZVsxXStyWzFdKnQsbn0sdmVjMi5kaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcit0KnQpfSx2ZWMyLmRpc3Q9dmVjMi5kaXN0YW5jZSx2ZWMyLnNxdWFyZWREaXN0YW5jZT1mdW5jdGlvbihuLGUpe3ZhciByPWVbMF0tblswXSx0PWVbMV0tblsxXTtyZXR1cm4gcipyK3QqdH0sdmVjMi5zcXJEaXN0PXZlYzIuc3F1YXJlZERpc3RhbmNlLHZlYzIubGVuZ3RoPWZ1bmN0aW9uKG4pe3ZhciBlPW5bMF0scj1uWzFdO3JldHVybiBNYXRoLnNxcnQoZSplK3Iqcil9LHZlYzIubGVuPXZlYzIubGVuZ3RoLHZlYzIuc3F1YXJlZExlbmd0aD1mdW5jdGlvbihuKXt2YXIgZT1uWzBdLHI9blsxXTtyZXR1cm4gZSplK3Iqcn0sdmVjMi5zcXJMZW49dmVjMi5zcXVhcmVkTGVuZ3RoLHZlYzIubmVnYXRlPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF09LWVbMF0sblsxXT0tZVsxXSxufSx2ZWMyLmludmVyc2U9ZnVuY3Rpb24obixlKXtyZXR1cm4gblswXT0xL2VbMF0sblsxXT0xL2VbMV0sbn0sdmVjMi5ub3JtYWxpemU9ZnVuY3Rpb24obixlKXt2YXIgcj1lWzBdLHQ9ZVsxXSxjPXIqcit0KnQ7cmV0dXJuIGM+MCYmKGM9MS9NYXRoLnNxcnQoYyksblswXT1lWzBdKmMsblsxXT1lWzFdKmMpLG59LHZlYzIuZG90PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG5bMF0qZVswXStuWzFdKmVbMV19LHZlYzIuY3Jvc3M9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0qclsxXS1lWzFdKnJbMF07cmV0dXJuIG5bMF09blsxXT0wLG5bMl09dCxufSx2ZWMyLmxlcnA9ZnVuY3Rpb24obixlLHIsdCl7dmFyIGM9ZVswXSx1PWVbMV07cmV0dXJuIG5bMF09Yyt0KihyWzBdLWMpLG5bMV09dSt0KihyWzFdLXUpLG59LHZlYzIucmFuZG9tPWZ1bmN0aW9uKG4sZSl7ZT1lfHwxO3ZhciByPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSTtyZXR1cm4gblswXT1NYXRoLmNvcyhyKSplLG5bMV09TWF0aC5zaW4ocikqZSxufSx2ZWMyLnRyYW5zZm9ybU1hdDI9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMsblsxXT1yWzFdKnQrclszXSpjLG59LHZlYzIudHJhbnNmb3JtTWF0MmQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzJdKmMrcls0XSxuWzFdPXJbMV0qdCtyWzNdKmMrcls1XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzNdKmMrcls2XSxuWzFdPXJbMV0qdCtyWzRdKmMrcls3XSxufSx2ZWMyLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obixlLHIpe3ZhciB0PWVbMF0sYz1lWzFdO3JldHVybiBuWzBdPXJbMF0qdCtyWzRdKmMrclsxMl0sblsxXT1yWzFdKnQrcls1XSpjK3JbMTNdLG59LHZlYzIuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBuPXZlYzIuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKGUscix0LGMsdSx2KXt2YXIgYSxpO2ZvcihyfHwocj0yKSx0fHwodD0wKSxpPWM/TWF0aC5taW4oYypyK3QsZS5sZW5ndGgpOmUubGVuZ3RoLGE9dDtpPmE7YSs9ciluWzBdPWVbYV0sblsxXT1lW2ErMV0sdShuLG4sdiksZVthXT1uWzBdLGVbYSsxXT1uWzFdO3JldHVybiBlfX0oKSx2ZWMyLnN0cj1mdW5jdGlvbihuKXtyZXR1cm5cInZlYzIoXCIrblswXStcIiwgXCIrblsxXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjMjtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGdsTWF0cml4PXJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKSx2ZWMzPXt9O3ZlYzMuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIG5bMF09MCxuWzFdPTAsblsyXT0wLG59LHZlYzMuY2xvbmU9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHR9LHZlYzMuZnJvbVZhbHVlcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7cmV0dXJuIHJbMF09bixyWzFdPXQsclsyXT1lLHJ9LHZlYzMuY29weT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxufSx2ZWMzLnNldD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10LG5bMV09ZSxuWzJdPXIsbn0sdmVjMy5hZGQ9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPXRbMF0rZVswXSxuWzFdPXRbMV0rZVsxXSxuWzJdPXRbMl0rZVsyXSxufSx2ZWMzLnN1YnRyYWN0PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdLWVbMF0sblsxXT10WzFdLWVbMV0sblsyXT10WzJdLWVbMl0sbn0sdmVjMy5zdWI9dmVjMy5zdWJ0cmFjdCx2ZWMzLm11bHRpcGx5PWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmVbMF0sblsxXT10WzFdKmVbMV0sblsyXT10WzJdKmVbMl0sbn0sdmVjMy5tdWw9dmVjMy5tdWx0aXBseSx2ZWMzLmRpdmlkZT1mdW5jdGlvbihuLHQsZSl7cmV0dXJuIG5bMF09dFswXS9lWzBdLG5bMV09dFsxXS9lWzFdLG5bMl09dFsyXS9lWzJdLG59LHZlYzMuZGl2PXZlYzMuZGl2aWRlLHZlYzMubWluPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT1NYXRoLm1pbih0WzBdLGVbMF0pLG5bMV09TWF0aC5taW4odFsxXSxlWzFdKSxuWzJdPU1hdGgubWluKHRbMl0sZVsyXSksbn0sdmVjMy5tYXg9ZnVuY3Rpb24obix0LGUpe3JldHVybiBuWzBdPU1hdGgubWF4KHRbMF0sZVswXSksblsxXT1NYXRoLm1heCh0WzFdLGVbMV0pLG5bMl09TWF0aC5tYXgodFsyXSxlWzJdKSxufSx2ZWMzLnNjYWxlPWZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsbn0sdmVjMy5zY2FsZUFuZEFkZD1mdW5jdGlvbihuLHQsZSxyKXtyZXR1cm4gblswXT10WzBdK2VbMF0qcixuWzFdPXRbMV0rZVsxXSpyLG5bMl09dFsyXStlWzJdKnIsbn0sdmVjMy5kaXN0YW5jZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0tblswXSxyPXRbMV0tblsxXSxjPXRbMl0tblsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrYypjKX0sdmVjMy5kaXN0PXZlYzMuZGlzdGFuY2UsdmVjMy5zcXVhcmVkRGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZT10WzBdLW5bMF0scj10WzFdLW5bMV0sYz10WzJdLW5bMl07cmV0dXJuIGUqZStyKnIrYypjfSx2ZWMzLnNxckRpc3Q9dmVjMy5zcXVhcmVkRGlzdGFuY2UsdmVjMy5sZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiBNYXRoLnNxcnQodCp0K2UqZStyKnIpfSx2ZWMzLmxlbj12ZWMzLmxlbmd0aCx2ZWMzLnNxdWFyZWRMZW5ndGg9ZnVuY3Rpb24obil7dmFyIHQ9blswXSxlPW5bMV0scj1uWzJdO3JldHVybiB0KnQrZSplK3Iqcn0sdmVjMy5zcXJMZW49dmVjMy5zcXVhcmVkTGVuZ3RoLHZlYzMubmVnYXRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG5bMF09LXRbMF0sblsxXT0tdFsxXSxuWzJdPS10WzJdLG59LHZlYzMuaW52ZXJzZT1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdPTEvdFswXSxuWzFdPTEvdFsxXSxuWzJdPTEvdFsyXSxufSx2ZWMzLm5vcm1hbGl6ZT1mdW5jdGlvbihuLHQpe3ZhciBlPXRbMF0scj10WzFdLGM9dFsyXSxhPWUqZStyKnIrYypjO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpLG5bMF09dFswXSphLG5bMV09dFsxXSphLG5bMl09dFsyXSphKSxufSx2ZWMzLmRvdD1mdW5jdGlvbihuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX0sdmVjMy5jcm9zcz1mdW5jdGlvbihuLHQsZSl7dmFyIHI9dFswXSxjPXRbMV0sYT10WzJdLHU9ZVswXSx2PWVbMV0saT1lWzJdO3JldHVybiBuWzBdPWMqaS1hKnYsblsxXT1hKnUtcippLG5bMl09cip2LWMqdSxufSx2ZWMzLmxlcnA9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9dFswXSxhPXRbMV0sdT10WzJdO3JldHVybiBuWzBdPWMrciooZVswXS1jKSxuWzFdPWErciooZVsxXS1hKSxuWzJdPXUrciooZVsyXS11KSxufSx2ZWMzLmhlcm1pdGU9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PWEqYSx2PXUqKDIqYS0zKSsxLGk9dSooYS0yKSthLG89dSooYS0xKSxzPXUqKDMtMiphKTtyZXR1cm4gblswXT10WzBdKnYrZVswXSppK3JbMF0qbytjWzBdKnMsblsxXT10WzFdKnYrZVsxXSppK3JbMV0qbytjWzFdKnMsblsyXT10WzJdKnYrZVsyXSppK3JbMl0qbytjWzJdKnMsbn0sdmVjMy5iZXppZXI9ZnVuY3Rpb24obix0LGUscixjLGEpe3ZhciB1PTEtYSx2PXUqdSxpPWEqYSxvPXYqdSxzPTMqYSp2LGY9MyppKnUsTT1pKmE7cmV0dXJuIG5bMF09dFswXSpvK2VbMF0qcytyWzBdKmYrY1swXSpNLG5bMV09dFsxXSpvK2VbMV0qcytyWzFdKmYrY1sxXSpNLG5bMl09dFsyXSpvK2VbMl0qcytyWzJdKmYrY1syXSpNLG59LHZlYzMucmFuZG9tPWZ1bmN0aW9uKG4sdCl7dD10fHwxO3ZhciBlPTIqZ2xNYXRyaXguUkFORE9NKCkqTWF0aC5QSSxyPTIqZ2xNYXRyaXguUkFORE9NKCktMSxjPU1hdGguc3FydCgxLXIqcikqdDtyZXR1cm4gblswXT1NYXRoLmNvcyhlKSpjLG5bMV09TWF0aC5zaW4oZSkqYyxuWzJdPXIqdCxufSx2ZWMzLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXSx1PWVbM10qcitlWzddKmMrZVsxMV0qYStlWzE1XTtyZXR1cm4gdT11fHwxLG5bMF09KGVbMF0qcitlWzRdKmMrZVs4XSphK2VbMTJdKS91LG5bMV09KGVbMV0qcitlWzVdKmMrZVs5XSphK2VbMTNdKS91LG5bMl09KGVbMl0qcitlWzZdKmMrZVsxMF0qYStlWzE0XSkvdSxufSx2ZWMzLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24obix0LGUpe3ZhciByPXRbMF0sYz10WzFdLGE9dFsyXTtyZXR1cm4gblswXT1yKmVbMF0rYyplWzNdK2EqZVs2XSxuWzFdPXIqZVsxXStjKmVbNF0rYSplWzddLG5bMl09ciplWzJdK2MqZVs1XSthKmVbOF0sbn0sdmVjMy50cmFuc2Zvcm1RdWF0PWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj10WzBdLGM9dFsxXSxhPXRbMl0sdT1lWzBdLHY9ZVsxXSxpPWVbMl0sbz1lWzNdLHM9bypyK3YqYS1pKmMsZj1vKmMraSpyLXUqYSxNPW8qYSt1KmMtdipyLGg9LXUqci12KmMtaSphO3JldHVybiBuWzBdPXMqbytoKi11K2YqLWktTSotdixuWzFdPWYqbytoKi12K00qLXUtcyotaSxuWzJdPU0qbytoKi1pK3MqLXYtZiotdSxufSx2ZWMzLnJvdGF0ZVg9ZnVuY3Rpb24obix0LGUscil7dmFyIGM9W10sYT1bXTtyZXR1cm4gY1swXT10WzBdLWVbMF0sY1sxXT10WzFdLWVbMV0sY1syXT10WzJdLWVbMl0sYVswXT1jWzBdLGFbMV09Y1sxXSpNYXRoLmNvcyhyKS1jWzJdKk1hdGguc2luKHIpLGFbMl09Y1sxXSpNYXRoLnNpbihyKStjWzJdKk1hdGguY29zKHIpLG5bMF09YVswXStlWzBdLG5bMV09YVsxXStlWzFdLG5bMl09YVsyXStlWzJdLG59LHZlYzMucm90YXRlWT1mdW5jdGlvbihuLHQsZSxyKXt2YXIgYz1bXSxhPVtdO3JldHVybiBjWzBdPXRbMF0tZVswXSxjWzFdPXRbMV0tZVsxXSxjWzJdPXRbMl0tZVsyXSxhWzBdPWNbMl0qTWF0aC5zaW4ocikrY1swXSpNYXRoLmNvcyhyKSxhWzFdPWNbMV0sYVsyXT1jWzJdKk1hdGguY29zKHIpLWNbMF0qTWF0aC5zaW4ociksblswXT1hWzBdK2VbMF0sblsxXT1hWzFdK2VbMV0sblsyXT1hWzJdK2VbMl0sbn0sdmVjMy5yb3RhdGVaPWZ1bmN0aW9uKG4sdCxlLHIpe3ZhciBjPVtdLGE9W107cmV0dXJuIGNbMF09dFswXS1lWzBdLGNbMV09dFsxXS1lWzFdLGNbMl09dFsyXS1lWzJdLGFbMF09Y1swXSpNYXRoLmNvcyhyKS1jWzFdKk1hdGguc2luKHIpLGFbMV09Y1swXSpNYXRoLnNpbihyKStjWzFdKk1hdGguY29zKHIpLGFbMl09Y1syXSxuWzBdPWFbMF0rZVswXSxuWzFdPWFbMV0rZVsxXSxuWzJdPWFbMl0rZVsyXSxufSx2ZWMzLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgbj12ZWMzLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbih0LGUscixjLGEsdSl7dmFyIHYsaTtmb3IoZXx8KGU9Mykscnx8KHI9MCksaT1jP01hdGgubWluKGMqZStyLHQubGVuZ3RoKTp0Lmxlbmd0aCx2PXI7aT52O3YrPWUpblswXT10W3ZdLG5bMV09dFt2KzFdLG5bMl09dFt2KzJdLGEobixuLHUpLHRbdl09blswXSx0W3YrMV09blsxXSx0W3YrMl09blsyXTtyZXR1cm4gdH19KCksdmVjMy5hbmdsZT1mdW5jdGlvbihuLHQpe3ZhciBlPXZlYzMuZnJvbVZhbHVlcyhuWzBdLG5bMV0sblsyXSkscj12ZWMzLmZyb21WYWx1ZXModFswXSx0WzFdLHRbMl0pO3ZlYzMubm9ybWFsaXplKGUsZSksdmVjMy5ub3JtYWxpemUocixyKTt2YXIgYz12ZWMzLmRvdChlLHIpO3JldHVybiBjPjE/MDpNYXRoLmFjb3MoYyl9LHZlYzMuc3RyPWZ1bmN0aW9uKG4pe3JldHVyblwidmVjMyhcIituWzBdK1wiLCBcIituWzFdK1wiLCBcIituWzJdK1wiKVwifSxtb2R1bGUuZXhwb3J0cz12ZWMzO1xufSx7XCIuL2NvbW1vbi5qc1wiOjExN31dLDEyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZ2xNYXRyaXg9cmVxdWlyZShcIi4vY29tbW9uLmpzXCIpLHZlYzQ9e307dmVjNC5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZVszXT0wLGV9LHZlYzQuY2xvbmU9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIG5bMF09ZVswXSxuWzFdPWVbMV0sblsyXT1lWzJdLG5bM109ZVszXSxufSx2ZWM0LmZyb21WYWx1ZXM9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9bmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7cmV0dXJuIGNbMF09ZSxjWzFdPW4sY1syXT10LGNbM109cixjfSx2ZWM0LmNvcHk9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGV9LHZlYzQuc2V0PWZ1bmN0aW9uKGUsbix0LHIsYyl7cmV0dXJuIGVbMF09bixlWzFdPXQsZVsyXT1yLGVbM109YyxlfSx2ZWM0LmFkZD1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSt0WzBdLGVbMV09blsxXSt0WzFdLGVbMl09blsyXSt0WzJdLGVbM109blszXSt0WzNdLGV9LHZlYzQuc3VidHJhY3Q9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0tdFswXSxlWzFdPW5bMV0tdFsxXSxlWzJdPW5bMl0tdFsyXSxlWzNdPW5bM10tdFszXSxlfSx2ZWM0LnN1Yj12ZWM0LnN1YnRyYWN0LHZlYzQubXVsdGlwbHk9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPW5bMF0qdFswXSxlWzFdPW5bMV0qdFsxXSxlWzJdPW5bMl0qdFsyXSxlWzNdPW5bM10qdFszXSxlfSx2ZWM0Lm11bD12ZWM0Lm11bHRpcGx5LHZlYzQuZGl2aWRlPWZ1bmN0aW9uKGUsbix0KXtyZXR1cm4gZVswXT1uWzBdL3RbMF0sZVsxXT1uWzFdL3RbMV0sZVsyXT1uWzJdL3RbMl0sZVszXT1uWzNdL3RbM10sZX0sdmVjNC5kaXY9dmVjNC5kaXZpZGUsdmVjNC5taW49ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWluKG5bMF0sdFswXSksZVsxXT1NYXRoLm1pbihuWzFdLHRbMV0pLGVbMl09TWF0aC5taW4oblsyXSx0WzJdKSxlWzNdPU1hdGgubWluKG5bM10sdFszXSksZX0sdmVjNC5tYXg9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBlWzBdPU1hdGgubWF4KG5bMF0sdFswXSksZVsxXT1NYXRoLm1heChuWzFdLHRbMV0pLGVbMl09TWF0aC5tYXgoblsyXSx0WzJdKSxlWzNdPU1hdGgubWF4KG5bM10sdFszXSksZX0sdmVjNC5zY2FsZT1mdW5jdGlvbihlLG4sdCl7cmV0dXJuIGVbMF09blswXSp0LGVbMV09blsxXSp0LGVbMl09blsyXSp0LGVbM109blszXSp0LGV9LHZlYzQuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24oZSxuLHQscil7cmV0dXJuIGVbMF09blswXSt0WzBdKnIsZVsxXT1uWzFdK3RbMV0qcixlWzJdPW5bMl0rdFsyXSpyLGVbM109blszXSt0WzNdKnIsZX0sdmVjNC5kaXN0YW5jZT1mdW5jdGlvbihlLG4pe3ZhciB0PW5bMF0tZVswXSxyPW5bMV0tZVsxXSxjPW5bMl0tZVsyXSx1PW5bM10tZVszXTtyZXR1cm4gTWF0aC5zcXJ0KHQqdCtyKnIrYypjK3UqdSl9LHZlYzQuZGlzdD12ZWM0LmRpc3RhbmNlLHZlYzQuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXS1lWzBdLHI9blsxXS1lWzFdLGM9blsyXS1lWzJdLHU9blszXS1lWzNdO3JldHVybiB0KnQrcipyK2MqYyt1KnV9LHZlYzQuc3FyRGlzdD12ZWM0LnNxdWFyZWREaXN0YW5jZSx2ZWM0Lmxlbmd0aD1mdW5jdGlvbihlKXt2YXIgbj1lWzBdLHQ9ZVsxXSxyPWVbMl0sYz1lWzNdO3JldHVybiBNYXRoLnNxcnQobipuK3QqdCtyKnIrYypjKX0sdmVjNC5sZW49dmVjNC5sZW5ndGgsdmVjNC5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0sdD1lWzFdLHI9ZVsyXSxjPWVbM107cmV0dXJuIG4qbit0KnQrcipyK2MqY30sdmVjNC5zcXJMZW49dmVjNC5zcXVhcmVkTGVuZ3RoLHZlYzQubmVnYXRlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09LW5bMF0sZVsxXT0tblsxXSxlWzJdPS1uWzJdLGVbM109LW5bM10sZX0sdmVjNC5pbnZlcnNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbMF09MS9uWzBdLGVbMV09MS9uWzFdLGVbMl09MS9uWzJdLGVbM109MS9uWzNdLGV9LHZlYzQubm9ybWFsaXplPWZ1bmN0aW9uKGUsbil7dmFyIHQ9blswXSxyPW5bMV0sYz1uWzJdLHU9blszXSxhPXQqdCtyKnIrYypjK3UqdTtyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSxlWzBdPXQqYSxlWzFdPXIqYSxlWzJdPWMqYSxlWzNdPXUqYSksZX0sdmVjNC5kb3Q9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZVswXSpuWzBdK2VbMV0qblsxXStlWzJdKm5bMl0rZVszXSpuWzNdfSx2ZWM0LmxlcnA9ZnVuY3Rpb24oZSxuLHQscil7dmFyIGM9blswXSx1PW5bMV0sYT1uWzJdLHY9blszXTtyZXR1cm4gZVswXT1jK3IqKHRbMF0tYyksZVsxXT11K3IqKHRbMV0tdSksZVsyXT1hK3IqKHRbMl0tYSksZVszXT12K3IqKHRbM10tdiksZX0sdmVjNC5yYW5kb209ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbj1ufHwxLGVbMF09Z2xNYXRyaXguUkFORE9NKCksZVsxXT1nbE1hdHJpeC5SQU5ET00oKSxlWzJdPWdsTWF0cml4LlJBTkRPTSgpLGVbM109Z2xNYXRyaXguUkFORE9NKCksdmVjNC5ub3JtYWxpemUoZSxlKSx2ZWM0LnNjYWxlKGUsZSxuKSxlfSx2ZWM0LnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW5bMF0sYz1uWzFdLHU9blsyXSxhPW5bM107cmV0dXJuIGVbMF09dFswXSpyK3RbNF0qYyt0WzhdKnUrdFsxMl0qYSxlWzFdPXRbMV0qcit0WzVdKmMrdFs5XSp1K3RbMTNdKmEsZVsyXT10WzJdKnIrdFs2XSpjK3RbMTBdKnUrdFsxNF0qYSxlWzNdPXRbM10qcit0WzddKmMrdFsxMV0qdSt0WzE1XSphLGV9LHZlYzQudHJhbnNmb3JtUXVhdD1mdW5jdGlvbihlLG4sdCl7dmFyIHI9blswXSxjPW5bMV0sdT1uWzJdLGE9dFswXSx2PXRbMV0saT10WzJdLG89dFszXSxmPW8qcit2KnUtaSpjLHM9bypjK2kqci1hKnUsbD1vKnUrYSpjLXYqcixNPS1hKnItdipjLWkqdTtyZXR1cm4gZVswXT1mKm8rTSotYStzKi1pLWwqLXYsZVsxXT1zKm8rTSotditsKi1hLWYqLWksZVsyXT1sKm8rTSotaStmKi12LXMqLWEsZVszXT1uWzNdLGV9LHZlYzQuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciBlPXZlYzQuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKG4sdCxyLGMsdSxhKXt2YXIgdixpO2Zvcih0fHwodD00KSxyfHwocj0wKSxpPWM/TWF0aC5taW4oYyp0K3Isbi5sZW5ndGgpOm4ubGVuZ3RoLHY9cjtpPnY7dis9dCllWzBdPW5bdl0sZVsxXT1uW3YrMV0sZVsyXT1uW3YrMl0sZVszXT1uW3YrM10sdShlLGUsYSksblt2XT1lWzBdLG5bdisxXT1lWzFdLG5bdisyXT1lWzJdLG5bdiszXT1lWzNdO3JldHVybiBufX0oKSx2ZWM0LnN0cj1mdW5jdGlvbihlKXtyZXR1cm5cInZlYzQoXCIrZVswXStcIiwgXCIrZVsxXStcIiwgXCIrZVsyXStcIiwgXCIrZVszXStcIilcIn0sbW9kdWxlLmV4cG9ydHM9dmVjNDtcbn0se1wiLi9jb21tb24uanNcIjoxMTd9XSwxMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZXhwb3J0cy5yZWFkPWZ1bmN0aW9uKGEsbyx0LHIsaCl7dmFyIE0scCx3PTgqaC1yLTEsZj0oMTw8dyktMSxlPWY+PjEsaT0tNyxOPXQ/aC0xOjAsbj10Py0xOjEscz1hW28rTl07Zm9yKE4rPW4sTT1zJigxPDwtaSktMSxzPj49LWksaSs9dztpPjA7TT0yNTYqTSthW28rTl0sTis9bixpLT04KTtmb3IocD1NJigxPDwtaSktMSxNPj49LWksaSs9cjtpPjA7cD0yNTYqcCthW28rTl0sTis9bixpLT04KTtpZigwPT09TSlNPTEtZTtlbHNle2lmKE09PT1mKXJldHVybiBwP05hTjoocz8tMToxKSooMS8wKTtwKz1NYXRoLnBvdygyLHIpLE0tPWV9cmV0dXJuKHM/LTE6MSkqcCpNYXRoLnBvdygyLE0tcil9LGV4cG9ydHMud3JpdGU9ZnVuY3Rpb24oYSxvLHQscixoLE0pe3ZhciBwLHcsZixlPTgqTS1oLTEsaT0oMTw8ZSktMSxOPWk+PjEsbj0yMz09PWg/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHM9cj8wOk0tMSx1PXI/MTotMSxsPTA+b3x8MD09PW8mJjA+MS9vPzE6MDtmb3Iobz1NYXRoLmFicyhvKSxpc05hTihvKXx8bz09PTEvMD8odz1pc05hTihvKT8xOjAscD1pKToocD1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKSxvKihmPU1hdGgucG93KDIsLXApKTwxJiYocC0tLGYqPTIpLG8rPXArTj49MT9uL2Y6bipNYXRoLnBvdygyLDEtTiksbypmPj0yJiYocCsrLGYvPTIpLHArTj49aT8odz0wLHA9aSk6cCtOPj0xPyh3PShvKmYtMSkqTWF0aC5wb3coMixoKSxwKz1OKToodz1vKk1hdGgucG93KDIsTi0xKSpNYXRoLnBvdygyLGgpLHA9MCkpO2g+PTg7YVt0K3NdPTI1NSZ3LHMrPXUsdy89MjU2LGgtPTgpO2ZvcihwPXA8PGh8dyxlKz1oO2U+MDthW3Qrc109MjU1JnAscys9dSxwLz0yNTYsZS09OCk7YVt0K3MtdV18PTEyOCpsfTtcbn0se31dLDEyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBvPWZ1bmN0aW9uKCl7fTtvLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbyx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTtcbn0se31dLDEyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjb25zdGFudChyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIocix0LG4pe3JldHVybiByKigxLW4pK3Qqbn1mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KHIsdCxuKXtmb3IodmFyIGU9W10sbz0wO288ci5sZW5ndGg7bysrKWVbb109aW50ZXJwb2xhdGVOdW1iZXIocltvXSx0W29dLG4pO3JldHVybiBlfWV4cG9ydHMuaW50ZXJwb2xhdGVkPWZ1bmN0aW9uKHIpe2lmKCFyLnN0b3BzKXJldHVybiBjb25zdGFudChyKTt2YXIgdD1yLnN0b3BzLG49ci5iYXNlfHwxLGU9QXJyYXkuaXNBcnJheSh0WzBdWzFdKT9pbnRlcnBvbGF0ZUFycmF5OmludGVycG9sYXRlTnVtYmVyO3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIG8sYSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciB1PXRbaV07aWYodVswXTw9ciYmKG89dSksdVswXT5yKXthPXU7YnJlYWt9fWlmKG8mJmEpe3ZhciBzPWFbMF0tb1swXSxmPXItb1swXSxwPTE9PT1uP2YvczooTWF0aC5wb3cobixmKS0xKS8oTWF0aC5wb3cobixzKS0xKTtyZXR1cm4gZShvWzFdLGFbMV0scCl9cmV0dXJuIG8/b1sxXTphP2FbMV06dm9pZCAwfX0sZXhwb3J0c1tcInBpZWNld2lzZS1jb25zdGFudFwiXT1mdW5jdGlvbihyKXtpZighci5zdG9wcylyZXR1cm4gY29uc3RhbnQocik7dmFyIHQ9ci5zdG9wcztyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXVswXT5yKXJldHVybiB0WzA9PT1uPzA6bi0xXVsxXTtyZXR1cm4gdFt0Lmxlbmd0aC0xXVsxXX19O1xufSx7fV0sMTI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciByZWZlcmVuY2U9cmVxdWlyZShcIi4uLy4uL3JlZmVyZW5jZS9sYXRlc3QubWluLmpzXCIpLHZhbGlkYXRlPXJlcXVpcmUoXCIuL3BhcnNlZFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdmFsaWRhdGUoZSxyZWZlcmVuY2UpfTtcbn0se1wiLi4vLi4vcmVmZXJlbmNlL2xhdGVzdC5taW4uanNcIjoxMzIsXCIuL3BhcnNlZFwiOjEzMH1dLDEzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0eXBlb2ZfKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyP1wibnVtYmVyXCI6ZSBpbnN0YW5jZW9mIFN0cmluZz9cInN0cmluZ1wiOmUgaW5zdGFuY2VvZiBCb29sZWFuP1wiYm9vbGVhblwiOkFycmF5LmlzQXJyYXkoZSk/XCJhcnJheVwiOm51bGw9PT1lP1wibnVsbFwiOnR5cGVvZiBlfWZ1bmN0aW9uIHVuYnVuZGxlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgQm9vbGVhbj9lLnZhbHVlT2YoKTplfXZhciBwYXJzZUNTU0NvbG9yPXJlcXVpcmUoXCJjc3Njb2xvcnBhcnNlclwiKS5wYXJzZUNTU0NvbG9yLGZvcm1hdD1yZXF1aXJlKFwidXRpbFwiKS5mb3JtYXQ7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKGUsdCl7dmFyIHI9e21lc3NhZ2U6KGU/ZStcIjogXCI6XCJcIikrZm9ybWF0LmFwcGx5KGZvcm1hdCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfTtudWxsIT09dCYmdm9pZCAwIT09dCYmdC5fX2xpbmVfXyYmKHIubGluZT10Ll9fbGluZV9fKSxzLnB1c2gocil9ZnVuY3Rpb24gbihlLG8saSl7dmFyIHM9dHlwZW9mXyhvKTtpZihcInN0cmluZ1wiPT09cyYmXCJAXCI9PT1vWzBdKXtpZih0LiR2ZXJzaW9uPjcpcmV0dXJuIHIoZSxvLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpO2lmKCEobyBpbiBhKSlyZXR1cm4gcihlLG8sJ2NvbnN0YW50IFwiJXNcIiBub3QgZm91bmQnLG8pO289YVtvXSxzPXR5cGVvZl8obyl9aWYoaVtcImZ1bmN0aW9uXCJdJiZcIm9iamVjdFwiPT09cylyZXR1cm4gbltcImZ1bmN0aW9uXCJdKGUsbyxpKTtpZihpLnR5cGUpe3ZhciB1PW5baS50eXBlXTtpZih1KXJldHVybiB1KGUsbyxpKTtpPXRbaS50eXBlXX1uLm9iamVjdChlLG8saSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZnVuY3Rpb24odCxuLG8pe3ZhciBhPXR5cGVvZl8obik7YSE9PWUmJnIodCxuLFwiJXMgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZSxhKSxcIm1pbmltdW1cImluIG8mJm48by5taW5pbXVtJiZyKHQsbixcIiVzIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAlc1wiLG4sby5taW5pbXVtKSxcIm1heGltdW1cImluIG8mJm4+by5tYXhpbXVtJiZyKHQsbixcIiVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAlc1wiLG4sby5tYXhpbXVtKX19dmFyIGE9ZS5jb25zdGFudHN8fHt9LGk9e30scz1bXTtyZXR1cm4gbi5jb25zdGFudHM9ZnVuY3Rpb24oZSxuKXtpZih0LiR2ZXJzaW9uPjcpe2lmKG4pcmV0dXJuIHIoZSxuLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpfWVsc2V7dmFyIG89dHlwZW9mXyhuKTtpZihcIm9iamVjdFwiIT09bylyZXR1cm4gcihlLG4sXCJvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kXCIsbyk7Zm9yKHZhciBhIGluIG4pXCJAXCIhPT1hWzBdJiZyKGUrXCIuXCIrYSxuW2FdLCdjb25zdGFudHMgbXVzdCBzdGFydCB3aXRoIFwiQFwiJyl9fSxuLnNvdXJjZT1mdW5jdGlvbihlLG8pe2lmKCFvLnR5cGUpcmV0dXJuIHZvaWQgcihlLG8sJ1widHlwZVwiIGlzIHJlcXVpcmVkJyk7dmFyIGE9dW5idW5kbGUoby50eXBlKTtzd2l0Y2goYSl7Y2FzZVwidmVjdG9yXCI6Y2FzZVwicmFzdGVyXCI6aWYobi5vYmplY3QoZSxvLHQuc291cmNlX3RpbGUpLFwidXJsXCJpbiBvKWZvcih2YXIgaSBpbiBvKVtcInR5cGVcIixcInVybFwiLFwidGlsZVNpemVcIl0uaW5kZXhPZihpKTwwJiZyKGUrXCIuXCIraSxvW2ldLCdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLGkpO2JyZWFrO2Nhc2VcImdlb2pzb25cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfZ2VvanNvbik7YnJlYWs7Y2FzZVwidmlkZW9cIjpuLm9iamVjdChlLG8sdC5zb3VyY2VfdmlkZW8pO2JyZWFrO2Nhc2VcImltYWdlXCI6bi5vYmplY3QoZSxvLHQuc291cmNlX2ltYWdlKTticmVhaztkZWZhdWx0Om5bXCJlbnVtXCJdKGUrXCIudHlwZVwiLG8udHlwZSx7dmFsdWVzOltcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIl19KX19LG4ubGF5ZXI9ZnVuY3Rpb24obyxhKXthLnR5cGV8fGEucmVmfHxyKG8sYSwnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKTt2YXIgcz11bmJ1bmRsZShhLnR5cGUpLHU9dW5idW5kbGUoYS5yZWYpO2lmKGEuaWQmJihpW2EuaWRdP3IobyxhLmlkLCdkdXBsaWNhdGUgbGF5ZXIgaWQgXCIlc1wiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAlZCcsYS5pZCxpW2EuaWRdKTppW2EuaWRdPWEuaWQuX19saW5lX18pLFwicmVmXCJpbiBhKXtbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0uZm9yRWFjaChmdW5jdGlvbihlKXtlIGluIGEmJnIobyxhW2VdLCdcIiVzXCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVycycsZSl9KTt2YXIgYztlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQ9PXUmJihjPWUpfSksYz9jLnJlZj9yKG8sYS5yZWYsXCJyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllclwiKTpzPWMudHlwZTpyKG8sYS5yZWYsJ3JlZiBsYXllciBcIiVzXCIgbm90IGZvdW5kJyx1KX1lbHNlIGlmKFwiYmFja2dyb3VuZFwiIT09cylpZihhLnNvdXJjZSl7dmFyIGY9ZS5zb3VyY2VzW2Euc291cmNlXTtmP1widmVjdG9yXCI9PWYudHlwZSYmXCJyYXN0ZXJcIj09cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2UnLGEuaWQpOlwicmFzdGVyXCI9PWYudHlwZSYmXCJyYXN0ZXJcIiE9cz9yKG8sYS5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2UnLGEuaWQpOlwidmVjdG9yXCIhPWYudHlwZXx8YVtcInNvdXJjZS1sYXllclwiXXx8cihvLGEsJ2xheWVyIFwiJXNcIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiJyxhLmlkKTpyKG8sYS5zb3VyY2UsJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJyxhLnNvdXJjZSl9ZWxzZSByKG8sYSwnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJyk7bi5vYmplY3QobyxhLHQubGF5ZXIse2ZpbHRlcjpuLmZpbHRlcixsYXlvdXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wibGF5b3V0X1wiK3NdO3JldHVybiBzJiZvJiZuKGUscixvKX0scGFpbnQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz10W1wicGFpbnRfXCIrc107cmV0dXJuIHMmJm8mJm4oZSxyLG8pfX0pfSxuLm9iamVjdD1mdW5jdGlvbihlLG8sYSxpKXtpPWl8fHt9O3ZhciBzPXR5cGVvZl8obyk7aWYoXCJvYmplY3RcIiE9PXMpcmV0dXJuIHIoZSxvLFwib2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHMpO2Zvcih2YXIgdSBpbiBvKXt2YXIgYz11LnNwbGl0KFwiLlwiKVswXSxmPWFbY118fGFbXCIqXCJdLGw9Yy5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtmPyhpW2NdfHxuKSgoZT9lK1wiLlwiOmUpK3Usb1t1XSxmKTpsJiZhW2xbMV1dJiZhW2xbMV1dLnRyYW5zaXRpb24/bigoZT9lK1wiLlwiOmUpK3Usb1t1XSx0LnRyYW5zaXRpb24pOlwiXCIhPT1lJiYxIT09ZS5zcGxpdChcIi5cIikubGVuZ3RoJiZyKGUsb1t1XSwndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLHUpfWZvcih2YXIgcCBpbiBhKWFbcF0ucmVxdWlyZWQmJnZvaWQgMD09PWFbcF1bXCJkZWZhdWx0XCJdJiZ2b2lkIDA9PT1vW3BdJiZyKGUsbywnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiVzXCInLHApfSxuLmFycmF5PWZ1bmN0aW9uKHQsbyxhLGkpe2lmKFwiYXJyYXlcIiE9PXR5cGVvZl8obykpcmV0dXJuIHIodCxvLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsdHlwZW9mXyhvKSk7aWYoYS5sZW5ndGgmJm8ubGVuZ3RoIT09YS5sZW5ndGgpcmV0dXJuIHIodCxvLFwiYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmRcIixhLmxlbmd0aCxvLmxlbmd0aCk7aWYoYVtcIm1pbi1sZW5ndGhcIl0mJm8ubGVuZ3RoPGFbXCJtaW4tbGVuZ3RoXCJdKXJldHVybiByKHQsbyxcImFycmF5IGxlbmd0aCBhdCBsZWFzdCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kXCIsYVtcIm1pbi1sZW5ndGhcIl0sby5sZW5ndGgpO3ZhciBzPXt0eXBlOmEudmFsdWV9O2UudmVyc2lvbjw3JiYoc1tcImZ1bmN0aW9uXCJdPWFbXCJmdW5jdGlvblwiXSksXCJvYmplY3RcIj09PXR5cGVvZl8oYS52YWx1ZSkmJihzPWEudmFsdWUpO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKShpfHxuKSh0K1wiW1wiK3UrXCJdXCIsb1t1XSxzKX0sbi5maWx0ZXI9ZnVuY3Rpb24oZSxvKXt2YXIgYTtpZihcImFycmF5XCIhPT10eXBlb2ZfKG8pKXJldHVybiByKGUsbyxcImFycmF5IGV4cGVjdGVkLCAlcyBmb3VuZFwiLHR5cGVvZl8obykpO2lmKG8ubGVuZ3RoPDEpcmV0dXJuIHIoZSxvLFwiZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnRcIik7c3dpdGNoKG5bXCJlbnVtXCJdKGUrXCJbMF1cIixvWzBdLHQuZmlsdGVyX29wZXJhdG9yKSx1bmJ1bmRsZShvWzBdKSl7Y2FzZVwiPFwiOmNhc2VcIjw9XCI6Y2FzZVwiPlwiOmNhc2VcIj49XCI6by5sZW5ndGg+PTImJlwiJHR5cGVcIj09b1sxXSYmcihlLG8sJ1wiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIlc1wiJyxvWzBdKTtjYXNlXCI9PVwiOmNhc2VcIiE9XCI6MyE9by5sZW5ndGgmJnIoZSxvLCdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsb1swXSk7Y2FzZVwiaW5cIjpjYXNlXCIhaW5cIjpvLmxlbmd0aD49MiYmKGE9dHlwZW9mXyhvWzFdKSxcInN0cmluZ1wiIT09YT9yKGUrXCJbMV1cIixvWzFdLFwic3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZFwiLGEpOlwiQFwiPT09b1sxXVswXSYmcihlK1wiWzFdXCIsb1sxXSxcImZpbHRlciBrZXkgY2Fubm90IGJlIGEgY29uc3RhbnRcIikpO2Zvcih2YXIgaT0yO2k8by5sZW5ndGg7aSsrKWE9dHlwZW9mXyhvW2ldKSxcIiR0eXBlXCI9PW9bMV0/bltcImVudW1cIl0oZStcIltcIitpK1wiXVwiLG9baV0sdC5nZW9tZXRyeV90eXBlKTpcInN0cmluZ1wiPT09YSYmXCJAXCI9PT1vW2ldWzBdP3IoZStcIltcIitpK1wiXVwiLG9baV0sXCJmaWx0ZXIgdmFsdWUgY2Fubm90IGJlIGEgY29uc3RhbnRcIik6XCJzdHJpbmdcIiE9PWEmJlwibnVtYmVyXCIhPT1hJiZcImJvb2xlYW5cIiE9PWEmJnIoZStcIltcIitpK1wiXVwiLG9baV0sXCJzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJXMgZm91bmRcIixhKTticmVhaztjYXNlXCJhbnlcIjpjYXNlXCJhbGxcIjpjYXNlXCJub25lXCI6Zm9yKGk9MTtpPG8ubGVuZ3RoO2krKyluLmZpbHRlcihlK1wiW1wiK2krXCJdXCIsb1tpXSl9fSxuW1wiZnVuY3Rpb25cIl09ZnVuY3Rpb24oZSxvLGEpe24ub2JqZWN0KGUsbyx0W1wiZnVuY3Rpb25cIl0se3N0b3BzOmZ1bmN0aW9uKGUsdCxvKXt2YXIgaT0tKDEvMCk7bi5hcnJheShlLHQsbyxmdW5jdGlvbihlLHQpe3JldHVyblwiYXJyYXlcIiE9PXR5cGVvZl8odCk/cihlLHQsXCJhcnJheSBleHBlY3RlZCwgJXMgZm91bmRcIix0eXBlb2ZfKHQpKToyIT09dC5sZW5ndGg/cihlLHQsXCJhcnJheSBsZW5ndGggJWQgZXhwZWN0ZWQsIGxlbmd0aCAlZCBmb3VuZFwiLDIsdC5sZW5ndGgpOihuKGUrXCJbMF1cIix0WzBdLHt0eXBlOlwibnVtYmVyXCJ9KSxuKGUrXCJbMV1cIix0WzFdLGEpLHZvaWQoXCJudW1iZXJcIj09PXR5cGVvZl8odFswXSkmJihcInBpZWNld2lzZS1jb25zdGFudFwiPT09YVtcImZ1bmN0aW9uXCJdJiZ0WzBdJTEhPT0wJiZyKGUrXCJbMF1cIix0WzBdLFwiem9vbSBsZXZlbCBmb3IgcGllY2V3aXNlLWNvbnN0YW50IGZ1bmN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXJcIiksdFswXTw9aSYmcihlK1wiWzBdXCIsdFswXSxcImFycmF5IHN0b3BzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBhbmQgaGF2ZSBubyBkdXBsaWNhdGVzXCIpLGk9dFswXSkpKX0pLFwiYXJyYXlcIj09PXR5cGVvZl8odCkmJjA9PT10Lmxlbmd0aCYmcihlLHQsXCJhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0b3BcIil9fSl9LG5bXCJlbnVtXCJdPWZ1bmN0aW9uKGUsdCxuKXstMT09PW4udmFsdWVzLmluZGV4T2YodW5idW5kbGUodCkpJiZyKGUsdCxcImV4cGVjdGVkIG9uZSBvZiBbJXNdLCAlcyBmb3VuZFwiLG4udmFsdWVzLmpvaW4oXCIsIFwiKSx0KX0sbi5jb2xvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZl8odCk7cmV0dXJuXCJzdHJpbmdcIiE9PW4/cihlLHQsXCJjb2xvciBleHBlY3RlZCwgJXMgZm91bmRcIixuKTpudWxsPT09cGFyc2VDU1NDb2xvcih0KT9yKGUsdCwnY29sb3IgZXhwZWN0ZWQsIFwiJXNcIiBmb3VuZCcsdCk6dm9pZCAwfSxuLm51bWJlcj1vKFwibnVtYmVyXCIpLG4uc3RyaW5nPW8oXCJzdHJpbmdcIiksbltcImJvb2xlYW5cIl09byhcImJvb2xlYW5cIiksbltcIipcIl09ZnVuY3Rpb24oKXt9LG4oXCJcIixlLHQuJHJvb3QpLHQuJHZlcnNpb24+NyYmZS5jb25zdGFudHMmJm4uY29uc3RhbnRzKFwiY29uc3RhbnRzXCIsZS5jb25zdGFudHMpLHMuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmxpbmUtdC5saW5lfSksc307XG59LHtcImNzc2NvbG9ycGFyc2VyXCI6MTA3LFwidXRpbFwiOjE0M31dLDEzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz1yZXF1aXJlKFwiLi92OC5qc29uXCIpO1xufSx7XCIuL3Y4Lmpzb25cIjoxMzN9XSwxMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9cmVxdWlyZShcIi4vdjgubWluLmpzb25cIik7XG59LHtcIi4vdjgubWluLmpzb25cIjoxMzR9XSwxMzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHM9e1wiJHZlcnNpb25cIjo4LFwiJHJvb3RcIjp7XCJ2ZXJzaW9uXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6WzhdLFwiZG9jXCI6XCJTdHlsZXNoZWV0IHZlcnNpb24gbnVtYmVyLiBNdXN0IGJlIDguXCIsXCJleGFtcGxlXCI6OH0sXCJuYW1lXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHN0eWxlLlwiLFwiZXhhbXBsZVwiOlwiQnJpZ2h0XCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBzdHlsZXNoZWV0LCBidXQgZG8gbm90IGluZmx1ZW5jZSByZW5kZXJpbmcuIFByb3BlcnRpZXMgc2hvdWxkIGJlIHByZWZpeGVkIHRvIGF2b2lkIGNvbGxpc2lvbnMsIGxpa2UgJ21hcGJveDonLlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgbWFwIGNlbnRlciBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLiAgVGhlIHN0eWxlIGNlbnRlciB3aWxsIGJlIHVzZWQgb25seSBpZiB0aGUgbWFwIGhhcyBub3QgYmVlbiBwb3NpdGlvbmVkIGJ5IG90aGVyIG1lYW5zIChlLmcuIG1hcCBvcHRpb25zIG9yIHVzZXIgaW50ZXJhY3Rpb24pLlwiLFwiZXhhbXBsZVwiOlstNzMuOTc0OSw0MC43NzM2XX0sXCJ6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkRlZmF1bHQgem9vbSBsZXZlbC4gIFRoZSBzdHlsZSB6b29tIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6MTIuNX0sXCJiZWFyaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJkb2NcIjpcIkRlZmF1bHQgYmVhcmluZywgaW4gZGVncmVlcy4gIFRoZSBzdHlsZSBiZWFyaW5nIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6Mjl9LFwicGl0Y2hcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImRlZ3JlZXNcIixcImRvY1wiOlwiRGVmYXVsdCBwaXRjaCwgaW4gZGVncmVlcy4gWmVybyBpcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBzdXJmYWNlLiAgVGhlIHN0eWxlIHBpdGNoIHdpbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBtYXAgaGFzIG5vdCBiZWVuIHBvc2l0aW9uZWQgYnkgb3RoZXIgbWVhbnMgKGUuZy4gbWFwIG9wdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbikuXCIsXCJleGFtcGxlXCI6NTB9LFwic291cmNlc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInNvdXJjZXNcIixcImRvY1wiOlwiRGF0YSBzb3VyY2Ugc3BlY2lmaWNhdGlvbnMuXCIsXCJleGFtcGxlXCI6e1wibWFwYm94LXN0cmVldHNcIjp7XCJ0eXBlXCI6XCJ2ZWN0b3JcIixcInVybFwiOlwibWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY2XCJ9fX0sXCJzcHJpdGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiQSBiYXNlIFVSTCBmb3IgcmV0cmlldmluZyB0aGUgc3ByaXRlIGltYWdlIGFuZCBtZXRhZGF0YS4gVGhlIGV4dGVuc2lvbnMgYC5wbmdgLCBgLmpzb25gIGFuZCBzY2FsZSBmYWN0b3IgYEAyeC5wbmdgIHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZC5cIixcImV4YW1wbGVcIjpcIm1hcGJveDovL3Nwcml0ZXMvbWFwYm94L2JyaWdodC12OFwifSxcImdseXBoc1wiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0ZW1wbGF0ZSBmb3IgbG9hZGluZyBzaWduZWQtZGlzdGFuY2UtZmllbGQgZ2x5cGggc2V0cyBpbiBQQkYgZm9ybWF0LiBWYWxpZCB0b2tlbnMgYXJlIHtmb250c3RhY2t9IGFuZCB7cmFuZ2V9LlwiLFwiZXhhbXBsZVwiOlwibWFwYm94Oi8vZm9udHMvbWFwYm94L3tmb250c3RhY2t9L3tyYW5nZX0ucGJmXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIixcImRvY1wiOlwiQSBnbG9iYWwgdHJhbnNpdGlvbiBkZWZpbml0aW9uIHRvIHVzZSBhcyBhIGRlZmF1bHQgYWNyb3NzIHByb3BlcnRpZXMuXCIsXCJleGFtcGxlXCI6e1wiZHVyYXRpb25cIjozMDAsXCJkZWxheVwiOjB9fSxcImxheWVyc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibGF5ZXJcIixcImRvY1wiOlwiTGF5ZXJzIHdpbGwgYmUgZHJhd24gaW4gdGhlIG9yZGVyIG9mIHRoaXMgYXJyYXkuXCIsXCJleGFtcGxlXCI6W3tcImlkXCI6XCJ3YXRlclwiLFwic291cmNlXCI6XCJtYXBib3gtc3RyZWV0c1wiLFwic291cmNlLWxheWVyXCI6XCJ3YXRlclwiLFwidHlwZVwiOlwiZmlsbFwiLFwicGFpbnRcIjp7XCJmaWxsLWNvbG9yXCI6XCIjMDBmZmZmXCJ9fV19fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCIsXCJkb2NcIjpcIlNwZWNpZmljYXRpb24gb2YgYSBkYXRhIHNvdXJjZS4gRm9yIHZlY3RvciBhbmQgcmFzdGVyIHNvdXJjZXMsIGVpdGhlciBUaWxlSlNPTiBvciBhIFVSTCB0byBhIFRpbGVKU09OIG11c3QgYmUgcHJvdmlkZWQuIEZvciBHZW9KU09OIGFuZCB2aWRlbyBzb3VyY2VzLCBhIFVSTCBtdXN0IGJlIHByb3ZpZGVkLlwifX0sXCJzb3VyY2VcIjpbXCJzb3VyY2VfdGlsZVwiLFwic291cmNlX2dlb2pzb25cIixcInNvdXJjZV92aWRlb1wiLFwic291cmNlX2ltYWdlXCJdLFwic291cmNlX3RpbGVcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1widmVjdG9yXCIsXCJyYXN0ZXJcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIHRpbGUgc291cmNlLlwifSxcInVybFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJBIFVSTCB0byBhIFRpbGVKU09OIHJlc291cmNlLiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGFyZSBgaHR0cDpgLCBgaHR0cHM6YCwgYW5kIGBtYXBib3g6Ly88bWFwaWQ+YC5cIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIkFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHRpbGUgc291cmNlIFVSTHMsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZG9jXCI6XCJNaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHdoaWNoIHRpbGVzIGFyZSBhdmFpbGFibGUsIGFzIGluIHRoZSBUaWxlSlNPTiBzcGVjLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyMixcImRvY1wiOlwiTWF4aW11bSB6b29tIGxldmVsIGZvciB3aGljaCB0aWxlcyBhcmUgYXZhaWxhYmxlLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy4gRGF0YSBmcm9tIHRpbGVzIGF0IHRoZSBtYXh6b29tIGFyZSB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUgbWFwIGF0IGhpZ2hlciB6b29tIGxldmVscy5cIn0sXCJ0aWxlU2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUxMixcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIG1pbmltdW0gdmlzdWFsIHNpemUgdG8gZGlzcGxheSB0aWxlcyBmb3IgdGhpcyBsYXllci4gT25seSBjb25maWd1cmFibGUgZm9yIHJhc3RlciBsYXllcnMuXCJ9LFwiKlwiOntcInR5cGVcIjpcIipcIixcImRvY1wiOlwiT3RoZXIga2V5cyB0byBjb25maWd1cmUgdGhlIGRhdGEgc291cmNlLlwifX0sXCJzb3VyY2VfZ2VvanNvblwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJnZW9qc29uXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSBHZW9KU09OIHNvdXJjZS5cIn0sXCJkYXRhXCI6e1widHlwZVwiOlwiKlwiLFwiZG9jXCI6XCJBIFVSTCB0byBhIEdlb0pTT04gZmlsZSwgb3IgaW5saW5lIEdlb0pTT04uXCJ9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE0LFwiZG9jXCI6XCJNYXhpbXVtIHpvb20gbGV2ZWwgYXQgd2hpY2ggdG8gY3JlYXRlIHZlY3RvciB0aWxlcyAoaGlnaGVyIG1lYW5zIGdyZWF0ZXIgZGV0YWlsIGF0IGhpZ2ggem9vbSBsZXZlbHMpLlwifSxcImJ1ZmZlclwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjY0LFwiZG9jXCI6XCJUaWxlIGJ1ZmZlciBzaXplIG9uIGVhY2ggc2lkZSAoaGlnaGVyIG1lYW5zIGZld2VyIHJlbmRlcmluZyBhcnRpZmFjdHMgbmVhciB0aWxlIGVkZ2VzIGJ1dCBzbG93ZXIgcGVyZm9ybWFuY2UpLlwifSxcInRvbGVyYW5jZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMsXCJkb2NcIjpcIkRvdWdsYXMtUGV1Y2tlciBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyIGdlb21ldHJpZXMgYW5kIGZhc3RlciBwZXJmb3JtYW5jZSkuXCJ9LFwiY2x1c3RlclwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdGhlIGRhdGEgaXMgYSBjb2xsZWN0aW9uIG9mIHBvaW50IGZlYXR1cmVzLCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBjbHVzdGVycyB0aGUgcG9pbnRzIGJ5IHJhZGl1cyBpbnRvIGdyb3Vwcy5cIn0sXCJjbHVzdGVyUmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NDAwLFwiZG9jXCI6XCJSYWRpdXMgb2YgZWFjaCBjbHVzdGVyIHdoZW4gY2x1c3RlcmluZyBwb2ludHMsIHJlbGF0aXZlIHRvIDQwOTYgdGlsZS5cIn0sXCJjbHVzdGVyTWF4Wm9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJNYXggem9vbSB0byBjbHVzdGVyIHBvaW50cyBvbi4gRGVmYXVsdHMgdG8gb25lIHpvb20gbGVzcyB0aGFuIG1heHpvb20gKHNvIHRoYXQgbGFzdCB6b29tIGZlYXR1cmVzIGFyZSBub3QgY2x1c3RlcmVkKS5cIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdLFwiZG9jXCI6XCJUaGUgZGF0YSB0eXBlIG9mIHRoZSB2aWRlbyBzb3VyY2UuXCJ9LFwidXJsc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJkb2NcIjpcIlVSTHMgdG8gdmlkZW8gY29udGVudCBpbiBvcmRlciBvZiBwcmVmZXJyZWQgZm9ybWF0LlwifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJDb3JuZXJzIG9mIHZpZGVvIHNwZWNpZmllZCBpbiBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXJzLlwiLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJBIHNpbmdsZSBsb25naXR1ZGUsIGxhdGl0dWRlIHBhaXIuXCJ9fX0sXCJzb3VyY2VfaW1hZ2VcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiaW1hZ2VcIl0sXCJkb2NcIjpcIlRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIHNvdXJjZS5cIn0sXCJ1cmxcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVVJMIHRoYXQgcG9pbnRzIHRvIGFuIGltYWdlXCJ9LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJkb2NcIjpcIkNvcm5lcnMgb2YgaW1hZ2Ugc3BlY2lmaWVkIGluIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpcnMuXCIsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIkEgc2luZ2xlIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcGFpci5cIn19fSxcImxheWVyXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiVW5pcXVlIGxheWVyIG5hbWUuXCIsXCJyZXF1aXJlZFwiOnRydWV9LFwidHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImZpbGxcIixcImxpbmVcIixcInN5bWJvbFwiLFwiY2lyY2xlXCIsXCJyYXN0ZXJcIixcImJhY2tncm91bmRcIl0sXCJkb2NcIjpcIlJlbmRlcmluZyB0eXBlIG9mIHRoaXMgbGF5ZXIuXCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCIsXCJkb2NcIjpcIkFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBsYXllciwgYnV0IGRvIG5vdCBpbmZsdWVuY2UgcmVuZGVyaW5nLiBQcm9wZXJ0aWVzIHNob3VsZCBiZSBwcmVmaXhlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBsaWtlICdtYXBib3g6Jy5cIn0sXCJyZWZcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiUmVmZXJlbmNlcyBhbm90aGVyIGxheWVyIHRvIGNvcHkgYHR5cGVgLCBgc291cmNlYCwgYHNvdXJjZS1sYXllcmAsIGBtaW56b29tYCwgYG1heHpvb21gLCBgZmlsdGVyYCwgYW5kIGBsYXlvdXRgIHByb3BlcnRpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdGhlIGxheWVycyB0byBzaGFyZSBwcm9jZXNzaW5nIGFuZCBiZSBtb3JlIGVmZmljaWVudC5cIn0sXCJzb3VyY2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRvY1wiOlwiTmFtZSBvZiBhIHNvdXJjZSBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGxheWVyLlwifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZG9jXCI6XCJMYXllciB0byB1c2UgZnJvbSBhIHZlY3RvciB0aWxlIHNvdXJjZS4gUmVxdWlyZWQgaWYgdGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXBsZSBsYXllcnMuXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJkb2NcIjpcIlRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgb24gd2hpY2ggdGhlIGxheWVyIGdldHMgcGFyc2VkIGFuZCBhcHBlYXJzIG9uLlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyLFwiZG9jXCI6XCJUaGUgbWF4aW11bSB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsYXllciBnZXRzIHBhcnNlZCBhbmQgYXBwZWFycyBvbi5cIn0sXCJpbnRlcmFjdGl2ZVwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRvY1wiOlwiRW5hYmxlIHF1ZXJ5aW5nIG9mIGZlYXR1cmUgZGF0YSBmcm9tIHRoaXMgbGF5ZXIgZm9yIGludGVyYWN0aXZpdHkuXCIsXCJkZWZhdWx0XCI6ZmFsc2V9LFwiZmlsdGVyXCI6e1widHlwZVwiOlwiZmlsdGVyXCIsXCJkb2NcIjpcIkEgZXhwcmVzc2lvbiBzcGVjaWZ5aW5nIGNvbmRpdGlvbnMgb24gc291cmNlIGZlYXR1cmVzLiBPbmx5IGZlYXR1cmVzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciBhcmUgZGlzcGxheWVkLlwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwiLFwiZG9jXCI6XCJMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIixcImRvY1wiOlwiRGVmYXVsdCBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLlwifSxcInBhaW50LipcIjp7XCJ0eXBlXCI6XCJwYWludFwiLFwiZG9jXCI6XCJDbGFzcy1zcGVjaWZpYyBwYWludCBwcm9wZXJ0aWVzIGZvciB0aGlzIGxheWVyLiBUaGUgY2xhc3MgbmFtZSBpcyB0aGUgcGFydCBhZnRlciB0aGUgZmlyc3QgZG90LlwifX0sXCJsYXlvdXRcIjpbXCJsYXlvdXRfZmlsbFwiLFwibGF5b3V0X2xpbmVcIixcImxheW91dF9jaXJjbGVcIixcImxheW91dF9zeW1ib2xcIixcImxheW91dF9yYXN0ZXJcIixcImxheW91dF9iYWNrZ3JvdW5kXCJdLFwibGF5b3V0X2JhY2tncm91bmRcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgdGhpcyBsYXllci4gYG5vbmVgIGhpZGVzIHRoaXMgbGF5ZXIuXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfY2lyY2xlXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfbGluZVwiOntcImxpbmUtY2FwXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYnV0dFwiLFwicm91bmRcIixcInNxdWFyZVwiXSxcImRlZmF1bHRcIjpcImJ1dHRcIixcImRvY1wiOlwiVGhlIGRpc3BsYXkgb2YgbGluZSBlbmRpbmdzLlwifSxcImxpbmUtam9pblwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJldmVsXCIsXCJyb3VuZFwiLFwibWl0ZXJcIl0sXCJkZWZhdWx0XCI6XCJtaXRlclwiLFwiZG9jXCI6XCJUaGUgZGlzcGxheSBvZiBsaW5lcyB3aGVuIGpvaW5pbmcuXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlVzZWQgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IG1pdGVyIGpvaW5zIHRvIGJldmVsIGpvaW5zIGZvciBzaGFycCBhbmdsZXMuXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgcm91bmQgam9pbnMgdG8gbWl0ZXIgam9pbnMgZm9yIHNoYWxsb3cgYW5nbGVzLlwiLFwicmVxdWlyZXNcIjpbe1wibGluZS1qb2luXCI6XCJyb3VuZFwifV19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIixcImRvY1wiOlwiTGFiZWwgcGxhY2VtZW50IHJlbGF0aXZlIHRvIGl0cyBnZW9tZXRyeS4gYGxpbmVgIGNhbiBvbmx5IGJlIHVzZWQgb24gTGluZVN0cmluZ3MgYW5kIFBvbHlnb25zLlwifSxcInN5bWJvbC1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjUwLFwibWluaW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIGJldHdlZW4gdHdvIHN5bWJvbCBhbmNob3JzLlwiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCB0aGUgc3ltYm9scyB3aWxsIG5vdCBjcm9zcyB0aWxlIGVkZ2VzIHRvIGF2b2lkIG11dHVhbCBjb2xsaXNpb25zLiBSZWNvbW1lbmRlZCBpbiBsYXllcnMgdGhhdCBkb24ndCBoYXZlIGVub3VnaCBwYWRkaW5nIGluIHRoZSB2ZWN0b3IgdGlsZSB0byBwcmV2ZW50IGNvbGxpc2lvbnMsIG9yIGlmIGl0IGlzIGEgcG9pbnQgc3ltYm9sIGxheWVyIHBsYWNlZCBhZnRlciBhIGxpbmUgc3ltYm9sIGxheWVyLlwifSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gd2lsbCBiZSB2aXNpYmxlIGV2ZW4gaWYgaXQgY29sbGlkZXMgd2l0aCBvdGhlciBwcmV2aW91c2x5IGRyYXduIHN5bWJvbHMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwiZG9jXCI6XCJJZiB0cnVlLCBvdGhlciBzeW1ib2xzIGNhbiBiZSB2aXNpYmxlIGV2ZW4gaWYgdGhleSBjb2xsaWRlIHdpdGggdGhlIGljb24uXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGV4dCB3aWxsIGRpc3BsYXkgd2l0aG91dCB0aGVpciBjb3JyZXNwb25kaW5nIGljb25zIHdoZW4gdGhlIGljb24gY29sbGlkZXMgd2l0aCBvdGhlciBzeW1ib2xzIGFuZCB0aGUgdGV4dCBkb2VzIG5vdC5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwiZG9jXCI6XCJPcmllbnRhdGlvbiBvZiBpY29uIHdoZW4gbWFwIGlzIHJvdGF0ZWQuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJTY2FsZSBmYWN0b3IgZm9yIGljb24uIDEgaXMgb3JpZ2luYWwgc2l6ZSwgMyB0cmlwbGVzIHRoZSBzaXplLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taW1hZ2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRvY1wiOlwiQSBzdHJpbmcgd2l0aCB7dG9rZW5zfSByZXBsYWNlZCwgcmVmZXJlbmNpbmcgdGhlIGRhdGEgcHJvcGVydHkgdG8gcHVsbCBmcm9tLlwiLFwidG9rZW5zXCI6dHJ1ZX0sXCJpY29uLXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIHRoZSBpY29uIGNsb2Nrd2lzZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlNpemUgb2YgdGhlIGFkZGl0aW9uYWwgYXJlYSBhcm91bmQgdGhlIGljb24gYm91bmRpbmcgYm94IHVzZWQgZm9yIGRldGVjdGluZyBzeW1ib2wgY29sbGlzaW9ucy5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgdGhlIGljb24gbWF5IGJlIGZsaXBwZWQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgaWNvbiBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJkb2NcIjpcIk9yaWVudGF0aW9uIG9mIHRleHQgd2hlbiBtYXAgaXMgcm90YXRlZC5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWZpZWxkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6XCJcIixcInRva2Vuc1wiOnRydWUsXCJkb2NcIjpcIlZhbHVlIHRvIHVzZSBmb3IgYSB0ZXh0IGxhYmVsLiBGZWF0dXJlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCB1c2luZyB0b2tlbnMgbGlrZSB7ZmllbGRfbmFtZX0uXCJ9LFwidGV4dC1mb250XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpbXCJPcGVuIFNhbnMgUmVndWxhclwiLFwiQXJpYWwgVW5pY29kZSBNUyBSZWd1bGFyXCJdLFwiZG9jXCI6XCJGb250IHN0YWNrIHRvIHVzZSBmb3IgZGlzcGxheWluZyB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjE2LFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIkZvbnQgc2l6ZS5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW1heC13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEwLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiVGhlIG1heGltdW0gbGluZSB3aWR0aCBmb3IgdGV4dCB3cmFwcGluZy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4yLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgbGVhZGluZyB2YWx1ZSBmb3IgbXVsdGktbGluZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImVtXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlRleHQgdHJhY2tpbmcgYW1vdW50LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcImRvY1wiOlwiVGV4dCBqdXN0aWZpY2F0aW9uIG9wdGlvbnMuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJjZW50ZXJcIixcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIixcImJvdHRvbVwiLFwidG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXSxcImRlZmF1bHRcIjpcImNlbnRlclwiLFwiZG9jXCI6XCJQYXJ0IG9mIHRoZSB0ZXh0IHBsYWNlZCBjbG9zZXN0IHRvIHRoZSBhbmNob3IuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIk1heGltdW0gYW5nbGUgY2hhbmdlIGJldHdlZW4gYWRqYWNlbnQgY2hhcmFjdGVycy5cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkb2NcIjpcIlJvdGF0ZXMgdGhlIHRleHQgY2xvY2t3aXNlLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiU2l6ZSBvZiB0aGUgYWRkaXRpb25hbCBhcmVhIGFyb3VuZCB0aGUgdGV4dCBib3VuZGluZyBib3ggdXNlZCBmb3IgZGV0ZWN0aW5nIHN5bWJvbCBjb2xsaXNpb25zLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWUsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IG1heSBiZSBmbGlwcGVkIHZlcnRpY2FsbHkgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlbmRlcmVkIHVwc2lkZS1kb3duLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwiZG9jXCI6XCJTcGVjaWZpZXMgaG93IHRvIGNhcGl0YWxpemUgdGV4dCwgc2ltaWxhciB0byB0aGUgQ1NTIGB0ZXh0LXRyYW5zZm9ybWAgcHJvcGVydHkuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiZG9jXCI6XCJPZmZzZXQgZGlzdGFuY2Ugb2YgdGV4dCBmcm9tIGl0cyBhbmNob3IuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgdmlzaWJsZSBldmVuIGlmIGl0IGNvbGxpZGVzIHdpdGggb3RoZXIgcHJldmlvdXNseSBkcmF3biBzeW1ib2xzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcImRvY1wiOlwiSWYgdHJ1ZSwgb3RoZXIgc3ltYm9scyBjYW4gYmUgdmlzaWJsZSBldmVuIGlmIHRoZXkgY29sbGlkZSB3aXRoIHRoZSB0ZXh0LlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb3B0aW9uYWxcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJkb2NcIjpcIklmIHRydWUsIGljb25zIHdpbGwgZGlzcGxheSB3aXRob3V0IHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCB3aGVuIHRoZSB0ZXh0IGNvbGxpZGVzIHdpdGggb3RoZXIgc3ltYm9scyBhbmQgdGhlIGljb24gZG9lcyBub3QuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIixcImljb24taW1hZ2VcIl19LFwidmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCIsXCJkb2NcIjpcIlRoZSBkaXNwbGF5IG9mIHRoaXMgbGF5ZXIuIGBub25lYCBoaWRlcyB0aGlzIGxheWVyLlwifX0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIipcIixcImRvY1wiOlwiQSBmaWx0ZXIgc2VsZWN0cyBzcGVjaWZpYyBmZWF0dXJlcyBmcm9tIGEgbGF5ZXIuXCJ9LFwiZmlsdGVyX29wZXJhdG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiPT1cIixcIiE9XCIsXCI+XCIsXCI+PVwiLFwiPFwiLFwiPD1cIixcImluXCIsXCIhaW5cIixcImFsbFwiLFwiYW55XCIsXCJub25lXCJdLFwiZG9jXCI6XCJUaGUgZmlsdGVyIG9wZXJhdG9yLlwifSxcImdlb21ldHJ5X3R5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxcImRvY1wiOlwiVGhlIGdlb21ldHJ5IHR5cGUgZm9yIHRoZSBmaWx0ZXIgdG8gc2VsZWN0LlwifSxcImNvbG9yX29wZXJhdGlvblwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImxpZ2h0ZW5cIixcInNhdHVyYXRlXCIsXCJzcGluXCIsXCJmYWRlXCIsXCJtaXhcIl0sXCJkb2NcIjpcIkEgY29sb3Igb3BlcmF0aW9uIHRvIGFwcGx5LlwifSxcImZ1bmN0aW9uXCI6e1wic3RvcHNcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwicmVxdWlyZWRcIjp0cnVlLFwiZG9jXCI6XCJBbiBhcnJheSBvZiBzdG9wcy5cIixcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImRvY1wiOlwiVGhlIGV4cG9uZW50aWFsIGJhc2Ugb2YgdGhlIGludGVycG9sYXRpb24gY3VydmUuIEl0IGNvbnRyb2xzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSByZXN1bHQgaW5jcmVhc2VzLiBIaWdoZXIgdmFsdWVzIG1ha2UgdGhlIHJlc3VsdCBpbmNyZWFzZSBtb3JlIHRvd2FyZHMgdGhlIGhpZ2ggZW5kIG9mIHRoZSByYW5nZS4gV2l0aCBgMWAgdGhlIHN0b3BzIGFyZSBpbnRlcnBvbGF0ZWQgbGluZWFybHkuXCJ9fSxcImZ1bmN0aW9uX3N0b3BcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJ2YWx1ZVwiOltcIm51bWJlclwiLFwiY29sb3JcIl0sXCJsZW5ndGhcIjoyLFwiZG9jXCI6XCJab29tIGxldmVsIGFuZCB2YWx1ZSBwYWlyLlwifSxcInBhaW50XCI6W1wicGFpbnRfZmlsbFwiLFwicGFpbnRfbGluZVwiLFwicGFpbnRfY2lyY2xlXCIsXCJwYWludF9zeW1ib2xcIixcInBhaW50X3Jhc3RlclwiLFwicGFpbnRfYmFja2dyb3VuZFwiXSxcInBhaW50X2ZpbGxcIjp7XCJmaWxsLWFudGlhbGlhc1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwiZG9jXCI6XCJXaGV0aGVyIG9yIG5vdCB0aGUgZmlsbCBzaG91bGQgYmUgYW50aWFsaWFzZWQuXCJ9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGdpdmVuIHRvIHRoZSBmaWxsIGNvbG9yLlwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgZmlsbC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZG9jXCI6XCJUaGUgb3V0bGluZSBjb2xvciBvZiB0aGUgZmlsbC4gTWF0Y2hlcyB0aGUgdmFsdWUgb2YgYGZpbGwtY29sb3JgIGlmIHVuc3BlY2lmaWVkLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGltYWdlIGZpbGxzLiBGb3Igc2VhbWxlc3MgcGF0dGVybnMsIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBhIGZhY3RvciBvZiB0d28gKDIsIDQsIDgsIC4uLiwgNTEyKS5cIn19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgbGluZSB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBsaW5lIHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJUaGUgZ2VvbWV0cnkncyBvZmZzZXQuIFZhbHVlcyBhcmUgW3gsIHldIHdoZXJlIG5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cCwgcmVzcGVjdGl2ZWx5LlwifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJTdHJva2UgdGhpY2tuZXNzLlwifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZG9jXCI6XCJEcmF3cyBhIGxpbmUgY2FzaW5nIG91dHNpZGUgb2YgYSBsaW5lJ3MgYWN0dWFsIHBhdGguIFZhbHVlIGluZGljYXRlcyB0aGUgd2lkdGggb2YgdGhlIGlubmVyIGdhcC5cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtb2Zmc2V0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImRvY1wiOlwiVGhlIGxpbmUncyBvZmZzZXQgcGVycGVuZGljdWxhciB0byBpdHMgZGlyZWN0aW9uLiBWYWx1ZXMgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCB3aGVyZSBwb3NpdGl2ZSBpbmRpY2F0ZXMgXFxcInJpZ2h0d2FyZHNcXFwiIChpZiB5b3Ugd2VyZSBtb3ZpbmcgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbGluZSkgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyBcXFwibGVmdHdhcmRzLlxcXCJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJCbHVyIGFwcGxpZWQgdG8gdGhlIGxpbmUsIGluIHBpeGVscy5cIn0sXCJsaW5lLWRhc2hhcnJheVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkb2NcIjpcIlNwZWNpZmllcyB0aGUgbGVuZ3RocyBvZiB0aGUgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBnYXBzIHRoYXQgZm9ybSB0aGUgZGFzaCBwYXR0ZXJuLiBUaGUgbGVuZ3RocyBhcmUgbGF0ZXIgc2NhbGVkIGJ5IHRoZSBsaW5lIHdpZHRoLiBUbyBjb252ZXJ0IGEgZGFzaCBsZW5ndGggdG8gcGl4ZWxzLCBtdWx0aXBseSB0aGUgbGVuZ3RoIGJ5IHRoZSBjdXJyZW50IGxpbmUgd2lkdGguXCIsXCJtaW5pbXVtXCI6MCxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImxpbmUgd2lkdGhzXCIsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dfSxcImxpbmUtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIk5hbWUgb2YgaW1hZ2UgaW4gc3ByaXRlIHRvIHVzZSBmb3IgZHJhd2luZyBpbWFnZSBsaW5lcy4gRm9yIHNlYW1sZXNzIHBhdHRlcm5zLCBpbWFnZSB3aWR0aCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkNpcmNsZSByYWRpdXMuXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBjaXJjbGUuXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJkb2NcIjpcIkFtb3VudCB0byBibHVyIHRoZSBjaXJjbGUuIDEgYmx1cnMgdGhlIGNpcmNsZSBzdWNoIHRoYXQgb25seSB0aGUgY2VudGVycG9pbnQgaXMgZnVsbCBvcGFjaXR5LlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGNpcmNsZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIlRoZSBnZW9tZXRyeSdzIG9mZnNldC4gVmFsdWVzIGFyZSBbeCwgeV0gd2hlcmUgbmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLCByZXNwZWN0aXZlbHkuXCJ9LFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZG9jXCI6XCJDb250cm9sIHdoZXRoZXIgdGhlIHRyYW5zbGF0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBtYXAgKG5vcnRoKSBvciB2aWV3cG9ydCAoc2NyZWVuKVwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImNpcmNsZS10cmFuc2xhdGVcIl19fSxcInBhaW50X3N5bWJvbFwiOntcImljb24tb3BhY2l0eVwiOntcImRvY1wiOlwiVGhlIG9wYWNpdHkgYXQgd2hpY2ggdGhlIGljb24gd2lsbCBiZSBkcmF3bi5cIixcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiVGhlIGNvbG9yIG9mIHRoZSBpY29uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcInJnYmEoMCwgMCwgMCwgMClcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwiZG9jXCI6XCJUaGUgY29sb3Igb2YgdGhlIGljb24ncyBoYWxvLiBJY29uIGhhbG9zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzZGYgaWNvbnMuXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJkb2NcIjpcIkRpc3RhbmNlIG9mIGhhbG8gdG8gdGhlIGljb24gb3V0bGluZS5cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJGYWRlIG91dCB0aGUgaGFsbyB0b3dhcmRzIHRoZSBvdXRzaWRlLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiRGlzdGFuY2UgdGhhdCB0aGUgaWNvbidzIGFuY2hvciBpcyBtb3ZlZCBmcm9tIGl0cyBvcmlnaW5hbCBwbGFjZW1lbnQuIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSByaWdodCBhbmQgZG93biwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkb2NcIjpcIkNvbnRyb2wgd2hldGhlciB0aGUgdHJhbnNsYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG1hcCAobm9ydGgpIG9yIHZpZXdwb3J0IChzY3JlZW4pLlwiLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgdGV4dCB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24uXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJkb2NcIjpcIlRoZSBjb2xvciBvZiB0aGUgdGV4dCdzIGhhbG8sIHdoaWNoIGhlbHBzIGl0IHN0YW5kIG91dCBmcm9tIGJhY2tncm91bmRzLlwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSBvZiBoYWxvIHRvIHRoZSBmb250IG91dGxpbmUuIE1heCB0ZXh0IGhhbG8gd2lkdGggaXMgMS80IG9mIHRoZSBmb250LXNpemUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImRvY1wiOlwiVGhlIGhhbG8ncyBmYWRlb3V0IGRpc3RhbmNlIHRvd2FyZHMgdGhlIG91dHNpZGUuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZG9jXCI6XCJEaXN0YW5jZSB0aGF0IHRoZSB0ZXh0J3MgYW5jaG9yIGlzIG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsIHBsYWNlbWVudC4gUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHJpZ2h0IGFuZCBkb3duLCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRvY1wiOlwiQ29udHJvbCB3aGV0aGVyIHRoZSB0cmFuc2xhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbWFwIChub3J0aCkgb3Igdmlld3BvcnQgKHNjcmVlbikuXCIsXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl19fSxcInBhaW50X3Jhc3RlclwiOntcInJhc3Rlci1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkb2NcIjpcIlRoZSBvcGFjaXR5IGF0IHdoaWNoIHRoZSBpbWFnZSB3aWxsIGJlIGRyYXduLlwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWh1ZS1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZG9jXCI6XCJSb3RhdGVzIGh1ZXMgYXJvdW5kIHRoZSBjb2xvciB3aGVlbC5cIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtaW5pbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRvY1wiOlwiSW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBtYXhpbXVtIGJyaWdodG5lc3MuXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItc2F0dXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIHNhdHVyYXRpb24gb2YgdGhlIGltYWdlLlwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1jb250cmFzdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZG9jXCI6XCJJbmNyZWFzZSBvciByZWR1Y2UgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS5cIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCIsXCJkb2NcIjpcIkZhZGUgZHVyYXRpb24gd2hlbiBhIG5ldyB0aWxlIGlzIGFkZGVkLlwifX0sXCJwYWludF9iYWNrZ3JvdW5kXCI6e1wiYmFja2dyb3VuZC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJkb2NcIjpcIlRoZSBjb2xvciB3aXRoIHdoaWNoIHRoZSBiYWNrZ3JvdW5kIHdpbGwgYmUgZHJhd24uXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImJhY2tncm91bmQtcGF0dGVyblwifV19LFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcImRvY1wiOlwiTmFtZSBvZiBpbWFnZSBpbiBzcHJpdGUgdG8gdXNlIGZvciBkcmF3aW5nIGFuIGltYWdlIGJhY2tncm91bmQuIEZvciBzZWFtbGVzcyBwYXR0ZXJucywgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGEgZmFjdG9yIG9mIHR3byAoMiwgNCwgOCwgLi4uLCA1MTIpLlwifSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZG9jXCI6XCJUaGUgb3BhY2l0eSBhdCB3aGljaCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIGRyYXduLlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wiLFwiZG9jXCI6XCJUaW1lIGFsbG90dGVkIGZvciB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZS5cIn0sXCJkZWxheVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJtaWxsaXNlY29uZHNcIixcImRvY1wiOlwiTGVuZ3RoIG9mIHRpbWUgYmVmb3JlIGEgdHJhbnNpdGlvbiBiZWdpbnMuXCJ9fX1cbn0se31dLDEzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cz17XCIkdmVyc2lvblwiOjgsXCIkcm9vdFwiOntcInZlcnNpb25cIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbOF19LFwibmFtZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9LFwiem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwifSxcImJlYXJpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJwaXRjaFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInNvdXJjZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzb3VyY2VzXCJ9LFwic3ByaXRlXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwiZ2x5cGhzXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIn0sXCJsYXllcnNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcImxheWVyXCJ9fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCJ9fSxcInNvdXJjZVwiOltcInNvdXJjZV90aWxlXCIsXCJzb3VyY2VfZ2VvanNvblwiLFwic291cmNlX3ZpZGVvXCIsXCJzb3VyY2VfaW1hZ2VcIl0sXCJzb3VyY2VfdGlsZVwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJ2ZWN0b3JcIixcInJhc3RlclwiXX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjB9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIyfSxcInRpbGVTaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NTEyLFwidW5pdHNcIjpcInBpeGVsc1wifSxcIipcIjp7XCJ0eXBlXCI6XCIqXCJ9fSxcInNvdXJjZV9nZW9qc29uXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImdlb2pzb25cIl19LFwiZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTR9LFwiYnVmZmVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NjR9LFwidG9sZXJhbmNlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6M30sXCJjbHVzdGVyXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImNsdXN0ZXJSYWRpdXNcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0MDB9LFwiY2x1c3Rlck1heFpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcInZpZGVvXCJdfSxcInVybHNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2ltYWdlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcImltYWdlXCJdfSxcInVybFwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwibGF5ZXJcIjp7XCJpZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwicmVxdWlyZWRcIjp0cnVlfSxcInR5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbXCJmaWxsXCIsXCJsaW5lXCIsXCJzeW1ib2xcIixcImNpcmNsZVwiLFwicmFzdGVyXCIsXCJiYWNrZ3JvdW5kXCJdfSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcInJlZlwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInNvdXJjZS1sYXllclwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyfSxcImludGVyYWN0aXZlXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImZpbHRlclwiOntcInR5cGVcIjpcImZpbHRlclwifSxcImxheW91dFwiOntcInR5cGVcIjpcImxheW91dFwifSxcInBhaW50XCI6e1widHlwZVwiOlwicGFpbnRcIn0sXCJwYWludC4qXCI6e1widHlwZVwiOlwicGFpbnRcIn19LFwibGF5b3V0XCI6W1wibGF5b3V0X2ZpbGxcIixcImxheW91dF9saW5lXCIsXCJsYXlvdXRfY2lyY2xlXCIsXCJsYXlvdXRfc3ltYm9sXCIsXCJsYXlvdXRfcmFzdGVyXCIsXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxcImxheW91dF9iYWNrZ3JvdW5kXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9jaXJjbGVcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1widmlzaWJsZVwiLFwibm9uZVwiXSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X2xpbmVcIjp7XCJsaW5lLWNhcFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImJ1dHRcIixcInJvdW5kXCIsXCJzcXVhcmVcIl0sXCJkZWZhdWx0XCI6XCJidXR0XCJ9LFwibGluZS1qb2luXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wiYmV2ZWxcIixcInJvdW5kXCIsXCJtaXRlclwiXSxcImRlZmF1bHRcIjpcIm1pdGVyXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcIm1pdGVyXCJ9XX0sXCJsaW5lLXJvdW5kLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MS4wNSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwicm91bmRcIn1dfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInBvaW50XCIsXCJsaW5lXCJdLFwiZGVmYXVsdFwiOlwicG9pbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjI1MCxcIm1pbmltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbe1wic3ltYm9sLXBsYWNlbWVudFwiOlwibGluZVwifV19LFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlfSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tc2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWltYWdlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0b2tlbnNcIjp0cnVlfSxcImljb24tcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1wYWRkaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MixcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24ta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1maWVsZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOlwiXCIsXCJ0b2tlbnNcIjp0cnVlfSxcInRleHQtZm9udFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJkZWZhdWx0XCI6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxNixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbWF4LXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGluZS1oZWlnaHRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjIsXCJ1bml0c1wiOlwiZW1cIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInVuaXRzXCI6XCJlbVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImxlZnRcIixcImNlbnRlclwiLFwicmlnaHRcIl0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcImNlbnRlclwiLFwibGVmdFwiLFwicmlnaHRcIixcInRvcFwiLFwiYm90dG9tXCIsXCJ0b3AtbGVmdFwiLFwidG9wLXJpZ2h0XCIsXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCJdLFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm5vbmVcIixcInVwcGVyY2FzZVwiLFwibG93ZXJjYXNlXCJdLFwiZGVmYXVsdFwiOlwibm9uZVwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb2Zmc2V0XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbGxvdy1vdmVybGFwXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW9wdGlvbmFsXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJ2aXNpYmxlXCIsXCJub25lXCJdLFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcInZpc2libGVcIixcIm5vbmVcIl0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImZpbHRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiKlwifSxcImZpbHRlcl9vcGVyYXRvclwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOltcIj09XCIsXCIhPVwiLFwiPlwiLFwiPj1cIixcIjxcIixcIjw9XCIsXCJpblwiLFwiIWluXCIsXCJhbGxcIixcImFueVwiLFwibm9uZVwiXX0sXCJnZW9tZXRyeV90eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl19LFwiY29sb3Jfb3BlcmF0aW9uXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6W1wibGlnaHRlblwiLFwic2F0dXJhdGVcIixcInNwaW5cIixcImZhZGVcIixcIm1peFwiXX0sXCJmdW5jdGlvblwiOntcInN0b3BzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInJlcXVpcmVkXCI6dHJ1ZSxcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MH19LFwiZnVuY3Rpb25fc3RvcFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyMixcInZhbHVlXCI6W1wibnVtYmVyXCIsXCJjb2xvclwiXSxcImxlbmd0aFwiOjJ9LFwicGFpbnRcIjpbXCJwYWludF9maWxsXCIsXCJwYWludF9saW5lXCIsXCJwYWludF9jaXJjbGVcIixcInBhaW50X3N5bWJvbFwiLFwicGFpbnRfcmFzdGVyXCIsXCJwYWludF9iYWNrZ3JvdW5kXCJdLFwicGFpbnRfZmlsbFwiOntcImZpbGwtYW50aWFsaWFzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiZGVmYXVsdFwiOnRydWV9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1kYXNoYXJyYXlcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwibWluaW11bVwiOjAsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJsaW5lIHdpZHRoc1wiLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwibGluZS1wYXR0ZXJuXCJ9XX0sXCJsaW5lLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInZhbHVlc1wiOltcIm1hcFwiLFwidmlld3BvcnRcIl0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfc3ltYm9sXCI6e1wiaWNvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCJyZ2JhKDAsIDAsIDAsIDApXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ2YWx1ZXNcIjpbXCJtYXBcIixcInZpZXdwb3J0XCJdLFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcImljb24tdHJhbnNsYXRlXCJdfSxcInRleHQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwidmFsdWVzXCI6W1wibWFwXCIsXCJ2aWV3cG9ydFwiXSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJ0ZXh0LXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfcmFzdGVyXCI6e1wicmFzdGVyLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1odWUtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLXNhdHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItY29udHJhc3RcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9fSxcInBhaW50X2JhY2tncm91bmRcIjp7XCJiYWNrZ3JvdW5kLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiYmFja2dyb3VuZC1wYXR0ZXJuXCJ9XX0sXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifSxcImRlbGF5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX19XG59LHt9XSwxMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQnVmZmVyKHQpe3ZhciBlO3QmJnQubGVuZ3RoJiYoZT10LHQ9ZS5sZW5ndGgpO3ZhciByPW5ldyBVaW50OEFycmF5KHR8fDApO3JldHVybiBlJiZyLnNldChlKSxyLnJlYWRVSW50MzJMRT1CdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRSxyLndyaXRlVUludDMyTEU9QnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFLHIucmVhZEludDMyTEU9QnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRSxyLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSxyLnJlYWRGbG9hdExFPUJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEUsci53cml0ZUZsb2F0TEU9QnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEUsci5yZWFkRG91YmxlTEU9QnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEUsci53cml0ZURvdWJsZUxFPUJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRSxyLnRvU3RyaW5nPUJ1ZmZlck1ldGhvZHMudG9TdHJpbmcsci53cml0ZT1CdWZmZXJNZXRob2RzLndyaXRlLHIuc2xpY2U9QnVmZmVyTWV0aG9kcy5zbGljZSxyLmNvcHk9QnVmZmVyTWV0aG9kcy5jb3B5LHIuX2lzQnVmZmVyPSEwLHJ9ZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHQpe2Zvcih2YXIgZSxyLG49dC5sZW5ndGgsaT1bXSxvPTA7bj5vO28rKyl7aWYoZT10LmNoYXJDb2RlQXQobyksZT41NTI5NSYmNTczNDQ+ZSl7aWYoIXIpe2U+NTYzMTl8fG8rMT09PW4/aS5wdXNoKDIzOSwxOTEsMTg5KTpyPWU7Y29udGludWV9aWYoNTYzMjA+ZSl7aS5wdXNoKDIzOSwxOTEsMTg5KSxyPWU7Y29udGludWV9ZT1yLTU1Mjk2PDwxMHxlLTU2MzIwfDY1NTM2LHI9bnVsbH1lbHNlIHImJihpLnB1c2goMjM5LDE5MSwxODkpLHI9bnVsbCk7MTI4PmU/aS5wdXNoKGUpOjIwNDg+ZT9pLnB1c2goZT4+NnwxOTIsNjMmZXwxMjgpOjY1NTM2PmU/aS5wdXNoKGU+PjEyfDIyNCxlPj42JjYzfDEyOCw2MyZlfDEyOCk6aS5wdXNoKGU+PjE4fDI0MCxlPj4xMiY2M3wxMjgsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfXJldHVybiBpfW1vZHVsZS5leHBvcnRzPUJ1ZmZlcjt2YXIgaWVlZTc1ND1yZXF1aXJlKFwiaWVlZTc1NFwiKSxCdWZmZXJNZXRob2RzLGxhc3RTdHIsbGFzdFN0ckVuY29kZWQ7QnVmZmVyTWV0aG9kcz17cmVhZFVJbnQzMkxFOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHdyaXRlVUludDMyTEU6ZnVuY3Rpb24odCxlKXt0aGlzW2VdPXQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNH0scmVhZEludDMyTEU6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKyh0aGlzW3QrM108PDI0KX0scmVhZEZsb2F0TEU6ZnVuY3Rpb24odCl7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLHQsITAsMjMsNCl9LHJlYWREb3VibGVMRTpmdW5jdGlvbih0KXtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sd3JpdGVGbG9hdExFOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGllZWU3NTQud3JpdGUodGhpcyx0LGUsITAsMjMsNCl9LHdyaXRlRG91YmxlTEU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLHQsZSwhMCw1Miw4KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVwiXCIsaT1cIlwiO2U9ZXx8MCxyPU1hdGgubWluKHRoaXMubGVuZ3RoLHJ8fHRoaXMubGVuZ3RoKTtmb3IodmFyIG89ZTtyPm87bysrKXt2YXIgdT10aGlzW29dOzEyNz49dT8obis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpK1N0cmluZy5mcm9tQ2hhckNvZGUodSksaT1cIlwiKTppKz1cIiVcIit1LnRvU3RyaW5nKDE2KX1yZXR1cm4gbis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpfSx3cml0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10PT09bGFzdFN0cj9sYXN0U3RyRW5jb2RlZDplbmNvZGVTdHJpbmcodCksbj0wO248ci5sZW5ndGg7bisrKXRoaXNbZStuXT1yW25dfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN1YmFycmF5KHQsZSl9LGNvcHk6ZnVuY3Rpb24odCxlKXtlPWV8fDA7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdFtlK3JdPXRoaXNbcl19fSxCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEUsQnVmZmVyLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGxhc3RTdHI9dCxsYXN0U3RyRW5jb2RlZD1lbmNvZGVTdHJpbmcodCksbGFzdFN0ckVuY29kZWQubGVuZ3RofSxCdWZmZXIuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8IXQuX2lzQnVmZmVyKX07XG59LHtcImllZWU3NTRcIjoxMjZ9XSwxMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUGJmKHQpe3RoaXMuYnVmPUJ1ZmZlci5pc0J1ZmZlcih0KT90Om5ldyBCdWZmZXIodHx8MCksdGhpcy5wb3M9MCx0aGlzLmxlbmd0aD10aGlzLmJ1Zi5sZW5ndGh9ZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTVmFyaW50KHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRmxvYXQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRG91YmxlKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVCb29sZWFuKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVGaXhlZDMyKHRbZV0pfWZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlU0ZpeGVkMzIodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZUZpeGVkNjQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTRml4ZWQ2NCh0W2VdKX1tb2R1bGUuZXhwb3J0cz1QYmY7dmFyIEJ1ZmZlcj1nbG9iYWwuQnVmZmVyfHxyZXF1aXJlKFwiLi9idWZmZXJcIik7UGJmLlZhcmludD0wLFBiZi5GaXhlZDY0PTEsUGJmLkJ5dGVzPTIsUGJmLkZpeGVkMzI9NTt2YXIgU0hJRlRfTEVGVF8zMj00Mjk0OTY3Mjk2LFNISUZUX1JJR0hUXzMyPTEvU0hJRlRfTEVGVF8zMixQT1dfMl82Mz1NYXRoLnBvdygyLDYzKTtQYmYucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGksZSl7Zm9yKGU9ZXx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8ZTspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLHM9cj4+MyxuPXRoaXMucG9zO3QocyxpLHRoaXMpLHRoaXMucG9zPT09biYmdGhpcy5za2lwKHIpfXJldHVybiBpfSxyZWFkTWVzc2FnZTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxpLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX0scmVhZEZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MrNCkqU0hJRlRfTEVGVF8zMjtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFNGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSt0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcys0KSpTSElGVF9MRUZUXzMyO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkRmxvYXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkRG91YmxlTEUodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxlLHIscyxuLG89dGhpcy5idWY7aWYoZT1vW3RoaXMucG9zKytdLDEyOD5lKXJldHVybiBlO2lmKGU9MTI3JmUscj1vW3RoaXMucG9zKytdLDEyOD5yKXJldHVybiBlfHI8PDc7aWYocj0oMTI3JnIpPDw3LHM9b1t0aGlzLnBvcysrXSwxMjg+cylyZXR1cm4gZXxyfHM8PDE0O2lmKHM9KDEyNyZzKTw8MTQsbj1vW3RoaXMucG9zKytdLDEyOD5uKXJldHVybiBlfHJ8c3xuPDwyMTtpZih0PWV8cnxzfCgxMjcmbik8PDIxLGk9b1t0aGlzLnBvcysrXSx0Kz0yNjg0MzU0NTYqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MzQzNTk3MzgzNjgqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NDM5ODA0NjUxMTEwNCooMTI3JmkpLDEyOD5pKXJldHVybiB0O2lmKGk9b1t0aGlzLnBvcysrXSx0Kz01NjI5NDk5NTM0MjEzMTIqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9NzIwNTc1OTQwMzc5Mjc5NDAqKDEyNyZpKSwxMjg+aSlyZXR1cm4gdDtpZihpPW9bdGhpcy5wb3MrK10sdCs9MHg4MDAwMDAwMDAwMDAwMDAwKigxMjcmaSksMTI4PmkpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXNcIil9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zLGk9dGhpcy5yZWFkVmFyaW50KCk7aWYoUE9XXzJfNjM+aSlyZXR1cm4gaTtmb3IodmFyIGU9dGhpcy5wb3MtMjsyNTU9PT10aGlzLmJ1ZltlXTspZS0tO3Q+ZSYmKGU9dCksaT0wO2Zvcih2YXIgcj0wO2UtdCsxPnI7cisrKXt2YXIgcz0xMjcmfnRoaXMuYnVmW3Qrcl07aSs9ND5yP3M8PDcqcjpzKk1hdGgucG93KDIsNypyKX1yZXR1cm4taS0xfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPXRoaXMuYnVmLnRvU3RyaW5nKFwidXRmOFwiLHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGl9LHJlYWRCeXRlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9dGhpcy5idWYuc2xpY2UodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsaX0scmVhZFBhY2tlZFZhcmludDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGbG9hdDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gaX0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsaT1bXTt0aGlzLnBvczx0OylpLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiBpfSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBpPTcmdDtpZihpPT09UGJmLlZhcmludClmb3IoO3RoaXMuYnVmW3RoaXMucG9zKytdPjEyNzspO2Vsc2UgaWYoaT09PVBiZi5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGk9PT1QYmYuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNle2lmKGkhPT1QYmYuRml4ZWQ2NCl0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkIHR5cGU6IFwiK2kpO3RoaXMucG9zKz04fX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8aSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXRoaXMubGVuZ3RofHwxNjtpPHRoaXMucG9zK3Q7KWkqPTI7aWYoaSE9PXRoaXMubGVuZ3RoKXt2YXIgZT1uZXcgQnVmZmVyKGkpO3RoaXMuYnVmLmNvcHkoZSksdGhpcy5idWY9ZSx0aGlzLmxlbmd0aD1pfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc2xpY2UoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVVSW50MzJMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVJbnQzMkxFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKE1hdGguZmxvb3IodCpTSElGVF9SSUdIVF8zMiksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSgtMSZ0LHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih0KlNISUZUX1JJR0hUXzMyKSx0aGlzLnBvcys0KSx0aGlzLnBvcys9OH0sd3JpdGVWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodD0rdCwxMjc+PXQpdGhpcy5yZWFsbG9jKDEpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQ7ZWxzZSBpZigxNjM4Mz49dCl0aGlzLnJlYWxsb2MoMiksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjc7ZWxzZSBpZigyMDk3MTUxPj10KXRoaXMucmVhbGxvYygzKSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+MCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyN3wxMjgsdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjE0JjEyNztlbHNlIGlmKDI2ODQzNTQ1NT49dCl0aGlzLnJlYWxsb2MoNCksdGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjAmMTI3fDEyOCx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10Pj4+NyYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4xNCYxMjd8MTI4LHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj4yMSYxMjc7ZWxzZXtmb3IodmFyIGk9dGhpcy5wb3M7dD49MTI4Oyl0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MjU1JnR8MTI4LHQvPTEyODtpZih0aGlzLnJlYWxsb2MoMSksdGhpcy5idWZbdGhpcy5wb3MrK109MHx0LHRoaXMucG9zLWk+MTApdGhyb3cgbmV3IEVycm9yKFwiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNcIil9fSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCgwPnQ/MiotdC0xOjIqdCl9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KTt2YXIgaT1CdWZmZXIuYnl0ZUxlbmd0aCh0KTt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKSx0aGlzLmJ1Zi53cml0ZSh0LHRoaXMucG9zKSx0aGlzLnBvcys9aX0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVGbG9hdExFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5idWYud3JpdGVEb3VibGVMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgaT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKTtmb3IodmFyIGU9MDtpPmU7ZSsrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbZV19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGkpe3RoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dChpLHRoaXMpO3ZhciByPXRoaXMucG9zLWUscz0xMjc+PXI/MToxNjM4Mz49cj8yOjIwOTcxNTE+PXI/MzoyNjg0MzU0NTU+PXI/NDpNYXRoLmNlaWwoTWF0aC5sb2cocikvKDcqTWF0aC5MTjIpKTtpZihzPjEpe3RoaXMucmVhbGxvYyhzLTEpO2Zvcih2YXIgbj10aGlzLnBvcy0xO24+PWU7bi0tKXRoaXMuYnVmW24rcy0xXT10aGlzLmJ1ZltuXX10aGlzLnBvcz1lLTEsdGhpcy53cml0ZVZhcmludChyKSx0aGlzLnBvcys9cn0sd3JpdGVNZXNzYWdlOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLndyaXRlVGFnKHQsUGJmLkJ5dGVzKSx0aGlzLndyaXRlUmF3TWVzc2FnZShpLGUpfSx3cml0ZVBhY2tlZFZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRWYXJpbnQsaSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTVmFyaW50LGkpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkQm9vbGVhbixpKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRGbG9hdCxpKX0sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRG91YmxlLGkpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRTRml4ZWQzMixpKX0sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZEZpeGVkNjQsaSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkU0ZpeGVkNjQsaSl9LHdyaXRlQnl0ZXNGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhpKX0sd3JpdGVGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGkpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVTRml4ZWQzMihpKX0sd3JpdGVGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGkpfSx3cml0ZVNGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChpKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlVmFyaW50KGkpfSx3cml0ZVNWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChpKX0sd3JpdGVTdHJpbmdGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoaSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuRml4ZWQzMiksdGhpcy53cml0ZUZsb2F0KGkpfSx3cml0ZURvdWJsZUZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGkpfSx3cml0ZUJvb2xlYW5GaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVWYXJpbnRGaWVsZCh0LEJvb2xlYW4oaSkpfX07XG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL2J1ZmZlclwiOjEzNX1dLDEzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBQb2ludCh0LG4pe3RoaXMueD10LHRoaXMueT1ufW1vZHVsZS5leHBvcnRzPVBvaW50LFBvaW50LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LG1hdE11bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdCh0KX0sdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKX0scGVycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKX0scm91bmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpfSxtYWc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54PT09dC54JiZ0aGlzLnk9PT10Lnl9LGRpc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIodCkpfSxkaXN0U3FyOmZ1bmN0aW9uKHQpe3ZhciBuPXQueC10aGlzLngsaT10LnktdGhpcy55O3JldHVybiBuKm4raSppfSxhbmdsZTpmdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpfSxhbmdsZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueS10LnksdGhpcy54LXQueCl9LGFuZ2xlV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAodC54LHQueSl9LGFuZ2xlV2l0aFNlcDpmdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueCpuLXRoaXMueSp0LHRoaXMueCp0K3RoaXMueSpuKX0sX21hdE11bHQ6ZnVuY3Rpb24odCl7dmFyIG49dFswXSp0aGlzLngrdFsxXSp0aGlzLnksaT10WzJdKnRoaXMueCt0WzNdKnRoaXMueTtyZXR1cm4gdGhpcy54PW4sdGhpcy55PWksdGhpc30sX2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc30sX3N1YjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc30sX211bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc30sX2RpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LHRoaXMueS89dCx0aGlzfSxfdW5pdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXYodGhpcy5tYWcoKSksdGhpc30sX3BlcnA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnk7cmV0dXJuIHRoaXMueT10aGlzLngsdGhpcy54PS10LHRoaXN9LF9yb3RhdGU6ZnVuY3Rpb24odCl7dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPW4qdGhpcy54LWkqdGhpcy55LHI9aSp0aGlzLngrbip0aGlzLnk7cmV0dXJuIHRoaXMueD1zLHRoaXMueT1yLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LFBvaW50LmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQb2ludD90OkFycmF5LmlzQXJyYXkodCk/bmV3IFBvaW50KHRbMF0sdFsxXSk6dH07XG59LHt9XSwxMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7ZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLmxlbmd0aD9xdWV1ZT1jdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTpxdWV1ZUluZGV4PS0xLHF1ZXVlLmxlbmd0aCYmZHJhaW5RdWV1ZSgpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighZHJhaW5pbmcpe3ZhciBlPXNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtkcmFpbmluZz0hMDtmb3IodmFyIG49cXVldWUubGVuZ3RoO247KXtmb3IoY3VycmVudFF1ZXVlPXF1ZXVlLHF1ZXVlPVtdOysrcXVldWVJbmRleDxuOyljdXJyZW50UXVldWUmJmN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtxdWV1ZUluZGV4PS0xLG49cXVldWUubGVuZ3RofWN1cnJlbnRRdWV1ZT1udWxsLGRyYWluaW5nPSExLGNsZWFyVGltZW91dChlKX19ZnVuY3Rpb24gSXRlbShlLG4pe3RoaXMuZnVuPWUsdGhpcy5hcnJheT1ufWZ1bmN0aW9uIG5vb3AoKXt9dmFyIHByb2Nlc3M9bW9kdWxlLmV4cG9ydHM9e30scXVldWU9W10sZHJhaW5pbmc9ITEsY3VycmVudFF1ZXVlLHF1ZXVlSW5kZXg9LTE7cHJvY2Vzcy5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgbj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3F1ZXVlLnB1c2gobmV3IEl0ZW0oZSxuKSksMSE9PXF1ZXVlLmxlbmd0aHx8ZHJhaW5pbmd8fHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwwKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0scHJvY2Vzcy50aXRsZT1cImJyb3dzZXJcIixwcm9jZXNzLmJyb3dzZXI9ITAscHJvY2Vzcy5lbnY9e30scHJvY2Vzcy5hcmd2PVtdLHByb2Nlc3MudmVyc2lvbj1cIlwiLHByb2Nlc3MudmVyc2lvbnM9e30scHJvY2Vzcy5vbj1ub29wLHByb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcCxwcm9jZXNzLm9uY2U9bm9vcCxwcm9jZXNzLm9mZj1ub29wLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcCxwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLHByb2Nlc3MuZW1pdD1ub29wLHByb2Nlc3MuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX0scHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn0scHJvY2Vzcy5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9LHByb2Nlc3MudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH07XG59LHt9XSwxMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuIWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChpLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgdD8odGhpcy5fbWF4RW50cmllcz1NYXRoLm1heCg0LGl8fDkpLHRoaXMuX21pbkVudHJpZXM9TWF0aC5tYXgoMixNYXRoLmNlaWwoLjQqdGhpcy5fbWF4RW50cmllcykpLG4mJnRoaXMuX2luaXRGb3JtYXQobiksdm9pZCB0aGlzLmNsZWFyKCkpOm5ldyB0KGksbil9ZnVuY3Rpb24gaSh0LGkpe3QuYmJveD1uKHQsMCx0LmNoaWxkcmVuLmxlbmd0aCxpKX1mdW5jdGlvbiBuKHQsaSxuLHIpe2Zvcih2YXIgbyxhPWUoKSxzPWk7bj5zO3MrKylvPXQuY2hpbGRyZW5bc10saChhLHQubGVhZj9yKG8pOm8uYmJveCk7cmV0dXJuIGF9ZnVuY3Rpb24gZSgpe3JldHVyblsxLzAsMS8wLC0oMS8wKSwtKDEvMCldfWZ1bmN0aW9uIGgodCxpKXtyZXR1cm4gdFswXT1NYXRoLm1pbih0WzBdLGlbMF0pLHRbMV09TWF0aC5taW4odFsxXSxpWzFdKSx0WzJdPU1hdGgubWF4KHRbMl0saVsyXSksdFszXT1NYXRoLm1heCh0WzNdLGlbM10pLHR9ZnVuY3Rpb24gcih0LGkpe3JldHVybiB0LmJib3hbMF0taS5iYm94WzBdfWZ1bmN0aW9uIG8odCxpKXtyZXR1cm4gdC5iYm94WzFdLWkuYmJveFsxXX1mdW5jdGlvbiBhKHQpe3JldHVybih0WzJdLXRbMF0pKih0WzNdLXRbMV0pfWZ1bmN0aW9uIHModCl7cmV0dXJuIHRbMl0tdFswXSsodFszXS10WzFdKX1mdW5jdGlvbiBsKHQsaSl7cmV0dXJuKE1hdGgubWF4KGlbMl0sdFsyXSktTWF0aC5taW4oaVswXSx0WzBdKSkqKE1hdGgubWF4KGlbM10sdFszXSktTWF0aC5taW4oaVsxXSx0WzFdKSl9ZnVuY3Rpb24gdSh0LGkpe3ZhciBuPU1hdGgubWF4KHRbMF0saVswXSksZT1NYXRoLm1heCh0WzFdLGlbMV0pLGg9TWF0aC5taW4odFsyXSxpWzJdKSxyPU1hdGgubWluKHRbM10saVszXSk7cmV0dXJuIE1hdGgubWF4KDAsaC1uKSpNYXRoLm1heCgwLHItZSl9ZnVuY3Rpb24gZih0LGkpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZpWzJdPD10WzJdJiZpWzNdPD10WzNdfWZ1bmN0aW9uIGModCxpKXtyZXR1cm4gaVswXTw9dFsyXSYmaVsxXTw9dFszXSYmaVsyXT49dFswXSYmaVszXT49dFsxXX1mdW5jdGlvbiBkKHQsaSxuLGUsaCl7Zm9yKHZhciByLG89W2ksbl07by5sZW5ndGg7KW49by5wb3AoKSxpPW8ucG9wKCksZT49bi1pfHwocj1pK01hdGguY2VpbCgobi1pKS9lLzIpKmUseCh0LGksbixyLGgpLG8ucHVzaChpLHIscixuKSl9ZnVuY3Rpb24geCh0LGksbixlLGgpe2Zvcih2YXIgcixvLGEscyxsLHUsZixjLGQ7bj5pOyl7Zm9yKG4taT42MDAmJihyPW4taSsxLG89ZS1pKzEsYT1NYXRoLmxvZyhyKSxzPS41Kk1hdGguZXhwKDIqYS8zKSxsPS41Kk1hdGguc3FydChhKnMqKHItcykvcikqKDA+by1yLzI/LTE6MSksdT1NYXRoLm1heChpLE1hdGguZmxvb3IoZS1vKnMvcitsKSksZj1NYXRoLm1pbihuLE1hdGguZmxvb3IoZSsoci1vKSpzL3IrbCkpLHgodCx1LGYsZSxoKSksYz10W2VdLG89aSxkPW4scCh0LGksZSksaCh0W25dLGMpPjAmJnAodCxpLG4pO2Q+bzspe2ZvcihwKHQsbyxkKSxvKyssZC0tO2godFtvXSxjKTwwOylvKys7Zm9yKDtoKHRbZF0sYyk+MDspZC0tfTA9PT1oKHRbaV0sYyk/cCh0LGksZCk6KGQrKyxwKHQsZCxuKSksZT49ZCYmKGk9ZCsxKSxkPj1lJiYobj1kLTEpfX1mdW5jdGlvbiBwKHQsaSxuKXt2YXIgZT10W2ldO3RbaV09dFtuXSx0W25dPWV9dC5wcm90b3R5cGU9e2FsbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLFtdKX0sc2VhcmNoOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPVtdLGU9dGhpcy50b0JCb3g7aWYoIWModCxpLmJib3gpKXJldHVybiBuO2Zvcih2YXIgaCxyLG8sYSxzPVtdO2k7KXtmb3IoaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sYT1pLmxlYWY/ZShvKTpvLmJib3gsYyh0LGEpJiYoaS5sZWFmP24ucHVzaChvKTpmKHQsYSk/dGhpcy5fYWxsKG8sbik6cy5wdXNoKG8pKTtpPXMucG9wKCl9cmV0dXJuIG59LGNvbGxpZGVzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZGF0YSxuPXRoaXMudG9CQm94O2lmKCFjKHQsaS5iYm94KSlyZXR1cm4hMTtmb3IodmFyIGUsaCxyLG8sYT1bXTtpOyl7Zm9yKGU9MCxoPWkuY2hpbGRyZW4ubGVuZ3RoO2g+ZTtlKyspaWYocj1pLmNoaWxkcmVuW2VdLG89aS5sZWFmP24ocik6ci5iYm94LGModCxvKSl7aWYoaS5sZWFmfHxmKHQsbykpcmV0dXJuITA7YS5wdXNoKHIpfWk9YS5wb3AoKX1yZXR1cm4hMX0sbG9hZDpmdW5jdGlvbih0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiB0aGlzO2lmKHQubGVuZ3RoPHRoaXMuX21pbkVudHJpZXMpe2Zvcih2YXIgaT0wLG49dC5sZW5ndGg7bj5pO2krKyl0aGlzLmluc2VydCh0W2ldKTtyZXR1cm4gdGhpc312YXIgZT10aGlzLl9idWlsZCh0LnNsaWNlKCksMCx0Lmxlbmd0aC0xLDApO2lmKHRoaXMuZGF0YS5jaGlsZHJlbi5sZW5ndGgpaWYodGhpcy5kYXRhLmhlaWdodD09PWUuaGVpZ2h0KXRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsZSk7ZWxzZXtpZih0aGlzLmRhdGEuaGVpZ2h0PGUuaGVpZ2h0KXt2YXIgaD10aGlzLmRhdGE7dGhpcy5kYXRhPWUsZT1ofXRoaXMuX2luc2VydChlLHRoaXMuZGF0YS5oZWlnaHQtZS5oZWlnaHQtMSwhMCl9ZWxzZSB0aGlzLmRhdGE9ZTtyZXR1cm4gdGhpc30saW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9pbnNlcnQodCx0aGlzLmRhdGEuaGVpZ2h0LTEpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YT17Y2hpbGRyZW46W10saGVpZ2h0OjEsYmJveDplKCksbGVhZjohMH0sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzO2Zvcih2YXIgaSxuLGUsaCxyPXRoaXMuZGF0YSxvPXRoaXMudG9CQm94KHQpLGE9W10scz1bXTtyfHxhLmxlbmd0aDspe2lmKHJ8fChyPWEucG9wKCksbj1hW2EubGVuZ3RoLTFdLGk9cy5wb3AoKSxoPSEwKSxyLmxlYWYmJihlPXIuY2hpbGRyZW4uaW5kZXhPZih0KSwtMSE9PWUpKXJldHVybiByLmNoaWxkcmVuLnNwbGljZShlLDEpLGEucHVzaChyKSx0aGlzLl9jb25kZW5zZShhKSx0aGlzO2h8fHIubGVhZnx8IWYoci5iYm94LG8pP24/KGkrKyxyPW4uY2hpbGRyZW5baV0saD0hMSk6cj1udWxsOihhLnB1c2gocikscy5wdXNoKGkpLGk9MCxuPXIscj1yLmNoaWxkcmVuWzBdKX1yZXR1cm4gdGhpc30sdG9CQm94OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjb21wYXJlTWluWDpmdW5jdGlvbih0LGkpe3JldHVybiB0WzBdLWlbMF19LGNvbXBhcmVNaW5ZOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbMV0taVsxXX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxpKXtmb3IodmFyIG49W107dDspdC5sZWFmP2kucHVzaC5hcHBseShpLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gaX0sX2J1aWxkOmZ1bmN0aW9uKHQsbixlLGgpe3ZhciByLG89ZS1uKzEsYT10aGlzLl9tYXhFbnRyaWVzO2lmKGE+PW8pcmV0dXJuIHI9e2NoaWxkcmVuOnQuc2xpY2UobixlKzEpLGhlaWdodDoxLGJib3g6bnVsbCxsZWFmOiEwfSxpKHIsdGhpcy50b0JCb3gpLHI7aHx8KGg9TWF0aC5jZWlsKE1hdGgubG9nKG8pL01hdGgubG9nKGEpKSxhPU1hdGguY2VpbChvL01hdGgucG93KGEsaC0xKSkpLHI9e2NoaWxkcmVuOltdLGhlaWdodDpoLGJib3g6bnVsbCxsZWFmOiExfTt2YXIgcyxsLHUsZixjPU1hdGguY2VpbChvL2EpLHg9YypNYXRoLmNlaWwoTWF0aC5zcXJ0KGEpKTtmb3IoZCh0LG4sZSx4LHRoaXMuY29tcGFyZU1pblgpLHM9bjtlPj1zO3MrPXgpZm9yKHU9TWF0aC5taW4ocyt4LTEsZSksZCh0LHMsdSxjLHRoaXMuY29tcGFyZU1pblkpLGw9czt1Pj1sO2wrPWMpZj1NYXRoLm1pbihsK2MtMSx1KSxyLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCxsLGYsaC0xKSk7cmV0dXJuIGkocix0aGlzLnRvQkJveCkscn0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxpLG4sZSl7Zm9yKHZhciBoLHIsbyxzLHUsZixjLGQ7Oyl7aWYoZS5wdXNoKGkpLGkubGVhZnx8ZS5sZW5ndGgtMT09PW4pYnJlYWs7Zm9yKGM9ZD0xLzAsaD0wLHI9aS5jaGlsZHJlbi5sZW5ndGg7cj5oO2grKylvPWkuY2hpbGRyZW5baF0sdT1hKG8uYmJveCksZj1sKHQsby5iYm94KS11LGQ+Zj8oZD1mLGM9Yz51P3U6YyxzPW8pOmY9PT1kJiZjPnUmJihjPXUscz1vKTtpPXN9cmV0dXJuIGl9LF9pbnNlcnQ6ZnVuY3Rpb24odCxpLG4pe3ZhciBlPXRoaXMudG9CQm94LHI9bj90LmJib3g6ZSh0KSxvPVtdLGE9dGhpcy5fY2hvb3NlU3VidHJlZShyLHRoaXMuZGF0YSxpLG8pO2ZvcihhLmNoaWxkcmVuLnB1c2godCksaChhLmJib3gscik7aT49MCYmb1tpXS5jaGlsZHJlbi5sZW5ndGg+dGhpcy5fbWF4RW50cmllczspdGhpcy5fc3BsaXQobyxpKSxpLS07dGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKHIsbyxpKX0sX3NwbGl0OmZ1bmN0aW9uKHQsbil7dmFyIGU9dFtuXSxoPWUuY2hpbGRyZW4ubGVuZ3RoLHI9dGhpcy5fbWluRW50cmllczt0aGlzLl9jaG9vc2VTcGxpdEF4aXMoZSxyLGgpO3ZhciBvPXRoaXMuX2Nob29zZVNwbGl0SW5kZXgoZSxyLGgpLGE9e2NoaWxkcmVuOmUuY2hpbGRyZW4uc3BsaWNlKG8sZS5jaGlsZHJlbi5sZW5ndGgtbyksaGVpZ2h0OmUuaGVpZ2h0LGJib3g6bnVsbCxsZWFmOiExfTtlLmxlYWYmJihhLmxlYWY9ITApLGkoZSx0aGlzLnRvQkJveCksaShhLHRoaXMudG9CQm94KSxuP3Rbbi0xXS5jaGlsZHJlbi5wdXNoKGEpOnRoaXMuX3NwbGl0Um9vdChlLGEpfSxfc3BsaXRSb290OmZ1bmN0aW9uKHQsbil7dGhpcy5kYXRhPXtjaGlsZHJlbjpbdCxuXSxoZWlnaHQ6dC5oZWlnaHQrMSxiYm94Om51bGwsbGVhZjohMX0saSh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGksZSl7dmFyIGgscixvLHMsbCxmLGMsZDtmb3IoZj1jPTEvMCxoPWk7ZS1pPj1oO2grKylyPW4odCwwLGgsdGhpcy50b0JCb3gpLG89bih0LGgsZSx0aGlzLnRvQkJveCkscz11KHIsbyksbD1hKHIpK2EobyksZj5zPyhmPXMsZD1oLGM9Yz5sP2w6Yyk6cz09PWYmJmM+bCYmKGM9bCxkPWgpO3JldHVybiBkfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsaSxuKXt2YXIgZT10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpyLGg9dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6byxhPXRoaXMuX2FsbERpc3RNYXJnaW4odCxpLG4sZSkscz10aGlzLl9hbGxEaXN0TWFyZ2luKHQsaSxuLGgpO3M+YSYmdC5jaGlsZHJlbi5zb3J0KGUpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGksZSxyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIG8sYSxsPXRoaXMudG9CQm94LHU9bih0LDAsaSxsKSxmPW4odCxlLWksZSxsKSxjPXModSkrcyhmKTtmb3Iobz1pO2UtaT5vO28rKylhPXQuY2hpbGRyZW5bb10saCh1LHQubGVhZj9sKGEpOmEuYmJveCksYys9cyh1KTtmb3Iobz1lLWktMTtvPj1pO28tLSlhPXQuY2hpbGRyZW5bb10saChmLHQubGVhZj9sKGEpOmEuYmJveCksYys9cyhmKTtyZXR1cm4gY30sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGksbil7Zm9yKHZhciBlPW47ZT49MDtlLS0paChpW2VdLmJib3gsdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIG4sZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKTA9PT10W2VdLmNoaWxkcmVuLmxlbmd0aD9lPjA/KG49dFtlLTFdLmNoaWxkcmVuLG4uc3BsaWNlKG4uaW5kZXhPZih0W2VdKSwxKSk6dGhpcy5jbGVhcigpOmkodFtlXSx0aGlzLnRvQkJveCl9LF9pbml0Rm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBpPVtcInJldHVybiBhXCIsXCIgLSBiXCIsXCI7XCJdO3RoaXMuY29tcGFyZU1pblg9bmV3IEZ1bmN0aW9uKFwiYVwiLFwiYlwiLGkuam9pbih0WzBdKSksdGhpcy5jb21wYXJlTWluWT1uZXcgRnVuY3Rpb24oXCJhXCIsXCJiXCIsaS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oXCJhXCIsXCJyZXR1cm4gW2FcIit0LmpvaW4oXCIsIGFcIikrXCJdO1wiKX19LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJyYnVzaFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTpcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQ6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZi5yYnVzaD10OndpbmRvdy5yYnVzaD10fSgpO1xufSx7fV0sMTQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZvaWQgZnVuY3Rpb24oZSxyKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHIpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXIoKTplLnJlc29sdmVVcmw9cigpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7aWYoMD09PWUpdGhyb3cgbmV3IEVycm9yKFwicmVzb2x2ZVVybCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQ7IGdvdCBub25lLlwiKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKTtpZihyLmhyZWY9YXJndW1lbnRzWzBdLDE9PT1lKXJldHVybiByLmhyZWY7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO3QuaW5zZXJ0QmVmb3JlKHIsdC5maXJzdENoaWxkKTtmb3IodmFyIG4sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSxmPTE7ZT5mO2YrKylvLmhyZWY9YXJndW1lbnRzW2ZdLG49by5ocmVmLHIuaHJlZj1uO3JldHVybiB0LnJlbW92ZUNoaWxkKHIpLG59cmV0dXJuIGV9KTtcbn0se31dLDE0MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBVbml0QmV6aWVyKHQsaSxlLHIpe3RoaXMuY3g9Myp0LHRoaXMuYng9MyooZS10KS10aGlzLmN4LHRoaXMuYXg9MS10aGlzLmN4LXRoaXMuYngsdGhpcy5jeT0zKmksdGhpcy5ieT0zKihyLWkpLXRoaXMuY3ksdGhpcy5heT0xLXRoaXMuY3ktdGhpcy5ieSx0aGlzLnAxeD10LHRoaXMucDF5PXIsdGhpcy5wMng9ZSx0aGlzLnAyeT1yfW1vZHVsZS5leHBvcnRzPVVuaXRCZXppZXIsVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heCp0K3RoaXMuYngpKnQrdGhpcy5jeCkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWD1mdW5jdGlvbih0KXtyZXR1cm4oMyp0aGlzLmF4KnQrMip0aGlzLmJ4KSp0K3RoaXMuY3h9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYPWZ1bmN0aW9uKHQsaSl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIGkmJihpPTFlLTYpO3ZhciBlLHIscyxoLG47Zm9yKHM9dCxuPTA7OD5uO24rKyl7aWYoaD10aGlzLnNhbXBsZUN1cnZlWChzKS10LE1hdGguYWJzKGgpPGkpcmV0dXJuIHM7dmFyIHU9dGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHMpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7cy09aC91fWlmKGU9MCxyPTEscz10LGU+cylyZXR1cm4gZTtpZihzPnIpcmV0dXJuIHI7Zm9yKDtyPmU7KXtpZihoPXRoaXMuc2FtcGxlQ3VydmVYKHMpLE1hdGguYWJzKGgtdCk8aSlyZXR1cm4gczt0Pmg/ZT1zOnI9cyxzPS41KihyLWUpK2V9cmV0dXJuIHN9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCxpKSl9O1xufSx7fV0sMTQyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG8pe3JldHVybiBvJiZcIm9iamVjdFwiPT10eXBlb2YgbyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygby5jb3B5JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvLmZpbGwmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG8ucmVhZFVJbnQ4fTtcbn0se31dLDE0MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbmZ1bmN0aW9uIGluc3BlY3QoZSxyKXt2YXIgdD17c2VlbjpbXSxzdHlsaXplOnN0eWxpemVOb0NvbG9yfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHQuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYodC5jb2xvcnM9YXJndW1lbnRzWzNdKSxpc0Jvb2xlYW4ocik/dC5zaG93SGlkZGVuPXI6ciYmZXhwb3J0cy5fZXh0ZW5kKHQsciksaXNVbmRlZmluZWQodC5zaG93SGlkZGVuKSYmKHQuc2hvd0hpZGRlbj0hMSksaXNVbmRlZmluZWQodC5kZXB0aCkmJih0LmRlcHRoPTIpLGlzVW5kZWZpbmVkKHQuY29sb3JzKSYmKHQuY29sb3JzPSExKSxpc1VuZGVmaW5lZCh0LmN1c3RvbUluc3BlY3QpJiYodC5jdXN0b21JbnNwZWN0PSEwKSx0LmNvbG9ycyYmKHQuc3R5bGl6ZT1zdHlsaXplV2l0aENvbG9yKSxmb3JtYXRWYWx1ZSh0LGUsdC5kZXB0aCl9ZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihlLHIpe3ZhciB0PWluc3BlY3Quc3R5bGVzW3JdO3JldHVybiB0P1wiXHUwMDFiW1wiK2luc3BlY3QuY29sb3JzW3RdWzBdK1wibVwiK2UrXCJcdTAwMWJbXCIraW5zcGVjdC5jb2xvcnNbdF1bMV0rXCJtXCI6ZX1mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihlLHIpe3JldHVybiBlfWZ1bmN0aW9uIGFycmF5VG9IYXNoKGUpe3ZhciByPXt9O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtyW2VdPSEwfSkscn1mdW5jdGlvbiBmb3JtYXRWYWx1ZShlLHIsdCl7aWYoZS5jdXN0b21JbnNwZWN0JiZyJiZpc0Z1bmN0aW9uKHIuaW5zcGVjdCkmJnIuaW5zcGVjdCE9PWV4cG9ydHMuaW5zcGVjdCYmKCFyLmNvbnN0cnVjdG9yfHxyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXIpKXt2YXIgbj1yLmluc3BlY3QodCxlKTtyZXR1cm4gaXNTdHJpbmcobil8fChuPWZvcm1hdFZhbHVlKGUsbix0KSksbn12YXIgaT1mb3JtYXRQcmltaXRpdmUoZSxyKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKHIpLHM9YXJyYXlUb0hhc2gobyk7aWYoZS5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKSksaXNFcnJvcihyKSYmKG8uaW5kZXhPZihcIm1lc3NhZ2VcIik+PTB8fG8uaW5kZXhPZihcImRlc2NyaXB0aW9uXCIpPj0wKSlyZXR1cm4gZm9ybWF0RXJyb3Iocik7aWYoMD09PW8ubGVuZ3RoKXtpZihpc0Z1bmN0aW9uKHIpKXt2YXIgdT1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO3JldHVybiBlLnN0eWxpemUoXCJbRnVuY3Rpb25cIit1K1wiXVwiLFwic3BlY2lhbFwiKX1pZihpc1JlZ0V4cChyKSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSxcInJlZ2V4cFwiKTtpZihpc0RhdGUocikpcmV0dXJuIGUuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwiZGF0ZVwiKTtpZihpc0Vycm9yKHIpKXJldHVybiBmb3JtYXRFcnJvcihyKX12YXIgYT1cIlwiLGM9ITEsbD1bXCJ7XCIsXCJ9XCJdO2lmKGlzQXJyYXkocikmJihjPSEwLGw9W1wiW1wiLFwiXVwiXSksaXNGdW5jdGlvbihyKSl7dmFyIHA9ci5uYW1lP1wiOiBcIityLm5hbWU6XCJcIjthPVwiIFtGdW5jdGlvblwiK3ArXCJdXCJ9aWYoaXNSZWdFeHAocikmJihhPVwiIFwiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSksaXNEYXRlKHIpJiYoYT1cIiBcIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHIpKSxpc0Vycm9yKHIpJiYoYT1cIiBcIitmb3JtYXRFcnJvcihyKSksMD09PW8ubGVuZ3RoJiYoIWN8fDA9PXIubGVuZ3RoKSlyZXR1cm4gbFswXSthK2xbMV07aWYoMD50KXJldHVybiBpc1JlZ0V4cChyKT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpOmUuc3R5bGl6ZShcIltPYmplY3RdXCIsXCJzcGVjaWFsXCIpO2Uuc2Vlbi5wdXNoKHIpO3ZhciBmO3JldHVybiBmPWM/Zm9ybWF0QXJyYXkoZSxyLHQscyxvKTpvLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZm9ybWF0UHJvcGVydHkoZSxyLHQscyxuLGMpfSksZS5zZWVuLnBvcCgpLHJlZHVjZVRvU2luZ2xlU3RyaW5nKGYsYSxsKX1mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoZSxyKXtpZihpc1VuZGVmaW5lZChyKSlyZXR1cm4gZS5zdHlsaXplKFwidW5kZWZpbmVkXCIsXCJ1bmRlZmluZWRcIik7aWYoaXNTdHJpbmcocikpe3ZhciB0PVwiJ1wiK0pTT04uc3RyaW5naWZ5KHIpLnJlcGxhY2UoL15cInxcIiQvZyxcIlwiKS5yZXBsYWNlKC8nL2csXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywnXCInKStcIidcIjtyZXR1cm4gZS5zdHlsaXplKHQsXCJzdHJpbmdcIil9cmV0dXJuIGlzTnVtYmVyKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJudW1iZXJcIik6aXNCb29sZWFuKHIpP2Uuc3R5bGl6ZShcIlwiK3IsXCJib29sZWFuXCIpOmlzTnVsbChyKT9lLnN0eWxpemUoXCJudWxsXCIsXCJudWxsXCIpOnZvaWQgMH1mdW5jdGlvbiBmb3JtYXRFcnJvcihlKXtyZXR1cm5cIltcIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKStcIl1cIn1mdW5jdGlvbiBmb3JtYXRBcnJheShlLHIsdCxuLGkpe2Zvcih2YXIgbz1bXSxzPTAsdT1yLmxlbmd0aDt1PnM7KytzKWhhc093blByb3BlcnR5KHIsU3RyaW5nKHMpKT9vLnB1c2goZm9ybWF0UHJvcGVydHkoZSxyLHQsbixTdHJpbmcocyksITApKTpvLnB1c2goXCJcIik7cmV0dXJuIGkuZm9yRWFjaChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXFxkKyQvKXx8by5wdXNoKGZvcm1hdFByb3BlcnR5KGUscix0LG4saSwhMCkpfSksb31mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShlLHIsdCxuLGksbyl7dmFyIHMsdSxhO2lmKGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpfHx7dmFsdWU6cltpXX0sYS5nZXQ/dT1hLnNldD9lLnN0eWxpemUoXCJbR2V0dGVyL1NldHRlcl1cIixcInNwZWNpYWxcIik6ZS5zdHlsaXplKFwiW0dldHRlcl1cIixcInNwZWNpYWxcIik6YS5zZXQmJih1PWUuc3R5bGl6ZShcIltTZXR0ZXJdXCIsXCJzcGVjaWFsXCIpKSxoYXNPd25Qcm9wZXJ0eShuLGkpfHwocz1cIltcIitpK1wiXVwiKSx1fHwoZS5zZWVuLmluZGV4T2YoYS52YWx1ZSk8MD8odT1pc051bGwodCk/Zm9ybWF0VmFsdWUoZSxhLnZhbHVlLG51bGwpOmZvcm1hdFZhbHVlKGUsYS52YWx1ZSx0LTEpLHUuaW5kZXhPZihcIlxcblwiKT4tMSYmKHU9bz91LnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIiAgXCIrZX0pLmpvaW4oXCJcXG5cIikuc3Vic3RyKDIpOlwiXFxuXCIrdS5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuXCIgICBcIitlfSkuam9pbihcIlxcblwiKSkpOnU9ZS5zdHlsaXplKFwiW0NpcmN1bGFyXVwiLFwic3BlY2lhbFwiKSksaXNVbmRlZmluZWQocykpe2lmKG8mJmkubWF0Y2goL15cXGQrJC8pKXJldHVybiB1O3M9SlNPTi5zdHJpbmdpZnkoXCJcIitpKSxzLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsXCJuYW1lXCIpKToocz1zLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLFwiJ1wiKSxzPWUuc3R5bGl6ZShzLFwic3RyaW5nXCIpKX1yZXR1cm4gcytcIjogXCIrdX1mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhlLHIsdCl7dmFyIG49MCxpPWUucmVkdWNlKGZ1bmN0aW9uKGUscil7cmV0dXJuIG4rKyxyLmluZGV4T2YoXCJcXG5cIik+PTAmJm4rKyxlK3IucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csXCJcIikubGVuZ3RoKzF9LDApO3JldHVybiBpPjYwP3RbMF0rKFwiXCI9PT1yP1wiXCI6citcIlxcbiBcIikrXCIgXCIrZS5qb2luKFwiLFxcbiAgXCIpK1wiIFwiK3RbMV06dFswXStyK1wiIFwiK2Uuam9pbihcIiwgXCIpK1wiIFwiK3RbMV19ZnVuY3Rpb24gaXNBcnJheShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBpc0Jvb2xlYW4oZSl7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIGlzTnVsbChlKXtyZXR1cm4gbnVsbD09PWV9ZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gaXNOdW1iZXIoZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTdHJpbmcoZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNTeW1ib2woZSl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNVbmRlZmluZWQoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gaXNSZWdFeHAoZSl7cmV0dXJuIGlzT2JqZWN0KGUpJiZcIltvYmplY3QgUmVnRXhwXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNPYmplY3QoZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIGlzRGF0ZShlKXtyZXR1cm4gaXNPYmplY3QoZSkmJlwiW29iamVjdCBEYXRlXVwiPT09b2JqZWN0VG9TdHJpbmcoZSl9ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4gaXNPYmplY3QoZSkmJihcIltvYmplY3QgRXJyb3JdXCI9PT1vYmplY3RUb1N0cmluZyhlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNQcmltaXRpdmUoZSl7cmV0dXJuIG51bGw9PT1lfHxcImJvb2xlYW5cIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlfHxcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJzeW1ib2xcIj09dHlwZW9mIGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gcGFkKGUpe3JldHVybiAxMD5lP1wiMFwiK2UudG9TdHJpbmcoMTApOmUudG9TdHJpbmcoMTApfWZ1bmN0aW9uIHRpbWVzdGFtcCgpe3ZhciBlPW5ldyBEYXRlLHI9W3BhZChlLmdldEhvdXJzKCkpLHBhZChlLmdldE1pbnV0ZXMoKSkscGFkKGUuZ2V0U2Vjb25kcygpKV0uam9pbihcIjpcIik7cmV0dXJuW2UuZ2V0RGF0ZSgpLG1vbnRoc1tlLmdldE1vbnRoKCldLHJdLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIGhhc093blByb3BlcnR5KGUscil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpfXZhciBmb3JtYXRSZWdFeHA9LyVbc2RqJV0vZztleHBvcnRzLmZvcm1hdD1mdW5jdGlvbihlKXtpZighaXNTdHJpbmcoZSkpe2Zvcih2YXIgcj1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylyLnB1c2goaW5zcGVjdChhcmd1bWVudHNbdF0pKTtyZXR1cm4gci5qb2luKFwiIFwiKX1mb3IodmFyIHQ9MSxuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKGUpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLGZ1bmN0aW9uKGUpe2lmKFwiJSVcIj09PWUpcmV0dXJuXCIlXCI7aWYodD49aSlyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZVwiJXNcIjpyZXR1cm4gU3RyaW5nKG5bdCsrXSk7Y2FzZVwiJWRcIjpyZXR1cm4gTnVtYmVyKG5bdCsrXSk7Y2FzZVwiJWpcIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bdCsrXSl9Y2F0Y2gocil7cmV0dXJuXCJbQ2lyY3VsYXJdXCJ9ZGVmYXVsdDpyZXR1cm4gZX19KSxzPW5bdF07aT50O3M9blsrK3RdKW8rPWlzTnVsbChzKXx8IWlzT2JqZWN0KHMpP1wiIFwiK3M6XCIgXCIraW5zcGVjdChzKTtyZXR1cm4gb30sZXhwb3J0cy5kZXByZWNhdGU9ZnVuY3Rpb24oZSxyKXtmdW5jdGlvbiB0KCl7aWYoIW4pe2lmKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iocik7cHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uocik6Y29uc29sZS5lcnJvcihyKSxuPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1pZihpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGUscikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZihwcm9jZXNzLm5vRGVwcmVjYXRpb249PT0hMClyZXR1cm4gZTt2YXIgbj0hMTtyZXR1cm4gdH07dmFyIGRlYnVncz17fSxkZWJ1Z0Vudmlyb247ZXhwb3J0cy5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZihpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pJiYoZGVidWdFbnZpcm9uPXByb2Nlc3MuZW52Lk5PREVfREVCVUd8fFwiXCIpLGU9ZS50b1VwcGVyQ2FzZSgpLCFkZWJ1Z3NbZV0paWYobmV3IFJlZ0V4cChcIlxcXFxiXCIrZStcIlxcXFxiXCIsXCJpXCIpLnRlc3QoZGVidWdFbnZpcm9uKSl7dmFyIHI9cHJvY2Vzcy5waWQ7ZGVidWdzW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9ZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoXCIlcyAlZDogJXNcIixlLHIsdCl9fWVsc2UgZGVidWdzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZGVidWdzW2VdfSxleHBvcnRzLmluc3BlY3Q9aW5zcGVjdCxpbnNwZWN0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0saW5zcGVjdC5zdHlsZXM9e3NwZWNpYWw6XCJjeWFuXCIsbnVtYmVyOlwieWVsbG93XCIsXCJib29sZWFuXCI6XCJ5ZWxsb3dcIix1bmRlZmluZWQ6XCJncmV5XCIsXCJudWxsXCI6XCJib2xkXCIsc3RyaW5nOlwiZ3JlZW5cIixkYXRlOlwibWFnZW50YVwiLHJlZ2V4cDpcInJlZFwifSxleHBvcnRzLmlzQXJyYXk9aXNBcnJheSxleHBvcnRzLmlzQm9vbGVhbj1pc0Jvb2xlYW4sZXhwb3J0cy5pc051bGw9aXNOdWxsLGV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9aXNOdWxsT3JVbmRlZmluZWQsZXhwb3J0cy5pc051bWJlcj1pc051bWJlcixleHBvcnRzLmlzU3RyaW5nPWlzU3RyaW5nLGV4cG9ydHMuaXNTeW1ib2w9aXNTeW1ib2wsZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZCxleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwLGV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3QsZXhwb3J0cy5pc0RhdGU9aXNEYXRlLGV4cG9ydHMuaXNFcnJvcj1pc0Vycm9yLGV4cG9ydHMuaXNGdW5jdGlvbj1pc0Z1bmN0aW9uLGV4cG9ydHMuaXNQcmltaXRpdmU9aXNQcmltaXRpdmUsZXhwb3J0cy5pc0J1ZmZlcj1yZXF1aXJlKFwiLi9zdXBwb3J0L2lzQnVmZmVyXCIpO3ZhciBtb250aHM9W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXTtleHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKFwiJXMgLSAlc1wiLHRpbWVzdGFtcCgpLGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKSl9LGV4cG9ydHMuaW5oZXJpdHM9cmVxdWlyZShcImluaGVyaXRzXCIpLGV4cG9ydHMuX2V4dGVuZD1mdW5jdGlvbihlLHIpe2lmKCFyfHwhaXNPYmplY3QocikpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHIpLG49dC5sZW5ndGg7bi0tOyllW3Rbbl1dPXJbdFtuXV07cmV0dXJuIGV9O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL3N1cHBvcnQvaXNCdWZmZXJcIjoxNDIsXCJfcHJvY2Vzc1wiOjEzOCxcImluaGVyaXRzXCI6MTI3fV0sMTQ0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGUuanNcIiksbW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmU9cmVxdWlyZShcIi4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzXCIpLG1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllcj1yZXF1aXJlKFwiLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzXCIpO1xufSx7XCIuL2xpYi92ZWN0b3J0aWxlLmpzXCI6MTQ1LFwiLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDcsXCIuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanNcIjoxNDh9XSwxNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZShlLHIpe3RoaXMubGF5ZXJzPWUucmVhZEZpZWxkcyhyZWFkVGlsZSx7fSxyKX1mdW5jdGlvbiByZWFkVGlsZShlLHIsaSl7aWYoMz09PWUpe3ZhciB0PW5ldyBWZWN0b3JUaWxlTGF5ZXIoaSxpLnJlYWRWYXJpbnQoKStpLnBvcyk7dC5sZW5ndGgmJihyW3QubmFtZV09dCl9fXZhciBWZWN0b3JUaWxlTGF5ZXI9cmVxdWlyZShcIi4vdmVjdG9ydGlsZWxheWVyXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGU7XG59LHtcIi4vdmVjdG9ydGlsZWxheWVyXCI6MTQ4fV0sMTQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZlY3RvclRpbGVDbGlwcGVyKGkpe3RoaXMuZmVhdHVyZT1pLHRoaXMuZmluYWxSYXRpbz00MDk2L2kuZXh0ZW50Kk1hdGgucG93KDIsaS5keik7dmFyIHQ9NjQ7dC89dGhpcy5maW5hbFJhdGlvO3ZhciBzPWkuZXh0ZW50Pj5pLmR6O3Q+cyYmKHQ9cyksdGhpcy5kej1pLmR6LHRoaXMubWFyZ2luPXQsdGhpcy54bWluPXMqaS54UG9zLXQsdGhpcy55bWluPXMqaS55UG9zLXQsdGhpcy54bWF4PXRoaXMueG1pbitzKzIqdCx0aGlzLnltYXg9dGhpcy55bWluK3MrMip0LHRoaXMubGluZXM9W10sdGhpcy5fcHJldklzSW49ITEsdGhpcy50eXBlPWkudHlwZX12YXIgUG9pbnQ9cmVxdWlyZShcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVDbGlwcGVyLFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmZlYXR1cmUuX3BiZjtpLnBvcz10aGlzLmZlYXR1cmUuX2dlb21ldHJ5O2Zvcih2YXIgdD1pLnJlYWRWYXJpbnQoKStpLnBvcyxzPTEsaD0wLG49MCxlPTA7aS5wb3M8dDspe2lmKCFoKXt2YXIgeD1pLnJlYWRWYXJpbnQoKTtzPTcmeCxoPXg+PjN9aWYoaC0tLDE9PT1zfHwyPT09cyluKz1pLnJlYWRTVmFyaW50KCksZSs9aS5yZWFkU1ZhcmludCgpLDE9PT1zP3RoaXMubW92ZVRvKG4sZSk6dGhpcy5saW5lVG8obixlKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTt0aGlzLmNsb3NlUG9seWdvbigpfX1yZXR1cm4gdGhpcy5yZXN1bHQoKX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihpLHQpe3RoaXMuX3B1c2hfbGluZSgpLHRoaXMuX3ByZXZJc0luPXRoaXMuX2lzSW4oaSx0KSx0aGlzLl9tb3ZlVG8oaSx0LHRoaXMuX3ByZXZJc0luKSx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCksdGhpcy5fZmlyc3RQdD1uZXcgUG9pbnQoaSx0KX0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihpLHQpe3ZhciBzLGgsbixlLHgseSxsLG8sbSxyLGEscCxfPXRoaXMuX2lzSW4oaSx0KTtpZihfKXRoaXMuX3ByZXZJc0luP3RoaXMuX2xpbmVUbyhpLHQsITApOihzPXRoaXMuX3ByZXZQdCxoPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhoLngsaC55LCEwKSk7ZWxzZSBpZih0aGlzLl9wcmV2SXNJbiloPXRoaXMuX3ByZXZQdCxzPW5ldyBQb2ludChpLHQpLG49dGhpcy5faW50ZXJzZWN0KGgscyksdGhpcy5fbGluZVRvKG4ueCxuLnksITApLHRoaXMuX2xpbmVUbyhzLngscy55LCExKTtlbHNlIGlmKGU9dGhpcy5fcHJldlB0LHg9bmV3IFBvaW50KGksdCksZS54PD10aGlzLnhtaW4mJngueDw9dGhpcy54bWlufHxlLng+PXRoaXMueG1heCYmeC54Pj10aGlzLnhtYXh8fGUueTw9dGhpcy55bWluJiZ4Lnk8PXRoaXMueW1pbnx8ZS55Pj10aGlzLnltYXgmJngueT49dGhpcy55bWF4KXRoaXMuX2xpbmVUbyh4LngseC55LCExKTtlbHNle2lmKG89W10sKGUueDx0aGlzLnhtaW4mJngueD50aGlzLnhtaW58fGUueD50aGlzLnhtaW4mJngueDx0aGlzLnhtaW4pJiYoeT0odGhpcy54bWluLWUueCkvKHgueC1lLngpLHA9ZS55K3kqKHgueS1lLnkpLHA8PXRoaXMueW1pbj9yPSExOnA+PXRoaXMueW1heD9yPSEwOihsPXt9LGwucmF0aW89eSxsLng9dGhpcy54bWluLGwueT1wLG8ucHVzaChsKSkpLChlLng8dGhpcy54bWF4JiZ4Lng+dGhpcy54bWF4fHxlLng+dGhpcy54bWF4JiZ4Lng8dGhpcy54bWF4KSYmKHk9KHRoaXMueG1heC1lLngpLyh4LngtZS54KSxwPWUueSt5Kih4LnktZS55KSxwPD10aGlzLnltaW4/cj0hMTpwPj10aGlzLnltYXg/cj0hMDoobD17fSxsLnJhdGlvPXksbC54PXRoaXMueG1heCxsLnk9cCxvLnB1c2gobCkpKSwoZS55PHRoaXMueW1pbiYmeC55PnRoaXMueW1pbnx8ZS55PnRoaXMueW1pbiYmeC55PHRoaXMueW1pbikmJih5PSh0aGlzLnltaW4tZS55KS8oeC55LWUueSksYT1lLngreSooeC54LWUueCksYTw9dGhpcy54bWluP209ITE6YT49dGhpcy54bWF4P209ITA6KGw9e30sbC5yYXRpbz15LGwueD1hLGwueT10aGlzLnltaW4sby5wdXNoKGwpKSksKGUueTx0aGlzLnltYXgmJngueT50aGlzLnltYXh8fGUueT50aGlzLnltYXgmJngueTx0aGlzLnltYXgpJiYoeT0odGhpcy55bWF4LWUueSkvKHgueS1lLnkpLGE9ZS54K3kqKHgueC1lLngpLGE8PXRoaXMueG1pbj9tPSExOmE+PXRoaXMueG1heD9tPSEwOihsPXt9LGwucmF0aW89eSxsLng9YSxsLnk9dGhpcy55bWF4LG8ucHVzaChsKSkpLDA9PT1vLmxlbmd0aCltP3I/dGhpcy5fbGluZVRvKHRoaXMueG1heCx0aGlzLnltYXgsITApOnRoaXMuX2xpbmVUbyh0aGlzLnhtYXgsdGhpcy55bWluLCEwKTpyP3RoaXMuX2xpbmVUbyh0aGlzLnhtaW4sdGhpcy55bWF4LCEwKTp0aGlzLl9saW5lVG8odGhpcy54bWluLHRoaXMueW1pbiwhMCk7ZWxzZSBpZihvLmxlbmd0aD4xJiZvWzBdLnJhdGlvPm9bMV0ucmF0aW8pdGhpcy5fbGluZVRvKG9bMV0ueCxvWzFdLnksITApLHRoaXMuX2xpbmVUbyhvWzBdLngsb1swXS55LCEwKTtlbHNlIGZvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKXRoaXMuX2xpbmVUbyhvW3VdLngsb1t1XS55LCEwKTt0aGlzLl9saW5lVG8oeC54LHgueSwhMSl9dGhpcy5fcHJldklzSW49Xyx0aGlzLl9wcmV2UHQ9bmV3IFBvaW50KGksdCl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5jbG9zZVBvbHlnb249ZnVuY3Rpb24oKXt2YXIgaSx0O3RoaXMubGluZS5sZW5ndGg+MCYmKGk9dGhpcy5fZmlyc3RQdCx0PXRoaXMuX3ByZXZQdCwoaS54IT09dC54fHxpLnkhPT10LnkpJiZ0aGlzLmxpbmVUbyhpLngsaS55KSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5yZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHVzaF9saW5lKCksMD09PXRoaXMubGluZXMubGVuZ3RoP251bGw6dGhpcy5saW5lc30sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pc0luPWZ1bmN0aW9uKGksdCl7cmV0dXJuIGk+PXRoaXMueG1pbiYmaTw9dGhpcy54bWF4JiZ0Pj10aGlzLnltaW4mJnQ8PXRoaXMueW1heH0sVmVjdG9yVGlsZUNsaXBwZXIucHJvdG90eXBlLl9pbnRlcnNlY3Q9ZnVuY3Rpb24oaSx0KXt2YXIgcyxoLG4sZTtyZXR1cm4gdC54Pj10aGlzLnhtaW4mJnQueDw9dGhpcy54bWF4PyhoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz1pLngrKGgtaS55KS8odC55LWkueSkqKHQueC1pLngpKTp0Lnk+PXRoaXMueW1pbiYmdC55PD10aGlzLnltYXg/KHM9dC54PD10aGlzLnhtaW4/dGhpcy54bWluOnRoaXMueG1heCxoPWkueSsocy1pLngpLyh0LngtaS54KSoodC55LWkueSkpOihoPXQueTw9dGhpcy55bWluP3RoaXMueW1pbjp0aGlzLnltYXgscz10Lng8PXRoaXMueG1pbj90aGlzLnhtaW46dGhpcy54bWF4LG49KHMtaS54KS8odC54LWkueCksZT0oaC1pLnkpLyh0LnktaS55KSxlPm4/aD1pLnkrbioodC55LWkueSk6cz1pLngrZSoodC54LWkueCkpLG5ldyBQb2ludChzLGgpfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX3B1c2hfbGluZT1mdW5jdGlvbigpe3RoaXMubGluZSYmKDE9PT10aGlzLnR5cGU/dGhpcy5saW5lLmxlbmd0aD4wJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKToyPT09dGhpcy50eXBlP3RoaXMubGluZS5sZW5ndGg+MSYmdGhpcy5saW5lcy5wdXNoKHRoaXMubGluZSk6Mz09PXRoaXMudHlwZSYmdGhpcy5saW5lLmxlbmd0aD4zJiZ0aGlzLmxpbmVzLnB1c2godGhpcy5saW5lKSksdGhpcy5saW5lPVtdfSxWZWN0b3JUaWxlQ2xpcHBlci5wcm90b3R5cGUuX21vdmVUbz1mdW5jdGlvbihpLHQscyl7MyE9PXRoaXMudHlwZT9zJiYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSkpOihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lLnB1c2gobmV3IFBvaW50KGksdCkpLHRoaXMuX2lzX2g9ITEsdGhpcy5faXNfdj0hMSl9LFZlY3RvclRpbGVDbGlwcGVyLnByb3RvdHlwZS5fbGluZVRvPWZ1bmN0aW9uKGksdCxzKXt2YXIgaCxuO2lmKDMhPT10aGlzLnR5cGUpaWYocyl7aWYoaT0oaS0odGhpcy54bWluK3RoaXMubWFyZ2luKSkqdGhpcy5maW5hbFJhdGlvLHQ9KHQtKHRoaXMueW1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0aGlzLmxpbmUubGVuZ3RoPjAmJihoPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTFdLGgueD09PWkmJmgueT09PXQpKXJldHVybjt0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9ZWxzZSB0aGlzLmxpbmUmJnRoaXMubGluZS5sZW5ndGg+MCYmdGhpcy5fcHVzaF9saW5lKCk7ZWxzZSBpZihzfHwoaTx0aGlzLnhtaW4mJihpPXRoaXMueG1pbiksaT50aGlzLnhtYXgmJihpPXRoaXMueG1heCksdDx0aGlzLnltaW4mJih0PXRoaXMueW1pbiksdD50aGlzLnltYXgmJih0PXRoaXMueW1heCkpLGk9KGktKHRoaXMueG1pbit0aGlzLm1hcmdpbikpKnRoaXMuZmluYWxSYXRpbyx0PSh0LSh0aGlzLnltaW4rdGhpcy5tYXJnaW4pKSp0aGlzLmZpbmFsUmF0aW8sdGhpcy5saW5lJiZ0aGlzLmxpbmUubGVuZ3RoPjApe2g9dGhpcy5saW5lW3RoaXMubGluZS5sZW5ndGgtMV07dmFyIGU9aC54PT09aSx4PWgueT09PXQ7aWYoZSYmeClyZXR1cm47dGhpcy5faXNfaCYmZT8oaC54PWksaC55PXQsbj10aGlzLmxpbmVbdGhpcy5saW5lLmxlbmd0aC0yXSx0aGlzLl9pc19oPW4ueD09PWksdGhpcy5faXNfdj1uLnk9PT10KTp0aGlzLl9pc192JiZ4PyhoLng9aSxoLnk9dCxuPXRoaXMubGluZVt0aGlzLmxpbmUubGVuZ3RoLTJdLHRoaXMuX2lzX2g9bi54PT09aSx0aGlzLl9pc192PW4ueT09PXQpOih0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSksdGhpcy5faXNfaD1lLHRoaXMuX2lzX3Y9eCl9ZWxzZSB0aGlzLmxpbmUucHVzaChuZXcgUG9pbnQoaSx0KSl9O1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShlLHQscixpLG8pe3RoaXMucHJvcGVydGllcz17fSx0aGlzLmV4dGVudD1yLHRoaXMudHlwZT0wLHRoaXMuX3BiZj1lLHRoaXMuX2dlb21ldHJ5PS0xLHRoaXMuX2tleXM9aSx0aGlzLl92YWx1ZXM9byxlLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsdGhpcyx0KX1mdW5jdGlvbiByZWFkRmVhdHVyZShlLHQscil7MT09ZT90Ll9pZD1yLnJlYWRWYXJpbnQoKToyPT1lP3JlYWRUYWcocix0KTozPT1lP3QudHlwZT1yLnJlYWRWYXJpbnQoKTo0PT1lJiYodC5fZ2VvbWV0cnk9ci5wb3MpfWZ1bmN0aW9uIHJlYWRUYWcoZSx0KXtmb3IodmFyIHI9ZS5yZWFkVmFyaW50KCkrZS5wb3M7ZS5wb3M8cjspe3ZhciBpPXQuX2tleXNbZS5yZWFkVmFyaW50KCldLG89dC5fdmFsdWVzW2UucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbaV09b319dmFyIFBvaW50PXJlcXVpcmUoXCJwb2ludC1nZW9tZXRyeVwiKSxWZWN0b3JUaWxlQ2xpcHBlcj1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlY2xpcHBlclwiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlRmVhdHVyZSxWZWN0b3JUaWxlRmVhdHVyZS50eXBlcz1bXCJVbmtub3duXCIsXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5PWZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5keil7dmFyIHQ9bmV3IFZlY3RvclRpbGVDbGlwcGVyKHRoaXMpO2U9dC5sb2FkR2VvbWV0cnkoKX1lbHNle2Zvcih2YXIgcj0wLGk9dGhpcy5leHRlbnQ7aT40MDk2OylyKz0xLGk+Pj0xO3ZhciBvPXRoaXMuX3BiZjtvLnBvcz10aGlzLl9nZW9tZXRyeTt2YXIgYSxuPW8ucmVhZFZhcmludCgpK28ucG9zLHM9MSxwPTAsaD0wLHU9MDtmb3IoZT1bXTtvLnBvczxuOyl7aWYoIXApe3ZhciBsPW8ucmVhZFZhcmludCgpO3M9NyZsLHA9bD4+M31pZihwLS0sMT09PXN8fDI9PT1zKWgrPW8ucmVhZFNWYXJpbnQoKSx1Kz1vLnJlYWRTVmFyaW50KCksMT09PXMmJihhJiZlLnB1c2goYSksYT1bXSksYS5wdXNoKG5ldyBQb2ludChoPj5yLHU+PnIpKTtlbHNle2lmKDchPT1zKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIitzKTthJiZhLnB1c2goYVswXS5jbG9uZSgpKX19YSYmZS5wdXNoKGEpfXJldHVybiBlfSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3BiZjtlLnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIHQ9ZS5yZWFkVmFyaW50KCkrZS5wb3Mscj0xLGk9MCxvPTAsYT0wLG49MS8wLHM9LSgxLzApLHA9MS8wLGg9LSgxLzApO2UucG9zPHQ7KXtpZighaSl7dmFyIHU9ZS5yZWFkVmFyaW50KCk7cj03JnUsaT11Pj4zfWlmKGktLSwxPT09cnx8Mj09PXIpbys9ZS5yZWFkU1ZhcmludCgpLGErPWUucmVhZFNWYXJpbnQoKSxuPm8mJihuPW8pLG8+cyYmKHM9bykscD5hJiYocD1hKSxhPmgmJihoPWEpO2Vsc2UgaWYoNyE9PXIpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiK3IpfXJldHVybltuLHAscyxoXX0sVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBpPXRoaXMuZXh0ZW50Kk1hdGgucG93KDIsciksbz10aGlzLmV4dGVudCplLGE9dGhpcy5leHRlbnQqdCxuPXRoaXMubG9hZEdlb21ldHJ5KCkscz1WZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLHA9MDtwPG4ubGVuZ3RoO3ArKylmb3IodmFyIGg9bltwXSx1PTA7dTxoLmxlbmd0aDt1Kyspe3ZhciBsPWhbdV0sZD0xODAtMzYwKihsLnkrYSkvaTtoW3VdPVszNjAqKGwueCtvKS9pLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoZCpNYXRoLlBJLzE4MCkpLTkwXX1yZXR1cm5cIlBvaW50XCI9PT1zJiYxPT09bi5sZW5ndGg/bj1uWzBdWzBdOlwiUG9pbnRcIj09PXM/KG49blswXSxzPVwiTXVsdGlQb2ludFwiKTpcIkxpbmVTdHJpbmdcIj09PXMmJjE9PT1uLmxlbmd0aD9uPW5bMF06XCJMaW5lU3RyaW5nXCI9PT1zJiYocz1cIk11bHRpTGluZVN0cmluZ1wiKSx7dHlwZTpcIkZlYXR1cmVcIixnZW9tZXRyeTp7dHlwZTpzLGNvb3JkaW5hdGVzOm59LHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfX07XG59LHtcIi4vdmVjdG9ydGlsZWNsaXBwZXJcIjoxNDYsXCJwb2ludC1nZW9tZXRyeVwiOjEzN31dLDE0ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIoZSx0KXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPWUsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sZS5yZWFkRmllbGRzKHJlYWRMYXllcix0aGlzLHQpLHRoaXMubGVuZ3RoPXRoaXMuX2ZlYXR1cmVzLmxlbmd0aH1mdW5jdGlvbiByZWFkTGF5ZXIoZSx0LHIpezE1PT09ZT90LnZlcnNpb249ci5yZWFkVmFyaW50KCk6MT09PWU/dC5uYW1lPXIucmVhZFN0cmluZygpOjU9PT1lP3QuZXh0ZW50PXIucmVhZFZhcmludCgpOjI9PT1lP3QuX2ZlYXR1cmVzLnB1c2goci5wb3MpOjM9PT1lP3QuX2tleXMucHVzaChyLnJlYWRTdHJpbmcoKSk6ND09PWUmJnQuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocikpfWZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UoZSl7Zm9yKHZhciB0PW51bGwscj1lLnJlYWRWYXJpbnQoKStlLnBvcztlLnBvczxyOyl7dmFyIGE9ZS5yZWFkVmFyaW50KCk+PjM7dD0xPT09YT9lLnJlYWRTdHJpbmcoKToyPT09YT9lLnJlYWRGbG9hdCgpOjM9PT1hP2UucmVhZERvdWJsZSgpOjQ9PT1hP2UucmVhZFZhcmludDY0KCk6NT09PWE/ZS5yZWFkVmFyaW50KCk6Nj09PWE/ZS5yZWFkU1ZhcmludCgpOjc9PT1hP2UucmVhZEJvb2xlYW4oKTpudWxsfXJldHVybiB0fXZhciBWZWN0b3JUaWxlRmVhdHVyZT1yZXF1aXJlKFwiLi92ZWN0b3J0aWxlZmVhdHVyZS5qc1wiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlTGF5ZXIsVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe2lmKDA+ZXx8ZT49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kc1wiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW2VdO3ZhciB0PXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZix0LHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07XG59LHtcIi4vdmVjdG9ydGlsZWZlYXR1cmUuanNcIjoxNDd9XSwxNDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGJ1bmRsZUZuPWFyZ3VtZW50c1szXSxzb3VyY2VzPWFyZ3VtZW50c1s0XSxjYWNoZT1hcmd1bWVudHNbNV0sc3RyaW5naWZ5PUpTT04uc3RyaW5naWZ5O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe2Zvcih2YXIgZSx0PU9iamVjdC5rZXlzKGNhY2hlKSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dLGk9Y2FjaGVbYV0uZXhwb3J0cztpZihpPT09cnx8aVtcImRlZmF1bHRcIl09PT1yKXtlPWE7YnJlYWt9fWlmKCFlKXtlPU1hdGguZmxvb3IoTWF0aC5wb3coMTYsOCkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO2Zvcih2YXIgcz17fSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKXt2YXIgYT10W25dO3NbYV09YX1zb3VyY2VzW2VdPVtGdW5jdGlvbihbXCJyZXF1aXJlXCIsXCJtb2R1bGVcIixcImV4cG9ydHNcIl0sXCIoXCIrcitcIikoc2VsZilcIiksc119dmFyIHU9TWF0aC5mbG9vcihNYXRoLnBvdygxNiw4KSpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNiksZj17fTtmW2VdPWUsc291cmNlc1t1XT1bRnVuY3Rpb24oW1wicmVxdWlyZVwiXSxcInZhciBmID0gcmVxdWlyZShcIitzdHJpbmdpZnkoZSkrXCIpOyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTtcIiksZl07dmFyIGM9XCIoXCIrYnVuZGxlRm4rXCIpKHtcIitPYmplY3Qua2V5cyhzb3VyY2VzKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHN0cmluZ2lmeShyKStcIjpbXCIrc291cmNlc1tyXVswXStcIixcIitzdHJpbmdpZnkoc291cmNlc1tyXVsxXSkrXCJdXCJ9KS5qb2luKFwiLFwiKStcIn0se30sW1wiK3N0cmluZ2lmeSh1KStcIl0pXCIsbD13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3cubW96VVJMfHx3aW5kb3cubXNVUkw7cmV0dXJuIG5ldyBXb3JrZXIobC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2NdLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpfTtcbn0se31dfSx7fSxbMjRdKSgyNClcbn0pO1xuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcGJveC1nbC5qcy5tYXAiLCJMLk1hcGJveEdMID0gTC5MYXllci5leHRlbmQoe1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHVwZGF0ZUludGVydmFsOiAzMlxuICAgIH0sXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gb3B0aW9ucy5hY2Nlc3NUb2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwcm92aWRlIGEgTWFwYm94IEdMIGFjY2VzcyB0b2tlbiBhcyBhIHRva2VuIG9wdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBgZm5gIHRoYXQgb25seSBmaXJlcyBvbmNlIGV2ZXJ5IGB0aW1lYCBtaWxsc2Vjb25kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRvIGJlIHRocm90dGxlZFxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBtaWxsc2Vjb25kcyByZXF1aXJlZCBiZXR3ZWVuIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gY29udGV4dCB0aGUgdmFsdWUgb2YgYHRoaXNgIHdpdGggd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZFxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGRlYm91bmNlZCBmdW5jdGlvblxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIHRocm90dGxlID0gZnVuY3Rpb24gKGZuLCB0aW1lLCBjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgbG9jaywgYXJncywgd3JhcHBlckZuLCBsYXRlcjtcblxuICAgICAgICAgICAgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgbG9jayBhbmQgY2FsbCBpZiBxdWV1ZWRcbiAgICAgICAgICAgICAgICBsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlckZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgd3JhcHBlckZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB0b28gc29vbiwgcXVldWUgdG8gY2FsbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBhbmQgbG9jayB1bnRpbCBsYXRlclxuICAgICAgICAgICAgICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXJGbjtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzZXR1cCB0aHJvdHRsaW5nIHRoZSB1cGRhdGUgZXZlbnQgd2hlbiBwYW5uaW5nXG4gICAgICAgIHRoaXMuX3Rocm90dGxlZFVwZGF0ZSA9IHRocm90dGxlKEwuVXRpbC5iaW5kKHRoaXMuX3VwZGF0ZSwgdGhpcyksIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCk7XG4gICAgfSxcblxuICAgIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGlmICghdGhpcy5fZ2xDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRDb250YWluZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5fcGFuZXMudGlsZVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5fZ2xDb250YWluZXIpO1xuXG4gICAgICAgIHRoaXMuX2luaXRHTCgpO1xuXG4gICAgICAgIHRoaXMuX29mZnNldCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuXG4gICAgICAgIC8vIHdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWxlYWZsZXQvaXNzdWVzLzQ3XG4gICAgICAgIGlmIChtYXAub3B0aW9ucy56b29tQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBMLkRvbUV2ZW50Lm9uKG1hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24pIHtcbiAgICAgICAgICAgIEwuRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fcHJveHksIEwuRG9tVXRpbC5UUkFOU0lUSU9OX0VORCwgdGhpcy5fdHJhbnNpdGlvbkVuZCwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZ2V0UGFuZXMoKS50aWxlUGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9nbENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2dsTWFwLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9nbE1hcCA9IG51bGw7XG4gICAgfSxcblxuICAgIGdldEV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW92ZTogdGhpcy5fdGhyb3R0bGVkVXBkYXRlLCAvLyBzZW5zaWJseSB0aHJvdHRsZSB1cGRhdGluZyB3aGlsZSBwYW5uaW5nXG4gICAgICAgICAgICB6b29tYW5pbTogdGhpcy5fYW5pbWF0ZVpvb20sIC8vIGFwcGx5cyB0aGUgem9vbSBhbmltYXRpb24gdG8gdGhlIDxjYW52YXM+XG4gICAgICAgICAgICB6b29tOiB0aGlzLl9waW5jaFpvb20sIC8vIGFuaW1hdGUgZXZlcnkgem9vbSBldmVudCBmb3Igc21vb3RoZXIgcGluY2gtem9vbWluZ1xuICAgICAgICAgICAgem9vbXN0YXJ0OiB0aGlzLl96b29tU3RhcnQsIC8vIGZsYWcgc3RhcnRpbmcgYSB6b29tIHRvIGRpc2FibGUgcGFubmluZ1xuICAgICAgICAgICAgem9vbWVuZDogdGhpcy5fem9vbUVuZFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBfaW5pdENvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZ2xDb250YWluZXIgPSBMLkRvbVV0aWwuY3JlYXRlKCdkaXYnLCAnbGVhZmxldC1nbC1sYXllcicpO1xuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoICA9IHNpemUueCArICdweCc7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgIH0sXG5cbiAgICBfaW5pdEdMOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBMLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgY2VudGVyOiBbY2VudGVyLmxuZywgY2VudGVyLmxhdF0sXG4gICAgICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZ2xNYXAgPSBuZXcgbWFwYm94Z2wuTWFwKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsbG93IEdMIGJhc2UgbWFwIHRvIHBhbiBiZXlvbmQgbWluL21heCBsYXRpdHVkZXNcbiAgICAgICAgdGhpcy5fZ2xNYXAudHJhbnNmb3JtLmxhdFJhbmdlID0gbnVsbDtcblxuICAgICAgICAvLyB0cmVhdCBjaGlsZCA8Y2FudmFzPiBlbGVtZW50IGxpa2UgTC5JbWFnZU92ZXJsYXlcbiAgICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2dsTWFwLl9jYW52YXMuY2FudmFzLCAnbGVhZmxldC1pbWFnZS1sYXllcicpO1xuICAgICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsICdsZWFmbGV0LXpvb20tYW5pbWF0ZWQnKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvZmZzZXQgc28gd2UgY2FuIGNvcnJlY3QgZm9yIGl0IGxhdGVyIHdoZW4gd2Ugem9vbVxuICAgICAgICB0aGlzLl9vZmZzZXQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBpZiAodGhpcy5fem9vbWluZykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKSxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX2dsQ29udGFpbmVyLFxuICAgICAgICAgICAgZ2wgPSB0aGlzLl9nbE1hcCxcbiAgICAgICAgICAgIHRvcExlZnQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcblxuICAgICAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24oY29udGFpbmVyLCB0b3BMZWZ0KTtcblxuICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuXG4gICAgICAgIC8vIGdsLnNldFZpZXcoW2NlbnRlci5sYXQsIGNlbnRlci5sbmddLCB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSwgMCk7XG4gICAgICAgIC8vIGNhbGxpbmcgc2V0VmlldyBkaXJlY3RseSBjYXVzZXMgc3luYyBpc3N1ZXMgYmVjYXVzZSBpdCB1c2VzIHJlcXVlc3RBbmltRnJhbWVcblxuICAgICAgICB2YXIgdHIgPSBnbC50cmFuc2Zvcm07XG4gICAgICAgIHRyLmNlbnRlciA9IG1hcGJveGdsLkxuZ0xhdC5jb252ZXJ0KFtjZW50ZXIubG5nLCBjZW50ZXIubGF0XSk7XG4gICAgICAgIHRyLnpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMTtcblxuICAgICAgICBpZiAoZ2wudHJhbnNmb3JtLndpZHRoICE9PSBzaXplLnggfHwgZ2wudHJhbnNmb3JtLmhlaWdodCAhPT0gc2l6ZS55KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggID0gc2l6ZS54ICsgJ3B4JztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzaXplLnkgKyAncHgnO1xuICAgICAgICAgICAgZ2wuX3Jlc2l6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIHVwZGF0ZSB0aGUgbWFwIGNvbnN0YW50bHkgZHVyaW5nIGEgcGluY2ggem9vbVxuICAgIF9waW5jaFpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB0aGlzLl9nbE1hcC5qdW1wVG8oe1xuICAgICAgICB6b29tOiB0aGlzLl9tYXAuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgY2VudGVyOiB0aGlzLl9tYXAuZ2V0Q2VudGVyKClcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBib3Jyb3dlZCBmcm9tIEwuSW1hZ2VPdmVybGF5IGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9tYXN0ZXIvc3JjL2xheWVyL0ltYWdlT3ZlcmxheS5qcyNMMTM5LUwxNDRcbiAgICBfYW5pbWF0ZVpvb206IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2NhbGUgPSB0aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUuem9vbSksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpLCBlLnpvb20sIGUuY2VudGVyKTtcblxuICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LnN1YnRyYWN0KHRoaXMuX29mZnNldCksIHNjYWxlKTtcbiAgICB9LFxuXG4gICAgX3pvb21TdGFydDogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfem9vbUVuZDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNjYWxlID0gdGhpcy5fbWFwLmdldFpvb21TY2FsZSh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSxcbiAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuZ2V0Tm9ydGhXZXN0KCksIHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRDZW50ZXIoKSk7XG5cbiAgICAgIEwuRG9tVXRpbC5zZXRUcmFuc2Zvcm0odGhpcy5fZ2xNYXAuX2NhbnZhcy5jYW52YXMsIG9mZnNldC5zdWJ0cmFjdCh0aGlzLl9vZmZzZXQpLCBzY2FsZSk7XG4gICAgfSxcblxuICAgIF90cmFuc2l0aW9uRW5kOiBmdW5jdGlvbiAoZSkge1xuICAgICAgTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQodGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpKTtcblxuICAgICAgICAgIC8vIHJlc2V0IHRoZSBzY2FsZSBhbmQgb2Zmc2V0XG4gICAgICAgICAgTC5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9nbE1hcC5fY2FudmFzLmNhbnZhcywgb2Zmc2V0LCAxKTtcblxuICAgICAgICAgIC8vIGVuYWJsZSBwYW5uaW5nIG9uY2UgdGhlIGdsIG1hcCBpcyByZWFkeSBhZ2FpblxuICAgICAgICAgIHRoaXMuX2dsTWFwLm9uY2UoJ21vdmVlbmQnLCBMLlV0aWwuYmluZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5fem9vbUVuZCgpO1xuICAgICAgICAgIH0sIHRoaXMpKTtcblxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFwIHBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5fZ2xNYXAuanVtcFRvKHtcbiAgICAgICAgICAgICAgY2VudGVyOiBjZW50ZXIsXG4gICAgICAgICAgICAgIHpvb206IHpvb20gLSAxXG4gICAgICAgICAgfSk7XG4gICAgICB9LCB0aGlzKVxuICAgIH1cbn0pO1xuXG5MLm1hcGJveEdMID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEwuTWFwYm94R0wob3B0aW9ucyk7XG59O1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgJ21hcGJveC1nbCc7XG5pbXBvcnQgJ21hcGJveC1nbC1sZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hNZXRhZGF0YSAodXJsLCBjb250ZXh0KSB7XG4gIHJlcXVlc3QodXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIHJlcXVlc3Qoc3R5bGUuc291cmNlcy5lc3JpLnVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgdGlsZU1ldGFkYXRhKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCB1cmwpO1xuICAgICAgICAgIGNvbnRleHQuX21hcGJveEdMID0gTC5tYXBib3hHTCh7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGV4dC5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRleHQuZmlyZSgncmVhZHknLCB7fSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmZXRjaCB2ZWN0b3IgdGlsZSBzdHlsZSBtZXRhZGF0YScpO1xuICAgIH1cbiAgfSwgY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHlsZSAoc3R5bGUsIG1ldGFkYXRhLCBzdHlsZVVybCkge1xuICAvLyBpZiBhIHJlbGF0aXZlIHBhdGggaXMgcmVmZXJlbmNlZCwgdGhlIGRlZmF1bHQgc3R5bGUgY2FuIGJlIGZvdW5kIGluIGEgc3RhbmRhcmQgbG9jYXRpb25cbiAgaWYgKHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgJiYgc3R5bGUuc291cmNlcy5lc3JpLnVybC5pbmRleE9mKCdodHRwJykgPT09IC0xKSB7XG4gICAgc3R5bGUuc291cmNlcy5lc3JpLnVybCA9IHN0eWxlVXJsLnJlcGxhY2UoJy9yZXNvdXJjZXMvc3R5bGVzL3Jvb3QuanNvbicsICcnKTtcbiAgfVxuXG4gIC8vIHJpZ2h0IG5vdyBBcmNHSVMgUHJvIHB1Ymxpc2hlZCB2ZWN0b3Igc2VydmljZXMgaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBzaWduYXR1cmVcbiAgaWYgKG1ldGFkYXRhLnRpbGVzICYmIG1ldGFkYXRhLnRpbGVzWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgbWV0YWRhdGEudGlsZXNbMF0gPSAnLycgKyBtZXRhZGF0YS50aWxlc1swXTtcbiAgfVxuXG4gIGlmIChtZXRhZGF0YS50aWxlTWFwICYmIG1ldGFkYXRhLnRpbGVNYXAuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBtZXRhZGF0YS50aWxlTWFwID0gJy8nICsgbWV0YWRhdGEudGlsZU1hcDtcbiAgfVxuXG4gIHN0eWxlLnNvdXJjZXMuZXNyaSA9IHtcbiAgICB0eXBlOiAndmVjdG9yJyxcbiAgICBzY2hlbWU6ICd4eXonLFxuICAgIHRpbGVqc29uOiBtZXRhZGF0YS50aWxlanNvbiB8fCAnMi4wLjAnLFxuICAgIGZvcm1hdDogKG1ldGFkYXRhLnRpbGVJbmZvICYmIG1ldGFkYXRhLnRpbGVJbmZvLmZvcm1hdCkgfHwgJ3BiZicsXG4gICAgaW5kZXg6IG1ldGFkYXRhLnRpbGVNYXAgPyBzdHlsZS5zb3VyY2VzLmVzcmkudXJsICsgbWV0YWRhdGEudGlsZU1hcCA6IG51bGwsXG4gICAgdGlsZXM6IFtcbiAgICAgIHN0eWxlLnNvdXJjZXMuZXNyaS51cmwgKyBtZXRhZGF0YS50aWxlc1swXVxuICAgIF0sXG4gICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgIG5hbWU6IG1ldGFkYXRhLm5hbWVcbiAgfTtcblxuICBpZiAoc3R5bGUuZ2x5cGhzLmluZGV4T2YoJ2h0dHAnKSA9PT0gLTEpIHtcbiAgICAvLyBzZXQgcGF0aHMgdG8gc3ByaXRlIGFuZCBnbHlwaHNcbiAgICBzdHlsZS5nbHlwaHMgPSBzdHlsZVVybC5yZXBsYWNlKCdzdHlsZXMvcm9vdC5qc29uJywgc3R5bGUuZ2x5cGhzLnJlcGxhY2UoJy4uLycsICcnKSk7XG4gICAgc3R5bGUuc3ByaXRlID0gc3R5bGVVcmwucmVwbGFjZSgnc3R5bGVzL3Jvb3QuanNvbicsIHN0eWxlLnNwcml0ZS5yZXBsYWNlKCcuLi8nLCAnJykpO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgVXRpbCA9IHtcbiAgZmV0Y2hNZXRhZGF0YTogZmV0Y2hNZXRhZGF0YSxcbiAgZm9ybWF0U3R5bGU6IGZvcm1hdFN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBVdGlsO1xuIiwiaW1wb3J0IEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnZXNyaS1sZWFmbGV0JztcbmltcG9ydCB7IGZldGNoTWV0YWRhdGEgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIEJhc2VtYXAgPSBMLkxheWVyLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICBVUkxQUkVGSVg6ICdodHRwczovL3d3dy5hcmNnaXMuY29tL3NoYXJpbmcvcmVzdC9jb250ZW50L2l0ZW1zLycsXG4gICAgVVJMU1VGRklYOiAnL3Jlc291cmNlcy9zdHlsZXMvcm9vdC5qc29uJyxcbiAgICBTVFlMRVM6IHtcbiAgICAgICdEYXJrR3JheSc6ICc1NzQzNmMwMWJjNzU0ZGJiODdkZmI2MzZiNjQ4NDAyMicsXG4gICAgICAnR3JheSc6ICcxZTQ3MTY4ZDE4MTI0OGU0OTE1NDFmZmQ1YTkxYzBkZScsXG4gICAgICAnSHlicmlkJzogJ2FmNjA2M2Q2OTA2YzRlYjU4OWRmZTAzODE5NjEwNjYwJyxcbiAgICAgICdOYXZpZ2F0aW9uJzogJ2UxOWU5MzMwYmYwODQ5MGNhODM1M2Q3NmI1ZTJlNjU4JyxcbiAgICAgICdTdHJlZXRzJzogJ2E2MGEzN2EyN2NjMTQwZGRhZDE1ZjkxOWNkNWE2OWYyJyxcbiAgICAgICdTdHJlZXRzTmlnaHQnOiAnOTJjNTUxYzlmMDdiNDE0Nzg0NmFhZTI3M2U4MjI3MTQnLFxuICAgICAgJ1N0cmVldHNSZWxpZWYnOiAnNzhjMGE5YWI0ZmJmNDE5OGE4Yjk1MTg0OGFhYjE5ZDgnLFxuICAgICAgJ1RvcG9ncmFwaGljJzogJzg2ZDVlZDRiNmRjNzQxZGU5ZGFkNWYwZmJlMDlhZTk1JyxcbiAgICAgICdTcHJpbmcnOiAnNzYzODg0OTgzZDM1NDRjMGE0MThhOTc5OTI4ODFmY2UnLFxuICAgICAgJ05ld3NwYXBlcic6ICc0ZjQ4NDNkOTljMzQ0MzZmODI5MjA5MzIzMTc4OTNhZScsXG4gICAgICAnTWlkQ2VudHVyeSc6ICcyNjdmNDRmMDhhODQ0YzdhYmVlMmI2MmIwMDYwMDU0MCcsXG4gICAgICAnTW9kZXJuQW50aXF1ZSc6ICc5OTZkOWU3YTNhYWM0NTE0YmI2OTJjZTdhOTkwZjFjMScsXG4gICAgICAnQmxhY2tBbmRXaGl0ZSc6ICczMTYxNDQzMTc5MjQ0NzAyYTVlMDQ0OTAxMDAxM2I1NCdcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBrZXk6IG9wdGlvbnNcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmtleSA9PT0gJ3N0cmluZycgJiYgQmFzZW1hcC5TVFlMRVNbb3B0aW9ucy5rZXldKSB7XG4gICAgICB2YXIgdXJsID0gQmFzZW1hcC5VUkxQUkVGSVggKyBCYXNlbWFwLlNUWUxFU1tvcHRpb25zLmtleV0gKyBCYXNlbWFwLlVSTFNVRkZJWDtcbiAgICAgIGZldGNoTWV0YWRhdGEodXJsLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMLmVzcmkuVmVjdG9yLkJhc2VtYXA6IEludmFsaWQgcGFyYW1ldGVyLiBVc2Ugb25lIG9mIFwiRGFya0dyYXlcIiwgXCJHcmF5XCIsIFwiSHlicmlkXCIsIFwiTmF2aWdhdGlvblwiLCBcIlN0cmVldHNcIiwgXCJTdHJlZXRzTmlnaHRcIiwgXCJTdHJlZXRzUmVsaWVmXCIsIFwiVG9wb2dyYXBoaWNcIicpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcblxuICAgIFV0aWwuc2V0RXNyaUF0dHJpYnV0aW9uKG1hcCk7XG5cbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgLy8gOTUlIHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgc3RhdGljIGF0dHJpYnV0aW9uIHVybFxuICAgICAgVXRpbC5fZ2V0QXR0cmlidXRpb25EYXRhKCdodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXAnLCBtYXApO1xuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj5VU0dTLCBOT0FBPC9zcGFuPicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbmNlKCdyZWFkeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYXN5bmNBZGQoKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgbWFwLnJlbW92ZUxheWVyKHRoaXMuX21hcGJveEdMKTtcblxuICAgIGlmIChtYXAuYXR0cmlidXRpb25Db250cm9sKSB7XG4gICAgICB2YXIgdmVjdG9yQXR0cmlidXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdlc3JpLWR5bmFtaWMtYXR0cmlidXRpb24nKVswXS5vdXRlckhUTUw7XG4gICAgICAvLyB0aGlzIGRvZXNuJ3Qgd29yaywgbm90IHN1cmUgd2h5LlxuICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5yZW1vdmVBdHRyaWJ1dGlvbih2ZWN0b3JBdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9LFxuXG4gIF9hc3luY0FkZDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAvLyBzZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIG1hcCB0byB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGlsZXNcbiAgICBtYXAuZ2V0Q29udGFpbmVyKCkuc3R5bGUuYmFja2dyb3VuZCA9IHRoaXMuX21hcGJveEdMLm9wdGlvbnMuc3R5bGUubGF5ZXJzWzBdLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG5cbiAgICBtYXAub24oJ21vdmVlbmQnLCBVdGlsLl91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG4gICAgdGhpcy5fbWFwYm94R0wuYWRkVG8obWFwLCB0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwIChrZXkpIHtcbiAgcmV0dXJuIG5ldyBCYXNlbWFwKGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VtYXA7XG4iLCJpbXBvcnQgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHJlcXVlc3QsIFV0aWwgfSBmcm9tICdlc3JpLWxlYWZsZXQnO1xuaW1wb3J0IHsgZmV0Y2hNZXRhZGF0YSwgZm9ybWF0U3R5bGUgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdmFyIExheWVyID0gTC5MYXllci5leHRlbmQoe1xuICBzdGF0aWNzOiB7XG4gICAgVVJMUFJFRklYOiAnaHR0cHM6Ly93d3cuYXJjZ2lzLmNvbS9zaGFyaW5nL3Jlc3QvY29udGVudC9pdGVtcy8nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAvLyBMLkxheWVyIGV4cGVjdHMgYSBKU09OIG9iamVjdCBsaXRlcmFsIHRvIGJlIHBhc3NlZCBpbiBjb25zdHJ1Y3RvclxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBpZDogb3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgaXRlbU1ldGFkYXRhVXJsID0gTGF5ZXIuVVJMUFJFRklYICsgb3B0aW9ucy5pZDtcbiAgICAgIHZhciB0aWxlVXJsO1xuICAgICAgdmFyIHN0eWxlVXJsO1xuXG4gICAgICByZXF1ZXN0KGl0ZW1NZXRhZGF0YVVybCwge30sIGZ1bmN0aW9uIChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHRpbGVVcmwgPSBtZXRhZGF0YS51cmw7XG5cbiAgICAgICAgICAvLyBjdXN0b20gdGlsZXNldCBwdWJsaXNoZWQgdXNpbmcgQXJjR0lTIFByb1xuICAgICAgICAgIGlmICh0aWxlVXJsLmluZGV4T2YoJ2Jhc2VtYXBzLmFyY2dpcy5jb20nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVRpbGVzZXQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaWYgY29weXJpZ2h0IGluZm8gd2FzIHB1Ymxpc2hlZCwgZGlzcGxheSBpdC5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hY2Nlc3NJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9jb3B5cmlnaHRUZXh0ID0gbWV0YWRhdGEuYWNjZXNzSW5mb3JtYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0KHRpbGVVcmwsIHt9LCBmdW5jdGlvbiAoZXJyb3IsIHRpbGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gcmlnaHQgbm93IEFyY0dJUyBQcm8gcHVibGlzaGVkIHZlY3RvciBzZXJ2aWNlcyBoYXZlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNpZ25hdHVyZVxuICAgICAgICAgICAgICAgIGlmICh0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcy5jaGFyQXQoMCkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgdGlsZU1ldGFkYXRhLmRlZmF1bHRTdHlsZXMgPSAnLycgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHlsZVVybCA9IHRpbGVVcmwgKyB0aWxlTWV0YWRhdGEuZGVmYXVsdFN0eWxlcyArICcvcm9vdC5qc29uJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHN0eWxlVXJsLCB7fSwgZnVuY3Rpb24gKGVycm9yLCBzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHlsZShzdHlsZSwgdGlsZU1ldGFkYXRhLCBzdHlsZVVybCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwYm94R0wgPSBMLm1hcGJveEdMKHtcbiAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogJ2V6cmVlJyxcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JlYWR5Jywge30sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHN5bWJvbG9neSBhcHBsaWVkIHRvIGhvc3RlZCBiYXNlbWFwIHRpbGVzXG4gICAgICAgICAgICBmZXRjaE1ldGFkYXRhKGl0ZW1NZXRhZGF0YVVybCArICcvcmVzb3VyY2VzL3N0eWxlcy9yb290Lmpzb24nLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0wuZXNyaS5WZWN0b3IuTGF5ZXI6IEludmFsaWQgcGFyYW1ldGVyLiBVc2UgdGhlIGlkIG9mIGFuIEFyY0dJUyBPbmxpbmUgdmVjdG9yIHRpbGUgaXRlbScpO1xuICAgIH1cbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICBVdGlsLnNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoJ3JlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9hc3luY0FkZCgpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLm9mZignbW92ZWVuZCcsIFV0aWwuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKTtcbiAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbWFwYm94R0wpO1xuXG4gICAgaWYgKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wpIHtcbiAgICAgIHZhciB2ZWN0b3JBdHRyaWJ1dGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VzcmktZHluYW1pYy1hdHRyaWJ1dGlvbicpWzBdLm91dGVySFRNTDtcbiAgICAgIC8vIHRoaXMgZG9lc24ndCB3b3JrLCBub3Qgc3VyZSB3aHkuXG4gICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLnJlbW92ZUF0dHJpYnV0aW9uKHZlY3RvckF0dHJpYnV0aW9uKTtcbiAgICB9XG4gIH0sXG5cbiAgX2FzeW5jQWRkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcbiAgICBpZiAobWFwLmF0dHJpYnV0aW9uQ29udHJvbCkge1xuICAgICAgaWYgKHRoaXMuX2N1c3RvbVRpbGVzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAvLyBwdWxsIHN0YXRpYyBjb3B5cmlnaHQgdGV4dCBmb3Igc2VydmljZXMgcHVibGlzaGVkIHdpdGggUHJvXG4gICAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbignPHNwYW4gY2xhc3M9XCJlc3JpLWR5bmFtaWMtYXR0cmlidXRpb25cIj4nICsgdGhpcy5fY29weXJpZ2h0VGV4dCArICc8L3NwYW4+Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByb3ZpZGUgZHluYW1pYyBhdHRyaWJ1dGlvbiBmb3IgRXNyaSBiYXNlbWFwc1xuICAgICAgICBVdGlsLl9nZXRBdHRyaWJ1dGlvbkRhdGEoJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcCcsIG1hcCk7XG4gICAgICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24oJzxzcGFuIGNsYXNzPVwiZXNyaS1keW5hbWljLWF0dHJpYnV0aW9uXCI+VVNHUywgTk9BQTwvc3Bhbj4nKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgVXRpbC5fdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgbWFwIHRvIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB0aWxlc1xuICAgIG1hcC5nZXRDb250YWluZXIoKS5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5fbWFwYm94R0wub3B0aW9ucy5zdHlsZS5sYXllcnNbMF0ucGFpbnRbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICB0aGlzLl9tYXBib3hHTC5hZGRUbyhtYXAsIHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyIChpZCkge1xuICByZXR1cm4gbmV3IExheWVyKGlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXSwibmFtZXMiOlsicmVxdWVzdCIsIkwiLCJVdGlsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0NDQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxPQUFPLEdBQUcsUUFBUSxFQUFFLE9BQU8sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLE9BQU8sTUFBTSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvMEIsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFN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QUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmYsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvaEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMVUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3NUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdFksQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3bEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RSxDQUFBLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pYLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xaLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2oyQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ2hwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xOLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM3RHLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9HLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzU0QixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvRCxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5a1AsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbFYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RlLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJDLENBQUEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN4RCxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pwSyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1SixDQUFBLFlBQVksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzdvTyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsUUFB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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN4bEQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUM1MUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakUsQ0FBQSxZQUFZLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM5ckIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMvZ0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BGLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2pzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4bUcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNwNUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BrRyxDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3Q3QixDQUFBLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdmdDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbjhELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNFLENBQUEsWUFBWSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbnJFLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbjlOLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzUSxDQUFBLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLDBJQUEwSSxDQUFDLFFBQVEsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnS0FBZ0ssQ0FBQyxRQUFRLENBQUMsMEtBQTBLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsdUhBQXVILENBQUMsUUFBUSxDQUFDLGlGQUFpRixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLDhRQUE4USxDQUFDLFFBQVEsQ0FBQyw4S0FBOEssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpZ0JBQWlnQixDQUFDLFFBQVEsQ0FBQyw2UUFBNlEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyw4aUJBQThpQixDQUFDLFFBQVEsQ0FBQyw4c0JBQThzQixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLGd0QkFBZ3RCLENBQUMsUUFBUSxDQUFDLGdiQUFnYixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLGdOQUFnTixDQUFDLFFBQVEsQ0FBQyw4SkFBOEosQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1UUFBdVEsQ0FBQyxRQUFRLENBQUMseVlBQXlZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsd1NBQXdTLENBQUMsUUFBUSxDQUFDLDhrQkFBOGtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsc3pCQUFzekIsQ0FBQyxRQUFRLENBQUMsd0lBQXdJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsbTFCQUFtMUIsQ0FBQyxRQUFRLENBQUMsMFFBQTBRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsd05BQXdOLENBQUMsUUFBUSxDQUFDLHVRQUF1USxDQUFDLENBQUMsQ0FBQztBQUN2alMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNStFLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN0SSxDQUFBLFlBQVksQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM1L0IsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoRixDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsakUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6SixDQUFBLFlBQVksQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsL0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzkzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDaFIsQ0FBQSxZQUFZLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbDFELENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9xRSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2dkksQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZJLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcnFGLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xILENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3YzRSxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pKLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDNFLENBQUEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxTSxDQUFBLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcmlHLENBQUEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFKLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4YyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztBQUMxNEMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNILENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3UixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUQsQ0FBQSxZQUFZLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqWCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9FLENBQUEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFDN0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckYsQ0FBQSxZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDanBNLENBQUEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xaLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDeGlILENBQUEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEYsQ0FBQSxZQUFZLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ2p1QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0c0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RHLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsdkcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsSyxDQUFBLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hrQyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4UyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzk4QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDemUsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDOXdCLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlELENBQUEsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTSxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3MkIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25GLENBQUEsWUFBWSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pwQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckQsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2owQixDQUFBLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2hILENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5d0YsQ0FBQSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pELENBQUEsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM2hELENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0csQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3h0QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN4K0QsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMvTyxDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQy9tQixDQUFBLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4aEQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BwSSxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekQsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZvTixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvSyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxD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SUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNXJFLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xHLENBQUEsWUFBWSxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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QyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzkrRCxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMTJDLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqMkIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3Z0QyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkYsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2h0RCxDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNHLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxH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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMs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QUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMs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LElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3B1RixDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZILENBQUEsWUFBWSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcDBCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDLy9DLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN3lELENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLHlCQUF5QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzM0MsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFwQixDQUFBLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwbkMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsQ0FBQSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUMveEIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELENBQUEsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNybEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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QUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZFLENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNucEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUMxSixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4K0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRixDQUFBLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUMxcUssQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsMkRBQTJELENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2gwQyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUMxckMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2oxRCxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcHFILENBQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25ILENBQUEsWUFBWSxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUMvYyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM1MEIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUMxZ0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQy9zQixDQUFBLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkQsQ0FBQSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNwWixDQUFBLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZSLENBQUEsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNwUyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN6cUQsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ2g4RCxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDcCtILENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDaDJWLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNsdEcsQ0FBQSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVHLENBQUEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQzFzRixDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDamlKLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDdjNHLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RCxDQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqM0IsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFVBQVUsRUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ULENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3J5QixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFKLENBQUEsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0YsQ0FBQSxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9EQUFvRCxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1dE0sQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRSxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGdMQUFnTCxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsbUtBQW1LLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHVHQUF1RyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnSEFBZ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0dBQW9HLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGdIQUFnSCxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsdUhBQXVILENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxD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LENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBFQUEwRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZ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TSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUMvcWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvd0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hELENBQUEsQ0FBQyxVQUFVLE1BQU0sQ0FBQztBQUNsQixDQUFBLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeHhRLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE9BQU8sSUFBSSxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7O0FBRXZJLENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6RCxDQUFBLFlBQVksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzdkQsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLFNBQVMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsU0FBUyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDaHpDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNybU0sQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25pQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLENBQUEsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaDhCLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0ksQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFBLENBQUMsVUFBVSxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUEsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDMXJPLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFPLElBQUksS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDOztBQUUzSixDQUFBLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQ25NLENBQUEsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEksQ0FBQSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN2USxDQUFBLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRSxDQUFBLFlBQVksQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1bkssQ0FBQSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsQ0FBQSxZQUFZLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN4a0UsQ0FBQSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pGLENBQUEsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvakMsQ0FBQSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkUsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzNUIsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNuQixDQUFBLENBQUMsQ0FBQyxDQUFDOztDQ2pUSCxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzVCLENBQUEsSUFBSSxPQUFPLEVBQUU7QUFDYixDQUFBLE1BQU0sY0FBYyxFQUFFLEVBQUU7QUFDeEIsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxVQUFVLEVBQUUsVUFBVSxPQUFPLEVBQUU7QUFDbkMsQ0FBQSxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUVwQyxDQUFBLFFBQVEsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO0FBQ2pDLENBQUEsWUFBWSxRQUFRLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDdkQsQ0FBQSxTQUFTLE1BQU07QUFDZixDQUFBLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0FBQzlGLENBQUEsU0FBUzs7QUFFVCxDQUFBO0FBQ0EsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBO0FBQ0EsQ0FBQTtBQUNBLENBQUE7QUFDQSxDQUFBLFFBQVEsSUFBSSxRQUFRLEdBQUcsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUNwRCxDQUFBLFlBQVksSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7O0FBRTdDLENBQUEsWUFBWSxLQUFLLEdBQUcsWUFBWTtBQUNoQyxDQUFBO0FBQ0EsQ0FBQSxnQkFBZ0IsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUM3QixDQUFBLGdCQUFnQixJQUFJLElBQUksRUFBRTtBQUMxQixDQUFBLG9CQUFvQixTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRCxDQUFBLG9CQUFvQixJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLENBQUEsaUJBQWlCO0FBQ2pCLENBQUEsYUFBYSxDQUFDOztBQUVkLENBQUEsWUFBWSxTQUFTLEdBQUcsWUFBWTtBQUNwQyxDQUFBLGdCQUFnQixJQUFJLElBQUksRUFBRTtBQUMxQixDQUFBO0FBQ0EsQ0FBQSxvQkFBb0IsSUFBSSxHQUFHLFNBQVMsQ0FBQzs7QUFFckMsQ0FBQSxpQkFBaUIsTUFBTTtBQUN2QixDQUFBO0FBQ0EsQ0FBQSxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakQsQ0FBQSxvQkFBb0IsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFBLG9CQUFvQixJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLENBQUEsaUJBQWlCO0FBQ2pCLENBQUEsYUFBYSxDQUFDOztBQUVkLENBQUEsWUFBWSxPQUFPLFNBQVMsQ0FBQztBQUM3QixDQUFBLFNBQVMsQ0FBQzs7QUFFVixDQUFBO0FBQ0EsQ0FBQSxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFO0FBQzFCLENBQUEsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtBQUNoQyxDQUFBLFlBQVksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ2xDLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7QUFFM0QsQ0FBQSxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7QUFFdkIsQ0FBQSxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVwRSxDQUFBO0FBQ0EsQ0FBQSxRQUFRLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7QUFDdkMsQ0FBQSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzRixDQUFBLFNBQVM7QUFDVCxDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtBQUM3QixDQUFBLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7QUFDN0MsQ0FBQSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEcsQ0FBQSxTQUFTOztBQUVULENBQUEsUUFBUSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0QsQ0FBQSxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzNCLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksU0FBUyxFQUFFLFlBQVk7QUFDM0IsQ0FBQSxRQUFRLE9BQU87QUFDZixDQUFBLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7QUFDdkMsQ0FBQSxZQUFZLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWTtBQUN2QyxDQUFBLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQ2pDLENBQUEsWUFBWSxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7QUFDdEMsQ0FBQSxZQUFZLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTtBQUNsQyxDQUFBLFNBQVMsQ0FBQztBQUNWLENBQUEsS0FBSzs7QUFFTCxDQUFBLElBQUksY0FBYyxFQUFFLFlBQVk7QUFDaEMsQ0FBQSxRQUFRLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O0FBRXhGLENBQUEsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3ZDLENBQUEsUUFBUSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMvQyxDQUFBLFFBQVEsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0MsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxPQUFPLEVBQUUsWUFBWTtBQUN6QixDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFM0MsQ0FBQSxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDakQsQ0FBQSxZQUFZLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWTtBQUN4QyxDQUFBLFlBQVksV0FBVyxFQUFFLEtBQUs7QUFDOUIsQ0FBQSxZQUFZLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM1QyxDQUFBLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztBQUN6QyxDQUFBLFlBQVksa0JBQWtCLEVBQUUsS0FBSztBQUNyQyxDQUFBLFNBQVMsQ0FBQyxDQUFDOztBQUVYLENBQUEsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7QUFFaEQsQ0FBQTtBQUNBLENBQUEsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztBQUU5QyxDQUFBO0FBQ0EsQ0FBQSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBQzlFLENBQUEsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztBQUNoRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRTtBQUMxQixDQUFBO0FBQ0EsQ0FBQSxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVwRSxDQUFBLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQzNCLENBQUEsVUFBVSxPQUFPO0FBQ2pCLENBQUEsU0FBUzs7QUFFVCxDQUFBLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdEMsQ0FBQSxZQUFZLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWTtBQUN6QyxDQUFBLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNO0FBQzVCLENBQUEsWUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuRSxDQUFBLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUVsRCxDQUFBLFFBQVEsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFM0MsQ0FBQTtBQUNBLENBQUE7O0FBRUEsQ0FBQSxRQUFRLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDOUIsQ0FBQSxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUEsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztBQUUxQyxDQUFBLFFBQVEsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDN0UsQ0FBQSxZQUFZLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELENBQUEsWUFBWSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNuRCxDQUFBLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3pCLENBQUEsU0FBUyxNQUFNO0FBQ2YsQ0FBQSxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN0QixDQUFBLFNBQVM7QUFDVCxDQUFBLEtBQUs7O0FBRUwsQ0FBQTtBQUNBLENBQUEsSUFBSSxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDN0IsQ0FBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3pCLENBQUEsUUFBUSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO0FBQ3JDLENBQUEsUUFBUSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDckMsQ0FBQSxPQUFPLENBQUMsQ0FBQztBQUNULENBQUEsS0FBSzs7QUFFTCxDQUFBO0FBQ0EsQ0FBQSxJQUFJLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRTtBQUMvQixDQUFBLE1BQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoRCxDQUFBLFVBQVUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFNUcsQ0FBQSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtBQUM3QixDQUFBLE1BQU0sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDM0IsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxRQUFRLEVBQUUsWUFBWTtBQUMxQixDQUFBLE1BQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM3RCxDQUFBLFVBQVUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzs7QUFFdEksQ0FBQSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvRixDQUFBLEtBQUs7O0FBRUwsQ0FBQSxJQUFJLGNBQWMsRUFBRSxVQUFVLENBQUMsRUFBRTtBQUNqQyxDQUFBLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZO0FBQzFDLENBQUEsVUFBVSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUN4QyxDQUFBLFVBQVUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3hDLENBQUEsVUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7O0FBRTFGLENBQUE7QUFDQSxDQUFBLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFFeEUsQ0FBQTtBQUNBLENBQUEsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtBQUM5RCxDQUFBLGNBQWMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDcEMsQ0FBQSxjQUFjLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM5QixDQUFBLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDOztBQUVwQixDQUFBO0FBQ0EsQ0FBQSxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzdCLENBQUEsY0FBYyxNQUFNLEVBQUUsTUFBTTtBQUM1QixDQUFBLGNBQWMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQzVCLENBQUEsV0FBVyxDQUFDLENBQUM7QUFDYixDQUFBLE9BQU8sRUFBRSxJQUFJLENBQUM7QUFDZCxDQUFBLEtBQUs7QUFDTCxDQUFBLENBQUMsQ0FBQyxDQUFDOztBQUVILENBQUEsQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLE9BQU8sRUFBRTtBQUNoQyxDQUFBLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkMsQ0FBQSxDQUFDLENBQUM7O0NDMU1LLFNBQVMsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDN0MsQ0FBQSxFQUFFQSxtQkFBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzNDLENBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2hCLENBQUEsTUFBTUEsbUJBQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRTtBQUN6RSxDQUFBLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNwQixDQUFBLFVBQVUsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEQsQ0FBQSxVQUFVLE9BQU8sQ0FBQyxTQUFTLEdBQUdDLEdBQUMsQ0FBQyxRQUFRLENBQUM7QUFDekMsQ0FBQSxZQUFZLFdBQVcsRUFBRSxPQUFPO0FBQ2hDLENBQUEsWUFBWSxLQUFLLEVBQUUsS0FBSztBQUN4QixDQUFBLFdBQVcsQ0FBQyxDQUFDOztBQUViLENBQUEsVUFBVSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUNoQyxDQUFBLFVBQVUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLENBQUEsU0FBUztBQUNULENBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xCLENBQUEsS0FBSyxNQUFNO0FBQ1gsQ0FBQSxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztBQUNwRSxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNkLENBQUEsQ0FBQzs7QUFFRCxDQUFPLFNBQVMsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ3hELENBQUE7QUFDQSxDQUFBLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUMvRSxDQUFBLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDakYsQ0FBQSxHQUFHOztBQUVILENBQUE7QUFDQSxDQUFBLEVBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUM3RCxDQUFBLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDOUQsQ0FBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDOUMsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRztBQUN2QixDQUFBLElBQUksSUFBSSxFQUFFLFFBQVE7QUFDbEIsQ0FBQSxJQUFJLE1BQU0sRUFBRSxLQUFLO0FBQ2pCLENBQUEsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxPQUFPO0FBQzFDLENBQUEsSUFBSSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSztBQUNwRSxDQUFBLElBQUksS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSTtBQUM5RSxDQUFBLElBQUksS0FBSyxFQUFFO0FBQ1gsQ0FBQSxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFBLEtBQUs7QUFDTCxDQUFBLElBQUksV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0FBQ3JDLENBQUEsSUFBSSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7QUFDdkIsQ0FBQSxHQUFHLENBQUM7O0FBRUosQ0FBQSxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDM0MsQ0FBQTtBQUNBLENBQUEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekYsQ0FBQSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFBLEdBQUc7QUFDSCxDQUFBLENBQUM7O0NDdkRNLElBQUksT0FBTyxHQUFHQSxHQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxDQUFBLEVBQUUsT0FBTyxFQUFFO0FBQ1gsQ0FBQSxJQUFJLFNBQVMsRUFBRSxvREFBb0Q7QUFDbkUsQ0FBQSxJQUFJLFNBQVMsRUFBRSw2QkFBNkI7QUFDNUMsQ0FBQSxJQUFJLE1BQU0sRUFBRTtBQUNaLENBQUEsTUFBTSxVQUFVLEVBQUUsa0NBQWtDO0FBQ3BELENBQUEsTUFBTSxNQUFNLEVBQUUsa0NBQWtDO0FBQ2hELENBQUEsTUFBTSxRQUFRLEVBQUUsa0NBQWtDO0FBQ2xELENBQUEsTUFBTSxZQUFZLEVBQUUsa0NBQWtDO0FBQ3RELENBQUEsTUFBTSxTQUFTLEVBQUUsa0NBQWtDO0FBQ25ELENBQUEsTUFBTSxjQUFjLEVBQUUsa0NBQWtDO0FBQ3hELENBQUEsTUFBTSxlQUFlLEVBQUUsa0NBQWtDO0FBQ3pELENBQUEsTUFBTSxhQUFhLEVBQUUsa0NBQWtDO0FBQ3ZELENBQUEsTUFBTSxRQUFRLEVBQUUsa0NBQWtDO0FBQ2xELENBQUEsTUFBTSxXQUFXLEVBQUUsa0NBQWtDO0FBQ3JELENBQUEsTUFBTSxZQUFZLEVBQUUsa0NBQWtDO0FBQ3RELENBQUEsTUFBTSxlQUFlLEVBQUUsa0NBQWtDO0FBQ3pELENBQUEsTUFBTSxlQUFlLEVBQUUsa0NBQWtDO0FBQ3pELENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0FBQ2pDLENBQUE7QUFDQSxDQUFBLElBQUksT0FBTyxHQUFHO0FBQ2QsQ0FBQSxNQUFNLEdBQUcsRUFBRSxPQUFPO0FBQ2xCLENBQUEsS0FBSyxDQUFDOztBQUVOLENBQUEsSUFBSSxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDeEUsQ0FBQSxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNwRixDQUFBLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLDRKQUE0SixDQUFDLENBQUM7QUFDcEwsQ0FBQSxLQUFLO0FBQ0wsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxLQUFLLEVBQUUsVUFBVSxHQUFHLEVBQUU7QUFDeEIsQ0FBQSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDOztBQUVwQixDQUFBLElBQUlDLGdCQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRWpDLENBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtBQUNoQyxDQUFBO0FBQ0EsQ0FBQSxNQUFNQSxnQkFBSSxDQUFDLG1CQUFtQixDQUFDLHdEQUF3RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlGLENBQUEsTUFBTSxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7QUFDeEcsQ0FBQSxLQUFLOztBQUVMLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDckIsQ0FBQSxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2QixDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO0FBQ3JDLENBQUEsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekIsQ0FBQSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtBQUMzQixDQUFBLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUVBLGdCQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNuRCxDQUFBLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRXBDLENBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtBQUNoQyxDQUFBLE1BQU0sSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkcsQ0FBQTtBQUNBLENBQUEsTUFBTSxHQUFHLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNsRSxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFNBQVMsRUFBRSxZQUFZO0FBQ3pCLENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOztBQUV4QixDQUFBO0FBQ0EsQ0FBQSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7O0FBRTNHLENBQUEsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRUEsZ0JBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2xELENBQUEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQSxHQUFHO0FBQ0gsQ0FBQSxDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFPLFNBQVMsT0FBTyxFQUFFLEdBQUcsRUFBRTtBQUM5QixDQUFBLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFBLENBQUM7O0NDL0VNLElBQUksS0FBSyxHQUFHRCxHQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxDQUFBLEVBQUUsT0FBTyxFQUFFO0FBQ1gsQ0FBQSxJQUFJLFNBQVMsRUFBRSxvREFBb0Q7QUFDbkUsQ0FBQSxHQUFHOztBQUVILENBQUEsRUFBRSxVQUFVLEVBQUUsVUFBVSxPQUFPLEVBQUU7QUFDakMsQ0FBQTtBQUNBLENBQUEsSUFBSSxPQUFPLEdBQUc7QUFDZCxDQUFBLE1BQU0sRUFBRSxFQUFFLE9BQU87QUFDakIsQ0FBQSxLQUFLLENBQUM7O0FBRU4sQ0FBQSxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRTtBQUN4QyxDQUFBLE1BQU0sSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3pELENBQUEsTUFBTSxJQUFJLE9BQU8sQ0FBQztBQUNsQixDQUFBLE1BQU0sSUFBSSxRQUFRLENBQUM7O0FBRW5CLENBQUEsTUFBTUQsbUJBQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUM5RCxDQUFBLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNwQixDQUFBLFVBQVUsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7O0FBRWpDLENBQUE7QUFDQSxDQUFBLFVBQVUsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDN0QsQ0FBQSxZQUFZLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLENBQUE7QUFDQSxDQUFBLFlBQVksSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUU7QUFDNUMsQ0FBQSxjQUFjLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0FBQy9ELENBQUEsYUFBYTtBQUNiLENBQUEsWUFBWUEsbUJBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRTtBQUNoRSxDQUFBLGNBQWMsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUMxQixDQUFBO0FBQ0EsQ0FBQSxnQkFBZ0IsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDbEUsQ0FBQSxrQkFBa0IsWUFBWSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQztBQUNoRixDQUFBLGlCQUFpQjs7QUFFakIsQ0FBQSxnQkFBZ0IsUUFBUSxHQUFHLE9BQU8sR0FBRyxZQUFZLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztBQUMvRSxDQUFBLGdCQUFnQkEsbUJBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUM5RCxDQUFBLGtCQUFrQixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzlCLENBQUEsb0JBQW9CLFdBQVcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDOztBQUUvRCxDQUFBLG9CQUFvQixJQUFJLENBQUMsU0FBUyxHQUFHQyxHQUFDLENBQUMsUUFBUSxDQUFDO0FBQ2hELENBQUEsc0JBQXNCLFdBQVcsRUFBRSxPQUFPO0FBQzFDLENBQUEsc0JBQXNCLEtBQUssRUFBRSxLQUFLO0FBQ2xDLENBQUEscUJBQXFCLENBQUMsQ0FBQzs7QUFFdkIsQ0FBQSxvQkFBb0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdkMsQ0FBQSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pELENBQUEsbUJBQW1CO0FBQ25CLENBQUEsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekIsQ0FBQSxlQUFlO0FBQ2YsQ0FBQSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckIsQ0FBQSxXQUFXLE1BQU07QUFDakIsQ0FBQTtBQUNBLENBQUEsWUFBWSxhQUFhLENBQUMsZUFBZSxHQUFHLDZCQUE2QixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pGLENBQUEsV0FBVztBQUNYLENBQUEsU0FBUztBQUNULENBQUEsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQSxLQUFLLE1BQU07QUFDWCxDQUFBLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO0FBQ2pILENBQUEsS0FBSztBQUNMLENBQUEsR0FBRzs7QUFFSCxDQUFBLEVBQUUsS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFO0FBQ3hCLENBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNwQixDQUFBLElBQUlDLGdCQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRWpDLENBQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDckIsQ0FBQSxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2QixDQUFBLEtBQUssTUFBTTtBQUNYLENBQUEsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZO0FBQ3JDLENBQUEsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekIsQ0FBQSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtBQUMzQixDQUFBLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUVBLGdCQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNuRCxDQUFBLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRXBDLENBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtBQUNoQyxDQUFBLE1BQU0sSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkcsQ0FBQTtBQUNBLENBQUEsTUFBTSxHQUFHLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNsRSxDQUFBLEtBQUs7QUFDTCxDQUFBLEdBQUc7O0FBRUgsQ0FBQSxFQUFFLFNBQVMsRUFBRSxZQUFZO0FBQ3pCLENBQUEsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3hCLENBQUEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtBQUNoQyxDQUFBLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO0FBQy9CLENBQUEsUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDakMsQ0FBQTtBQUNBLENBQUEsVUFBVSxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLHlDQUF5QyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDN0gsQ0FBQSxTQUFTO0FBQ1QsQ0FBQSxPQUFPLE1BQU07QUFDYixDQUFBO0FBQ0EsQ0FBQSxRQUFRQSxnQkFBSSxDQUFDLG1CQUFtQixDQUFDLHdEQUF3RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hHLENBQUEsUUFBUSxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7QUFDMUcsQ0FBQSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFQSxnQkFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDdEQsQ0FBQSxPQUFPO0FBQ1AsQ0FBQSxLQUFLOztBQUVMLENBQUE7QUFDQSxDQUFBLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMzRyxDQUFBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BDLENBQUEsR0FBRztBQUNILENBQUEsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBTyxTQUFTLEtBQUssRUFBRSxFQUFFLEVBQUU7QUFDM0IsQ0FBQSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQSxDQUFDOzs7Ozs7OzsifQ== diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-google-mutant.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-google-mutant.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,439 @@ +// Based on https://github.com/shramov/leaflet-plugins +// GridLayer like https://avinmathew.com/leaflet-and-google-maps/ , but using MutationObserver instead of jQuery + + +// 🍂class GridLayer.GoogleMutant +// 🍂extends GridLayer +L.GridLayer.GoogleMutant = L.GridLayer.extend({ + includes: L.Mixin.Events, + + options: { + minZoom: 0, + maxZoom: 18, + tileSize: 256, + subdomains: 'abc', + errorTileUrl: '', + attribution: '', // The mutant container will add its own attribution anyways. + opacity: 1, + continuousWorld: false, + noWrap: false, + // 🍂option type: String = 'roadmap' + // Google's map type. Valid values are 'roadmap', 'satellite' or 'terrain'. 'hybrid' is not really supported. + type: 'roadmap', + maxNativeZoom: 21 + }, + + initialize: function (options) { + L.GridLayer.prototype.initialize.call(this, options); + + this._ready = !!window.google && !!window.google.maps && !!window.google.maps.Map; + + this._GAPIPromise = this._ready ? Promise.resolve(window.google) : new Promise(function (resolve, reject) { + var checkCounter = 0; + var intervalId = null; + intervalId = setInterval(function () { + if (checkCounter >= 10) { + clearInterval(intervalId); + return reject(new Error('window.google not found after 10 attempts')); + } + if (!!window.google && !!window.google.maps && !!window.google.maps.Map) { + clearInterval(intervalId); + return resolve(window.google); + } + checkCounter++; + }, 500); + }); + + // Couple data structures indexed by tile key + this._tileCallbacks = {}; // Callbacks for promises for tiles that are expected + this._freshTiles = {}; // Tiles from the mutant which haven't been requested yet + + this._imagesPerTile = (this.options.type === 'hybrid') ? 2 : 1; + }, + + onAdd: function (map) { + L.GridLayer.prototype.onAdd.call(this, map); + this._initMutantContainer(); + + this._GAPIPromise.then(function () { + this._ready = true; + this._map = map; + + this._initMutant(); + + map.on('viewreset', this._reset, this); + map.on('move', this._update, this); + map.on('zoomend', this._handleZoomAnim, this); + map.on('resize', this._resize, this); + + //handle layer being added to a map for which there are no Google tiles at the given zoom + google.maps.event.addListenerOnce(this._mutant, 'idle', function () { + this._checkZoomLevels(); + this._mutantIsReady = true; + }.bind(this)); + + //20px instead of 1em to avoid a slight overlap with google's attribution + map._controlCorners.bottomright.style.marginBottom = '20px'; + map._controlCorners.bottomleft.style.marginBottom = '20px'; + + this._reset(); + this._update(); + + if (this._subLayers) { + //restore previously added google layers + for (var layerName in this._subLayers) { + this._subLayers[layerName].setMap(this._mutant); + } + } + }.bind(this)); + }, + + onRemove: function (map) { + L.GridLayer.prototype.onRemove.call(this, map); + map._container.removeChild(this._mutantContainer); + this._mutantContainer = undefined; + + map.off('viewreset', this._reset, this); + map.off('move', this._update, this); + map.off('zoomend', this._handleZoomAnim, this); + map.off('resize', this._resize, this); + + map._controlCorners.bottomright.style.marginBottom = '0em'; + map._controlCorners.bottomleft.style.marginBottom = '0em'; + }, + + getAttribution: function () { + return this.options.attribution; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (opacity < 1) { + L.DomUtil.setOpacity(this._mutantContainer, opacity); + } + }, + + setElementSize: function (e, size) { + e.style.width = size.x + 'px'; + e.style.height = size.y + 'px'; + }, + + + addGoogleLayer: function (googleLayerName, options) { + if (!this._subLayers) this._subLayers = {}; + return this._GAPIPromise.then(function () { + var Constructor = google.maps[googleLayerName]; + var googleLayer = new Constructor(options); + googleLayer.setMap(this._mutant); + this._subLayers[googleLayerName] = googleLayer; + return googleLayer; + }.bind(this)); + }, + + removeGoogleLayer: function (googleLayerName) { + var googleLayer = this._subLayers && this._subLayers[googleLayerName]; + if (!googleLayer) return; + + googleLayer.setMap(null); + delete this._subLayers[googleLayerName]; + }, + + + _initMutantContainer: function () { + if (!this._mutantContainer) { + this._mutantContainer = L.DomUtil.create('div', 'leaflet-google-mutant leaflet-top leaflet-left'); + this._mutantContainer.id = '_MutantContainer_' + L.Util.stamp(this._mutantContainer); + this._mutantContainer.style.zIndex = '800'; //leaflet map pane at 400, controls at 1000 + this._mutantContainer.style.pointerEvents = 'none'; + + this._map.getContainer().appendChild(this._mutantContainer); + } + + this.setOpacity(this.options.opacity); + this.setElementSize(this._mutantContainer, this._map.getSize()); + + this._attachObserver(this._mutantContainer); + }, + + _initMutant: function () { + if (!this._ready || !this._mutantContainer) return; + this._mutantCenter = new google.maps.LatLng(0, 0); + + var map = new google.maps.Map(this._mutantContainer, { + center: this._mutantCenter, + zoom: 0, + tilt: 0, + mapTypeId: this.options.type, + disableDefaultUI: true, + keyboardShortcuts: false, + draggable: false, + disableDoubleClickZoom: true, + scrollwheel: false, + streetViewControl: false, + styles: this.options.styles || {}, + backgroundColor: 'transparent' + }); + + this._mutant = map; + + google.maps.event.addListenerOnce(map, 'idle', function () { + var nodes = this._mutantContainer.querySelectorAll('a'); + for (var i = 0; i < nodes.length; i++) { + nodes[i].style.pointerEvents = 'auto'; + } + }.bind(this)); + + // 🍂event spawned + // Fired when the mutant has been created. + this.fire('spawned', {mapObject: map}); + }, + + _attachObserver: function _attachObserver (node) { +// console.log('Gonna observe', node); + + var observer = new MutationObserver(this._onMutations.bind(this)); + + // pass in the target node, as well as the observer options + observer.observe(node, { childList: true, subtree: true }); + }, + + _onMutations: function _onMutations (mutations) { + for (var i = 0; i < mutations.length; ++i) { + var mutation = mutations[i]; + for (var j = 0; j < mutation.addedNodes.length; ++j) { + var node = mutation.addedNodes[j]; + + if (node instanceof HTMLImageElement) { + this._onMutatedImage(node); + } else if (node instanceof HTMLElement) { + Array.prototype.forEach.call(node.querySelectorAll('img'), this._onMutatedImage.bind(this)); + } + } + } + }, + + // Only images which 'src' attrib match this will be considered for moving around. + // Looks like some kind of string-based protobuf, maybe?? + // Only the roads (and terrain, and vector-based stuff) match this pattern + _roadRegexp: /!1i(\d+)!2i(\d+)!3i(\d+)!/, + + // On the other hand, raster imagery matches this other pattern + _satRegexp: /x=(\d+)&y=(\d+)&z=(\d+)/, + + // On small viewports, when zooming in/out, a static image is requested + // This will not be moved around, just removed from the DOM. + _staticRegExp: /StaticMapService\.GetMapImage/, + + _onMutatedImage: function _onMutatedImage (imgNode) { +// if (imgNode.src) { +// console.log('caught mutated image: ', imgNode.src); +// } + + var coords; + var match = imgNode.src.match(this._roadRegexp); + var sublayer = 0; + + if (match) { + coords = { + z: match[1], + x: match[2], + y: match[3] + }; + if (this._imagesPerTile > 1) { + imgNode.style.zIndex = 1; + sublayer = 1; + } + } else { + match = imgNode.src.match(this._satRegexp); + if (match) { + coords = { + x: match[1], + y: match[2], + z: match[3] + }; + } +// imgNode.style.zIndex = 0; + sublayer = 0; + } + + if (coords) { + var tileKey = this._tileCoordsToKey(coords); + imgNode.style.position = 'absolute'; + var cloneImgNode = imgNode.cloneNode(true); + cloneImgNode.style.visibility = 'visible'; + imgNode.style.visibility = 'hidden'; + + var key = tileKey + '/' + sublayer; + if (key in this._tileCallbacks && this._tileCallbacks[key]) { +// console.log('Fullfilling callback ', key); + this._tileCallbacks[key].shift()(cloneImgNode); + if (!this._tileCallbacks[key].length) { delete this._tileCallbacks[key]; } + } else { +// console.log('Caching for later', key); + + if (this._tiles[tileKey]) { + //we already have a tile in this position (mutation is probably a google layer being added) + //replace it + var c = this._tiles[tileKey].el; + var oldImg = (sublayer === 0) ? c.firstChild : c.firstChild.nextSibling; + c.replaceChild(cloneImgNode, oldImg); + } else if (key in this._freshTiles) { + this._freshTiles[key].push(cloneImgNode); + } else { + this._freshTiles[key] = [cloneImgNode]; + } + } + } else if (imgNode.src.match(this._staticRegExp)) { + imgNode.style.visibility = 'hidden'; + } + }, + + + createTile: function (coords, done) { + var key = this._tileCoordsToKey(coords); + + var tileContainer = L.DomUtil.create('div'); + tileContainer.dataset.pending = this._imagesPerTile; + done = done.bind(this, null, tileContainer); + + for (var i = 0; i < this._imagesPerTile; i++) { + var key2 = key + '/' + i; + if (key2 in this._freshTiles) { + tileContainer.appendChild(this._freshTiles[key2].pop()); + if (!this._freshTiles[key2].length) { delete this._freshTiles[key2]; } + tileContainer.dataset.pending--; +// console.log('Got ', key2, ' from _freshTiles'); + } else { + this._tileCallbacks[key2] = this._tileCallbacks[key2] || []; + this._tileCallbacks[key2].push( (function (c/*, k2*/) { + return function (cloneImgNode) { + c.appendChild(cloneImgNode); + c.dataset.pending--; + if (!parseInt(c.dataset.pending)) { done(); } +// console.log('Sent ', k2, ' to _tileCallbacks, still ', c.dataset.pending, ' images to go'); + }.bind(this); + }.bind(this))(tileContainer/*, key2*/) ); + } + } + + if (!parseInt(tileContainer.dataset.pending)) { + L.Util.requestAnimFrame(done); + } + return tileContainer; + }, + + _checkZoomLevels: function () { + //setting the zoom level on the Google map may result in a different zoom level than the one requested + //(it won't go beyond the level for which they have data). + var zoomLevel = this._map.getZoom(); + var gMapZoomLevel = this._mutant.getZoom(); + if (!zoomLevel || !gMapZoomLevel) return; + + + if ((gMapZoomLevel !== zoomLevel) || //zoom levels are out of sync, Google doesn't have data + (gMapZoomLevel > this.options.maxNativeZoom)) { //at current location, Google does have data (contrary to maxNativeZoom) + //Update maxNativeZoom + this._setMaxNativeZoom(gMapZoomLevel); + } + }, + + _setMaxNativeZoom: function (zoomLevel) { + if (zoomLevel != this.options.maxNativeZoom) { + this.options.maxNativeZoom = zoomLevel; + this._resetView(); + } + }, + + _reset: function () { + this._initContainer(); + }, + + _update: function () { + // zoom level check needs to happen before super's implementation (tile addition/creation) + // otherwise tiles may be missed if maxNativeZoom is not yet correctly determined + if (this._mutant) { + var center = this._map.getCenter(); + var _center = new google.maps.LatLng(center.lat, center.lng); + + this._mutant.setCenter(_center); + var zoom = this._map.getZoom(); + var fractionalLevel = zoom !== Math.round(zoom); + var mutantZoom = this._mutant.getZoom(); + + //ignore fractional zoom levels + if (!fractionalLevel && (zoom != mutantZoom)) { + this._mutant.setZoom(zoom); + + if (this._mutantIsReady) this._checkZoomLevels(); + //else zoom level check will be done later by 'idle' handler + } + } + + L.GridLayer.prototype._update.call(this); + }, + + _resize: function () { + var size = this._map.getSize(); + if (this._mutantContainer.style.width === size.x && + this._mutantContainer.style.height === size.y) + return; + this.setElementSize(this._mutantContainer, size); + if (!this._mutant) return; + google.maps.event.trigger(this._mutant, 'resize'); + }, + + _handleZoomAnim: function () { + if (!this._mutant) return; + var center = this._map.getCenter(); + var _center = new google.maps.LatLng(center.lat, center.lng); + + this._mutant.setCenter(_center); + this._mutant.setZoom(Math.round(this._map.getZoom())); + }, + + // Agressively prune _freshtiles when a tile with the same key is removed, + // this prevents a problem where Leaflet keeps a loaded tile longer than + // GMaps, so that GMaps makes two requests but Leaflet only consumes one, + // polluting _freshTiles with stale data. + _removeTile: function (key) { + if (!this._mutant) return; + + for (var i=0; i + * http://rubaxa.github.io/Sortable/ + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*! + * Proj4js - Javascript reprojection library. + * + * Authors: + * + * - Mike Adair madairATdmsolutions.ca + * - Richard Greenwood richATgreenwoodmap.com + * - Didier Richard didier.richardATign.fr + * - Stephen Irons stephen.ironsATclear.net.nz + * - Olivier Terral oterralATgmail.com + * - Calvin Metcalf cmetcalfATappgeo.com + * + * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * _THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE._ + * + */ +/*! + * Copyright 2012-2016 Jacob Toye and Leaflet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*! + * Proj4Leaflet -- Smooth Proj4js integration with Leaflet + * + * Copyright (c) 2012, Kartena AB + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(['leaflet'], factory); + } else if (typeof exports === 'object') { + module.exports = factory(require('leaflet')); + } else { + root.Gp = factory(root.L); + } +}(this, function(leaflet) { + +var gp, CommonUtilsAutoLoadConfig, leafletDraw, sortable, CommonControlsLayerSwitcherDOM, LeafletControlsLayerSwitcher, CommonUtilsConfig, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, LeafletControlsLocationSelector, CommonControlsIsoDOM, LeafletControlsIsocurve, CommonControlsMousePositionDOM, proj4, proj4leaflet07x, proj4leaflet10x, LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326, LeafletCRSCRS, LeafletControlsMousePosition, CommonControlsReverseGeocodingDOM, LeafletControlsReverseGeocoding, CommonControlsRouteDOM, LeafletControlsRoute, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils, LeafletControlsSearchEngine, CommonControlsElevationPathDOM, LeafletControlsElevationPath, LeafletControlsLogo, LeafletControlsControls, CommonUtilsLayerUtils, LeafletLayersLayerConfig, LeafletLayersLayerEvent, LeafletLayersWMS, LeafletLayersWMTS, LeafletLayersLayers, LeafletGpPluginLeaflet; +(function (root, factory) { + if (true) { + gp = function () { + return typeof factory === 'function' ? factory() : factory; + }(); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.Gp = factory(); + } +}(this, function () { + var log4js, loggerCfg, UtilsLoggerByDefault, UtilsHelper, promise, ProtocolsXHR, UtilsMessagesResources, ExceptionsErrorService, ProtocolsJSONP, ProtocolsProtocol, ServicesDefaultUrlService, ServicesCommonService, ServicesAltiRequestModelAltiRequest, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest, ServicesAltiRequestAltiRequestREST, FormatsWPS, ServicesAltiRequestAltiRequestWPS, ServicesAltiRequestAltiRequestFactory, FormatsXML, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseAltiResponseFactory, ServicesAltiAlti, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfFormatsAutoConfResponseReader, ServicesAutoConfResponseAutoConfResponseFactory, ServicesAutoConfAutoConf, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService, FormatsXLS, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityService, ServicesGeocodeRequestGeocodeLocation, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeFormatsDirectGeocodeResponseReader, ServicesGeocodeResponseDirectGeocodeResponseFactory, ServicesGeocodeGeocode, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesGeocodeFormatsReverseGeocodeResponseReader, ServicesGeocodeResponseReverseGeocodeResponseFactory, ServicesGeocodeReverseGeocode, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoCompleteResponseAutoCompleteResponseFactory, ServicesAutoCompleteAutoComplete, FormatsXLSRouteServiceModelRoutePlan, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension, FormatsXLSRouteService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestModelRouteParamREST, ServicesRouteRequestRouteRequestREST, ServicesRouteRequestRouteRequestFactory, FormatsWKT, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseRouteResponseFactory, ServicesRouteRoute, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory, ServicesProcessIsoCurveProcessIsoCurve, ServicesServices, Gp; + log4js = undefined; + loggerCfg = { + loggers: [{ + root: true, + level: 'all', + appenders: [{ + type: 'Console', + layout: { + type: 'PatternLayout', + pattern: '%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n' + } + }] + }] + }; + UtilsLoggerByDefault = function (Log4js, Config) { + var LoggerByDefault = { + getLogger: function (name) { + Log4js.load(Config, function (error) { + if (error) { + throw error; + } + }); + var logname = name || 'default'; + return Log4js.getLogger(logname); + } + }; + return LoggerByDefault; + }(log4js, loggerCfg); + UtilsHelper = function () { + var Helper = { + normalyzeParameters: function (params) { + var myParams = null; + if (params) { + var tabParams = []; + for (var key in params) { + if (params.hasOwnProperty(key)) { + var value = params[key]; + if (!value) { + value = ''; + } + tabParams.push(key + '=' + value); + } + } + myParams = tabParams.join('&'); + } + return myParams; + }, + normalyzeUrl: function (url, params, encode) { + var myUrl = url; + if (url) { + var k = url.indexOf('?'); + if (k === -1) { + myUrl += '?'; + } + if (k !== -1 && k !== url.length - 1) { + myUrl += '&'; + } + } + if (params) { + if (typeof params === 'string') { + myUrl += params; + } else { + myUrl += this.normalyzeParameters(params); + } + } + if (encode) { + myUrl = encodeURIComponent(myUrl); + } + return myUrl; + }, + indent: function (n, msg) { + var num = n || 0; + return new Array(num + 1).join('\t') + msg; + } + }; + return Helper; + }(); + (function () { + 'use strict'; + function lib$es6$promise$utils$$objectOrFunction(x) { + return typeof x === 'function' || typeof x === 'object' && x !== null; + } + function lib$es6$promise$utils$$isFunction(x) { + return typeof x === 'function'; + } + function lib$es6$promise$utils$$isMaybeThenable(x) { + return typeof x === 'object' && x !== null; + } + var lib$es6$promise$utils$$_isArray; + if (!Array.isArray) { + lib$es6$promise$utils$$_isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; + } else { + lib$es6$promise$utils$$_isArray = Array.isArray; + } + var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray; + var lib$es6$promise$asap$$len = 0; + var lib$es6$promise$asap$$toString = {}.toString; + var lib$es6$promise$asap$$vertxNext; + var lib$es6$promise$asap$$customSchedulerFn; + var lib$es6$promise$asap$$asap = function asap(callback, arg) { + lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback; + lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg; + lib$es6$promise$asap$$len += 2; + if (lib$es6$promise$asap$$len === 2) { + if (lib$es6$promise$asap$$customSchedulerFn) { + lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush); + } else { + lib$es6$promise$asap$$scheduleFlush(); + } + } + }; + function lib$es6$promise$asap$$setScheduler(scheduleFn) { + lib$es6$promise$asap$$customSchedulerFn = scheduleFn; + } + function lib$es6$promise$asap$$setAsap(asapFn) { + lib$es6$promise$asap$$asap = asapFn; + } + var lib$es6$promise$asap$$browserWindow = typeof window !== 'undefined' ? window : undefined; + var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; + var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; + var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + function lib$es6$promise$asap$$useNextTick() { + return function () { + process.nextTick(lib$es6$promise$asap$$flush); + }; + } + function lib$es6$promise$asap$$useVertxTimer() { + return function () { + lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush); + }; + } + function lib$es6$promise$asap$$useMutationObserver() { + var iterations = 0; + var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + return function () { + node.data = iterations = ++iterations % 2; + }; + } + function lib$es6$promise$asap$$useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = lib$es6$promise$asap$$flush; + return function () { + channel.port2.postMessage(0); + }; + } + function lib$es6$promise$asap$$useSetTimeout() { + return function () { + setTimeout(lib$es6$promise$asap$$flush, 1); + }; + } + var lib$es6$promise$asap$$queue = new Array(1000); + function lib$es6$promise$asap$$flush() { + for (var i = 0; i < lib$es6$promise$asap$$len; i += 2) { + var callback = lib$es6$promise$asap$$queue[i]; + var arg = lib$es6$promise$asap$$queue[i + 1]; + callback(arg); + lib$es6$promise$asap$$queue[i] = undefined; + lib$es6$promise$asap$$queue[i + 1] = undefined; + } + lib$es6$promise$asap$$len = 0; + } + function lib$es6$promise$asap$$attemptVertx() { + try { + var r = require; + var vertx = r('vertx'); + lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext; + return lib$es6$promise$asap$$useVertxTimer(); + } catch (e) { + return lib$es6$promise$asap$$useSetTimeout(); + } + } + var lib$es6$promise$asap$$scheduleFlush; + if (lib$es6$promise$asap$$isNode) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick(); + } else if (lib$es6$promise$asap$$BrowserMutationObserver) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver(); + } else if (lib$es6$promise$asap$$isWorker) { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel(); + } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx(); + } else { + lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout(); + } + function lib$es6$promise$$internal$$noop() { + } + var lib$es6$promise$$internal$$PENDING = void 0; + var lib$es6$promise$$internal$$FULFILLED = 1; + var lib$es6$promise$$internal$$REJECTED = 2; + var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + function lib$es6$promise$$internal$$selfFulfillment() { + return new TypeError('You cannot resolve a promise with itself'); + } + function lib$es6$promise$$internal$$cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); + } + function lib$es6$promise$$internal$$getThen(promise) { + try { + return promise.then; + } catch (error) { + lib$es6$promise$$internal$$GET_THEN_ERROR.error = error; + return lib$es6$promise$$internal$$GET_THEN_ERROR; + } + } + function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { + try { + then.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } + } + function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) { + lib$es6$promise$asap$$asap(function (promise) { + var sealed = false; + var error = lib$es6$promise$$internal$$tryThen(then, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + lib$es6$promise$$internal$$resolve(promise, value); + } else { + lib$es6$promise$$internal$$fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + lib$es6$promise$$internal$$reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + if (!sealed && error) { + sealed = true; + lib$es6$promise$$internal$$reject(promise, error); + } + }, promise); + } + function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) { + if (thenable._state === lib$es6$promise$$internal$$FULFILLED) { + lib$es6$promise$$internal$$fulfill(promise, thenable._result); + } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, thenable._result); + } else { + lib$es6$promise$$internal$$subscribe(thenable, undefined, function (value) { + lib$es6$promise$$internal$$resolve(promise, value); + }, function (reason) { + lib$es6$promise$$internal$$reject(promise, reason); + }); + } + } + function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) { + if (maybeThenable.constructor === promise.constructor) { + lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable); + } else { + var then = lib$es6$promise$$internal$$getThen(maybeThenable); + if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error); + } else if (then === undefined) { + lib$es6$promise$$internal$$fulfill(promise, maybeThenable); + } else if (lib$es6$promise$utils$$isFunction(then)) { + lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then); + } else { + lib$es6$promise$$internal$$fulfill(promise, maybeThenable); + } + } + } + function lib$es6$promise$$internal$$resolve(promise, value) { + if (promise === value) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment()); + } else if (lib$es6$promise$utils$$objectOrFunction(value)) { + lib$es6$promise$$internal$$handleMaybeThenable(promise, value); + } else { + lib$es6$promise$$internal$$fulfill(promise, value); + } + } + function lib$es6$promise$$internal$$publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + lib$es6$promise$$internal$$publish(promise); + } + function lib$es6$promise$$internal$$fulfill(promise, value) { + if (promise._state !== lib$es6$promise$$internal$$PENDING) { + return; + } + promise._result = value; + promise._state = lib$es6$promise$$internal$$FULFILLED; + if (promise._subscribers.length !== 0) { + lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise); + } + } + function lib$es6$promise$$internal$$reject(promise, reason) { + if (promise._state !== lib$es6$promise$$internal$$PENDING) { + return; + } + promise._state = lib$es6$promise$$internal$$REJECTED; + promise._result = reason; + lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise); + } + function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) { + var subscribers = parent._subscribers; + var length = subscribers.length; + parent._onerror = null; + subscribers[length] = child; + subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment; + subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection; + if (length === 0 && parent._state) { + lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent); + } + } + function lib$es6$promise$$internal$$publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + if (subscribers.length === 0) { + return; + } + var child, callback, detail = promise._result; + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + if (child) { + lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + promise._subscribers.length = 0; + } + function lib$es6$promise$$internal$$ErrorObject() { + this.error = null; + } + var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject(); + function lib$es6$promise$$internal$$tryCatch(callback, detail) { + try { + return callback(detail); + } catch (e) { + lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e; + return lib$es6$promise$$internal$$TRY_CATCH_ERROR; + } + } + function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) { + var hasCallback = lib$es6$promise$utils$$isFunction(callback), value, error, succeeded, failed; + if (hasCallback) { + value = lib$es6$promise$$internal$$tryCatch(callback, detail); + if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value = null; + } else { + succeeded = true; + } + if (promise === value) { + lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn()); + return; + } + } else { + value = detail; + succeeded = true; + } + if (promise._state !== lib$es6$promise$$internal$$PENDING) { + } else if (hasCallback && succeeded) { + lib$es6$promise$$internal$$resolve(promise, value); + } else if (failed) { + lib$es6$promise$$internal$$reject(promise, error); + } else if (settled === lib$es6$promise$$internal$$FULFILLED) { + lib$es6$promise$$internal$$fulfill(promise, value); + } else if (settled === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, value); + } + } + function lib$es6$promise$$internal$$initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + lib$es6$promise$$internal$$resolve(promise, value); + }, function rejectPromise(reason) { + lib$es6$promise$$internal$$reject(promise, reason); + }); + } catch (e) { + lib$es6$promise$$internal$$reject(promise, e); + } + } + function lib$es6$promise$enumerator$$Enumerator(Constructor, input) { + var enumerator = this; + enumerator._instanceConstructor = Constructor; + enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop); + if (enumerator._validateInput(input)) { + enumerator._input = input; + enumerator.length = input.length; + enumerator._remaining = input.length; + enumerator._init(); + if (enumerator.length === 0) { + lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); + } else { + enumerator.length = enumerator.length || 0; + enumerator._enumerate(); + if (enumerator._remaining === 0) { + lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result); + } + } + } else { + lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError()); + } + } + lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function (input) { + return lib$es6$promise$utils$$isArray(input); + }; + lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function () { + return new Error('Array Methods must be provided an Array'); + }; + lib$es6$promise$enumerator$$Enumerator.prototype._init = function () { + this._result = new Array(this.length); + }; + var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator; + lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function () { + var enumerator = this; + var length = enumerator.length; + var promise = enumerator.promise; + var input = enumerator._input; + for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { + enumerator._eachEntry(input[i], i); + } + }; + lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function (entry, i) { + var enumerator = this; + var c = enumerator._instanceConstructor; + if (lib$es6$promise$utils$$isMaybeThenable(entry)) { + if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) { + entry._onerror = null; + enumerator._settledAt(entry._state, i, entry._result); + } else { + enumerator._willSettleAt(c.resolve(entry), i); + } + } else { + enumerator._remaining--; + enumerator._result[i] = entry; + } + }; + lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function (state, i, value) { + var enumerator = this; + var promise = enumerator.promise; + if (promise._state === lib$es6$promise$$internal$$PENDING) { + enumerator._remaining--; + if (state === lib$es6$promise$$internal$$REJECTED) { + lib$es6$promise$$internal$$reject(promise, value); + } else { + enumerator._result[i] = value; + } + } + if (enumerator._remaining === 0) { + lib$es6$promise$$internal$$fulfill(promise, enumerator._result); + } + }; + lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function (promise, i) { + var enumerator = this; + lib$es6$promise$$internal$$subscribe(promise, undefined, function (value) { + enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value); + }, function (reason) { + enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason); + }); + }; + function lib$es6$promise$promise$all$$all(entries) { + return new lib$es6$promise$enumerator$$default(this, entries).promise; + } + var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all; + function lib$es6$promise$promise$race$$race(entries) { + var Constructor = this; + var promise = new Constructor(lib$es6$promise$$internal$$noop); + if (!lib$es6$promise$utils$$isArray(entries)) { + lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.')); + return promise; + } + var length = entries.length; + function onFulfillment(value) { + lib$es6$promise$$internal$$resolve(promise, value); + } + function onRejection(reason) { + lib$es6$promise$$internal$$reject(promise, reason); + } + for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { + lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); + } + return promise; + } + var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; + function lib$es6$promise$promise$resolve$$resolve(object) { + var Constructor = this; + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + var promise = new Constructor(lib$es6$promise$$internal$$noop); + lib$es6$promise$$internal$$resolve(promise, object); + return promise; + } + var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; + function lib$es6$promise$promise$reject$$reject(reason) { + var Constructor = this; + var promise = new Constructor(lib$es6$promise$$internal$$noop); + lib$es6$promise$$internal$$reject(promise, reason); + return promise; + } + var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; + var lib$es6$promise$promise$$counter = 0; + function lib$es6$promise$promise$$needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); + } + function lib$es6$promise$promise$$needsNew() { + throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.'); + } + var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise; + function lib$es6$promise$promise$$Promise(resolver) { + this._id = lib$es6$promise$promise$$counter++; + this._state = undefined; + this._result = undefined; + this._subscribers = []; + if (lib$es6$promise$$internal$$noop !== resolver) { + if (!lib$es6$promise$utils$$isFunction(resolver)) { + lib$es6$promise$promise$$needsResolver(); + } + if (!(this instanceof lib$es6$promise$promise$$Promise)) { + lib$es6$promise$promise$$needsNew(); + } + lib$es6$promise$$internal$$initializePromise(this, resolver); + } + } + lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default; + lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default; + lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default; + lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default; + lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler; + lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap; + lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap; + lib$es6$promise$promise$$Promise.prototype = { + constructor: lib$es6$promise$promise$$Promise, + then: function (onFulfillment, onRejection) { + var parent = this; + var state = parent._state; + if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) { + return this; + } + var child = new this.constructor(lib$es6$promise$$internal$$noop); + var result = parent._result; + if (state) { + var callback = arguments[state - 1]; + lib$es6$promise$asap$$asap(function () { + lib$es6$promise$$internal$$invokeCallback(state, child, callback, result); + }); + } else { + lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); + } + return child; + }, + 'catch': function (onRejection) { + return this.then(null, onRejection); + } + }; + function lib$es6$promise$polyfill$$polyfill() { + var local; + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + var P = local.Promise; + if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) { + return; + } + local.Promise = lib$es6$promise$promise$$default; + } + var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill; + var lib$es6$promise$umd$$ES6Promise = { + 'Promise': lib$es6$promise$promise$$default, + 'polyfill': lib$es6$promise$polyfill$$default + }; + if (true) { + promise = function () { + return lib$es6$promise$umd$$ES6Promise; + }(); + } else if (typeof module !== 'undefined' && module['exports']) { + module['exports'] = lib$es6$promise$umd$$ES6Promise; + } else if (typeof this !== 'undefined') { + this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise; + } + lib$es6$promise$polyfill$$default(); + }.call(this)); + ProtocolsXHR = function (Logger, Helper, ES6Promise) { + var XHR = { + call: function (settings) { + ES6Promise.polyfill(); + if (!settings.url) { + throw new Error('missing parameter : url is not defined !'); + } + if (!settings.method) { + throw new Error('missing parameter : method is not defined !'); + } + if (!settings.format) { + settings.format = 'text'; + } + var options = {}; + options.url = settings.url; + options.data = settings.data ? settings.data : null; + options.method = settings.method; + options.timeOut = settings.timeOut || 0; + options.scope = settings.scope || this; + switch (settings.method) { + case 'DELETE': + case 'GET': + break; + case 'PUT': + case 'POST': + options.content = settings.content ? settings.content : 'application/x-www-form-urlencoded'; + options.headers = settings.headers ? settings.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 (settings.format) { + case 'text': + this.__call(options).then(function (response) { + settings.onResponse.call(this, response); + }).catch(function (error) { + settings.onFailure.call(this, error); + }); + break; + case 'json': + this.__callJSON(options).then(function (response) { + settings.onResponse.call(this, response); + }).catch(function (error) { + settings.onFailure.call(this, error); + }); + break; + case 'xml': + this.__callXML(options).then(function (response) { + settings.onResponse.call(this, response); + }).catch(function (error) { + settings.onFailure.call(this, error); + }); + break; + default: + throw new Error('This output Format is not yet supported !'); + } + }, + __call: function (options) { + var promise = new Promise(function (resolve, reject) { + var corps = options.method === 'POST' || options.method === 'PUT' ? true : false; + if (options.data && !corps) { + options.url = Helper.normalyzeUrl(options.url, options.data); + } + var hXHR = null; + if (window.XMLHttpRequest) { + hXHR = new XMLHttpRequest(); + hXHR.open(options.method, options.url, true); + hXHR.overrideMimeType = options.content; + var onTimeOutTrigger = null; + if (options.timeOut > 0) { + onTimeOutTrigger = window.setTimeout(function () { + var message = 'TimeOut Occured on Http Request with XMLHttpRequest !'; + reject({ + message: message, + status: -1 + }); + }, options.timeOut); + } + if (corps) { + hXHR.setRequestHeader('Content-type', options.content); + } + hXHR.onerror = function (e) { + console.log(e); + reject(new Error('Errors Occured on Http Request with XMLHttpRequest !')); + }; + hXHR.ontimeout = function () { + reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !')); + }; + hXHR.onreadystatechange = function () { + if (hXHR.readyState == 4) { + if (hXHR.status == 200) { + window.clearTimeout(onTimeOutTrigger); + resolve(hXHR.response); + } else { + var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.response + '\')'; + var status = hXHR.status; + reject({ + message: message, + status: status + }); + } + } + }; + var data4xhr = options.data && corps ? options.data : null; + hXHR.send(data4xhr); + } else if (window.XDomainRequest) { + hXHR = new XDomainRequest(); + hXHR.open(options.method, options.url); + hXHR.overrideMimeType = options.content; + if (options.timeOut > 0) { + hXHR.timeout = options.timeout; + } + if (corps) { + hXHR.setRequestHeader('Content-type', options.content); + } + hXHR.onerror = function () { + reject(new Error('Errors Occured on Http Request with XMLHttpRequest !')); + }; + hXHR.ontimeout = function () { + reject(new Error('TimeOut Occured on Http Request with XMLHttpRequest !')); + }; + hXHR.onload = function () { + if (hXHR.status == 200) { + resolve(hXHR.responseText); + } else { + var message = 'Errors Occured on Http Request (status : \'' + hXHR.status + '\' | response : \'' + hXHR.responseText + '\')'; + var status = hXHR.status; + reject({ + message: message, + status: status + }); + } + }; + var data4xdr = options.data && corps ? options.data : null; + hXHR.send(data4xdr); + } else { + throw new Error('CORS not supported'); + } + }); + return promise; + }, + __callJSON: function (options) { + return this.__call(options).then(JSON.parse).catch(function (error) { + console.log('_callJSON failed on : ', options.url, error); + throw error; + }); + }, + __callXML: function (options) { + return this.__call(options).then(function (response) { + var xmlDoc; + if (window.DOMParser) { + var parser = new DOMParser(); + xmlDoc = parser.parseFromString(response, 'text/xml'); + } else { + xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); + xmlDoc.async = false; + xmlDoc.loadXML(response); + } + return xmlDoc; + }).catch(function (error) { + console.log('__callXML failed on : ', options.url, error); + throw error; + }); + } + }; + return XHR; + }(UtilsLoggerByDefault, UtilsHelper, promise); + UtilsMessagesResources = function () { + var MessagesResources = { + PARAM_MISSING: 'Parameter(s) \'%var%\' missing', + PARAM_EMPTY: 'Parameter(s) \'%var%\' empty', + PARAM_TYPE: 'Wrong type(s) for parameter(s) \'%var%\'', + PARAM_FORMAT: 'Parameter(s) \'%var%\' not correctly formatted', + PARAM_NOT_SUPPORT: 'Value(s) for parameter(s) \'%var%\' not supported', + PARAM_UNKNOWN: 'Value(s) for parameter(s) \'%var%\' unknown', + SERVICE_REQUEST_BUILD: 'An error occurred during the request building of the service', + SERVICE_REQUEST_EMPTY: 'The request sent to the service is empty', + SERVICE_RESPONSE_EXCEPTION: 'The service returned an exception : \'%var%\'', + SERVICE_RESPONSE_EXCEPTION_2: 'The service returned an exception', + SERVICE_RESPONSE_ANALYSE: 'An error occurred while parsing the response \'%var%\' of the service', + SERVICE_RESPONSE_ANALYSE_2: 'An unknown error occurred while parsing the response', + SERVICE_RESPONSE_EMPTY: 'The response of the service is empty', + SERVICE_RESPONSE_EMPTY_2: 'The response from the service could not be analyzed or is empty', + SERVICE_RESPONSE_FORMAT: 'The format of the service response is not supported (handled format(s) : \'%var%\')', + SERVICE_RESPONSE_FORMAT_2: 'The format of the service response is not supported', + SERVICE_RESPONSE_FORMAT_3: 'No suggestion matching the search', + CLASS_CONSTRUCTOR: '\'%var%\' constructor cannot be called as a function.', + getMessage: function (clef, parametres) { + if (!arguments) { + return 'Message indefined !'; + } + var params = Array.prototype.slice.call(arguments); + var key = params.shift(); + var args = params; + var message = this[key]; + try { + if (Array.isArray(args) && args.length > 0) { + message = message.replace('%var%', args.join(' - ')); + } else { + message = message.replace('%var%', '%var% (not specified)'); + } + } catch (e) { + } + return message; + } + }; + return MessagesResources; + }(); + ExceptionsErrorService = function () { + function ErrorService(error) { + if (!(this instanceof ErrorService)) { + throw new TypeError('ErrorService constructor cannot be called as a function.'); + } + var e = error; + if (typeof error === 'string' || error instanceof String) { + this.message = error; + this.status = -1; + this.type = ErrorService.TYPE_UNKERR; + } else { + this.message = e.message || 'undefined!?'; + this.type = e.type; + this.status = e.status || -1; + } + this.name = 'ErrorService'; + this.stack = new Error().stack; + } + ErrorService.TYPE_SRVERR = 'SERVICE_ERROR'; + ErrorService.TYPE_USEERR = 'USAGE_ERROR'; + ErrorService.TYPE_UNKERR = 'UNKNOWN_ERROR'; + ErrorService.prototype = Object.create(Error.prototype, { + constructor: { + value: ErrorService, + writable: true, + configurable: true + } + }); + return ErrorService; + }(); + ProtocolsJSONP = function (Logger) { + var JSONP = { + uuid: function () { + var id = Math.floor(Date.now()); + return function () { + return id++; + }; + }(), + call: function (options) { + if (!options) { + throw new Error('missing parameter : options !'); + } + if (!options.url) { + throw new Error('missing parameter : options.url !'); + } + if (!options.timeOut) { + options.timeOut = 0; + } + if (!options.onResponse) { + throw new Error('missing parameter : options.onResponse !'); + } + var callbackId = typeof options.callbackSuffix === 'string' ? options.callbackSuffix : this.uuid(); + var urlHasCallbackKey = false; + var urlHasCallbackName = false; + var idx = options.url.indexOf('callback='); + if (idx != -1) { + urlHasCallbackKey = true; + var j = options.url.indexOf('&', idx); + if (j === -1) { + j = options.url.length; + } + var callbackName = options.url.substring(idx + 9, j); + if (callbackName) { + urlHasCallbackName = true; + options.callbackName = callbackName; + } + } + if (!urlHasCallbackKey) { + var k = options.url.indexOf('?'); + if (k === -1) { + options.url = options.url + '?' + 'callback='; + } else if (k === options.url.length) { + options.url = options.url + 'callback='; + } else { + options.url = options.url + '&' + 'callback='; + } + } + var HasCallbackName = options.callbackName ? true : urlHasCallbackName; + if (!urlHasCallbackName) { + if (!options.callbackName) { + options.callbackName = 'callback'; + if (callbackId || callbackId === '') { + options.callbackName += callbackId; + } + } + options.url = options.url.replace('callback=', 'callback=' + options.callbackName); + } + if (!options.onTimeOut) { + options.onTimeOut = function () { + console.log('TimeOut while invoking url : ' + options.url); + }; + } + if (!HasCallbackName) { + var self = this; + var onTimeOutTrigger = null; + if (options.timeOut > 0) { + onTimeOutTrigger = window.setTimeout(function () { + window[options.callbackName] = function () { + }; + options.onTimeOut(); + self._deleteScript(callbackId); + }, options.timeOut); + } + window[options.callbackName] = function (data) { + window.clearTimeout(onTimeOutTrigger); + options.onResponse(data); + self._deleteScript(callbackId); + }; + } + this._createScript(callbackId, options.url); + }, + _createScript: function (callbackId, url) { + var scriptu; + var scripto = document.getElementById('results' + callbackId); + scriptu = document.createElement('script'); + scriptu.setAttribute('type', 'text/javascript'); + scriptu.setAttribute('src', url); + scriptu.setAttribute('charset', 'UTF-8'); + scriptu.setAttribute('id', 'results' + callbackId); + scriptu.setAttribute('async', 'true'); + var node = document.documentElement || document.getElementsByTagName('head')[0]; + if (scripto === null) { + node.appendChild(scriptu); + } else { + node.replaceChild(scriptu, scripto); + } + }, + _deleteScript: function (callbackId) { + var script = document.getElementById('results' + callbackId); + if (script) { + var node = script.parentNode || document.documentElement; + if (!node) { + return; + } + node.removeChild(script); + } + } + }; + return JSONP; + }(UtilsLoggerByDefault); + ProtocolsProtocol = function (Helper, XHR, JSONP) { + var Protocol = { + send: function (options) { + var settings = options || { + method: 'GET', + protocol: 'JSONP', + timeOut: 0, + format: null, + wrap: true, + nocache: true, + output: 'json', + callback: null, + callbackSuffix: null + }; + if (options.protocol === 'XHR' || options.format === 'json') { + settings.wrap = false; + } else if (options.protocol === 'JSONP' && options.format === 'xml') { + settings.wrap = true; + } + settings.callback = options.protocol == 'JSONP' ? null : null; + settings.output = settings.wrap ? 'json' : null; + if (settings.wrap) { + var params = {}; + params.output = settings.output; + params.callback = settings.callback; + delete params.callback; + settings.url = Helper.normalyzeUrl(options.url, params); + } + switch (settings.protocol) { + case 'XHR': + if (options.method === 'GET' && options.nocache) { + settings.url = Helper.normalyzeUrl(settings.url, { t: new Date().getTime() }); + } + XHR.call(settings); + break; + case 'JSONP': + if (settings.data) { + settings.url = Helper.normalyzeUrl(settings.url, settings.data); + } + JSONP.call(settings); + break; + default: + throw new Error('protocol not supported (XHR|JSONP) !'); + } + } + }; + return Protocol; + }(UtilsHelper, ProtocolsXHR, ProtocolsJSONP); + ServicesDefaultUrlService = function () { + var protocol = location && location.protocol && location.protocol.indexOf('https:') === 0 ? 'https://' : 'http://'; + var hostname = 'wxs.ign.fr'; + var keyname = '%KEY%'; + var url = protocol + hostname.concat('/', keyname); + var fkey = function (key) { + return this._key.replace(key ? keyname : null, key); + }; + var DefaultUrlService = { + Alti: { + _key: { + 'elevation-json': url + '/alti/rest/elevation.json', + 'elevation-xml': url + '/alti/rest/elevation.xml', + 'profil-json': url + '/alti/rest/elevationLine.json', + 'profil-xml': url + '/alti/rest/elevationLine.xml', + wps: url + '/alti/wps' + }, + url: function (key) { + return { + 'elevation-json': this._key['elevation-json'].replace(key ? keyname : null, key), + 'elevation-xml': this._key['elevation-xml'].replace(key ? keyname : null, key), + 'profil-json': this._key['profil-json'].replace(key ? keyname : null, key), + 'profil-xml': this._key['profil-xml'].replace(key ? keyname : null, key), + wps: this._key.wps.replace(key ? keyname : null, key) + }; + } + }, + ProcessIsoCurve: { + _key: { + 'iso-json': url + '/isochrone/isochrone.json', + 'iso-xml': url + '/isochrone/isochrone.xml' + }, + url: function (key) { + return { + 'iso-json': this._key['iso-json'].replace(key ? keyname : null, key), + 'iso-xml': this._key['iso-xml'].replace(key ? keyname : null, key) + }; + } + }, + AutoComplete: { + _key: url + '/ols/apis/completion', + url: fkey + }, + ReverseGeocode: { + _key: url + '/geoportail/ols', + url: fkey + }, + AutoConf: { + _key: { + apiKey: url + '/autoconf', + apiKeys: url + '/autoconf?keys=%KEYS%' + }, + url: function (key) { + var keys = ''; + if (Array.isArray(key) && key.length > 0) { + keys = key[0]; + for (var i = 1; i < key.length; i++) { + keys += ',' + key[i]; + } + } + return { + apiKey: this._key['apiKey'].replace(key ? keyname : null, key), + apiKeys: this._key['apiKeys'].replace(keyname, key[0]).replace('%KEYS%', keys), + aggregate: protocol + hostname.concat('/') + key + '/autoconf/id/' + }; + } + }, + Geocode: { + _key: url + '/geoportail/ols', + url: fkey + }, + Route: { + _key: { + ols: url + '/itineraire/ols', + 'route-json': url + '/itineraire/rest/route.json', + 'route-xml': url + '/itineraire/rest/route.xml' + }, + url: function (key) { + return { + ols: this._key.ols.replace(key ? keyname : null, key), + 'route-json': this._key['route-json'].replace(key ? keyname : null, key), + 'route-xml': this._key['route-xml'].replace(key ? keyname : null, key) + }; + } + } + }; + return DefaultUrlService; + }(); + ServicesCommonService = function (Logger, Helper, _, Protocol, ErrorService, DefaultUrlService) { + function CommonService(options) { + if (!(this instanceof CommonService)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR')); + } + this.options = { + protocol: 'JSONP', + proxyURL: '', + callbackSuffix: null, + httpMethod: 'GET', + timeOut: 0, + rawResponse: false, + scope: this, + onSuccess: function (response) { + console.log('onSuccess - la reponse est la suivante : ', response); + }, + onFailure: function (error) { + if (error.status === 200 || !error.status) { + console.log('onFailure : ', error.message); + } else { + console.log('onFailure - Erreur (', error.status, ') : ', error.message); + } + } + }; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + if (!this.options.apiKey && !this.options.serverUrl) { + throw new Error(_.getMessage('PARAM_MISSING', 'apiKey', 'serverUrl')); + } + if (this.options.rawResponse && !this.options.onSuccess) { + this.options.onSuccess = function (response) { + console.log('onSuccess - la réponse brute du service est la suivante : ', response); + }; + } + var bOnSuccess = this.options.onSuccess !== null && typeof this.options.onSuccess === 'function' ? true : false; + if (!bOnSuccess) { + throw new Error(_.getMessage('PARAM_MISSING', 'onSuccess()')); + } + if (!this.options.serverUrl) { + var urlByDefault = DefaultUrlService[this.CLASSNAME].url(this.options.apiKey); + if (typeof urlByDefault === 'string') { + this.options.serverUrl = urlByDefault; + } else { + } + } + if (this.options.serverUrl) { + var urlsource = this.options.serverUrl; + var urlparts = urlsource.split('?'); + this.options.serverUrl = urlparts[0]; + } + this.options.httpMethod = typeof options.httpMethod === 'string' ? options.httpMethod.toUpperCase() : 'GET'; + switch (this.options.httpMethod) { + case 'POST': + case 'GET': + break; + case 'PUT': + case 'DELETE': + case 'HEAD': + case 'OPTIONS': + throw new Error(_.getMessage('PARAM_NOT_SUPPORT', 'httpMethod')); + default: + throw new Error(_.getMessage('PARAM_UNKNOWN', 'httpMethod')); + } + this.options.protocol = typeof options.protocol === 'string' ? options.protocol.toUpperCase() : 'JSONP'; + switch (this.options.protocol) { + case 'JSONP': + case 'XHR': + break; + default: + throw new Error(_.getMessage('PARAM_UNKNOWN', 'protocol')); + } + if (this.options.protocol === 'JSONP') { + this.options.httpMethod = 'GET'; + } + this.options.nocache = options.nocache || false; + this.options.outputFormat = null; + this.request = null; + this.response = null; + } + CommonService.prototype = { + constructor: CommonService, + call: function () { + function run() { + this.buildRequest.call(this, onError, onBuildRequest); + } + run.call(this); + function onBuildRequest(result) { + this.callService.call(this, onError, onCallService); + } + function onCallService(result) { + this.analyzeResponse.call(this, onError, onAnalyzeResponse); + } + function onAnalyzeResponse(result) { + if (result) { + this.options.onSuccess.call(this, result); + } else { + return onError.call(this, new ErrorService('Analyse de la reponse en échec !?')); + } + } + function onError(error) { + var e = error; + if (!(e instanceof ErrorService)) { + e = new ErrorService(error.message); + } + this.options.onFailure.call(this, e); + } + }, + buildRequest: function (error, success) { + }, + callService: function (error, success) { + var strUrlProxified = null; + var strData = this.request; + var bUrlProxified = this.options.proxyURL && this.options.protocol === 'XHR' ? true : false; + this.options.serverUrl = Helper.normalyzeUrl(this.options.serverUrl, { 'gp-access-lib': '1.0.0-beta3' }, false); + if (bUrlProxified) { + if (this.options.httpMethod === 'GET') { + strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, this.request, true); + strData = null; + } + if (this.options.httpMethod === 'POST') { + strUrlProxified = this.options.proxyURL + Helper.normalyzeUrl(this.options.serverUrl, null, true); + strData = this.request; + } + } + var self = this; + var options = { + url: strUrlProxified || this.options.serverUrl, + method: this.options.httpMethod, + protocol: this.options.protocol, + timeOut: this.options.timeOut || 0, + format: this.options.outputFormat, + nocache: this.options.nocache || false, + wrap: this.options.protocol === 'XHR' ? false : true, + callbackSuffix: this.options.callbackSuffix, + data: strData, + headers: null, + content: this.options.contentType || 'application/xml', + scope: this.options.scope || this, + onResponse: function (response) { + var content = null; + if (self.options.protocol == 'XHR') { + content = response; + } + if (self.options.protocol == 'JSONP') { + if (response) { + if (response.http) { + if (response.http.status !== 200) { + error.call(self, new ErrorService({ + status: response.http.status, + message: response.http.error, + type: ErrorService.TYPE_SRVERR + })); + return; + } else { + content = response.xml; + } + } else { + content = response; + } + } else { + error.call(self, new ErrorService('Le contenu de la reponse est vide !?')); + return; + } + } + self.response = content; + success.call(self, content); + }, + onFailure: function (e) { + e.type = ErrorService.TYPE_SRVERR; + error.call(self, new ErrorService(e)); + }, + onTimeOut: function () { + error.call(self, new ErrorService('TimeOut!')); + } + }; + Protocol.send(options); + }, + analyzeResponse: function (error, success) { + } + }; + return CommonService; + }(UtilsLoggerByDefault, UtilsHelper, UtilsMessagesResources, ProtocolsProtocol, ExceptionsErrorService, ServicesDefaultUrlService); + ServicesAltiRequestModelAltiRequest = function (Logger) { + function AltiRequest(options) { + if (!(this instanceof AltiRequest)) { + throw new TypeError('AltiRequest constructor cannot be called as a function.'); + } + this.options = options || {}; + this.positions = this.options.positions || []; + this.delimiter = this.options.delimiter || '|'; + this.indent = this.options.indent || false; + this.crs = this.options.crs || 'CRS:84'; + this.format = this.options.format || 'json'; + } + AltiRequest.CLASSNAME = 'AltiRequest'; + AltiRequest.prototype = { + constructor: AltiRequest, + setPositions: function (lstPosition) { + var positions = []; + for (var i = 0; i < lstPosition.length; i++) { + var o = lstPosition[i]; + if (o.lon && o.lat) { + positions.push(o); + } + } + this.positions = positions; + }, + getPositions: function (pos) { + if (!pos) { + return this.positions; + } + var index = this.positions.length - 1; + if (pos > index || pos < index) { + return this.positions; + } + return this.positions[pos]; + }, + addPositions: function (lstPosition) { + for (var i = 0; i < lstPosition.length; i++) { + var o = lstPosition[i]; + if (o.lon && o.lat) { + this.positions.push(lstPosition[i]); + } + } + }, + getLon: function () { + var lstLon = []; + for (var i = 0; i < this.positions.length; i++) { + lstLon.push(this.positions[i].lon); + } + return lstLon.join(this.delimiter); + }, + getLat: function () { + var lstLat = []; + for (var i = 0; i < this.positions.length; i++) { + lstLat.push(this.positions[i].lat); + } + return lstLat.join(this.delimiter); + } + }; + AltiRequest.prototype.getData = function () { + var map = []; + map.push({ + k: 'lon', + v: this.getLon() + }); + map.push({ + k: 'lat', + v: this.getLat() + }); + map.push({ + k: 'delimiter', + v: this.delimiter + }); + map.push({ + k: 'indent', + v: this.indent + }); + map.push({ + k: 'crs', + v: this.crs + }); + map.push({ + k: 'format', + v: this.format + }); + return map; + }; + return AltiRequest; + }(UtilsLoggerByDefault); + ServicesAltiRequestModelAltiElevationRequest = function (Logger, AltiRequest) { + function AltiElevationRequest(options) { + if (!(this instanceof AltiElevationRequest)) { + throw new TypeError('AltiElevationRequest constructor cannot be called as a function.'); + } + this.CLASSNAME = 'AltiElevationRequest'; + AltiRequest.apply(this, arguments); + this.zonly = this.options.zonly || false; + } + AltiElevationRequest.prototype = Object.create(AltiRequest.prototype, { + zonly: { + get: function () { + return this._zonly; + }, + set: function (z) { + this._zonly = z; + } + } + }); + AltiElevationRequest.prototype.constructor = AltiElevationRequest; + AltiElevationRequest.prototype.getData = function () { + var map = []; + map.push({ + k: 'lon', + v: this.getLon() + }); + map.push({ + k: 'lat', + v: this.getLat() + }); + map.push({ + k: 'indent', + v: this.indent + }); + map.push({ + k: 'crs', + v: this.crs + }); + map.push({ + k: 'zonly', + v: this.zonly + }); + map.push({ + k: 'format', + v: this.format + }); + return map; + }; + return AltiElevationRequest; + }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest); + ServicesAltiRequestModelAltiProfilRequest = function (Logger, AltiRequest) { + function AltiProfilRequest(options) { + if (!(this instanceof AltiProfilRequest)) { + throw new TypeError('AltiProfilRequest constructor cannot be called as a function.'); + } + this.CLASSNAME = 'AltiProfilRequest'; + AltiRequest.apply(this, arguments); + this.sampling = this.options.sampling || 3; + } + AltiProfilRequest.prototype = Object.create(AltiRequest.prototype, { + sampling: { + get: function () { + return this._sampling; + }, + set: function (value) { + this._sampling = value; + } + } + }); + AltiProfilRequest.prototype.constructor = AltiProfilRequest; + AltiProfilRequest.prototype.getData = function () { + var map = []; + map.push({ + k: 'lon', + v: this.getLon() + }); + map.push({ + k: 'lat', + v: this.getLat() + }); + map.push({ + k: 'indent', + v: this.indent + }); + map.push({ + k: 'crs', + v: this.crs + }); + map.push({ + k: 'sampling', + v: this.sampling + }); + map.push({ + k: 'format', + v: this.format + }); + return map; + }; + return AltiProfilRequest; + }(UtilsLoggerByDefault, ServicesAltiRequestModelAltiRequest); + ServicesAltiRequestAltiRequestREST = function (Logger, _, AltiElevationRequest, AltiProfilRequest) { + function AltiRequestREST(options) { + if (!(this instanceof AltiRequestREST)) { + throw new TypeError('AltiRequestREST constructor cannot be called as a function.'); + } + this.options = options || {}; + if (!this.options) { + throw new Error(_.getMessage('PARAM_EMPTY', 'options')); + } + if (!this.options.type) { + throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)')); + } + this.DataObject = null; + switch (this.options.type) { + case 'Elevation': + this.DataObject = new AltiElevationRequest(this.options.param); + break; + case 'Profil': + this.DataObject = new AltiProfilRequest(this.options.param); + break; + default: + throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)')); + } + this.method = this.options.method || 'GET'; + } + AltiRequestREST.prototype = { + requestString: null, + constructor: AltiRequestREST, + template: { + get: { + value: 'lon=__LON__&lat=__LAT__&indent=__INDENT__&crs=\'__CRS__\'', + input: { + point: '&zonly=__ZONLY__', + profil: '&sampling=__SAMPLING__' + } + }, + post: { + value: 'lon=__LON__\n' + 'lat=__LAT__\n' + 'indent=__INDENT__\n' + 'crs=\'__CRS__\'\n', + input: { + point: 'zonly=__ZONLY__', + profil: 'sampling=__SAMPLING__' + } + } + }, + processRequestString: function () { + var template = ''; + if (this.method == 'POST') { + template = this.template.post.value; + } else if (this.method == 'GET') { + template = this.template.get.value; + } + template = template.replace(/__LON__/g, this.DataObject.getLon()); + template = template.replace(/__LAT__/g, this.DataObject.getLat()); + template = template.replace(/__INDENT__/g, this.DataObject.indent); + template = template.replace(/__CRS__/g, this.DataObject.crs); + template = template + this.__addDataInputs(); + this.requestString = template; + return this.requestString; + }, + __addDataInputs: function () { + var myTemplate; + if (this.method == 'POST') { + myTemplate = this.template.post; + } else if (this.method == 'GET') { + myTemplate = this.template.get; + } else { + throw new Error('No other HTTP method supported by the service !'); + } + var tmpl = null; + if (this.DataObject.CLASSNAME == 'AltiElevationRequest') { + tmpl = myTemplate.input.point; + return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly); + } else if (this.DataObject.CLASSNAME == 'AltiProfilRequest') { + tmpl = myTemplate.input.profil; + return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling); + } else { + throw new Error('No other object supported than elevation or profil !?'); + } + } + }; + return AltiRequestREST; + }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest); + FormatsWPS = function (Logger) { + function WPS(options) { + if (!(this instanceof WPS)) { + throw new TypeError('WPS constructor cannot be called as a function.'); + } + this.options = options || {}; + this.DataObject = this.options.data; + if (!this.DataObject) { + throw new TypeError('This data object is not defined !'); + } + this.paramservice = this.options.param.service || 'WPS'; + this.paramversion = this.options.param.version || '1.0.0'; + this.paramidentifier = this.options.param.identifier || 'gs:WPS'; + this.paramrawdataoutput = this.options.param.rawdataoutput || 'result'; + this.paramrequest = this.options.param.request || 'Execute'; + this.method = this.options.method || 'GET'; + } + WPS.prototype = { + requestString: null, + constructor: WPS, + template: { + get: { + value: 'service=__SERVICE__' + '&version=__VERSION__' + '&rawdataoutput=__RAWDATAOUTPUT__' + '&identifier=__IDENTIFIER__' + '&request=__REQUEST__' + '&datainputs=', + input: '__KEY__=__DATA__' + }, + post: { + value: '' + '' + '__IDENTIFIER__' + '' + '' + '' + '' + '' + '__RAWDATAOUTPUT__' + '' + '' + '', + input: '' + '__KEY__' + '' + '__DATA__' + '' + '' + } + }, + namespaceByDefault: function () { + var ns = [ + '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"' + ]; + return ns.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 () { + var template = ''; + if (this.method == 'POST') { + template = this.template.post.value; + } else if (this.method == 'GET') { + template = this.template.get.value; + } else { + return false; + } + template = template.replace(/__SERVICE__/g, this.paramservice); + template = template.replace(/__VERSION__/g, this.paramversion); + template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput); + template = template.replace(/__IDENTIFIER__/g, this.paramidentifier); + template = template.replace(/__REQUEST__/g, this.paramrequest); + if (this.method == 'POST') { + template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); + template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); + } + template = template.replace(//g, this.__addDataInputs()); + if (!template) { + return false; + } + this.requestString = template; + return true; + }, + __addDataInputs: function () { + var tmpl = this.method == 'GET' ? this.template.get.input : this.template.post.input; + var sep = this.method == 'GET' ? ';' : ''; + var result = ''; + var that = this; + var map = this.DataObject.getData(); + for (var i = 0; i < map.length; i++) { + (function (j) { + if (sep) { + sep = j == map.length - 1 ? '' : ';'; + } + result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep); + }(i)); + } + return result; + }, + __addDataInput: function (tmpl, key, data) { + var tmp = tmpl; + tmp = tmp.replace(/__KEY__/g, key); + tmp = tmp.replace(/__DATA__/g, data); + return tmp; + }, + setMethod: function (method) { + if (method == 'GET' || method == 'POST') { + this.method = method; + } else { + } + }, + getMethod: function () { + return this.method; + } + }; + return WPS; + }(UtilsLoggerByDefault); + ServicesAltiRequestAltiRequestWPS = function (Logger, _, WPS, AltiElevationRequest, AltiProfilRequest) { + var AltiRequestWPS = { + build: function (options) { + if (!options) { + throw new Error(_.getMessage('PARAM_EMPTY', 'options')); + } + if (!options.type) { + throw new Error(_.getMessage('PARAM_EMPTY', 'type (Elevation or Profil)')); + } + var DataObject = null; + switch (options.type) { + case 'Elevation': + options.wps.identifier = 'gs:WPSElevation'; + DataObject = new AltiElevationRequest(options.param); + break; + case 'Profil': + options.wps.identifier = 'gs:WPSLineElevation'; + DataObject = new AltiProfilRequest(options.param); + break; + default: + throw new Error(_.getMessage('PARAM_TYPE', 'type (Elevation or Profil)')); + } + var settings = { + data: DataObject, + method: options.method, + param: options.wps + }; + var rqstWPS = new WPS(settings); + if (!rqstWPS.processRequestString()) { + throw new Error('Enable to process request !'); + } + return rqstWPS.requestString; + } + }; + return AltiRequestWPS; + }(UtilsLoggerByDefault, UtilsMessagesResources, FormatsWPS, ServicesAltiRequestModelAltiElevationRequest, ServicesAltiRequestModelAltiProfilRequest); + ServicesAltiRequestAltiRequestFactory = function (Logger, ErrorService, AltiRequestREST, AltiRequestWPS) { + var AltiRequestFactory = { + build: function (options) { + var request = null; + var settings = { + type: options.sampling ? 'Profil' : 'Elevation', + method: options.httpMethod, + param: { + positions: null, + delimiter: null, + indent: null, + crs: null, + format: null, + sampling: null, + zonly: null + } + }; + settings.param.positions = options.positions; + settings.param.format = options.outputFormat; + settings.param.sampling = options.sampling; + settings.param.zonly = options.zonly; + var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false; + var bOnSuccess = options.onSuccess !== null && typeof options.onSuccess === 'function' ? true : false; + var message = null; + switch (options.api) { + case 'REST': + var myReq = new AltiRequestREST(settings); + if (!myReq.processRequestString()) { + message = 'Error in process request (rest) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + request = myReq.requestString; + break; + case 'WPS': + settings.wps = { + service: null, + version: null, + identifier: null, + rawdataoutput: null, + request: null + }; + request = AltiRequestWPS.build(settings); + if (!request) { + message = 'Error in process request (wps) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + break; + default: + message = 'Type of API is not supported by service (REST or WPS) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + if (bOnSuccess) { + options.onSuccess.call(options.scope, request); + } + return request; + } + }; + return AltiRequestFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesAltiRequestAltiRequestREST, ServicesAltiRequestAltiRequestWPS); + FormatsXML = function (Logger) { + function XML(options) { + if (!(this instanceof XML)) { + throw new TypeError('XML constructor cannot be called as a function.'); + } + this.xmlString = null; + this.xmlDoc = null; + this.reader = null; + if (options) { + if (options.xmlString && typeof options.xmlString === 'string') { + this.xmlString = options.xmlString; + this.xmlDoc = __getXMLDOC(options.xmlString); + } + if (options.reader) { + this.setReader(options.reader); + } + } + } + XML.prototype = { + constructor: XML, + getXMLString: function () { + return this.xmlString; + }, + setXMLString: function (xmlString) { + if (xmlString && typeof xmlString === 'string') { + this.xmlString = xmlString; + this.xmlDoc = __getXMLDOC(xmlString); + } + }, + getReader: function () { + return this.reader; + }, + setReader: function (reader) { + if (reader && reader.read && typeof reader.read === 'function') { + this.reader = reader; + } + }, + getXMLDoc: function () { + return this.xmlDoc; + }, + setXMLDoc: function (doc) { + this.xmlDoc = doc; + }, + parse: function () { + if (!this.xmlDoc && this.xmlString) { + this.xmlDoc = __getXMLDOC(this.xmlString); + } + if (this.xmlDoc) { + var root = __getRootNode(this.xmlDoc); + if (root) { + var parserOutput; + if (this.reader && this.reader.read) { + parserOutput = this.reader.read(root); + } else { + parserOutput = {}; + parserOutput[root.nodeName] = __readDefault(root); + } + return parserOutput; + } else { + return {}; + } + } + } + }; + function __getXMLDOC(xmlString) { + if (typeof exports === 'object') { + var DOMParser = xmldom.DOMParser; + return new DOMParser().parseFromString(xmlString, 'text/xml'); + } else { + var parser; + var xmlDoc; + var errorMsg = 'Erreur lors du parsing de la réponse du service : XML non conforme'; + if (window.ActiveXObject) { + xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); + xmlDoc.async = false; + xmlDoc.loadXML(xmlString); + var parseError = xmlDoc.parseError; + if (parseError.errorCode) { + if (parseError.line && parseError.linepos) { + errorMsg += '( ligne ' + parseError.line + ', colonne ' + parseError.linepos; + } + if (parseError.reason) { + errorMsg += ': ' + parseError.reason + ')'; + } + throw new Error(errorMsg); + } + return xmlDoc; + } else if (window.DOMParser) { + parser = new window.DOMParser(); + try { + xmlDoc = parser.parseFromString(xmlString, 'text/xml'); + } catch (e) { + if (e.message === 'SyntaxError') { + throw new Error(errorMsg); + } else { + throw new Error('Erreur lors du parsing de la réponse du service : ' + e.message); + } + } + if (xmlDoc.getElementsByTagName('parsererror').length > 0) { + var parsererror = xmlDoc.getElementsByTagName('parsererror'); + for (var i = 0; i < parsererror.length; i++) { + var content = parsererror[i].innerHTML; + if (content.indexOf('Huge input lookup') == -1) { + errorMsg += '(' + content + ')'; + throw new Error(errorMsg); + } + } + } else if (!xmlDoc.documentElement) { + throw new Error(errorMsg); + } + return xmlDoc; + } else { + throw new Error('Incompatible DOM Parser pour ce navigateur !'); + } + } + } + function __getRootNode(xmlDoc) { + var root; + if (xmlDoc.nodeType === 9) { + root = xmlDoc.documentElement; + } else if (xmlDoc.nodeType === 1) { + root = xmlDoc; + } + return root; + } + function __readDefault(node) { + var data = {}; + if (node.attributes.length > 0) { + var dataAttributes = __getAttributes(node); + data['attributes'] = dataAttributes; + } + if (node.hasChildNodes()) { + var childData = {}; + var child; + var children = node.childNodes; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 3) { + data['textContent'] = child.nodeValue; + } else if (child.nodeType === 1) { + childData = __readDefault(child); + if (!data[child.nodeName]) { + data[child.nodeName] = childData; + } else { + if (!Array.isArray(data[child.nodeName])) { + var old = data[child.nodeName]; + data[child.nodeName] = []; + data[child.nodeName].push(old); + } + data[child.nodeName].push(childData); + } + } + } + } + return data; + } + function __getAttributes(node) { + if (node.attributes.length > 0) { + var nodeAttributes = {}; + var attributes = node.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + nodeAttributes[attribute.nodeName] = attribute.nodeValue; + } + return nodeAttributes; + } + } + return XML; + }(UtilsLoggerByDefault); + ServicesAltiResponseModelAltiResponse = function () { + function AltiResponse() { + if (!(this instanceof AltiResponse)) { + throw new TypeError('AltiResponse constructor cannot be called as a function.'); + } + this.elevations = []; + } + AltiResponse.prototype = { constructor: AltiResponse }; + return AltiResponse; + }(); + ServicesAltiResponseModelElevation = function () { + function Elevation() { + if (!(this instanceof Elevation)) { + throw new TypeError('Elevation constructor cannot be called as a function.'); + } + this.z = null; + } + Elevation.prototype = { constructor: Elevation }; + return Elevation; + }(); + ServicesAltiFormatsAltiResponseReader = function (Logger, AltiResponse, Elevation) { + var AltiResponseReader = {}; + AltiResponseReader.READERS = { + elevations: function (root) { + var altiResponse = new AltiResponse(); + if (root.hasChildNodes()) { + var children = root.childNodes; + var child; + var elevation; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (AltiResponseReader.READERS[child.nodeName]) { + elevation = AltiResponseReader.READERS[child.nodeName](child); + altiResponse.elevations.push(elevation); + } + } + } + return altiResponse; + }, + elevation: function (node) { + var elevation = new Elevation(); + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (AltiResponseReader.READERS[child.nodeName]) { + AltiResponseReader.READERS[child.nodeName](child, elevation); + } + } + } + return elevation; + }, + lat: function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + elevation.lat = parseFloat(textNode.nodeValue); + } else { + throw new Error('Erreur dans la lecture de la réponse du service: latitude attendue mais absente'); + } + }, + lon: function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + elevation.lon = parseFloat(textNode.nodeValue); + } else { + throw new Error('Erreur dans la lecture de la réponse du service: longitude attendue mais absente'); + } + }, + z: function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + if (elevation) { + elevation.z = parseFloat(textNode.nodeValue); + } else { + elevation = new Elevation(); + elevation.z = parseFloat(textNode.nodeValue); + return elevation; + } + } else { + throw new Error('Erreur dans la lecture de la réponse du service: altitude attendue mais absente'); + } + }, + acc: function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + elevation.acc = parseFloat(textNode.nodeValue); + } else { + throw new Error('Erreur dans la lecture de la réponse du service: précision (acc) attendue mais absente'); + } + }, + exceptionreport: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeName === 'Exception') { + response.exceptionReport = AltiResponseReader.READERS.exception(child); + } + } + } + return response; + }, + exception: function (node) { + var exceptionReport = {}; + var exceptionCode = node.getAttribute('exceptionCode'); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + }, + error: function (node) { + var response = { error: {} }; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + var textNode; + if (child.nodeType === 1 && child.nodeName === 'code') { + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { + response.error.code = textNode.nodeValue; + } + } + if (child.nodeType === 1 && child.nodeName === 'description') { + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { + response.error.description = textNode.nodeValue; + } + } + } + } + return response; + } + }; + AltiResponseReader.read = function (root) { + if (root.nodeName === 'elevations') { + var altiResponse = AltiResponseReader.READERS.elevations(root); + return altiResponse; + } else if (root.nodeName === 'ExceptionReport') { + var exceptionReport = AltiResponseReader.READERS.exceptionreport(root); + return exceptionReport; + } else if (root.nodeName === 'error') { + var error = AltiResponseReader.READERS.error(root); + return error; + } else { + throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.'); + } + }; + return AltiResponseReader; + }(UtilsLoggerByDefault, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation); + ServicesAltiResponseAltiResponseFactory = function (Logger, ErrorService, MRes, XML, AltiResponseReader, AltiResponse, Elevation) { + var AltiResponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + switch (options.outputFormat) { + case 'xml': + try { + var p = new XML({ reader: AltiResponseReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2')); + } + } catch (e) { + var message = e.message; + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message), + status: 200, + type: ErrorService.TYPE_SRVERR + })); + return; + } + break; + case 'json': + var JSONResponse; + if (typeof options.response === 'string') { + JSONResponse = window.JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + if (JSONResponse.error) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description), + status: 200, + type: ErrorService.TYPE_SRVERR + })); + return; + } + if (JSONResponse) { + var elevations = JSONResponse.elevations; + var altiResponse = new AltiResponse(); + var elevation; + if (Array.isArray(elevations) && elevations.length) { + for (var i = 0; i < elevations.length; i++) { + elevation = new Elevation(); + if (typeof elevations[i] === 'object') { + if (elevations[i].lon) { + elevation.lon = elevations[i].lon; + } + if (elevations[i].lat) { + elevation.lat = elevations[i].lat; + } + if (elevations[i].z) { + elevation.z = elevations[i].z; + } + if (elevations[i].acc) { + elevation.acc = elevations[i].acc; + } + } else if (typeof elevations[i] === 'number') { + elevation.z = elevations[i]; + } + if (Array.isArray(altiResponse.elevations)) { + altiResponse.elevations.push(elevation); + } + } + } + data = altiResponse; + } + if (!data) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'), + type: ErrorService.TYPE_UNKERR, + status: -1 + })); + return; + } + break; + default: + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_FORMAT_2'), + type: ErrorService.TYPE_UNKERR, + status: -1 + })); + return; + } + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } else if (data.error) { + var errorMess = data.error.description; + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', errorMess), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY'))); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return AltiResponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAltiFormatsAltiResponseReader, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation); + ServicesAltiAlti = function (Logger, _, ErrorService, CommonService, DefaultUrlService, AltiRequestFactory, AltiResponseFactory) { + function Alti(options) { + if (!(this instanceof Alti)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Alti')); + } + this.CLASSNAME = 'Alti'; + CommonService.apply(this, arguments); + if (!options.positions) { + throw new Error(_.getMessage('PARAM_MISSING', 'positions')); + } + if (options.positions.length === 0) { + throw new Error(_.getMessage('PARAM_EMPTY', 'positions')); + } + this.options.positions = options.positions; + this.options.outputFormat = typeof options.outputFormat === 'string' ? options.outputFormat.toLowerCase() : 'xml'; + this.options.sampling = options.sampling || null; + this.options.api = typeof options.api === 'string' ? options.api.toUpperCase() : 'REST'; + if (this.options.api === 'REST') { + this.options.httpMethod = 'GET'; + } + this.options.zonly = options.zonly || false; + if (!this.options.serverUrl) { + var lstUrlByDefault = DefaultUrlService.Alti.url(this.options.apiKey); + var urlFound = null; + switch (this.options.api) { + case 'WPS': + urlFound = lstUrlByDefault.wps; + break; + case 'REST': + var key = (options.sampling ? 'profil' : 'elevation') + '-' + this.options.outputFormat; + urlFound = lstUrlByDefault[key]; + break; + default: + throw new Error(_.getMessage('PARAM_UNKNOWN', 'api')); + } + if (!urlFound) { + throw new Error('Url by default not found !'); + } + this.options.serverUrl = urlFound; + } + var idx = this.options.serverUrl.lastIndexOf('.'); + if (idx !== -1) { + var extension = this.options.serverUrl.substring(idx + 1); + if (extension && extension.length < 5) { + switch (extension.toLowerCase()) { + case 'json': + case 'xml': + this.options.outputFormat = extension.toLowerCase(); + break; + default: + throw new Error('type of service : unknown or unsupported (json or xml) !'); + } + } + } + } + Alti.prototype = Object.create(CommonService.prototype, {}); + Alti.prototype.constructor = Alti; + Alti.prototype.buildRequest = function (error, success) { + var options = { + httpMethod: this.options.httpMethod, + onSuccess: function (result) { + this.request = result; + success.call(this, this.request); + }, + onError: error, + scope: this, + positions: this.options.positions, + outputFormat: this.options.outputFormat, + sampling: this.options.sampling, + api: this.options.api, + zonly: this.options.zonly + }; + AltiRequestFactory.build(options); + }; + Alti.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + outputFormat: this.options.outputFormat, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + AltiResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return Alti; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesAltiRequestAltiRequestFactory, ServicesAltiResponseAltiResponseFactory); + ServicesAutoConfResponseModelAutoConfResponse = function () { + function AutoConfResponse() { + if (!(this instanceof AutoConfResponse)) { + throw new TypeError('AutoConfResponse constructor cannot be called as a function.'); + } + this.generalOptions = { + apiKeys: {}, + title: null, + defaultGMLGFIStyle: null, + theme: null, + wgs84Resolutions: [] + }; + this.layers = {}; + this.territories = {}; + this.tileMatrixSets = {}; + this.services = {}; + } + AutoConfResponse.prototype = { + constructor: AutoConfResponse, + isConfLoaded: function (apiKey) { + if (!apiKey) { + return; + } + if (this.generalOptions.apiKeys[apiKey]) { + return true; + } + return false; + }, + getLayersId: function (apiKey) { + return this.generalOptions.apiKeys[apiKey]; + }, + getLayersConf: function (apiKey) { + var layers = {}; + var layersIdArray = this.getLayersId(apiKey); + if (layersIdArray) { + for (var i = 0; i < layersIdArray.length; i++) { + var lyrId = layersIdArray[i]; + layers[lyrId] = this.layers[lyrId]; + } + } + return layers; + }, + getLayerConf: function (layerId) { + if (!this.layers) { + return; + } + return this.layers[layerId]; + }, + getTileMatrixSets: function () { + return this.tileMatrixSets; + }, + getTMSConf: function (tmsID) { + if (!this.tileMatrixSets) { + return; + } + return this.tileMatrixSets[tmsID]; + }, + getTerritories: function () { + return this.territories; + }, + getTerritoryConf: function (territoryID) { + if (!this.territories) { + return; + } + return this.territories[territoryID]; + }, + getServices: function () { + return this.services; + }, + getServiceConf: function (serviceID) { + if (!this.services) { + return; + } + return this.services[serviceID]; + } + }; + return AutoConfResponse; + }(); + ServicesAutoConfResponseModelConstraint = function () { + function Constraint() { + if (!(this instanceof Constraint)) { + throw new TypeError('Constraint constructor cannot be called as a function.'); + } + this.crs = null; + this.bbox = { + left: null, + right: null, + top: null, + bottom: null + }; + this.minScaleDenominator = null; + this.maxScaleDenominator = null; + this.temporalExtent = [ + null, + null + ]; + } + Constraint.prototype = { constructor: Constraint }; + return Constraint; + }(); + ServicesAutoConfResponseModelFormat = function () { + function Format() { + if (!(this instanceof Format)) { + throw new TypeError('Format constructor cannot be called as a function.'); + } + this.current = null; + this.name = null; + } + Format.prototype = { constructor: Format }; + return Format; + }(); + ServicesAutoConfResponseModelLayer = function () { + function Layer() { + if (!(this instanceof Layer)) { + throw new TypeError('Layer constructor cannot be called as a function.'); + } + } + Layer.prototype = { + constructor: Layer, + getName: function () { + return this.name; + }, + getTitle: function () { + return this.title; + }, + getDescription: function () { + return this.description; + }, + getLayerId: function () { + return this.layerId; + }, + getQuicklookUrl: function () { + return this.quicklookUrl; + }, + getDefaultProjection: function () { + return this.defaultProjection; + }, + getProjections: function () { + var projections = []; + projections.push(this.defaultProjection); + var proj = projections.concat(this.additionalProjections); + return proj; + }, + getBBOX: function () { + if (!this.globalConstraint) { + return; + } + return this.globalConstraint.bbox; + }, + getMinScaleDenominator: function () { + if (!this.globalConstraint) { + return; + } + return this.globalConstraint.minScaleDenominator; + }, + getMaxScaleDenominator: function () { + if (!this.globalConstraint) { + return; + } + return this.globalConstraint.maxScaleDenominator; + }, + getTMSID: function () { + if (this.wmtsOptions) { + return this.wmtsOptions.tileMatrixSetLink; + } + return; + }, + getServiceParams: function () { + return this.serviceParams; + }, + getServerUrl: function (apiKey) { + if (!apiKey || !this.serviceParams || !this.serviceParams.serverUrl) { + return; + } + return this.serviceParams.serverUrl[apiKey]; + }, + getLegends: function () { + return this.legends; + }, + getMetadata: function () { + return this.metadata; + }, + getStyles: function () { + return this.styles; + }, + getDefaultStyle: function () { + if (!this.styles) { + return; + } + var style; + var s = this.styles; + for (var i = 0; i < s.length; i++) { + if (s[i].current === true) { + style = s[i].name; + break; + } + } + return style; + }, + getThematics: function () { + return this.thematics; + }, + getDefaultFormat: function () { + if (!this.formats) { + return; + } + var format; + var f = this.formats; + for (var i = 0; i < f.length; i++) { + if (f[i].current === true) { + format = f[i].name; + break; + } + } + return format; + }, + getConstraints: function () { + return this.constraints; + }, + getOriginators: function () { + return this.originators; + }, + getDimensions: function () { + return this.dimensions; + }, + getAggregatedLayers: function () { + if (this.isAggregate) { + return this.aggregatedLayers; + } else { + return; + } + } + }; + return Layer; + }(); + ServicesAutoConfResponseModelLegend = function () { + function Legend() { + if (!(this instanceof Legend)) { + throw new TypeError('Legend constructor cannot be called as a function.'); + } + this.format = null; + this.url = null; + this.minScaleDenominator = null; + } + Legend.prototype = { constructor: Legend }; + return Legend; + }(); + ServicesAutoConfResponseModelMetadata = function () { + function Metadata() { + if (!(this instanceof Metadata)) { + throw new TypeError('Metadata constructor cannot be called as a function.'); + } + this.format = null; + this.url = null; + } + Metadata.prototype = { constructor: Metadata }; + return Metadata; + }(); + ServicesAutoConfResponseModelOriginator = function () { + function Originator() { + if (!(this instanceof Originator)) { + throw new TypeError('Originator constructor cannot be called as a function.'); + } + this.name = null; + this.attribution = null; + this.logo = null; + this.url = null; + this.constraints = []; + } + Originator.prototype = { constructor: Originator }; + return Originator; + }(); + ServicesAutoConfResponseModelService = function () { + function Service() { + if (!(this instanceof Service)) { + throw new TypeError('Service constructor cannot be called as a function.'); + } + this.title = null; + this.serverUrl = null; + this.version = null; + } + Service.prototype = { constructor: Service }; + return Service; + }(); + ServicesAutoConfResponseModelStyle = function () { + function Style() { + if (!(this instanceof Style)) { + throw new TypeError('Style constructor cannot be called as a function.'); + } + this.name = null; + this.title = null; + this.current = null; + } + Style.prototype = { constructor: Style }; + return Style; + }(); + ServicesAutoConfResponseModelTerritory = function () { + function Territory() { + if (!(this instanceof Territory)) { + throw new TypeError('Territory constructor cannot be called as a function.'); + } + this.isDefault = null; + this.defaultCRS = null; + this.additionalCRS = []; + this.geoBBOX = { + left: null, + right: null, + top: null, + bottom: null + }; + this.geoCenter = { + lon: null, + lat: null + }; + this.defaultOptions = { + resolution: null, + minScaleDenominator: null, + maxScaleDenominator: null + }; + this.defaultLayers = []; + } + Territory.prototype = { constructor: Territory }; + return Territory; + }(); + ServicesAutoConfResponseModelThematic = function () { + function Thematic() { + if (!(this instanceof Thematic)) { + throw new TypeError('Thematic constructor cannot be called as a function.'); + } + this.inspire = null; + this.name = null; + } + Thematic.prototype = { constructor: Thematic }; + return Thematic; + }(); + ServicesAutoConfResponseModelTileMatrixSet = function () { + function TileMatrixSet() { + if (!(this instanceof TileMatrixSet)) { + throw new TypeError('TileMatrixSet constructor cannot be called as a function.'); + } + this.projection = null; + this.nativeResolutions = []; + this.matrixIds = []; + this.tileMatrices = {}; + } + TileMatrixSet.prototype = { + constructor: TileMatrixSet, + getResolutions: function () { + return this.nativeResolutions; + }, + getMatrixIds: function () { + return this.matrixIds; + }, + getProjection: function () { + return this.projection; + }, + getTileMatrices: function () { + return this.tileMatrices; + }, + getTopLeftCorner: function () { + var topLeftCorner; + var matrices = this.getTileMatrices(); + if (matrices) { + for (var id in matrices) { + if (matrices.hasOwnProperty(id)) { + topLeftCorner = matrices[id].topLeftCorner; + break; + } + } + } + return topLeftCorner; + } + }; + return TileMatrixSet; + }(); + ServicesAutoConfResponseModelTileMatrix = function () { + function TileMatrix() { + if (!(this instanceof TileMatrix)) { + throw new TypeError('TileMatrix constructor cannot be called as a function.'); + } + this.matrixId = null; + this.matrixHeight = null; + this.matrixWidth = null; + this.scaleDenominator = null; + this.tileHeight = null; + this.tileWidth = null; + this.topLeftCorner = null; + } + TileMatrix.prototype = { + constructor: TileMatrix, + getTopLeftCorner: function () { + return this.topLeftCorner; + }, + getScaleDenominator: function () { + return this.scaleDenominator; + }, + getTileHeight: function () { + return this.tileHeight; + }, + getTileWidth: function () { + return this.tileWidth; + }, + getMatrixHeight: function () { + return this.matrixHeight; + }, + getMatrixWidth: function () { + return this.matrixWidth; + } + }; + return TileMatrix; + }(); + ServicesAutoConfResponseModelTileMatrixLimit = function () { + function TileMatrixLimit() { + if (!(this instanceof TileMatrixLimit)) { + throw new TypeError('TileMatrixLimit constructor cannot be called as a function.'); + } + this.minTileRow = null; + this.maxTileRow = null; + this.minTileCol = null; + this.maxTileCol = null; + } + TileMatrixLimit.prototype = { constructor: TileMatrixLimit }; + return TileMatrixLimit; + }(); + ServicesAutoConfFormatsAutoConfResponseReader = function (Logger, AutoConfResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TileMatrixSet, TileMatrix, TileMatrixLimit) { + var AutoConfResponseReader = {}; + AutoConfResponseReader.VERSION = '1.1.0'; + AutoConfResponseReader.NAMESPACES = { + xmlns: 'http://www.opengis.net/context', + gpp: 'http://api.ign.fr/geoportail', + ows: 'http://www.opengis.net/ows/1.1', + sld: 'http://www.opengis.net/sld', + wmts: 'http://www.opengis.net/wmts/1.0', + xlink: 'http://www.w3.org/1999/xlink', + xsi: 'http://www.w3.org/2001/XMLSchema-instance' + }; + AutoConfResponseReader.SCHEMALOCATION = [ + 'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd', + 'http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd' + ]; + AutoConfResponseReader.DEFAULTPREFIX = 'context'; + AutoConfResponseReader.READERS = { + context: { + ViewContext: function (viewContextNode) { + __checkServiceAttributes(viewContextNode); + var config = new AutoConfResponse(); + __getChildNodes(viewContextNode, config); + return config; + }, + Title: function (titleNode, data) { + if (data && data.generalOptions) { + data.generalOptions.title = __getChildValue(titleNode); + } else if (data && data.lyr) { + data.lyr.title = __getChildValue(titleNode); + } + }, + Abstract: function (node, data) { + if (data && data.lyr) { + data.lyr.description = __getChildValue(node); + } + }, + Server: function (node, data) { + var serverId = node.getAttribute('service'); + var title = node.getAttribute('title'); + var version = node.getAttribute('version'); + if (serverId) { + if (data && data.services && typeof data.services === 'object' && !data.services[serverId]) { + var s = new Service(); + s.title = title; + s.version = version; + __getChildNodes(node, s); + data.services[serverId] = s; + } else if (data && data.lyr) { + if (!data.lyr.serviceParams) { + data.lyr.serviceParams = {}; + } + data.lyr.serviceParams.id = serverId; + data.lyr.serviceParams.version = version; + } + } + }, + OnlineResource: function (node, service) { + if (service && service.hasOwnProperty('serverUrl')) { + service.serverUrl = node.getAttribute('xlink:href'); + } + }, + LayerList: function (layerListNode, config) { + __getChildNodes(layerListNode, config); + if (config && config.layers && config.generalOptions && config.services) { + for (var lyr in config.layers) { + if (config.layers.hasOwnProperty(lyr)) { + var layerConfig = config.layers[lyr]; + var apiKeys = layerConfig.apiKeys; + if (apiKeys && Array.isArray(apiKeys)) { + for (var i = 0; i < apiKeys.length; i++) { + var key = apiKeys[i]; + if (config.generalOptions.apiKeys) { + if (!config.generalOptions.apiKeys[key] || !Array.isArray(config.generalOptions.apiKeys[key])) { + config.generalOptions.apiKeys[key] = []; + } + config.generalOptions.apiKeys[key].push(lyr); + } + } + } + var serviceParams = layerConfig.serviceParams; + if (serviceParams && serviceParams.id) { + if (!config.services[serviceParams.id]) { + var s = new Service(); + if (serviceParams.serverUrl) { + s.serverUrl = serviceParams.serverUrl; + } + if (serviceParams.version) { + s.version = serviceParams.version; + } + config.services[serviceParams.id] = s; + } + } + if (layerConfig.wmtsOptions && layerConfig.wmtsOptions.tileMatrixSetLink && config.tileMatrixSets) { + var tmsLink = layerConfig.wmtsOptions.tileMatrixSetLink; + var tileMatrixSets = config.tileMatrixSets; + for (var tms in tileMatrixSets) { + if (tileMatrixSets.hasOwnProperty(tms) && tms === tmsLink) { + layerConfig.defaultProjection = tileMatrixSets[tms].projection; + } + } + } + } + } + } + }, + Layer: function (layerNode, config) { + if (config && config.layers) { + var lyrData = { + lyr: new Layer(), + lyrId: null + }; + var hidden = layerNode.getAttribute('hidden'); + if (hidden === '1') { + lyrData.lyr.hidden = true; + } else { + lyrData.lyr.hidden = false; + } + var queryable = layerNode.getAttribute('queryable'); + if (queryable === '1') { + lyrData.lyr.queryable = true; + } else { + lyrData.lyr.queryable = false; + } + __getChildNodes(layerNode, lyrData); + if (lyrData.lyrId) { + if (lyrData.lyr.serviceParams && lyrData.lyr.serviceParams.id) { + var serviceid = lyrData.lyr.serviceParams.id; + if (serviceid.toUpperCase().indexOf('OPENLS') !== -1 || serviceid.toUpperCase().indexOf('ELEVATION') !== -1) { + var resourceId = lyrData.lyrId.split('$')[0]; + lyrData.lyrId = resourceId + '$' + serviceid; + } + } + lyrData.lyr.layerId = lyrData.lyrId; + config.layers[lyrData.lyrId] = lyrData.lyr; + } + } + }, + Name: function (node, lyrData) { + if (lyrData && lyrData.lyr) { + lyrData.lyr.name = __getChildValue(node); + } + }, + SRS: function (node, lyrData) { + if (lyrData && lyrData.lyr) { + lyrData.lyr.defaultProjection = __getChildValue(node); + } + }, + Format: function (node, lyrData) { + if (lyrData && lyrData.lyr) { + var f = new Format(); + var current = node.getAttribute('current'); + if (current === '1') { + f.current = true; + } else { + f.current = false; + } + f.name = __getChildValue(node); + if (!lyrData.lyr.formats || !Array.isArray(lyrData.lyr.formats)) { + lyrData.lyr.formats = []; + } + lyrData.lyr.formats.push(f); + } + }, + Style: function (node, lyrData) { + if (lyrData && lyrData.lyr) { + var s = new Style(); + var current = node.getAttribute('current'); + if (current === '1' || current === 1) { + s.current = true; + } else { + s.current = false; + } + if (node.hasChildNodes) { + var children = node.childNodes; + var child; + var childName; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + if (childName === 'Name') { + s.name = __getChildValue(child); + } else if (childName === 'Title') { + s.title = __getChildValue(child); + } + } + } + } + if (!lyrData.lyr.styles || !Array.isArray(lyrData.lyr.styles)) { + lyrData.lyr.styles = []; + } + lyrData.lyr.styles.push(s); + } + }, + Dimension: function (node, lyrData) { + var name = node.getAttribute('name'); + var dim = __getChildValue(node); + if (lyrData && lyrData.lyr) { + if (!lyrData.lyr.dimensions) { + lyrData.lyr.dimensions = {}; + } + if (name === 'Type') { + lyrData.lyr.dimensions.type = dim; + } else if (name === 'VisibilityRange') { + lyrData.lyr.dimensions.visibilityRange = dim; + } else if (name === 'VisibilityMode ') { + lyrData.lyr.dimensions.visibilityMode = dim; + } else if (name === 'GeometricType') { + lyrData.lyr.dimensions.geometricType = dim; + } else if (name === 'NoDataValue') { + lyrData.lyr.dimensions.noDataValue = dim; + } + } + } + }, + gpp: { + Theme: function (themeNode, config) { + if (config && config.generalOptions && config.generalOptions.hasOwnProperty('theme')) { + config.generalOptions.theme = __getChildValue(themeNode); + } + }, + defaultGMLGFIStyleUrl: function (node, config) { + if (config && config.generalOptions && config.generalOptions.hasOwnProperty('defaultGMLGFIStyle')) { + config.generalOptions.defaultGMLGFIStyle = __getChildValue(node); + } + }, + Territory: function (territoryNode, config) { + var tid = territoryNode.getAttribute('id'); + if (tid) { + var t = new Territory(); + var isDefault = territoryNode.getAttribute('default'); + if (isDefault === '1') { + t.isDefault = true; + } else { + t.isDefault = false; + } + __getChildNodes(territoryNode, t); + if (config && config.territories && typeof config.territories === 'object') { + config.territories[tid] = t; + } + } + }, + defaultCRS: function (node, territory) { + if (territory && territory.hasOwnProperty('defaultCRS')) { + territory.defaultCRS = __getChildValue(node); + } + }, + AdditionalCRS: function (node, data) { + var addCRS = __getChildValue(node); + if (addCRS && data) { + if (Array.isArray(data.additionalCRS)) { + data.additionalCRS.push(addCRS); + } else { + if (!data.additionalProjections || !Array.isArray(data.additionalProjections)) { + data.additionalProjections = []; + } + data.additionalProjections.push(addCRS); + } + } + }, + DefaultLayer: function (node, territory) { + var lyr = node.getAttribute('layerId'); + if (lyr && territory && Array.isArray(territory.defaultLayers)) { + territory.defaultLayers.push(lyr); + } + }, + BoundingBox: function (node, data) { + if (data) { + var values = __getChildValue(node).split(','); + if (values.length === 4) { + var bbox = { + left: parseFloat(values[0]), + right: parseFloat(values[2]), + top: parseFloat(values[3]), + bottom: parseFloat(values[1]) + }; + var minT = node.getAttribute('minT'); + var maxT = node.getAttribute('maxT'); + if (data.hasOwnProperty('geoBBOX')) { + data.geoBBOX = bbox; + } else if (data.hasOwnProperty('bbox')) { + if (data.bbox.left || data.bbox.right || data.bbox.top || data.bbox.bottom) { + if (!data.multiConstraints) { + data.multiConstraints = []; + } + var newConstraint = new Constraint(); + newConstraint.bbox = bbox; + newConstraint.temporalExtent = [ + minT, + maxT + ]; + data.multiConstraints.push(newConstraint); + } else { + data.bbox = bbox; + data.temporalExtent = [ + minT, + maxT + ]; + } + } else { + if (!data.globalConstraint) { + data.globalConstraint = new Constraint(); + } + data.globalConstraint.bbox = bbox; + data.globalConstraint.temporalExtent = [ + minT, + maxT + ]; + } + } + } + }, + Resolution: function (node, territory) { + var res = __getChildValue(node); + if (res && territory && territory.defaultOptions && territory.defaultOptions.hasOwnProperty('resolution')) { + territory.defaultOptions.resolution = parseFloat(res); + } + }, + x: function (node, territory) { + var lon = __getChildValue(node); + if (lon && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lon')) { + territory.geoCenter.lon = parseFloat(lon); + } + }, + y: function (node, territory) { + var lat = __getChildValue(node); + if (lat && territory && territory.geoCenter && territory.geoCenter.hasOwnProperty('lat')) { + territory.geoCenter.lat = parseFloat(lat); + } + }, + Resolutions: function (resNode, config) { + if (config && config.generalOptions && config.generalOptions.hasOwnProperty('wgs84Resolutions')) { + config.generalOptions.wgs84Resolutions = __getChildValue(resNode).split(','); + } + }, + Layer: function (node, lyrData) { + if (lyrData && lyrData.hasOwnProperty('lyrId') && lyrData.lyr) { + lyrData.lyrId = node.getAttribute('id'); + var aggregate = node.getAttribute('aggregate'); + var more = node.getAttribute('more'); + if (aggregate || more) { + lyrData.lyr.isAggregate = true; + } + __getChildNodes(node, lyrData.lyr); + } + }, + Constraint: function (node, data) { + var c = new Constraint(); + __getChildNodes(node, c); + if (data) { + if (!data.constraints || !Array.isArray(data.constraints)) { + data.constraints = []; + } + if (c.multiConstraints && Array.isArray(c.multiConstraints)) { + var constraint = new Constraint(); + constraint.crs = c.crs; + constraint.bbox = c.bbox; + constraint.minScaleDenominator = c.minScaleDenominator; + constraint.maxScaleDenominator = c.maxScaleDenominator; + constraint.temporalExtent = c.temporalExtent; + data.constraints.push(constraint); + for (var i = 0; i < c.multiConstraints.length; i++) { + constraint = new Constraint(); + constraint.crs = c.crs; + constraint.minScaleDenominator = c.minScaleDenominator; + constraint.maxScaleDenominator = c.maxScaleDenominator; + constraint.bbox = c.multiConstraints[i].bbox; + constraint.temporalExtent = c.multiConstraints[i].temporalExtent; + data.constraints.push(constraint); + } + } else { + data.constraints.push(c); + } + } + }, + CRS: function (node, data) { + if (data && data.hasOwnProperty('crs')) { + data.crs = __getChildValue(node); + } + }, + Thematic: function (node, lyr) { + if (lyr) { + var t = new Thematic(); + t.inspire = false; + t.name = __getChildValue(node); + if (!lyr.thematics || !Array.isArray(lyr.thematics)) { + lyr.thematics = []; + } + lyr.thematics.push(t); + } + }, + InspireThematic: function (node, lyr) { + if (lyr) { + var t = new Thematic(); + t.inspire = true; + t.name = __getChildValue(node); + if (!lyr.thematics || !Array.isArray(lyr.thematics)) { + lyr.thematics = []; + } + lyr.thematics.push(t); + } + }, + Originator: function (node, lyr) { + if (lyr) { + var o = new Originator(); + o.name = node.getAttribute('name'); + __getChildNodes(node, o); + if (!lyr.originators || !Array.isArray(lyr.originators)) { + lyr.originators = []; + } + lyr.originators.push(o); + } + }, + Attribution: function (node, originator) { + if (originator && originator.hasOwnProperty('attribution')) { + originator.attribution = __getChildValue(node); + } + }, + Logo: function (node, originator) { + if (originator && originator.hasOwnProperty('logo')) { + originator.logo = __getChildValue(node); + } + }, + URL: function (node, originator) { + if (originator && originator.hasOwnProperty('url')) { + originator.url = __getChildValue(node); + } + }, + Legend: function (node, lyr) { + var l = new Legend(); + __getChildNodes(node, l); + if (lyr) { + if (!lyr.legends || !Array.isArray(lyr.legends)) { + lyr.legends = []; + } + lyr.legends.push(l); + } + }, + LegendURL: function (node, legend) { + if (legend && legend.hasOwnProperty('format')) { + legend.format = node.getAttribute('format'); + if (node.hasChildNodes) { + var child = node.childNodes[0]; + var childName = child.localName || child.baseName || child.nodeName; + if (childName === 'OnlineResource' && legend.hasOwnProperty('url')) { + legend.url = child.getAttribute('xlink:href'); + } + } + } + }, + QuickLook: function (node, lyr) { + if (node.hasChildNodes) { + var child = node.childNodes[0]; + var childName = child.localName || child.baseName || child.nodeName; + if (childName === 'OnlineResource' && lyr) { + lyr.quicklookUrl = child.getAttribute('xlink:href'); + } + } + }, + MetadataURL: function (node, lyr) { + if (lyr) { + var m = new Metadata(); + m.format = node.getAttribute('format'); + if (node.hasChildNodes) { + var child = node.childNodes[0]; + var childName = child.localName || child.baseName || child.nodeName; + if (childName === 'OnlineResource') { + m.url = child.getAttribute('xlink:href'); + } + } + if (!lyr.metadata && !Array.isArray(lyr.metadata)) { + lyr.metadata = []; + } + lyr.metadata.push(m); + } + }, + Key: function (node, lyr) { + if (lyr) { + var key = node.getAttribute('id'); + if (!lyr.apiKeys || !Array.isArray(lyr.apiKeys)) { + lyr.apiKeys = []; + } + lyr.apiKeys.push(key); + var serverUrl = __getChildValue(node); + if (!lyr.serviceParams) { + lyr.serviceParams = {}; + } + if (!lyr.serviceParams.serverUrl) { + lyr.serviceParams.serverUrl = {}; + } + if (!lyr.serviceParams.serverUrl[key]) { + lyr.serviceParams.serverUrl[key] = serverUrl; + } + } + } + }, + ows: { + Identifier: function (node, data) { + if (data && data.hasOwnProperty('TMS')) { + data.identifier = __getChildValue(node); + } else if (data && data.hasOwnProperty('matrixId')) { + data.matrixId = __getChildValue(node); + } + }, + SupportedCRS: function (node, tmsData) { + if (tmsData && tmsData.TMS && tmsData.TMS.hasOwnProperty('projection')) { + tmsData.TMS.projection = __getChildValue(node); + } + } + }, + sld: { + MinScaleDenominator: function (node, data) { + var minScale = __getChildValue(node); + if (minScale && data) { + if (data.hasOwnProperty('defaultOptions')) { + data.defaultOptions.minScaleDenominator = parseFloat(minScale); + } else if (data.lyr) { + if (!data.lyr.globalConstraint) { + data.lyr.globalConstraint = new Constraint(); + } + data.lyr.globalConstraint.minScaleDenominator = parseFloat(minScale); + } else if (data.hasOwnProperty('minScaleDenominator')) { + data.minScaleDenominator = parseFloat(minScale); + } + } + }, + MaxScaleDenominator: function (node, data) { + var maxScale = __getChildValue(node); + if (maxScale && data) { + if (data.hasOwnProperty('defaultOptions')) { + data.defaultOptions.maxScaleDenominator = parseFloat(maxScale); + } else if (data.lyr) { + if (!data.lyr.globalConstraint) { + data.lyr.globalConstraint = new Constraint(); + } + data.lyr.globalConstraint.maxScaleDenominator = parseFloat(maxScale); + } else if (data.hasOwnProperty('maxScaleDenominator')) { + data.maxScaleDenominator = parseFloat(maxScale); + } + } + } + }, + wmts: { + TileMatrixSetLimits: function (node, lyr) { + if (lyr) { + var limits = {}; + __getChildNodes(node, limits); + if (!lyr.wmtsOptions) { + lyr.wmtsOptions = {}; + } + lyr.wmtsOptions.tileMatrixSetLimits = limits; + } + }, + TileMatrixLimits: function (node, limits) { + var limit = new TileMatrixLimit(); + var limitId; + if (node.hasChildNodes) { + var children = node.childNodes; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var childName = child.localName || child.baseName || child.nodeName; + if (childName === 'TileMatrix') { + limitId = __getChildValue(child); + } else if (childName === 'MinTileRow') { + limit.minTileRow = __getChildValue(child); + } else if (childName === 'MaxTileRow') { + limit.maxTileRow = __getChildValue(child); + } else if (childName === 'MinTileCol') { + limit.minTileCol = __getChildValue(child); + } else if (childName === 'MaxTileCol') { + limit.maxTileCol = __getChildValue(child); + } + } + if (limitId && limits && !limits[limitId]) { + limits[limitId] = limit; + } + } + }, + TileMatrixSet: function (node, data) { + if (data && data.tileMatrixSets) { + var tmsData = {}; + tmsData.TMS = new TileMatrixSet(); + tmsData.resolutions = []; + __getChildNodes(node, tmsData); + var tileMatrices = tmsData.TMS.tileMatrices; + for (var tm in tileMatrices) { + if (tileMatrices.hasOwnProperty(tm)) { + tmsData.TMS.matrixIds.push(tm); + } + } + if (tmsData.TMS.getProjection() === 'IGNF:WGS84G' || tmsData.TMS.getProjection() === 'EPSG:4326') { + if (data.generalOptions && Array.isArray(data.generalOptions.wgs84Resolutions)) { + var wgs84Resolutions = data.generalOptions.wgs84Resolutions; + for (var i = 0; i < wgs84Resolutions.length; i++) { + tmsData.resolutions[i] = parseFloat(wgs84Resolutions[i]); + } + } + } + if (Array.isArray(tmsData.resolutions) && tmsData.resolutions.sort !== undefined) { + tmsData.resolutions.sort(function (x, y) { + return y - x; + }); + } + tmsData.TMS.nativeResolutions = tmsData.resolutions; + data.tileMatrixSets[tmsData.identifier] = tmsData.TMS; + } else { + if (data && !data.wmtsOptions) { + data.wmtsOptions = {}; + } + data.wmtsOptions.tileMatrixSetLink = __getChildValue(node); + } + }, + TileMatrix: function (node, tmsData) { + if (tmsData) { + var tileMatrix = new TileMatrix(); + __getChildNodes(node, tileMatrix); + if (tmsData.TMS && tmsData.TMS.getProjection()) { + var proj = tmsData.TMS.getProjection(); + if (proj === 'EPSG:3857' || proj === 'EPSG:2154') { + var r = tileMatrix.scaleDenominator * 0.00028; + if (tmsData.resolutions && Array.isArray(tmsData.resolutions)) { + tmsData.resolutions.push(r); + } + } + } + if (tmsData.TMS && tmsData.TMS.tileMatrices) { + tmsData.TMS.tileMatrices[tileMatrix.matrixId] = tileMatrix; + } + } + }, + ScaleDenominator: function (node, tileMatrix) { + var scale = __getChildValue(node); + if (scale && tileMatrix && tileMatrix.hasOwnProperty('scaleDenominator')) { + tileMatrix.scaleDenominator = parseFloat(scale); + } + }, + TopLeftCorner: function (node, tileMatrix) { + var values = __getChildValue(node).split(' '); + if (values && tileMatrix) { + tileMatrix.topLeftCorner = {}; + tileMatrix.topLeftCorner.x = parseFloat(values[0]); + tileMatrix.topLeftCorner.y = parseFloat(values[1]); + } + }, + TileWidth: function (node, tileMatrix) { + var value = __getChildValue(node); + if (value && tileMatrix && tileMatrix.hasOwnProperty('tileWidth')) { + tileMatrix.tileWidth = parseInt(value, 10); + } + }, + TileHeight: function (node, tileMatrix) { + var value = __getChildValue(node); + if (value && tileMatrix && tileMatrix.hasOwnProperty('tileHeight')) { + tileMatrix.tileHeight = parseInt(value, 10); + } + }, + MatrixWidth: function (node, tileMatrix) { + var value = __getChildValue(node); + if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixWidth')) { + tileMatrix.matrixWidth = parseInt(value, 10); + } + }, + MatrixHeight: function (node, tileMatrix) { + var value = __getChildValue(node); + if (value && tileMatrix && tileMatrix.hasOwnProperty('matrixHeight')) { + tileMatrix.matrixHeight = parseInt(value, 10); + } + } + }, + serviceException: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeName === 'exception') { + response.exceptionReport = AutoConfResponseReader.READERS['exception'](child); + } + } + } + return response; + }, + exception: function (node) { + var exceptionReport = {}; + var exceptionCode = node.getAttribute('code'); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + } + }; + AutoConfResponseReader.read = function (root) { + if (root.nodeName === 'ViewContext') { + var nsPrefix = root.prefix || AutoConfResponseReader.DEFAULTPREFIX; + var config = AutoConfResponseReader.READERS[nsPrefix][root.nodeName](root); + return config; + } else if (root.nodeName === 'serviceException') { + var exceptionReport = AutoConfResponseReader.READERS[root.nodeName](root); + return exceptionReport; + } else { + throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.'); + } + }; + function __getAttributes(node) { + if (node.attributes.length > 0) { + var nodeAttributes = {}; + var attributes = node.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + nodeAttributes[attribute.nodeName] = attribute.nodeValue; + } + return nodeAttributes; + } + } + function __getChildNodes(node, data) { + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + var childName; + var childPrefix; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + childPrefix = child.prefix || AutoConfResponseReader.DEFAULTPREFIX; + if (AutoConfResponseReader.READERS[childPrefix][childName]) { + var reader = AutoConfResponseReader.READERS[childPrefix][childName]; + reader(child, data); + } else { + __getChildNodes(child, data); + } + } + } + } + } + function __getChildValue(node) { + var textNode; + var value = ''; + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode.nodeType === 3 || textNode.nodeType === 4) { + value = textNode.nodeValue; + } + } + return value; + } + function __checkServiceAttributes(viewContextNode) { + if (viewContextNode.attributes.length > 0) { + var xlsAttributes = __getAttributes(viewContextNode); + for (var att in xlsAttributes) { + if (xlsAttributes.hasOwnProperty(att)) { + if (att === 'version') { + if (xlsAttributes['version'] !== AutoConfResponseReader.VERSION) { + console.log('[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing'); + return; + } + } + if (att === 'xmlns') { + if (xlsAttributes[att] !== AutoConfResponseReader.NAMESPACES.xmlns) { + console.log('[AutoConfResponseReader] autoconf response default namespace is not the expected one'); + return; + } + continue; + } + var prefix = att.split(':')[0]; + var ns = att.split(':')[1]; + if (prefix === 'xmlns' && ns) { + if (AutoConfResponseReader.NAMESPACES[ns]) { + if (AutoConfResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) { + console.log('[AutoConfResponseReader] autoconf response ' + att + ' namespace is not the expected one'); + return; + } + } + } + if (ns === 'schemaLocation') { + if (xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[0] && xlsAttributes[att] !== AutoConfResponseReader.SCHEMALOCATION[1]) { + console.log('[AutoConfResponseReader] autoconf response schema location is not the expected one'); + return; + } + } + } + } + } + } + return AutoConfResponseReader; + }(UtilsLoggerByDefault, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrixSet, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit); + ServicesAutoConfResponseAutoConfResponseFactory = function (Logger, ErrorService, MRes, XML, AutoConfResponseReader) { + var AutoConfReponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + try { + var p = new XML({ reader: AutoConfResponseReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + } catch (e) { + var message = e.message; + if (typeof options.response === 'string') { + message += '\n(raw response service\'' + options.response + '\')'; + } else { + message += '\n(raw response service\'' + options.response.documentElement.innerHTML + '\')'; + } + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message), + status: 200, + type: ErrorService.TYPE_SRVERR + })); + return; + } + var isEmpty = true; + for (var key in data) { + if (data.hasOwnProperty(key)) { + isEmpty = false; + } + } + if (isEmpty) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY_2'))); + return; + } + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY'))); + return; + } + var scope = typeof window !== 'undefined' ? window : {}; + if (!scope.Gp) { + scope.Gp = {}; + } + if (!scope.Gp.Config) { + scope.Gp.Config = data; + } else { + this.mergeConfig(scope.Gp.Config, data, options.layerId); + } + options.onSuccess.call(options.scope, scope.Gp.Config); + return; + }, + mergeConfig: function (GpConfig, data, layerId) { + if (data && GpConfig) { + for (var prop in data) { + if (data.hasOwnProperty(prop)) { + if (prop == 'generalOptions') { + for (var key in data[prop].apiKeys) { + if (data[prop].apiKeys.hasOwnProperty(key) && !GpConfig.generalOptions.apiKeys[key]) { + GpConfig.generalOptions.apiKeys[key] = data[prop].apiKeys[key]; + } + } + } else { + if (GpConfig[prop]) { + for (var obj in data[prop]) { + if (data[prop].hasOwnProperty(obj) && !GpConfig[prop][obj]) { + GpConfig[prop][obj] = data[prop][obj]; + } + } + } + } + } + } + if (layerId) { + var aggregatedLayers = []; + for (var lyr in data.layers) { + if (data.layers.hasOwnProperty(lyr)) { + aggregatedLayers.push(lyr); + } + } + if (GpConfig.layers[layerId]) { + GpConfig.layers[layerId].aggregatedLayers = aggregatedLayers; + } + } + } + } + }; + return AutoConfReponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoConfFormatsAutoConfResponseReader); + ServicesAutoConfAutoConf = function (Logger, _, ErrorService, Helper, DefaultUrlService, CommonService, AutoConfResponseFactory) { + function AutoConf(options) { + if (!(this instanceof AutoConf)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'AutoConf')); + } + this.CLASSNAME = 'AutoConf'; + CommonService.apply(this, arguments); + if (!this.options.serverUrl) { + if (!this.options.serverUrl) { + var lstUrlByDefault = DefaultUrlService.AutoConf.url(this.options.apiKey); + if (!this.options.layerId) { + if (Array.isArray(this.options.apiKey) && this.options.apiKey.length > 0) { + this.options.serverUrl = lstUrlByDefault.apiKeys; + } else { + this.options.serverUrl = lstUrlByDefault.apiKey; + } + } else { + this.options.serverUrl = lstUrlByDefault.aggregate + this.options.layerId; + } + } + } + if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') { + this.options.httpMethod = 'GET'; + } + this.options.outputFormat = 'xml'; + } + AutoConf.prototype = Object.create(CommonService.prototype, {}); + AutoConf.prototype.constructor = AutoConf; + AutoConf.prototype.buildRequest = function (error, success) { + var scope = typeof window !== 'undefined' ? window : {}; + if (scope.Gp && scope.Gp.Config && scope.Gp.Config.generalOptions && scope.Gp.Config.layers) { + if (scope.Gp.Config.generalOptions.apiKeys[this.options.apiKey]) { + if (this.options.layerId) { + if (scope.Gp.Config.layers[this.options.layerId] && scope.Gp.Config.layers[this.options.layerId].aggregatedLayers) { + this.options.onSuccess.call(this, scope.Gp.Config); + return; + } + } else { + this.options.onSuccess.call(this, scope.Gp.Config); + return; + } + } + } + this.request = ''; + var bLocal; + if (this.options.serverUrl.indexOf('http://') === -1) { + bLocal = true; + } else { + bLocal = false; + } + if (!bLocal && this.layerId) { + this.request = Helper.normalyzeParameters({ layerId: this.layerId }); + } + success.call(this, this.request); + }; + AutoConf.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + layerId: this.options.layerId, + response: this.response, + rawResponse: this.options.rawResponse, + onSuccess: success, + onError: error, + scope: this + }; + AutoConfResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return AutoConf; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper, ServicesDefaultUrlService, ServicesCommonService, ServicesAutoConfResponseAutoConfResponseFactory); + FormatsXLSRequestHeader = function (Logger) { + function RequestHeader(options) { + if (!(this instanceof RequestHeader)) { + throw new TypeError('RequestHeader constructor cannot be called as a function.'); + } + this.options = options || { srsName: 'EPSG:4326' }; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + RequestHeader.prototype = { + requestString: null, + template: '', + constructor: RequestHeader, + toString: function () { + var template = null; + template = this.template; + template = template.replace(/__SRSNAME__/g, this.options.srsName); + this.requestString = template; + return this.requestString; + } + }; + return RequestHeader; + }(UtilsLoggerByDefault); + FormatsXLSRequest = function (Logger) { + function Request(options) { + if (!(this instanceof Request)) { + throw new TypeError('Request constructor cannot be called as a function.'); + } + this.options = options || { + maximumResponses: 25, + methodName: null, + version: '1.2' + }; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + Request.prototype = { + requestString: null, + template: '' + '' + '', + constructor: Request, + guid: function () { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0; + var v = c === 'x' ? r : r & 3 | 8; + return v.toString(16); + }); + }, + toString: function () { + var template = null; + template = this.template; + template = template.replace(/__MAXRESPONSES__/g, this.options.maximumResponses); + template = template.replace(/__METHODNAME__/g, this.options.methodName); + template = template.replace(/__UUID__/g, this.guid()); + template = template.replace(/__VERSION__/g, this.options.version); + this.requestString = template; + return this.requestString; + } + }; + return Request; + }(UtilsLoggerByDefault); + FormatsXLSAbstractService = function (Logger) { + function AbstractService(options) { + if (!(this instanceof AbstractService)) { + throw new TypeError('AbstractService constructor cannot be called as a function.'); + } + this.options = options || {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + AbstractService.prototype = { + strRequest: null, + oRequest: null, + oFilter: null, + constructor: AbstractService, + addRequest: function (oRequest) { + }, + addFilter: function (oFilter) { + }, + toString: function () { + } + }; + return AbstractService; + }(UtilsLoggerByDefault); + FormatsXLS = function (Logger, RequestHeader, Request, AbstractService) { + function XLS(options) { + if (!(this instanceof XLS)) { + throw new TypeError('XLS constructor cannot be called as a function.'); + } + this.options = { + srsName: 'EPSG:4326', + maximumResponses: 25 + }; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + if (options[opt]) { + this.options[opt] = options[opt]; + } + } + } + } + XLS.VERSION = '1.2'; + XLS.prototype = { + requestString: null, + namespace: false, + oService: null, + constructor: XLS, + template: '\n' + '\n' + '__REQUESTHEADER__\n' + '__REQUEST__\n' + '\n', + namespaceByDefault: function () { + var ns = [ + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', + 'xmlns:xls="http://www.opengis.net/xls"', + 'xmlns:gml="http://www.opengis.net/gml"' + ]; + return ns.join(' '); + }, + schemaLocationByDefault: function () { + return 'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"'; + }, + setService: function (oService) { + if (!oService) { + return; + } + if (oService instanceof AbstractService) { + this.oService = oService; + } else { + } + }, + getService: function () { + return this.oService; + } + }; + XLS.prototype.addNamespace = function (ns, request) { + var keyNS = ns.key; + var bFound = false; + var allNS = this.namespaceByDefault().split(' '); + for (var index = 0; index < allNS.length; index++) { + var element = allNS[index]; + var map = element.split('='); + var key = map[0]; + if (key === 'xmlns:' + keyNS) { + bFound = true; + break; + } + } + if (!bFound) { + return request; + } + var regex; + var subst; + regex = /<(\w+[\s>])/g; + subst = '<' + keyNS + ':$1'; + request = request.replace(regex, subst); + regex = /<\/(\w+[\s>])/g; + subst = '/g, this.getService().toString()); + } + if (!template) { + return; + } + if (this.namespace) { + template = this.addNamespace({ + key: 'xls', + url: 'http://www.opengis.net/xls' + }, template); + } + this.requestString = template; + return this.requestString; + }; + return XLS; + }(UtilsLoggerByDefault, FormatsXLSRequestHeader, FormatsXLSRequest, FormatsXLSAbstractService); + FormatsXLSLocationUtilityServiceModelAddress = function (Gp, Logger) { + function Address(options) { + if (!(this instanceof Address)) { + throw new TypeError('Address constructor cannot be called as a function.'); + } + this.options = options || { + location: {}, + type: ['StreetAddress'], + filter: {} + }; + if (!options.location) { + throw new Error('l\'option \'location\' n\'est pas renseignée !'); + } + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + Address.prototype = { + constructor: Address, + requestString: null, + template: { + address: '
' + '__LOCATION__' + '__PLACE__' + '__POSTALCODE__' + '__ENVELOPE__' + '
', + location: { + freeFormAddress: '__FREEFORMADDRESSVALUE__', + streetAddress: { + container: '' + '__STREET__' + '__BUILDING__' + '', + building: '', + street: '__STREETVALUE__' + } + }, + place: '__PLACEVALUE__', + postalCode: '__POSTALCODEVALUE__', + envelope: '' + '__LEFT__ __BOTTOM__' + '__RIGHT__ __TOP__' + '' + } + }; + Address.prototype.toString = function () { + var template = null; + template = this.template.address; + template = template.replace(/__COUNTRYCODE__/g, this.options.type); + if (typeof this.options.location === 'string') { + var tmplFreeFormAddress = this.template.location.freeFormAddress; + tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location); + template = template.replace(/__LOCATION__/g, tmplFreeFormAddress); + } else { + var tmplBuilding = ''; + var tmplStreet = ''; + if (this.options.location.number) { + tmplBuilding = this.template.location.streetAddress.building; + tmplBuilding = tmplBuilding.replace(/__BUILDINGVALUE__/g, this.options.location.number); + } + if (this.options.location.street) { + tmplStreet = this.template.location.streetAddress.street; + tmplStreet = tmplStreet.replace(/__STREETVALUE__/g, this.options.location.street); + } + var tmplStreetAddress = this.template.location.streetAddress.container; + tmplStreetAddress = tmplStreetAddress.replace(/__STREET__/g, tmplStreet); + tmplStreetAddress = tmplStreetAddress.replace(/__BUILDING__/g, tmplBuilding); + template = template.replace(/__LOCATION__/g, tmplStreetAddress); + } + var tmplPostalCode = ''; + if (this.options.location.postalCode) { + tmplPostalCode = this.template.postalCode; + tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode); + } + var tmplEnvelope = ''; + if (this.options.filter) { + var bbox = this.options.filter.bbox; + if (bbox) { + tmplEnvelope = this.template.envelope; + tmplEnvelope = tmplEnvelope.replace(/__LEFT__/g, bbox.left); + tmplEnvelope = tmplEnvelope.replace(/__BOTTOM__/g, bbox.bottom); + tmplEnvelope = tmplEnvelope.replace(/__RIGHT__/g, bbox.right); + tmplEnvelope = tmplEnvelope.replace(/__TOP__/g, bbox.top); + } + } + var Places = []; + var tmplPlace = ''; + if (this.options.filter) { + var filters = this.options.filter; + for (var filter in filters) { + if (filter === 'bbox') { + continue; + } + tmplPlace = this.template.place; + tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter); + tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]); + Places.push(tmplPlace); + } + } + var tmplPlaceCity = ''; + if (this.options.location.city) { + tmplPlaceCity = this.template.place; + tmplPlaceCity = tmplPlaceCity.replace(/__PLACETYPE__/g, 'Municipality'); + tmplPlaceCity = tmplPlaceCity.replace(/__PLACEVALUE__/g, this.options.location.city); + Places.push(tmplPlaceCity); + } + template = template.replace(/__POSTALCODE__/g, tmplPostalCode); + template = template.replace(/__PLACE__/g, Places.join('\n')); + template = template.replace(/__ENVELOPE__/g, tmplEnvelope); + this.requestString = template; + return this.requestString; + }; + return Address; + }(Gp, UtilsLoggerByDefault); + FormatsXLSLocationUtilityServiceGeocodeFilterExtension = function (Logger) { + function GeocodeFilterExtension() { + if (!(this instanceof GeocodeFilterExtension)) { + throw new TypeError('GeocodeFilterExtension constructor cannot be called as a function.'); + } + this.filters = []; + } + GeocodeFilterExtension.prototype = { + constructor: GeocodeFilterExtension, + addFilterExtensions: function (oGeocodeLocation) { + if (oGeocodeLocation) { + this.filters.push(oGeocodeLocation); + } + }, + getNames: function () { + var names = []; + for (var idx in this.filters) { + names.push(this.filters[idx].CLASSNAME); + } + return names; + }, + getFilter: function (name) { + var filter = null; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME == name) { + filter = this.filters[idx]; + } + } + return filter; + }, + getFilters: function () { + return this.filters; + }, + getAttributs: function (name) { + var attributs = []; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME == name) { + attributs = this.filters[idx].attributesList; + } + } + return attributs; + }, + setPlaceAttributs: function (name, options) { + var filter = this.getFilter(name); + var attributs = this.getAttributs(name); + for (var idx in attributs) { + var value = attributs[idx]; + if (options[value]) { + filter.placeAttributes[value] = options[value]; + } + } + }, + getPlaceAttributs: function (name) { + var places = {}; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME == name) { + places = this.filters[idx].placeAttributes; + } + } + return places; + } + }; + return GeocodeFilterExtension; + }(UtilsLoggerByDefault); + FormatsXLSLocationUtilityServiceGeocodeRequest = function (Logger, Address, GeocodeFilterExtension) { + function GeocodeRequest(options) { + if (!(this instanceof GeocodeRequest)) { + throw new TypeError('GeocodeRequest constructor cannot be called as a function.'); + } + this.options = options || {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + this.CLASSNAME = 'GeocodeRequest'; + } + GeocodeRequest.prototype = { + strRequest: null, + oAddress: null, + oFilter: null, + template: '' + '__ADDRESS__' + '', + addAddress: function (oAddress) { + if (oAddress instanceof Address) { + this.oAddress = oAddress; + } + }, + addFilter: function (oFilter) { + if (oFilter instanceof GeocodeFilterExtension) { + this.oFilter = oFilter; + } + }, + constructor: GeocodeRequest, + toString: function () { + var template = ''; + template = this.template; + if (!this.oAddress) { + var settings = {}; + settings.location = this.options.location; + settings.type = this.options.filterOptions.type || ['StreetAddress']; + settings.filter = this.options.filterOptions; + delete settings.filter.type; + if (this.oFilter) { + settings.filter = {}; + for (var idx in settings.type) { + var filter = settings.type[idx]; + var oFilter = this.oFilter.getFilter(filter); + if (!oFilter) { + continue; + } + var mFilter = this.options.filterOptions; + var attributs = oFilter.attributesList; + for (var idxe = 0; idxe < attributs.length; idxe++) { + var key = attributs[idxe]; + if (mFilter[key]) { + var matchingKey = oFilter.serviceAttributes[idxe]; + oFilter.placeAttributes[matchingKey] = mFilter[key]; + } + } + var places = oFilter.placeAttributes; + for (var kplace in places) { + if (places.hasOwnProperty(kplace)) { + settings.filter[kplace] = places[kplace]; + } + } + } + } + this.oAddress = new Address(settings); + if (!this.oAddress) { + throw new Error('La construction de l\'adresse n\'est pas correctement definie !?'); + } + } + template = template.replace(/__ADDRESS__/g, this.oAddress.toString()); + template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false'); + this.strRequest = template; + return this.strRequest; + } + }; + return GeocodeRequest; + }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelAddress, FormatsXLSLocationUtilityServiceGeocodeFilterExtension); + FormatsXLSLocationUtilityServiceModelPosition = function (Logger) { + function Position(options) { + if (!(this instanceof Position)) { + throw new TypeError('Position constructor cannot be called as a function.'); + } + this.options = options || {}; + if (!options.position) { + throw new Error('l\'option \'position\' n\'est pas renseignée !'); + } + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + Position.prototype = { + constructor: Position, + requestString: null, + template: { + position: '' + '__GMLPOINT__' + '__GMLFILTER__' + '', + gml: { + point: '__X__ __Y__', + pos: null, + filter: { + bbox: '' + '__LEFT__ __BOTTOM__' + '__RIGHT__ __TOP__' + '', + circle: '__X__ __Y____RADIUS__', + polygon: '__XY__', + multipolygon: null + } + } + } + }; + Position.prototype.toString = function () { + var template = this.template.position; + var tmplGmlPoint = this.template.gml.point; + tmplGmlPoint = tmplGmlPoint.replace(/__X__/g, this.options.position.x); + tmplGmlPoint = tmplGmlPoint.replace(/__Y__/g, this.options.position.y); + var tmplGmlFilter = ''; + if (this.options.filter) { + var filter = this.options.filter; + for (var name in filter) { + switch (name) { + case 'circle': + tmplGmlFilter = this.template.gml.filter[name]; + tmplGmlFilter = tmplGmlFilter.replace(/__X__/g, filter[name].x); + tmplGmlFilter = tmplGmlFilter.replace(/__Y__/g, filter[name].y); + tmplGmlFilter = tmplGmlFilter.replace(/__RADIUS__/g, filter[name].radius); + break; + case 'bbox': + tmplGmlFilter = this.template.gml.filter[name]; + tmplGmlFilter = tmplGmlFilter.replace(/__LEFT__/g, filter[name].left); + tmplGmlFilter = tmplGmlFilter.replace(/__BOTTOM__/g, filter[name].bottom); + tmplGmlFilter = tmplGmlFilter.replace(/__RIGHT__/g, filter[name].right); + tmplGmlFilter = tmplGmlFilter.replace(/__TOP__/g, filter[name].top); + break; + case 'polygon': + tmplGmlFilter = this.template.gml.filter[name]; + var strPoints = ''; + var lstPoints = filter[name]; + for (var i = 0; i < lstPoints.length; i++) { + var coord = lstPoints[i]; + if (Array.isArray(coord)) { + break; + } + if (coord.x && coord.y || (coord.x === 0 || coord.y === 0)) { + strPoints += coord.x + ' ' + coord.y; + } + if (lstPoints.length !== i + 1) { + strPoints += ' '; + } + } + tmplGmlFilter = tmplGmlFilter.replace(/__XY__/g, strPoints); + break; + case 'multipolygon': + break; + default: + } + } + } + template = template.replace(/__GMLPOINT__/g, tmplGmlPoint); + template = template.replace(/__GMLFILTER__/g, tmplGmlFilter); + this.requestString = template; + return this.requestString; + }; + return Position; + }(UtilsLoggerByDefault); + FormatsXLSLocationUtilityServiceModelPreference = function (Logger) { + function Preference(type) { + if (!(this instanceof Preference)) { + throw new TypeError('Preference constructor cannot be called as a function.'); + } + this.type = type; + } + Preference.prototype = { + constructor: Preference, + requestString: null, + template: '__TYPE__' + }; + Preference.prototype.toString = function () { + var Preferences = []; + var tmplPreference = ''; + for (var idx = 0; idx < this.type.length; idx++) { + tmplPreference = this.template; + tmplPreference = tmplPreference.replace(/__TYPE__/g, this.type[idx]); + Preferences.push(tmplPreference); + } + this.strRequest = Preferences.join('\n'); + return this.strRequest; + }; + return Preference; + }(UtilsLoggerByDefault); + FormatsXLSLocationUtilityServiceReverseGeocodeRequest = function (Logger, Position, Preference) { + function ReverseGeocodeRequest(options) { + if (!(this instanceof ReverseGeocodeRequest)) { + throw new TypeError('ReverseGeocodeRequest constructor cannot be called as a function.'); + } + this.options = options || {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + this.CLASSNAME = 'ReverseGeocodeRequest'; + } + ReverseGeocodeRequest.prototype = { + strRequest: null, + oPosition: null, + oPreference: null, + constructor: ReverseGeocodeRequest, + template: '' + '__POSITION__' + '__PREFERENCE__' + '', + addPosition: function (oPosition) { + if (oPosition instanceof Position) { + this.oPosition = oPosition; + } + }, + addPreferences: function (oPreference) { + if (oPreference instanceof Preference) { + this.oPreference = oPreference; + } + }, + toString: function () { + var template = ''; + template = this.template; + if (!this.oPreference) { + this.oPreference = new Preference(this.options.filterOptions.type || ['StreetAddress']); + if (!this.oPreference) { + throw new Error('Les preferences ne sont pas definies !?'); + } + } + template = template.replace(/__PREFERENCE__/g, this.oPreference.toString()); + if (!this.oPosition) { + var settings = { + position: this.options.position, + filter: {} + }; + if (this.options.filterOptions) { + settings.filter = this.options.filterOptions; + delete settings.filter.type; + } + this.oPosition = new Position(settings); + if (!this.oPosition) { + throw new Error('La position et ses filtres ne sont pas definis !?'); + } + } + template = template.replace(/__POSITION__/g, this.oPosition.toString()); + template = template.replace(/__RETURNFREEFORM__/g, this.options.returnFreeForm ? 'true' : 'false'); + this.strRequest = template; + return this.strRequest; + } + }; + return ReverseGeocodeRequest; + }(UtilsLoggerByDefault, FormatsXLSLocationUtilityServiceModelPosition, FormatsXLSLocationUtilityServiceModelPreference); + FormatsXLSLocationUtilityService = function (Logger, AbstractService, GeocodeRequest, ReverseGeocodeRequest, GeocodeFilterExtension) { + function LocationUtilityService(options) { + if (!(this instanceof LocationUtilityService)) { + throw new TypeError('LocationUtilityService constructor cannot be called as a function.'); + } + this.CLASSNAME = 'LocationUtilityService'; + this.CLASSTYPE = null; + AbstractService.apply(this, arguments); + if (this.options) { + this.CLASSTYPE = this.options.location ? 'GeocodeRequest' : this.options.position ? 'ReverseGeocodeRequest' : null; + } + } + LocationUtilityService.prototype = Object.create(AbstractService.prototype, {}); + LocationUtilityService.prototype.constructor = LocationUtilityService; + LocationUtilityService.prototype.addRequest = function (oLUSRequest) { + this.CLASSTYPE = oLUSRequest.CLASSNAME; + switch (this.CLASSTYPE) { + case 'GeocodeRequest': + case 'ReverseGeocodeRequest': + this.oRequest = oLUSRequest; + break; + default: + throw new Error('Ce n\'est pas un objet de type \'LUS Request\' !?'); + } + }; + LocationUtilityService.prototype.addFilter = function (oFilter) { + if (oFilter instanceof GeocodeFilterExtension) { + this.oFilter = oFilter; + } + }; + LocationUtilityService.prototype.toString = function () { + if (!this.oRequest) { + if (!this.options) { + throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !'); + } + if (this.CLASSTYPE === 'GeocodeRequest') { + var settingsDirect = { + location: this.options.location, + returnFreeForm: this.options.returnFreeForm, + filterOptions: this.options.filterOptions || {} + }; + this.oRequest = new GeocodeRequest(settingsDirect); + if (this.oFilter) { + this.oRequest.addFilter(this.oFilter); + } + } else if (this.CLASSTYPE === 'ReverseGeocodeRequest') { + var settingsInv = { + position: this.options.position, + returnFreeForm: this.options.returnFreeForm, + filterOptions: this.options.filterOptions || {} + }; + this.oRequest = new ReverseGeocodeRequest(settingsInv); + } else { + } + } + if (!this.oRequest) { + throw new Error('Type de Geocodage indefini !'); + } + this.strRequest = this.oRequest.toString(); + return this.strRequest; + }; + return LocationUtilityService; + }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSLocationUtilityServiceGeocodeRequest, FormatsXLSLocationUtilityServiceReverseGeocodeRequest, FormatsXLSLocationUtilityServiceGeocodeFilterExtension); + ServicesGeocodeRequestGeocodeLocation = function () { + function GeocodeLocation() { + if (!(this instanceof GeocodeLocation)) { + throw new TypeError('GeocodeLocation constructor cannot be called as a function.'); + } + this.placeAttributes = {}; + this.attributesList = []; + this.serviceAttributes = []; + } + GeocodeLocation.prototype = { constructor: GeocodeLocation }; + return GeocodeLocation; + }(); + ServicesGeocodeRequestModelStreetAddress = function (GeocodeLocation) { + function StreetAddress() { + if (!(this instanceof StreetAddress)) { + throw new TypeError('StreetAddress constructor cannot be called as a function.'); + } + GeocodeLocation.apply(this, arguments); + this.CLASSNAME = 'StreetAddress'; + this.attributesList = [ + 'bbox', + 'ID', + 'IDTR', + 'quality', + 'territory', + 'commune', + 'department', + 'insee', + 'municipality' + ]; + this.serviceAttributes = [ + 'bbox', + 'ID', + 'IDTR', + 'Qualite', + 'Territoire', + 'Commune', + 'Departement', + 'INSEE', + 'Municipality' + ]; + } + StreetAddress.prototype = Object.create(GeocodeLocation.prototype); + StreetAddress.prototype.constructor = StreetAddress; + return StreetAddress; + }(ServicesGeocodeRequestGeocodeLocation); + ServicesGeocodeRequestModelPositionOfInterest = function (GeocodeLocation) { + function PositionOfInterest() { + if (!(this instanceof PositionOfInterest)) { + throw new TypeError('PositionOfInterest constructor cannot be called as a function.'); + } + GeocodeLocation.apply(this, arguments); + this.CLASSNAME = 'PositionOfInterest'; + this.attributesList = [ + 'bbox', + 'importance', + 'nature', + 'territory', + 'commune', + 'department', + 'insee', + 'municipality' + ]; + this.serviceAttributes = [ + 'bbox', + 'Importance', + 'Nature', + 'Territoire', + 'Commune', + 'Departement', + 'INSEE', + 'Municipality' + ]; + } + PositionOfInterest.prototype = Object.create(GeocodeLocation.prototype); + PositionOfInterest.prototype.constructor = PositionOfInterest; + return PositionOfInterest; + }(ServicesGeocodeRequestGeocodeLocation); + ServicesGeocodeRequestModelCadastralParcel = function (GeocodeLocation) { + function CadastralParcel() { + if (!(this instanceof CadastralParcel)) { + throw new TypeError('CadastralParcel constructor cannot be called as a function.'); + } + GeocodeLocation.apply(this, arguments); + this.CLASSNAME = 'CadastralParcel'; + this.attributesList = [ + 'absorbedCity', + 'sheet', + 'number', + 'section', + 'commune', + 'department', + 'insee', + 'municipality', + 'origin' + ]; + this.serviceAttributes = [ + 'CommuneAbsorbee', + 'Feuille', + 'Numero', + 'Section', + 'Commune', + 'Departement', + 'INSEE', + 'Municipality', + 'Type' + ]; + } + CadastralParcel.prototype = Object.create(GeocodeLocation.prototype); + CadastralParcel.prototype.constructor = CadastralParcel; + return CadastralParcel; + }(ServicesGeocodeRequestGeocodeLocation); + ServicesGeocodeRequestModelAdministratif = function (GeocodeLocation) { + function Administratif() { + if (!(this instanceof Administratif)) { + throw new TypeError('Administratif constructor cannot be called as a function.'); + } + GeocodeLocation.apply(this, arguments); + this.CLASSNAME = 'Administratif'; + this.attributesList = [ + 'bbox', + 'prefecture', + 'inseeRegion', + 'inseeDepartment', + 'municipality' + ]; + this.serviceAttributes = [ + 'bbox', + 'Prefecture', + 'InseeRegion', + 'InseeDepartement', + 'Municipality' + ]; + } + Administratif.prototype = Object.create(GeocodeLocation.prototype); + Administratif.prototype.constructor = Administratif; + return Administratif; + }(ServicesGeocodeRequestGeocodeLocation); + ServicesGeocodeRequestDirectGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService, GeocodeFilterExtension, StreetAddress, PositionOfInterest, CadastralParcel, Administratif) { + var DirectGeocodeRequestFactory = { + build: function (options) { + var request = null; + var oFilter = new GeocodeFilterExtension(); + oFilter.addFilterExtensions(new Administratif()); + oFilter.addFilterExtensions(new StreetAddress()); + oFilter.addFilterExtensions(new PositionOfInterest()); + oFilter.addFilterExtensions(new CadastralParcel()); + var oLUS = new LocationUtilityService({ + location: options.location, + returnFreeForm: options.returnFreeForm, + filterOptions: options.filterOptions + }); + oLUS.addFilter(oFilter); + var oXLS = new XLS({ + srsName: options.srs, + maximumResponses: options.maximumResponses + }); + oXLS.namespace = true; + oXLS.setService(oLUS); + request = oXLS.build(); + if (options.httpMethod == 'GET') { + var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29'); + request = myRequest; + } + return request; + } + }; + return DirectGeocodeRequestFactory; + }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService, FormatsXLSLocationUtilityServiceGeocodeFilterExtension, ServicesGeocodeRequestModelStreetAddress, ServicesGeocodeRequestModelPositionOfInterest, ServicesGeocodeRequestModelCadastralParcel, ServicesGeocodeRequestModelAdministratif); + ServicesGeocodeResponseModelGeocodeResponse = function () { + function GeocodeResponse() { + if (!(this instanceof GeocodeResponse)) { + throw new TypeError('GeocodeResponse constructor cannot be called as a function.'); + } + this.locations = []; + } + GeocodeResponse.prototype = { constructor: GeocodeResponse }; + return GeocodeResponse; + }(); + ServicesGeocodeResponseModelGeocodedLocation = function () { + function GeocodedLocation() { + if (!(this instanceof GeocodedLocation)) { + throw new TypeError('GeocodedLocation constructor cannot be called as a function.'); + } + this.position = { + x: null, + y: null + }; + this.matchType = null; + this.placeAttributes = {}; + this.type = null; + } + GeocodedLocation.prototype = { constructor: GeocodedLocation }; + return GeocodedLocation; + }(); + ServicesGeocodeResponseModelDirectGeocodedLocation = function (GeocodedLocation) { + function DirectGeocodedLocation() { + if (!(this instanceof DirectGeocodedLocation)) { + throw new TypeError('DirectGeocodedLocation constructor cannot be called as a function.'); + } + GeocodedLocation.apply(this, arguments); + this.CLASSNAME = 'DirectGeocodedLocation'; + this.accuracy = null; + } + DirectGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype); + DirectGeocodedLocation.prototype.constructor = DirectGeocodedLocation; + return DirectGeocodedLocation; + }(ServicesGeocodeResponseModelGeocodedLocation); + ServicesGeocodeFormatsDirectGeocodeResponseReader = function (Logger, MR, ErrSrv, GeocodeResponse, DirectGeocodedLocation) { + var DirectGeocodeResponseReader = {}; + DirectGeocodeResponseReader.VERSION = '1.2'; + DirectGeocodeResponseReader.NAMESPACES = { + xmlns: 'http://www.opengis.net/xls', + gml: 'http://www.opengis.net/gml', + xls: 'http://www.opengis.net/xls', + xlsext: 'http://www.opengis.net/xlsext', + xsi: 'http://www.w3.org/2001/XMLSchema-instance' + }; + DirectGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd'; + DirectGeocodeResponseReader.DEFAULTPREFIX = 'xls'; + DirectGeocodeResponseReader.READERS = { + xls: { + XLS: function (root) { + var geocodeResponse = new GeocodeResponse(); + __checkServiceAttributes(root); + __getChildNodes(root, geocodeResponse); + return geocodeResponse; + }, + GeocodedAddress: function (node, geocodeResponse) { + var geocodedLocation = new DirectGeocodedLocation(); + __getChildNodes(node, geocodedLocation); + if (geocodeResponse && Array.isArray(geocodeResponse.locations)) { + geocodeResponse.locations.push(geocodedLocation); + } + }, + GeocodeMatchCode: function (node, geocodedLocation) { + var acc = node.getAttribute('accuracy'); + if (acc && geocodedLocation) { + geocodedLocation.accuracy = parseFloat(acc); + } + var matchType = node.getAttribute('matchType'); + if (matchType && geocodedLocation) { + geocodedLocation.matchType = matchType; + } + }, + Address: function (node, geocodedLocation) { + var countrycode = node.getAttribute('countryCode'); + if (geocodedLocation && countrycode) { + geocodedLocation.type = countrycode; + } + __getChildNodes(node, geocodedLocation); + }, + freeFormAddress: function (node, geocodedLocation) { + if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) { + geocodedLocation.placeAttributes.freeform = __getChildValue(node); + } + }, + Building: function (node, geocodedLocation) { + var num = node.getAttribute('number'); + if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) { + if (num) { + geocodedLocation.placeAttributes.number = num; + } else if (node.getAttribute('buildingName')) { + geocodedLocation.placeAttributes.number = node.getAttribute('buildingName'); + } else if (node.getAttribute('subdivision')) { + geocodedLocation.placeAttributes.number = node.getAttribute('subdivision'); + } + } + }, + Street: function (node, geocodedLocation) { + if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) { + if (geocodedLocation.type === 'StreetAddress') { + geocodedLocation.placeAttributes.street = __getChildValue(node); + } else if (geocodedLocation.type === 'CadastralParcel') { + geocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node); + } + } + }, + Place: function (node, geocodedLocation) { + var placeType = node.getAttribute('type'); + var placeName = __getChildValue(node); + if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) { + if (placeType === 'Municipality') { + geocodedLocation.placeAttributes.municipality = placeName; + } else if (placeType === 'Bbox') { + var values = placeName.split(';'); + if (values.length === 4) { + geocodedLocation.placeAttributes.bbox = { + left: parseFloat(values[0]), + right: parseFloat(values[2]), + top: parseFloat(values[1]), + bottom: parseFloat(values[3]) + }; + } + } else if (placeType === 'Commune') { + geocodedLocation.placeAttributes.commune = placeName; + } else if (placeType === 'Departement') { + geocodedLocation.placeAttributes.department = placeName; + } else if (placeType === 'INSEE') { + geocodedLocation.placeAttributes.insee = placeName; + } else if (placeType === 'Qualite') { + geocodedLocation.placeAttributes.quality = placeName; + } else if (placeType === 'Territoire') { + geocodedLocation.placeAttributes.territory = placeName; + } else if (placeType === 'ID') { + geocodedLocation.placeAttributes.ID = placeName; + } else if (placeType === 'ID_TR') { + geocodedLocation.placeAttributes.IDTR = placeName; + } else if (placeType === 'Importance') { + geocodedLocation.placeAttributes.importance = parseInt(placeName, 10); + } else if (placeType === 'Nature') { + geocodedLocation.placeAttributes.nature = placeName; + } else if (placeType === 'Numero') { + geocodedLocation.placeAttributes.number = placeName; + } else if (placeType === 'Feuille') { + geocodedLocation.placeAttributes.sheet = placeName; + } else if (placeType === 'Section') { + geocodedLocation.placeAttributes.section = placeName; + } else if (placeType === 'CommuneAbsorbee') { + geocodedLocation.placeAttributes.absorbedCity = placeName; + } else if (placeType === 'Arrondissement') { + if (placeName) { + geocodedLocation.placeAttributes.arrondissement = placeName; + } + } else if (placeType === 'Type') { + geocodedLocation.placeAttributes.origin = placeName; + } else if (placeType === 'Prefecture') { + geocodedLocation.placeAttributes.prefecture = placeName; + } else if (placeType === 'InseeRegion') { + geocodedLocation.placeAttributes.inseeRegion = placeName; + } else if (placeType === 'InseeDepartment') { + geocodedLocation.placeAttributes.inseeDepartment = placeName; + } + } + }, + PostalCode: function (node, geocodedLocation) { + if (geocodedLocation && geocodedLocation.hasOwnProperty('placeAttributes')) { + geocodedLocation.placeAttributes.postalCode = __getChildValue(node); + } + }, + Error: function (node) { + var srvMess = node.getAttribute('message'); + var errorCode = node.getAttribute('errorCode'); + var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess); + throw new ErrSrv({ + message: message, + type: ErrSrv.TYPE_SRVERR + }); + } + }, + gml: { + pos: function (node, geocodedLocation) { + var pos = __getChildValue(node); + if (geocodedLocation && pos) { + geocodedLocation.position = { + x: parseFloat(pos.split(' ')[0]), + y: parseFloat(pos.split(' ')[1]) + }; + } + } + }, + ExceptionReport: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeName === 'Exception') { + response.exceptionReport = DirectGeocodeResponseReader.READERS['Exception'](child); + } + } + } + return response; + }, + Exception: function (node) { + var exceptionReport = {}; + var exceptionCode = node.getAttribute('exceptionCode'); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + } + }; + DirectGeocodeResponseReader.read = function (root) { + if (root.nodeName === 'XLS') { + var nsPrefix = root.prefix; + if (!nsPrefix) { + nsPrefix = DirectGeocodeResponseReader.DEFAULTPREFIX; + } + var geocodeResponse = DirectGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root); + return geocodeResponse; + } else if (root.nodeName === 'ExceptionReport') { + var exceptionReport = DirectGeocodeResponseReader.READERS[root.nodeName](root); + return exceptionReport; + } else { + var mess = MR.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName); + throw new ErrSrv({ + message: mess, + type: ErrSrv.TYPE_UNKERR, + status: 200 + }); + } + }; + function __getAttributes(node) { + if (node.attributes.length > 0) { + var nodeAttributes = {}; + var attributes = node.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + nodeAttributes[attribute.nodeName] = attribute.nodeValue; + } + return nodeAttributes; + } + } + function __getChildNodes(node, data) { + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + var childName; + var childPrefix; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + childPrefix = child.prefix || DirectGeocodeResponseReader.DEFAULTPREFIX; + if (DirectGeocodeResponseReader.READERS[childPrefix][childName]) { + var reader = DirectGeocodeResponseReader.READERS[childPrefix][childName]; + reader(child, data); + } else { + __getChildNodes(child, data); + } + } + } + } + } + function __getChildValue(node) { + var textNode; + var value = ''; + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode.nodeType === 3) { + value = textNode.nodeValue; + } + } + return value; + } + function __checkServiceAttributes(XLSNode) { + if (XLSNode.attributes.length > 0) { + var xlsAttributes = __getAttributes(XLSNode); + for (var att in xlsAttributes) { + if (xlsAttributes.hasOwnProperty(att)) { + if (att === 'version') { + if (xlsAttributes['version'] !== DirectGeocodeResponseReader.VERSION) { + console.log('[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing'); + return; + } + } + if (att === 'xmlns') { + if (xlsAttributes[att] !== DirectGeocodeResponseReader.NAMESPACES[DirectGeocodeResponseReader.DEFAULTPREFIX]) { + console.log('[DirectGeocodeResponseReader] geocode response default namespace is not the expected one'); + return; + } + continue; + } + var prefix = att.split(':')[0]; + var ns = att.split(':')[1]; + if (prefix === 'xmlns' && ns) { + if (DirectGeocodeResponseReader.NAMESPACES[ns]) { + if (DirectGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) { + console.log('[DirectGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one'); + return; + } + } + } + if (ns === 'schemaLocation') { + if (DirectGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) { + console.log('[DirectGeocodeResponseReader] geocode response schema location is not the expected one'); + return; + } + } + } + } + } + } + return DirectGeocodeResponseReader; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelDirectGeocodedLocation); + ServicesGeocodeResponseDirectGeocodeResponseFactory = function (Logger, ErrorService, MRes, XML, DirectGeocodeResponseReader) { + var DirectGeocodeReponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + try { + var p = new XML({ reader: DirectGeocodeResponseReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new Error('L\'analyse de la réponse du service !?'); + } + } catch (e) { + var message = e.message; + if (typeof options.response === 'string') { + message += '(\'' + options.response + '\')'; + } else { + message += '(\'' + options.response.documentElement.innerHTML + '\')'; + } + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE', message), + type: ErrorService.TYPE_UNKERR, + status: -1 + })); + return; + } + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'), + type: ErrorService.TYPE_SRVERR, + status: -1 + })); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return DirectGeocodeReponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesGeocodeFormatsDirectGeocodeResponseReader); + ServicesGeocodeGeocode = function (Logger, _, ErrorService, CommonService, DirectGeocodeRequestFactory, DirectGeocodeResponseFactory) { + function Geocode(options) { + if (!(this instanceof Geocode)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Geocode')); + } + this.CLASSNAME = 'Geocode'; + CommonService.apply(this, arguments); + if (!options.location) { + throw new Error(_.getMessage('PARAM_MISSING', 'location')); + } + if (typeof options.location === 'object' && Object.keys(options.location).length === 0) { + throw new Error(_.getMessage('PARAM_EMPTY', 'location')); + } else if (typeof options.location === 'string' && options.location.length === 0) { + throw new Error(_.getMessage('PARAM_EMPTY', 'location')); + } + this.options.location = options.location; + if (!options.filterOptions || typeof options.filterOptions !== 'object') { + this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] }; + } + if (Object.keys(options.filterOptions).length === 0) { + this.options.filterOptions = { type: ['StreetAddress'] }; + } + var filter = Object.keys(options.filterOptions); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + var filtersCouldBeNumberList = [ + 'department', + 'number', + 'postalCode', + 'insee', + 'importance', + 'ID', + 'IDTR', + 'absorbedCity', + 'sheet', + 'section', + 'inseeRegion', + 'inseeDepartment' + ]; + if (filtersCouldBeNumberList.indexOf(key) !== -1 && typeof options.filterOptions[key] !== 'string') { + options.filterOptions[key] = options.filterOptions[key].toString(); + } + if (!options.filterOptions[key]) { + delete this.options.filterOptions[key]; + } + } + this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress']; + this.options.maximumResponses = options.maximumResponses || 25; + this.options.returnFreeForm = options.returnFreeForm || false; + this.options.srs = options.srs || 'EPSG:4326'; + this.options.outputFormat = 'xml'; + } + Geocode.prototype = Object.create(CommonService.prototype, {}); + Geocode.prototype.constructor = Geocode; + Geocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod: this.options.httpMethod, + location: this.options.location, + returnFreeForm: this.options.returnFreeForm, + filterOptions: this.options.filterOptions, + srs: this.options.srs, + maximumResponses: this.options.maximumResponses + }; + this.request = DirectGeocodeRequestFactory.build(options); + if (!this.request) { + error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD'))); + } else { + success.call(this, this.request); + } + }; + Geocode.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + DirectGeocodeResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return Geocode; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestDirectGeocodeRequestFactory, ServicesGeocodeResponseDirectGeocodeResponseFactory); + ServicesGeocodeRequestReverseGeocodeRequestFactory = function (Logger, XLS, LocationUtilityService) { + var ReverseGeocodeRequestFactory = { + build: function (options) { + var settings = options || {}; + var request = null; + var oLUS = new LocationUtilityService({ + position: settings.position, + returnFreeForm: settings.returnFreeForm, + filterOptions: settings.filterOptions + }); + var oXLS = new XLS({ + srsName: settings.srs, + maximumResponses: settings.maximumResponses + }); + oXLS.namespace = true; + oXLS.setService(oLUS); + request = oXLS.build(); + if (settings.httpMethod == 'GET') { + var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29'); + request = myRequest; + } + return request; + } + }; + return ReverseGeocodeRequestFactory; + }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSLocationUtilityService); + ServicesGeocodeResponseModelReverseGeocodedLocation = function (GeocodedLocation) { + function ReverseGeocodedLocation() { + if (!(this instanceof ReverseGeocodedLocation)) { + throw new TypeError('ReverseGeocodedLocation constructor cannot be called as a function.'); + } + GeocodedLocation.apply(this, arguments); + this.CLASSNAME = 'ReverseGeocodedLocation'; + this.searchCenterDistance = null; + } + ReverseGeocodedLocation.prototype = Object.create(GeocodedLocation.prototype); + ReverseGeocodedLocation.prototype.constructor = ReverseGeocodedLocation; + return ReverseGeocodedLocation; + }(ServicesGeocodeResponseModelGeocodedLocation); + ServicesGeocodeFormatsReverseGeocodeResponseReader = function (Logger, MR, ErrSrv, ReverseGeocodeResponse, ReverseGeocodedLocation) { + var ReverseGeocodeResponseReader = {}; + ReverseGeocodeResponseReader.VERSION = '1.2'; + ReverseGeocodeResponseReader.NAMESPACES = { + xmlns: 'http://www.opengis.net/xls', + gml: 'http://www.opengis.net/gml', + xls: 'http://www.opengis.net/xls', + xlsext: 'http://www.opengis.net/xlsext', + xsi: 'http://www.w3.org/2001/XMLSchema-instance' + }; + ReverseGeocodeResponseReader.SCHEMALOCATION = 'http://wxs.ign.fr/schemas/olsAll.xsd'; + ReverseGeocodeResponseReader.DEFAULTPREFIX = 'xls'; + ReverseGeocodeResponseReader.READERS = { + xls: { + XLS: function (root) { + var reverseGeocodeResponse = new ReverseGeocodeResponse(); + __checkServiceAttributes(root); + __getChildNodes(root, reverseGeocodeResponse); + return reverseGeocodeResponse; + }, + ReverseGeocodedLocation: function (node, reverseGeocodeResponse) { + var reverseGeocodedLocation = new ReverseGeocodedLocation(); + __getChildNodes(node, reverseGeocodedLocation); + if (reverseGeocodeResponse && Array.isArray(reverseGeocodeResponse.locations)) { + reverseGeocodeResponse.locations.push(reverseGeocodedLocation); + } + }, + Address: function (node, reverseGeocodedLocation) { + var countrycode = node.getAttribute('countryCode'); + if (reverseGeocodedLocation && countrycode) { + reverseGeocodedLocation.type = countrycode; + } + __getChildNodes(node, reverseGeocodedLocation); + }, + Building: function (node, reverseGeocodedLocation) { + var num = node.getAttribute('number'); + if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) { + if (num) { + reverseGeocodedLocation.placeAttributes.number = num; + } else if (node.getAttribute('buildingName')) { + reverseGeocodedLocation.placeAttributes.number = node.getAttribute('buildingName'); + } else if (node.getAttribute('subdivision')) { + reverseGeocodedLocation.placeAttributes.number = node.getAttribute('subdivision'); + } + } + }, + Street: function (node, reverseGeocodedLocation) { + if (reverseGeocodedLocation.type === 'StreetAddress') { + reverseGeocodedLocation.placeAttributes.street = __getChildValue(node); + } else if (reverseGeocodedLocation.type === 'CadastralParcel') { + reverseGeocodedLocation.placeAttributes.cadastralParcel = __getChildValue(node); + } + }, + Place: function (node, reverseGeocodedLocation) { + var placeType = node.getAttribute('type'); + var placeName = __getChildValue(node); + if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) { + if (placeType === 'Municipality') { + reverseGeocodedLocation.placeAttributes.municipality = placeName; + } else if (placeType === 'Bbox') { + var values = placeName.split(';'); + if (values.length === 4) { + reverseGeocodedLocation.placeAttributes.bbox = { + left: parseFloat(values[0]), + right: parseFloat(values[2]), + top: parseFloat(values[1]), + bottom: parseFloat(values[3]) + }; + } + } else if (placeType === 'Commune') { + reverseGeocodedLocation.placeAttributes.commune = placeName; + } else if (placeType === 'Departement') { + reverseGeocodedLocation.placeAttributes.department = placeName; + } else if (placeType === 'INSEE') { + reverseGeocodedLocation.placeAttributes.insee = placeName; + } else if (placeType === 'Qualite') { + reverseGeocodedLocation.placeAttributes.quality = placeName; + } else if (placeType === 'Territoire') { + reverseGeocodedLocation.placeAttributes.territory = placeName; + } else if (placeType === 'ID') { + reverseGeocodedLocation.placeAttributes.ID = placeName; + } else if (placeType === 'ID_TR') { + reverseGeocodedLocation.placeAttributes.IDTR = placeName; + } else if (placeType === 'Importance') { + reverseGeocodedLocation.placeAttributes.importance = parseInt(placeName, 10); + } else if (placeType === 'Nature') { + reverseGeocodedLocation.placeAttributes.nature = placeName; + } else if (placeType === 'Numero') { + reverseGeocodedLocation.placeAttributes.number = placeName; + } else if (placeType === 'Feuille') { + reverseGeocodedLocation.placeAttributes.sheet = placeName; + } else if (placeType === 'Section') { + reverseGeocodedLocation.placeAttributes.section = placeName; + } else if (placeType === 'CommuneAbsorbee') { + reverseGeocodedLocation.placeAttributes.absorbedCity = placeName; + } else if (placeType === 'Arrondissement') { + if (placeName) { + reverseGeocodedLocation.placeAttributes.arrondissement = placeName; + } + } else if (placeType === 'Type') { + reverseGeocodedLocation.placeAttributes.origin = placeName; + } else if (placeType === 'Prefecture') { + reverseGeocodedLocation.placeAttributes.prefecture = placeName; + } else if (placeType === 'InseeRegion') { + reverseGeocodedLocation.placeAttributes.inseeRegion = placeName; + } else if (placeType === 'InseeDepartment') { + reverseGeocodedLocation.placeAttributes.inseeDepartment = placeName; + } + } + }, + PostalCode: function (node, reverseGeocodedLocation) { + if (reverseGeocodedLocation && reverseGeocodedLocation.hasOwnProperty('placeAttributes')) { + reverseGeocodedLocation.placeAttributes.postalCode = __getChildValue(node); + } + }, + SearchCentreDistance: function (node, reverseGeocodedLocation) { + if (reverseGeocodedLocation) { + reverseGeocodedLocation.searchCenterDistance = parseFloat(node.getAttribute('value')); + } + }, + Error: function (node) { + var srvMess = node.getAttribute('message'); + var errorCode = node.getAttribute('errorCode'); + var message = MR.getMessage('SERVICE_RESPONSE_EXCEPTION', '(' + errorCode + ') : ' + srvMess); + throw new ErrSrv({ + message: message, + type: ErrSrv.TYPE_SRVERR + }); + } + }, + gml: { + pos: function (node, reverseGeocodedLocation) { + var pos = __getChildValue(node); + if (reverseGeocodedLocation && pos) { + reverseGeocodedLocation.position = { + x: parseFloat(pos.split(' ')[0]), + y: parseFloat(pos.split(' ')[1]) + }; + } + } + }, + xlsext: { + ExtendedGeocodeMatchCode: function (node, reverseGeocodedLocation) { + if (reverseGeocodedLocation) { + reverseGeocodedLocation.matchType = __getChildValue(node); + } + } + }, + ExceptionReport: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeName === 'Exception') { + response.exceptionReport = ReverseGeocodeResponseReader.READERS['Exception'](child); + } + } + } + return response; + }, + Exception: function (node) { + var exceptionReport = {}; + var exceptionCode = node.getAttribute('exceptionCode'); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + } + }; + ReverseGeocodeResponseReader.read = function (root) { + if (root.nodeName === 'XLS') { + var nsPrefix = root.prefix; + if (!nsPrefix) { + nsPrefix = ReverseGeocodeResponseReader.DEFAULTPREFIX; + } + var geocodeResponse = ReverseGeocodeResponseReader.READERS[nsPrefix][root.nodeName](root); + return geocodeResponse; + } else if (root.nodeName === 'ExceptionReport') { + var exceptionReport = ReverseGeocodeResponseReader.READERS[root.nodeName](root); + return exceptionReport; + } else { + throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.'); + } + }; + function __getAttributes(node) { + if (node.attributes.length > 0) { + var nodeAttributes = {}; + var attributes = node.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + nodeAttributes[attribute.nodeName] = attribute.nodeValue; + } + return nodeAttributes; + } + } + function __getChildNodes(node, data) { + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + var childName; + var childPrefix; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + childPrefix = child.prefix || ReverseGeocodeResponseReader.DEFAULTPREFIX; + if (ReverseGeocodeResponseReader.READERS[childPrefix][childName]) { + var reader = ReverseGeocodeResponseReader.READERS[childPrefix][childName]; + reader(child, data); + } else { + __getChildNodes(child, data); + } + } + } + } + } + function __getChildValue(node) { + var textNode; + var value = ''; + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode.nodeType === 3) { + value = textNode.nodeValue; + } + } + return value; + } + function __checkServiceAttributes(XLSNode) { + if (XLSNode.attributes.length > 0) { + var xlsAttributes = __getAttributes(XLSNode); + for (var att in xlsAttributes) { + if (xlsAttributes.hasOwnProperty(att)) { + if (att === 'version') { + if (xlsAttributes['version'] !== ReverseGeocodeResponseReader.VERSION) { + console.log('[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing'); + return; + } + } + if (att === 'xmlns') { + if (xlsAttributes[att] !== ReverseGeocodeResponseReader.NAMESPACES[ReverseGeocodeResponseReader.DEFAULTPREFIX]) { + console.log('[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one'); + return; + } + continue; + } + var prefix = att.split(':')[0]; + var ns = att.split(':')[1]; + if (prefix === 'xmlns' && ns) { + if (ReverseGeocodeResponseReader.NAMESPACES[ns]) { + if (ReverseGeocodeResponseReader.NAMESPACES[ns] !== xlsAttributes[att]) { + console.log('[ReverseGeocodeResponseReader] geocode response ' + att + ' namespace is not the expected one'); + return; + } + } + } + if (ns === 'schemaLocation') { + if (ReverseGeocodeResponseReader.SCHEMALOCATION !== xlsAttributes[att]) { + console.log('[ReverseGeocodeResponseReader] geocode response schema location is not the expected one'); + return; + } + } + } + } + } + } + return ReverseGeocodeResponseReader; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelReverseGeocodedLocation); + ServicesGeocodeResponseReverseGeocodeResponseFactory = function (Logger, MRes, ErrorService, XML, ReverseGeocodeResponseReader) { + var ReverseGeocodeReponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + try { + var p = new XML({ reader: ReverseGeocodeResponseReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new Error('L\'analyse de la réponse du service !?'); + } + } catch (e) { + e.status = 200; + options.onError.call(options.scope, e); + return; + } + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + if (options.scope && options.scope.options && options.scope.options.srs && options.scope.options.srs !== 'EPSG:4326') { + var location; + var pos; + if (data || data.locations || data.locations.length) { + for (var i = 0; i < data.locations.length; i++) { + location = data.locations[i]; + if (location) { + pos = location.position; + if (pos) { + location.position = { + x: pos.y, + y: pos.x + }; + } + } + } + } + } + } + } else { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EMPTY'), + type: ErrorService.TYPE_SRVERR, + status: -1 + })); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return ReverseGeocodeReponseFactory; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, FormatsXML, ServicesGeocodeFormatsReverseGeocodeResponseReader); + ServicesGeocodeReverseGeocode = function (Logger, _, ErrorService, CommonService, ReverseGeocodeRequestFactory, ReverseGeocodeResponseFactory) { + function ReverseGeocode(options) { + if (!(this instanceof ReverseGeocode)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ReverseGeocode')); + } + this.CLASSNAME = 'ReverseGeocode'; + CommonService.apply(this, arguments); + if (!options.position) { + throw new Error(_.getMessage('PARAM_MISSING', 'position')); + } + if (options.position.x == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'position.x')); + } + if (options.position.y == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'position.y')); + } + this.options.position = options.position; + if (!options.filterOptions || typeof options.filterOptions !== 'object') { + this.options.filterOptions = options.filterOptions = { type: ['StreetAddress'] }; + } + if (Object.keys(options.filterOptions).length === 0) { + this.options.filterOptions = { type: ['StreetAddress'] }; + } + var filter = Object.keys(options.filterOptions); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + if (!options.filterOptions[key] || Object.keys(options.filterOptions[key]).length === 0) { + delete this.options.filterOptions[key]; + } + } + this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress']; + if (!Array.isArray(this.options.filterOptions.type)) { + throw new Error(_.getMessage('PARAM_TYPE', 'filterOptions.type')); + } + this.options.maximumResponses = options.maximumResponses || 25; + this.options.returnFreeForm = options.returnFreeForm || false; + this.options.srs = options.srs || 'CRS:84'; + if (ReverseGeocode.geoEPSG.indexOf(this.options.srs) === -1) { + this.options.position = { + x: this.options.position.y, + y: this.options.position.x + }; + if (this.options.filterOptions && this.options.filterOptions.circle) { + var circle = this.options.filterOptions.circle; + this.options.filterOptions.circle = { + x: circle.y, + y: circle.x, + radius: circle.radius + }; + } + if (this.options.filterOptions && this.options.filterOptions.polygon) { + var polygon = this.options.filterOptions.polygon; + for (i = 0; i < polygon.length; i++) { + var coords = polygon[i]; + this.options.filterOptions.polygon[i] = { + x: coords.y, + y: coords.x + }; + } + } + } + this.options.outputFormat = 'xml'; + } + ReverseGeocode.prototype = Object.create(CommonService.prototype, {}); + ReverseGeocode.prototype.constructor = ReverseGeocode; + ReverseGeocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod: this.options.httpMethod, + position: this.options.position, + returnFreeForm: this.options.returnFreeForm, + filterOptions: this.options.filterOptions, + srs: 'EPSG:4326', + maximumResponses: this.options.maximumResponses + }; + this.request = ReverseGeocodeRequestFactory.build(options); + if (!this.request) { + error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD'))); + } else { + success.call(this, this.request); + } + }; + ReverseGeocode.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + ReverseGeocodeResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + ReverseGeocode.geoEPSG = ['EPSG:4326']; + return ReverseGeocode; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesGeocodeRequestReverseGeocodeRequestFactory, ServicesGeocodeResponseReverseGeocodeResponseFactory); + ServicesAutoCompleteResponseModelAutoCompleteResponse = function () { + function AutoCompleteResponse() { + if (!(this instanceof AutoCompleteResponse)) { + throw new TypeError('AutoCompleteResponse constructor cannot be called as a function.'); + } + this.suggestedLocations = []; + } + AutoCompleteResponse.prototype = { constructor: AutoCompleteResponse }; + return AutoCompleteResponse; + }(); + ServicesAutoCompleteResponseModelSuggestedLocation = function () { + function SuggestedLocation() { + if (!(this instanceof SuggestedLocation)) { + throw new TypeError('SuggestedLocation constructor cannot be called as a function.'); + } + this.type = null; + this.position = { + x: null, + y: null + }; + this.commune = null; + this.fullText = null; + this.postalCode = null; + this.classification = null; + this.street = null; + this.poi = null; + this.kind = null; + } + SuggestedLocation.prototype = { constructor: SuggestedLocation }; + return SuggestedLocation; + }(); + ServicesAutoCompleteResponseAutoCompleteResponseFactory = function (Logger, ErrorService, MRes, XML, AutoCompleteResponse, SuggestedLocation) { + var AutoCompleteResponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + var JSONResponse; + if (typeof options.response === 'string') { + JSONResponse = window.JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + if (JSONResponse) { + if (JSONResponse.error) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.error.description), + status: JSONResponse.error.code, + type: ErrorService.TYPE_SRVERR + })); + return; + } + data = new AutoCompleteResponse(); + if (JSONResponse.results && Array.isArray(JSONResponse.results)) { + var suggestedLocation; + for (var i = 0; i < JSONResponse.results.length; i++) { + var result = JSONResponse.results[i]; + suggestedLocation = new SuggestedLocation(); + if (suggestedLocation) { + if (result && result.country === 'StreetAddress') { + suggestedLocation.street = result.street; + suggestedLocation.type = 'StreetAddress'; + } else if (result && result.country === 'PositionOfInterest') { + suggestedLocation.poi = result.street; + suggestedLocation.kind = result.kind; + suggestedLocation.type = 'PositionOfInterest'; + } + if (suggestedLocation.position) { + suggestedLocation.position.x = result.x; + suggestedLocation.position.y = result.y; + } + suggestedLocation.commune = result.city; + suggestedLocation.fullText = result.fulltext; + suggestedLocation.postalCode = result.zipcode; + suggestedLocation.classification = result.classification; + } + data.suggestedLocations.push(suggestedLocation); + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3'))); + return; + } + if (!data.suggestedLocations.length) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT_3'))); + return; + } + } + if (!data) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_ANALYSE_2'), + type: ErrorService.TYPE_UNKERR, + status: -1 + })); + return; + } + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY'))); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return AutoCompleteResponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation); + ServicesAutoCompleteAutoComplete = function (CommonService, AutoCompleteResponseFactory, Logger, MR, ErrorService, Helper) { + function AutoComplete(options) { + if (!(this instanceof AutoComplete)) { + throw new TypeError(MR.getMessage('CLASS_CONSTRUCTOR', 'AutoComplete')); + } + this.CLASSNAME = 'AutoComplete'; + CommonService.apply(this, arguments); + if (!options.text) { + throw new Error(MR.getMessage('PARAM_MISSING', 'text')); + } + this.options.text = options.text; + if (!options.filterOptions || typeof options.filterOptions !== 'object') { + this.options.filterOptions = options.filterOptions = { + territory: [], + type: ['StreetAddress'] + }; + } + if (Object.keys(options.filterOptions).length === 0) { + this.options.filterOptions = { + territory: [], + type: ['StreetAddress'] + }; + } + this.options.filterOptions.type = options.filterOptions.type || ['StreetAddress']; + this.options.filterOptions.territory = options.filterOptions.territory || []; + this.options.maximumResponses = options.maximumResponses || 10; + if (this.options.protocol === 'XHR' && this.options.httpMethod === 'POST') { + this.options.httpMethod = 'GET'; + } + this.options.outputFormat = 'json'; + } + AutoComplete.prototype = Object.create(CommonService.prototype, {}); + AutoComplete.prototype.constructor = AutoComplete; + AutoComplete.prototype.buildRequest = function (error, success) { + var territories = ''; + if (this.options.filterOptions.territory) { + territories = this.options.filterOptions.territory.join(';'); + } + var types = ''; + if (this.options.filterOptions.type) { + types = this.options.filterOptions.type.join(','); + } + this.request = Helper.normalyzeParameters({ + text: encodeURIComponent(this.options.text), + type: types, + terr: territories, + maximumResponses: this.options.maximumResponses + }); + success.call(this, this.request); + }; + AutoComplete.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onSuccess: success, + onError: error, + scope: this + }; + AutoCompleteResponseFactory.build(options); + } else { + error.call(this, new ErrorService(MR.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return AutoComplete; + }(ServicesCommonService, ServicesAutoCompleteResponseAutoCompleteResponseFactory, UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, UtilsHelper); + FormatsXLSRouteServiceModelRoutePlan = function (Logger) { + function RoutePlan(options) { + if (!(this instanceof RoutePlan)) { + throw new TypeError('RoutePlan constructor cannot be called as a function.'); + } + this.options = options || {}; + if (!options.startPoint) { + throw new Error('l\'option \'startPoint\' n\'est pas renseignée !'); + } + if (!options.endPoint) { + throw new Error('l\'option \'endPoint\' n\'est pas renseignée !'); + } + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + } + RoutePlan.prototype = { + constructor: RoutePlan, + requestString: null, + template: { + routePlan: '' + '__ROUTEPREFERENCE__' + '__GRAPH__' + '__WAYPOINTLIST__' + '__AVOIDLIST__' + '', + routePreference: '__VALUEROUTEPREFERENCE__', + graph: '', + wayPointList: { + container: '' + '__STARTPOINT__' + '__VIAPOINT__' + '__ENDPOINT__' + '', + point: '__X__ __Y__', + startPoint: '' + '__POINT__' + '', + endPoint: '' + '__POINT__' + '', + viaPoint: '' + '__POINT__' + '' + }, + avoidList: { + container: '' + '__AVOIDFEATURE__' + '', + avoidFeature: '__VALUEAVOIDFEATURE__' + } + }, + toString: function () { + var template = ''; + template = this.template.routePlan; + if (this.options.routePreference) { + var tmplPreference = this.template.routePreference; + tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference); + template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference); + } + template = template.replace(/__ROUTEPREFERENCE__/g, ''); + if (this.options.avoidFeature) { + var tmplAvoidList = this.template.avoidList.container; + var avoidFeatures = []; + for (var i = 0; i < this.options.avoidFeature.length; i++) { + var tmplAvoidFeature = this.template.avoidList.avoidFeature; + tmplAvoidFeature = tmplAvoidFeature.replace(/__VALUEAVOIDFEATURE__/, this.options.avoidFeature[i]); + avoidFeatures.push(tmplAvoidFeature); + } + tmplAvoidList = tmplAvoidList.replace(/__AVOIDFEATURE__/, avoidFeatures.join('\n')); + template = template.replace(/__AVOIDLIST__/g, tmplAvoidList); + } + template = template.replace(/__AVOIDLIST__/g, ''); + if (this.options.graph) { + var tmplVehicle = this.template.graph; + tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph); + template = template.replace(/__GRAPH__/g, tmplVehicle); + } + template = template.replace(/__GRAPH__/g, ''); + var tmplWayPointList = this.template.wayPointList.container; + var tmplPoint = ''; + tmplPoint = this.template.wayPointList.point; + tmplPoint = tmplPoint.replace(/__X__/, this.options.startPoint.x); + tmplPoint = tmplPoint.replace(/__Y__/, this.options.startPoint.y); + tmplWayPointList = tmplWayPointList.replace(/__STARTPOINT__/, this.template.wayPointList.startPoint.replace(/__POINT__/, tmplPoint)); + tmplPoint = this.template.wayPointList.point; + tmplPoint = tmplPoint.replace(/__X__/, this.options.endPoint.x); + tmplPoint = tmplPoint.replace(/__Y__/, this.options.endPoint.y); + tmplWayPointList = tmplWayPointList.replace(/__ENDPOINT__/, this.template.wayPointList.endPoint.replace(/__POINT__/, tmplPoint)); + if (this.options.viaPoint) { + var points = []; + for (var j = 0; j < this.options.viaPoint.length; j++) { + var p = this.options.viaPoint[j]; + tmplPoint = this.template.wayPointList.point; + tmplPoint = tmplPoint.replace(/__X__/, p.x); + tmplPoint = tmplPoint.replace(/__Y__/, p.y); + points.push(tmplPoint); + } + tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, this.template.wayPointList.viaPoint.replace(/__POINT__/, points.join('\n'))); + } else { + tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, ''); + } + template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList); + this.requestString = template; + return this.requestString; + } + }; + return RoutePlan; + }(UtilsLoggerByDefault); + FormatsXLSRouteServiceDetermineRouteRequest = function (Logger, RoutePlan) { + function DetermineRouteRequest(options) { + if (!(this instanceof DetermineRouteRequest)) { + throw new TypeError('DetermineRouteRequest constructor cannot be called as a function.'); + } + this.options = options || {}; + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + this.CLASSNAME = 'DetermineRouteRequest'; + } + DetermineRouteRequest.prototype = { + strRequest: null, + oRoutePlan: null, + template: { + determineRouteRequest: '' + '__ROUTEPLAN__' + '__ROUTEINSTRUCTIONREQUEST__' + '__ROUTEGEOMETRYREQUEST__' + '__ROUTEMAPREQUEST__' + '', + routeInstructionRequest: '', + routeGeometryRequest: '', + routeMapRequest: '' + }, + addRoute: function (oRoutePlan) { + if (oRoutePlan instanceof RoutePlan) { + this.oRoutePlan = oRoutePlan; + } + }, + constructor: DetermineRouteRequest, + toString: function () { + var template = ''; + template = this.template.determineRouteRequest; + template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || 'KM'); + if (!this.oRoutePlan) { + var settings = this.options.route; + this.oRoutePlan = new RoutePlan(settings); + if (!this.oRoutePlan) { + throw new Error('La construction du calcul d\'initineraire n\'est pas correctement definie !?'); + } + } + template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString()); + var tmplInstruction = this.template.routeInstructionRequest; + tmplInstruction = tmplInstruction.replace(/__PROVIDEGEOMETRY__/g, this.options.provideGeometry || false); + tmplInstruction = tmplInstruction.replace(/__PROVIDEBBOX__/g, this.options.provideBoundingBox || false); + template = template.replace(/__ROUTEINSTRUCTIONREQUEST__/g, tmplInstruction); + var tmplGeometry = this.template.routeGeometryRequest; + template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry); + var tmplMap = this.template.routeMapRequest; + template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap); + this.strRequest = template; + return this.strRequest; + } + }; + return DetermineRouteRequest; + }(UtilsLoggerByDefault, FormatsXLSRouteServiceModelRoutePlan); + FormatsXLSRouteServiceRouteRequestExtension = undefined; + FormatsXLSRouteService = function (Logger, AbstractService, DetermineRouteRequest, RouteRequestExtension) { + function RouteService(options) { + if (!(this instanceof RouteService)) { + throw new TypeError('RouteService constructor cannot be called as a function.'); + } + this.CLASSNAME = 'RouteService'; + this.CLASSTYPE = 'RouteRequest'; + AbstractService.apply(this, arguments); + } + RouteService.prototype = Object.create(AbstractService.prototype, {}); + RouteService.prototype.constructor = RouteService; + RouteService.prototype.addRequest = function (oRequest) { + if (oRequest.CLASSNAME === 'DetermineRouteRequest') { + this.oRequest = oRequest; + } else { + throw new Error('Ce n\'est pas un objet de type \'Route Request\' !?'); + } + }; + RouteService.prototype.addFilter = function (oFilter) { + if (oFilter instanceof RouteRequestExtension) { + this.oFilter = oFilter; + } + }; + RouteService.prototype.toString = function () { + if (!this.oRequest) { + if (!this.options) { + throw new Error('Les options ne sont pas renseignées, impossible de construire la requête !'); + } + if (this.CLASSTYPE === 'RouteRequest') { + var settings = { + distanceUnit: this.options.distanceUnit || null, + provideGeometry: this.options.provideGeometry || null, + provideBoundingBox: this.options.provideBoundingBox || null, + route: { + routePreference: this.options.routePreference || null, + startPoint: this.options.startPoint, + viaPoint: this.options.viaPoint || null, + endPoint: this.options.endPoint, + avoidFeature: this.options.avoidFeature || null, + graph: this.options.graph || null, + expectedStartTime: this.options.expectedStartTime || null + } + }; + this.oRequest = new DetermineRouteRequest(settings); + if (this.oFilter) { + this.oRequest.addFilter(this.oFilter); + } + } + } + if (!this.oRequest) { + throw new Error('Type de requête indefini !'); + } + this.strRequest = this.oRequest.toString(); + return this.strRequest; + }; + return RouteService; + }(UtilsLoggerByDefault, FormatsXLSAbstractService, FormatsXLSRouteServiceDetermineRouteRequest, FormatsXLSRouteServiceRouteRequestExtension); + ServicesRouteRequestRouteRequestOLS = function (Logger, XLS, RouteService) { + var RouteRequestOLS = { + build: function (options) { + var request = null; + var settings = { + startPoint: options.startPoint, + endPoint: options.endPoint, + viaPoint: options.viaPoints, + provideBoundingBox: options.provideBbox, + avoidFeature: options.exclusions, + expectedStartTime: options.expectedStartTime, + distanceUnit: options.distanceUnit, + graph: options.graph, + provideGeometry: options.geometryInInstructions, + routePreference: options.routePreference + }; + var oRS = new RouteService(settings); + var oXLS = new XLS({ + srsName: options.srs, + maximumResponses: options.maximumResponses + }); + oXLS.namespace = true; + oXLS.setService(oRS); + request = oXLS.build(); + if (options.httpMethod == 'GET') { + var myRequest = 'qxml=' + encodeURIComponent(request).replace(/\-/g, '%2D').replace(/\_/g, '%5F').replace(/\./g, '%2E').replace(/\!/g, '%21').replace(/\~/g, '%7E').replace(/\*/g, '%2A').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29'); + request = myRequest; + } + return request; + } + }; + return RouteRequestOLS; + }(UtilsLoggerByDefault, FormatsXLS, FormatsXLSRouteService); + ServicesRouteRequestModelRouteParamREST = function (Logger) { + function RouteParamREST(options) { + if (!(this instanceof RouteParamREST)) { + throw new TypeError('RouteParamREST constructor cannot be called as a function.'); + } + this.options = options || {}; + this.origin = this.options.startPoint.x + ',' + this.options.startPoint.y; + this.destination = this.options.endPoint.x + ',' + this.options.endPoint.y; + this.waypoints = this.options.viaPoints || null; + this.startDateTime = this.options.expectedStartTime || null; + this.graphName = this.options.graph; + this.srs = this.options.srs; + this.exclusions = this.options.exclusions; + this.method = 'TIME'; + if (this.options.routePreference) { + var value = this.options.routePreference; + switch (value) { + case 'fastest': + this.method = 'TIME'; + break; + case 'shortest': + this.method = 'DISTANCE'; + break; + default: + this.method = 'TIME'; + } + } + this.format = this.options.geometryInInstructions ? 'STANDARDEXT' : 'STANDARD'; + this.tolerance = 10; + this.profileId = null; + this.profileName = null; + } + RouteParamREST.CLASSNAME = 'RouteParamREST'; + RouteParamREST.prototype = { + constructor: RouteParamREST, + getWaypoints: function () { + if (!this.waypoints) { + return; + } + var array = []; + for (var i = 0; i < this.waypoints.length; i++) { + var obj = this.waypoints[i]; + array.push(obj.x + ',' + obj.y); + } + return array.join(';'); + }, + getExclusions: function () { + return this.exclusions.join(';'); + } + }; + RouteParamREST.prototype.getParams = function () { + var map = []; + map.push({ + k: 'origin', + v: this.origin + }); + map.push({ + k: 'destination', + v: this.destination + }); + map.push({ + k: 'method', + v: this.method + }); + if (this.waypoints) { + map.push({ + k: 'waypoints', + v: this.getWaypoints() + }); + } + if (this.startDateTime) { + map.push({ + k: 'startDateTime', + v: this.startDateTime + }); + } + if (this.graphName) { + map.push({ + k: 'graphName', + v: this.graphName + }); + } + if (this.exclusions) { + map.push({ + k: 'exclusions', + v: this.getExclusions() + }); + } + if (this.srs) { + map.push({ + k: 'srs', + v: this.srs + }); + } + if (this.format) { + map.push({ + k: 'format', + v: this.format + }); + } + return map; + }; + return RouteParamREST; + }(UtilsLoggerByDefault); + ServicesRouteRequestRouteRequestREST = function (Logger, _, RouteParamREST) { + function RouteRequestREST(options) { + if (!(this instanceof RouteRequestREST)) { + throw new TypeError('RouteRequestREST constructor cannot be called as a function.'); + } + if (!options) { + throw new Error(_.getMessage('PARAM_EMPTY', 'options')); + } + this.settings = options; + } + RouteRequestREST.prototype = { + requestString: null, + constructor: RouteRequestREST, + processRequestString: function () { + var oParams = new RouteParamREST(this.settings); + var params = oParams.getParams(); + var request = ''; + for (var i = 0; i < params.length; i++) { + var o = params[i]; + if (request) { + request += '&'; + } + request += o.k + '=' + o.v; + } + this.requestString = request; + return this.requestString; + } + }; + return RouteRequestREST; + }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesRouteRequestModelRouteParamREST); + ServicesRouteRequestRouteRequestFactory = function (Logger, ErrorService, RouteRequestOLS, RouteRequestREST) { + var RouteRequestFactory = { + build: function (options) { + var request = null; + var settings = options || {}; + var bOnError = options.onError !== null && typeof options.onError === 'function' ? true : false; + var message = null; + switch (options.api) { + case 'REST': + var myReq = new RouteRequestREST(settings); + if (!myReq.processRequestString()) { + message = 'Error process request (rest) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + request = myReq.requestString; + break; + case 'OLS': + request = RouteRequestOLS.build(settings); + if (!request) { + message = 'Error process request (ols) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + break; + default: + message = 'Type of API is not supported by service (REST or OLS) !'; + if (bOnError) { + options.onError.call(options.scope, new ErrorService(message)); + return; + } + throw new Error(message); + } + return request; + } + }; + return RouteRequestFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, ServicesRouteRequestRouteRequestOLS, ServicesRouteRequestRouteRequestREST); + FormatsWKT = function (Logger) { + var WKT = { + toJson: function (strWkt, success, error) { + var json = null; + try { + if (!strWkt) { + throw new Error('La chaine WKT n\'est pas renseignée !'); + } + if (!success) { + success = function (json) { + console.log(json); + }; + } + if (!error) { + error = function (e) { + console.log(e); + }; + } + var regex; + var subst; + var result; + regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g; + subst = '[$1,$2]'; + strWkt = strWkt.replace(regex, subst); + regex = /^(\w+)/; + result = regex.exec(strWkt); + if (RegExp.$1 === 'POLYGON') { + subst = '{"type" : "Polygon",'; + strWkt = strWkt.replace(RegExp.$1, subst); + regex = /(\({2}?)/; + subst = '"coordinates" : [['; + strWkt = strWkt.replace(regex, subst); + regex = /(\){2}?)/; + subst = ']]}'; + strWkt = strWkt.replace(regex, subst); + regex = /(\()/g; + subst = '['; + strWkt = strWkt.replace(regex, subst); + regex = /(\))/g; + subst = ']'; + strWkt = strWkt.replace(regex, subst); + } else if (RegExp.$1 === 'LINESTRING') { + subst = '{"type" : "LineString",'; + strWkt = strWkt.replace(RegExp.$1, subst); + regex = /(\(\(?)/; + subst = '"coordinates" : ['; + strWkt = strWkt.replace(regex, subst); + regex = /(\)\)?)/; + subst = ']}'; + strWkt = strWkt.replace(regex, subst); + } + json = JSON.parse(strWkt); + if (!json) { + throw new Error('Le JSON est vide !'); + } + if (!json.type) { + throw new Error('Le type de geometrie n\'est pas connu !'); + } + if (!json.coordinates) { + throw new Error('La liste des points est vide !'); + } + success.call(this, json); + } catch (e) { + if (e.name === 'SyntaxError') { + error.call(this, 'Erreur de parsing JSON !'); + return; + } + error.call(this, e); + } + } + }; + return WKT; + }(UtilsLoggerByDefault); + ServicesRouteResponseModelRouteResponse = function () { + function RouteResponse() { + if (!(this instanceof RouteResponse)) { + throw new TypeError('RouteResponse constructor cannot be called as a function.'); + } + this.totalTime = null; + this.totalDistance = null; + this.bbox = { + left: null, + right: null, + top: null, + bottom: null + }; + this.routeGeometry = null; + this.routeInstructions = []; + } + RouteResponse.prototype = { constructor: RouteResponse }; + return RouteResponse; + }(); + ServicesRouteResponseModelRouteInstruction = function () { + function RouteInstruction() { + if (!(this instanceof RouteInstruction)) { + throw new TypeError('RouteInstruction constructor cannot be called as a function.'); + } + this.duration = null; + this.distance = null; + this.code = null; + this.instruction = null; + this.geometry = null; + } + RouteInstruction.prototype = { constructor: RouteInstruction }; + return RouteInstruction; + }(); + ServicesRouteFormatsRouteResponseRESTReader = function (Logger, WKT, MessagesResources, ErrSrv, RouteResponse, RouteInstruction) { + var RouteResponseRESTReader = {}; + RouteResponseRESTReader.READERS = { + routeResult: function (node) { + var response = new RouteResponse(); + __getChildNodes(node, response); + if (response.status === 'error') { + var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message); + throw new ErrSrv({ + message: message, + type: ErrSrv.TYPE_SRVERR + }); + } + return response; + }, + status: function (node, response) { + var status = __getChildValue(node); + if (status === 'ERROR' || status === 'error') { + if (response) { + response.status = 'error'; + } + } + }, + message: function (node, response) { + if (response) { + response.message = __getChildValue(node); + } + }, + distance: function (node, response) { + if (response) { + response.totalDistance = __getChildValue(node); + } + }, + durationSeconds: function (node, response) { + if (response) { + response.totalTime = parseFloat(__getChildValue(node)); + } + }, + bounds: function (node, response) { + if (response && response.bbox) { + var coords = __getChildValue(node).split(/[,;]/); + response.bbox.left = parseFloat(coords[0]); + response.bbox.bottom = parseFloat(coords[1]); + response.bbox.right = parseFloat(coords[2]); + response.bbox.top = parseFloat(coords[3]); + } + }, + geometryWkt: function (node, response) { + if (response) { + var geomWkt = node.innerHTML; + var onWKTSuccess = function (json) { + response.routeGeometry = json; + }; + var onWKTError = function () { + var msg = MessagesResources.getMessage('PARAM_FORMAT', ['geometryWkt']); + throw new Error(msg); + }; + WKT.toJson(geomWkt, onWKTSuccess, onWKTError); + } + }, + step: function (node, response) { + var routeInstruction = new RouteInstruction(); + var name; + if (node.hasChildNodes) { + var children = node.childNodes; + var child; + var childName; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + if (childName === 'durationSeconds') { + routeInstruction.duration = __getChildValue(child); + } else if (childName === 'distance') { + routeInstruction.distance = __getChildValue(child); + } else if (childName === 'navInstruction') { + routeInstruction.code = __getChildValue(child); + } else if (childName === 'name') { + name = __getChildValue(child); + } + } + } + } + if (routeInstruction.code) { + switch (routeInstruction.code) { + case 'F': + if (name != 'Valeur non renseignée') { + routeInstruction.instruction = 'Tout droit ' + name; + } else { + routeInstruction.instruction = 'Continuer tout droit '; + } + break; + case 'B': + routeInstruction.instruction = 'Demi-tour ' + name; + break; + case 'L': + routeInstruction.instruction = 'Tourner à gauche ' + name; + break; + case 'R': + routeInstruction.instruction = 'Tourner à droite ' + name; + break; + case 'BL': + routeInstruction.instruction = 'Tourner très à gauche ' + name; + break; + case 'BR': + routeInstruction.instruction = 'Tourner très à droite ' + name; + break; + case 'FL': + routeInstruction.instruction = 'Tourner légèrement à gauche ' + name; + break; + case 'FR': + routeInstruction.instruction = 'Tourner légèrement à droite ' + name; + break; + case 'round_about_entry': + routeInstruction.instruction = 'Entrée rond-point ' + name; + break; + case 'round_about_exit': + routeInstruction.instruction = 'Sortie rond-point ' + name; + break; + case null: + routeInstruction.instruction = 'Prendre ' + name; + break; + default: + routeInstruction.instruction = '?' + routeInstruction.code + '? ' + name; + break; + } + } + if (Array.isArray(response.routeInstructions)) { + response.routeInstructions.push(routeInstruction); + } + } + }; + RouteResponseRESTReader.read = function (root) { + var response; + if (root.nodeName === 'routeResult') { + response = RouteResponseRESTReader.READERS['routeResult'](root); + return response; + } else { + throw new Error('Erreur lors de la lecture de la réponse : elle n\'est pas au format attendu.'); + } + }; + function __getChildValue(node) { + var textNode; + var value = ''; + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + value = textNode.nodeValue; + } + } + return value; + } + function __getChildNodes(node, data) { + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + var childName; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType === 1) { + childName = child.localName || child.baseName || child.nodeName; + if (RouteResponseRESTReader.READERS[childName]) { + var reader = RouteResponseRESTReader.READERS[childName]; + reader(child, data); + } else { + __getChildNodes(child, data); + } + } + } + } + } + return RouteResponseRESTReader; + }(UtilsLoggerByDefault, FormatsWKT, UtilsMessagesResources, ExceptionsErrorService, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction); + ServicesRouteFormatsRouteResponseOLSReader = function (Logger) { + var RouteResponseOLSReader = {}; + RouteResponseOLSReader.READERS = {}; + RouteResponseOLSReader.read = function (root) { + }; + return RouteResponseOLSReader; + }(UtilsLoggerByDefault); + ServicesRouteResponseRouteResponseFactory = function (Logger, ErrorService, XML, WKT, MRes, RouteResponseRESTReader, RouteResponseOLSReader, RouteResponse, RouteInstruction) { + var RouteResponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + switch (options.outputFormat) { + case 'xml': + var routeReader = options.api === 'REST' ? RouteResponseRESTReader : RouteResponseOLSReader; + try { + var p = new XML({ reader: routeReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'xml')); + } + } catch (e) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response))); + return; + } + break; + case 'json': + var JSONResponse; + if (typeof options.response === 'string') { + JSONResponse = window.JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + if (JSONResponse.message) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', JSONResponse.message))); + return; + } + if (JSONResponse) { + var legs = []; + var legSteps = []; + var steps = []; + data = new RouteResponse(); + if (data.hasOwnProperty('totalTime')) { + data.totalTime = parseFloat(JSONResponse.durationSeconds); + } + if (data.hasOwnProperty('totalDistance')) { + data.totalDistance = options.distanceUnit === 'm' ? JSONResponse.distanceMeters : JSONResponse.distance; + } + if (data.hasOwnProperty('bbox')) { + var coords = JSONResponse.bounds.split(/[,;]/); + data.bbox.left = parseFloat(coords[0]); + data.bbox.bottom = parseFloat(coords[1]); + data.bbox.right = parseFloat(coords[2]); + data.bbox.top = parseFloat(coords[3]); + } + var onWKTSuccess = function (json) { + data.routeGeometry = json; + }; + var onWKTError = function (e) { + console.log(e); + options.onError.call(options.scope, new ErrorService(MRes.getMessage('PARAM_FORMAT', ['geometryWkt']))); + }; + if (data.hasOwnProperty('routeGeometry')) { + var geometry = JSONResponse.geometryWkt || JSONResponse.simplifiedWkt; + if (geometry) { + WKT.toJson(geometry, onWKTSuccess, onWKTError); + if (!data.routeGeometry) { + return; + } + } + } + if (data.hasOwnProperty('routeInstructions')) { + var legList = JSONResponse.legs; + var i; + if (Array.isArray(legList) && legList.length) { + for (i = 0; i < legList.length; i++) { + legs.push(legList[i]); + } + } + if (Array.isArray(legs) && legs.length) { + for (i = 0; i < legs.length; i++) { + legSteps.push(legs[i].steps); + } + } + if (Array.isArray(legSteps) && legSteps.length) { + for (i = 0; i < legSteps.length; i++) { + steps = steps.concat(legSteps[i]); + } + } + steps.forEach(function (step) { + data.routeInstructions.push(new RouteInstruction()); + data.routeInstructions[data.routeInstructions.length - 1].duration = step.durationSeconds; + data.routeInstructions[data.routeInstructions.length - 1].distance = options.distanceUnit === 'm' ? step.distanceMeters : step.distance; + data.routeInstructions[data.routeInstructions.length - 1].code = step.navInstruction; + var points = []; + for (var i = 0; i < step.points.length; i++) { + var point = step.points[i].split(','); + if (point) { + points.push(point); + } + } + if (points && points.length !== 0) { + data.routeInstructions[data.routeInstructions.length - 1].geometry = { + coordinates: points, + type: 'LineString' + }; + } else { + data.routeInstructions[data.routeInstructions.length - 1].geometry = null; + } + if (step.name == 'Valeur non renseignée') { + step.name = ''; + } + switch (step.navInstruction) { + case 'F': + if (step.name) { + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tout droit ' + step.name; + } else { + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Continuer tout droit '; + } + break; + case 'B': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Demi-tour ' + step.name; + break; + case 'L': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à gauche ' + step.name; + break; + case 'R': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner à droite ' + step.name; + break; + case 'BL': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à gauche ' + step.name; + break; + case 'BR': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner très à droite ' + step.name; + break; + case 'FL': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à gauche ' + step.name; + break; + case 'FR': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Tourner légèrement à droite ' + step.name; + break; + case 'round_about_entry': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Entrée rond-point ' + step.name; + break; + case 'round_about_exit': + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Sortie rond-point ' + step.name; + break; + case null: + data.routeInstructions[data.routeInstructions.length - 1].instruction = 'Prendre tout droit ' + step.name; + break; + default: + data.routeInstructions[data.routeInstructions.length - 1].instruction = '?' + step.navInstruction + '? ' + step.name; + break; + } + }); + } + } + if (!data) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', 'json'))); + return; + } + break; + default: + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml'))); + return; + } + if (data && data.exceptionReport) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2'))); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY'))); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return RouteResponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, FormatsXML, FormatsWKT, UtilsMessagesResources, ServicesRouteFormatsRouteResponseRESTReader, ServicesRouteFormatsRouteResponseOLSReader, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction); + ServicesRouteRoute = function (Logger, _, ErrorService, CommonService, DefaultUrlService, RouteRequestFactory, RouteResponseFactory) { + function Route(options) { + if (!(this instanceof Route)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'Route')); + } + this.CLASSNAME = 'Route'; + CommonService.apply(this, arguments); + if (!options.startPoint) { + throw new Error(_.getMessage('PARAM_MISSING', 'startPoint')); + } + if (options.startPoint.x == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.x')); + } + if (options.startPoint.y == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'startPoint.y')); + } + if (!options.endPoint) { + throw new Error(_.getMessage('PARAM_MISSING', 'endPoint')); + } + if (options.endPoint.x == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.x')); + } + if (options.endPoint.y == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'endPoint.y')); + } + this.options.api = typeof options.api == 'string' ? options.api.toUpperCase() : 'REST'; + this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json'; + this.options.startPoint = options.startPoint; + this.options.endPoint = options.endPoint; + this.options.viaPoints = options.viaPoints || null; + this.options.exclusions = options.exclusions || null; + this.options.routePreference = options.routePreference || 'fastest'; + this.options.graph = options.graph || 'Voiture'; + this.options.geometryInInstructions = options.geometryInInstructions || false; + this.options.provideBbox = options.provideBbox || true; + this.options.distanceUnit = options.distanceUnit || 'km'; + this.options.expectedStartTime = null; + this.options.srs = options.srs || 'EPSG:4326'; + this.options.api = 'REST'; + if (this.options.protocol === 'XHR') { + this.options.httpMethod = 'GET'; + } + if (!this.options.serverUrl) { + var lstUrlByDefault = DefaultUrlService.Route.url(this.options.apiKey); + var urlFound = null; + switch (this.options.api) { + case 'OLS': + urlFound = lstUrlByDefault.ols; + break; + case 'REST': + var key = 'route' + '-' + this.options.outputFormat; + urlFound = lstUrlByDefault[key]; + break; + default: + throw new Error(_.getMessage('PARAM_UNKNOWN', 'api')); + } + if (!urlFound) { + throw new Error('Url by default not found !'); + } + this.options.serverUrl = urlFound; + } + var idx = this.options.serverUrl.lastIndexOf('.'); + if (idx !== -1) { + var extension = this.options.serverUrl.substring(idx + 1); + if (extension && extension.length < 5) { + switch (extension.toLowerCase()) { + case 'json': + case 'xml': + this.options.outputFormat = extension.toLowerCase(); + break; + default: + throw new Error('type of service : unknown or unsupported (json or xml) !'); + } + } + } + } + Route.prototype = Object.create(CommonService.prototype, {}); + Route.prototype.constructor = Route; + Route.prototype.buildRequest = function (error, success) { + var options = { + api: this.options.api, + startPoint: this.options.startPoint, + endPoint: this.options.endPoint, + viaPoints: this.options.viaPoints, + provideBbox: this.options.provideBbox, + exclusions: this.options.exclusions, + distanceUnit: this.options.distanceUnit, + graph: this.options.graph, + geometryInInstructions: this.options.geometryInInstructions, + routePreference: this.options.routePreference, + srs: this.options.srs + }; + this.request = RouteRequestFactory.build(options); + if (!this.request) { + error.call(this, new ErrorService(_.getMessage('SERVICE_REQUEST_BUILD'))); + } else { + success.call(this, this.request); + } + }; + Route.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + distanceUnit: this.options.distanceUnit, + response: this.response, + outputFormat: this.options.outputFormat, + api: this.options.api, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + RouteResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return Route; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesRouteRequestRouteRequestFactory, ServicesRouteResponseRouteResponseFactory); + ServicesProcessIsoCurveRequestModelProcessIsoCurveParam = function (Logger) { + function ProcessIsoCurveParam(options) { + if (!(this instanceof ProcessIsoCurveParam)) { + throw new TypeError('ProcessIsoCurveParam constructor cannot be called as a function.'); + } + this.options = options || {}; + this.id = this.options.id; + this.location = this.options.position; + this.srs = this.options.srs; + this.graphName = this.options.graph; + this.profileId = this.options.profileId || null; + this.profileName = this.options.profileName || null; + this.exclusions = this.options.exclusions; + this.reverse = this.options.reverse; + this.smoothing = this.options.smoothing; + this.holes = this.options.holes; + var value = this.options.method; + switch (value) { + case 'time': + this.method = 'time'; + this.time = this.options.time; + break; + case 'distance': + this.method = 'distance'; + this.distance = this.options.distance; + break; + default: + this.method = 'time'; + } + } + ProcessIsoCurveParam.CLASSNAME = 'ProcessIsoCurveParam'; + ProcessIsoCurveParam.prototype = { + constructor: ProcessIsoCurveParam, + getLocation: function () { + return this.location.x + ',' + this.location.y; + }, + getExclusions: function () { + return this.exclusions.join(';'); + } + }; + ProcessIsoCurveParam.prototype.getParams = function () { + var map = []; + map.push({ + k: 'location', + v: this.getLocation() + }); + map.push({ + k: 'smoothing', + v: this.smoothing + }); + map.push({ + k: 'holes', + v: this.holes + }); + map.push({ + k: 'reverse', + v: this.reverse + }); + map.push({ + k: 'method', + v: this.method + }); + if (this.time) { + map.push({ + k: 'time', + v: this.time + }); + } + if (this.distance) { + map.push({ + k: 'distance', + v: this.distance + }); + } + map.push({ + k: 'graphName', + v: this.graphName + }); + if (this.exclusions) { + map.push({ + k: 'exclusions', + v: this.getExclusions() + }); + } + if (this.srs) { + map.push({ + k: 'srs', + v: this.srs + }); + } + return map; + }; + return ProcessIsoCurveParam; + }(UtilsLoggerByDefault); + ServicesProcessIsoCurveRequestProcessIsoCurveRequest = function (Logger, _, ProcessIsoCurveParam) { + function ProcessIsoCurveRequest(options) { + if (!(this instanceof ProcessIsoCurveRequest)) { + throw new TypeError('ProcessIsoCurveRequest constructor cannot be called as a function.'); + } + if (!options) { + throw new Error(_.getMessage('PARAM_EMPTY', 'options')); + } + this.settings = options; + this.mode = this.settings.httpMethod || 'GET'; + } + ProcessIsoCurveRequest.prototype = { + requestString: null, + constructor: ProcessIsoCurveRequest, + template: { + container: '\n' + '\n' + '__ID__' + '\t\n' + '\t\t__X__\n' + '\t\t__Y__\n' + '\t\n' + '\t__SRS__\n' + '\t__GRAPHNAME__\n' + '__PROFIL__' + '__EXCLUSIONS__' + '\t__METHOD__\n' + '__TIME__' + '__DISTANCE__' + '\t__REVERSE__\n' + '\t__SMOOTHING__\n' + '\t__HOLES__\n' + '', + id: '\t__IDVALUE__\n', + profil: '\t__PROFILID__\n' + '\t__PROFILNAME__\n', + exclusions: { + container: '\t\n' + '__EXCLUSIONFEATURE__\n' + '\t\n', + feature: '\t\t__EXCLUSIONVALUE__' + }, + time: '\t\n', + distance: '\t__DISTANCEVALUE__\n' + }, + processRequestString: function () { + var request = ''; + var i = 0; + switch (this.mode) { + case 'GET': + var oParams = new ProcessIsoCurveParam(this.settings); + var params = oParams.getParams(); + for (i = 0; i < params.length; i++) { + var o = params[i]; + if (request) { + request += '&'; + } + request += o.k + '=' + o.v; + } + break; + case 'POST': + request = this.template.container; + request = request.replace(/__ID__/g, ''); + request = request.replace(/__PROFIL__/g, ''); + request = request.replace(/__X__/g, this.settings.position.x); + request = request.replace(/__Y__/g, this.settings.position.y); + request = request.replace(/__GRAPHNAME__/g, this.settings.graph); + request = request.replace(/__SRS__/g, this.settings.srs); + request = request.replace(/__SMOOTHING__/g, this.settings.smoothing); + request = request.replace(/__HOLES__/g, this.settings.holes); + request = request.replace(/__REVERSE__/g, this.settings.reverse); + if (this.settings.exclusions) { + var tmplExclusions = this.template.exclusions.container; + var exclusions = []; + for (i = 0; i < this.settings.exclusions.length; i++) { + var tmplFeature = this.template.exclusions.feature; + tmplFeature = tmplFeature.replace(/__EXCLUSIONVALUE__/, this.settings.exclusions[i]); + exclusions.push(tmplFeature); + } + tmplExclusions = tmplExclusions.replace(/__EXCLUSIONFEATURE__/, exclusions.join('\n')); + request = request.replace(/__EXCLUSIONS__/g, tmplExclusions); + } + request = request.replace(/__EXCLUSIONS__/g, ''); + if (this.settings.distance) { + var tmplDistance = this.template.distance; + tmplDistance = tmplDistance.replace(/__DISTANCEVALUE__/g, this.settings.distance); + request = request.replace(/__DISTANCE__/g, tmplDistance); + request = request.replace(/__METHOD__/g, 'distance'); + } + request = request.replace(/__DISTANCE__/g, ''); + if (this.settings.time) { + var tmplTime = this.template.time; + tmplTime = tmplTime.replace(/__TIMEVALUE__/g, this.settings.time); + request = request.replace(/__TIME__/g, tmplTime); + request = request.replace(/__METHOD__/g, 'time'); + } + request = request.replace(/__TIME__/g, ''); + break; + default: + } + this.requestString = request; + return this.requestString; + } + }; + return ProcessIsoCurveRequest; + }(UtilsLoggerByDefault, UtilsMessagesResources, ServicesProcessIsoCurveRequestModelProcessIsoCurveParam); + ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse = function () { + function ProcessIsoCurveResponse() { + if (!(this instanceof ProcessIsoCurveResponse)) { + throw new TypeError('ProcessIsoCurveResponse constructor cannot be called as a function.'); + } + this.message = null; + this.id = null; + this.location = {}; + this.location.x = null; + this.location.y = null; + this.srs = null; + this.geometry = null; + this.time = null; + this.distance = null; + } + ProcessIsoCurveResponse.prototype = { constructor: ProcessIsoCurveResponse }; + return ProcessIsoCurveResponse; + }(); + ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader = function (Logger, WKT, ErrSrv, MessagesResources, ProcessIsoCurveResponse) { + var ProcessIsoCurveResponseReader = {}; + ProcessIsoCurveResponseReader.READERS = { + isochronResult: function (root) { + var response = new ProcessIsoCurveResponse(); + if (root.hasChildNodes()) { + var children = root.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) { + ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response); + } + } + } + if (response.status === 'error') { + var message = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message); + throw new ErrSrv({ + message: message, + type: ErrSrv.TYPE_SRVERR + }); + } + return response; + }, + message: function (node, response) { + if (response) { + response.message = __getChildValue(node); + } + }, + status: function (node, response) { + var status = __getChildValue(node); + if (status === 'ERROR' || status === 'error') { + if (response) { + response.status = 'error'; + } + } + }, + id: function (node, response) { + if (response) { + response.id = __getChildValue(node); + } + }, + location: function (node, response) { + var coords = __getChildValue(node); + if (response && response.location) { + response.location.x = parseFloat(coords.split(',')[0]); + response.location.y = parseFloat(coords.split(',')[1]); + } + }, + srs: function (node, response) { + if (response) { + response.srs = __getChildValue(node); + } + }, + distance: function (node, response) { + if (response) { + response.distance = parseFloat(__getChildValue(node)); + } + }, + time: function (node, response) { + if (response) { + response.time = parseFloat(__getChildValue(node)); + } + }, + wktGeometry: function (node, response) { + if (response) { + var wktGeometry = node.innerHTML; + var onWKTSuccess = function (json) { + response.geometry = json; + }; + var onWKTError = function () { + var msg = MessagesResources.getMessage('PARAM_FORMAT', ['wktGeometry']); + throw new Error(msg); + }; + if (response.hasOwnProperty('geometry')) { + WKT.toJson(wktGeometry, onWKTSuccess, onWKTError); + } + } + }, + serviceResult: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (ProcessIsoCurveResponseReader.READERS[child.nodeName]) { + ProcessIsoCurveResponseReader.READERS[child.nodeName](child, response); + } + } + } + return response; + }, + ExceptionReport: function (node) { + var response = {}; + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeName === 'Exception') { + response.exceptionReport = ProcessIsoCurveResponseReader.READERS['Exception'](child); + } + } + } + return response; + }, + Exception: function (node) { + var exceptionReport = {}; + var exceptionCode = node.getAttribute('exceptionCode'); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + } + }; + ProcessIsoCurveResponseReader.read = function (root) { + var response; + if (root.nodeName === 'isochronResult' || root.nodeName === 'isochroneResult' || root.nodeName === 'IsochroneResult') { + response = ProcessIsoCurveResponseReader.READERS['isochronResult'](root); + return response; + } else if (root.nodeName === 'ExceptionReport') { + response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root); + return response; + } else if (ProcessIsoCurveResponseReader.READERS[root.nodeName]) { + response = ProcessIsoCurveResponseReader.READERS[root.nodeName](root); + if (response.status === 'error') { + var errMsg = MessagesResources.getMessage('SERVICE_RESPONSE_EXCEPTION', response.message); + throw new ErrSrv({ + message: errMsg, + type: ErrSrv.TYPE_SRVERR + }); + } + return response; + } else { + throw new ErrSrv({ + message: MessagesResources.getMessage('SERVICE_RESPONSE_ANALYSE', root.nodeName), + type: ErrSrv.TYPE_UNKERR + }); + } + }; + function __getChildValue(node) { + var textNode; + var value = ''; + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + value = textNode.nodeValue; + } + } + return value; + } + return ProcessIsoCurveResponseReader; + }(UtilsLoggerByDefault, FormatsWKT, ExceptionsErrorService, UtilsMessagesResources, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse); + ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory = function (Logger, ErrorService, MRes, XML, WKT, ProcessIsoCurveResponseReader, ProcessIsoCurveResponse) { + var ProcessIsoCurveResponseFactory = { + build: function (options) { + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + switch (options.outputFormat) { + case 'xml': + try { + var p = new XML({ reader: ProcessIsoCurveResponseReader }); + if (typeof options.response === 'string') { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new Error(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION_2')); + } + } catch (e) { + var message = e.message; + message += '\n(raw response service : \'' + options.response + '\')'; + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', message), + status: 200, + type: ErrorService.TYPE_SRVERR + })); + return; + } + break; + case 'json': + var JSONResponse; + if (typeof options.response === 'string') { + JSONResponse = window.JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + if (JSONResponse.status === 'OK' || JSONResponse.status === 'ok') { + data = new ProcessIsoCurveResponse(); + if (data) { + data.time = JSONResponse.time; + data.distance = JSONResponse.distance; + data.message = JSONResponse.message; + data.id = JSONResponse.id; + data.srs = JSONResponse.srs; + var onWKTSuccess = function (json) { + data.geometry = json; + }; + var onWKTError = function () { + options.onError.call(options.scope, new ErrorService({ message: MRes.getMessage('PARAM_FORMAT', 'wktGeometry') })); + }; + if (data.hasOwnProperty('geometry')) { + WKT.toJson(JSONResponse.wktGeometry, onWKTSuccess, onWKTError); + if (!data.geometry) { + return; + } + } + var coords = JSONResponse.location.split(','); + if (data.location) { + data.location.x = coords[0]; + data.location.y = coords[1]; + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_ANALYSE', options.response))); + return; + } + } else if (JSONResponse.status === 'ERROR' || JSONResponse.status === 'error') { + var mess = JSONResponse.message; + mess += '\n(raw response service : \'' + JSONResponse + '\')'; + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', mess))); + return; + } + break; + default: + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_FORMAT', 'json', 'xml'))); + return; + } + if (data && data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message: MRes.getMessage('SERVICE_RESPONSE_EXCEPTION', data.exceptionReport), + type: ErrorService.TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService(MRes.getMessage('SERVICE_RESPONSE_EMPTY'))); + return; + } + options.onSuccess.call(options.scope, data); + return; + } + }; + return ProcessIsoCurveResponseFactory; + }(UtilsLoggerByDefault, ExceptionsErrorService, UtilsMessagesResources, FormatsXML, FormatsWKT, ServicesProcessIsoCurveFormatsProcessIsoCurveResponseReader, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse); + ServicesProcessIsoCurveProcessIsoCurve = function (Logger, _, ErrorService, CommonService, DefaultUrlService, ProcessIsoCurveRequest, ProcessIsoCurveResponseFactory) { + function ProcessIsoCurve(options) { + if (!(this instanceof ProcessIsoCurve)) { + throw new TypeError(_.getMessage('CLASS_CONSTRUCTOR', 'ProcessIsoCurve')); + } + this.CLASSNAME = 'ProcessIsoCurve'; + CommonService.apply(this, arguments); + if (!options.position) { + throw new Error(_.getMessage('PARAM_MISSING', 'position')); + } + if (options.position.x == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'position.x')); + } + if (options.position.y == null) { + throw new Error(_.getMessage('PARAM_MISSING', 'position.y')); + } + if (!options.time && !options.distance) { + throw new Error('Parameter(s) \'distance\' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance'); + } + if (!options.time && options.distance) { + this.options.method = 'distance'; + if (this.options.time) { + delete this.options.time; + } + } + if (options.time && !options.distance) { + this.options.method = 'time'; + if (this.options.distance) { + delete this.options.distance; + } + } + this.options.method = this.options.method || 'time'; + this.options.exclusions = options.exclusions || null; + this.options.graph = options.graph || 'Voiture'; + this.options.reverse = options.reverse || false; + this.options.smoothing = options.smoothing || false; + this.options.holes = options.holes || false; + this.options.srs = options.srs || 'EPSG:4326'; + this.options.outputFormat = typeof options.outputFormat == 'string' ? options.outputFormat.toLowerCase() : 'json'; + if (!this.options.serverUrl) { + var lstUrlByDefault = DefaultUrlService.ProcessIsoCurve.url(this.options.apiKey); + var urlFound = lstUrlByDefault['iso' + '-' + this.options.outputFormat]; + if (!urlFound) { + throw new Error('Url by default not found !'); + } + this.options.serverUrl = urlFound; + } + var idx = this.options.serverUrl.lastIndexOf('.'); + if (idx !== -1) { + var extension = this.options.serverUrl.substring(idx + 1); + if (extension && extension.length < 5) { + switch (extension.toLowerCase()) { + case 'json': + case 'xml': + this.options.outputFormat = extension.toLowerCase(); + break; + default: + throw new Error('type of service : unknown or unsupported (json or xml) !'); + } + } + } + } + ProcessIsoCurve.prototype = Object.create(CommonService.prototype, {}); + ProcessIsoCurve.prototype.constructor = ProcessIsoCurve; + ProcessIsoCurve.prototype.buildRequest = function (error, success) { + try { + var oIsoCurve = new ProcessIsoCurveRequest(this.options); + if (!oIsoCurve.processRequestString()) { + throw new Error(_.getMessage('SERVICE_REQUEST_BUILD')); + } + this.request = oIsoCurve.requestString; + } catch (e) { + error.call(this, new ErrorService(e.message)); + return; + } + success.call(this, this.request); + }; + ProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) { + if (this.response) { + var options = { + response: this.response, + outputFormat: this.options.outputFormat, + rawResponse: this.options.rawResponse, + onSuccess: onSuccess, + onError: onError, + scope: this + }; + ProcessIsoCurveResponseFactory.build(options); + } else { + onError.call(this, new ErrorService(_.getMessage('SERVICE_RESPONSE_EMPTY'))); + } + }; + return ProcessIsoCurve; + }(UtilsLoggerByDefault, UtilsMessagesResources, ExceptionsErrorService, ServicesCommonService, ServicesDefaultUrlService, ServicesProcessIsoCurveRequestProcessIsoCurveRequest, ServicesProcessIsoCurveResponseProcessIsoCurveResponseFactory); + ServicesServices = function (Alti, AutoConf, Geocode, ReverseGeocode, AutoComplete, Route, ProcessIsoCurve) { + var Services = { + getConfig: function (options) { + var autoconfService = new AutoConf(options); + autoconfService.call(); + }, + getAltitude: function (options) { + var altiService = new Alti(options); + altiService.call(); + }, + geocode: function (options) { + var geocodeService = new Geocode(options); + geocodeService.call(); + }, + reverseGeocode: function (options) { + var reverseGeocodeService = new ReverseGeocode(options); + reverseGeocodeService.call(); + }, + autoComplete: function (options) { + var autoCompleteService = new AutoComplete(options); + autoCompleteService.call(); + }, + route: function (options) { + var routeService = new Route(options); + routeService.call(); + }, + isoCurve: function (options) { + var processIsoCurveService = new ProcessIsoCurve(options); + processIsoCurveService.call(); + } + }; + var point = {}; + var circle = {}; + var bbox = {}; + return Services; + }(ServicesAltiAlti, ServicesAutoConfAutoConf, ServicesGeocodeGeocode, ServicesGeocodeReverseGeocode, ServicesAutoCompleteAutoComplete, ServicesRouteRoute, ServicesProcessIsoCurveProcessIsoCurve); + Gp = function (XHR, Services, AltiResponse, Elevation, AutoCompleteResponse, SuggestedLocation, GetConfigResponse, Constraint, Format, Layer, Legend, Metadata, Originator, Service, Style, Territory, Thematic, TM, TMLimit, TMS, GeocodeResponse, GeocodedLocation, DirectGeocodedLocation, ReverseGeocodedLocation, IsoCurveResponse, RouteResponse, RouteInstruction, Error, Helper) { + var scope = typeof window !== 'undefined' ? window : {}; + var Gp = scope.Gp || { + servicesVersion: '1.0.0-beta3', + servicesDate: '2016-12-01', + extend: function (strNS, value) { + var parts = strNS.split('.'); + var parent = this; + var pl; + pl = parts.length; + for (var i = 0; i < pl; i++) { + if (typeof parent[parts[i]] === 'undefined') { + parent[parts[i]] = {}; + } + var n = pl - 1; + if (i === n) { + parent[parts[i]] = value; + } + parent = parent[parts[i]]; + } + return this; + } + }; + Gp.extend('Protocols', {}); + Gp.extend('Protocols.XHR', XHR); + Gp.extend('Services', Services); + Gp.extend('Services.AltiResponse', AltiResponse); + Gp.extend('Services.Alti.Elevation', Elevation); + Gp.extend('Services.AutoCompleteResponse', AutoCompleteResponse); + Gp.extend('Services.AutoComplete.SuggestedLocation', SuggestedLocation); + Gp.extend('Services.GetConfigResponse', GetConfigResponse); + Gp.extend('Services.Config.Constraint', Constraint); + Gp.extend('Services.Config.Format', Format); + Gp.extend('Services.Config.Layer', Layer); + Gp.extend('Services.Config.Legend', Legend); + Gp.extend('Services.Config.Metadata', Metadata); + Gp.extend('Services.Config.Originator', Originator); + Gp.extend('Services.Config.Service', Service); + Gp.extend('Services.Config.Style', Style); + Gp.extend('Services.Config.Territory', Territory); + Gp.extend('Services.Config.Thematic', SuggestedLocation); + Gp.extend('Services.Config.TileMatrix', TM); + Gp.extend('Services.Config.TileMatrixLimit', TMLimit); + Gp.extend('Services.Config.TileMatrixSet', TMS); + Gp.extend('Services.GeocodeResponse', GeocodeResponse); + Gp.extend('Services.Geocode.GeocodedLocation', GeocodedLocation); + Gp.extend('Services.Geocode.DirectGeocodedLocation', DirectGeocodedLocation); + Gp.extend('Services.Geocode.ReverseGeocodedLocation', ReverseGeocodedLocation); + Gp.extend('Services.IsoCurveResponse', IsoCurveResponse); + Gp.extend('Services.RouteResponse', RouteResponse); + Gp.extend('Services.Route.RouteInstruction', RouteInstruction); + Gp.extend('Error', Error); + Gp.extend('Helper', Helper); + scope.Gp = Gp; + return scope.Gp; + }(ProtocolsXHR, ServicesServices, ServicesAltiResponseModelAltiResponse, ServicesAltiResponseModelElevation, ServicesAutoCompleteResponseModelAutoCompleteResponse, ServicesAutoCompleteResponseModelSuggestedLocation, ServicesAutoConfResponseModelAutoConfResponse, ServicesAutoConfResponseModelConstraint, ServicesAutoConfResponseModelFormat, ServicesAutoConfResponseModelLayer, ServicesAutoConfResponseModelLegend, ServicesAutoConfResponseModelMetadata, ServicesAutoConfResponseModelOriginator, ServicesAutoConfResponseModelService, ServicesAutoConfResponseModelStyle, ServicesAutoConfResponseModelTerritory, ServicesAutoConfResponseModelThematic, ServicesAutoConfResponseModelTileMatrix, ServicesAutoConfResponseModelTileMatrixLimit, ServicesAutoConfResponseModelTileMatrixSet, ServicesGeocodeResponseModelGeocodeResponse, ServicesGeocodeResponseModelGeocodedLocation, ServicesGeocodeResponseModelDirectGeocodedLocation, ServicesGeocodeResponseModelReverseGeocodedLocation, ServicesProcessIsoCurveResponseModelProcessIsoCurveResponse, ServicesRouteResponseModelRouteResponse, ServicesRouteResponseModelRouteInstruction, ExceptionsErrorService, UtilsHelper); + return Gp; +})); +CommonUtilsAutoLoadConfig = function (Gp) { + (function () { + var scripts = document.getElementsByTagName('script'); + var key = scripts[scripts.length - 1].getAttribute('data-key'); + if (key) { + var splitKeys = key.split(/;|,|\|/); + if (key && splitKeys.length > 1) { + var keys = []; + for (var i = 0; i < splitKeys.length; i++) { + keys.push(splitKeys[i]); + } + key = keys; + } + } + var url = scripts[scripts.length - 1].getAttribute('data-url'); + var timeout = scripts[scripts.length - 1].getAttribute('data-timeout'); + var success = function () { + }; + var error = function (e) { + throw new Error('Configuration load failed : ' + e.message); + }; + if (!key && !url) { + return; + } + var options = { + apiKey: key, + onSuccess: success, + onFailure: error + }; + if (url) { + options.serverUrl = url; + options.callbackSuffix = ''; + } + if (timeout) { + options.timeOut = timeout; + } + if (!Gp.Config) { + Gp.Services.getConfig(options); + } + }()); +}(gp); +(function (window, document, undefined) { + L.drawVersion = '0.3.0-dev'; + L.drawLocal = { + draw: { + toolbar: { + actions: { + title: 'Cancel drawing', + text: 'Cancel' + }, + finish: { + title: 'Finish drawing', + text: 'Finish' + }, + undo: { + title: 'Delete last point drawn', + text: 'Delete last point' + }, + buttons: { + polyline: 'Draw a polyline', + polygon: 'Draw a polygon', + rectangle: 'Draw a rectangle', + circle: 'Draw a circle', + marker: 'Draw a marker' + } + }, + handlers: { + circle: { + tooltip: { start: 'Click and drag to draw circle.' }, + radius: 'Radius' + }, + marker: { tooltip: { start: 'Click map to place marker.' } }, + polygon: { + tooltip: { + start: 'Click to start drawing shape.', + cont: 'Click to continue drawing shape.', + end: 'Click first point to close this shape.' + } + }, + polyline: { + error: 'Error: shape edges cannot cross!', + tooltip: { + start: 'Click to start drawing line.', + cont: 'Click to continue drawing line.', + end: 'Click last point to finish line.' + } + }, + rectangle: { tooltip: { start: 'Click and drag to draw rectangle.' } }, + simpleshape: { tooltip: { end: 'Release mouse to finish drawing.' } } + } + }, + edit: { + toolbar: { + actions: { + save: { + title: 'Save changes.', + text: 'Save' + }, + cancel: { + title: 'Cancel editing, discards all changes.', + text: 'Cancel' + } + }, + buttons: { + edit: 'Edit layers.', + editDisabled: 'No layers to edit.', + remove: 'Delete layers.', + removeDisabled: 'No layers to delete.' + } + }, + handlers: { + edit: { + tooltip: { + text: 'Drag handles, or marker to edit feature.', + subtext: 'Click cancel to undo changes.' + } + }, + remove: { tooltip: { text: 'Click on a feature to remove' } } + } + } + }; + L.Draw = {}; + L.Draw.Feature = L.Handler.extend({ + includes: L.Mixin.Events, + initialize: function (map, options) { + this._map = map; + this._container = map._container; + this._overlayPane = map._panes.overlayPane; + this._popupPane = map._panes.popupPane; + if (options && options.shapeOptions) { + options.shapeOptions = L.Util.extend({}, this.options.shapeOptions, options.shapeOptions); + } + L.setOptions(this, options); + }, + enable: function () { + if (this._enabled) { + return; + } + L.Handler.prototype.enable.call(this); + this.fire('enabled', { handler: this.type }); + this._map.fire('draw:drawstart', { layerType: this.type }); + }, + disable: function () { + if (!this._enabled) { + return; + } + L.Handler.prototype.disable.call(this); + this._map.fire('draw:drawstop', { layerType: this.type }); + this.fire('disabled', { handler: this.type }); + }, + addHooks: function () { + var map = this._map; + if (map) { + L.DomUtil.disableTextSelection(); + map.getContainer().focus(); + this._tooltip = new L.Tooltip(this._map); + L.DomEvent.on(this._container, 'keyup', this._cancelDrawing, this); + } + }, + removeHooks: function () { + if (this._map) { + L.DomUtil.enableTextSelection(); + this._tooltip.dispose(); + this._tooltip = null; + L.DomEvent.off(this._container, 'keyup', this._cancelDrawing, this); + } + }, + setOptions: function (options) { + L.setOptions(this, options); + }, + _fireCreatedEvent: function (layer) { + this._map.fire('draw:created', { + layer: layer, + layerType: this.type + }); + }, + _cancelDrawing: function (e) { + if (e.keyCode === 27) { + this.disable(); + } + } + }); + L.Draw.Polyline = L.Draw.Feature.extend({ + statics: { TYPE: 'polyline' }, + Poly: L.Polyline, + options: { + allowIntersection: true, + repeatMode: false, + drawError: { + color: '#b00b00', + timeout: 2500 + }, + icon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon' + }), + touchIcon: new L.DivIcon({ + iconSize: new L.Point(20, 20), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon' + }), + guidelineDistance: 20, + maxGuideLineLength: 4000, + shapeOptions: { + stroke: true, + color: '#f06eaa', + weight: 4, + opacity: 0.5, + fill: false, + clickable: true + }, + metric: true, + feet: true, + showLength: true, + zIndexOffset: 2000 + }, + initialize: function (map, options) { + if (L.Browser.touch) { + this.options.icon = this.options.touchIcon; + } + this.options.drawError.message = L.drawLocal.draw.handlers.polyline.error; + if (options && options.drawError) { + options.drawError = L.Util.extend({}, this.options.drawError, options.drawError); + } + this.type = L.Draw.Polyline.TYPE; + L.Draw.Feature.prototype.initialize.call(this, map, options); + }, + addHooks: function () { + L.Draw.Feature.prototype.addHooks.call(this); + if (this._map) { + this._markers = []; + this._markerGroup = new L.LayerGroup(); + this._map.addLayer(this._markerGroup); + this._poly = new L.Polyline([], this.options.shapeOptions); + this._tooltip.updateContent(this._getTooltipText()); + if (!this._mouseMarker) { + this._mouseMarker = L.marker(this._map.getCenter(), { + icon: L.divIcon({ + className: 'leaflet-mouse-marker', + iconAnchor: [ + 20, + 20 + ], + iconSize: [ + 40, + 40 + ] + }), + opacity: 0, + zIndexOffset: this.options.zIndexOffset + }); + } + this._mouseMarker.on('mousedown', this._onMouseDown, this).on('mouseout', this._onMouseOut, this).on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).addTo(this._map); + this._map.on('mouseup', this._onMouseUp, this).on('mousemove', this._onMouseMove, this).on('zoomlevelschange', this._onZoomEnd, this).on('click', this._onTouch, this).on('zoomend', this._onZoomEnd, this); + } + }, + removeHooks: function () { + L.Draw.Feature.prototype.removeHooks.call(this); + this._clearHideErrorTimeout(); + this._cleanUpShape(); + this._map.removeLayer(this._markerGroup); + delete this._markerGroup; + delete this._markers; + this._map.removeLayer(this._poly); + delete this._poly; + this._mouseMarker.off('mousedown', this._onMouseDown, this).off('mouseout', this._onMouseOut, this).off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this); + this._map.removeLayer(this._mouseMarker); + delete this._mouseMarker; + this._clearGuides(); + this._map.off('mouseup', this._onMouseUp, this).off('mousemove', this._onMouseMove, this).off('mouseup', this._onMouseUp, this).off('zoomend', this._onZoomEnd, this).off('click', this._onTouch, this); + }, + deleteLastVertex: function () { + if (this._markers.length <= 1) { + return; + } + var lastMarker = this._markers.pop(), poly = this._poly, latlng = this._poly.spliceLatLngs(poly.getLatLngs().length - 1, 1)[0]; + this._markerGroup.removeLayer(lastMarker); + if (poly.getLatLngs().length < 2) { + this._map.removeLayer(poly); + } + this._vertexChanged(latlng, false); + }, + addVertex: function (latlng) { + var markersLength = this._markers.length; + if (markersLength > 0 && !this.options.allowIntersection && this._poly.newLatLngIntersects(latlng)) { + this._showErrorTooltip(); + return; + } else if (this._errorShown) { + this._hideErrorTooltip(); + } + this._markers.push(this._createMarker(latlng)); + this._poly.addLatLng(latlng); + if (this._poly.getLatLngs().length === 2) { + this._map.addLayer(this._poly); + } + this._vertexChanged(latlng, true); + }, + completeShape: function () { + if (this._markers.length <= 1) { + return; + } + this._fireCreatedEvent(); + this.disable(); + if (this.options.repeatMode) { + this.enable(); + } + }, + _finishShape: function () { + var intersects = this._poly.newLatLngIntersects(this._poly.getLatLngs()[0], true); + if (!this.options.allowIntersection && intersects || !this._shapeIsValid()) { + this._showErrorTooltip(); + return; + } + this._fireCreatedEvent(); + this.disable(); + if (this.options.repeatMode) { + this.enable(); + } + }, + _shapeIsValid: function () { + return true; + }, + _onZoomEnd: function () { + this._updateGuide(); + }, + _onMouseMove: function (e) { + var newPos = this._map.mouseEventToLayerPoint(e.originalEvent); + var latlng = this._map.layerPointToLatLng(newPos); + this._currentLatLng = latlng; + this._updateTooltip(latlng); + this._updateGuide(newPos); + this._mouseMarker.setLatLng(latlng); + L.DomEvent.preventDefault(e.originalEvent); + }, + _vertexChanged: function (latlng, added) { + this._map.fire('draw:drawvertex', { layers: this._markerGroup }); + this._updateFinishHandler(); + this._updateRunningMeasure(latlng, added); + this._clearGuides(); + this._updateTooltip(); + }, + _onMouseDown: function (e) { + var originalEvent = e.originalEvent; + this._mouseDownOrigin = L.point(originalEvent.clientX, originalEvent.clientY); + }, + _onMouseUp: function (e) { + if (this._mouseDownOrigin) { + var distance = L.point(e.originalEvent.clientX, e.originalEvent.clientY).distanceTo(this._mouseDownOrigin); + if (Math.abs(distance) < 9 * (window.devicePixelRatio || 1)) { + this.addVertex(e.latlng); + } + } + this._mouseDownOrigin = null; + }, + _onTouch: function (e) { + if (L.Browser.touch) { + this._onMouseDown(e); + this._onMouseUp(e); + } + }, + _onMouseOut: function () { + if (this._tooltip) { + this._tooltip._onMouseOut.call(this._tooltip); + } + }, + _updateFinishHandler: function () { + var markerCount = this._markers.length; + if (markerCount > 1) { + this._markers[markerCount - 1].on('click', this._finishShape, this); + } + if (markerCount > 2) { + this._markers[markerCount - 2].off('click', this._finishShape, this); + } + }, + _createMarker: function (latlng) { + var marker = new L.Marker(latlng, { + icon: this.options.icon, + zIndexOffset: this.options.zIndexOffset * 2 + }); + this._markerGroup.addLayer(marker); + return marker; + }, + _updateGuide: function (newPos) { + var markerCount = this._markers.length; + if (markerCount > 0) { + newPos = newPos || this._map.latLngToLayerPoint(this._currentLatLng); + this._clearGuides(); + this._drawGuide(this._map.latLngToLayerPoint(this._markers[markerCount - 1].getLatLng()), newPos); + } + }, + _updateTooltip: function (latLng) { + var text = this._getTooltipText(); + if (latLng) { + this._tooltip.updatePosition(latLng); + } + if (!this._errorShown) { + this._tooltip.updateContent(text); + } + }, + _drawGuide: function (pointA, pointB) { + var length = Math.floor(Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2))), guidelineDistance = this.options.guidelineDistance, maxGuideLineLength = this.options.maxGuideLineLength, i = length > maxGuideLineLength ? length - maxGuideLineLength : guidelineDistance, fraction, dashPoint, dash; + if (!this._guidesContainer) { + this._guidesContainer = L.DomUtil.create('div', 'leaflet-draw-guides', this._overlayPane); + } + for (; i < length; i += this.options.guidelineDistance) { + fraction = i / length; + dashPoint = { + x: Math.floor(pointA.x * (1 - fraction) + fraction * pointB.x), + y: Math.floor(pointA.y * (1 - fraction) + fraction * pointB.y) + }; + dash = L.DomUtil.create('div', 'leaflet-draw-guide-dash', this._guidesContainer); + dash.style.backgroundColor = !this._errorShown ? this.options.shapeOptions.color : this.options.drawError.color; + L.DomUtil.setPosition(dash, dashPoint); + } + }, + _updateGuideColor: function (color) { + if (this._guidesContainer) { + for (var i = 0, l = this._guidesContainer.childNodes.length; i < l; i++) { + this._guidesContainer.childNodes[i].style.backgroundColor = color; + } + } + }, + _clearGuides: function () { + if (this._guidesContainer) { + while (this._guidesContainer.firstChild) { + this._guidesContainer.removeChild(this._guidesContainer.firstChild); + } + } + }, + _getTooltipText: function () { + var showLength = this.options.showLength, labelText, distanceStr; + if (this._markers.length === 0) { + labelText = { text: L.drawLocal.draw.handlers.polyline.tooltip.start }; + } else { + distanceStr = showLength ? this._getMeasurementString() : ''; + if (this._markers.length === 1) { + labelText = { + text: L.drawLocal.draw.handlers.polyline.tooltip.cont, + subtext: distanceStr + }; + } else { + labelText = { + text: L.drawLocal.draw.handlers.polyline.tooltip.end, + subtext: distanceStr + }; + } + } + return labelText; + }, + _updateRunningMeasure: function (latlng, added) { + var markersLength = this._markers.length, previousMarkerIndex, distance; + if (this._markers.length === 1) { + this._measurementRunningTotal = 0; + } else { + previousMarkerIndex = markersLength - (added ? 2 : 1); + distance = latlng.distanceTo(this._markers[previousMarkerIndex].getLatLng()); + this._measurementRunningTotal += distance * (added ? 1 : -1); + } + }, + _getMeasurementString: function () { + var currentLatLng = this._currentLatLng, previousLatLng = this._markers[this._markers.length - 1].getLatLng(), distance; + distance = this._measurementRunningTotal + currentLatLng.distanceTo(previousLatLng); + return L.GeometryUtil.readableDistance(distance, this.options.metric, this.options.feet); + }, + _showErrorTooltip: function () { + this._errorShown = true; + this._tooltip.showAsError().updateContent({ text: this.options.drawError.message }); + this._updateGuideColor(this.options.drawError.color); + this._poly.setStyle({ color: this.options.drawError.color }); + this._clearHideErrorTimeout(); + this._hideErrorTimeout = setTimeout(L.Util.bind(this._hideErrorTooltip, this), this.options.drawError.timeout); + }, + _hideErrorTooltip: function () { + this._errorShown = false; + this._clearHideErrorTimeout(); + this._tooltip.removeError().updateContent(this._getTooltipText()); + this._updateGuideColor(this.options.shapeOptions.color); + this._poly.setStyle({ color: this.options.shapeOptions.color }); + }, + _clearHideErrorTimeout: function () { + if (this._hideErrorTimeout) { + clearTimeout(this._hideErrorTimeout); + this._hideErrorTimeout = null; + } + }, + _cleanUpShape: function () { + if (this._markers.length > 1) { + this._markers[this._markers.length - 1].off('click', this._finishShape, this); + } + }, + _fireCreatedEvent: function () { + var poly = new this.Poly(this._poly.getLatLngs(), this.options.shapeOptions); + L.Draw.Feature.prototype._fireCreatedEvent.call(this, poly); + } + }); + L.Draw.Polygon = L.Draw.Polyline.extend({ + statics: { TYPE: 'polygon' }, + Poly: L.Polygon, + options: { + showArea: false, + shapeOptions: { + stroke: true, + color: '#f06eaa', + weight: 4, + opacity: 0.5, + fill: true, + fillColor: null, + fillOpacity: 0.2, + clickable: true + } + }, + initialize: function (map, options) { + L.Draw.Polyline.prototype.initialize.call(this, map, options); + this.type = L.Draw.Polygon.TYPE; + }, + _updateFinishHandler: function () { + var markerCount = this._markers.length; + if (markerCount === 1) { + this._markers[0].on('click', this._finishShape, this); + } + if (markerCount > 2) { + this._markers[markerCount - 1].on('dblclick', this._finishShape, this); + if (markerCount > 3) { + this._markers[markerCount - 2].off('dblclick', this._finishShape, this); + } + } + }, + _getTooltipText: function () { + var text, subtext; + if (this._markers.length === 0) { + text = L.drawLocal.draw.handlers.polygon.tooltip.start; + } else if (this._markers.length < 3) { + text = L.drawLocal.draw.handlers.polygon.tooltip.cont; + } else { + text = L.drawLocal.draw.handlers.polygon.tooltip.end; + subtext = this._getMeasurementString(); + } + return { + text: text, + subtext: subtext + }; + }, + _getMeasurementString: function () { + var area = this._area; + if (!area) { + return null; + } + return L.GeometryUtil.readableArea(area, this.options.metric); + }, + _shapeIsValid: function () { + return this._markers.length >= 3; + }, + _vertexChanged: function (latlng, added) { + var latLngs; + if (!this.options.allowIntersection && this.options.showArea) { + latLngs = this._poly.getLatLngs(); + this._area = L.GeometryUtil.geodesicArea(latLngs); + } + L.Draw.Polyline.prototype._vertexChanged.call(this, latlng, added); + }, + _cleanUpShape: function () { + var markerCount = this._markers.length; + if (markerCount > 0) { + this._markers[0].off('click', this._finishShape, this); + if (markerCount > 2) { + this._markers[markerCount - 1].off('dblclick', this._finishShape, this); + } + } + } + }); + L.SimpleShape = {}; + L.Draw.SimpleShape = L.Draw.Feature.extend({ + options: { repeatMode: false }, + initialize: function (map, options) { + this._endLabelText = L.drawLocal.draw.handlers.simpleshape.tooltip.end; + L.Draw.Feature.prototype.initialize.call(this, map, options); + }, + addHooks: function () { + L.Draw.Feature.prototype.addHooks.call(this); + if (this._map) { + this._mapDraggable = this._map.dragging.enabled(); + if (this._mapDraggable) { + this._map.dragging.disable(); + } + this._container.style.cursor = 'crosshair'; + this._tooltip.updateContent({ text: this._initialLabelText }); + this._map.on('mousedown', this._onMouseDown, this).on('mousemove', this._onMouseMove, this).on('touchstart', this._onMouseDown, this).on('touchmove', this._onMouseMove, this); + } + }, + removeHooks: function () { + L.Draw.Feature.prototype.removeHooks.call(this); + if (this._map) { + if (this._mapDraggable) { + this._map.dragging.enable(); + } + this._container.style.cursor = ''; + this._map.off('mousedown', this._onMouseDown, this).off('mousemove', this._onMouseMove, this).off('touchstart', this._onMouseDown, this).off('touchmove', this._onMouseMove, this); + L.DomEvent.off(document, 'mouseup', this._onMouseUp, this); + L.DomEvent.off(document, 'touchend', this._onMouseUp, this); + if (this._shape) { + this._map.removeLayer(this._shape); + delete this._shape; + } + } + this._isDrawing = false; + }, + _getTooltipText: function () { + return { text: this._endLabelText }; + }, + _onMouseDown: function (e) { + this._isDrawing = true; + this._startLatLng = e.latlng; + L.DomEvent.on(document, 'mouseup', this._onMouseUp, this).on(document, 'touchend', this._onMouseUp, this).preventDefault(e.originalEvent); + }, + _onMouseMove: function (e) { + var latlng = e.latlng; + this._tooltip.updatePosition(latlng); + if (this._isDrawing) { + this._tooltip.updateContent(this._getTooltipText()); + this._drawShape(latlng); + } + }, + _onMouseUp: function () { + if (this._shape) { + this._fireCreatedEvent(); + } + this.disable(); + if (this.options.repeatMode) { + this.enable(); + } + } + }); + L.Draw.Rectangle = L.Draw.SimpleShape.extend({ + statics: { TYPE: 'rectangle' }, + options: { + shapeOptions: { + stroke: true, + color: '#f06eaa', + weight: 4, + opacity: 0.5, + fill: true, + fillColor: null, + fillOpacity: 0.2, + clickable: true + }, + metric: true + }, + initialize: function (map, options) { + this.type = L.Draw.Rectangle.TYPE; + this._initialLabelText = L.drawLocal.draw.handlers.rectangle.tooltip.start; + L.Draw.SimpleShape.prototype.initialize.call(this, map, options); + }, + _drawShape: function (latlng) { + if (!this._shape) { + this._shape = new L.Rectangle(new L.LatLngBounds(this._startLatLng, latlng), this.options.shapeOptions); + this._map.addLayer(this._shape); + } else { + this._shape.setBounds(new L.LatLngBounds(this._startLatLng, latlng)); + } + }, + _fireCreatedEvent: function () { + var rectangle = new L.Rectangle(this._shape.getBounds(), this.options.shapeOptions); + L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle); + }, + _getTooltipText: function () { + var tooltipText = L.Draw.SimpleShape.prototype._getTooltipText.call(this), shape = this._shape, latLngs, area, subtext; + if (shape) { + latLngs = this._shape.getLatLngs(); + area = L.GeometryUtil.geodesicArea(latLngs); + subtext = L.GeometryUtil.readableArea(area, this.options.metric); + } + return { + text: tooltipText.text, + subtext: subtext + }; + } + }); + L.Draw.Circle = L.Draw.SimpleShape.extend({ + statics: { TYPE: 'circle' }, + options: { + shapeOptions: { + stroke: true, + color: '#f06eaa', + weight: 4, + opacity: 0.5, + fill: true, + fillColor: null, + fillOpacity: 0.2, + clickable: true + }, + showRadius: true, + metric: true, + feet: true + }, + initialize: function (map, options) { + this.type = L.Draw.Circle.TYPE; + this._initialLabelText = L.drawLocal.draw.handlers.circle.tooltip.start; + L.Draw.SimpleShape.prototype.initialize.call(this, map, options); + }, + _drawShape: function (latlng) { + if (!this._shape) { + this._shape = new L.Circle(this._startLatLng, this._startLatLng.distanceTo(latlng), this.options.shapeOptions); + this._map.addLayer(this._shape); + } else { + this._shape.setRadius(this._startLatLng.distanceTo(latlng)); + } + }, + _fireCreatedEvent: function () { + var circle = new L.Circle(this._startLatLng, this._shape.getRadius(), this.options.shapeOptions); + L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, circle); + }, + _onMouseMove: function (e) { + var latlng = e.latlng, showRadius = this.options.showRadius, useMetric = this.options.metric, radius; + this._tooltip.updatePosition(latlng); + if (this._isDrawing) { + this._drawShape(latlng); + radius = this._shape.getRadius().toFixed(1); + this._tooltip.updateContent({ + text: this._endLabelText, + subtext: showRadius ? L.drawLocal.draw.handlers.circle.radius + ': ' + L.GeometryUtil.readableDistance(radius, useMetric, this.options.feet) : '' + }); + } + } + }); + L.Draw.Marker = L.Draw.Feature.extend({ + statics: { TYPE: 'marker' }, + options: { + icon: new L.Icon.Default(), + repeatMode: false, + zIndexOffset: 2000 + }, + initialize: function (map, options) { + this.type = L.Draw.Marker.TYPE; + L.Draw.Feature.prototype.initialize.call(this, map, options); + }, + addHooks: function () { + L.Draw.Feature.prototype.addHooks.call(this); + if (this._map) { + this._tooltip.updateContent({ text: L.drawLocal.draw.handlers.marker.tooltip.start }); + if (!this._mouseMarker) { + this._mouseMarker = L.marker(this._map.getCenter(), { + icon: L.divIcon({ + className: 'leaflet-mouse-marker', + iconAnchor: [ + 20, + 20 + ], + iconSize: [ + 40, + 40 + ] + }), + opacity: 0, + zIndexOffset: this.options.zIndexOffset + }); + } + this._mouseMarker.on('click', this._onClick, this).addTo(this._map); + this._map.on('mousemove', this._onMouseMove, this); + this._map.on('click', this._onTouch, this); + } + }, + removeHooks: function () { + L.Draw.Feature.prototype.removeHooks.call(this); + if (this._map) { + if (this._marker) { + this._marker.off('click', this._onClick, this); + this._map.off('click', this._onClick, this).off('click', this._onTouch, this).removeLayer(this._marker); + delete this._marker; + } + this._mouseMarker.off('click', this._onClick, this); + this._map.removeLayer(this._mouseMarker); + delete this._mouseMarker; + this._map.off('mousemove', this._onMouseMove, this); + } + }, + _onMouseMove: function (e) { + var latlng = e.latlng; + this._tooltip.updatePosition(latlng); + this._mouseMarker.setLatLng(latlng); + if (!this._marker) { + this._marker = new L.Marker(latlng, { + icon: this.options.icon, + zIndexOffset: this.options.zIndexOffset + }); + this._marker.on('click', this._onClick, this); + this._map.on('click', this._onClick, this).addLayer(this._marker); + } else { + latlng = this._mouseMarker.getLatLng(); + this._marker.setLatLng(latlng); + } + }, + _onClick: function () { + this._fireCreatedEvent(); + this.disable(); + if (this.options.repeatMode) { + this.enable(); + } + }, + _onTouch: function (e) { + this._onMouseMove(e); + this._onClick(); + }, + _fireCreatedEvent: function () { + var marker = new L.Marker.Touch(this._marker.getLatLng(), { icon: this.options.icon }); + L.Draw.Feature.prototype._fireCreatedEvent.call(this, marker); + } + }); + L.Edit = L.Edit || {}; + L.Edit.Marker = L.Handler.extend({ + initialize: function (marker, options) { + this._marker = marker; + L.setOptions(this, options); + }, + addHooks: function () { + var marker = this._marker; + marker.dragging.enable(); + marker.on('dragend', this._onDragEnd, marker); + this._toggleMarkerHighlight(); + }, + removeHooks: function () { + var marker = this._marker; + marker.dragging.disable(); + marker.off('dragend', this._onDragEnd, marker); + this._toggleMarkerHighlight(); + }, + _onDragEnd: function (e) { + var layer = e.target; + layer.edited = true; + }, + _toggleMarkerHighlight: function () { + var icon = this._marker._icon; + if (!icon) { + return; + } + icon.style.display = 'none'; + if (L.DomUtil.hasClass(icon, 'leaflet-edit-marker-selected')) { + L.DomUtil.removeClass(icon, 'leaflet-edit-marker-selected'); + this._offsetMarker(icon, -4); + } else { + L.DomUtil.addClass(icon, 'leaflet-edit-marker-selected'); + this._offsetMarker(icon, 4); + } + icon.style.display = ''; + }, + _offsetMarker: function (icon, offset) { + var iconMarginTop = parseInt(icon.style.marginTop, 10) - offset, iconMarginLeft = parseInt(icon.style.marginLeft, 10) - offset; + icon.style.marginTop = iconMarginTop + 'px'; + icon.style.marginLeft = iconMarginLeft + 'px'; + } + }); + L.Marker.addInitHook(function () { + if (L.Edit.Marker) { + this.editing = new L.Edit.Marker(this); + if (this.options.editable) { + this.editing.enable(); + } + } + }); + L.Edit = L.Edit || {}; + L.Edit.Poly = L.Handler.extend({ + options: {}, + initialize: function (poly, options) { + this.latlngs = [poly._latlngs]; + if (poly._holes) { + this.latlngs = this.latlngs.concat(poly._holes); + } + this._verticesHandlers = []; + for (var i = 0; i < this.latlngs.length; i++) { + this._verticesHandlers.push(new L.Edit.PolyVerticesEdit(poly, this.latlngs[i], options)); + } + this._poly = poly; + L.setOptions(this, options); + }, + _eachVertexHandler: function (callback) { + for (var i = 0; i < this._verticesHandlers.length; i++) { + callback(this._verticesHandlers[i]); + } + }, + addHooks: function () { + this._eachVertexHandler(function (handler) { + handler.addHooks(); + }); + }, + removeHooks: function () { + this._eachVertexHandler(function (handler) { + handler.removeHooks(); + }); + }, + updateMarkers: function () { + this._eachVertexHandler(function (handler) { + handler.updateMarkers(); + }); + } + }); + L.Edit.PolyVerticesEdit = L.Handler.extend({ + options: { + icon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon' + }), + touchIcon: new L.DivIcon({ + iconSize: new L.Point(20, 20), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-touch-icon' + }) + }, + initialize: function (poly, latlngs, options) { + if (L.Browser.touch) { + this.options.icon = this.options.touchIcon; + } + this._poly = poly; + this._latlngs = latlngs; + L.setOptions(this, options); + }, + addHooks: function () { + var poly = this._poly; + if (!(poly instanceof L.Polygon)) { + poly.options.editing.fill = false; + } + poly.setStyle(poly.options.editing); + if (this._poly._map) { + this._map = this._poly._map; + if (!this._markerGroup) { + this._initMarkers(); + } + this._poly._map.addLayer(this._markerGroup); + } + }, + removeHooks: function () { + var poly = this._poly; + poly.setStyle(poly.options.original); + if (poly._map) { + poly._map.removeLayer(this._markerGroup); + delete this._markerGroup; + delete this._markers; + } + }, + updateMarkers: function () { + this._markerGroup.clearLayers(); + this._initMarkers(); + }, + _initMarkers: function () { + if (!this._markerGroup) { + this._markerGroup = new L.LayerGroup(); + } + this._markers = []; + var latlngs = this._latlngs, i, j, len, marker; + for (i = 0, len = latlngs.length; i < len; i++) { + marker = this._createMarker(latlngs[i], i); + marker.on('click', this._onMarkerClick, this); + this._markers.push(marker); + } + var markerLeft, markerRight; + for (i = 0, j = len - 1; i < len; j = i++) { + if (i === 0 && !(L.Polygon && this._poly instanceof L.Polygon)) { + continue; + } + markerLeft = this._markers[j]; + markerRight = this._markers[i]; + this._createMiddleMarker(markerLeft, markerRight); + this._updatePrevNext(markerLeft, markerRight); + } + }, + _createMarker: function (latlng, index) { + var marker = new L.Marker.Touch(latlng, { + draggable: true, + icon: this.options.icon + }); + marker._origLatLng = latlng; + marker._index = index; + marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._fireEdit, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._fireEdit, this).on('MSPointerUp', this._fireEdit, this); + this._markerGroup.addLayer(marker); + return marker; + }, + _onMarkerDragStart: function () { + this._poly.fire('editstart'); + }, + _spliceLatLngs: function () { + var removed = [].splice.apply(this._latlngs, arguments); + this._poly._convertLatLngs(this._latlngs, true); + this._poly.redraw(); + return removed; + }, + _removeMarker: function (marker) { + var i = marker._index; + this._markerGroup.removeLayer(marker); + this._markers.splice(i, 1); + this._spliceLatLngs(i, 1); + this._updateIndexes(i, -1); + marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._fireEdit, this).off('touchmove', this._onMarkerDrag, this).off('touchend', this._fireEdit, this).off('click', this._onMarkerClick, this); + }, + _fireEdit: function () { + this._poly.edited = true; + this._poly.fire('edit'); + this._poly._map.fire('draw:editvertex', { layers: this._markerGroup }); + }, + _onMarkerDrag: function (e) { + var marker = e.target; + L.extend(marker._origLatLng, marker._latlng); + if (marker._middleLeft) { + marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); + } + if (marker._middleRight) { + marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); + } + this._poly.redraw(); + this._poly.fire('editdrag'); + }, + _onMarkerClick: function (e) { + var minPoints = L.Polygon && this._poly instanceof L.Polygon ? 4 : 3, marker = e.target; + if (this._latlngs.length < minPoints) { + return; + } + this._removeMarker(marker); + this._updatePrevNext(marker._prev, marker._next); + if (marker._middleLeft) { + this._markerGroup.removeLayer(marker._middleLeft); + } + if (marker._middleRight) { + this._markerGroup.removeLayer(marker._middleRight); + } + if (marker._prev && marker._next) { + this._createMiddleMarker(marker._prev, marker._next); + } else if (!marker._prev) { + marker._next._middleLeft = null; + } else if (!marker._next) { + marker._prev._middleRight = null; + } + this._fireEdit(); + }, + _onTouchMove: function (e) { + var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target; + L.extend(marker._origLatLng, latlng); + if (marker._middleLeft) { + marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); + } + if (marker._middleRight) { + marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); + } + this._poly.redraw(); + this.updateMarkers(); + }, + _updateIndexes: function (index, delta) { + this._markerGroup.eachLayer(function (marker) { + if (marker._index > index) { + marker._index += delta; + } + }); + }, + _createMiddleMarker: function (marker1, marker2) { + var latlng = this._getMiddleLatLng(marker1, marker2), marker = this._createMarker(latlng), onClick, onDragStart, onDragEnd; + marker.setOpacity(0.6); + marker1._middleRight = marker2._middleLeft = marker; + onDragStart = function () { + var i = marker2._index; + marker._index = i; + marker.off('click', onClick, this).on('click', this._onMarkerClick, this); + latlng.lat = marker.getLatLng().lat; + latlng.lng = marker.getLatLng().lng; + this._spliceLatLngs(i, 0, latlng); + this._markers.splice(i, 0, marker); + marker.setOpacity(1); + this._updateIndexes(i, 1); + marker2._index++; + this._updatePrevNext(marker1, marker); + this._updatePrevNext(marker, marker2); + this._poly.fire('editstart'); + }; + onDragEnd = function () { + marker.off('dragstart', onDragStart, this); + marker.off('dragend', onDragEnd, this); + marker.off('touchmove', onDragStart, this); + this._createMiddleMarker(marker1, marker); + this._createMiddleMarker(marker, marker2); + }; + onClick = function () { + onDragStart.call(this); + onDragEnd.call(this); + this._fireEdit(); + }; + marker.on('click', onClick, this).on('dragstart', onDragStart, this).on('dragend', onDragEnd, this).on('touchmove', onDragStart, this); + this._markerGroup.addLayer(marker); + }, + _updatePrevNext: function (marker1, marker2) { + if (marker1) { + marker1._next = marker2; + } + if (marker2) { + marker2._prev = marker1; + } + }, + _getMiddleLatLng: function (marker1, marker2) { + var map = this._poly._map, p1 = map.project(marker1.getLatLng()), p2 = map.project(marker2.getLatLng()); + return map.unproject(p1._add(p2)._divideBy(2)); + } + }); + L.Polyline.addInitHook(function () { + if (this.editing) { + return; + } + if (L.Edit.Poly) { + this.editing = new L.Edit.Poly(this); + if (this.options.editable) { + this.editing.enable(); + } + } + this.on('add', function () { + if (this.editing && this.editing.enabled()) { + this.editing.addHooks(); + } + }); + this.on('remove', function () { + if (this.editing && this.editing.enabled()) { + this.editing.removeHooks(); + } + }); + }); + L.Edit = L.Edit || {}; + L.Edit.SimpleShape = L.Handler.extend({ + options: { + moveIcon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move' + }), + resizeIcon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize' + }), + touchMoveIcon: new L.DivIcon({ + iconSize: new L.Point(20, 20), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon' + }), + touchResizeIcon: new L.DivIcon({ + iconSize: new L.Point(20, 20), + className: 'leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon' + }) + }, + initialize: function (shape, options) { + if (L.Browser.touch) { + this.options.moveIcon = this.options.touchMoveIcon; + this.options.resizeIcon = this.options.touchResizeIcon; + } + this._shape = shape; + L.Util.setOptions(this, options); + }, + addHooks: function () { + var shape = this._shape; + if (this._shape._map) { + this._map = this._shape._map; + shape.setStyle(shape.options.editing); + if (shape._map) { + this._map = shape._map; + if (!this._markerGroup) { + this._initMarkers(); + } + this._map.addLayer(this._markerGroup); + } + } + }, + removeHooks: function () { + var shape = this._shape; + shape.setStyle(shape.options.original); + if (shape._map) { + this._unbindMarker(this._moveMarker); + for (var i = 0, l = this._resizeMarkers.length; i < l; i++) { + this._unbindMarker(this._resizeMarkers[i]); + } + this._resizeMarkers = null; + this._map.removeLayer(this._markerGroup); + delete this._markerGroup; + } + this._map = null; + }, + updateMarkers: function () { + this._markerGroup.clearLayers(); + this._initMarkers(); + }, + _initMarkers: function () { + if (!this._markerGroup) { + this._markerGroup = new L.LayerGroup(); + } + this._createMoveMarker(); + this._createResizeMarker(); + }, + _createMoveMarker: function () { + }, + _createResizeMarker: function () { + }, + _createMarker: function (latlng, icon) { + var marker = new L.Marker.Touch(latlng, { + draggable: true, + icon: icon, + zIndexOffset: 10 + }); + this._bindMarker(marker); + this._markerGroup.addLayer(marker); + return marker; + }, + _bindMarker: function (marker) { + marker.on('dragstart', this._onMarkerDragStart, this).on('drag', this._onMarkerDrag, this).on('dragend', this._onMarkerDragEnd, this).on('touchstart', this._onTouchStart, this).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onTouchEnd, this).on('MSPointerUp', this._onTouchEnd, this); + }, + _unbindMarker: function (marker) { + marker.off('dragstart', this._onMarkerDragStart, this).off('drag', this._onMarkerDrag, this).off('dragend', this._onMarkerDragEnd, this).off('touchstart', this._onTouchStart, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onTouchEnd, this).off('MSPointerUp', this._onTouchEnd, this); + }, + _onMarkerDragStart: function (e) { + var marker = e.target; + marker.setOpacity(0); + this._shape.fire('editstart'); + }, + _fireEdit: function () { + this._shape.edited = true; + this._shape.fire('edit'); + }, + _onMarkerDrag: function (e) { + var marker = e.target, latlng = marker.getLatLng(); + if (marker === this._moveMarker) { + this._move(latlng); + } else { + this._resize(latlng); + } + this._shape.redraw(); + this._shape.fire('editdrag'); + }, + _onMarkerDragEnd: function (e) { + var marker = e.target; + marker.setOpacity(1); + this._fireEdit(); + }, + _onTouchStart: function (e) { + L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e); + if (typeof this._getCorners === 'function') { + var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex; + marker.setOpacity(0); + this._oppositeCorner = corners[(currentCornerIndex + 2) % 4]; + this._toggleCornerMarkers(0, currentCornerIndex); + } + this._shape.fire('editstart'); + }, + _onTouchMove: function (e) { + var layerPoint = this._map.mouseEventToLayerPoint(e.originalEvent.touches[0]), latlng = this._map.layerPointToLatLng(layerPoint), marker = e.target; + if (marker === this._moveMarker) { + this._move(latlng); + } else { + this._resize(latlng); + } + this._shape.redraw(); + return false; + }, + _onTouchEnd: function (e) { + var marker = e.target; + marker.setOpacity(1); + this.updateMarkers(); + this._fireEdit(); + }, + _move: function () { + }, + _resize: function () { + } + }); + L.Edit = L.Edit || {}; + L.Edit.Rectangle = L.Edit.SimpleShape.extend({ + _createMoveMarker: function () { + var bounds = this._shape.getBounds(), center = bounds.getCenter(); + this._moveMarker = this._createMarker(center, this.options.moveIcon); + }, + _createResizeMarker: function () { + var corners = this._getCorners(); + this._resizeMarkers = []; + for (var i = 0, l = corners.length; i < l; i++) { + this._resizeMarkers.push(this._createMarker(corners[i], this.options.resizeIcon)); + this._resizeMarkers[i]._cornerIndex = i; + } + }, + _onMarkerDragStart: function (e) { + L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this, e); + var corners = this._getCorners(), marker = e.target, currentCornerIndex = marker._cornerIndex; + this._oppositeCorner = corners[(currentCornerIndex + 2) % 4]; + this._toggleCornerMarkers(0, currentCornerIndex); + }, + _onMarkerDragEnd: function (e) { + var marker = e.target, bounds, center; + if (marker === this._moveMarker) { + bounds = this._shape.getBounds(); + center = bounds.getCenter(); + marker.setLatLng(center); + } + this._toggleCornerMarkers(1); + this._repositionCornerMarkers(); + L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this, e); + }, + _move: function (newCenter) { + var latlngs = this._shape.getLatLngs(), bounds = this._shape.getBounds(), center = bounds.getCenter(), offset, newLatLngs = []; + for (var i = 0, l = latlngs.length; i < l; i++) { + offset = [ + latlngs[i].lat - center.lat, + latlngs[i].lng - center.lng + ]; + newLatLngs.push([ + newCenter.lat + offset[0], + newCenter.lng + offset[1] + ]); + } + this._shape.setLatLngs(newLatLngs); + this._repositionCornerMarkers(); + }, + _resize: function (latlng) { + var bounds; + this._shape.setBounds(L.latLngBounds(latlng, this._oppositeCorner)); + bounds = this._shape.getBounds(); + this._moveMarker.setLatLng(bounds.getCenter()); + }, + _getCorners: function () { + var bounds = this._shape.getBounds(), nw = bounds.getNorthWest(), ne = bounds.getNorthEast(), se = bounds.getSouthEast(), sw = bounds.getSouthWest(); + return [ + nw, + ne, + se, + sw + ]; + }, + _toggleCornerMarkers: function (opacity) { + for (var i = 0, l = this._resizeMarkers.length; i < l; i++) { + this._resizeMarkers[i].setOpacity(opacity); + } + }, + _repositionCornerMarkers: function () { + var corners = this._getCorners(); + for (var i = 0, l = this._resizeMarkers.length; i < l; i++) { + this._resizeMarkers[i].setLatLng(corners[i]); + } + } + }); + L.Rectangle.addInitHook(function () { + if (L.Edit.Rectangle) { + this.editing = new L.Edit.Rectangle(this); + if (this.options.editable) { + this.editing.enable(); + } + } + }); + L.Edit = L.Edit || {}; + L.Edit.Circle = L.Edit.SimpleShape.extend({ + _createMoveMarker: function () { + var center = this._shape.getLatLng(); + this._moveMarker = this._createMarker(center, this.options.moveIcon); + }, + _createResizeMarker: function () { + var center = this._shape.getLatLng(), resizemarkerPoint = this._getResizeMarkerPoint(center); + this._resizeMarkers = []; + this._resizeMarkers.push(this._createMarker(resizemarkerPoint, this.options.resizeIcon)); + }, + _getResizeMarkerPoint: function (latlng) { + var delta = this._shape._radius * Math.cos(Math.PI / 4), point = this._map.project(latlng); + return this._map.unproject([ + point.x + delta, + point.y - delta + ]); + }, + _move: function (latlng) { + var resizemarkerPoint = this._getResizeMarkerPoint(latlng); + this._resizeMarkers[0].setLatLng(resizemarkerPoint); + this._shape.setLatLng(latlng); + }, + _resize: function (latlng) { + var moveLatLng = this._moveMarker.getLatLng(), radius = moveLatLng.distanceTo(latlng); + this._shape.setRadius(radius); + } + }); + L.Circle.addInitHook(function () { + if (L.Edit.Circle) { + this.editing = new L.Edit.Circle(this); + if (this.options.editable) { + this.editing.enable(); + } + } + this.on('add', function () { + if (this.editing && this.editing.enabled()) { + this.editing.addHooks(); + } + }); + this.on('remove', function () { + if (this.editing && this.editing.enabled()) { + this.editing.removeHooks(); + } + }); + }); + L.Map.mergeOptions({ touchExtend: true }); + L.Map.TouchExtend = L.Handler.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + }, + addHooks: function () { + L.DomEvent.on(this._container, 'touchstart', this._onTouchStart, this); + L.DomEvent.on(this._container, 'touchend', this._onTouchEnd, this); + L.DomEvent.on(this._container, 'touchmove', this._onTouchMove, this); + if (this._detectIE()) { + L.DomEvent.on(this._container, 'MSPointerDown', this._onTouchStart, this); + L.DomEvent.on(this._container, 'MSPointerUp', this._onTouchEnd, this); + L.DomEvent.on(this._container, 'MSPointerMove', this._onTouchMove, this); + L.DomEvent.on(this._container, 'MSPointerCancel', this._onTouchCancel, this); + } else { + L.DomEvent.on(this._container, 'touchcancel', this._onTouchCancel, this); + L.DomEvent.on(this._container, 'touchleave', this._onTouchLeave, this); + } + }, + removeHooks: function () { + L.DomEvent.off(this._container, 'touchstart', this._onTouchStart); + L.DomEvent.off(this._container, 'touchend', this._onTouchEnd); + L.DomEvent.off(this._container, 'touchmove', this._onTouchMove); + if (this._detectIE()) { + L.DomEvent.off(this._container, 'MSPointerDowm', this._onTouchStart); + L.DomEvent.off(this._container, 'MSPointerUp', this._onTouchEnd); + L.DomEvent.off(this._container, 'MSPointerMove', this._onTouchMove); + L.DomEvent.off(this._container, 'MSPointerCancel', this._onTouchCancel); + } else { + L.DomEvent.off(this._container, 'touchcancel', this._onTouchCancel); + L.DomEvent.off(this._container, 'touchleave', this._onTouchLeave); + } + }, + _touchEvent: function (e, type) { + var touchEvent = {}; + if (typeof e.touches !== 'undefined') { + if (!e.touches.length) { + return; + } + touchEvent = e.touches[0]; + } else if (e.pointerType === 'touch') { + touchEvent = e; + if (!this._filterClick(e)) { + return; + } + } else { + return; + } + var containerPoint = this._map.mouseEventToContainerPoint(touchEvent), layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint); + this._map.fire(type, { + latlng: latlng, + layerPoint: layerPoint, + containerPoint: containerPoint, + pageX: touchEvent.pageX, + pageY: touchEvent.pageY, + originalEvent: e + }); + }, + _filterClick: function (e) { + var timeStamp = e.timeStamp || e.originalEvent.timeStamp, elapsed = L.DomEvent._lastClick && timeStamp - L.DomEvent._lastClick; + if (elapsed && elapsed > 100 && elapsed < 500 || e.target._simulatedClick && !e._simulated) { + L.DomEvent.stop(e); + return false; + } + L.DomEvent._lastClick = timeStamp; + return true; + }, + _onTouchStart: function (e) { + if (!this._map._loaded) { + return; + } + var type = 'touchstart'; + this._touchEvent(e, type); + }, + _onTouchEnd: function (e) { + if (!this._map._loaded) { + return; + } + var type = 'touchend'; + this._touchEvent(e, type); + }, + _onTouchCancel: function (e) { + if (!this._map._loaded) { + return; + } + var type = 'touchcancel'; + if (this._detectIE()) { + type = 'pointercancel'; + } + this._touchEvent(e, type); + }, + _onTouchLeave: function (e) { + if (!this._map._loaded) { + return; + } + var type = 'touchleave'; + this._touchEvent(e, type); + }, + _onTouchMove: function (e) { + if (!this._map._loaded) { + return; + } + var type = 'touchmove'; + this._touchEvent(e, type); + }, + _detectIE: function () { + var ua = window.navigator.userAgent; + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + return false; + } + }); + L.Map.addInitHook('addHandler', 'touchExtend', L.Map.TouchExtend); + L.Marker.Touch = L.Marker.extend({ + _initInteraction: function () { + if (!this.options.clickable) { + return; + } + var icon = this._icon, events = [ + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'touchstart', + 'touchend', + 'touchmove' + ]; + if (this._detectIE) { + events.concat([ + 'MSPointerDown', + 'MSPointerUp', + 'MSPointerMove', + 'MSPointerCancel' + ]); + } else { + events.concat(['touchcancel']); + } + L.DomUtil.addClass(icon, 'leaflet-clickable'); + L.DomEvent.on(icon, 'click', this._onMouseClick, this); + L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); + for (var i = 0; i < events.length; i++) { + L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); + } + if (L.Handler.MarkerDrag) { + this.dragging = new L.Handler.MarkerDrag(this); + if (this.options.draggable) { + this.dragging.enable(); + } + } + }, + _detectIE: function () { + var ua = window.navigator.userAgent; + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + return false; + } + }); + L.LatLngUtil = { + cloneLatLngs: function (latlngs) { + var clone = []; + for (var i = 0, l = latlngs.length; i < l; i++) { + clone.push(this.cloneLatLng(latlngs[i])); + } + return clone; + }, + cloneLatLng: function (latlng) { + return L.latLng(latlng.lat, latlng.lng); + } + }; + L.GeometryUtil = L.extend(L.GeometryUtil || {}, { + geodesicArea: function (latLngs) { + var pointsCount = latLngs.length, area = 0, d2r = L.LatLng.DEG_TO_RAD, p1, p2; + if (pointsCount > 2) { + for (var i = 0; i < pointsCount; i++) { + p1 = latLngs[i]; + p2 = latLngs[(i + 1) % pointsCount]; + area += (p2.lng - p1.lng) * d2r * (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r)); + } + area = area * 6378137 * 6378137 / 2; + } + return Math.abs(area); + }, + readableArea: function (area, isMetric) { + var areaStr; + if (isMetric) { + if (area >= 10000) { + areaStr = (area * 0.0001).toFixed(2) + ' ha'; + } else { + areaStr = area.toFixed(2) + ' m²'; + } + } else { + area /= 0.836127; + if (area >= 3097600) { + areaStr = (area / 3097600).toFixed(2) + ' mi²'; + } else if (area >= 4840) { + areaStr = (area / 4840).toFixed(2) + ' acres'; + } else { + areaStr = Math.ceil(area) + ' yd²'; + } + } + return areaStr; + }, + readableDistance: function (distance, isMetric, useFeet) { + var distanceStr; + if (isMetric) { + if (distance > 1000) { + distanceStr = (distance / 1000).toFixed(2) + ' km'; + } else { + distanceStr = Math.ceil(distance) + ' m'; + } + } else { + distance *= 1.09361; + if (distance > 1760) { + distanceStr = (distance / 1760).toFixed(2) + ' miles'; + } else { + var suffix = ' yd'; + if (useFeet) { + distance = distance * 3; + suffix = ' ft'; + } + distanceStr = Math.ceil(distance) + suffix; + } + } + return distanceStr; + } + }); + L.Util.extend(L.LineUtil, { + segmentsIntersect: function (p, p1, p2, p3) { + return this._checkCounterclockwise(p, p2, p3) !== this._checkCounterclockwise(p1, p2, p3) && this._checkCounterclockwise(p, p1, p2) !== this._checkCounterclockwise(p, p1, p3); + }, + _checkCounterclockwise: function (p, p1, p2) { + return (p2.y - p.y) * (p1.x - p.x) > (p1.y - p.y) * (p2.x - p.x); + } + }); + L.Polyline.include({ + intersects: function () { + var points = this._originalPoints, len = points ? points.length : 0, i, p, p1; + if (this._tooFewPointsForIntersection()) { + return false; + } + for (i = len - 1; i >= 3; i--) { + p = points[i - 1]; + p1 = points[i]; + if (this._lineSegmentsIntersectsRange(p, p1, i - 2)) { + return true; + } + } + return false; + }, + newLatLngIntersects: function (latlng, skipFirst) { + if (!this._map) { + return false; + } + return this.newPointIntersects(this._map.latLngToLayerPoint(latlng), skipFirst); + }, + newPointIntersects: function (newPoint, skipFirst) { + var points = this._originalPoints, len = points ? points.length : 0, lastPoint = points ? points[len - 1] : null, maxIndex = len - 2; + if (this._tooFewPointsForIntersection(1)) { + return false; + } + return this._lineSegmentsIntersectsRange(lastPoint, newPoint, maxIndex, skipFirst ? 1 : 0); + }, + _tooFewPointsForIntersection: function (extraPoints) { + var points = this._originalPoints, len = points ? points.length : 0; + len += extraPoints || 0; + return !this._originalPoints || len <= 3; + }, + _lineSegmentsIntersectsRange: function (p, p1, maxIndex, minIndex) { + var points = this._originalPoints, p2, p3; + minIndex = minIndex || 0; + for (var j = maxIndex; j > minIndex; j--) { + p2 = points[j - 1]; + p3 = points[j]; + if (L.LineUtil.segmentsIntersect(p, p1, p2, p3)) { + return true; + } + } + return false; + } + }); + L.Polygon.include({ + intersects: function () { + var polylineIntersects, points = this._originalPoints, len, firstPoint, lastPoint, maxIndex; + if (this._tooFewPointsForIntersection()) { + return false; + } + polylineIntersects = L.Polyline.prototype.intersects.call(this); + if (polylineIntersects) { + return true; + } + len = points.length; + firstPoint = points[0]; + lastPoint = points[len - 1]; + maxIndex = len - 2; + return this._lineSegmentsIntersectsRange(lastPoint, firstPoint, maxIndex, 1); + } + }); + L.Control.Draw = L.Control.extend({ + options: { + position: 'topleft', + draw: {}, + edit: false + }, + initialize: function (options) { + if (L.version < '0.7') { + throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/'); + } + L.Control.prototype.initialize.call(this, options); + var toolbar; + this._toolbars = {}; + if (L.DrawToolbar && this.options.draw) { + toolbar = new L.DrawToolbar(this.options.draw); + this._toolbars[L.DrawToolbar.TYPE] = toolbar; + this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this); + } + if (L.EditToolbar && this.options.edit) { + toolbar = new L.EditToolbar(this.options.edit); + this._toolbars[L.EditToolbar.TYPE] = toolbar; + this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this); + } + L.toolbar = this; + }, + onAdd: function (map) { + var container = L.DomUtil.create('div', 'leaflet-draw'), addedTopClass = false, topClassName = 'leaflet-draw-toolbar-top', toolbarContainer; + for (var toolbarId in this._toolbars) { + if (this._toolbars.hasOwnProperty(toolbarId)) { + toolbarContainer = this._toolbars[toolbarId].addToolbar(map); + if (toolbarContainer) { + if (!addedTopClass) { + if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) { + L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName); + } + addedTopClass = true; + } + container.appendChild(toolbarContainer); + } + } + } + return container; + }, + onRemove: function () { + for (var toolbarId in this._toolbars) { + if (this._toolbars.hasOwnProperty(toolbarId)) { + this._toolbars[toolbarId].removeToolbar(); + } + } + }, + setDrawingOptions: function (options) { + for (var toolbarId in this._toolbars) { + if (this._toolbars[toolbarId] instanceof L.DrawToolbar) { + this._toolbars[toolbarId].setOptions(options); + } + } + }, + _toolbarEnabled: function (e) { + var enabledToolbar = e.target; + for (var toolbarId in this._toolbars) { + if (this._toolbars[toolbarId] !== enabledToolbar) { + this._toolbars[toolbarId].disable(); + } + } + } + }); + L.Map.mergeOptions({ + drawControlTooltips: true, + drawControl: false + }); + L.Map.addInitHook(function () { + if (this.options.drawControl) { + this.drawControl = new L.Control.Draw(); + this.addControl(this.drawControl); + } + }); + L.Toolbar = L.Class.extend({ + includes: [L.Mixin.Events], + initialize: function (options) { + L.setOptions(this, options); + this._modes = {}; + this._actionButtons = []; + this._activeMode = null; + }, + enabled: function () { + return this._activeMode !== null; + }, + disable: function () { + if (!this.enabled()) { + return; + } + this._activeMode.handler.disable(); + }, + addToolbar: function (map) { + var container = L.DomUtil.create('div', 'leaflet-draw-section'), buttonIndex = 0, buttonClassPrefix = this._toolbarClass || '', modeHandlers = this.getModeHandlers(map), i; + this._toolbarContainer = L.DomUtil.create('div', 'leaflet-draw-toolbar leaflet-bar'); + this._map = map; + for (i = 0; i < modeHandlers.length; i++) { + if (modeHandlers[i].enabled) { + this._initModeHandler(modeHandlers[i].handler, this._toolbarContainer, buttonIndex++, buttonClassPrefix, modeHandlers[i].title); + } + } + if (!buttonIndex) { + return; + } + this._lastButtonIndex = --buttonIndex; + this._actionsContainer = L.DomUtil.create('ul', 'leaflet-draw-actions'); + container.appendChild(this._toolbarContainer); + container.appendChild(this._actionsContainer); + return container; + }, + removeToolbar: function () { + for (var handlerId in this._modes) { + if (this._modes.hasOwnProperty(handlerId)) { + this._disposeButton(this._modes[handlerId].button, this._modes[handlerId].handler.enable, this._modes[handlerId].handler); + this._modes[handlerId].handler.disable(); + this._modes[handlerId].handler.off('enabled', this._handlerActivated, this).off('disabled', this._handlerDeactivated, this); + } + } + this._modes = {}; + for (var i = 0, l = this._actionButtons.length; i < l; i++) { + this._disposeButton(this._actionButtons[i].button, this._actionButtons[i].callback, this); + } + this._actionButtons = []; + this._actionsContainer = null; + }, + _initModeHandler: function (handler, container, buttonIndex, classNamePredix, buttonTitle) { + var type = handler.type; + this._modes[type] = {}; + this._modes[type].handler = handler; + this._modes[type].button = this._createButton({ + type: type, + title: buttonTitle, + className: classNamePredix + '-' + type, + container: container, + callback: this._modes[type].handler.enable, + context: this._modes[type].handler + }); + this._modes[type].buttonIndex = buttonIndex; + this._modes[type].handler.on('enabled', this._handlerActivated, this).on('disabled', this._handlerDeactivated, this); + }, + _createButton: function (options) { + var link = L.DomUtil.create('a', options.className || '', options.container); + link.href = '#'; + if (options.text) { + link.innerHTML = options.text; + } + if (options.title) { + link.title = options.title; + } + L.DomEvent.on(link, 'click', L.DomEvent.stopPropagation).on(link, 'mousedown', L.DomEvent.stopPropagation).on(link, 'dblclick', L.DomEvent.stopPropagation).on(link, 'click', L.DomEvent.preventDefault).on(link, 'click', options.callback, options.context); + return link; + }, + _disposeButton: function (button, callback) { + L.DomEvent.off(button, 'click', L.DomEvent.stopPropagation).off(button, 'mousedown', L.DomEvent.stopPropagation).off(button, 'dblclick', L.DomEvent.stopPropagation).off(button, 'click', L.DomEvent.preventDefault).off(button, 'click', callback); + }, + _handlerActivated: function (e) { + this.disable(); + this._activeMode = this._modes[e.handler]; + L.DomUtil.addClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); + this._showActionsToolbar(); + this.fire('enable'); + }, + _handlerDeactivated: function () { + this._hideActionsToolbar(); + L.DomUtil.removeClass(this._activeMode.button, 'leaflet-draw-toolbar-button-enabled'); + this._activeMode = null; + this.fire('disable'); + }, + _createActions: function (handler) { + var container = this._actionsContainer, buttons = this.getActions(handler), l = buttons.length, li, di, dl, button; + for (di = 0, dl = this._actionButtons.length; di < dl; di++) { + this._disposeButton(this._actionButtons[di].button, this._actionButtons[di].callback); + } + this._actionButtons = []; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + for (var i = 0; i < l; i++) { + if ('enabled' in buttons[i] && !buttons[i].enabled) { + continue; + } + li = L.DomUtil.create('li', '', container); + button = this._createButton({ + title: buttons[i].title, + text: buttons[i].text, + container: li, + callback: buttons[i].callback, + context: buttons[i].context + }); + this._actionButtons.push({ + button: button, + callback: buttons[i].callback + }); + } + }, + _showActionsToolbar: function () { + var buttonIndex = this._activeMode.buttonIndex, lastButtonIndex = this._lastButtonIndex, toolbarPosition = this._activeMode.button.offsetTop - 1; + this._createActions(this._activeMode.handler); + this._actionsContainer.style.top = toolbarPosition + 'px'; + if (buttonIndex === 0) { + L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); + L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-top'); + } + if (buttonIndex === lastButtonIndex) { + L.DomUtil.addClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); + L.DomUtil.addClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); + } + this._actionsContainer.style.display = 'block'; + }, + _hideActionsToolbar: function () { + this._actionsContainer.style.display = 'none'; + L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-notop'); + L.DomUtil.removeClass(this._toolbarContainer, 'leaflet-draw-toolbar-nobottom'); + L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-top'); + L.DomUtil.removeClass(this._actionsContainer, 'leaflet-draw-actions-bottom'); + } + }); + L.Tooltip = L.Class.extend({ + initialize: function (map) { + this._map = map; + this._popupPane = map._panes.popupPane; + this._container = map.options.drawControlTooltips ? L.DomUtil.create('div', 'leaflet-draw-tooltip', this._popupPane) : null; + this._singleLineLabel = false; + this._map.on('mouseout', this._onMouseOut, this); + }, + dispose: function () { + this._map.off('mouseout', this._onMouseOut, this); + if (this._container) { + this._popupPane.removeChild(this._container); + this._container = null; + } + }, + updateContent: function (labelText) { + if (!this._container) { + return this; + } + labelText.subtext = labelText.subtext || ''; + if (labelText.subtext.length === 0 && !this._singleLineLabel) { + L.DomUtil.addClass(this._container, 'leaflet-draw-tooltip-single'); + this._singleLineLabel = true; + } else if (labelText.subtext.length > 0 && this._singleLineLabel) { + L.DomUtil.removeClass(this._container, 'leaflet-draw-tooltip-single'); + this._singleLineLabel = false; + } + this._container.innerHTML = (labelText.subtext.length > 0 ? '' + labelText.subtext + '' + '
' : '') + '' + labelText.text + ''; + return this; + }, + updatePosition: function (latlng) { + var pos = this._map.latLngToLayerPoint(latlng), tooltipContainer = this._container; + if (this._container) { + tooltipContainer.style.visibility = 'inherit'; + L.DomUtil.setPosition(tooltipContainer, pos); + } + return this; + }, + showAsError: function () { + if (this._container) { + L.DomUtil.addClass(this._container, 'leaflet-error-draw-tooltip'); + } + return this; + }, + removeError: function () { + if (this._container) { + L.DomUtil.removeClass(this._container, 'leaflet-error-draw-tooltip'); + } + return this; + }, + _onMouseOut: function () { + if (this._container) { + this._container.style.visibility = 'hidden'; + } + } + }); + L.DrawToolbar = L.Toolbar.extend({ + statics: { TYPE: 'draw' }, + options: { + polyline: {}, + polygon: {}, + rectangle: {}, + circle: {}, + marker: {} + }, + initialize: function (options) { + for (var type in this.options) { + if (this.options.hasOwnProperty(type)) { + if (options[type]) { + options[type] = L.extend({}, this.options[type], options[type]); + } + } + } + this._toolbarClass = 'leaflet-draw-draw'; + L.Toolbar.prototype.initialize.call(this, options); + }, + getModeHandlers: function (map) { + return [ + { + enabled: this.options.polyline, + handler: new L.Draw.Polyline(map, this.options.polyline), + title: L.drawLocal.draw.toolbar.buttons.polyline + }, + { + enabled: this.options.polygon, + handler: new L.Draw.Polygon(map, this.options.polygon), + title: L.drawLocal.draw.toolbar.buttons.polygon + }, + { + enabled: this.options.rectangle, + handler: new L.Draw.Rectangle(map, this.options.rectangle), + title: L.drawLocal.draw.toolbar.buttons.rectangle + }, + { + enabled: this.options.circle, + handler: new L.Draw.Circle(map, this.options.circle), + title: L.drawLocal.draw.toolbar.buttons.circle + }, + { + enabled: this.options.marker, + handler: new L.Draw.Marker(map, this.options.marker), + title: L.drawLocal.draw.toolbar.buttons.marker + } + ]; + }, + getActions: function (handler) { + return [ + { + enabled: handler.completeShape, + title: L.drawLocal.draw.toolbar.finish.title, + text: L.drawLocal.draw.toolbar.finish.text, + callback: handler.completeShape, + context: handler + }, + { + enabled: handler.deleteLastVertex, + title: L.drawLocal.draw.toolbar.undo.title, + text: L.drawLocal.draw.toolbar.undo.text, + callback: handler.deleteLastVertex, + context: handler + }, + { + title: L.drawLocal.draw.toolbar.actions.title, + text: L.drawLocal.draw.toolbar.actions.text, + callback: this.disable, + context: this + } + ]; + }, + setOptions: function (options) { + L.setOptions(this, options); + for (var type in this._modes) { + if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) { + this._modes[type].handler.setOptions(options[type]); + } + } + } + }); + L.EditToolbar = L.Toolbar.extend({ + statics: { TYPE: 'edit' }, + options: { + edit: { + selectedPathOptions: { + dashArray: '10, 10', + fill: true, + fillColor: '#fe57a1', + fillOpacity: 0.1, + maintainColor: false + } + }, + remove: {}, + featureGroup: null + }, + initialize: function (options) { + if (options.edit) { + if (typeof options.edit.selectedPathOptions === 'undefined') { + options.edit.selectedPathOptions = this.options.edit.selectedPathOptions; + } + options.edit.selectedPathOptions = L.extend({}, this.options.edit.selectedPathOptions, options.edit.selectedPathOptions); + } + if (options.remove) { + options.remove = L.extend({}, this.options.remove, options.remove); + } + this._toolbarClass = 'leaflet-draw-edit'; + L.Toolbar.prototype.initialize.call(this, options); + this._selectedFeatureCount = 0; + }, + getModeHandlers: function (map) { + var featureGroup = this.options.featureGroup; + return [ + { + enabled: this.options.edit, + handler: new L.EditToolbar.Edit(map, { + featureGroup: featureGroup, + selectedPathOptions: this.options.edit.selectedPathOptions + }), + title: L.drawLocal.edit.toolbar.buttons.edit + }, + { + enabled: this.options.remove, + handler: new L.EditToolbar.Delete(map, { featureGroup: featureGroup }), + title: L.drawLocal.edit.toolbar.buttons.remove + } + ]; + }, + getActions: function () { + return [ + { + title: L.drawLocal.edit.toolbar.actions.save.title, + text: L.drawLocal.edit.toolbar.actions.save.text, + callback: this._save, + context: this + }, + { + title: L.drawLocal.edit.toolbar.actions.cancel.title, + text: L.drawLocal.edit.toolbar.actions.cancel.text, + callback: this.disable, + context: this + } + ]; + }, + addToolbar: function (map) { + var container = L.Toolbar.prototype.addToolbar.call(this, map); + this._checkDisabled(); + this.options.featureGroup.on('layeradd layerremove', this._checkDisabled, this); + return container; + }, + removeToolbar: function () { + this.options.featureGroup.off('layeradd layerremove', this._checkDisabled, this); + L.Toolbar.prototype.removeToolbar.call(this); + }, + disable: function () { + if (!this.enabled()) { + return; + } + this._activeMode.handler.revertLayers(); + L.Toolbar.prototype.disable.call(this); + }, + _save: function () { + this._activeMode.handler.save(); + this._activeMode.handler.disable(); + }, + _checkDisabled: function () { + var featureGroup = this.options.featureGroup, hasLayers = featureGroup.getLayers().length !== 0, button; + if (this.options.edit) { + button = this._modes[L.EditToolbar.Edit.TYPE].button; + if (hasLayers) { + L.DomUtil.removeClass(button, 'leaflet-disabled'); + } else { + L.DomUtil.addClass(button, 'leaflet-disabled'); + } + button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.edit : L.drawLocal.edit.toolbar.buttons.editDisabled); + } + if (this.options.remove) { + button = this._modes[L.EditToolbar.Delete.TYPE].button; + if (hasLayers) { + L.DomUtil.removeClass(button, 'leaflet-disabled'); + } else { + L.DomUtil.addClass(button, 'leaflet-disabled'); + } + button.setAttribute('title', hasLayers ? L.drawLocal.edit.toolbar.buttons.remove : L.drawLocal.edit.toolbar.buttons.removeDisabled); + } + } + }); + L.EditToolbar.Edit = L.Handler.extend({ + statics: { TYPE: 'edit' }, + includes: L.Mixin.Events, + initialize: function (map, options) { + L.Handler.prototype.initialize.call(this, map); + L.setOptions(this, options); + this._featureGroup = options.featureGroup; + if (!(this._featureGroup instanceof L.FeatureGroup)) { + throw new Error('options.featureGroup must be a L.FeatureGroup'); + } + this._uneditedLayerProps = {}; + this.type = L.EditToolbar.Edit.TYPE; + }, + enable: function () { + if (this._enabled || !this._hasAvailableLayers()) { + return; + } + this.fire('enabled', { handler: this.type }); + this._map.fire('draw:editstart', { handler: this.type }); + L.Handler.prototype.enable.call(this); + this._featureGroup.on('layeradd', this._enableLayerEdit, this).on('layerremove', this._disableLayerEdit, this); + }, + disable: function () { + if (!this._enabled) { + return; + } + this._featureGroup.off('layeradd', this._enableLayerEdit, this).off('layerremove', this._disableLayerEdit, this); + L.Handler.prototype.disable.call(this); + this._map.fire('draw:editstop', { handler: this.type }); + this.fire('disabled', { handler: this.type }); + }, + addHooks: function () { + var map = this._map; + if (map) { + map.getContainer().focus(); + this._featureGroup.eachLayer(this._enableLayerEdit, this); + this._tooltip = new L.Tooltip(this._map); + this._updateTooltip(); + this._map.on('mousemove', this._onMouseMove, this).on('touchmove', this._onMouseMove, this).on('MSPointerMove', this._onMouseMove, this).on('click', this._editStyle, this).on('draw:editvertex', this._updateTooltip, this); + } + }, + removeHooks: function () { + if (this._map) { + this._featureGroup.eachLayer(this._disableLayerEdit, this); + this._uneditedLayerProps = {}; + this._tooltip.dispose(); + this._tooltip = null; + this._map.off('mousemove', this._onMouseMove, this).off('touchmove', this._onMouseMove, this).off('MSPointerMove', this._onMouseMove, this); + } + }, + revertLayers: function () { + this._featureGroup.eachLayer(function (layer) { + this._revertLayer(layer); + }, this); + }, + save: function () { + var editedLayers = new L.LayerGroup(); + this._featureGroup.eachLayer(function (layer) { + if (layer.edited) { + editedLayers.addLayer(layer); + layer.edited = false; + } + }); + this._map.fire('draw:edited', { layers: editedLayers }); + }, + _backupLayer: function (layer) { + var id = L.Util.stamp(layer); + if (!this._uneditedLayerProps[id]) { + if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) { + this._uneditedLayerProps[id] = { latlngs: L.LatLngUtil.cloneLatLngs(layer.getLatLngs()) }; + } else if (layer instanceof L.Circle) { + this._uneditedLayerProps[id] = { + latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()), + radius: layer.getRadius() + }; + } else if (layer instanceof L.Marker) { + this._uneditedLayerProps[id] = { latlng: L.LatLngUtil.cloneLatLng(layer.getLatLng()) }; + } + } + }, + _getTooltipText: function () { + return { + text: L.drawLocal.edit.handlers.edit.tooltip.text, + subtext: L.drawLocal.edit.handlers.edit.tooltip.subtext + }; + }, + _updateTooltip: function () { + this._tooltip.updateContent(this._getTooltipText()); + }, + _revertLayer: function (layer) { + var id = L.Util.stamp(layer); + layer.edited = false; + if (this._uneditedLayerProps.hasOwnProperty(id)) { + if (layer instanceof L.Polyline || layer instanceof L.Polygon || layer instanceof L.Rectangle) { + layer.setLatLngs(this._uneditedLayerProps[id].latlngs); + } else if (layer instanceof L.Circle) { + layer.setLatLng(this._uneditedLayerProps[id].latlng); + layer.setRadius(this._uneditedLayerProps[id].radius); + } else if (layer instanceof L.Marker) { + layer.setLatLng(this._uneditedLayerProps[id].latlng); + } + layer.fire('revert-edited', { layer: layer }); + } + }, + _enableLayerEdit: function (e) { + var layer = e.layer || e.target || e, pathOptions; + this._backupLayer(layer); + if (this.options.selectedPathOptions) { + pathOptions = L.Util.extend({}, this.options.selectedPathOptions); + if (pathOptions.maintainColor) { + pathOptions.color = layer.options.color; + pathOptions.fillColor = layer.options.fillColor; + } + layer.options.original = L.extend({}, layer.options); + layer.options.editing = pathOptions; + } + if (this.isMarker) { + layer.dragging.enable(); + layer.on('dragend', this._onMarkerDragEnd).on('touchmove', this._onTouchMove, this).on('MSPointerMove', this._onTouchMove, this).on('touchend', this._onMarkerDragEnd, this).on('MSPointerUp', this._onMarkerDragEnd, this); + } else { + layer.editing.enable(); + } + }, + _disableLayerEdit: function (e) { + var layer = e.layer || e.target || e; + layer.edited = false; + layer.editing.disable(); + delete layer.options.editing; + delete layer.options.original; + if (this._selectedPathOptions) { + if (layer instanceof L.Marker) { + this._toggleMarkerHighlight(layer); + } else { + layer.setStyle(layer.options.previousOptions); + delete layer.options.previousOptions; + } + } + if (layer instanceof L.Marker) { + layer.dragging.disable(); + layer.off('dragend', this._onMarkerDragEnd, this).off('touchmove', this._onTouchMove, this).off('MSPointerMove', this._onTouchMove, this).off('touchend', this._onMarkerDragEnd, this).off('MSPointerUp', this._onMarkerDragEnd, this); + } else { + layer.editing.disable(); + } + }, + _onMouseMove: function (e) { + this._tooltip.updatePosition(e.latlng); + }, + _onTouchMove: function (e) { + var touchEvent = e.originalEvent.changedTouches[0], layerPoint = this._map.mouseEventToLayerPoint(touchEvent), latlng = this._map.layerPointToLatLng(layerPoint); + e.target.setLatLng(latlng); + }, + _hasAvailableLayers: function () { + return this._featureGroup.getLayers().length !== 0; + } + }); + L.EditToolbar.Delete = L.Handler.extend({ + statics: { TYPE: 'remove' }, + includes: L.Mixin.Events, + initialize: function (map, options) { + L.Handler.prototype.initialize.call(this, map); + L.Util.setOptions(this, options); + this._deletableLayers = this.options.featureGroup; + if (!(this._deletableLayers instanceof L.FeatureGroup)) { + throw new Error('options.featureGroup must be a L.FeatureGroup'); + } + this.type = L.EditToolbar.Delete.TYPE; + }, + enable: function () { + if (this._enabled || !this._hasAvailableLayers()) { + return; + } + this.fire('enabled', { handler: this.type }); + this._map.fire('draw:deletestart', { handler: this.type }); + L.Handler.prototype.enable.call(this); + this._deletableLayers.on('layeradd', this._enableLayerDelete, this).on('layerremove', this._disableLayerDelete, this); + }, + disable: function () { + if (!this._enabled) { + return; + } + this._deletableLayers.off('layeradd', this._enableLayerDelete, this).off('layerremove', this._disableLayerDelete, this); + L.Handler.prototype.disable.call(this); + this._map.fire('draw:deletestop', { handler: this.type }); + this.fire('disabled', { handler: this.type }); + }, + addHooks: function () { + var map = this._map; + if (map) { + map.getContainer().focus(); + this._deletableLayers.eachLayer(this._enableLayerDelete, this); + this._deletedLayers = new L.LayerGroup(); + this._tooltip = new L.Tooltip(this._map); + this._tooltip.updateContent({ text: L.drawLocal.edit.handlers.remove.tooltip.text }); + this._map.on('mousemove', this._onMouseMove, this); + } + }, + removeHooks: function () { + if (this._map) { + this._deletableLayers.eachLayer(this._disableLayerDelete, this); + this._deletedLayers = null; + this._tooltip.dispose(); + this._tooltip = null; + this._map.off('mousemove', this._onMouseMove, this); + } + }, + revertLayers: function () { + this._deletedLayers.eachLayer(function (layer) { + this._deletableLayers.addLayer(layer); + layer.fire('revert-deleted', { layer: layer }); + }, this); + }, + save: function () { + this._map.fire('draw:deleted', { layers: this._deletedLayers }); + }, + _enableLayerDelete: function (e) { + var layer = e.layer || e.target || e; + layer.on('click', this._removeLayer, this); + }, + _disableLayerDelete: function (e) { + var layer = e.layer || e.target || e; + layer.off('click', this._removeLayer, this); + this._deletedLayers.removeLayer(layer); + }, + _removeLayer: function (e) { + var layer = e.layer || e.target || e; + this._deletableLayers.removeLayer(layer); + this._deletedLayers.addLayer(layer); + layer.fire('deleted'); + }, + _onMouseMove: function (e) { + this._tooltip.updatePosition(e.latlng); + }, + _hasAvailableLayers: function () { + return this._deletableLayers.getLayers().length !== 0; + } + }); +}(window, document)); +leafletDraw = undefined; +(function (factory) { + 'use strict'; + if (true) { + sortable = function () { + return typeof factory === 'function' ? factory() : factory; + }(); + } else if (typeof module != 'undefined' && typeof module.exports != 'undefined') { + module.exports = factory(); + } else if (typeof Package !== 'undefined') { + Sortable = factory(); + } else { + window['Sortable'] = factory(); + } +}(function () { + 'use strict'; + if (typeof window == 'undefined' || typeof window.document == 'undefined') { + return function () { + throw new Error('Sortable.js requires a window with a document'); + }; + } + var dragEl, parentEl, ghostEl, cloneEl, rootEl, nextEl, scrollEl, scrollParentEl, lastEl, lastCSS, lastParentCSS, oldIndex, newIndex, activeGroup, autoScroll = {}, tapEvt, touchEvt, moved, RSPACE = /\s+/g, expando = 'Sortable' + new Date().getTime(), win = window, document = win.document, parseInt = win.parseInt, supportDraggable = !!('draggable' in document.createElement('div')), supportCssPointerEvents = function (el) { + el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), _silent = false, abs = Math.abs, slice = [].slice, touchDragOverListeners = [], _autoScroll = _throttle(function (evt, options, rootEl) { + if (rootEl && options.scroll) { + var el, rect, sens = options.scrollSensitivity, speed = options.scrollSpeed, x = evt.clientX, y = evt.clientY, winWidth = window.innerWidth, winHeight = window.innerHeight, vx, vy; + if (scrollParentEl !== rootEl) { + scrollEl = options.scroll; + scrollParentEl = rootEl; + if (scrollEl === true) { + scrollEl = rootEl; + do { + if (scrollEl.offsetWidth < scrollEl.scrollWidth || scrollEl.offsetHeight < scrollEl.scrollHeight) { + break; + } + } while (scrollEl = scrollEl.parentNode); + } + } + if (scrollEl) { + el = scrollEl; + rect = scrollEl.getBoundingClientRect(); + vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens); + vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens); + } + if (!(vx || vy)) { + vx = (winWidth - x <= sens) - (x <= sens); + vy = (winHeight - y <= sens) - (y <= sens); + (vx || vy) && (el = win); + } + if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) { + autoScroll.el = el; + autoScroll.vx = vx; + autoScroll.vy = vy; + clearInterval(autoScroll.pid); + if (el) { + autoScroll.pid = setInterval(function () { + if (el === win) { + win.scrollTo(win.pageXOffset + vx * speed, win.pageYOffset + vy * speed); + } else { + vy && (el.scrollTop += vy * speed); + vx && (el.scrollLeft += vx * speed); + } + }, 24); + } + } + } + }, 30), _prepareGroup = function (options) { + var group = options.group; + if (!group || typeof group != 'object') { + group = options.group = { name: group }; + } + [ + 'pull', + 'put' + ].forEach(function (key) { + if (!(key in group)) { + group[key] = true; + } + }); + options.groups = ' ' + group.name + (group.put.join ? ' ' + group.put.join(' ') : '') + ' '; + }; + function Sortable(el, options) { + if (!(el && el.nodeType && el.nodeType === 1)) { + throw 'Sortable: `el` must be HTMLElement, and not ' + {}.toString.call(el); + } + this.el = el; + this.options = options = _extend({}, options); + el[expando] = this; + var defaults = { + group: Math.random(), + sort: true, + disabled: false, + store: null, + handle: null, + scroll: true, + scrollSensitivity: 30, + scrollSpeed: 10, + draggable: /[uo]l/i.test(el.nodeName) ? 'li' : '>*', + ghostClass: 'sortable-ghost', + chosenClass: 'sortable-chosen', + ignore: 'a, img', + filter: null, + animation: 0, + setData: function (dataTransfer, dragEl) { + dataTransfer.setData('Text', dragEl.textContent); + }, + dropBubble: false, + dragoverBubble: false, + dataIdAttr: 'data-id', + delay: 0, + forceFallback: false, + fallbackClass: 'sortable-fallback', + fallbackOnBody: false + }; + for (var name in defaults) { + !(name in options) && (options[name] = defaults[name]); + } + _prepareGroup(options); + for (var fn in this) { + if (fn.charAt(0) === '_') { + this[fn] = this[fn].bind(this); + } + } + this.nativeDraggable = options.forceFallback ? false : supportDraggable; + _on(el, 'mousedown', this._onTapStart); + _on(el, 'touchstart', this._onTapStart); + if (this.nativeDraggable) { + _on(el, 'dragover', this); + _on(el, 'dragenter', this); + } + touchDragOverListeners.push(this._onDragOver); + options.store && this.sort(options.store.get(this)); + } + Sortable.prototype = { + constructor: Sortable, + _onTapStart: function (evt) { + var _this = this, el = this.el, options = this.options, type = evt.type, touch = evt.touches && evt.touches[0], target = (touch || evt).target, originalTarget = target, filter = options.filter; + if (type === 'mousedown' && evt.button !== 0 || options.disabled) { + return; + } + target = _closest(target, options.draggable, el); + if (!target) { + return; + } + oldIndex = _index(target, options.draggable); + if (typeof filter === 'function') { + if (filter.call(this, evt, target, this)) { + _dispatchEvent(_this, originalTarget, 'filter', target, el, oldIndex); + evt.preventDefault(); + return; + } + } else if (filter) { + filter = filter.split(',').some(function (criteria) { + criteria = _closest(originalTarget, criteria.trim(), el); + if (criteria) { + _dispatchEvent(_this, criteria, 'filter', target, el, oldIndex); + return true; + } + }); + if (filter) { + evt.preventDefault(); + return; + } + } + if (options.handle && !_closest(originalTarget, options.handle, el)) { + return; + } + this._prepareDragStart(evt, touch, target); + }, + _prepareDragStart: function (evt, touch, target) { + var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn; + if (target && !dragEl && target.parentNode === el) { + tapEvt = evt; + rootEl = el; + dragEl = target; + parentEl = dragEl.parentNode; + nextEl = dragEl.nextSibling; + activeGroup = options.group; + dragStartFn = function () { + _this._disableDelayedDrag(); + dragEl.draggable = true; + _toggleClass(dragEl, _this.options.chosenClass, true); + _this._triggerDragStart(touch); + }; + options.ignore.split(',').forEach(function (criteria) { + _find(dragEl, criteria.trim(), _disableDraggable); + }); + _on(ownerDocument, 'mouseup', _this._onDrop); + _on(ownerDocument, 'touchend', _this._onDrop); + _on(ownerDocument, 'touchcancel', _this._onDrop); + if (options.delay) { + _on(ownerDocument, 'mouseup', _this._disableDelayedDrag); + _on(ownerDocument, 'touchend', _this._disableDelayedDrag); + _on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); + _on(ownerDocument, 'mousemove', _this._disableDelayedDrag); + _on(ownerDocument, 'touchmove', _this._disableDelayedDrag); + _this._dragStartTimer = setTimeout(dragStartFn, options.delay); + } else { + dragStartFn(); + } + } + }, + _disableDelayedDrag: function () { + var ownerDocument = this.el.ownerDocument; + clearTimeout(this._dragStartTimer); + _off(ownerDocument, 'mouseup', this._disableDelayedDrag); + _off(ownerDocument, 'touchend', this._disableDelayedDrag); + _off(ownerDocument, 'touchcancel', this._disableDelayedDrag); + _off(ownerDocument, 'mousemove', this._disableDelayedDrag); + _off(ownerDocument, 'touchmove', this._disableDelayedDrag); + }, + _triggerDragStart: function (touch) { + if (touch) { + tapEvt = { + target: dragEl, + clientX: touch.clientX, + clientY: touch.clientY + }; + this._onDragStart(tapEvt, 'touch'); + } else if (!this.nativeDraggable) { + this._onDragStart(tapEvt, true); + } else { + _on(dragEl, 'dragend', this); + _on(rootEl, 'dragstart', this._onDragStart); + } + try { + if (document.selection) { + document.selection.empty(); + } else { + window.getSelection().removeAllRanges(); + } + } catch (err) { + } + }, + _dragStarted: function () { + if (rootEl && dragEl) { + _toggleClass(dragEl, this.options.ghostClass, true); + Sortable.active = this; + _dispatchEvent(this, rootEl, 'start', dragEl, rootEl, oldIndex); + } + }, + _emulateDragOver: function () { + if (touchEvt) { + if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) { + return; + } + this._lastX = touchEvt.clientX; + this._lastY = touchEvt.clientY; + if (!supportCssPointerEvents) { + _css(ghostEl, 'display', 'none'); + } + var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY), parent = target, groupName = ' ' + this.options.group.name + '', i = touchDragOverListeners.length; + if (parent) { + do { + if (parent[expando] && parent[expando].options.groups.indexOf(groupName) > -1) { + while (i--) { + touchDragOverListeners[i]({ + clientX: touchEvt.clientX, + clientY: touchEvt.clientY, + target: target, + rootEl: parent + }); + } + break; + } + target = parent; + } while (parent = parent.parentNode); + } + if (!supportCssPointerEvents) { + _css(ghostEl, 'display', ''); + } + } + }, + _onTouchMove: function (evt) { + if (tapEvt) { + if (!Sortable.active) { + this._dragStarted(); + } + this._appendGhost(); + var touch = evt.touches ? evt.touches[0] : evt, dx = touch.clientX - tapEvt.clientX, dy = touch.clientY - tapEvt.clientY, translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)'; + moved = true; + touchEvt = touch; + _css(ghostEl, 'webkitTransform', translate3d); + _css(ghostEl, 'mozTransform', translate3d); + _css(ghostEl, 'msTransform', translate3d); + _css(ghostEl, 'transform', translate3d); + evt.preventDefault(); + } + }, + _appendGhost: function () { + if (!ghostEl) { + var rect = dragEl.getBoundingClientRect(), css = _css(dragEl), options = this.options, ghostRect; + ghostEl = dragEl.cloneNode(true); + _toggleClass(ghostEl, options.ghostClass, false); + _toggleClass(ghostEl, options.fallbackClass, true); + _css(ghostEl, 'top', rect.top - parseInt(css.marginTop, 10)); + _css(ghostEl, 'left', rect.left - parseInt(css.marginLeft, 10)); + _css(ghostEl, 'width', rect.width); + _css(ghostEl, 'height', rect.height); + _css(ghostEl, 'opacity', '0.8'); + _css(ghostEl, 'position', 'fixed'); + _css(ghostEl, 'zIndex', '100000'); + _css(ghostEl, 'pointerEvents', 'none'); + options.fallbackOnBody && document.body.appendChild(ghostEl) || rootEl.appendChild(ghostEl); + ghostRect = ghostEl.getBoundingClientRect(); + _css(ghostEl, 'width', rect.width * 2 - ghostRect.width); + _css(ghostEl, 'height', rect.height * 2 - ghostRect.height); + } + }, + _onDragStart: function (evt, useFallback) { + var dataTransfer = evt.dataTransfer, options = this.options; + this._offUpEvents(); + if (activeGroup.pull == 'clone') { + cloneEl = dragEl.cloneNode(true); + _css(cloneEl, 'display', 'none'); + rootEl.insertBefore(cloneEl, dragEl); + } + if (useFallback) { + if (useFallback === 'touch') { + _on(document, 'touchmove', this._onTouchMove); + _on(document, 'touchend', this._onDrop); + _on(document, 'touchcancel', this._onDrop); + } else { + _on(document, 'mousemove', this._onTouchMove); + _on(document, 'mouseup', this._onDrop); + } + this._loopId = setInterval(this._emulateDragOver, 50); + } else { + if (dataTransfer) { + dataTransfer.effectAllowed = 'move'; + options.setData && options.setData.call(this, dataTransfer, dragEl); + } + _on(document, 'drop', this); + setTimeout(this._dragStarted, 0); + } + }, + _onDragOver: function (evt) { + var el = this.el, target, dragRect, revert, options = this.options, group = options.group, groupPut = group.put, isOwner = activeGroup === group, canSort = options.sort; + if (evt.preventDefault !== void 0) { + evt.preventDefault(); + !options.dragoverBubble && evt.stopPropagation(); + } + moved = true; + if (activeGroup && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) : activeGroup.pull && groupPut && (activeGroup.name === group.name || groupPut.indexOf && ~groupPut.indexOf(activeGroup.name))) && (evt.rootEl === void 0 || evt.rootEl === this.el)) { + _autoScroll(evt, options, this.el); + if (_silent) { + return; + } + target = _closest(evt.target, options.draggable, el); + dragRect = dragEl.getBoundingClientRect(); + if (revert) { + _cloneHide(true); + if (cloneEl || nextEl) { + rootEl.insertBefore(dragEl, cloneEl || nextEl); + } else if (!canSort) { + rootEl.appendChild(dragEl); + } + return; + } + if (el.children.length === 0 || el.children[0] === ghostEl || el === evt.target && (target = _ghostIsLast(el, evt))) { + if (target) { + if (target.animated) { + return; + } + targetRect = target.getBoundingClientRect(); + } + _cloneHide(isOwner); + if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect) !== false) { + if (!dragEl.contains(el)) { + el.appendChild(dragEl); + parentEl = el; + } + this._animate(dragRect, dragEl); + target && this._animate(targetRect, target); + } + } else if (target && !target.animated && target !== dragEl && target.parentNode[expando] !== void 0) { + if (lastEl !== target) { + lastEl = target; + lastCSS = _css(target); + lastParentCSS = _css(target.parentNode); + } + var targetRect = target.getBoundingClientRect(), width = targetRect.right - targetRect.left, height = targetRect.bottom - targetRect.top, floating = /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) || lastParentCSS.display == 'flex' && lastParentCSS['flex-direction'].indexOf('row') === 0, isWide = target.offsetWidth > dragEl.offsetWidth, isLong = target.offsetHeight > dragEl.offsetHeight, halfway = (floating ? (evt.clientX - targetRect.left) / width : (evt.clientY - targetRect.top) / height) > 0.5, nextSibling = target.nextElementSibling, moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect), after; + if (moveVector !== false) { + _silent = true; + setTimeout(_unsilent, 30); + _cloneHide(isOwner); + if (moveVector === 1 || moveVector === -1) { + after = moveVector === 1; + } else if (floating) { + var elTop = dragEl.offsetTop, tgTop = target.offsetTop; + if (elTop === tgTop) { + after = target.previousElementSibling === dragEl && !isWide || halfway && isWide; + } else { + after = tgTop > elTop; + } + } else { + after = nextSibling !== dragEl && !isLong || halfway && isLong; + } + if (!dragEl.contains(el)) { + if (after && !nextSibling) { + el.appendChild(dragEl); + } else { + target.parentNode.insertBefore(dragEl, after ? nextSibling : target); + } + } + parentEl = dragEl.parentNode; + this._animate(dragRect, dragEl); + this._animate(targetRect, target); + } + } + } + }, + _animate: function (prevRect, target) { + var ms = this.options.animation; + if (ms) { + var currentRect = target.getBoundingClientRect(); + _css(target, 'transition', 'none'); + _css(target, 'transform', 'translate3d(' + (prevRect.left - currentRect.left) + 'px,' + (prevRect.top - currentRect.top) + 'px,0)'); + target.offsetWidth; + _css(target, 'transition', 'all ' + ms + 'ms'); + _css(target, 'transform', 'translate3d(0,0,0)'); + clearTimeout(target.animated); + target.animated = setTimeout(function () { + _css(target, 'transition', ''); + _css(target, 'transform', ''); + target.animated = false; + }, ms); + } + }, + _offUpEvents: function () { + var ownerDocument = this.el.ownerDocument; + _off(document, 'touchmove', this._onTouchMove); + _off(ownerDocument, 'mouseup', this._onDrop); + _off(ownerDocument, 'touchend', this._onDrop); + _off(ownerDocument, 'touchcancel', this._onDrop); + }, + _onDrop: function (evt) { + var el = this.el, options = this.options; + clearInterval(this._loopId); + clearInterval(autoScroll.pid); + clearTimeout(this._dragStartTimer); + _off(document, 'mousemove', this._onTouchMove); + if (this.nativeDraggable) { + _off(document, 'drop', this); + _off(el, 'dragstart', this._onDragStart); + } + this._offUpEvents(); + if (evt) { + if (moved) { + evt.preventDefault(); + !options.dropBubble && evt.stopPropagation(); + } + ghostEl && ghostEl.parentNode.removeChild(ghostEl); + if (dragEl) { + if (this.nativeDraggable) { + _off(dragEl, 'dragend', this); + } + _disableDraggable(dragEl); + _toggleClass(dragEl, this.options.ghostClass, false); + _toggleClass(dragEl, this.options.chosenClass, false); + if (rootEl !== parentEl) { + newIndex = _index(dragEl, options.draggable); + if (newIndex >= 0) { + _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex); + _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); + _dispatchEvent(null, parentEl, 'add', dragEl, rootEl, oldIndex, newIndex); + _dispatchEvent(this, rootEl, 'remove', dragEl, rootEl, oldIndex, newIndex); + } + } else { + cloneEl && cloneEl.parentNode.removeChild(cloneEl); + if (dragEl.nextSibling !== nextEl) { + newIndex = _index(dragEl, options.draggable); + if (newIndex >= 0) { + _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex); + _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); + } + } + } + if (Sortable.active) { + if (newIndex === null || newIndex === -1) { + newIndex = oldIndex; + } + _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex); + this.save(); + } + } + } + this._nulling(); + }, + _nulling: function () { + rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = scrollEl = scrollParentEl = tapEvt = touchEvt = moved = newIndex = lastEl = lastCSS = activeGroup = Sortable.active = null; + }, + handleEvent: function (evt) { + var type = evt.type; + if (type === 'dragover' || type === 'dragenter') { + if (dragEl) { + this._onDragOver(evt); + _globalDragOver(evt); + } + } else if (type === 'drop' || type === 'dragend') { + this._onDrop(evt); + } + }, + toArray: function () { + var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options; + for (; i < n; i++) { + el = children[i]; + if (_closest(el, options.draggable, this.el)) { + order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); + } + } + return order; + }, + sort: function (order) { + var items = {}, rootEl = this.el; + this.toArray().forEach(function (id, i) { + var el = rootEl.children[i]; + if (_closest(el, this.options.draggable, rootEl)) { + items[id] = el; + } + }, this); + order.forEach(function (id) { + if (items[id]) { + rootEl.removeChild(items[id]); + rootEl.appendChild(items[id]); + } + }); + }, + save: function () { + var store = this.options.store; + store && store.set(this); + }, + closest: function (el, selector) { + return _closest(el, selector || this.options.draggable, this.el); + }, + option: function (name, value) { + var options = this.options; + if (value === void 0) { + return options[name]; + } else { + options[name] = value; + if (name === 'group') { + _prepareGroup(options); + } + } + }, + destroy: function () { + var el = this.el; + el[expando] = null; + _off(el, 'mousedown', this._onTapStart); + _off(el, 'touchstart', this._onTapStart); + if (this.nativeDraggable) { + _off(el, 'dragover', this); + _off(el, 'dragenter', this); + } + Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { + el.removeAttribute('draggable'); + }); + touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1); + this._onDrop(); + this.el = el = null; + } + }; + function _cloneHide(state) { + if (cloneEl && cloneEl.state !== state) { + _css(cloneEl, 'display', state ? 'none' : ''); + !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl); + cloneEl.state = state; + } + } + function _closest(el, selector, ctx) { + if (el) { + ctx = ctx || document; + do { + if (selector === '>*' && el.parentNode === ctx || _matches(el, selector)) { + return el; + } + } while (el !== ctx && (el = el.parentNode)); + } + return null; + } + function _globalDragOver(evt) { + if (evt.dataTransfer) { + evt.dataTransfer.dropEffect = 'move'; + } + evt.preventDefault(); + } + function _on(el, event, fn) { + el.addEventListener(event, fn, false); + } + function _off(el, event, fn) { + el.removeEventListener(event, fn, false); + } + function _toggleClass(el, name, state) { + if (el) { + if (el.classList) { + el.classList[state ? 'add' : 'remove'](name); + } else { + var className = (' ' + el.className + ' ').replace(RSPACE, ' ').replace(' ' + name + ' ', ' '); + el.className = (className + (state ? ' ' + name : '')).replace(RSPACE, ' '); + } + } + } + function _css(el, prop, val) { + var style = el && el.style; + if (style) { + if (val === void 0) { + if (document.defaultView && document.defaultView.getComputedStyle) { + val = document.defaultView.getComputedStyle(el, ''); + } else if (el.currentStyle) { + val = el.currentStyle; + } + return prop === void 0 ? val : val[prop]; + } else { + if (!(prop in style)) { + prop = '-webkit-' + prop; + } + style[prop] = val + (typeof val === 'string' ? '' : 'px'); + } + } + } + function _find(ctx, tagName, iterator) { + if (ctx) { + var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length; + if (iterator) { + for (; i < n; i++) { + iterator(list[i], i); + } + } + return list; + } + return []; + } + function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) { + var evt = document.createEvent('Event'), options = (sortable || rootEl[expando]).options, onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); + evt.initEvent(name, true, true); + evt.to = rootEl; + evt.from = fromEl || rootEl; + evt.item = targetEl || rootEl; + evt.clone = cloneEl; + evt.oldIndex = startIndex; + evt.newIndex = newIndex; + rootEl.dispatchEvent(evt); + if (options[onName]) { + options[onName].call(sortable, evt); + } + } + function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect) { + var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal; + evt = document.createEvent('Event'); + evt.initEvent('move', true, true); + evt.to = toEl; + evt.from = fromEl; + evt.dragged = dragEl; + evt.draggedRect = dragRect; + evt.related = targetEl || toEl; + evt.relatedRect = targetRect || toEl.getBoundingClientRect(); + fromEl.dispatchEvent(evt); + if (onMoveFn) { + retVal = onMoveFn.call(sortable, evt); + } + return retVal; + } + function _disableDraggable(el) { + el.draggable = false; + } + function _unsilent() { + _silent = false; + } + function _ghostIsLast(el, evt) { + var lastEl = el.lastElementChild, rect = lastEl.getBoundingClientRect(); + return (evt.clientY - (rect.top + rect.height) > 5 || evt.clientX - (rect.right + rect.width) > 5) && lastEl; + } + function _generateId(el) { + var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0; + while (i--) { + sum += str.charCodeAt(i); + } + return sum.toString(36); + } + function _index(el, selector) { + var index = 0; + if (!el || !el.parentNode) { + return -1; + } + while (el && (el = el.previousElementSibling)) { + if (el.nodeName.toUpperCase() !== 'TEMPLATE' && _matches(el, selector)) { + index++; + } + } + return index; + } + function _matches(el, selector) { + if (el) { + selector = selector.split('.'); + var tag = selector.shift().toUpperCase(), re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g'); + return (tag === '' || el.nodeName.toUpperCase() == tag) && (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length); + } + return false; + } + function _throttle(callback, ms) { + var args, _this; + return function () { + if (args === void 0) { + args = arguments; + _this = this; + setTimeout(function () { + if (args.length === 1) { + callback.call(_this, args[0]); + } else { + callback.apply(_this, args); + } + args = void 0; + }, ms); + } + }; + } + function _extend(dst, src) { + if (dst && src) { + for (var key in src) { + if (src.hasOwnProperty(key)) { + dst[key] = src[key]; + } + } + } + return dst; + } + Sortable.utils = { + on: _on, + off: _off, + css: _css, + find: _find, + is: function (el, selector) { + return !!_closest(el, selector, el); + }, + extend: _extend, + throttle: _throttle, + closest: _closest, + toggleClass: _toggleClass, + index: _index + }; + Sortable.create = function (el, options) { + return new Sortable(el, options); + }; + Sortable.version = '1.4.2'; + return Sortable; +})); +CommonControlsLayerSwitcherDOM = function (Sortable) { + var LayerSwitcherDOM = { + _createDraggableElement: function (elementDraggable, context) { + Sortable.create(elementDraggable, { + handle: '.GPlayerName', + draggable: '.draggable-layer', + ghostClass: 'GPghostLayer', + animation: 200, + onEnd: function (e) { + context._onDragAndDropLayerClick(e); + } + }); + }, + _addUID: function (id) { + var uid = this._uid ? id + '-' + this._uid : id; + return uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPlayerSwitcher'); + container.className = 'GPwidget'; + return container; + }, + _createMainLayersShowElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowLayersList'); + input.type = 'checkbox'; + return input; + }, + _createMainLayersElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPlayersList'); + div.className = 'GPpanel'; + return div; + }, + _createMainPictoElement: function () { + var self = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowLayersListPicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowLayersList'); + label.title = 'Afficher/masquer le gestionnaire de couches'; + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowLayersListOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + spanOpen.addEventListener('click', function () { + if (document.getElementById(self._addUID('GPshowLayersList')).checked) { + var layers = document.getElementsByClassName('GPlayerInfoOpened'); + for (var i = 0; i < layers.length; i++) { + layers[i].className = 'GPlayerInfo'; + } + document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed'; + } + }); + label.appendChild(spanOpen); + var spanClose = document.createElement('span'); + spanClose.addEventListener('click', function () { + if (document.getElementById(self._addUID('GPshowLayersList')).checked) { + var layers = document.getElementsByClassName('GPlayerInfoOpened'); + for (var i = 0; i < layers.length; i++) { + layers[i].className = 'GPlayerInfo'; + } + document.getElementById(self._addUID('GPlayerInfoPanel')).className = 'GPlayerInfoPanelClosed'; + } + }); + spanClose.id = self._addUID('GPshowLayersListClose'); + label.appendChild(spanClose); + return label; + }, + _createMainInfoElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPlayerInfoPanel'); + div.className = 'GPpanel GPlayerInfoPanelClosed'; + return div; + }, + _createContainerLayerElement: function (obj) { + var container = document.createElement('div'); + container.id = 'GPlayerSwitcher_ID' + obj.id; + container.className = 'GPlayerSwitcher_layer draggable-layer'; + container.appendChild(this._createBasicToolElement(obj)); + var array = this._createAdvancedToolShowElement(obj); + for (var i = 0; i < array.length; i++) { + container.appendChild(array[i]); + } + container.appendChild(this._createAdvancedToolElement(obj)); + return container; + }, + _createBasicToolElement: function (obj) { + var div = document.createElement('div'); + div.id = 'GPbasicTools_IDLayer' + obj.id; + div.className = 'GPlayerBasicTools'; + div.appendChild(this._createBasicToolNameElement(obj)); + var array = this._createBasicToolVisibilityElement(obj); + for (var i = 0; i < array.length; i++) { + div.appendChild(array[i]); + } + return div; + }, + _createBasicToolNameElement: function (obj) { + var span = document.createElement('span'); + span.id = 'GPname_ID' + obj.id; + span.className = 'GPlayerName'; + span.title = obj.description || obj.title; + span.innerHTML = obj.title; + return span; + }, + _createBasicToolVisibilityElement: function (obj) { + var list = []; + var checked = obj.visibility; + var id = 'GPvisibility_ID' + obj.id; + var input = document.createElement('input'); + input.id = id; + input.type = 'checkbox'; + input.checked = checked; + var label = document.createElement('label'); + label.htmlFor = id; + label.id = 'GPvisibilityPicto_ID' + obj.id; + label.className = 'GPlayerVisibility'; + label.title = 'Afficher/masquer la couche'; + var context = this; + if (input.addEventListener) { + input.addEventListener('click', function (e) { + context._onVisibilityLayerClick.call(context, e); + }); + } else if (input.attachEvent) { + input.attachEvent('onclick', function (e) { + context._onVisibilityLayerClick.call(context, e); + }); + } + list.push(input); + list.push(label); + return list; + }, + _createAdvancedToolShowElement: function (obj) { + var list = []; + var label = document.createElement('label'); + label.id = 'GPshowAdvancedToolsPicto_ID' + obj.id; + label.htmlFor = 'GPshowAdvancedTools_ID' + obj.id; + label.title = 'Plus d\'outils'; + label.className = 'GPshowMoreOptions GPshowLayerAdvancedTools'; + var input = document.createElement('input'); + input.type = 'checkbox'; + input.id = 'GPshowAdvancedTools_ID' + obj.id; + list.push(input); + list.push(label); + return list; + }, + _createAdvancedToolElement: function (obj) { + var container = document.createElement('div'); + container.id = 'GPadvancedTools_ID' + obj.id; + container.className = 'GPlayerAdvancedTools'; + container.appendChild(this._createAdvancedToolDeleteElement(obj)); + if (obj.title && obj.description) { + container.appendChild(this._createAdvancedToolInformationElement(obj)); + } + if (obj.type !== 'feature') { + var array = this._createAdvancedToolOpacityElement(obj); + for (var i = 0; i < array.length; i++) { + container.appendChild(array[i]); + } + } + return container; + }, + _createAdvancedToolDeleteElement: function (obj) { + var div = document.createElement('div'); + div.id = 'GPremove_ID' + obj.id; + div.className = 'GPlayerRemove'; + div.title = 'Supprimer la couche'; + div.layerId = obj.id; + var context = this; + if (div.addEventListener) { + div.addEventListener('click', function (e) { + context._onDropLayerClick.call(context, e); + }); + } else if (div.attachEvent) { + div.attachEvent('onclick', function (e) { + context._onDropLayerClick.call(context, e); + }); + } + return div; + }, + _createAdvancedToolInformationElement: function (obj) { + var div = document.createElement('div'); + div.id = 'GPinfo_ID' + obj.id; + div.className = 'GPlayerInfo'; + div.title = 'Informations/légende'; + div.layerId = obj.id; + var context = this; + if (div.addEventListener) { + div.addEventListener('click', function (e) { + context._onOpenLayerInfoClick.call(context, e); + }); + } else if (div.attachEvent) { + div.attachEvent('onclick', function (e) { + context._onOpenLayerInfoClick.call(context, e); + }); + } + return div; + }, + _createAdvancedToolOpacityElement: function (obj) { + var list = []; + var divO = document.createElement('div'); + divO.id = 'GPopacity_ID' + obj.id; + divO.className = 'GPlayerOpacity'; + divO.title = 'Opacité'; + var opacity = Math.round(obj.opacity * 100); + var input = document.createElement('input'); + input.id = 'GPopacityValueDiv_ID' + obj.id; + input.type = 'range'; + input.value = opacity; + var context = this; + if (input.addEventListener) { + input.addEventListener('change', function (e) { + context._onChangeLayerOpacity.call(context, e); + }); + } else if (input.attachEvent) { + input.attachEvent('onchange', function (e) { + context._onChangeLayerOpacity.call(context, e); + }); + } + if (input.addEventListener) { + input.addEventListener('input', function (e) { + context._onChangeLayerOpacity.call(context, e); + }); + } else if (input.attachEvent) { + input.attachEvent('oninput', function (e) { + context._onChangeLayerOpacity.call(context, e); + }); + } + divO.appendChild(input); + var divC = document.createElement('div'); + divC.id = 'GPopacityValueDiv_ID' + obj.id; + divC.className = 'GPlayerOpacityValue'; + var span = document.createElement('span'); + span.id = 'GPopacityValue_ID' + obj.id; + span.innerHTML = opacity + '%'; + divC.appendChild(span); + list.push(divO); + list.push(divC); + return list; + }, + _createContainerLayerInfoElement: function (obj) { + var container = document.createElement('div'); + container.id = 'GPlayerInfoContent'; + var title = document.createElement('div'); + title.id = 'GPlayerInfoTitle'; + title.innerHTML = obj.title; + container.appendChild(title); + if (obj.quicklookUrl) { + var quick = document.createElement('div'); + quick.id = 'GPlayerInfoQuicklook'; + quick.title = 'Afficher un aperçu de la couche'; + var refquick = document.createElement('a'); + refquick.href = obj.quicklookUrl; + refquick.appendChild(quick); + container.appendChild(refquick); + } + var close = document.createElement('div'); + close.id = 'GPlayerInfoClose'; + close.title = 'Fermer la fenêtre'; + var onCloseClick = function () { + document.getElementById('GPlayerInfoPanel').className = 'GPlayerInfoPanelClosed'; + var layers = document.getElementsByClassName('GPlayerInfoOpened'); + for (var i = 0; i < layers.length; i++) { + layers[i].className = 'GPlayerInfo'; + } + }; + if (close.addEventListener) { + close.addEventListener('click', onCloseClick); + } else if (close.attachEvent) { + close.attachEvent('onclick', onCloseClick); + } + container.appendChild(close); + var desc = document.createElement('div'); + desc.id = 'GPlayerInfoDescription'; + desc.innerHTML = obj.description; + container.appendChild(desc); + if (obj.metadata) { + var mtd = document.createElement('div'); + mtd.id = 'GPlayerInfoMetadata'; + var mtdtitle = document.createElement('div'); + mtdtitle.className = 'GPlayerInfoSubtitle'; + mtdtitle.innerHTML = 'Métadonnées'; + mtd.appendChild(mtdtitle); + for (var i = 0; i < obj.metadata.length; i++) { + var urlmtd = obj.metadata[i].url; + var mtdlink = document.createElement('div'); + mtdlink.className = 'GPlayerInfoLink'; + var refmtd = document.createElement('a'); + refmtd.href = urlmtd; + refmtd.innerHTML = urlmtd; + mtdlink.appendChild(refmtd); + mtd.appendChild(mtdlink); + } + if (obj.metadata.length !== 0) { + container.appendChild(mtd); + } + } + if (obj.legends) { + var lgd = document.createElement('div'); + lgd.id = 'GPlayerInfoLegend'; + var lgdtitle = document.createElement('div'); + lgdtitle.className = 'GPlayerInfoSubtitle'; + lgdtitle.innerHTML = 'Légende'; + lgd.appendChild(lgdtitle); + var legends = {}; + var maxScale = obj.maxScaleDenominator || 560000000; + for (var k = 0; k < obj.legends.length; k++) { + var minScale = obj.legends[k].minScaleDenominator; + if (minScale) { + var s = minScale.toString(); + minScale = Math.round(parseInt(s.substring(0, 3), 10) / 10) * Math.pow(10, s.length - 2); + } else { + minScale = 270; + } + legends[minScale] = obj.legends[k]; + } + for (var scale in legends) { + if (legends.hasOwnProperty(scale)) { + var urllgd = legends[scale].url; + if (typeof urllgd === 'string' && urllgd.toLowerCase().indexOf('nolegend.jpg') == -1) { + var lgdlink = document.createElement('div'); + lgdlink.className = 'GPlayerInfoLink'; + maxScale = legends[scale].maxScaleDenominator || maxScale; + var reflgd = document.createElement('a'); + reflgd.href = urllgd; + reflgd.innerHTML = 'Du 1/' + scale + ' au 1/' + maxScale; + lgdlink.appendChild(reflgd); + lgd.appendChild(lgdlink); + } else { + delete legends[scale]; + } + } + } + if (Object.keys(legends).length !== 0) { + container.appendChild(lgd); + } + } + return container; + } + }; + return LayerSwitcherDOM; +}(sortable); +LeafletControlsLayerSwitcher = function (L, woodman, LayerSwitcherDOM) { + var LayerSwitcher = L.Control.Layers.extend({ + includes: LayerSwitcherDOM, + options: { + collapsed: true, + position: 'topright', + autoZIndex: true, + layers: [] + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._hasLayersConfig = !this.options.layers || Object.keys(this.options.layers).length === 0 ? false : true; + this._layersConfig = this._hasLayersConfig ? this.options.layers : []; + this._layers = {}; + this._lastZIndex = 0; + if (this._hasLayersConfig) { + for (var i = 0; i < this._layersConfig.length; i++) { + var obj = this._layersConfig[i]; + this._addLayer(obj.layer, null, true); + } + } + }, + onAdd: function (map) { + var layersMap = map._layers; + if (Object.keys(layersMap).length !== 0) { + var layersKeys = Object.keys(layersMap); + this._lastZIndex = 0; + for (var i = 0; i < layersKeys.length; i++) { + var layerId = layersKeys[i]; + if (this.options.autoZIndex && layersMap[layerId].setZIndex) { + this._lastZIndex++; + layersMap[layerId].setZIndex(this._lastZIndex); + } + if (this._hasLayersConfig) { + if (this._layers[layerId]) { + continue; + } + } + this.addOverlay(layersMap[layerId]); + } + } + if (Object.keys(layersMap).length === 0) { + var config = this._layersConfig; + this._lastZIndex = 0; + for (var j = 0; j < config.length; j++) { + var layer = config[j].layer; + if (!map.hasLayer(layer)) { + map.addLayer(layer); + this.addOverlay(layer, null); + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); + } + } + } + } + for (var k in this._layers) { + if (this._layers.hasOwnProperty(k)) { + var obj = this._layers[k]; + if (!obj.visibility) { + this._visibilityLayer(!obj.visibility, obj.layer); + } + } + } + this._initLayout(); + this._update(); + map.on('layeradd', this._onLayerChange, this); + map.on('layerremove', this._onLayerChange, this); + return this._container; + }, + _addLayer: function (layer, name, overlay) { + var id = layer._geoportal_id ? layer._geoportal_id : layer._leaflet_id; + if (!id) { + return; + } + var layerConfig = {}; + for (var i in this._layersConfig) { + if (this._layersConfig.hasOwnProperty(i)) { + if (id === L.stamp(this._layersConfig[i].layer)) { + layerConfig = this._layersConfig[i].config; + var display = typeof this._layersConfig[i].display != 'undefined' ? this._layersConfig[i].display : true; + if (!display) { + return; + } + break; + } + } + } + this._layers[id] = { + layer: layer, + id: id, + overlay: overlay, + title: layer._geoportal_id && layer._title ? layer._title : name ? name : id, + description: layer._geoportal_id && layer._description ? layer._description : name ? name : id, + visibility: layer._geoportal_id ? layer.getVisible() : true, + legends: layer._geoportal_id ? layer._legends : null, + metadata: layer._geoportal_id ? layer._metadata : null, + quicklookUrl: layer._geoportal_id ? layer._quicklookUrl : null + }; + if (layerConfig && Object.keys(layerConfig)) { + L.Util.extend(this._layers[id], layerConfig); + } + layer._geoportal_id ? layer.setVisible(this._layers[id].visibility) : null; + }, + _initLayout: function () { + var container = this._container = this._createMainContainerElement(); + var input = this._createMainLayersShowElement(); + container.appendChild(input); + if (!this.options.collapsed) { + input.checked = 'checked'; + } + var divL = this._overlaysList = this._createMainLayersElement(); + container.appendChild(divL); + var picto = this._createMainPictoElement(); + container.appendChild(picto); + var divI = this._createMainInfoElement(); + container.appendChild(divI); + this._createDraggableElement(this._overlaysList, this); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + this._map.on('moveend', this._onOutOfRangeLayerZoom, this); + switch (this.getPosition()) { + case 'topright': + container.style.position = 'relative'; + container.style.top = '0'; + container.style.right = '0'; + break; + case 'topleft': + container.style.position = 'relative'; + container.style.top = '0'; + container.style.right = 'initial'; + picto.style.float = 'left'; + divL.style.borderBottomRightRadius = '5px'; + divL.style.borderBottomLeftRadius = '0'; + divI.style.right = 'initial'; + divI.style.left = '190px'; + break; + case 'bottomleft': + container.style.position = 'relative'; + container.style.top = '0'; + container.style.right = 'initial'; + picto.style.float = 'left'; + divL.style.borderBottomRightRadius = '5px'; + divL.style.borderBottomLeftRadius = '0'; + divI.style.right = 'initial'; + divI.style.left = '190px'; + break; + case 'bottomright': + container.style.position = 'relative'; + container.style.top = '0'; + container.style.right = '0'; + break; + default: + container.style.position = 'relative'; + container.style.top = '0'; + container.style.right = '0'; + } + }, + _update: function () { + if (!this._container) { + return; + } + this._overlaysList.innerHTML = ''; + var layersId = []; + for (var i in this._layers) { + if (this._layers.hasOwnProperty(i)) { + layersId.push(i); + } + } + var layers = layersId.sort(function (a, b) { + var ia = parseInt(a, 10); + var ib = parseInt(b, 10); + return ia - ib; + }).reverse(); + for (var j = 0; j < layers.length; j++) { + var id = layers[j]; + var obj = this._layers[id]; + this._addItem(obj); + } + }, + _addItem: function (obj) { + obj.opacity = obj.layer.options.opacity; + var container = this._createContainerLayerElement(obj); + obj.layer.options.minZoom > this._map.getZoom() || obj.layer.options.maxZoom < this._map.getZoom() ? L.DomUtil.addClass(container, 'outOfRange') : L.DomUtil.removeClass(container, 'outOfRange'); + this._overlaysList.appendChild(container); + return container; + }, + _onLayerChange: function (e) { + var obj = this._layers[L.stamp(e.layer)]; + if (!obj) { + return; + } + if (!this._handlingClick) { + this._update(); + } + var type = e.type === 'layeradd' ? 'overlayadd' : 'overlayremove'; + if (type) { + this._map.fire(type, obj); + } + }, + removeLayer: function (layer) { + var id = L.stamp(layer); + delete this._layers[id]; + this._update(); + return this; + }, + _visibilityLayer: function (checked, layer) { + this._handlingClick = true; + if (layer._geoportal_id) { + var value = !layer.getVisible(); + layer.setVisible(value); + } + if (checked && this._map.hasLayer(layer)) { + this._map.removeLayer(layer); + } else if (!checked && !this._map.hasLayer(layer)) { + this._map.addLayer(layer); + } else { + } + this._handlingClick = false; + this._refocusOnMap(); + }, + _onOutOfRangeLayerZoom: function () { + var map = this._map; + var layers = this._layers; + for (var i in layers) { + if (layers.hasOwnProperty(i)) { + var layer = layers[i].layer; + var id = layers[i].id; + var div = L.DomUtil.get('GPlayerSwitcher_ID' + id); + if (layer.options.minZoom > map.getZoom() || layer.options.maxZoom < map.getZoom()) { + L.DomUtil.addClass(div, 'outOfRange'); + } else { + L.DomUtil.removeClass(div, 'outOfRange'); + } + } + } + }, + _onVisibilityLayerClick: function (e) { + var layerId = e.target.id; + var layerIdx = layerId.substring(layerId.indexOf('_') + 3); + var input = L.DomUtil.get(layerId); + this._layers[layerIdx].visibility = input.checked; + this._visibilityLayer(!input.checked, this._layers[layerIdx].layer); + }, + _onDropLayerClick: function (e) { + var layerId = e.target.id; + var layerIdx = layerId.substring(layerId.indexOf('_') + 3); + var layer = this._layers[layerIdx].layer; + this.removeLayer(layer); + if (this._map.hasLayer(layer)) { + this._map.removeLayer(layer); + } + }, + _onChangeLayerOpacity: function (e) { + var layerId = e.target.id; + var layerIdx = layerId.substring(layerId.indexOf('_') + 3); + var layer = this._layers[layerIdx].layer; + var opacityValue = e.target.value; + var opacityId = L.DomUtil.get('GPopacityValue_ID' + layerIdx); + opacityId.innerHTML = opacityValue + '%'; + if (this._map.hasLayer(layer)) { + layer.setOpacity(opacityValue / 100); + } + }, + _onOpenLayerInfoClick: function (e) { + var layerId = e.target.id; + var layerIdx = layerId.substring(layerId.indexOf('_') + 3); + var layer = this._layers[layerIdx]; + var divId = L.DomUtil.get(e.target.id); + var panel = null; + var info = null; + if (divId.className === 'GPlayerInfoOpened') { + L.DomUtil.removeClass(divId, 'GPlayerInfoOpened'); + L.DomUtil.addClass(divId, 'GPlayerInfo'); + panel = L.DomUtil.get('GPlayerInfoPanel'); + L.DomUtil.removeClass(panel, 'GPpanel'); + L.DomUtil.removeClass(panel, 'GPlayerInfoPanelOpened'); + L.DomUtil.addClass(panel, 'GPlayerInfoPanelClosed'); + info = L.DomUtil.get('GPlayerInfoContent'); + panel.removeChild(info); + return; + } + var layers = document.getElementsByClassName('GPlayerInfoOpened'); + for (var i = 0; i < layers.length; i++) { + layers[i].className = 'GPlayerInfo'; + } + L.DomUtil.removeClass(divId, 'GPlayerInfo'); + L.DomUtil.addClass(divId, 'GPlayerInfoOpened'); + panel = L.DomUtil.get('GPlayerInfoPanel'); + L.DomUtil.addClass(panel, 'GPpanel'); + L.DomUtil.removeClass(panel, 'GPlayerInfoPanelClosed'); + L.DomUtil.addClass(panel, 'GPlayerInfoPanelOpened'); + info = L.DomUtil.get('GPlayerInfoContent'); + if (info) { + panel.removeChild(info); + } + var infoLayer = this._createContainerLayerInfoElement(layer); + panel.appendChild(infoLayer); + }, + _onDragAndDropLayerClick: function (e) { + var layerId = e.item.id; + var layerIdx = layerId.substring(layerId.indexOf('_') + 3); + var layer = this._layers[layerIdx].layer; + var matchesLayers = document.querySelectorAll('div.GPlayerSwitcher_layer'); + this._lastZIndex = matchesLayers.length; + for (var i = 0; i < matchesLayers.length; i++) { + var tag = matchesLayers[i].id; + var id = tag.substring(tag.indexOf('_') + 3); + var _layer = this._layers[id].layer; + if (this.options.autoZIndex && _layer.setZIndex) { + this._lastZIndex--; + _layer.setZIndex(this._lastZIndex); + } + } + }, + addLayer: function (layer, config) { + var map = this._map; + var cfg = this._layersConfig; + if (!layer) { + console.log('[ERROR] LayerSwitcher:addLayer - missing layer parameter !'); + return; + } + if (!map.hasLayer(layer)) { + console.log('[WARN] LayerSwitcher:addLayer - layer has not been added on map !'); + } + var id = L.stamp(layer); + for (var i in cfg) { + if (cfg.hasOwnProperty(i)) { + if (id === L.stamp(cfg[i].layer)) { + delete cfg[i]; + break; + } + } + } + var _config = config || {}; + L.Util.extend(_config, { layer: layer }); + cfg.push(_config); + layer.setZIndex(this._lastZIndex++); + this.addOverlay(layer); + this._update(); + } + }); + return LayerSwitcher; +}(leaflet, {}, CommonControlsLayerSwitcherDOM); +CommonUtilsConfig = function () { + var Config = { + configuration: null, + isConfigLoaded: function () { + var scope = typeof window !== 'undefined' ? window : {}; + if (scope.Gp && scope.Gp.Config && Object.keys(scope.Gp.Config).length !== 0) { + this.configuration = scope.Gp.Config; + return true; + } + return false; + }, + getLayerId: function (layerName, service) { + var layerId = null; + if (this.configuration) { + var layers = this.configuration['layers']; + for (var key in layers) { + if (layers.hasOwnProperty(key)) { + var parts = key.split('$'); + if (layerName === parts[0]) { + if (parts[1]) { + var servicePartsLayer = parts[1].split(':'); + var servicePartsService = parts[1].split(';'); + if (servicePartsService[1] === service) { + layerId = key; + break; + } + if (servicePartsLayer[2] === service) { + layerId = key; + break; + } + } + } + } + } + } + if (!layerId) { + console.log('ERROR layer id (' + layerName + ' / ' + service + ') was not found !?'); + } + return layerId; + }, + getLayerParams: function (layerName, service, apiKey) { + var params = {}; + if (this.configuration) { + var layerId = this.getLayerId(layerName, service); + if (layerId) { + var layerConf = this.configuration.layers[layerId]; + var key = layerConf.apiKeys[0]; + if (apiKey) { + if (apiKey !== key) { + console.log('ERROR different keys (' + apiKey + ' !== ' + key + ') !?'); + return; + } + } + apiKey = apiKey || key; + params.key = apiKey; + params.url = layerConf.getServerUrl(apiKey); + params.version = layerConf.getServiceParams().version; + params.styles = layerConf.getDefaultStyle(); + params.format = layerConf.getDefaultFormat(); + params.projection = layerConf.getDefaultProjection(); + params.minScale = layerConf.getMinScaleDenominator(); + params.maxScale = layerConf.getMaxScaleDenominator(); + params.extent = layerConf.getBBOX(); + params.legends = layerConf.getLegends(); + params.metadata = layerConf.getMetadata(); + params.originators = layerConf.getOriginators(); + params.title = layerConf.getTitle(); + params.description = layerConf.getDescription(); + params.quicklookUrl = layerConf.getQuicklookUrl(); + if (layerConf.wmtsOptions) { + params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits; + } + var TMSLink = layerConf.getTMSID(); + if (TMSLink) { + params.TMSLink = TMSLink; + var tmsConf = this.configuration.getTMSConf(TMSLink); + params.matrixOrigin = tmsConf.getTopLeftCorner(); + params.nativeResolutions = tmsConf.nativeResolutions; + params.matrixIds = tmsConf.matrixIds; + params.tileMatrices = tmsConf.tileMatrices; + } + } + } + return params; + }, + getServiceParams: function (resource, service, apiKey) { + var params = {}; + if (this.configuration) { + var layerId = this.getLayerId(resource, service); + if (layerId) { + var layerConf = this.configuration.layers[layerId]; + var key = layerConf.apiKeys[0]; + if (apiKey) { + if (apiKey !== key) { + return; + } + } + apiKey = apiKey || key; + params.key = apiKey; + params.url = layerConf.getServerUrl(apiKey); + params.version = layerConf.getServiceParams().version; + params.extent = layerConf.getBBOX(); + params.title = layerConf.getTitle(); + params.description = layerConf.getDescription(); + } + } + return params; + }, + getResolutions: function () { + var resolutions = []; + if (this.configuration) { + resolutions = this.configuration['generalOptions']['wgs84Resolutions']; + } + return resolutions; + }, + getTileMatrix: function (tmsName) { + var tms = {}; + if (this.configuration) { + if (tmsName) { + tms = this.configuration['tileMatrixSets'][tmsName.toUpperCase()]; + } + } + return tms; + }, + getGlobalConstraints: function (layerId) { + var params = {}; + if (layerId) { + var layerConf = this.configuration.layers[layerId]; + params.projection = layerConf.getDefaultProjection(); + params.minScale = layerConf.getMinScaleDenominator(); + params.maxScale = layerConf.getMaxScaleDenominator(); + params.extent = layerConf.getBBOX(); + } + return params; + } + }; + return Config; +}(); +CommonUtilsCheckRightManagement = function (woodman, Config) { + return { + check: function (options) { + if (!options) { + return; + } + var _key = options.key; + var _resources = options.resources || []; + var _services = options.services || []; + if (!_resources || _resources.length === 0) { + return; + } + if (!_services || _services.length === 0) { + return; + } + var _rightManagement = {}; + if (!_key) { + if (!Config.isConfigLoaded()) { + console.log('WARNING : ' + 'parameter \'apiKey\' has not been parametered, ' + 'and the contract key configuration has not been loaded, ' + 'so impossible to check yours rights !'); + return; + } else { + _key = Object.keys(Config.configuration.generalOptions.apiKeys)[0]; + } + } + if (_key) { + if (!Config.isConfigLoaded()) { + console.log('WARNING : ' + 'the contract key configuration has not been loaded, ' + 'so be carefull !'); + var _noRightManagement = {}; + for (var i = 0; i < _services.length; i++) { + var service = _services[i]; + _noRightManagement[service] = []; + for (var j = 0; j < _resources.length; j++) { + var resource = _resources[j]; + _noRightManagement[service].push(resource); + } + } + _noRightManagement.key = _key; + return _noRightManagement; + } else { + for (var k = 0; k < _resources.length; k++) { + var _resource = _resources[k]; + for (var l = 0; l < _services.length; l++) { + var _service = _services[l]; + var params = Config.getServiceParams(_resource, _service, _key); + if (!params || Object.keys(params).length === 0) { + console.log('WARNING : ' + 'contract key configuration has no rights to load this geoportal ' + 'resource (' + _resource + ') ' + 'for this service (' + _service + ') '); + continue; + } + if (!_rightManagement[_service]) { + _rightManagement[_service] = []; + } + _rightManagement[_service].push(_resource); + } + } + if (!_rightManagement || Object.keys(_rightManagement).length === 0) { + console.log('WARNING : ' + 'the contract key configuration has been loaded, ' + 'and the parameter \'apiKey\' has been parametered, ' + 'but, there is a problem on the mapping between the contract and the key !'); + return; + } + _rightManagement.key = _key; + return _rightManagement; + } + } + } + }; +}({}, CommonUtilsConfig); +CommonUtilsSelectorID = function () { + var SelectorID = { + generate: function () { + var timestamp = Math.floor(Date.now()); + return function () { + return timestamp++; + }; + }(), + name: function (id) { + var name = null; + var i = id.indexOf('-'); + if (i === -1) { + name = id; + } else { + name = id.substring(0, i); + } + return name; + }, + index: function (id) { + var index = null; + var name = this.name(id); + if (name !== id) { + var i = name.indexOf('_'); + if (i !== -1) { + index = name.substring(i + 1); + } + } + return index; + }, + uuid: function (id) { + var uuid = null; + var i = id.indexOf('-'); + if (i !== -1) { + uuid = parseInt(id.substring(i + 1), 10); + } + return uuid; + } + }; + return SelectorID; +}(); +CommonControlsLocationSelectorDOM = function (ID) { + var LocationSelectorDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.className = this._addUID('GPlocationPoint'); + container.className += ' GPwidget'; + return container; + }, + _createLocationPointElement: function (id, display) { + var div = document.createElement('div'); + div.id = this._addUID('GPlocationPoint_' + id); + div.className = display ? 'GPflexInput GPlocationStageFlexInput' : 'GPflexInput GPlocationStageFlexInputHidden'; + div.style.cssText = ''; + return div; + }, + _createLocationPointLabelElement: function (id, text) { + var self = this; + var labelOrigin = document.createElement('label'); + labelOrigin.id = this._addUID('GPlocationOriginLabel_' + id); + labelOrigin.htmlFor = 'GPlocationOrigin_' + id; + labelOrigin.innerHTML = text; + labelOrigin.addEventListener('click', function (e) { + var i = ID.index(this.id); + var points = document.getElementsByClassName(self._addUID('GPlocationPoint')); + for (var j = 0; j < points.length; j++) { + var tag = points[j].childNodes[0].id; + var id = ID.index(tag); + document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = ''; + } + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = ''; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = ''; + document.getElementById(self._addUID('GPlocationPoint_' + i)).style.cssText = ''; + document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden'; + if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) { + document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove'; + } + if (document.getElementById(self._addUID('GPlocationStageAdd'))) { + document.getElementById(self._addUID('GPlocationStageAdd')).className = ''; + } + self.onLocationClearPointClick(e); + }); + return labelOrigin; + }, + _createLocationAutoCompleteteInputElement: function (id) { + var self = this; + var inputOrigin = document.createElement('input'); + inputOrigin.id = this._addUID('GPlocationOrigin_' + id); + inputOrigin.className = 'GPlocationOriginVisible'; + inputOrigin.type = 'text'; + inputOrigin.placeholder = 'Saisir une adresse'; + inputOrigin.autocomplete = 'off'; + inputOrigin.addEventListener('keyup', function (e) { + var charCode = e.which || e.keyCode; + if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) { + return; + } + var i = ID.index(this.id); + if (document.getElementById(self._addUID('GPlocationOrigin_' + i)).value.length > 2) { + document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'block'; + } else { + document.getElementById(self._addUID('GPlocationAutoCompleteList_' + i)).style.display = 'none'; + } + self.onAutoCompleteSearchText(e); + }); + inputOrigin.addEventListener('keydown', function (e) { + var charCode = e.which || e.keyCode; + var container = document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)); + if (!container) { + return; + } + var curr = container.getElementsByClassName('GPautoCompleteProposal current'); + var list = container.getElementsByClassName('GPautoCompleteProposal'); + var length = list.length; + if (!length) { + return; + } + var current = null; + if (!curr.length) { + current = list[0]; + current.className = 'GPautoCompleteProposal current'; + current.style.color = '#000000'; + current.style['background-color'] = '#CEDBEF'; + return; + } else { + current = curr[0]; + } + var index = parseInt(ID.index(current.id), 10); + var next = index === length - 1 ? list[0] : list[index + 1]; + var prev = index === 0 ? list[length - 1] : list[index - 1]; + current.style['background-color'] = ''; + current.style.color = ''; + prev.style['background-color'] = ''; + prev.style.color = ''; + next.style['background-color'] = ''; + next.style.color = ''; + switch (charCode) { + case 38: + console.log('arrow up'); + current.className = 'GPautoCompleteProposal'; + prev.className = 'GPautoCompleteProposal current'; + prev.style.color = '#000000'; + prev.style['background-color'] = '#CEDBEF'; + break; + case 40: + console.log('arrow down'); + current.className = 'GPautoCompleteProposal'; + next.className = 'GPautoCompleteProposal current'; + next.style.color = '#000000'; + next.style['background-color'] = '#CEDBEF'; + break; + case 13: + console.log('enter'); + current.click(e); + break; + } + current.focus(); + }); + return inputOrigin; + }, + _createLocationCoordinateInputElement: function (id) { + var self = this; + var inputOriginCoord = document.createElement('input'); + inputOriginCoord.id = this._addUID('GPlocationOriginCoords_' + id); + inputOriginCoord.className = 'GPlocationOriginHidden'; + inputOriginCoord.type = 'text'; + inputOriginCoord.disabled = false; + inputOriginCoord.addEventListener('click', function () { + var i = ID.index(this.id); + document.getElementById(self._addUID('GPlocationOriginLabel_' + i)).click(); + }); + return inputOriginCoord; + }, + _createLocationPointerShowInputElement: function (id) { + var inputOriginPointer = document.createElement('input'); + inputOriginPointer.id = this._addUID('GPlocationOriginPointer_' + id); + inputOriginPointer.type = 'checkbox'; + return inputOriginPointer; + }, + _createLocationPointerInputElement: function (id) { + var self = this; + var labelOriginPointer = document.createElement('label'); + labelOriginPointer.id = this._addUID('GPlocationOriginPointerImg_' + id); + labelOriginPointer.htmlFor = 'GPlocationOriginPointer_' + id; + labelOriginPointer.className = 'GPlocationOriginPointerImg'; + labelOriginPointer.title = 'Pointer un lieu sur la carte'; + labelOriginPointer.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + var i = ID.index(this.id); + var points = document.getElementsByClassName(self._addUID('GPlocationPoint')); + var j; + var tag; + var id; + for (j = 0; j < points.length; j++) { + tag = points[j].childNodes[0].id; + id = ID.index(tag); + if (i != id) { + document.getElementById(self._addUID('GPlocationOriginPointer_' + id)).checked = false; + if (document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value == 'Pointer un lieu sur la carte') { + document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).value = ''; + document.getElementById(self._addUID('GPlocationOrigin_' + id)).className = 'GPlocationOriginVisible'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + id)).className = 'GPlocationOriginHidden'; + } + } + } + if (document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked) { + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = ''; + for (j = 0; j < points.length; j++) { + tag = points[j].childNodes[0].id; + id = ID.index(tag); + document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = ''; + } + if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) { + document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationStageRemove'; + } + if (document.getElementById(self._addUID('GPlocationStageAdd'))) { + document.getElementById(self._addUID('GPlocationStageAdd')).className = ''; + } + document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = false; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden'; + } else { + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = 'Pointer un lieu sur la carte'; + for (j = 0; j < points.length; j++) { + tag = points[j].childNodes[0].id; + id = ID.index(tag); + if (i == id) { + document.getElementById(self._addUID('GPlocationPoint_' + id)).style.cssText = ''; + } else { + document.getElementById(self._addUID('GPlocationPoint_' + id)).style.display = 'none'; + } + } + if (document.getElementById(self._addUID('GPlocationStageRemove_' + i))) { + document.getElementById(self._addUID('GPlocationStageRemove_' + i)).className = 'GPlocationOriginHidden'; + } + if (document.getElementById(self._addUID('GPlocationStageAdd'))) { + document.getElementById(self._addUID('GPlocationStageAdd')).className = 'GPlocationOriginHidden'; + } + document.getElementById(self._addUID('GPlocationOriginPointer_' + i)).checked = true; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginHidden'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginVisible'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).disabled = true; + } + self.onActivateMapPointClick(e); + }); + return labelOriginPointer; + }, + _createLocationRemovePointElement: function (id) { + var self = this; + var divRm = document.createElement('div'); + divRm.id = this._addUID('GPlocationStageRemove_' + id); + divRm.className = 'GPlocationStageRemove'; + divRm.title = 'Supprimer l\'étape'; + divRm.addEventListener('click', function (e) { + var points = document.getElementsByClassName(self._addUID('GPlocationPoint')); + var last = points.length - 1; + var start = points[0].childNodes[0].id; + var end = points[last].childNodes[0].id; + var startID = ID.index(start); + var endID = ID.index(end); + if (id != startID && id != endID) { + var i = ID.index(this.id); + document.getElementById(self._addUID('GPlocationPoint_' + i)).className = 'GPflexInput GPlocationStageFlexInputHidden'; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).value = ''; + document.getElementById(self._addUID('GPlocationOrigin_' + i)).className = 'GPlocationOriginVisible'; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).value = ''; + document.getElementById(self._addUID('GPlocationOriginCoords_' + i)).className = 'GPlocationOriginHidden'; + document.getElementById(self._addUID('GPlocationStageAdd')).style.display = ''; + self.onLocationRemovePointClick(e); + } + }); + return divRm; + }, + _createLocationAddPointElement: function () { + var self = this; + var divAdd = document.createElement('div'); + divAdd.id = this._addUID('GPlocationStageAdd'); + divAdd.title = 'Ajouter une étape'; + divAdd.addEventListener('click', function (e) { + var lastStage = 1; + var nbStages = 0; + var points = document.getElementsByClassName(self._addUID('GPlocationPoint')); + for (var i = 1; i < points.length - 1; i++) { + var tag = points[i].childNodes[0].id; + var id = ID.index(tag); + if (document.getElementById(self._addUID('GPlocationPoint_' + id))) { + if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInputHidden') { + if (lastStage == 1) { + lastStage = id; + } + } else { + nbStages++; + } + } + } + if (lastStage < points.length) { + document.getElementById(self._addUID('GPlocationPoint_' + lastStage)).className = 'GPflexInput GPlocationStageFlexInput'; + } + if (nbStages == 4) { + document.getElementById(self._addUID('GPlocationStageAdd')).style.display = 'none'; + } + self.onLocationAddPointClick(e); + }); + return divAdd; + }, + _createLocationAutoCompleteResultElement: function (id) { + var self = this; + var div = document.createElement('div'); + div.id = this._addUID('GPlocationAutoCompleteList_' + id); + div.className = 'GPadvancedAutoCompleteList'; + if (div.addEventListener) { + div.addEventListener('click', function (e) { + self.onAutoCompletedResultsItemClick(e); + document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none'; + }, false); + } else if (div.attachEvent) { + div.attachEvent('onclick', function (e) { + self.onAutoCompletedResultsItemClick(e); + document.getElementById(self._addUID('GPlocationAutoCompleteList_' + id)).style.display = 'none'; + }); + } + return div; + }, + _createLocationAutoCompletedLocationElement: function (id, location, n) { + var container = document.getElementById(this._addUID('GPlocationAutoCompleteList_' + id)); + var div = document.createElement('div'); + div.id = this._addUID('AutoCompletedLocation_' + n); + div.className = 'GPautoCompleteProposal'; + div.innerHTML = location.fullText; + container.appendChild(div); + }, + GPdisplayCoordinate: function (value) { + var points = document.getElementsByClassName(this._addUID('GPlocationPoint')); + for (var i = 0; i < points.length; i++) { + var tag = points[i].childNodes[0].id; + var id1 = ID.index(tag); + if (document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked) { + document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).value = value; + document.getElementById(this._addUID('GPlocationOriginCoords_' + id1)).disabled = false; + for (var j = 0; j < points.length; j++) { + tag = points[j].childNodes[0].id; + var id2 = ID.index(tag); + document.getElementById(this._addUID('GPlocationPoint_' + id2)).style.cssText = ''; + if (document.getElementById(this._addUID('GPlocationStageRemove_' + id2))) { + document.getElementById(this._addUID('GPlocationStageRemove_' + id2)).className = 'GPlocationStageRemove'; + } + } + document.getElementById(this._addUID('GPlocationOriginPointer_' + id1)).checked = false; + if (document.getElementById(this._addUID('GPlocationStageAdd'))) { + document.getElementById(this._addUID('GPlocationStageAdd')).className = ''; + } + return; + } + } + } + }; + return LocationSelectorDOM; +}(CommonUtilsSelectorID); +LeafletControlsUtilsPositionFormater = function () { + var PositionFormater = { + NORTH: 'N', + SOUTH: 'S', + EAST: 'E', + WEST: 'W', + digitSecond: 2, + digitDecimal: 5, + digitRadian: 8, + roundToDecimal: function (inputNum, numPoints) { + var multiplier = Math.pow(10, numPoints); + return Math.round(inputNum * multiplier) / multiplier; + }, + decimalToRadian: function (location) { + var d = 0.017453292519943295; + return this.roundToDecimal(location * d, this.digitRadian); + }, + decimalToGrade: function (location) { + var d = 1.1111111111111112; + return this.roundToDecimal(location * d, this.digitRadian); + }, + decimalToDMS: function (location, hemisphere) { + if (location < 0) { + location *= -1; + } + var degrees = Math.floor(location); + var minutesFromRemainder = (location - degrees) * 60; + var minutes = Math.floor(minutesFromRemainder); + var secondsFromRemainder = (minutesFromRemainder - minutes) * 60; + var seconds = this.roundToDecimal(secondsFromRemainder, this.digitSecond); + var dms = degrees + '\xB0 ' + minutes + '\' ' + seconds + '" '; + if (hemisphere) { + dms += hemisphere; + } + return dms; + }, + decimalLatToDMS: function (location) { + var hemisphere = location < 0 ? this.SOUTH : this.NORTH; + return this.decimalToDMS(location, hemisphere); + }, + decimalLongToDMS: function (location) { + var hemisphere = location < 0 ? this.WEST : this.EAST; + return this.decimalToDMS(location, hemisphere); + }, + DMSToDecimal: function (degrees, minutes, seconds, hemisphere) { + var ddVal = degrees + minutes / 60 + seconds / 3600; + ddVal = hemisphere == this.SOUTH || hemisphere == this.WEST ? ddVal * -1 : ddVal; + var decimal = this.roundToDecimal(ddVal, this.digitDecimal); + return decimal; + } + }; + return PositionFormater; +}(); +LeafletControlsUtilsIconDefault = function (L) { + var IconDefault = L.Icon.Default.extend({ + images: { + shadow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=', + color: { + blue: 'data:image/png;base64,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', + orange: 'data:image/png;base64,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', + red: 'data:image/png;base64,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', + green: 'data:image/png;base64,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' + } + }, + initialize: function (color, options) { + L.Util.extend(this.options, options); + switch (color) { + case 'red': + this.options.iconUrl = this.images.color.red; + break; + case 'green': + this.options.iconUrl = this.images.color.green; + break; + case 'orange': + this.options.iconUrl = this.images.color.orange; + break; + case 'blue': + this.options.iconUrl = this.images.color.blue; + break; + default: + this.options.iconUrl = this.images.color.blue; + } + this.options.shadowUrl = this.images.shadow; + } + }); + return IconDefault; +}(leaflet); +LeafletControlsLocationSelector = function (L, woodman, Gp, RightManagement, ID, LocationSelectorDOM, PositionFormater, IconDefault) { + var LocationSelector = L.Control.extend({ + includes: LocationSelectorDOM, + options: { + position: 'topleft', + tag: { + id: 0, + unique: null, + label: '>', + color: 'blue', + display: true, + addOption: false, + removeOption: false + }, + disableReverse: false, + displayInfo: true, + autocompleteOptions: {}, + reverseGeocodeOptions: {} + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._uid = this.options.tag.unique || null; + this._activeDragAndDrop = false; + this._pressedKeyOnDragAndDrop = false; + this._map = null; + this._inputsContainer = null; + this._inputLabelContainer = null; + this._inputAutoCompleteContainer = null; + this._inputShowPointerContainer = null; + this._inputCoordinateContainer = null; + this._coordinate = null; + this._suggestedContainer = null; + this._suggestedLocations = []; + this._currentLocation = null; + this._marker = null; + this._resources = {}; + this._noRightManagement = false; + this._checkRightsManagement(); + this._container = this._uid ? this._initLayout() : null; + }, + onAdd: function () { + this._uid = ID.generate(); + var container = this._initLayout(); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + return container; + }, + onRemove: function () { + }, + getCoordinate: function () { + return this._coordinate; + }, + getCoordinateInverse: function () { + if (!this._coordinate) { + return; + } + var coordinateInv = { + x: this._coordinate.y, + y: this._coordinate.x + }; + return coordinateInv; + }, + setMap: function (map) { + if (!this._map) { + this._map = map; + } + }, + clear: function () { + this._setCursor(); + this._setMarker(); + this._clearResults(); + this._inputLabelContainer.click(); + }, + dragging: function (active) { + if (this._marker) { + if (active) { + this._marker.dragging.enable(); + } else { + this._marker.dragging.disable(); + } + } + }, + _initLayout: function () { + var id = this.options.tag.id; + var container = this._createMainContainerElement(); + var inputs = this._inputsContainer = this._createLocationPointElement(id, this.options.tag.display); + container.appendChild(inputs); + var _inputLabel = this._inputLabelContainer = this._createLocationPointLabelElement(id, this.options.tag.label); + inputs.appendChild(_inputLabel); + var _inputAutoComplete = this._inputAutoCompleteContainer = this._createLocationAutoCompleteteInputElement(id); + inputs.appendChild(_inputAutoComplete); + var _inputCoordinate = this._inputCoordinateContainer = this._createLocationCoordinateInputElement(id); + inputs.appendChild(_inputCoordinate); + var _inputShowPointer = this._inputShowPointerContainer = this._createLocationPointerShowInputElement(id); + inputs.appendChild(_inputShowPointer); + var _inputPointer = this._createLocationPointerInputElement(id); + inputs.appendChild(_inputPointer); + if (this.options.tag.addOption) { + var _inputAddStage = this._createLocationAddPointElement(); + inputs.appendChild(_inputAddStage); + } + if (this.options.tag.removeOption) { + var _inputRemoveStage = this._createLocationRemovePointElement(id); + inputs.appendChild(_inputRemoveStage); + } + var results = this._suggestedContainer = this._createLocationAutoCompleteResultElement(id); + container.appendChild(results); + return container; + }, + _checkRightsManagement: function () { + var _opts = null; + var _res = []; + var _key = null; + _key = this.options.reverseGeocodeOptions.apiKey; + _opts = this.options.reverseGeocodeOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'PositionOfInterest', + 'StreetAddress' + ]; + } + var rightManagementRerverse = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['ReverseGeocode'] + }); + _key = this.options.autocompleteOptions.apiKey; + _opts = this.options.autocompleteOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'PositionOfInterest', + 'StreetAddress' + ]; + } + var rightManagementAutoComplete = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['AutoCompletion'] + }); + if (!rightManagementRerverse && !rightManagementAutoComplete) { + this._noRightManagement = true; + } + if (rightManagementAutoComplete) { + this._resources['AutoCompletion'] = {}; + this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion']; + this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key']; + } + if (rightManagementRerverse) { + this._resources['ReverseGeocode'] = {}; + this._resources['ReverseGeocode']['resources'] = rightManagementRerverse['ReverseGeocode']; + this._resources['ReverseGeocode']['key'] = rightManagementRerverse['key']; + } + }, + _setLabel: function (label) { + this._inputAutoCompleteContainer.value = label || ''; + }, + _setCoordinate: function (oLatLng) { + this._coordinate = { + x: oLatLng.lng, + y: oLatLng.lat + }; + var lat = null; + var lng = null; + if (false) { + lat = PositionFormater.decimalLatToDMS(oLatLng.lat); + lng = PositionFormater.decimalLongToDMS(oLatLng.lng); + } else { + lat = PositionFormater.roundToDecimal(oLatLng.lat, 4); + lng = PositionFormater.roundToDecimal(oLatLng.lng, 4); + } + var value = lng + ' , ' + lat; + this.GPdisplayCoordinate(value); + }, + _setPosition: function (position) { + var map = this._map; + map.panTo(L.latLng(position.y, position.x)); + }, + _setMarker: function (position, information, display) { + if (this._activeDragAndDrop) { + return; + } + var map = this._map; + if (this._marker != null) { + this._marker.off('mousedown', this.onMouseDownMarker, this); + this._marker.off('dragstart', this.onStartDragMarker, this); + this._marker.off('drag', this.onDragMarker, this); + this._marker.off('dragend', this.onEndDragMarker, this); + map.removeLayer(this._marker); + this._marker = null; + } + if (position) { + var options = { + icon: new IconDefault(this.options.tag.color), + draggable: true, + clickable: true, + zIndexOffset: 1000 + }; + this._marker = L.marker(L.latLng(position.y, position.x), options); + this._marker.on('mousedown', this.onMouseDownMarker, this); + this._marker.on('dragstart', this.onStartDragMarker, this); + this._marker.on('drag', this.onDragMarker, this); + this._marker.on('dragend', this.onEndDragMarker, this); + this._marker.addTo(map); + if (display) { + var popupContent = null; + if (typeof information !== 'string') { + if (information.fields.fullText) { + popupContent = information.fields.fullText; + } else { + var values = []; + values.push(information.fields.street || ''); + values.push(information.fields.postalCode || ''); + values.push(information.fields.commune || ''); + if (information.type === 'PositionOfInterest') { + values.push(information.fields.poi || ''); + values.push(information.fields.kind || ''); + } + popupContent = values.join(' - '); + } + } else { + popupContent = information; + } + this._marker.bindPopup(popupContent); + } + } + }, + _setCursor: function (cursor) { + var div = this._map.getContainer(); + if (cursor) { + div.style.cursor = cursor; + } else { + div.style.cursor = null; + } + }, + _clearResults: function () { + this._currentLocation = null; + this._coordinate = null; + this._clearSuggestedLocation(); + }, + _clearSuggestedLocation: function () { + this._suggestedLocations = []; + if (this._suggestedContainer) { + while (this._suggestedContainer.firstChild) { + this._suggestedContainer.removeChild(this._suggestedContainer.firstChild); + } + } + }, + _requestAutoComplete: function (settings) { + if (!settings || Object.keys(settings).length === 0) { + return; + } + if (!settings.text) { + return; + } + if (this._noRightManagement) { + console.log('no rights for all service !?'); + return; + } + if (!this._resources['AutoCompletion']) { + console.log('no rights for this service !?'); + return; + } + var resources = this._resources['AutoCompletion'].resources; + if (!resources || Object.keys(resources).length === 0) { + return; + } + var key = this._resources['AutoCompletion']['key']; + var options = {}; + L.Util.extend(options, this.options.autocompleteOptions); + L.Util.extend(options, settings); + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key }); + Gp.Services.autoComplete(options); + }, + _fillAutoCompletedLocationListContainer: function (locations) { + if (!locations || locations.length === 0) { + return; + } + var element = this._suggestedContainer; + if (element.childElementCount) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + } + for (var i = 0; i < locations.length; i++) { + this._createLocationAutoCompletedLocationElement(this.options.tag.id, locations[i], i); + } + this._suggestedLocations = locations; + }, + _requestReverseGeocode: function (settings) { + if (!settings || Object.keys(settings).length === 0) { + return; + } + if (!settings.position || Object.keys(settings.position).length === 0) { + return; + } + if (this._noRightManagement) { + console.log('no rights for all service !?'); + return; + } + if (!this._resources['ReverseGeocode']) { + console.log('no rights for this service !?'); + return; + } + var resources = this._resources['ReverseGeocode'].resources; + if (!resources || Object.keys(resources).length === 0) { + return; + } + var key = this._resources['ReverseGeocode']['key']; + var options = {}; + L.Util.extend(options, this.options.reverseGeocodeOptions); + L.Util.extend(options, settings); + L.Util.extend(options, { + returnFreeForm: true, + filterOptions: { type: ['StreetAddress'] } + }); + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key }); + Gp.Services.reverseGeocode(options); + }, + _displayResultOfCoordinate: function (oLatLng) { + this._setCoordinate(oLatLng); + this._setMarker({ + x: oLatLng.lng, + y: oLatLng.lat + }, null, false); + this.onActivateMapPointClick(); + }, + _displayResultOfLabel: function (oLocation) { + var places = oLocation.placeAttributes; + var label = places.number + ' ' + places.street + ', ' + places.postalCode + ' ' + places.commune; + this._setCoordinate({ + lat: oLocation.position.x, + lng: oLocation.position.y + }); + this._setLabel(label); + this._setMarker({ + x: oLocation.position.y, + y: oLocation.position.x + }, null, false); + this._inputShowPointerContainer.checked = false; + this._inputAutoCompleteContainer.className = 'GPlocationOriginVisible'; + this._inputCoordinateContainer.className = 'GPlocationOriginHidden'; + this.onActivateMapPointClick(); + }, + onAutoCompleteSearchText: function (e) { + var value = e.target.value; + if (!value) { + return; + } + if (this._noRightManagement) { + console.log('no rights for this service !?'); + return; + } + this._currentLocation = value; + if (value.length < 3) { + return; + } + var context = this; + this._requestAutoComplete({ + text: value, + maximumResponses: 5, + onSuccess: function (results) { + if (results) { + var locations = results.suggestedLocations; + context._fillAutoCompletedLocationListContainer(locations); + } + }, + onFailure: function (error) { + context._clearSuggestedLocation(); + } + }); + }, + onAutoCompletedResultsItemClick: function (e) { + var idx = ID.index(e.target.id); + if (!idx) { + return; + } + var position = { + x: this._suggestedLocations[idx].position.x, + y: this._suggestedLocations[idx].position.y + }; + var info = { + type: this._suggestedLocations[idx].type, + fields: this._suggestedLocations[idx] + }; + var label = this._suggestedLocations[idx].fullText; + this._setLabel(label); + this._setPosition(position); + this._setMarker(position, info, this.options.displayInfo); + this._coordinate = position; + }, + onActivateMapPointClick: function (e) { + var map = this._map; + if (this._inputShowPointerContainer.checked) { + if (!this._activeDragAndDrop) { + map.on('click', this.onMouseMapClick, this); + this._setCursor('crosshair'); + this._setMarker(); + this._clearResults(); + } + } else { + if (!this._activeDragAndDrop) { + map.off('click', this.onMouseMapClick, this); + this._setCursor(); + } + } + }, + onLocationClearPointClick: function (e) { + this._setCursor(); + this._setMarker(); + this._clearResults(); + this._inputAutoCompleteContainer.focus(); + }, + onLocationRemovePointClick: function (e) { + this._setCursor(); + this._setMarker(); + this._clearResults(); + }, + onLocationAddPointClick: function (e) { + }, + onMouseMapClick: function (e) { + var oLatLng = e.latlng; + if (this.options.disableReverse || this._noRightManagement) { + this._displayResultOfCoordinate(oLatLng); + } else { + var self = this; + this._requestReverseGeocode({ + position: { + x: oLatLng.lat, + y: oLatLng.lng + }, + srs: 'EPSG:4326', + onSuccess: function (results) { + if (results.locations.length !== 0) { + var oLocation = results.locations[0]; + self._displayResultOfLabel(oLocation); + } else { + self._displayResultOfCoordinate(oLatLng); + } + }, + onFailure: function (error) { + self._displayResultOfCoordinate(oLatLng); + } + }); + } + }, + onStartDragMarker: function () { + if (!this._marker) { + return; + } + this._activeDragAndDrop = true; + this._inputShowPointerContainer.checked = true; + this._inputAutoCompleteContainer.className = 'GPlocationOriginHidden'; + this._inputCoordinateContainer.className = 'GPlocationOriginVisible'; + this._marker.unbindPopup(); + this._setLabel(); + this._clearResults(); + }, + onDragMarker: function () { + if (!this._marker) { + return; + } + this._activeDragAndDrop = false; + this._inputShowPointerContainer.checked = true; + var oLatLng = this._marker.getLatLng(); + this._setCoordinate(oLatLng); + }, + onEndDragMarker: function () { + if (!this._marker) { + return; + } + this._inputShowPointerContainer.checked = true; + var oLatLng = this._marker.getLatLng(); + if (this._pressedKeyOnDragAndDrop) { + this._setCoordinate(oLatLng); + } else { + this.onMouseMapClick({ latlng: oLatLng }); + } + this._activeDragAndDrop = false; + this._pressedKeyOnDragAndDrop = false; + }, + onMouseDownMarker: function (e) { + if (!this._marker) { + return; + } + this._pressedKeyOnDragAndDrop = e.originalEvent.ctrlKey; + } + }); + return LocationSelector; +}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsLocationSelectorDOM, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault); +CommonControlsIsoDOM = function () { + var IsoDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPisochron'); + container.className = 'GPwidget'; + return container; + }, + _createShowIsoElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowIsochron'); + input.type = 'checkbox'; + return input; + }, + _createShowIsoPictoElement: function () { + var context = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowIsochronPicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowIsochron'); + label.title = 'Calculer une isochrone'; + if (label.addEventListener) { + label.addEventListener('click', function (e) { + context.onShowIsoPanelClick(e); + }); + } else if (label.attachEvent) { + label.attachEvent('onclick', function (e) { + context.onShowIsoPanelClick(e); + }); + } + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowIsochronOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createIsoPanelElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPisochronPanel'); + div.className = 'GPpanel'; + return div; + }, + _createIsoPanelHeaderElement: function () { + var self = this; + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var div = document.createElement('div'); + div.className = 'GPpanelTitle'; + div.innerHTML = 'Calcul d\'isochrone'; + container.appendChild(div); + var divClose = document.createElement('div'); + divClose.id = this._addUID('GPisochronPanelClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer le panneau'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPshowIsochronPicto')).click(); + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPshowIsochronPicto')).click(); + }); + } + container.appendChild(divClose); + return container; + }, + _createIsoPanelFormElement: function () { + var self = this; + var form = document.createElement('form'); + form.id = this._addUID('GPisochronForm'); + form.addEventListener('submit', function (e) { + e.preventDefault(); + self.onIsoComputationSubmit(e); + return false; + }); + return form; + }, + _createIsoWaitingElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPisochronCalcWaitingContainer'); + div.className = 'GPisochronCalcWaitingContainerHidden'; + var p = document.createElement('p'); + p.className = 'GPisochronCalcWaiting'; + p.innerHTML = 'Calcul en cours...'; + div.appendChild(p); + return div; + }, + _createIsoPanelFormTypeChoiceElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPisochronChoice'); + return div; + }, + _createIsoPanelFormTypeChoiceChronElement: function (checked) { + var self = this; + var div = document.createElement('div'); + div.className = 'GPisochronChoiceAlt'; + var input = document.createElement('input'); + input.id = this._addUID('GPisochronChoiceAltChron'); + input.name = 'GPisochronChoiceMode'; + input.type = 'radio'; + input.checked = checked ? true : false; + if (input.addEventListener) { + input.addEventListener('change', function (e) { + document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput'; + document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden'; + self.onIsoTypeChoiceChange(e); + }, false); + } else if (input.attachEvent) { + input.attachEvent('onchange', function () { + document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPflexInput'; + document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPisochronValueHidden'; + self.onIsoTypeChoiceChange(); + }); + } + input.value = 'isochron'; + div.appendChild(input); + var label = document.createElement('label'); + label.className = 'GPisochronChoiceAltImg'; + label.htmlFor = this._addUID('GPisochronChoiceAltChron'); + div.appendChild(label); + var span = document.createElement('span'); + span.id = this._addUID('GPisochronChoiceAltChronTxt'); + span.innerHTML = 'isochrone'; + if (span.addEventListener) { + span.addEventListener('click', function () { + document.getElementById(self._addUID('GPisochronChoiceAltChron')).click(); + }, false); + } else if (span.attachEvent) { + span.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPisochronChoiceAltChron')).click(); + }); + } + div.appendChild(span); + return div; + }, + _createIsoPanelFormTypeChoiceDistElement: function (checked) { + var self = this; + var div = document.createElement('div'); + div.className = 'GPisochronChoiceAlt'; + var input = document.createElement('input'); + input.id = this._addUID('GPisochronChoiceAltDist'); + input.name = 'GPisochronChoiceMode'; + input.type = 'radio'; + input.checked = checked ? true : false; + if (input.addEventListener) { + input.addEventListener('change', function (e) { + document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput'; + document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden'; + self.onIsoTypeChoiceChange(e); + }, false); + } else if (input.attachEvent) { + input.attachEvent('onchange', function () { + document.getElementById(self._addUID('GPisochronValueDist')).className = 'GPflexInput'; + document.getElementById(self._addUID('GPisochronValueChron')).className = 'GPisochronValueHidden'; + self.onIsoTypeChoiceChange(); + }); + } + input.value = 'isodistance'; + div.appendChild(input); + var label = document.createElement('label'); + label.className = 'GPisochronChoiceAltImg'; + label.htmlFor = this._addUID('GPisochronChoiceAltDist'); + div.appendChild(label); + var span = document.createElement('span'); + span.id = this._addUID('GPisochronChoiceAltDistTxt'); + span.innerHTML = 'isodistance'; + if (span.addEventListener) { + span.addEventListener('click', function () { + document.getElementById(self._addUID('GPisochronChoiceAltDist')).click(); + }, false); + } else if (span.attachEvent) { + span.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPisochronChoiceAltDist')).click(); + }); + } + div.appendChild(span); + return div; + }, + _createIsoPanelFormValueIsochronElement: function (checked) { + var context = this; + var div = document.createElement('div'); + div.id = this._addUID('GPisochronValueChron'); + div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden'; + var label = document.createElement('label'); + label.id = this._addUID('GPisochronValueChronLabel'); + label.htmlFor = this._addUID('GPisochronValueChronInput'); + label.innerHTML = 'Temps'; + div.appendChild(label); + var input1 = document.createElement('input'); + input1.id = this._addUID('GPisochronValueChronInput1'); + input1.min = '0'; + input1.step = '1'; + input1.value = '0'; + input1.type = 'number'; + if (input1.addEventListener) { + input1.addEventListener('change', function (e) { + if (typeof context.onIsoValueChronTimeMinuteChange === 'function') { + context.onIsoValueChronTimeHourChange(e); + } + }); + } else if (input1.attachEvent) { + input1.attachEvent('onchange', function (e) { + if (typeof context.onIsoValueChronTimeMinuteChange === 'function') { + context.onIsoValueChronTimeHourChange(e); + } + }); + } + div.appendChild(input1); + var label1 = document.createElement('label'); + label1.innerHTML = 'h'; + div.appendChild(label1); + var input2 = document.createElement('input'); + input2.id = this._addUID('GPisochronValueChronInput2'); + input2.min = '0'; + input2.max = '59'; + input2.step = '1'; + input2.value = '0'; + input2.type = 'number'; + if (input2.addEventListener) { + input2.addEventListener('change', function (e) { + if (typeof context.onIsoValueChronTimeMinuteChange === 'function') { + context.onIsoValueChronTimeMinuteChange(e); + } + }); + } else if (input2.attachEvent) { + input2.attachEvent('onchange', function (e) { + if (typeof context.onIsoValueChronTimeMinuteChange === 'function') { + context.onIsoValueChronTimeMinuteChange(e); + } + }); + } + div.appendChild(input2); + var label2 = document.createElement('label'); + label2.innerHTML = 'min'; + div.appendChild(label2); + return div; + }, + _createIsoPanelFormValueIsodistanceElement: function (checked) { + var context = this; + var div = document.createElement('div'); + div.id = this._addUID('GPisochronValueDist'); + div.className = checked ? 'GPflexInput' : 'GPisochronValueHidden'; + var label = document.createElement('label'); + label.id = this._addUID('GPisochronValueDistLabel'); + label.htmlFor = this._addUID('GPisochronValueDistInput'); + label.innerHTML = 'Distance'; + div.appendChild(label); + var input1 = document.createElement('input'); + input1.id = this._addUID('GPisochronValueDistInput'); + input1.min = '0'; + input1.step = 'any'; + input1.value = '0'; + input1.type = 'number'; + if (input1.addEventListener) { + input1.addEventListener('change', function (e) { + if (typeof context.onIsoValueDistChange === 'function') { + context.onIsoValueDistChange(e); + } + }); + } else if (input1.attachEvent) { + input1.attachEvent('onchange', function (e) { + if (typeof context.onIsoValueDistChange === 'function') { + context.onIsoValueDistChange(e); + } + }); + } + div.appendChild(input1); + var label1 = document.createElement('label'); + label1.innerHTML = 'km'; + div.appendChild(label1); + return div; + }, + _createIsoPanelFormModeChoiceElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPisochronModeChoice'); + return div; + }, + _createIsoPanelFormModeChoiceTransportElement: function (transports) { + var context = this; + var div = document.createElement('div'); + div.id = this._addUID('GPisochronTransportChoice'); + var span = document.createElement('span'); + span.className = 'GPisochronModeLabel'; + span.innerHTML = 'Mode de transport'; + div.appendChild(span); + for (var i = 0; i < transports.length; i++) { + var transport = transports[i]; + if (transport === 'Voiture') { + var inputCar = document.createElement('input'); + inputCar.id = this._addUID('GPisochronTransportCar'); + inputCar.type = 'radio'; + inputCar.name = 'GPisochronTransport'; + if (i === 0) { + inputCar.checked = true; + } + if (inputCar.addEventListener) { + inputCar.addEventListener('change', function (e) { + context.onIsoModeTransportChange(e); + }); + } else if (inputCar.attachEvent) { + inputCar.attachEvent('onchange', function (e) { + context.onIsoModeTransportChange(e); + }); + } + inputCar.value = 'Voiture'; + div.appendChild(inputCar); + var labelCar = document.createElement('label'); + labelCar.className = 'GPisochronTransportImg'; + labelCar.htmlFor = this._addUID('GPisochronTransportCar'); + labelCar.title = 'Voiture'; + div.appendChild(labelCar); + } + if (transport === 'Pieton') { + var inputPedestrian = document.createElement('input'); + inputPedestrian.id = this._addUID('GPisochronTransportPedestrian'); + inputPedestrian.type = 'radio'; + inputPedestrian.name = 'GPisochronTransport'; + if (i === 0) { + inputPedestrian.checked = true; + } + if (inputPedestrian.addEventListener) { + inputPedestrian.addEventListener('change', function (e) { + context.onIsoModeTransportChange(e); + }); + } else if (inputPedestrian.attachEvent) { + inputPedestrian.attachEvent('onchange', function (e) { + context.onIsoModeTransportChange(e); + }); + } + inputPedestrian.value = 'Pieton'; + div.appendChild(inputPedestrian); + var labelPedestrian = document.createElement('label'); + labelPedestrian.className = 'GPisochronTransportImg'; + labelPedestrian.htmlFor = this._addUID('GPisochronTransportPedestrian'); + labelPedestrian.title = 'Piéton'; + div.appendChild(labelPedestrian); + } + } + return div; + }, + _createIsoPanelFormModeChoiceDirectionElement: function (directions) { + var self = this; + var div = document.createElement('div'); + div.id = this._addUID('GPisochronDirectionChoice'); + var span = document.createElement('span'); + span.className = 'GPisochronModeLabel'; + span.innerHTML = 'Sens de parcours'; + div.appendChild(span); + var select = document.createElement('select'); + select.id = this._addUID('GPisochronDirectionSelect'); + select.className = 'GPinputSelect'; + select.addEventListener('change', function (e) { + self.onIsoModeDirectionChange(e); + }); + for (var i = 0; i < directions.length; i++) { + var direction = directions[i]; + if (direction.toLowerCase() === 'departure') { + var departureOption = document.createElement('option'); + if (i === 0) { + departureOption.selected = 'selected'; + } + departureOption.value = 'departure'; + departureOption.text = 'Départ'; + select.appendChild(departureOption); + } + if (direction.toLowerCase() === 'arrival') { + var arrivalOption = document.createElement('option'); + if (i === 0) { + arrivalOption.selected = 'selected'; + } + arrivalOption.value = 'arrival'; + arrivalOption.text = 'Arrivée'; + select.appendChild(arrivalOption); + } + } + div.appendChild(select); + return div; + }, + _createShowIsoExclusionsElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowIsoExclusions'); + input.type = 'checkbox'; + return input; + }, + _createShowIsoExclusionsPictoElement: function () { + var label = document.createElement('label'); + label.id = this._addUID('GPshowIsoExclusionsPicto'); + label.className = 'GPshowMoreOptions GPshowIsoExclusionsPicto'; + label.htmlFor = this._addUID('GPshowIsoExclusions'); + label.title = 'Exclusions'; + label.style.top = '240px'; + return label; + }, + _createIsoPanelFormExclusionsElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPisoExclusions'); + var span = document.createElement('span'); + span.className = 'GPisoExclusionsLabel'; + span.innerHTML = 'Passages autorisés'; + div.appendChild(span); + return div; + }, + _createIsoPanelFormExclusionOptionsElement: function (exclusions) { + var context = this; + var div = document.createElement('div'); + div.className = 'GPisoExclusionsOptions'; + for (var value in exclusions) { + if (exclusions.hasOwnProperty(value)) { + var status = exclusions[value]; + switch (value) { + case 'toll': + var inputToll = document.createElement('input'); + inputToll.id = this._addUID('GPisoExclusionsToll'); + inputToll.type = 'checkbox'; + inputToll.checked = !status; + if (inputToll.addEventListener) { + inputToll.addEventListener('change', function (e) { + context.onIsoExclusionsChange(e); + }); + } else if (inputToll.attachEvent) { + inputToll.attachEvent('onchange', function (e) { + context.onIsoExclusionsChange(e); + }); + } + inputToll.value = 'Toll'; + div.appendChild(inputToll); + var labelToll = document.createElement('label'); + labelToll.className = 'GPisoExclusionsOption'; + labelToll.htmlFor = this._addUID('GPisoExclusionsToll'); + labelToll.innerHTML = 'Péages'; + div.appendChild(labelToll); + break; + case 'tunnel': + var inputTunnel = document.createElement('input'); + inputTunnel.id = this._addUID('GPisoExclusionsTunnel'); + inputTunnel.type = 'checkbox'; + inputTunnel.checked = !status; + if (inputTunnel.addEventListener) { + inputTunnel.addEventListener('change', function (e) { + context.onIsoExclusionsChange(e); + }); + } else if (inputTunnel.attachEvent) { + inputTunnel.attachEvent('onchange', function (e) { + context.onIsoExclusionsChange(e); + }); + } + inputTunnel.value = 'Tunnel'; + div.appendChild(inputTunnel); + var labelTunnel = document.createElement('label'); + labelTunnel.className = 'GPisoExclusionsOption'; + labelTunnel.htmlFor = this._addUID('GPisoExclusionsTunnel'); + labelTunnel.innerHTML = 'Tunnels'; + div.appendChild(labelTunnel); + break; + case 'bridge': + var inputBridge = document.createElement('input'); + inputBridge.id = this._addUID('GPisoExclusionsBridge'); + inputBridge.type = 'checkbox'; + inputBridge.checked = !status; + if (inputBridge.addEventListener) { + inputBridge.addEventListener('change', function (e) { + context.onIsoExclusionsChange(e); + }); + } else if (inputBridge.attachEvent) { + inputBridge.attachEvent('onchange', function (e) { + context.onIsoExclusionsChange(e); + }); + } + inputBridge.value = 'Bridge'; + div.appendChild(inputBridge); + var labelBridge = document.createElement('label'); + labelBridge.className = 'GPisoExclusionsOption'; + labelBridge.htmlFor = this._addUID('GPisoExclusionsBridge'); + labelBridge.innerHTML = 'Ponts'; + div.appendChild(labelBridge); + break; + } + } + } + return div; + }, + _createIsoSubmitFormElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPisochronSubmit'); + input.className = 'GPinputSubmit'; + input.type = 'submit'; + input.value = 'Calculer'; + return input; + }, + _createIsoFormResetElement: function () { + var self = this; + var divReset = document.createElement('div'); + divReset.id = this._addUID('GPisochronReset'); + divReset.title = 'Réinitialiser les paramètres'; + divReset.addEventListener('click', function (e) { + self.onIsoResetClick(e); + }); + return divReset; + } + }; + return IsoDOM; +}(); +LeafletControlsIsocurve = function (L, woodman, Gp, RightManagement, ID, LocationSelector, IsoDOM) { + var Isocurve = L.Control.extend({ + includes: IsoDOM, + options: { + position: 'topleft', + collapsed: true, + methods: [ + 'time', + 'distance' + ], + graphs: [ + 'Voiture', + 'Pieton' + ], + exclusions: { + toll: false, + tunnel: false, + bridge: false + }, + directions: [ + 'departure', + 'arrival' + ], + disableReverse: false, + isocurveOptions: {}, + autocompleteOptions: {} + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._uid = ID.generate(); + this._isDesktop = this._detectSupport(); + this._waitingContainer = null; + this._showContainer = null; + this._formContainer = null; + this._submitContainer = null; + this._currentTransport = null; + this._currentDirection = null; + this._currentComputation = null; + this._currentTimeHour = 0; + this._currentTimeMinute = 0; + this._currentDistance = 0; + this._currentExclusions = []; + this._initTransport(); + this._initComputation(); + this._initDirection(); + this._initExclusions(); + this._currentPoint = null; + this._geojsonIso = null; + this._waiting = false; + this._timer = null; + this._currentIsoResults = null; + this._resources = {}; + this._noRightManagement = false; + this._checkRightsManagement(); + }, + onAdd: function (map) { + var container = this._container = this._initLayout(map); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + return container; + }, + onRemove: function () { + }, + _initTransport: function () { + this._currentTransport = 'Voiture'; + var transport = this.options.graphs; + if (!transport || transport.length === 0) { + this.options.graphs = [ + 'Voiture', + 'Pieton' + ]; + } + if (L.Util.isArray(transport) && transport.length) { + if (transport[0] === 'Voiture' || transport[0] === 'Pieton') { + this._currentTransport = transport[0]; + } + } + var serviceOptions = this.options.isocurveOptions; + if (serviceOptions.graph) { + this._currentTransport = serviceOptions.graph; + } + }, + _initDirection: function () { + this._currentDirection = 'departure'; + var directions = this.options.directions; + if (!directions || directions.length === 0) { + this.options.directions = [ + 'departure', + 'arrival' + ]; + } + if (L.Util.isArray(directions) && directions.length) { + if (directions[0] === 'departure' || directions[0] === 'arrival') { + this._currentDirection = directions[0]; + } + } + var serviceOptions = this.options.isocurveOptions; + if (!serviceOptions.reverse) { + this._currentDirection = 'departure'; + } + if (serviceOptions.reverse === true) { + this._currentDirection = 'arrival'; + this.options.directions = [ + 'arrival', + 'departure' + ]; + } + }, + _initComputation: function () { + this._currentComputation = 'time'; + var methods = this.options.methods; + if (!methods || methods.length === 0) { + this.options.methods = [ + 'time', + 'distance' + ]; + } + if (L.Util.isArray(methods) && methods.length) { + if (methods[0] === 'time' || methods[0] === 'distance') { + this._currentComputation = methods[0]; + } + } + var serviceOptions = this.options.isocurveOptions; + if (serviceOptions.method) { + this._currentComputation = serviceOptions.method; + } + if (serviceOptions.time) { + this._currentComputation = 'time'; + } + if (serviceOptions.distance) { + this._currentComputation = 'distance'; + } + }, + _initExclusions: function () { + this._currentExclusions = []; + var exclusion = this.options.exclusions; + if (!exclusion || typeof exclusion === 'object' && Object.keys(exclusion).length === 0) { + this.options.exclusions = { + toll: false, + tunnel: false, + bridge: false + }; + } + if (exclusion && typeof exclusion === 'object' && Object.keys(exclusion).length) { + for (var k in exclusion) { + if (exclusion.hasOwnProperty(k)) { + if (exclusion.k) { + this._currentExclusions.push(k); + } + } + } + } + var serviceOptions = this.options.isocurveOptions; + if (Array.isArray(serviceOptions.exclusions)) { + this._currentExclusions = serviceOptions.exclusions; + } + }, + _checkRightsManagement: function () { + var _opts = null; + var _res = []; + var _key = null; + _key = this.options.isocurveOptions.apiKey; + _opts = this.options.isocurveOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'Voiture', + 'Pieton' + ]; + } + var rightManagementIsochrone = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['Isochrone'] + }); + _key = this.options.autocompleteOptions.apiKey; + _opts = this.options.autocompleteOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'PositionOfInterest', + 'StreetAddress' + ]; + } + var rightManagementAutoComplete = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['AutoCompletion'] + }); + if (!rightManagementIsochrone && !rightManagementAutoComplete) { + this._noRightManagement = true; + } + if (rightManagementAutoComplete) { + this._resources['AutoCompletion'] = {}; + this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion']; + this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key']; + } + if (rightManagementIsochrone) { + this._resources['Isochrone'] = {}; + this._resources['Isochrone']['resources'] = rightManagementIsochrone['Isochrone']; + this._resources['Isochrone']['key'] = rightManagementIsochrone['key']; + } + }, + _detectSupport: function () { + var isDesktop = true; + var userAgent = window.navigator.userAgent.toLowerCase(); + 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) { + isDesktop = false; + } + if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) { + isDesktop = true; + } + return isDesktop; + }, + _initLayout: function (map) { + var container = this._createMainContainerElement(); + var inputShow = this._showContainer = this._createShowIsoElement(); + container.appendChild(inputShow); + if (!this.options.collapsed) { + inputShow.checked = true; + } + var picto = this._createShowIsoPictoElement(); + container.appendChild(picto); + var panel = this._createIsoPanelElement(); + var header = this._createIsoPanelHeaderElement(); + panel.appendChild(header); + var form = this._formContainer = this._createIsoPanelFormElement(); + var point = this._createIsoPanelFormPointElement(map); + form.appendChild(point); + var isoChronChecked = false; + var isoDistChecked = false; + var typeChoice = this._createIsoPanelFormTypeChoiceElement(); + for (var i = 0; i < this.options.methods.length; i++) { + if (this.options.methods[i] === 'time') { + isoChronChecked = i === 0 ? true : false; + typeChoice.appendChild(this._createIsoPanelFormTypeChoiceChronElement(isoChronChecked)); + } + if (this.options.methods[i] === 'distance') { + isoDistChecked = i === 0 ? true : false; + typeChoice.appendChild(this._createIsoPanelFormTypeChoiceDistElement(isoDistChecked)); + } + } + form.appendChild(typeChoice); + form.appendChild(this._createIsoPanelFormValueIsochronElement(isoChronChecked)); + form.appendChild(this._createIsoPanelFormValueIsodistanceElement(isoDistChecked)); + var modeChoice = this._createIsoPanelFormModeChoiceElement(); + modeChoice.appendChild(this._createIsoPanelFormModeChoiceTransportElement(this.options.graphs)); + modeChoice.appendChild(this._createIsoPanelFormModeChoiceDirectionElement(this.options.directions)); + form.appendChild(modeChoice); + if (this.options.exclusions && typeof this.options.exclusions === 'object' && Object.keys(this.options.exclusions).length !== 0) { + form.appendChild(this._createShowIsoExclusionsElement()); + form.appendChild(this._createShowIsoExclusionsPictoElement()); + var exclusion = this._createIsoPanelFormExclusionsElement(); + exclusion.appendChild(this._createIsoPanelFormExclusionOptionsElement(this.options.exclusions)); + form.appendChild(exclusion); + } + var divReset = this._createIsoFormResetElement(); + form.appendChild(divReset); + var submit = this._submitContainer = this._createIsoSubmitFormElement(); + form.appendChild(submit); + panel.appendChild(form); + var waiting = this._waitingContainer = this._createIsoWaitingElement(); + panel.appendChild(waiting); + container.appendChild(panel); + return container; + }, + _createIsoPanelFormPointElement: function (map) { + this._currentPoint = new LocationSelector({ + apiKey: this.options.apiKey || null, + tag: { + id: 0, + unique: this._uid, + label: 'Départ', + color: 'red', + display: true + }, + displayInfo: true, + disableReverse: this.options.disableReverse, + autocompleteOptions: this.options.autocompleteOptions || null + }); + this._currentPoint.setMap(map); + return this._currentPoint.getContainer(); + }, + onShowIsoPanelClick: function (e) { + }, + onIsoResetClick: function (e) { + this._clear(); + }, + onIsoTypeChoiceChange: function (e) { + var value = e.target.value; + if (!value) { + return; + } + if (value === 'isodistance') { + this._currentComputation = 'distance'; + } + if (value === 'isochron') { + this._currentComputation = 'time'; + } + }, + onIsoModeTransportChange: function (e) { + var value = e.target.value; + if (!value) { + return; + } + this._currentTransport = value; + }, + onIsoModeDirectionChange: function (e) { + var value = e.target.value; + if (!value) { + return; + } + this._currentDirection = value; + }, + onIsoValueChronTimeHourChange: function (e) { + var value = e.target.value; + this._timeHourContainer = e.target; + if (!value) { + return; + } + this._currentTimeHour = value; + }, + onIsoValueChronTimeMinuteChange: function (e) { + var value = e.target.value; + this._timeMinuteContainer = e.target; + if (!value) { + return; + } + this._currentTimeMinute = value; + }, + onIsoValueDistChange: function (e) { + var value = e.target.value; + this._distanceContainer = e.target; + if (!value) { + return; + } + this._currentDistance = value; + }, + onIsoExclusionsChange: function (e) { + var value = e.target.value; + var checked = e.target.checked; + if (!value) { + return; + } + var bFound = false; + var iFound = null; + for (var i = 0; i < this._currentExclusions.length; i++) { + if (this._currentExclusions[i] === value) { + iFound = i; + bFound = true; + } + } + if (!bFound && !checked) { + this._currentExclusions.push(value); + } + if (bFound && checked) { + this._currentExclusions.splice(iFound, 1); + } + }, + onIsoComputationSubmit: function () { + if (!this._currentPoint || !this._currentPoint.getCoordinate || !this._currentPoint.getCoordinate()) { + return; + } + var time; + if (this._currentComputation.toLowerCase() === 'time') { + time = this._currentTimeHour * 3600 + this._currentTimeMinute * 60; + } + var distance; + if (this._currentComputation.toLowerCase() === 'distance') { + distance = this._currentDistance * 1000; + } + if (!time && !distance) { + return; + } + if (this._noRightManagement) { + return; + } + this._displayWaitingContainer(); + var self = this; + this._requestIsoCurve({ + position: self._currentPoint.getCoordinate(), + graph: self._currentTransport, + exclusions: self._currentExclusions, + method: self._currentComputation, + reverse: self._currentDirection.toLowerCase() === 'arrival' ? true : false, + time: time, + distance: distance, + smoothing: true, + timeout: 7000, + protocol: 'XHR', + onSuccess: function (results) { + if (results) { + self._drawIsoResults(results); + } + }, + onFailure: function (error) { + self._hideWaitingContainer(); + self._clearIsoResultsGeometry(); + } + }); + }, + _requestIsoCurve: function (settings) { + if (!settings || typeof settings === 'object' && Object.keys(settings).length === 0) { + return; + } + if (!settings.position) { + return; + } + if (this._noRightManagement) { + return; + } + var services = this._resources['Isochrone']; + if (!services) { + return; + } + var resources = services.resources; + if (!resources || typeof resources === 'object' && Object.keys(resources).length === 0) { + return; + } + var options = {}; + L.Util.extend(options, settings); + L.Util.extend(options, this.options.isocurveOptions); + var bFound = false; + for (var i = 0; i < resources.length; i++) { + if (resources[i] === options.graph) { + bFound = true; + } + } + if (!bFound) { + console.log('no rights for this service !?'); + return; + } + var key = this._resources['Isochrone']['key']; + options.apiKey = this.options.isocurveOptions.apiKey || this.options.apiKey || key; + Gp.Services.isoCurve(options); + }, + _drawIsoResults: function (results) { + this._clearIsoResultsGeometry(); + this._currentIsoResults = results; + if (!results.geometry) { + this._hideWaitingContainer(); + return; + } + var map = this._map; + var _geometry = results.geometry; + var _style = { + color: '#ff7800', + weight: 5, + opacity: 0.65 + }; + this._geojsonIso = L.geoJson(_geometry, { style: _style }).addTo(map); + this._hideWaitingContainer(); + this._formContainer.className = 'GPisochroComponentHidden'; + }, + _clear: function () { + this._initTransport(); + this._initExclusions(); + this._initComputation(); + this._initDirection(); + this._currentIsoResults = null; + this._clearIsoResultsGeometry(); + this._currentPoint.clear(); + if (this._timeHourContainer) { + this._timeHourContainer.value = 0; + } + if (this._timeMinuteContainer) { + this._timeMinuteContainer.value = 0; + } + if (this._distanceContainer) { + this._distanceContainer.value = 0; + } + }, + _clearIsoResultsGeometry: function () { + var map = this._map; + if (this._geojsonIso != null) { + map.removeLayer(this._geojsonIso); + this._geojsonIso = null; + } + }, + _displayWaitingContainer: function () { + this._waitingContainer.className = 'GPisochronCalcWaitingContainerVisible'; + this._waiting = true; + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + var context = this; + this._timer = setTimeout(function () { + if (context._waiting === true) { + context._hideWaitingContainer(); + } else { + if (context._timer) { + clearTimeout(context._timer); + } + } + }, 16000); + }, + _hideWaitingContainer: function () { + if (this._waiting) { + this._waitingContainer.className = 'GPisochronCalcWaitingContainerHidden'; + this._waiting = false; + clearTimeout(this._timer); + this._timer = null; + } + } + }); + return Isocurve; +}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsIsoDOM); +CommonControlsMousePositionDOM = function () { + var MousePositionDOM = { + _addUID: function (id) { + var uid = this._uid ? id + '-' + this._uid : id; + return uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPmousePosition'); + container.className = 'GPwidget'; + return container; + }, + _createShowMousePositionElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowMousePosition'); + input.type = 'checkbox'; + return input; + }, + _createShowMousePositionPictoElement: function (isDesktop) { + var self = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowMousePositionPicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowMousePosition'); + label.title = 'Afficher les coordonnées du curseur'; + label.addEventListener('click', function (e) { + var mapCenterClass = ''; + if (!document.getElementById(self._addUID('GPshowMousePosition')).checked && !isDesktop) { + mapCenterClass = 'GPmapCenterVisible'; + } + document.getElementById('GPmapCenter').className = mapCenterClass; + self.onShowMousePositionClick(e); + }); + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowMousePositionOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createMousePositionPanelElement: function (displayAltitude, displayCoordinates) { + displayAltitude = displayAltitude ? true : typeof displayAltitude === 'undefined' ? true : false; + displayCoordinates = displayCoordinates ? true : typeof displayCoordinates === 'undefined' ? true : false; + var div = document.createElement('div'); + div.id = this._addUID('GPmousePositionPanel'); + div.className = 'GPpanel'; + div.appendChild(this._createMousePositionPanelHeaderElement()); + div.appendChild(this._createMousePositionPanelBasicElement(displayAltitude, displayCoordinates)); + var arraySettings = this._createShowMousePositionSettingsElement(displayCoordinates); + for (var j = 0; j < arraySettings.length; j++) { + div.appendChild(arraySettings[j]); + } + return div; + }, + _createMapCenter: function () { + var div = document.createElement('div'); + div.id = 'GPmapCenter'; + div.className = ''; + return div; + }, + _createMousePositionPanelHeaderElement: function () { + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var divTitle = document.createElement('div'); + divTitle.className = 'GPpanelTitle'; + divTitle.innerHTML = 'Coordonnées'; + container.appendChild(divTitle); + var divClose = document.createElement('div'); + divClose.id = 'GPmousePositionPanelClose'; + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer le panneau'; + var self = this; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPshowMousePositionPicto')).click(); + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPshowMousePositionPicto')).click(); + }); + } + container.appendChild(divClose); + return container; + }, + _createMousePositionPanelBasicElement: function (displayAltitude, displayCoordinates) { + var container = document.createElement('div'); + container.id = this._addUID('GPmousePositionBasicPanel'); + container.appendChild(this._createMousePositionPanelBasicCoordinateElement(displayCoordinates)); + container.appendChild(this._createMousePositionPanelBasicAltitudeElement(displayAltitude)); + return container; + }, + _createMousePositionPanelBasicCoordinateElement: function (display) { + var div = document.createElement('div'); + div.id = this._addUID('GPmousePositionCoordinate'); + div.style.display = display ? 'block' : 'none'; + var spanLat = document.createElement('span'); + spanLat.className = 'GPmousePositionLabel'; + spanLat.id = this._addUID('GPmousePositionLatLabel'); + spanLat.innerHTML = 'Latitude : '; + div.appendChild(spanLat); + var spanCLat = document.createElement('span'); + spanCLat.className = 'GPmousePositionCoords'; + spanCLat.id = this._addUID('GPmousePositionLat'); + spanCLat.innerHTML = ''; + div.appendChild(spanCLat); + var spanLon = document.createElement('span'); + spanLon.className = 'GPmousePositionLabel'; + spanLon.id = this._addUID('GPmousePositionLonLabel'); + spanLon.innerHTML = 'Longitude : '; + div.appendChild(spanLon); + var spanCLon = document.createElement('span'); + spanCLon.className = 'GPmousePositionCoords'; + spanCLon.id = this._addUID('GPmousePositionLon'); + spanCLon.innerHTML = ''; + div.appendChild(spanCLon); + return div; + }, + _createMousePositionPanelBasicAltitudeElement: function (display) { + var div = document.createElement('div'); + div.id = this._addUID('GPmousePositionAltitude'); + div.style.display = display ? 'block' : 'none'; + var spanLabel = document.createElement('span'); + spanLabel.className = 'GPmousePositionLabel'; + spanLabel.innerHTML = 'Altitude : '; + div.appendChild(spanLabel); + var spanAlt = document.createElement('span'); + spanAlt.className = 'GPmousePositionCoords'; + spanAlt.id = this._addUID('GPmousePositionAlt'); + spanAlt.innerHTML = ''; + div.appendChild(spanAlt); + return div; + }, + _createShowMousePositionSettingsElement: function (display) { + var list = []; + var input = document.createElement('input'); + input.type = 'checkbox'; + input.id = this._addUID('GPshowMousePositionSettings'); + var label = document.createElement('label'); + label.id = this._addUID('GPshowMousePositionSettingsPicto'); + label.htmlFor = this._addUID('GPshowMousePositionSettings'); + label.title = 'Réglages'; + label.className = 'GPshowMoreOptions GPshowMousePositionSettingsPicto'; + label.style.display = display ? 'block' : 'none'; + list.push(input); + list.push(label); + return list; + }, + _createMousePositionSettingsElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPmousePositionSettings'); + var span = document.createElement('span'); + span.className = 'GPmousePositionSettingsLabel'; + span.innerHTML = 'Système de référence'; + container.appendChild(span); + return container; + }, + _createMousePositionSettingsSystemsElement: function (systems) { + var context = this; + var selectSystem = document.createElement('select'); + selectSystem.id = this._addUID('GPmousePositionProjectionSystem'); + selectSystem.className = 'GPinputSelect GPmousePositionSettingsSelect'; + selectSystem.addEventListener('change', function (e) { + context.onMousePositionProjectionSystemChange(e); + }); + selectSystem.addEventListener('mouseover', function (e) { + context.onMousePositionProjectionSystemMouseOver(e); + }); + for (var i = 0; i < systems.length; i++) { + var obj = systems[i]; + var option = document.createElement('option'); + option.value = obj.code; + option.text = obj.label || i; + selectSystem.appendChild(option); + } + return selectSystem; + }, + _createMousePositionSettingsUnitsElement: function (units) { + var context = this; + var selectUnits = document.createElement('select'); + selectUnits.id = this._addUID('GPmousePositionProjectionUnits'); + selectUnits.className = 'GPinputSelect GPmousePositionSettingsSelect'; + selectUnits.addEventListener('change', function (e) { + context.onMousePositionProjectionUnitsChange(e); + }); + for (var j = 0; j < units.length; j++) { + var obj = units[j]; + var option = document.createElement('option'); + option.value = obj.code ? obj.code : j; + option.text = obj.label || j; + selectUnits.appendChild(option); + } + return selectUnits; + }, + GPdisplayCoords: function (coordinate) { + if (coordinate && coordinate != null) { + var labelLon = document.getElementById(this._addUID('GPmousePositionLonLabel')); + var labelLat = document.getElementById(this._addUID('GPmousePositionLatLabel')); + if (coordinate.x || coordinate.y) { + labelLat.innerHTML = 'X : '; + labelLon.innerHTML = 'Y : '; + } else if (coordinate.e || coordinate.n) { + labelLat.innerHTML = 'E : '; + labelLon.innerHTML = 'N : '; + } else { + labelLat.innerHTML = 'Latitude : '; + labelLon.innerHTML = 'Longitude : '; + } + var elLat = document.getElementById(this._addUID('GPmousePositionLat')); + var elLon = document.getElementById(this._addUID('GPmousePositionLon')); + elLat.innerHTML = coordinate.x || coordinate.lat || coordinate.e || '0'; + if (coordinate.unit) { + elLat.innerHTML += ' '; + elLat.innerHTML += coordinate.unit; + } + elLon.innerHTML = coordinate.y || coordinate.lng || coordinate.lon || coordinate.n || '0'; + if (coordinate.unit) { + elLon.innerHTML += ' '; + elLon.innerHTML += coordinate.unit; + } + } + }, + GPdisplayElevation: function (coordinate, altitudeTimeoutDelay, noDataValue, noDataValueTolerance) { + var self = this; + var altitudeTimeout; + if (!altitudeTimeoutDelay) { + altitudeTimeoutDelay = 500; + } + clearTimeout(altitudeTimeout); + document.getElementById(this._addUID('GPmousePositionAlt')).innerHTML = '...'; + if (noDataValue == null) { + noDataValue = -99999; + } + if (noDataValueTolerance == null) { + noDataValueTolerance = 99980; + } + var maxThreshold = noDataValue + noDataValueTolerance; + var minThreshold = noDataValue - noDataValueTolerance; + if (coordinate && coordinate != null) { + if (document.getElementById(this._addUID('GPmousePositionAltitude'))) { + altitudeTimeout = setTimeout(function () { + self.onRequestAltitude(coordinate, function (z) { + if (minThreshold < z && z < maxThreshold) { + document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = '--- m'; + } else { + document.getElementById(self._addUID('GPmousePositionAlt')).innerHTML = z + ' m'; + } + }); + }, altitudeTimeoutDelay); + } + } + } + }; + return MousePositionDOM; +}(); +!function (e) { + if ('object' == typeof exports) + module.exports = e(); + else if (true) + proj4 = function () { + return typeof e === 'function' ? e() : e; + }(); + else { + var f; + 'undefined' != typeof window ? f = window : 'undefined' != typeof global ? f = global : 'undefined' != typeof self && (f = self), f.proj4 = e(); + } +}(function () { + var define, module, exports; + return function e(t, n, r) { + function s(o, u) { + if (!n[o]) { + if (!t[o]) { + var a = typeof require == 'function' && require; + if (!u && a) + return a(o, !0); + if (i) + return i(o, !0); + throw new Error('Cannot find module \'' + o + '\''); + } + var f = n[o] = { exports: {} }; + t[o][0].call(f.exports, function (e) { + var n = t[o][1][e]; + return s(n ? n : e); + }, f, f.exports, e, t, n, r); + } + return n[o].exports; + } + var i = typeof require == 'function' && require; + for (var o = 0; o < r.length; o++) + s(r[o]); + return s; + }({ + 1: [ + function (_dereq_, module, exports) { + var mgrs = _dereq_('mgrs'); + function Point(x, y, z) { + if (!(this instanceof Point)) { + return new Point(x, y, z); + } + if (Array.isArray(x)) { + this.x = x[0]; + this.y = x[1]; + this.z = x[2] || 0; + } else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z || 0; + } else if (typeof x === 'string' && typeof y === 'undefined') { + var coords = x.split(','); + this.x = parseFloat(coords[0], 10); + this.y = parseFloat(coords[1], 10); + this.z = parseFloat(coords[2], 10) || 0; + } else { + this.x = x; + this.y = y; + this.z = z || 0; + } + console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); + } + Point.fromMGRS = function (mgrsStr) { + return new Point(mgrs.toPoint(mgrsStr)); + }; + Point.prototype.toMGRS = function (accuracy) { + return mgrs.forward([ + this.x, + this.y + ], accuracy); + }; + module.exports = Point; + return exports; + }, + { 'mgrs': 66 } + ], + 2: [ + function (_dereq_, module, exports) { + var parseCode = _dereq_('./parseCode'); + var extend = _dereq_('./extend'); + var projections = _dereq_('./projections'); + var deriveConstants = _dereq_('./deriveConstants'); + function Projection(srsCode, callback) { + if (!(this instanceof Projection)) { + return new Projection(srsCode); + } + callback = callback || function (error) { + if (error) { + throw error; + } + }; + var json = parseCode(srsCode); + if (typeof json !== 'object') { + callback(srsCode); + return; + } + var modifiedJSON = deriveConstants(json); + var ourProj = Projection.projections.get(modifiedJSON.projName); + if (ourProj) { + extend(this, modifiedJSON); + extend(this, ourProj); + this.init(); + callback(null, this); + } else { + callback(srsCode); + } + } + Projection.projections = projections; + Projection.projections.start(); + module.exports = Projection; + return exports; + }, + { + './deriveConstants': 32, + './extend': 33, + './parseCode': 36, + './projections': 38 + } + ], + 3: [ + function (_dereq_, module, exports) { + module.exports = function (crs, denorm, point) { + var xin = point.x, yin = point.y, zin = point.z || 0; + var v, t, i; + for (i = 0; i < 3; i++) { + if (denorm && i === 2 && point.z === undefined) { + continue; + } + if (i === 0) { + v = xin; + t = 'x'; + } else if (i === 1) { + v = yin; + t = 'y'; + } else { + v = zin; + t = 'z'; + } + switch (crs.axis[i]) { + case 'e': + point[t] = v; + break; + case 'w': + point[t] = -v; + break; + case 'n': + point[t] = v; + break; + case 's': + point[t] = -v; + break; + case 'u': + if (point[t] !== undefined) { + point.z = v; + } + break; + case 'd': + if (point[t] !== undefined) { + point.z = -v; + } + break; + default: + return null; + } + } + return point; + }; + return exports; + }, + {} + ], + 4: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + var sign = _dereq_('./sign'); + module.exports = function (x) { + return Math.abs(x) < HALF_PI ? x : x - sign(x) * Math.PI; + }; + return exports; + }, + { './sign': 21 } + ], + 5: [ + function (_dereq_, module, exports) { + var TWO_PI = Math.PI * 2; + var sign = _dereq_('./sign'); + module.exports = function (x) { + return Math.abs(x) < Math.PI ? x : x - sign(x) * TWO_PI; + }; + return exports; + }, + { './sign': 21 } + ], + 6: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + if (Math.abs(x) > 1) { + x = x > 1 ? 1 : -1; + } + return Math.asin(x); + }; + return exports; + }, + {} + ], + 7: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + return 1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)); + }; + return exports; + }, + {} + ], + 8: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + return 0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)); + }; + return exports; + }, + {} + ], + 9: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + return 0.05859375 * x * x * (1 + 0.75 * x); + }; + return exports; + }, + {} + ], + 10: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + return x * x * x * (35 / 3072); + }; + return exports; + }, + {} + ], + 11: [ + function (_dereq_, module, exports) { + module.exports = function (a, e, sinphi) { + var temp = e * sinphi; + return a / Math.sqrt(1 - temp * temp); + }; + return exports; + }, + {} + ], + 12: [ + function (_dereq_, module, exports) { + module.exports = function (ml, e0, e1, e2, e3) { + var phi; + var dphi; + phi = ml / e0; + for (var i = 0; i < 15; i++) { + dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); + phi += dphi; + if (Math.abs(dphi) <= 1e-10) { + return phi; + } + } + return NaN; + }; + return exports; + }, + {} + ], + 13: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + module.exports = function (eccent, q) { + var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); + if (Math.abs(Math.abs(q) - temp) < 0.000001) { + if (q < 0) { + return -1 * HALF_PI; + } else { + return HALF_PI; + } + } + var phi = Math.asin(0.5 * q); + var dphi; + var sin_phi; + var cos_phi; + var con; + for (var i = 0; i < 30; i++) { + sin_phi = Math.sin(phi); + cos_phi = Math.cos(phi); + con = eccent * sin_phi; + dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi += dphi; + if (Math.abs(dphi) <= 1e-10) { + return phi; + } + } + return NaN; + }; + return exports; + }, + {} + ], + 14: [ + function (_dereq_, module, exports) { + module.exports = function (e0, e1, e2, e3, phi) { + return e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi); + }; + return exports; + }, + {} + ], + 15: [ + function (_dereq_, module, exports) { + module.exports = function (eccent, sinphi, cosphi) { + var con = eccent * sinphi; + return cosphi / Math.sqrt(1 - con * con); + }; + return exports; + }, + {} + ], + 16: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + module.exports = function (eccent, ts) { + var eccnth = 0.5 * eccent; + var con, dphi; + var phi = HALF_PI - 2 * Math.atan(ts); + for (var i = 0; i <= 15; i++) { + con = eccent * Math.sin(phi); + dphi = HALF_PI - 2 * Math.atan(ts * Math.pow((1 - con) / (1 + con), eccnth)) - phi; + phi += dphi; + if (Math.abs(dphi) <= 1e-10) { + return phi; + } + } + return -9999; + }; + return exports; + }, + {} + ], + 17: [ + function (_dereq_, module, exports) { + var C00 = 1; + var C02 = 0.25; + var C04 = 0.046875; + var C06 = 0.01953125; + var C08 = 0.01068115234375; + var C22 = 0.75; + var C44 = 0.46875; + var C46 = 0.013020833333333334; + var C48 = 0.007120768229166667; + var C66 = 0.3645833333333333; + var C68 = 0.005696614583333333; + var C88 = 0.3076171875; + module.exports = function (es) { + var en = []; + en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); + en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); + var t = es * es; + en[2] = t * (C44 - es * (C46 + es * C48)); + t *= es; + en[3] = t * (C66 - es * C68); + en[4] = t * es * C88; + return en; + }; + return exports; + }, + {} + ], + 18: [ + function (_dereq_, module, exports) { + var pj_mlfn = _dereq_('./pj_mlfn'); + var EPSLN = 1e-10; + var MAX_ITER = 20; + module.exports = function (arg, es, en) { + var k = 1 / (1 - es); + var phi = arg; + for (var i = MAX_ITER; i; --i) { + var s = Math.sin(phi); + var t = 1 - es * s * s; + t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; + phi -= t; + if (Math.abs(t) < EPSLN) { + return phi; + } + } + return phi; + }; + return exports; + }, + { './pj_mlfn': 19 } + ], + 19: [ + function (_dereq_, module, exports) { + module.exports = function (phi, sphi, cphi, en) { + cphi *= sphi; + sphi *= sphi; + return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))); + }; + return exports; + }, + {} + ], + 20: [ + function (_dereq_, module, exports) { + module.exports = function (eccent, sinphi) { + var con; + if (eccent > 1e-7) { + con = eccent * sinphi; + return (1 - eccent * eccent) * (sinphi / (1 - con * con) - 0.5 / eccent * Math.log((1 - con) / (1 + con))); + } else { + return 2 * sinphi; + } + }; + return exports; + }, + {} + ], + 21: [ + function (_dereq_, module, exports) { + module.exports = function (x) { + return x < 0 ? -1 : 1; + }; + return exports; + }, + {} + ], + 22: [ + function (_dereq_, module, exports) { + module.exports = function (esinp, exp) { + return Math.pow((1 - esinp) / (1 + esinp), exp); + }; + return exports; + }, + {} + ], + 23: [ + function (_dereq_, module, exports) { + module.exports = function (array) { + var out = { + x: array[0], + y: array[1] + }; + if (array.length > 2) { + out.z = array[2]; + } + if (array.length > 3) { + out.m = array[3]; + } + return out; + }; + return exports; + }, + {} + ], + 24: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + module.exports = function (eccent, phi, sinphi) { + var con = eccent * sinphi; + var com = 0.5 * eccent; + con = Math.pow((1 - con) / (1 + con), com); + return Math.tan(0.5 * (HALF_PI - phi)) / con; + }; + return exports; + }, + {} + ], + 25: [ + function (_dereq_, module, exports) { + exports.wgs84 = { + towgs84: '0,0,0', + ellipse: 'WGS84', + datumName: 'WGS84' + }; + exports.ch1903 = { + towgs84: '674.374,15.056,405.346', + ellipse: 'bessel', + datumName: 'swiss' + }; + exports.ggrs87 = { + towgs84: '-199.87,74.79,246.62', + ellipse: 'GRS80', + datumName: 'Greek_Geodetic_Reference_System_1987' + }; + exports.nad83 = { + towgs84: '0,0,0', + ellipse: 'GRS80', + datumName: 'North_American_Datum_1983' + }; + exports.nad27 = { + nadgrids: '@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat', + ellipse: 'clrk66', + datumName: 'North_American_Datum_1927' + }; + exports.potsdam = { + towgs84: '606.0,23.0,413.0', + ellipse: 'bessel', + datumName: 'Potsdam Rauenberg 1950 DHDN' + }; + exports.carthage = { + towgs84: '-263.0,6.0,431.0', + ellipse: 'clark80', + datumName: 'Carthage 1934 Tunisia' + }; + exports.hermannskogel = { + towgs84: '653.0,-212.0,449.0', + ellipse: 'bessel', + datumName: 'Hermannskogel' + }; + exports.ire65 = { + towgs84: '482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15', + ellipse: 'mod_airy', + datumName: 'Ireland 1965' + }; + exports.rassadiran = { + towgs84: '-133.63,-157.5,-158.62', + ellipse: 'intl', + datumName: 'Rassadiran' + }; + exports.nzgd49 = { + towgs84: '59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993', + ellipse: 'intl', + datumName: 'New Zealand Geodetic Datum 1949' + }; + exports.osgb36 = { + towgs84: '446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894', + ellipse: 'airy', + datumName: 'Airy 1830' + }; + exports.s_jtsk = { + towgs84: '589,76,480', + ellipse: 'bessel', + datumName: 'S-JTSK (Ferro)' + }; + exports.beduaram = { + towgs84: '-106,-87,188', + ellipse: 'clrk80', + datumName: 'Beduaram' + }; + exports.gunung_segara = { + towgs84: '-403,684,41', + ellipse: 'bessel', + datumName: 'Gunung Segara Jakarta' + }; + exports.rnb72 = { + towgs84: '106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1', + ellipse: 'intl', + datumName: 'Reseau National Belge 1972' + }; + return exports; + }, + {} + ], + 26: [ + function (_dereq_, module, exports) { + exports.MERIT = { + a: 6378137, + rf: 298.257, + ellipseName: 'MERIT 1983' + }; + exports.SGS85 = { + a: 6378136, + rf: 298.257, + ellipseName: 'Soviet Geodetic System 85' + }; + exports.GRS80 = { + a: 6378137, + rf: 298.257222101, + ellipseName: 'GRS 1980(IUGG, 1980)' + }; + exports.IAU76 = { + a: 6378140, + rf: 298.257, + ellipseName: 'IAU 1976' + }; + exports.airy = { + a: 6377563.396, + b: 6356256.91, + ellipseName: 'Airy 1830' + }; + exports.APL4 = { + a: 6378137, + rf: 298.25, + ellipseName: 'Appl. Physics. 1965' + }; + exports.NWL9D = { + a: 6378145, + rf: 298.25, + ellipseName: 'Naval Weapons Lab., 1965' + }; + exports.mod_airy = { + a: 6377340.189, + b: 6356034.446, + ellipseName: 'Modified Airy' + }; + exports.andrae = { + a: 6377104.43, + rf: 300, + ellipseName: 'Andrae 1876 (Den., Iclnd.)' + }; + exports.aust_SA = { + a: 6378160, + rf: 298.25, + ellipseName: 'Australian Natl & S. Amer. 1969' + }; + exports.GRS67 = { + a: 6378160, + rf: 298.247167427, + ellipseName: 'GRS 67(IUGG 1967)' + }; + exports.bessel = { + a: 6377397.155, + rf: 299.1528128, + ellipseName: 'Bessel 1841' + }; + exports.bess_nam = { + a: 6377483.865, + rf: 299.1528128, + ellipseName: 'Bessel 1841 (Namibia)' + }; + exports.clrk66 = { + a: 6378206.4, + b: 6356583.8, + ellipseName: 'Clarke 1866' + }; + exports.clrk80 = { + a: 6378249.145, + rf: 293.4663, + ellipseName: 'Clarke 1880 mod.' + }; + exports.clrk58 = { + a: 6378293.645208759, + rf: 294.2606763692654, + ellipseName: 'Clarke 1858' + }; + exports.CPM = { + a: 6375738.7, + rf: 334.29, + ellipseName: 'Comm. des Poids et Mesures 1799' + }; + exports.delmbr = { + a: 6376428, + rf: 311.5, + ellipseName: 'Delambre 1810 (Belgium)' + }; + exports.engelis = { + a: 6378136.05, + rf: 298.2566, + ellipseName: 'Engelis 1985' + }; + exports.evrst30 = { + a: 6377276.345, + rf: 300.8017, + ellipseName: 'Everest 1830' + }; + exports.evrst48 = { + a: 6377304.063, + rf: 300.8017, + ellipseName: 'Everest 1948' + }; + exports.evrst56 = { + a: 6377301.243, + rf: 300.8017, + ellipseName: 'Everest 1956' + }; + exports.evrst69 = { + a: 6377295.664, + rf: 300.8017, + ellipseName: 'Everest 1969' + }; + exports.evrstSS = { + a: 6377298.556, + rf: 300.8017, + ellipseName: 'Everest (Sabah & Sarawak)' + }; + exports.fschr60 = { + a: 6378166, + rf: 298.3, + ellipseName: 'Fischer (Mercury Datum) 1960' + }; + exports.fschr60m = { + a: 6378155, + rf: 298.3, + ellipseName: 'Fischer 1960' + }; + exports.fschr68 = { + a: 6378150, + rf: 298.3, + ellipseName: 'Fischer 1968' + }; + exports.helmert = { + a: 6378200, + rf: 298.3, + ellipseName: 'Helmert 1906' + }; + exports.hough = { + a: 6378270, + rf: 297, + ellipseName: 'Hough' + }; + exports.intl = { + a: 6378388, + rf: 297, + ellipseName: 'International 1909 (Hayford)' + }; + exports.kaula = { + a: 6378163, + rf: 298.24, + ellipseName: 'Kaula 1961' + }; + exports.lerch = { + a: 6378139, + rf: 298.257, + ellipseName: 'Lerch 1979' + }; + exports.mprts = { + a: 6397300, + rf: 191, + ellipseName: 'Maupertius 1738' + }; + exports.new_intl = { + a: 6378157.5, + b: 6356772.2, + ellipseName: 'New International 1967' + }; + exports.plessis = { + a: 6376523, + rf: 6355863, + ellipseName: 'Plessis 1817 (France)' + }; + exports.krass = { + a: 6378245, + rf: 298.3, + ellipseName: 'Krassovsky, 1942' + }; + exports.SEasia = { + a: 6378155, + b: 6356773.3205, + ellipseName: 'Southeast Asia' + }; + exports.walbeck = { + a: 6376896, + b: 6355834.8467, + ellipseName: 'Walbeck' + }; + exports.WGS60 = { + a: 6378165, + rf: 298.3, + ellipseName: 'WGS 60' + }; + exports.WGS66 = { + a: 6378145, + rf: 298.25, + ellipseName: 'WGS 66' + }; + exports.WGS7 = { + a: 6378135, + rf: 298.26, + ellipseName: 'WGS 72' + }; + exports.WGS84 = { + a: 6378137, + rf: 298.257223563, + ellipseName: 'WGS 84' + }; + exports.sphere = { + a: 6370997, + b: 6370997, + ellipseName: 'Normal Sphere (r=6370997)' + }; + return exports; + }, + {} + ], + 27: [ + function (_dereq_, module, exports) { + exports.greenwich = 0; + exports.lisbon = -9.131906111111; + exports.paris = 2.337229166667; + exports.bogota = -74.080916666667; + exports.madrid = -3.687938888889; + exports.rome = 12.452333333333; + exports.bern = 7.439583333333; + exports.jakarta = 106.807719444444; + exports.ferro = -17.666666666667; + exports.brussels = 4.367975; + exports.stockholm = 18.058277777778; + exports.athens = 23.7163375; + exports.oslo = 10.722916666667; + return exports; + }, + {} + ], + 28: [ + function (_dereq_, module, exports) { + var proj = _dereq_('./Proj'); + var transform = _dereq_('./transform'); + var wgs84 = proj('WGS84'); + function transformer(from, to, coords) { + var transformedArray; + if (Array.isArray(coords)) { + transformedArray = transform(from, to, coords); + if (coords.length === 3) { + return [ + transformedArray.x, + transformedArray.y, + transformedArray.z + ]; + } else { + return [ + transformedArray.x, + transformedArray.y + ]; + } + } else { + return transform(from, to, coords); + } + } + function checkProj(item) { + if (item instanceof proj) { + return item; + } + if (item.oProj) { + return item.oProj; + } + return proj(item); + } + function proj4(fromProj, toProj, coord) { + fromProj = checkProj(fromProj); + var single = false; + var obj; + if (typeof toProj === 'undefined') { + toProj = fromProj; + fromProj = wgs84; + single = true; + } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { + coord = toProj; + toProj = fromProj; + fromProj = wgs84; + single = true; + } + toProj = checkProj(toProj); + if (coord) { + return transformer(fromProj, toProj, coord); + } else { + obj = { + forward: function (coords) { + return transformer(fromProj, toProj, coords); + }, + inverse: function (coords) { + return transformer(toProj, fromProj, coords); + } + }; + if (single) { + obj.oProj = toProj; + } + return obj; + } + } + module.exports = proj4; + return exports; + }, + { + './Proj': 2, + './transform': 64 + } + ], + 29: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + var PJD_3PARAM = 1; + var PJD_7PARAM = 2; + var PJD_GRIDSHIFT = 3; + var PJD_WGS84 = 4; + var PJD_NODATUM = 5; + var SEC_TO_RAD = 0.00000484813681109536; + var AD_C = 1.0026; + var COS_67P5 = 0.3826834323650898; + var datum = function (proj) { + if (!(this instanceof datum)) { + return new datum(proj); + } + this.datum_type = PJD_WGS84; + if (!proj) { + return; + } + if (proj.datumCode && proj.datumCode === 'none') { + this.datum_type = PJD_NODATUM; + } + if (proj.datum_params) { + for (var i = 0; i < proj.datum_params.length; i++) { + proj.datum_params[i] = parseFloat(proj.datum_params[i]); + } + if (proj.datum_params[0] !== 0 || proj.datum_params[1] !== 0 || proj.datum_params[2] !== 0) { + this.datum_type = PJD_3PARAM; + } + if (proj.datum_params.length > 3) { + if (proj.datum_params[3] !== 0 || proj.datum_params[4] !== 0 || proj.datum_params[5] !== 0 || proj.datum_params[6] !== 0) { + this.datum_type = PJD_7PARAM; + proj.datum_params[3] *= SEC_TO_RAD; + proj.datum_params[4] *= SEC_TO_RAD; + proj.datum_params[5] *= SEC_TO_RAD; + proj.datum_params[6] = proj.datum_params[6] / 1000000 + 1; + } + } + } + this.datum_type = proj.grids ? PJD_GRIDSHIFT : this.datum_type; + this.a = proj.a; + this.b = proj.b; + this.es = proj.es; + this.ep2 = proj.ep2; + this.datum_params = proj.datum_params; + if (this.datum_type === PJD_GRIDSHIFT) { + this.grids = proj.grids; + } + }; + datum.prototype = { + compare_datums: function (dest) { + if (this.datum_type !== dest.datum_type) { + return false; + } else if (this.a !== dest.a || Math.abs(this.es - dest.es) > 5e-11) { + return false; + } else if (this.datum_type === PJD_3PARAM) { + return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2]; + } else if (this.datum_type === PJD_7PARAM) { + return this.datum_params[0] === dest.datum_params[0] && this.datum_params[1] === dest.datum_params[1] && this.datum_params[2] === dest.datum_params[2] && this.datum_params[3] === dest.datum_params[3] && this.datum_params[4] === dest.datum_params[4] && this.datum_params[5] === dest.datum_params[5] && this.datum_params[6] === dest.datum_params[6]; + } else if (this.datum_type === PJD_GRIDSHIFT || dest.datum_type === PJD_GRIDSHIFT) { + return this.nadgrids === dest.nadgrids; + } else { + return true; + } + }, + geodetic_to_geocentric: function (p) { + var Longitude = p.x; + var Latitude = p.y; + var Height = p.z ? p.z : 0; + var X; + var Y; + var Z; + var Error_Code = 0; + var Rn; + var Sin_Lat; + var Sin2_Lat; + var Cos_Lat; + if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { + Latitude = -HALF_PI; + } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { + Latitude = HALF_PI; + } else if (Latitude < -HALF_PI || Latitude > HALF_PI) { + return null; + } + if (Longitude > Math.PI) { + Longitude -= 2 * Math.PI; + } + Sin_Lat = Math.sin(Latitude); + Cos_Lat = Math.cos(Latitude); + Sin2_Lat = Sin_Lat * Sin_Lat; + Rn = this.a / Math.sqrt(1 - this.es * Sin2_Lat); + X = (Rn + Height) * Cos_Lat * Math.cos(Longitude); + Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude); + Z = (Rn * (1 - this.es) + Height) * Sin_Lat; + p.x = X; + p.y = Y; + p.z = Z; + return Error_Code; + }, + geocentric_to_geodetic: function (p) { + var genau = 1e-12; + var genau2 = genau * genau; + var maxiter = 30; + var P; + var RR; + var CT; + var ST; + var RX; + var RK; + var RN; + var CPHI0; + var SPHI0; + var CPHI; + var SPHI; + var SDPHI; + var At_Pole; + var iter; + var X = p.x; + var Y = p.y; + var Z = p.z ? p.z : 0; + var Longitude; + var Latitude; + var Height; + At_Pole = false; + P = Math.sqrt(X * X + Y * Y); + RR = Math.sqrt(X * X + Y * Y + Z * Z); + if (P / this.a < genau) { + At_Pole = true; + Longitude = 0; + if (RR / this.a < genau) { + Latitude = HALF_PI; + Height = -this.b; + return; + } + } else { + Longitude = Math.atan2(Y, X); + } + CT = Z / RR; + ST = P / RR; + RX = 1 / Math.sqrt(1 - this.es * (2 - this.es) * ST * ST); + CPHI0 = ST * (1 - this.es) * RX; + SPHI0 = CT * RX; + iter = 0; + do { + iter++; + RN = this.a / Math.sqrt(1 - this.es * SPHI0 * SPHI0); + Height = P * CPHI0 + Z * SPHI0 - RN * (1 - this.es * SPHI0 * SPHI0); + RK = this.es * RN / (RN + Height); + RX = 1 / Math.sqrt(1 - RK * (2 - RK) * ST * ST); + CPHI = ST * (1 - RK) * RX; + SPHI = CT * RX; + SDPHI = SPHI * CPHI0 - CPHI * SPHI0; + CPHI0 = CPHI; + SPHI0 = SPHI; + } while (SDPHI * SDPHI > genau2 && iter < maxiter); + Latitude = Math.atan(SPHI / Math.abs(CPHI)); + p.x = Longitude; + p.y = Latitude; + p.z = Height; + return p; + }, + geocentric_to_geodetic_noniter: function (p) { + var X = p.x; + var Y = p.y; + var Z = p.z ? p.z : 0; + var Longitude; + var Latitude; + var Height; + var W; + var W2; + var T0; + var T1; + var S0; + var S1; + var Sin_B0; + var Sin3_B0; + var Cos_B0; + var Sin_p1; + var Cos_p1; + var Rn; + var Sum; + var At_Pole; + X = parseFloat(X); + Y = parseFloat(Y); + Z = parseFloat(Z); + At_Pole = false; + if (X !== 0) { + Longitude = Math.atan2(Y, X); + } else { + if (Y > 0) { + Longitude = HALF_PI; + } else if (Y < 0) { + Longitude = -HALF_PI; + } else { + At_Pole = true; + Longitude = 0; + if (Z > 0) { + Latitude = HALF_PI; + } else if (Z < 0) { + Latitude = -HALF_PI; + } else { + Latitude = HALF_PI; + Height = -this.b; + return; + } + } + } + W2 = X * X + Y * Y; + W = Math.sqrt(W2); + T0 = Z * AD_C; + S0 = Math.sqrt(T0 * T0 + W2); + Sin_B0 = T0 / S0; + Cos_B0 = W / S0; + Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0; + T1 = Z + this.b * this.ep2 * Sin3_B0; + Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0; + S1 = Math.sqrt(T1 * T1 + Sum * Sum); + Sin_p1 = T1 / S1; + Cos_p1 = Sum / S1; + Rn = this.a / Math.sqrt(1 - this.es * Sin_p1 * Sin_p1); + if (Cos_p1 >= COS_67P5) { + Height = W / Cos_p1 - Rn; + } else if (Cos_p1 <= -COS_67P5) { + Height = W / -Cos_p1 - Rn; + } else { + Height = Z / Sin_p1 + Rn * (this.es - 1); + } + if (At_Pole === false) { + Latitude = Math.atan(Sin_p1 / Cos_p1); + } + p.x = Longitude; + p.y = Latitude; + p.z = Height; + return p; + }, + geocentric_to_wgs84: function (p) { + if (this.datum_type === PJD_3PARAM) { + p.x += this.datum_params[0]; + p.y += this.datum_params[1]; + p.z += this.datum_params[2]; + } else if (this.datum_type === PJD_7PARAM) { + var Dx_BF = this.datum_params[0]; + var Dy_BF = this.datum_params[1]; + var Dz_BF = this.datum_params[2]; + var Rx_BF = this.datum_params[3]; + var Ry_BF = this.datum_params[4]; + var Rz_BF = this.datum_params[5]; + var M_BF = this.datum_params[6]; + var x_out = M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF; + var y_out = M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF; + var z_out = M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF; + p.x = x_out; + p.y = y_out; + p.z = z_out; + } + }, + geocentric_from_wgs84: function (p) { + if (this.datum_type === PJD_3PARAM) { + p.x -= this.datum_params[0]; + p.y -= this.datum_params[1]; + p.z -= this.datum_params[2]; + } else if (this.datum_type === PJD_7PARAM) { + var Dx_BF = this.datum_params[0]; + var Dy_BF = this.datum_params[1]; + var Dz_BF = this.datum_params[2]; + var Rx_BF = this.datum_params[3]; + var Ry_BF = this.datum_params[4]; + var Rz_BF = this.datum_params[5]; + var M_BF = this.datum_params[6]; + var x_tmp = (p.x - Dx_BF) / M_BF; + var y_tmp = (p.y - Dy_BF) / M_BF; + var z_tmp = (p.z - Dz_BF) / M_BF; + p.x = x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp; + p.y = -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp; + p.z = Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp; + } + } + }; + module.exports = datum; + return exports; + }, + {} + ], + 30: [ + function (_dereq_, module, exports) { + var PJD_3PARAM = 1; + var PJD_7PARAM = 2; + var PJD_GRIDSHIFT = 3; + var PJD_NODATUM = 5; + var SRS_WGS84_SEMIMAJOR = 6378137; + var SRS_WGS84_ESQUARED = 0.006694379990141316; + module.exports = function (source, dest, point) { + var wp, i, l; + function checkParams(fallback) { + return fallback === PJD_3PARAM || fallback === PJD_7PARAM; + } + if (source.compare_datums(dest)) { + return point; + } + if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { + return point; + } + var src_a = source.a; + var src_es = source.es; + var dst_a = dest.a; + var dst_es = dest.es; + var fallback = source.datum_type; + if (fallback === PJD_GRIDSHIFT) { + if (this.apply_gridshift(source, 0, point) === 0) { + source.a = SRS_WGS84_SEMIMAJOR; + source.es = SRS_WGS84_ESQUARED; + } else { + if (!source.datum_params) { + source.a = src_a; + source.es = source.es; + return point; + } + wp = 1; + for (i = 0, l = source.datum_params.length; i < l; i++) { + wp *= source.datum_params[i]; + } + if (wp === 0) { + source.a = src_a; + source.es = source.es; + return point; + } + if (source.datum_params.length > 3) { + fallback = PJD_7PARAM; + } else { + fallback = PJD_3PARAM; + } + } + } + if (dest.datum_type === PJD_GRIDSHIFT) { + dest.a = SRS_WGS84_SEMIMAJOR; + dest.es = SRS_WGS84_ESQUARED; + } + if (source.es !== dest.es || source.a !== dest.a || checkParams(fallback) || checkParams(dest.datum_type)) { + source.geodetic_to_geocentric(point); + if (checkParams(source.datum_type)) { + source.geocentric_to_wgs84(point); + } + if (checkParams(dest.datum_type)) { + dest.geocentric_from_wgs84(point); + } + dest.geocentric_to_geodetic(point); + } + if (dest.datum_type === PJD_GRIDSHIFT) { + this.apply_gridshift(dest, 1, point); + } + source.a = src_a; + source.es = src_es; + dest.a = dst_a; + dest.es = dst_es; + return point; + }; + return exports; + }, + {} + ], + 31: [ + function (_dereq_, module, exports) { + var globals = _dereq_('./global'); + var parseProj = _dereq_('./projString'); + var wkt = _dereq_('./wkt'); + function defs(name) { + var that = this; + if (arguments.length === 2) { + var def = arguments[1]; + if (typeof def === 'string') { + if (def[0] === '+') { + defs[name] = parseProj(arguments[1]); + } else { + defs[name] = wkt(arguments[1]); + } + } else { + defs[name] = def; + } + } else if (arguments.length === 1) { + if (Array.isArray(name)) { + return name.map(function (v) { + if (Array.isArray(v)) { + defs.apply(that, v); + } else { + defs(v); + } + }); + } else if (typeof name === 'string') { + if (name in defs) { + return defs[name]; + } + } else if ('EPSG' in name) { + defs['EPSG:' + name.EPSG] = name; + } else if ('ESRI' in name) { + defs['ESRI:' + name.ESRI] = name; + } else if ('IAU2000' in name) { + defs['IAU2000:' + name.IAU2000] = name; + } else { + console.log(name); + } + return; + } + } + globals(defs); + module.exports = defs; + return exports; + }, + { + './global': 34, + './projString': 37, + './wkt': 65 + } + ], + 32: [ + function (_dereq_, module, exports) { + var Datum = _dereq_('./constants/Datum'); + var Ellipsoid = _dereq_('./constants/Ellipsoid'); + var extend = _dereq_('./extend'); + var datum = _dereq_('./datum'); + var EPSLN = 1e-10; + var SIXTH = 0.16666666666666666; + var RA4 = 0.04722222222222222; + var RA6 = 0.022156084656084655; + module.exports = function (json) { + if (json.datumCode && json.datumCode !== 'none') { + var datumDef = Datum[json.datumCode]; + if (datumDef) { + json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null; + json.ellps = datumDef.ellipse; + json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; + } + } + if (!json.a) { + var ellipse = Ellipsoid[json.ellps] ? Ellipsoid[json.ellps] : Ellipsoid.WGS84; + extend(json, ellipse); + } + if (json.rf && !json.b) { + json.b = (1 - 1 / json.rf) * json.a; + } + if (json.rf === 0 || Math.abs(json.a - json.b) < EPSLN) { + json.sphere = true; + json.b = json.a; + } + json.a2 = json.a * json.a; + json.b2 = json.b * json.b; + json.es = (json.a2 - json.b2) / json.a2; + json.e = Math.sqrt(json.es); + if (json.R_A) { + json.a *= 1 - json.es * (SIXTH + json.es * (RA4 + json.es * RA6)); + json.a2 = json.a * json.a; + json.b2 = json.b * json.b; + json.es = 0; + } + json.ep2 = (json.a2 - json.b2) / json.b2; + if (!json.k0) { + json.k0 = 1; + } + if (!json.axis) { + json.axis = 'enu'; + } + json.datum = datum(json); + return json; + }; + return exports; + }, + { + './constants/Datum': 25, + './constants/Ellipsoid': 26, + './datum': 29, + './extend': 33 + } + ], + 33: [ + function (_dereq_, module, exports) { + module.exports = function (destination, source) { + destination = destination || {}; + var value, property; + if (!source) { + return destination; + } + for (property in source) { + value = source[property]; + if (value !== undefined) { + destination[property] = value; + } + } + return destination; + }; + return exports; + }, + {} + ], + 34: [ + function (_dereq_, module, exports) { + module.exports = function (defs) { + defs('EPSG:4326', '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees'); + defs('EPSG:4269', '+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees'); + defs('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'); + defs.WGS84 = defs['EPSG:4326']; + defs['EPSG:3785'] = defs['EPSG:3857']; + defs.GOOGLE = defs['EPSG:3857']; + defs['EPSG:900913'] = defs['EPSG:3857']; + defs['EPSG:102113'] = defs['EPSG:3857']; + }; + return exports; + }, + {} + ], + 35: [ + function (_dereq_, module, exports) { + var proj4 = _dereq_('./core'); + proj4.defaultDatum = 'WGS84'; + proj4.Proj = _dereq_('./Proj'); + proj4.WGS84 = new proj4.Proj('WGS84'); + proj4.Point = _dereq_('./Point'); + proj4.toPoint = _dereq_('./common/toPoint'); + proj4.defs = _dereq_('./defs'); + proj4.transform = _dereq_('./transform'); + proj4.mgrs = _dereq_('mgrs'); + proj4.version = _dereq_('../package.json').version; + _dereq_('./includedProjections')(proj4); + module.exports = proj4; + return exports; + }, + { + '../package.json': 67, + './Point': 1, + './Proj': 2, + './common/toPoint': 23, + './core': 28, + './defs': 31, + './includedProjections': 'gWUPNW', + './transform': 64, + 'mgrs': 66 + } + ], + 36: [ + function (_dereq_, module, exports) { + var defs = _dereq_('./defs'); + var wkt = _dereq_('./wkt'); + var projStr = _dereq_('./projString'); + function testObj(code) { + return typeof code === 'string'; + } + function testDef(code) { + return code in defs; + } + function testWKT(code) { + var codeWords = [ + 'GEOGCS', + 'GEOCCS', + 'PROJCS', + 'LOCAL_CS' + ]; + return codeWords.reduce(function (a, b) { + return a + 1 + code.indexOf(b); + }, 0); + } + function testProj(code) { + return code[0] === '+'; + } + function parse(code) { + if (testObj(code)) { + if (testDef(code)) { + return defs[code]; + } else if (testWKT(code)) { + return wkt(code); + } else if (testProj(code)) { + return projStr(code); + } + } else { + return code; + } + } + module.exports = parse; + return exports; + }, + { + './defs': 31, + './projString': 37, + './wkt': 65 + } + ], + 37: [ + function (_dereq_, module, exports) { + var D2R = 0.017453292519943295; + var PrimeMeridian = _dereq_('./constants/PrimeMeridian'); + module.exports = function (defData) { + var self = {}; + var paramObj = {}; + defData.split('+').map(function (v) { + return v.trim(); + }).filter(function (a) { + return a; + }).forEach(function (a) { + var split = a.split('='); + split.push(true); + paramObj[split[0].toLowerCase()] = split[1]; + }); + var paramName, paramVal, paramOutname; + var params = { + proj: 'projName', + datum: 'datumCode', + rf: function (v) { + self.rf = parseFloat(v, 10); + }, + lat_0: function (v) { + self.lat0 = v * D2R; + }, + lat_1: function (v) { + self.lat1 = v * D2R; + }, + lat_2: function (v) { + self.lat2 = v * D2R; + }, + lat_ts: function (v) { + self.lat_ts = v * D2R; + }, + lon_0: function (v) { + self.long0 = v * D2R; + }, + lon_1: function (v) { + self.long1 = v * D2R; + }, + lon_2: function (v) { + self.long2 = v * D2R; + }, + alpha: function (v) { + self.alpha = parseFloat(v) * D2R; + }, + lonc: function (v) { + self.longc = v * D2R; + }, + x_0: function (v) { + self.x0 = parseFloat(v, 10); + }, + y_0: function (v) { + self.y0 = parseFloat(v, 10); + }, + k_0: function (v) { + self.k0 = parseFloat(v, 10); + }, + k: function (v) { + self.k0 = parseFloat(v, 10); + }, + r_a: function () { + self.R_A = true; + }, + zone: function (v) { + self.zone = parseInt(v, 10); + }, + south: function () { + self.utmSouth = true; + }, + towgs84: function (v) { + self.datum_params = v.split(',').map(function (a) { + return parseFloat(a, 10); + }); + }, + to_meter: function (v) { + self.to_meter = parseFloat(v, 10); + }, + from_greenwich: function (v) { + self.from_greenwich = v * D2R; + }, + pm: function (v) { + self.from_greenwich = (PrimeMeridian[v] ? PrimeMeridian[v] : parseFloat(v, 10)) * D2R; + }, + nadgrids: function (v) { + if (v === '@null') { + self.datumCode = 'none'; + } else { + self.nadgrids = v; + } + }, + axis: function (v) { + var legalAxis = 'ewnsud'; + if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { + self.axis = v; + } + } + }; + for (paramName in paramObj) { + paramVal = paramObj[paramName]; + if (paramName in params) { + paramOutname = params[paramName]; + if (typeof paramOutname === 'function') { + paramOutname(paramVal); + } else { + self[paramOutname] = paramVal; + } + } else { + self[paramName] = paramVal; + } + } + if (typeof self.datumCode === 'string' && self.datumCode !== 'WGS84') { + self.datumCode = self.datumCode.toLowerCase(); + } + return self; + }; + return exports; + }, + { './constants/PrimeMeridian': 27 } + ], + 38: [ + function (_dereq_, module, exports) { + var projs = [ + _dereq_('./projections/merc'), + _dereq_('./projections/longlat') + ]; + var names = {}; + var projStore = []; + function add(proj, i) { + var len = projStore.length; + if (!proj.names) { + console.log(i); + return true; + } + projStore[len] = proj; + proj.names.forEach(function (n) { + names[n.toLowerCase()] = len; + }); + return this; + } + exports.add = add; + exports.get = function (name) { + if (!name) { + return false; + } + var n = name.toLowerCase(); + if (typeof names[n] !== 'undefined' && projStore[names[n]]) { + return projStore[names[n]]; + } + }; + exports.start = function () { + projs.forEach(add); + }; + return exports; + }, + { + './projections/longlat': 50, + './projections/merc': 51 + } + ], + 39: [ + function (_dereq_, module, exports) { + var EPSLN = 1e-10; + var msfnz = _dereq_('../common/msfnz'); + var qsfnz = _dereq_('../common/qsfnz'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var asinz = _dereq_('../common/asinz'); + exports.init = function () { + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + 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 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs1 = qsfnz(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 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs2 = qsfnz(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 = qsfnz(this.e3, this.sin_po, this.cos_po); + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); + } else { + 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; + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + this.sin_phi = Math.sin(lat); + this.cos_phi = Math.cos(lat); + var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi); + var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; + var theta = this.ns0 * adjust_lon(lon - this.long0); + var x = rh1 * Math.sin(theta) + this.x0; + var y = this.rh - rh1 * Math.cos(theta) + this.y0; + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var rh1, qs, con, theta, lon, lat; + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + if (this.ns0 >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + theta = 0; + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + con = rh1 * this.ns0 / this.a; + if (this.sphere) { + lat = Math.asin((this.c - con * con) / (2 * this.ns0)); + } else { + qs = (this.c - con * con) / this.ns0; + lat = this.phi1z(this.e3, qs); + } + lon = adjust_lon(theta / this.ns0 + this.long0); + p.x = lon; + p.y = lat; + return p; + }; + exports.phi1z = function (eccent, qs) { + var sinphi, cosphi, con, com, dphi; + var phi = asinz(0.5 * qs); + if (eccent < EPSLN) { + return phi; + } + var eccnts = eccent * eccent; + for (var i = 1; i <= 25; i++) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + con = eccent * sinphi; + com = 1 - con * con; + dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi = phi + dphi; + if (Math.abs(dphi) <= 1e-7) { + return phi; + } + } + return null; + }; + exports.names = [ + 'Albers_Conic_Equal_Area', + 'Albers', + 'aea' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/asinz': 6, + '../common/msfnz': 15, + '../common/qsfnz': 20 + } + ], + 40: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var mlfn = _dereq_('../common/mlfn'); + var e0fn = _dereq_('../common/e0fn'); + var e1fn = _dereq_('../common/e1fn'); + var e2fn = _dereq_('../common/e2fn'); + var e3fn = _dereq_('../common/e3fn'); + var gN = _dereq_('../common/gN'); + var asinz = _dereq_('../common/asinz'); + var imlfn = _dereq_('../common/imlfn'); + exports.init = function () { + this.sin_p12 = Math.sin(this.lat0); + this.cos_p12 = Math.cos(this.lat0); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var sinphi = Math.sin(p.y); + var cosphi = Math.cos(p.y); + var dlon = adjust_lon(lon - this.long0); + var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; + if (this.sphere) { + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); + p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); + p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); + return p; + } else { + cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); + c = Math.acos(cos_c); + kp = c / Math.sin(c); + p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); + p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); + return p; + } + } else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); + p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); + p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); + return p; + } else { + tanphi = sinphi / cosphi; + Nl1 = gN(this.a, this.e, this.sin_p12); + Nl = gN(this.a, this.e, sinphi); + psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); + Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); + if (Az === 0) { + s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { + s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } else { + s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); + } + G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); + H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); + GH = G * H; + Hs = H * H; + s2 = s * s; + s3 = s2 * s; + s4 = s3 * s; + s5 = s4 * s; + c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); + p.x = this.x0 + c * Math.sin(Az); + p.y = this.y0 + c * Math.cos(Az); + return p; + } + } + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F; + if (this.sphere) { + rh = Math.sqrt(p.x * p.x + p.y * p.y); + if (rh > 2 * HALF_PI * this.a) { + return; + } + z = rh / this.a; + sinz = Math.sin(z); + cosz = Math.cos(z); + lon = this.long0; + if (Math.abs(rh) <= EPSLN) { + lat = this.lat0; + } else { + lat = asinz(cosz * this.sin_p12 + p.y * sinz * this.cos_p12 / rh); + con = Math.abs(this.lat0) - HALF_PI; + if (Math.abs(con) <= EPSLN) { + if (this.lat0 >= 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); + } else { + lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); + } + } else { + lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); + } + } + p.x = lon; + p.y = lat; + return p; + } else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = Mlp - rh; + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); + p.x = lon; + p.y = lat; + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = rh - Mlp; + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + p.x = lon; + p.y = lat; + return p; + } else { + rh = Math.sqrt(p.x * p.x + p.y * p.y); + Az = Math.atan2(p.x, p.y); + N1 = gN(this.a, this.e, this.sin_p12); + cosAz = Math.cos(Az); + tmp = this.e * this.cos_p12 * cosAz; + A = -tmp * tmp / (1 - this.es); + B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); + D = rh / N1; + Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; + F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; + psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); + lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); + lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es)); + p.x = lon; + p.y = lat; + return p; + } + } + }; + exports.names = [ + 'Azimuthal_Equidistant', + 'aeqd' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/asinz': 6, + '../common/e0fn': 7, + '../common/e1fn': 8, + '../common/e2fn': 9, + '../common/e3fn': 10, + '../common/gN': 11, + '../common/imlfn': 12, + '../common/mlfn': 14 + } + ], + 41: [ + function (_dereq_, module, exports) { + var mlfn = _dereq_('../common/mlfn'); + var e0fn = _dereq_('../common/e0fn'); + var e1fn = _dereq_('../common/e1fn'); + var e2fn = _dereq_('../common/e2fn'); + var e3fn = _dereq_('../common/e3fn'); + var gN = _dereq_('../common/gN'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var adjust_lat = _dereq_('../common/adjust_lat'); + var imlfn = _dereq_('../common/imlfn'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + exports.init = function () { + if (!this.sphere) { + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + } + }; + exports.forward = function (p) { + var x, y; + var lam = p.x; + var phi = p.y; + lam = adjust_lon(lam - this.long0); + if (this.sphere) { + x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); + y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); + } else { + var sinphi = Math.sin(phi); + var cosphi = Math.cos(phi); + var nl = gN(this.a, this.e, sinphi); + var tl = Math.tan(phi) * Math.tan(phi); + var al = lam * Math.cos(phi); + var asq = al * al; + var cl = this.es * cosphi * cosphi / (1 - this.es); + var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); + y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); + } + p.x = x + this.x0; + p.y = y + this.y0; + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var phi, lam; + if (this.sphere) { + var dd = y + this.lat0; + phi = Math.asin(Math.sin(dd) * Math.cos(x)); + lam = Math.atan2(Math.tan(x), Math.cos(dd)); + } else { + var ml1 = this.ml0 / this.a + y; + var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); + if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { + p.x = this.long0; + p.y = HALF_PI; + if (y < 0) { + p.y *= -1; + } + return p; + } + var nl1 = gN(this.a, this.e, Math.sin(phi1)); + var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); + var tl1 = Math.pow(Math.tan(phi1), 2); + var dl = x * this.a / nl1; + var dsq = dl * dl; + phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); + lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); + } + p.x = adjust_lon(lam + this.long0); + p.y = adjust_lat(phi); + return p; + }; + exports.names = [ + 'Cassini', + 'Cassini_Soldner', + 'cass' + ]; + return exports; + }, + { + '../common/adjust_lat': 4, + '../common/adjust_lon': 5, + '../common/e0fn': 7, + '../common/e1fn': 8, + '../common/e2fn': 9, + '../common/e3fn': 10, + '../common/gN': 11, + '../common/imlfn': 12, + '../common/mlfn': 14 + } + ], + 42: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var qsfnz = _dereq_('../common/qsfnz'); + var msfnz = _dereq_('../common/msfnz'); + var iqsfnz = _dereq_('../common/iqsfnz'); + exports.init = function () { + if (!this.sphere) { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var x, y; + var dlon = adjust_lon(lon - this.long0); + if (this.sphere) { + x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); + y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); + } else { + var qs = qsfnz(this.e, Math.sin(lat)); + x = this.x0 + this.a * this.k0 * dlon; + y = this.y0 + this.a * qs * 0.5 / this.k0; + } + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat; + if (this.sphere) { + lon = adjust_lon(this.long0 + p.x / this.a / Math.cos(this.lat_ts)); + lat = Math.asin(p.y / this.a * Math.cos(this.lat_ts)); + } else { + lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); + lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = ['cea']; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/iqsfnz': 13, + '../common/msfnz': 15, + '../common/qsfnz': 20 + } + ], + 43: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var adjust_lat = _dereq_('../common/adjust_lat'); + exports.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); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var dlon = adjust_lon(lon - this.long0); + var dlat = adjust_lat(lat - this.lat0); + p.x = this.x0 + this.a * dlon * this.rc; + p.y = this.y0 + this.a * dlat; + return p; + }; + exports.inverse = function (p) { + var x = p.x; + var y = p.y; + p.x = adjust_lon(this.long0 + (x - this.x0) / (this.a * this.rc)); + p.y = adjust_lat(this.lat0 + (y - this.y0) / this.a); + return p; + }; + exports.names = [ + 'Equirectangular', + 'Equidistant_Cylindrical', + 'eqc' + ]; + return exports; + }, + { + '../common/adjust_lat': 4, + '../common/adjust_lon': 5 + } + ], + 44: [ + function (_dereq_, module, exports) { + var e0fn = _dereq_('../common/e0fn'); + var e1fn = _dereq_('../common/e1fn'); + var e2fn = _dereq_('../common/e2fn'); + var e3fn = _dereq_('../common/e3fn'); + var msfnz = _dereq_('../common/msfnz'); + var mlfn = _dereq_('../common/mlfn'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var adjust_lat = _dereq_('../common/adjust_lat'); + var imlfn = _dereq_('../common/imlfn'); + var EPSLN = 1e-10; + exports.init = function () { + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + 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 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.sinphi = Math.sin(this.lat1); + this.cosphi = Math.cos(this.lat1); + this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); + if (Math.abs(this.lat1 - this.lat2) < EPSLN) { + this.ns = this.sinphi; + } else { + this.sinphi = Math.sin(this.lat2); + this.cosphi = Math.cos(this.lat2); + this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml2 = mlfn(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 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + this.rh = this.a * (this.g - this.ml0); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var rh1; + if (this.sphere) { + rh1 = this.a * (this.g - lat); + } else { + var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); + rh1 = this.a * (this.g - ml); + } + var theta = this.ns * adjust_lon(lon - this.long0); + var x = this.x0 + rh1 * Math.sin(theta); + var y = this.y0 + this.rh - rh1 * Math.cos(theta); + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + var con, rh1, lat, lon; + if (this.ns >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + var theta = 0; + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + if (this.sphere) { + lon = adjust_lon(this.long0 + theta / this.ns); + lat = adjust_lat(this.g - rh1 / this.a); + p.x = lon; + p.y = lat; + return p; + } else { + var ml = this.g - rh1 / this.a; + lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); + lon = adjust_lon(this.long0 + theta / this.ns); + p.x = lon; + p.y = lat; + return p; + } + }; + exports.names = [ + 'Equidistant_Conic', + 'eqdc' + ]; + return exports; + }, + { + '../common/adjust_lat': 4, + '../common/adjust_lon': 5, + '../common/e0fn': 7, + '../common/e1fn': 8, + '../common/e2fn': 9, + '../common/e3fn': 10, + '../common/imlfn': 12, + '../common/mlfn': 14, + '../common/msfnz': 15 + } + ], + 45: [ + function (_dereq_, module, exports) { + var FORTPI = Math.PI / 4; + var srat = _dereq_('../common/srat'); + var HALF_PI = Math.PI / 2; + var MAX_ITER = 20; + exports.init = function () { + var sphi = Math.sin(this.lat0); + var cphi = Math.cos(this.lat0); + cphi *= cphi; + this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); + this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); + this.phic0 = Math.asin(sphi / this.C); + this.ratexp = 0.5 * this.C * this.e; + this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; + p.x = this.C * lon; + return p; + }; + exports.inverse = function (p) { + var DEL_TOL = 1e-14; + var lon = p.x / this.C; + var lat = p.y; + var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); + for (var i = MAX_ITER; i > 0; --i) { + lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI; + if (Math.abs(lat - p.y) < DEL_TOL) { + break; + } + p.y = lat; + } + if (!i) { + return null; + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = ['gauss']; + return exports; + }, + { '../common/srat': 22 } + ], + 46: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var EPSLN = 1e-10; + var asinz = _dereq_('../common/asinz'); + exports.init = function () { + this.sin_p14 = Math.sin(this.lat0); + this.cos_p14 = Math.cos(this.lat0); + this.infinity_dist = 1000 * this.a; + this.rc = 1; + }; + exports.forward = function (p) { + var sinphi, cosphi; + var dlon; + var coslon; + var ksp; + var g; + var x, y; + var lon = p.x; + var lat = p.y; + dlon = adjust_lon(lon - this.long0); + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1; + if (g > 0 || Math.abs(g) <= EPSLN) { + x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; + } else { + x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); + y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + } + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var rh; + var sinc, cosc; + var c; + var lon, lat; + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + p.x /= this.k0; + p.y /= this.k0; + if (rh = Math.sqrt(p.x * p.x + p.y * p.y)) { + c = Math.atan2(rh, this.rc); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = asinz(cosc * this.sin_p14 + p.y * sinc * this.cos_p14 / rh); + lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); + lon = adjust_lon(this.long0 + lon); + } else { + lat = this.phic0; + lon = 0; + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = ['gnom']; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/asinz': 6 + } + ], + 47: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + exports.init = function () { + this.a = 6377397.155; + this.es = 0.006674372230614; + this.e = Math.sqrt(this.es); + if (!this.lat0) { + this.lat0 = 0.863937979737193; + } + if (!this.long0) { + this.long0 = 0.7417649320975901 - 0.308341501185665; + } + if (!this.k0) { + this.k0 = 0.9999; + } + this.s45 = 0.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; + }; + exports.forward = function (p) { + var gfi, u, deltav, s, d, eps, ro; + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + gfi = Math.pow((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat)), this.alfa * this.e / 2); + u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); + deltav = -delta_lon * this.alfa; + s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); + d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); + eps = this.n * d; + ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); + p.y = ro * Math.cos(eps) / 1; + p.x = ro * Math.sin(eps) / 1; + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + return p; + }; + exports.inverse = function (p) { + var u, deltav, s, d, eps, ro, fi1; + var ok; + var tmp = p.x; + p.x = p.y; + p.y = tmp; + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + ro = Math.sqrt(p.x * p.x + p.y * p.y); + eps = Math.atan2(p.y, p.x); + d = eps / Math.sin(this.s0); + s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); + u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); + deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); + p.x = this.long0 - deltav / this.alfa; + fi1 = u; + ok = 0; + var iter = 0; + do { + p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); + if (Math.abs(fi1 - p.y) < 1e-10) { + ok = 1; + } + fi1 = p.y; + iter += 1; + } while (ok === 0 && iter < 15); + if (iter >= 15) { + return null; + } + return p; + }; + exports.names = [ + 'Krovak', + 'krovak' + ]; + return exports; + }, + { '../common/adjust_lon': 5 } + ], + 48: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + var FORTPI = Math.PI / 4; + var EPSLN = 1e-10; + var qsfnz = _dereq_('../common/qsfnz'); + var adjust_lon = _dereq_('../common/adjust_lon'); + exports.S_POLE = 1; + exports.N_POLE = 2; + exports.EQUIT = 3; + exports.OBLIQ = 4; + exports.init = function () { + var t = Math.abs(this.lat0); + if (Math.abs(t - HALF_PI) < EPSLN) { + this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; + } else if (Math.abs(t) < EPSLN) { + this.mode = this.EQUIT; + } else { + this.mode = this.OBLIQ; + } + if (this.es > 0) { + var sinphi; + this.qp = qsfnz(this.e, 1); + this.mmf = 0.5 / (1 - this.es); + this.apa = this.authset(this.es); + switch (this.mode) { + case this.N_POLE: + this.dd = 1; + break; + case this.S_POLE: + this.dd = 1; + break; + case this.EQUIT: + this.rq = Math.sqrt(0.5 * this.qp); + this.dd = 1 / this.rq; + this.xmf = 1; + this.ymf = 0.5 * this.qp; + break; + case this.OBLIQ: + this.rq = Math.sqrt(0.5 * this.qp); + sinphi = Math.sin(this.lat0); + this.sinb1 = qsfnz(this.e, sinphi) / this.qp; + this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); + this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); + this.ymf = (this.xmf = this.rq) / this.dd; + this.xmf *= this.dd; + break; + } + } else { + if (this.mode === this.OBLIQ) { + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + } + }; + exports.forward = function (p) { + var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; + var lam = p.x; + var phi = p.y; + lam = adjust_lon(lam - this.long0); + if (this.sphere) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + coslam = Math.cos(lam); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + y = this.mode === this.EQUIT ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + if (y <= EPSLN) { + return null; + } + y = Math.sqrt(2 / y); + x = y * cosphi * Math.sin(lam); + y *= this.mode === this.EQUIT ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + coslam = -coslam; + } + if (Math.abs(phi + this.phi0) < EPSLN) { + return null; + } + y = FORTPI - phi * 0.5; + y = 2 * (this.mode === this.S_POLE ? Math.cos(y) : Math.sin(y)); + x = y * Math.sin(lam); + y *= coslam; + } + } else { + sinb = 0; + cosb = 0; + b = 0; + coslam = Math.cos(lam); + sinlam = Math.sin(lam); + sinphi = Math.sin(phi); + q = qsfnz(this.e, sinphi); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinb = q / this.qp; + cosb = Math.sqrt(1 - sinb * sinb); + } + switch (this.mode) { + case this.OBLIQ: + b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; + break; + case this.EQUIT: + b = 1 + cosb * coslam; + break; + case this.N_POLE: + b = HALF_PI + phi; + q = this.qp - q; + break; + case this.S_POLE: + b = phi - HALF_PI; + q = this.qp + q; + break; + } + if (Math.abs(b) < EPSLN) { + return null; + } + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + b = Math.sqrt(2 / b); + if (this.mode === this.OBLIQ) { + y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); + } else { + y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; + } + x = this.xmf * b * cosb * sinlam; + break; + case this.N_POLE: + case this.S_POLE: + if (q >= 0) { + x = (b = Math.sqrt(q)) * sinlam; + y = coslam * (this.mode === this.S_POLE ? b : -b); + } else { + x = y = 0; + } + break; + } + } + p.x = this.a * x + this.x0; + p.y = this.a * y + this.y0; + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var lam, phi, cCe, sCe, q, rho, ab; + if (this.sphere) { + var cosz = 0, rh, sinz = 0; + rh = Math.sqrt(x * x + y * y); + phi = rh * 0.5; + if (phi > 1) { + return null; + } + phi = 2 * Math.asin(phi); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinz = Math.sin(phi); + cosz = Math.cos(phi); + } + switch (this.mode) { + case this.EQUIT: + phi = Math.abs(rh) <= EPSLN ? 0 : Math.asin(y * sinz / rh); + x *= sinz; + y = cosz * rh; + break; + case this.OBLIQ: + phi = Math.abs(rh) <= EPSLN ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); + x *= sinz * this.cosph0; + y = (cosz - Math.sin(phi) * this.sinph0) * rh; + break; + case this.N_POLE: + y = -y; + phi = HALF_PI - phi; + break; + case this.S_POLE: + phi -= HALF_PI; + break; + } + lam = y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(x, y); + } else { + ab = 0; + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + x /= this.dd; + y *= this.dd; + rho = Math.sqrt(x * x + y * y); + if (rho < EPSLN) { + p.x = 0; + p.y = this.phi0; + return p; + } + sCe = 2 * Math.asin(0.5 * rho / this.rq); + cCe = Math.cos(sCe); + x *= sCe = Math.sin(sCe); + if (this.mode === this.OBLIQ) { + ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; + q = this.qp * ab; + y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; + } else { + ab = y * sCe / rho; + q = this.qp * ab; + y = rho * cCe; + } + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + y = -y; + } + q = x * x + y * y; + if (!q) { + p.x = 0; + p.y = this.phi0; + return p; + } + ab = 1 - q / this.qp; + if (this.mode === this.S_POLE) { + ab = -ab; + } + } + lam = Math.atan2(x, y); + phi = this.authlat(Math.asin(ab), this.apa); + } + p.x = adjust_lon(this.long0 + lam); + p.y = phi; + return p; + }; + exports.P00 = 0.3333333333333333; + exports.P01 = 0.17222222222222222; + exports.P02 = 0.10257936507936508; + exports.P10 = 0.06388888888888888; + exports.P11 = 0.0664021164021164; + exports.P20 = 0.016415012942191543; + exports.authset = function (es) { + var t; + var APA = []; + APA[0] = es * this.P00; + t = es * es; + APA[0] += t * this.P01; + APA[1] = t * this.P10; + t *= es; + APA[0] += t * this.P02; + APA[1] += t * this.P11; + APA[2] = t * this.P20; + return APA; + }; + exports.authlat = function (beta, APA) { + var t = beta + beta; + return beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t); + }; + exports.names = [ + 'Lambert Azimuthal Equal Area', + 'Lambert_Azimuthal_Equal_Area', + 'laea' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/qsfnz': 20 + } + ], + 49: [ + function (_dereq_, module, exports) { + var EPSLN = 1e-10; + var msfnz = _dereq_('../common/msfnz'); + var tsfnz = _dereq_('../common/tsfnz'); + var HALF_PI = Math.PI / 2; + var sign = _dereq_('../common/sign'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var phi2z = _dereq_('../common/phi2z'); + exports.init = function () { + if (!this.lat2) { + this.lat2 = this.lat1; + } + if (!this.k0) { + this.k0 = 1; + } + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + var temp = this.b / this.a; + this.e = Math.sqrt(1 - temp * temp); + var sin1 = Math.sin(this.lat1); + var cos1 = Math.cos(this.lat1); + var ms1 = msfnz(this.e, sin1, cos1); + var ts1 = tsfnz(this.e, this.lat1, sin1); + var sin2 = Math.sin(this.lat2); + var cos2 = Math.cos(this.lat2); + var ms2 = msfnz(this.e, sin2, cos2); + var ts2 = tsfnz(this.e, this.lat2, sin2); + var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); + } else { + this.ns = sin1; + } + if (isNaN(this.ns)) { + this.ns = sin1; + } + this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); + this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); + if (!this.title) { + this.title = 'Lambert Conformal Conic'; + } + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { + lat = sign(lat) * (HALF_PI - 2 * EPSLN); + } + var con = Math.abs(Math.abs(lat) - HALF_PI); + var ts, rh1; + if (con > EPSLN) { + ts = tsfnz(this.e, lat, Math.sin(lat)); + rh1 = this.a * this.f0 * Math.pow(ts, this.ns); + } else { + con = lat * this.ns; + if (con <= 0) { + return null; + } + rh1 = 0; + } + var theta = this.ns * adjust_lon(lon - this.long0); + p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; + p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; + return p; + }; + exports.inverse = function (p) { + var rh1, con, ts; + var lat, lon; + var x = (p.x - this.x0) / this.k0; + var y = this.rh - (p.y - this.y0) / this.k0; + if (this.ns > 0) { + rh1 = Math.sqrt(x * x + y * y); + con = 1; + } else { + rh1 = -Math.sqrt(x * x + y * y); + con = -1; + } + var theta = 0; + if (rh1 !== 0) { + theta = Math.atan2(con * x, con * y); + } + if (rh1 !== 0 || this.ns > 0) { + con = 1 / this.ns; + ts = Math.pow(rh1 / (this.a * this.f0), con); + lat = phi2z(this.e, ts); + if (lat === -9999) { + return null; + } + } else { + lat = -HALF_PI; + } + lon = adjust_lon(theta / this.ns + this.long0); + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Lambert Tangential Conformal Conic Projection', + 'Lambert_Conformal_Conic', + 'Lambert_Conformal_Conic_2SP', + 'lcc' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/msfnz': 15, + '../common/phi2z': 16, + '../common/sign': 21, + '../common/tsfnz': 24 + } + ], + 50: [ + function (_dereq_, module, exports) { + exports.init = function () { + }; + function identity(pt) { + return pt; + } + exports.forward = identity; + exports.inverse = identity; + exports.names = [ + 'longlat', + 'identity' + ]; + return exports; + }, + {} + ], + 51: [ + function (_dereq_, module, exports) { + var msfnz = _dereq_('../common/msfnz'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var R2D = 57.29577951308232; + var adjust_lon = _dereq_('../common/adjust_lon'); + var FORTPI = Math.PI / 4; + var tsfnz = _dereq_('../common/tsfnz'); + var phi2z = _dereq_('../common/phi2z'); + exports.init = function () { + var con = this.b / this.a; + this.es = 1 - con * con; + if (!('x0' in this)) { + this.x0 = 0; + } + if (!('y0' in this)) { + this.y0 = 0; + } + this.e = Math.sqrt(this.es); + if (this.lat_ts) { + if (this.sphere) { + this.k0 = Math.cos(this.lat_ts); + } else { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } + } else { + if (!this.k0) { + if (this.k) { + this.k0 = this.k; + } else { + this.k0 = 1; + } + } + } + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { + return null; + } + var x, y; + if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + return null; + } else { + if (this.sphere) { + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); + } else { + var sinphi = Math.sin(lat); + var ts = tsfnz(this.e, lat, sinphi); + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 - this.a * this.k0 * Math.log(ts); + } + p.x = x; + p.y = y; + return p; + } + }; + exports.inverse = function (p) { + var x = p.x - this.x0; + var y = p.y - this.y0; + var lon, lat; + if (this.sphere) { + lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); + } else { + var ts = Math.exp(-y / (this.a * this.k0)); + lat = phi2z(this.e, ts); + if (lat === -9999) { + return null; + } + } + lon = adjust_lon(this.long0 + x / (this.a * this.k0)); + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Mercator', + 'Popular Visualisation Pseudo Mercator', + 'Mercator_1SP', + 'Mercator_Auxiliary_Sphere', + 'merc' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/msfnz': 15, + '../common/phi2z': 16, + '../common/tsfnz': 24 + } + ], + 52: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + exports.init = function () { + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var dlon = adjust_lon(lon - this.long0); + var x = this.x0 + this.a * dlon; + var y = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + lat / 2.5)) * 1.25; + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var lon = adjust_lon(this.long0 + p.x / this.a); + var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Miller_Cylindrical', + 'mill' + ]; + return exports; + }, + { '../common/adjust_lon': 5 } + ], + 53: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var EPSLN = 1e-10; + exports.init = function () { + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + var theta = lat; + var con = Math.PI * Math.sin(lat); + for (var i = 0; true; i++) { + var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); + theta += delta_theta; + if (Math.abs(delta_theta) < EPSLN) { + break; + } + } + theta /= 2; + if (Math.PI / 2 - Math.abs(lat) < EPSLN) { + delta_lon = 0; + } + var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; + var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var theta; + var arg; + p.x -= this.x0; + p.y -= this.y0; + arg = p.y / (1.4142135623731 * this.a); + if (Math.abs(arg) > 0.999999999999) { + arg = 0.999999999999; + } + theta = Math.asin(arg); + var lon = adjust_lon(this.long0 + p.x / (0.900316316158 * this.a * Math.cos(theta))); + if (lon < -Math.PI) { + lon = -Math.PI; + } + if (lon > Math.PI) { + lon = Math.PI; + } + arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; + if (Math.abs(arg) > 1) { + arg = 1; + } + var lat = Math.asin(arg); + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Mollweide', + 'moll' + ]; + return exports; + }, + { '../common/adjust_lon': 5 } + ], + 54: [ + function (_dereq_, module, exports) { + var SEC_TO_RAD = 0.00000484813681109536; + exports.iterations = 1; + exports.init = function () { + this.A = []; + this.A[1] = 0.6399175073; + this.A[2] = -0.1358797613; + this.A[3] = 0.063294409; + this.A[4] = -0.02526853; + this.A[5] = 0.0117879; + this.A[6] = -0.0055161; + this.A[7] = 0.0026906; + this.A[8] = -0.001333; + this.A[9] = 0.00067; + this.A[10] = -0.00034; + this.B_re = []; + this.B_im = []; + this.B_re[1] = 0.7557853228; + this.B_im[1] = 0; + this.B_re[2] = 0.249204646; + this.B_im[2] = 0.003371507; + this.B_re[3] = -0.001541739; + this.B_im[3] = 0.04105856; + this.B_re[4] = -0.10162907; + this.B_im[4] = 0.01727609; + this.B_re[5] = -0.26623489; + this.B_im[5] = -0.36249218; + this.B_re[6] = -0.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] = -0.577245789; + this.C_im[2] = -0.007809598; + this.C_re[3] = 0.508307513; + this.C_im[3] = -0.112208952; + this.C_re[4] = -0.15094762; + this.C_im[4] = 0.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] = 0.5185406398; + this.D[3] = -0.03333098; + this.D[4] = -0.1052906; + this.D[5] = -0.0368594; + this.D[6] = 0.007317; + this.D[7] = 0.0122; + this.D[8] = 0.00394; + this.D[9] = -0.0013; + }; + exports.forward = function (p) { + var n; + var lon = p.x; + var lat = p.y; + var delta_lat = lat - this.lat0; + var delta_lon = lon - this.long0; + var d_phi = delta_lat / SEC_TO_RAD * 0.00001; + var d_lambda = delta_lon; + var d_phi_n = 1; + var d_psi = 0; + for (n = 1; n <= 10; n++) { + d_phi_n = d_phi_n * d_phi; + d_psi = d_psi + this.A[n] * d_phi_n; + } + var th_re = d_psi; + var th_im = d_lambda; + var th_n_re = 1; + var th_n_im = 0; + var th_n_re1; + var th_n_im1; + var z_re = 0; + var z_im = 0; + for (n = 1; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; + z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; + } + p.x = z_im * this.a + this.x0; + p.y = z_re * this.a + this.y0; + return p; + }; + exports.inverse = function (p) { + var n; + var x = p.x; + var y = p.y; + var delta_x = x - this.x0; + var delta_y = y - this.y0; + var z_re = delta_y / this.a; + var z_im = delta_x / this.a; + var z_n_re = 1; + var z_n_im = 0; + var z_n_re1; + var z_n_im1; + var th_re = 0; + var th_im = 0; + for (n = 1; n <= 6; n++) { + z_n_re1 = z_n_re * z_re - z_n_im * z_im; + z_n_im1 = z_n_im * z_re + z_n_re * z_im; + z_n_re = z_n_re1; + z_n_im = z_n_im1; + th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; + th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; + } + for (var i = 0; i < this.iterations; i++) { + var th_n_re = th_re; + var th_n_im = th_im; + var th_n_re1; + var th_n_im1; + var num_re = z_re; + var num_im = z_im; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } + th_n_re = 1; + th_n_im = 0; + var den_re = this.B_re[1]; + var den_im = this.B_im[1]; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } + var den2 = den_re * den_re + den_im * den_im; + th_re = (num_re * den_re + num_im * den_im) / den2; + th_im = (num_im * den_re - num_re * den_im) / den2; + } + var d_psi = th_re; + var d_lambda = th_im; + var d_psi_n = 1; + var d_phi = 0; + for (n = 1; n <= 9; n++) { + d_psi_n = d_psi_n * d_psi; + d_phi = d_phi + this.D[n] * d_psi_n; + } + var lat = this.lat0 + d_phi * SEC_TO_RAD * 100000; + var lon = this.long0 + d_lambda; + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'New_Zealand_Map_Grid', + 'nzmg' + ]; + return exports; + }, + {} + ], + 55: [ + function (_dereq_, module, exports) { + var tsfnz = _dereq_('../common/tsfnz'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var phi2z = _dereq_('../common/phi2z'); + var HALF_PI = Math.PI / 2; + var FORTPI = Math.PI / 4; + var EPSLN = 1e-10; + exports.init = function () { + this.no_off = this.no_off || false; + this.no_rot = this.no_rot || false; + if (isNaN(this.k0)) { + this.k0 = 1; + } + var sinlat = Math.sin(this.lat0); + var coslat = Math.cos(this.lat0); + var con = this.e * sinlat; + this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4)); + this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con); + var t0 = tsfnz(this.e, this.lat0, sinlat); + var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con)); + if (dl * dl < 1) { + dl = 1; + } + var fl; + var gl; + if (!isNaN(this.longc)) { + if (this.lat0 >= 0) { + fl = dl + Math.sqrt(dl * dl - 1); + } else { + fl = dl - Math.sqrt(dl * dl - 1); + } + this.el = fl * Math.pow(t0, this.bl); + gl = 0.5 * (fl - 1 / fl); + this.gamma0 = Math.asin(Math.sin(this.alpha) / dl); + this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl; + } else { + var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1)); + var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2)); + if (this.lat0 >= 0) { + this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); + } else { + this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); + } + var hl = Math.pow(t1, this.bl); + var ll = Math.pow(t2, this.bl); + fl = this.el / hl; + gl = 0.5 * (fl - 1 / fl); + var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl); + var pl = (ll - hl) / (ll + hl); + var dlon12 = adjust_lon(this.long1 - this.long2); + this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * dlon12) / pl) / this.bl; + this.long0 = adjust_lon(this.long0); + var dlon10 = adjust_lon(this.long1 - this.long0); + this.gamma0 = Math.atan(Math.sin(this.bl * dlon10) / gl); + this.alpha = Math.asin(dl * Math.sin(this.gamma0)); + } + if (this.no_off) { + this.uc = 0; + } else { + if (this.lat0 >= 0) { + this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); + } else { + this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); + } + } + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var dlon = adjust_lon(lon - this.long0); + var us, vs; + var con; + if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + if (lat > 0) { + con = -1; + } else { + con = 1; + } + vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5)); + us = -1 * con * HALF_PI * this.al / this.bl; + } else { + var t = tsfnz(this.e, lat, Math.sin(lat)); + var ql = this.el / Math.pow(t, this.bl); + var sl = 0.5 * (ql - 1 / ql); + var tl = 0.5 * (ql + 1 / ql); + var vl = Math.sin(this.bl * dlon); + var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl; + if (Math.abs(Math.abs(ul) - 1) <= EPSLN) { + vs = Number.POSITIVE_INFINITY; + } else { + vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl; + } + if (Math.abs(Math.cos(this.bl * dlon)) <= EPSLN) { + us = this.al * this.bl * dlon; + } else { + us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl; + } + } + if (this.no_rot) { + p.x = this.x0 + us; + p.y = this.y0 + vs; + } else { + us -= this.uc; + p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha); + p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha); + } + return p; + }; + exports.inverse = function (p) { + var us, vs; + if (this.no_rot) { + vs = p.y - this.y0; + us = p.x - this.x0; + } else { + vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha); + us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha); + us += this.uc; + } + var qp = Math.exp(-1 * this.bl * vs / this.al); + var sp = 0.5 * (qp - 1 / qp); + var tp = 0.5 * (qp + 1 / qp); + var vp = Math.sin(this.bl * us / this.al); + var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp; + var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl); + if (Math.abs(up - 1) < EPSLN) { + p.x = this.long0; + p.y = HALF_PI; + } else if (Math.abs(up + 1) < EPSLN) { + p.x = this.long0; + p.y = -1 * HALF_PI; + } else { + p.y = phi2z(this.e, ts); + p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl); + } + return p; + }; + exports.names = [ + 'Hotine_Oblique_Mercator', + 'Hotine Oblique Mercator', + 'Hotine_Oblique_Mercator_Azimuth_Natural_Origin', + 'Hotine_Oblique_Mercator_Azimuth_Center', + 'omerc' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/phi2z': 16, + '../common/tsfnz': 24 + } + ], + 56: [ + function (_dereq_, module, exports) { + var e0fn = _dereq_('../common/e0fn'); + var e1fn = _dereq_('../common/e1fn'); + var e2fn = _dereq_('../common/e2fn'); + var e3fn = _dereq_('../common/e3fn'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var adjust_lat = _dereq_('../common/adjust_lat'); + var mlfn = _dereq_('../common/mlfn'); + var EPSLN = 1e-10; + var gN = _dereq_('../common/gN'); + var MAX_ITER = 20; + exports.init = function () { + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); + this.e = Math.sqrt(this.es); + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var x, y, el; + var dlon = adjust_lon(lon - this.long0); + el = dlon * Math.sin(lat); + if (this.sphere) { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.a * this.lat0; + } else { + x = this.a * Math.sin(el) / Math.tan(lat); + y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); + } + } else { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.ml0; + } else { + var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); + x = nl * Math.sin(el); + y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); + } + } + p.x = x + this.x0; + p.y = y + this.y0; + return p; + }; + exports.inverse = function (p) { + var lon, lat, x, y, i; + var al, bl; + var phi, dphi; + x = p.x - this.x0; + y = p.y - this.y0; + if (this.sphere) { + if (Math.abs(y + this.a * this.lat0) <= EPSLN) { + lon = adjust_lon(x / this.a + this.long0); + lat = 0; + } else { + al = this.lat0 + y / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var tanphi; + for (i = MAX_ITER; i; --i) { + tanphi = Math.tan(phi); + dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); + phi += dphi; + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } + lon = adjust_lon(this.long0 + Math.asin(x * Math.tan(phi) / this.a) / Math.sin(lat)); + } + } else { + if (Math.abs(y + this.ml0) <= EPSLN) { + lat = 0; + lon = adjust_lon(this.long0 + x / this.a); + } else { + al = (this.ml0 + y) / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var cl, mln, mlnp, ma; + var con; + for (i = MAX_ITER; i; --i) { + con = this.e * Math.sin(phi); + cl = Math.sqrt(1 - con * con) * Math.tan(phi); + mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); + ma = mln / this.a; + dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); + phi -= dphi; + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } + cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); + lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); + } + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Polyconic', + 'poly' + ]; + return exports; + }, + { + '../common/adjust_lat': 4, + '../common/adjust_lon': 5, + '../common/e0fn': 7, + '../common/e1fn': 8, + '../common/e2fn': 9, + '../common/e3fn': 10, + '../common/gN': 11, + '../common/mlfn': 14 + } + ], + 57: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var adjust_lat = _dereq_('../common/adjust_lat'); + var pj_enfn = _dereq_('../common/pj_enfn'); + var MAX_ITER = 20; + var pj_mlfn = _dereq_('../common/pj_mlfn'); + var pj_inv_mlfn = _dereq_('../common/pj_inv_mlfn'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var asinz = _dereq_('../common/asinz'); + exports.init = function () { + if (!this.sphere) { + this.en = pj_enfn(this.es); + } else { + this.n = 1; + this.m = 0; + this.es = 0; + this.C_y = Math.sqrt((this.m + 1) / this.n); + this.C_x = this.C_y / (this.m + 1); + } + }; + exports.forward = function (p) { + var x, y; + var lon = p.x; + var lat = p.y; + lon = adjust_lon(lon - this.long0); + if (this.sphere) { + if (!this.m) { + lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; + } else { + var k = this.n * Math.sin(lat); + for (var i = MAX_ITER; i; --i) { + var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); + lat -= V; + if (Math.abs(V) < EPSLN) { + break; + } + } + } + x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); + y = this.a * this.C_y * lat; + } else { + var s = Math.sin(lat); + var c = Math.cos(lat); + y = this.a * pj_mlfn(lat, s, c, this.en); + x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); + } + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var lat, temp, lon, s; + p.x -= this.x0; + lon = p.x / this.a; + p.y -= this.y0; + lat = p.y / this.a; + if (this.sphere) { + lat /= this.C_y; + lon = lon / (this.C_x * (this.m + Math.cos(lat))); + if (this.m) { + lat = asinz((this.m * lat + Math.sin(lat)) / this.n); + } else if (this.n !== 1) { + lat = asinz(Math.sin(lat) / this.n); + } + lon = adjust_lon(lon + this.long0); + lat = adjust_lat(lat); + } else { + lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); + s = Math.abs(lat); + if (s < HALF_PI) { + s = Math.sin(lat); + temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); + lon = adjust_lon(temp); + } else if (s - EPSLN < HALF_PI) { + lon = this.long0; + } + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Sinusoidal', + 'sinu' + ]; + return exports; + }, + { + '../common/adjust_lat': 4, + '../common/adjust_lon': 5, + '../common/asinz': 6, + '../common/pj_enfn': 17, + '../common/pj_inv_mlfn': 18, + '../common/pj_mlfn': 19 + } + ], + 58: [ + function (_dereq_, module, exports) { + exports.init = function () { + var phy0 = this.lat0; + this.lambda0 = this.long0; + var sinPhy0 = Math.sin(phy0); + var semiMajorAxis = this.a; + var invF = this.rf; + var flattening = 1 / invF; + var e2 = 2 * flattening - Math.pow(flattening, 2); + var e = this.e = Math.sqrt(e2); + this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); + this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); + this.b0 = Math.asin(sinPhy0 / this.alpha); + var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); + var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); + var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); + this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; + }; + exports.forward = function (p) { + var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); + var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); + var S = -this.alpha * (Sa1 + Sa2) + this.K; + var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); + var I = this.alpha * (p.x - this.lambda0); + var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); + var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); + p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; + p.x = this.R * rotI + this.x0; + return p; + }; + exports.inverse = function (p) { + var Y = p.x - this.x0; + var X = p.y - this.y0; + var rotI = Y / this.R; + var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); + var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); + var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); + var lambda = this.lambda0 + I / this.alpha; + var S = 0; + var phy = b; + var prevPhy = -1000; + var iteration = 0; + while (Math.abs(phy - prevPhy) > 1e-7) { + if (++iteration > 20) { + return; + } + S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); + prevPhy = phy; + phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; + } + p.x = lambda; + p.y = phy; + return p; + }; + exports.names = ['somerc']; + return exports; + }, + {} + ], + 59: [ + function (_dereq_, module, exports) { + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var sign = _dereq_('../common/sign'); + var msfnz = _dereq_('../common/msfnz'); + var tsfnz = _dereq_('../common/tsfnz'); + var phi2z = _dereq_('../common/phi2z'); + var adjust_lon = _dereq_('../common/adjust_lon'); + exports.ssfn_ = function (phit, sinphi, eccen) { + sinphi *= eccen; + return Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen); + }; + exports.init = function () { + this.coslat0 = Math.cos(this.lat0); + this.sinlat0 = Math.sin(this.lat0); + if (this.sphere) { + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); + } + } else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (this.lat0 > 0) { + this.con = 1; + } else { + this.con = -1; + } + } + this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); + } + this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); + this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; + this.cosX0 = Math.cos(this.X0); + this.sinX0 = Math.sin(this.X0); + } + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var sinlat = Math.sin(lat); + var coslat = Math.cos(lat); + var A, X, sinX, cosX, ts, rh; + var dlon = adjust_lon(lon - this.long0); + if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { + p.x = NaN; + p.y = NaN; + return p; + } + if (this.sphere) { + A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); + p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; + p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; + return p; + } else { + X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; + cosX = Math.cos(X); + sinX = Math.sin(X); + if (Math.abs(this.coslat0) <= EPSLN) { + ts = tsfnz(this.e, lat * this.con, this.con * sinlat); + rh = 2 * this.a * this.k0 * ts / this.cons; + p.x = this.x0 + rh * Math.sin(lon - this.long0); + p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); + return p; + } else if (Math.abs(this.sinlat0) < EPSLN) { + A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); + p.y = A * sinX; + } else { + A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); + p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; + } + p.x = A * cosX * Math.sin(dlon) + this.x0; + } + return p; + }; + exports.inverse = function (p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat, ts, ce, Chi; + var rh = Math.sqrt(p.x * p.x + p.y * p.y); + if (this.sphere) { + var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0)); + lon = this.long0; + lat = this.lat0; + if (rh <= EPSLN) { + p.x = lon; + p.y = lat; + return p; + } + lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); + if (Math.abs(this.coslat0) < EPSLN) { + if (this.lat0 > 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); + } else { + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + } + } else { + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); + } + p.x = lon; + p.y = lat; + return p; + } else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (rh <= EPSLN) { + lat = this.lat0; + lon = this.long0; + p.x = lon; + p.y = lat; + return p; + } + p.x *= this.con; + p.y *= this.con; + ts = rh * this.cons / (2 * this.a * this.k0); + lat = this.con * phi2z(this.e, ts); + lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y)); + } else { + ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); + lon = this.long0; + if (rh <= EPSLN) { + Chi = this.X0; + } else { + Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); + } + lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); + } + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = ['stere']; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/msfnz': 15, + '../common/phi2z': 16, + '../common/sign': 21, + '../common/tsfnz': 24 + } + ], + 60: [ + function (_dereq_, module, exports) { + var gauss = _dereq_('./gauss'); + var adjust_lon = _dereq_('../common/adjust_lon'); + exports.init = function () { + gauss.init.apply(this); + if (!this.rc) { + return; + } + this.sinc0 = Math.sin(this.phic0); + this.cosc0 = Math.cos(this.phic0); + this.R2 = 2 * this.rc; + if (!this.title) { + this.title = 'Oblique Stereographic Alternative'; + } + }; + exports.forward = function (p) { + var sinc, cosc, cosl, k; + p.x = adjust_lon(p.x - this.long0); + gauss.forward.apply(this, [p]); + sinc = Math.sin(p.y); + cosc = Math.cos(p.y); + cosl = Math.cos(p.x); + k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); + p.x = k * cosc * Math.sin(p.x); + p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); + p.x = this.a * p.x + this.x0; + p.y = this.a * p.y + this.y0; + return p; + }; + exports.inverse = function (p) { + var sinc, cosc, lon, lat, rho; + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + p.x /= this.k0; + p.y /= this.k0; + if (rho = Math.sqrt(p.x * p.x + p.y * p.y)) { + var c = 2 * Math.atan2(rho, this.R2); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); + lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); + } else { + lat = this.phic0; + lon = 0; + } + p.x = lon; + p.y = lat; + gauss.inverse.apply(this, [p]); + p.x = adjust_lon(p.x + this.long0); + return p; + }; + exports.names = [ + 'Stereographic_North_Pole', + 'Oblique_Stereographic', + 'Polar_Stereographic', + 'sterea', + 'Oblique Stereographic Alternative' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + './gauss': 45 + } + ], + 61: [ + function (_dereq_, module, exports) { + var e0fn = _dereq_('../common/e0fn'); + var e1fn = _dereq_('../common/e1fn'); + var e2fn = _dereq_('../common/e2fn'); + var e3fn = _dereq_('../common/e3fn'); + var mlfn = _dereq_('../common/mlfn'); + var adjust_lon = _dereq_('../common/adjust_lon'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var sign = _dereq_('../common/sign'); + var asinz = _dereq_('../common/asinz'); + exports.init = function () { + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + var con; + var x, y; + var sin_phi = Math.sin(lat); + var cos_phi = Math.cos(lat); + if (this.sphere) { + var b = cos_phi * Math.sin(delta_lon); + if (Math.abs(Math.abs(b) - 1) < 1e-10) { + return 93; + } else { + x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)); + con = Math.acos(cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - b * b)); + if (lat < 0) { + con = -con; + } + y = this.a * this.k0 * (con - this.lat0); + } + } else { + var al = cos_phi * delta_lon; + var als = Math.pow(al, 2); + var c = this.ep2 * Math.pow(cos_phi, 2); + var tq = Math.tan(lat); + var t = Math.pow(tq, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + var n = this.a / Math.sqrt(con); + var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat); + x = this.k0 * n * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + Math.pow(t, 2) + 72 * c - 58 * this.ep2))) + this.x0; + y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24 * (5 - t + 9 * c + 4 * Math.pow(c, 2) + als / 30 * (61 - 58 * t + Math.pow(t, 2) + 600 * c - 330 * this.ep2))))) + this.y0; + } + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var con, phi; + var delta_phi; + var i; + var max_iter = 6; + var lat, lon; + if (this.sphere) { + var f = Math.exp(p.x / (this.a * this.k0)); + var g = 0.5 * (f - 1 / f); + var temp = this.lat0 + p.y / (this.a * this.k0); + var h = Math.cos(temp); + con = Math.sqrt((1 - h * h) / (1 + g * g)); + lat = asinz(con); + if (temp < 0) { + lat = -lat; + } + if (g === 0 && h === 0) { + lon = this.long0; + } else { + lon = adjust_lon(Math.atan2(g, h) + this.long0); + } + } else { + var x = p.x - this.x0; + var y = p.y - this.y0; + con = (this.ml0 + y / this.k0) / this.a; + phi = con; + for (i = 0; true; i++) { + delta_phi = (con + this.e1 * Math.sin(2 * phi) - this.e2 * Math.sin(4 * phi) + this.e3 * Math.sin(6 * phi)) / this.e0 - phi; + phi += delta_phi; + if (Math.abs(delta_phi) <= EPSLN) { + break; + } + if (i >= max_iter) { + return 95; + } + } + if (Math.abs(phi) < HALF_PI) { + var sin_phi = Math.sin(phi); + var cos_phi = Math.cos(phi); + var tan_phi = Math.tan(phi); + var c = this.ep2 * Math.pow(cos_phi, 2); + var cs = Math.pow(c, 2); + var t = Math.pow(tan_phi, 2); + var ts = Math.pow(t, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + var n = this.a / Math.sqrt(con); + var r = n * (1 - this.es) / con; + var d = x / (n * this.k0); + var ds = Math.pow(d, 2); + lat = phi - n * tan_phi * ds / r * (0.5 - ds / 24 * (5 + 3 * t + 10 * c - 4 * cs - 9 * this.ep2 - ds / 30 * (61 + 90 * t + 298 * c + 45 * ts - 252 * this.ep2 - 3 * cs))); + lon = adjust_lon(this.long0 + d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 - 2 * c + 28 * t - 3 * cs + 8 * this.ep2 + 24 * ts))) / cos_phi); + } else { + lat = HALF_PI * sign(y); + lon = this.long0; + } + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Transverse_Mercator', + 'Transverse Mercator', + 'tmerc' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/asinz': 6, + '../common/e0fn': 7, + '../common/e1fn': 8, + '../common/e2fn': 9, + '../common/e3fn': 10, + '../common/mlfn': 14, + '../common/sign': 21 + } + ], + 62: [ + function (_dereq_, module, exports) { + var D2R = 0.017453292519943295; + var tmerc = _dereq_('./tmerc'); + exports.dependsOn = 'tmerc'; + exports.init = function () { + if (!this.zone) { + return; + } + this.lat0 = 0; + this.long0 = (6 * Math.abs(this.zone) - 183) * D2R; + this.x0 = 500000; + this.y0 = this.utmSouth ? 10000000 : 0; + this.k0 = 0.9996; + tmerc.init.apply(this); + this.forward = tmerc.forward; + this.inverse = tmerc.inverse; + }; + exports.names = [ + 'Universal Transverse Mercator System', + 'utm' + ]; + return exports; + }, + { './tmerc': 61 } + ], + 63: [ + function (_dereq_, module, exports) { + var adjust_lon = _dereq_('../common/adjust_lon'); + var HALF_PI = Math.PI / 2; + var EPSLN = 1e-10; + var asinz = _dereq_('../common/asinz'); + exports.init = function () { + this.R = this.a; + }; + exports.forward = function (p) { + var lon = p.x; + var lat = p.y; + var dlon = adjust_lon(lon - this.long0); + var x, y; + if (Math.abs(lat) <= EPSLN) { + x = this.x0 + this.R * dlon; + y = this.y0; + } + var theta = asinz(2 * Math.abs(lat / Math.PI)); + if (Math.abs(dlon) <= EPSLN || Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + x = this.x0; + if (lat >= 0) { + y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); + } else { + y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); + } + } + var al = 0.5 * Math.abs(Math.PI / dlon - dlon / Math.PI); + var asq = al * al; + var sinth = Math.sin(theta); + var costh = Math.cos(theta); + var g = costh / (sinth + costh - 1); + var gsq = g * g; + var m = g * (2 / sinth - 1); + var msq = m * m; + var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); + if (dlon < 0) { + con = -con; + } + x = this.x0 + con; + var q = asq + g; + con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); + if (lat >= 0) { + y = this.y0 + con; + } else { + y = this.y0 - con; + } + p.x = x; + p.y = y; + return p; + }; + exports.inverse = function (p) { + var lon, lat; + var xx, yy, xys, c1, c2, c3; + var a1; + var m1; + var con; + var th1; + var d; + p.x -= this.x0; + p.y -= this.y0; + con = Math.PI * this.R; + xx = p.x / con; + yy = p.y / con; + xys = xx * xx + yy * yy; + c1 = -Math.abs(yy) * (1 + xys); + c2 = c1 - 2 * yy * yy + xx * xx; + c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; + d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; + a1 = (c1 - c2 * c2 / 3 / c3) / c3; + m1 = 2 * Math.sqrt(-a1 / 3); + con = 3 * d / a1 / m1; + if (Math.abs(con) > 1) { + if (con >= 0) { + con = 1; + } else { + con = -1; + } + } + th1 = Math.acos(con) / 3; + if (p.y >= 0) { + lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } else { + lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } + if (Math.abs(xx) < EPSLN) { + lon = this.long0; + } else { + lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); + } + p.x = lon; + p.y = lat; + return p; + }; + exports.names = [ + 'Van_der_Grinten_I', + 'VanDerGrinten', + 'vandg' + ]; + return exports; + }, + { + '../common/adjust_lon': 5, + '../common/asinz': 6 + } + ], + 64: [ + function (_dereq_, module, exports) { + var D2R = 0.017453292519943295; + var R2D = 57.29577951308232; + var PJD_3PARAM = 1; + var PJD_7PARAM = 2; + var datum_transform = _dereq_('./datum_transform'); + var adjust_axis = _dereq_('./adjust_axis'); + var proj = _dereq_('./Proj'); + var toPoint = _dereq_('./common/toPoint'); + module.exports = function transform(source, dest, point) { + var wgs84; + if (Array.isArray(point)) { + point = toPoint(point); + } + function checkNotWGS(source, dest) { + return (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84'; + } + if (source.datum && dest.datum && (checkNotWGS(source, dest) || checkNotWGS(dest, source))) { + wgs84 = new proj('WGS84'); + transform(source, wgs84, point); + source = wgs84; + } + if (source.axis !== 'enu') { + adjust_axis(source, false, point); + } + if (source.projName === 'longlat') { + point.x *= D2R; + point.y *= D2R; + } else { + if (source.to_meter) { + point.x *= source.to_meter; + point.y *= source.to_meter; + } + source.inverse(point); + } + if (source.from_greenwich) { + point.x += source.from_greenwich; + } + point = datum_transform(source.datum, dest.datum, point); + if (dest.from_greenwich) { + point.x -= dest.from_greenwich; + } + if (dest.projName === 'longlat') { + point.x *= R2D; + point.y *= R2D; + } else { + dest.forward(point); + if (dest.to_meter) { + point.x /= dest.to_meter; + point.y /= dest.to_meter; + } + } + if (dest.axis !== 'enu') { + adjust_axis(dest, true, point); + } + return point; + }; + return exports; + }, + { + './Proj': 2, + './adjust_axis': 3, + './common/toPoint': 23, + './datum_transform': 30 + } + ], + 65: [ + function (_dereq_, module, exports) { + var D2R = 0.017453292519943295; + var extend = _dereq_('./extend'); + function mapit(obj, key, v) { + obj[key] = v.map(function (aa) { + var o = {}; + sExpr(aa, o); + return o; + }).reduce(function (a, b) { + return extend(a, b); + }, {}); + } + function sExpr(v, obj) { + var key; + if (!Array.isArray(v)) { + obj[v] = true; + return; + } else { + key = v.shift(); + if (key === 'PARAMETER') { + key = v.shift(); + } + if (v.length === 1) { + if (Array.isArray(v[0])) { + obj[key] = {}; + sExpr(v[0], obj[key]); + } else { + obj[key] = v[0]; + } + } else if (!v.length) { + obj[key] = true; + } else if (key === 'TOWGS84') { + obj[key] = v; + } else { + obj[key] = {}; + if ([ + 'UNIT', + 'PRIMEM', + 'VERT_DATUM' + ].indexOf(key) > -1) { + obj[key] = { + name: v[0].toLowerCase(), + convert: v[1] + }; + if (v.length === 3) { + obj[key].auth = v[2]; + } + } else if (key === 'SPHEROID') { + obj[key] = { + name: v[0], + a: v[1], + rf: v[2] + }; + if (v.length === 4) { + obj[key].auth = v[3]; + } + } else if ([ + 'GEOGCS', + 'GEOCCS', + 'DATUM', + 'VERT_CS', + 'COMPD_CS', + 'LOCAL_CS', + 'FITTED_CS', + 'LOCAL_DATUM' + ].indexOf(key) > -1) { + v[0] = [ + 'name', + v[0] + ]; + mapit(obj, key, v); + } else if (v.every(function (aa) { + return Array.isArray(aa); + })) { + mapit(obj, key, v); + } else { + sExpr(v, obj[key]); + } + } + } + } + function rename(obj, params) { + var outName = params[0]; + var inName = params[1]; + if (!(outName in obj) && inName in obj) { + obj[outName] = obj[inName]; + if (params.length === 3) { + obj[outName] = params[2](obj[outName]); + } + } + } + function d2r(input) { + return input * D2R; + } + function cleanWKT(wkt) { + if (wkt.type === 'GEOGCS') { + wkt.projName = 'longlat'; + } else if (wkt.type === 'LOCAL_CS') { + wkt.projName = 'identity'; + wkt.local = true; + } else { + if (typeof wkt.PROJECTION === 'object') { + wkt.projName = Object.keys(wkt.PROJECTION)[0]; + } else { + wkt.projName = wkt.PROJECTION; + } + } + if (wkt.UNIT) { + wkt.units = wkt.UNIT.name.toLowerCase(); + if (wkt.units === 'metre') { + wkt.units = 'meter'; + } + if (wkt.UNIT.convert) { + wkt.to_meter = parseFloat(wkt.UNIT.convert, 10); + } + } + if (wkt.GEOGCS) { + if (wkt.GEOGCS.DATUM) { + wkt.datumCode = wkt.GEOGCS.DATUM.name.toLowerCase(); + } else { + wkt.datumCode = wkt.GEOGCS.name.toLowerCase(); + } + if (wkt.datumCode.slice(0, 2) === 'd_') { + wkt.datumCode = wkt.datumCode.slice(2); + } + if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { + wkt.datumCode = 'nzgd49'; + } + if (wkt.datumCode === 'wgs_1984') { + if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { + wkt.sphere = true; + } + wkt.datumCode = 'wgs84'; + } + if (wkt.datumCode.slice(-6) === '_ferro') { + wkt.datumCode = wkt.datumCode.slice(0, -6); + } + if (wkt.datumCode.slice(-8) === '_jakarta') { + wkt.datumCode = wkt.datumCode.slice(0, -8); + } + if (~wkt.datumCode.indexOf('belge')) { + wkt.datumCode = 'rnb72'; + } + if (wkt.GEOGCS.DATUM && wkt.GEOGCS.DATUM.SPHEROID) { + wkt.ellps = wkt.GEOGCS.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); + if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { + wkt.ellps = 'intl'; + } + wkt.a = wkt.GEOGCS.DATUM.SPHEROID.a; + wkt.rf = parseFloat(wkt.GEOGCS.DATUM.SPHEROID.rf, 10); + } + if (~wkt.datumCode.indexOf('osgb_1936')) { + wkt.datumCode = 'osgb36'; + } + } + if (wkt.b && !isFinite(wkt.b)) { + wkt.b = wkt.a; + } + function toMeter(input) { + var ratio = wkt.to_meter || 1; + return parseFloat(input, 10) * ratio; + } + var renamer = function (a) { + return rename(wkt, a); + }; + var list = [ + [ + 'standard_parallel_1', + 'Standard_Parallel_1' + ], + [ + 'standard_parallel_2', + 'Standard_Parallel_2' + ], + [ + 'false_easting', + 'False_Easting' + ], + [ + 'false_northing', + 'False_Northing' + ], + [ + 'central_meridian', + 'Central_Meridian' + ], + [ + 'latitude_of_origin', + 'Latitude_Of_Origin' + ], + [ + 'scale_factor', + 'Scale_Factor' + ], + [ + 'k0', + 'scale_factor' + ], + [ + 'latitude_of_center', + 'Latitude_of_center' + ], + [ + 'lat0', + 'latitude_of_center', + d2r + ], + [ + 'longitude_of_center', + 'Longitude_Of_Center' + ], + [ + 'longc', + 'longitude_of_center', + d2r + ], + [ + 'x0', + 'false_easting', + toMeter + ], + [ + 'y0', + 'false_northing', + toMeter + ], + [ + 'long0', + 'central_meridian', + d2r + ], + [ + 'lat0', + 'latitude_of_origin', + d2r + ], + [ + 'lat0', + 'standard_parallel_1', + d2r + ], + [ + 'lat1', + 'standard_parallel_1', + d2r + ], + [ + 'lat2', + 'standard_parallel_2', + d2r + ], + [ + 'alpha', + 'azimuth', + d2r + ], + [ + 'srsCode', + 'name' + ] + ]; + list.forEach(renamer); + if (!wkt.long0 && wkt.longc && (wkt.PROJECTION === 'Albers_Conic_Equal_Area' || wkt.PROJECTION === 'Lambert_Azimuthal_Equal_Area')) { + wkt.long0 = wkt.longc; + } + } + module.exports = function (wkt, self) { + var lisp = JSON.parse((',' + wkt).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g, ',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g, ',"$1"]')); + var type = lisp.shift(); + var name = lisp.shift(); + lisp.unshift([ + 'name', + name + ]); + lisp.unshift([ + 'type', + type + ]); + lisp.unshift('output'); + var obj = {}; + sExpr(lisp, obj); + cleanWKT(obj.output); + return extend(self, obj.output); + }; + return exports; + }, + { './extend': 33 } + ], + 66: [ + function (_dereq_, module, exports) { + var NUM_100K_SETS = 6; + var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; + var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; + var A = 65; + var I = 73; + var O = 79; + var V = 86; + var Z = 90; + exports.forward = function (ll, accuracy) { + accuracy = accuracy || 5; + return encode(LLtoUTM({ + lat: ll[1], + lon: ll[0] + }), accuracy); + }; + exports.inverse = function (mgrs) { + var bbox = UTMtoLL(decode(mgrs.toUpperCase())); + return [ + bbox.left, + bbox.bottom, + bbox.right, + bbox.top + ]; + }; + exports.toPoint = function (mgrsStr) { + var llbbox = exports.inverse(mgrsStr); + return [ + (llbbox[2] + llbbox[0]) / 2, + (llbbox[3] + llbbox[1]) / 2 + ]; + }; + function degToRad(deg) { + return deg * (Math.PI / 180); + } + function radToDeg(rad) { + return 180 * (rad / Math.PI); + } + function LLtoUTM(ll) { + var Lat = ll.lat; + var Long = ll.lon; + var a = 6378137; + var eccSquared = 0.00669438; + var k0 = 0.9996; + var LongOrigin; + var eccPrimeSquared; + var N, T, C, A, M; + var LatRad = degToRad(Lat); + var LongRad = degToRad(Long); + var LongOriginRad; + var ZoneNumber; + ZoneNumber = Math.floor((Long + 180) / 6) + 1; + if (Long === 180) { + ZoneNumber = 60; + } + if (Lat >= 56 && Lat < 64 && Long >= 3 && Long < 12) { + ZoneNumber = 32; + } + if (Lat >= 72 && Lat < 84) { + if (Long >= 0 && Long < 9) { + ZoneNumber = 31; + } else if (Long >= 9 && Long < 21) { + ZoneNumber = 33; + } else if (Long >= 21 && Long < 33) { + ZoneNumber = 35; + } else if (Long >= 33 && Long < 42) { + ZoneNumber = 37; + } + } + LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; + LongOriginRad = degToRad(LongOrigin); + eccPrimeSquared = eccSquared / (1 - eccSquared); + N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); + T = Math.tan(LatRad) * Math.tan(LatRad); + C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); + A = Math.cos(LatRad) * (LongRad - LongOriginRad); + M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - 35 * eccSquared * eccSquared * eccSquared / 3072 * Math.sin(6 * LatRad)); + var UTMEasting = k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + 500000; + var UTMNorthing = k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)); + if (Lat < 0) { + UTMNorthing += 10000000; + } + return { + northing: Math.round(UTMNorthing), + easting: Math.round(UTMEasting), + zoneNumber: ZoneNumber, + zoneLetter: getLetterDesignator(Lat) + }; + } + function UTMtoLL(utm) { + var UTMNorthing = utm.northing; + var UTMEasting = utm.easting; + var zoneLetter = utm.zoneLetter; + var zoneNumber = utm.zoneNumber; + if (zoneNumber < 0 || zoneNumber > 60) { + return null; + } + var k0 = 0.9996; + var a = 6378137; + var eccSquared = 0.00669438; + var eccPrimeSquared; + var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); + var N1, T1, C1, R1, D, M; + var LongOrigin; + var mu, phi1Rad; + var x = UTMEasting - 500000; + var y = UTMNorthing; + if (zoneLetter < 'N') { + y -= 10000000; + } + LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; + eccPrimeSquared = eccSquared / (1 - eccSquared); + M = y / k0; + mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); + phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + 151 * e1 * e1 * e1 / 96 * Math.sin(6 * mu); + N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); + T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); + C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); + R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); + D = x / (N1 * k0); + var lat = phi1Rad - N1 * Math.tan(phi1Rad) / R1 * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); + lat = radToDeg(lat); + var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); + lon = LongOrigin + radToDeg(lon); + var result; + if (utm.accuracy) { + var topRight = UTMtoLL({ + northing: utm.northing + utm.accuracy, + easting: utm.easting + utm.accuracy, + zoneLetter: utm.zoneLetter, + zoneNumber: utm.zoneNumber + }); + result = { + top: topRight.lat, + right: topRight.lon, + bottom: lat, + left: lon + }; + } else { + result = { + lat: lat, + lon: lon + }; + } + return result; + } + function getLetterDesignator(lat) { + var LetterDesignator = 'Z'; + if (84 >= lat && lat >= 72) { + LetterDesignator = 'X'; + } else if (72 > lat && lat >= 64) { + LetterDesignator = 'W'; + } else if (64 > lat && lat >= 56) { + LetterDesignator = 'V'; + } else if (56 > lat && lat >= 48) { + LetterDesignator = 'U'; + } else if (48 > lat && lat >= 40) { + LetterDesignator = 'T'; + } else if (40 > lat && lat >= 32) { + LetterDesignator = 'S'; + } else if (32 > lat && lat >= 24) { + LetterDesignator = 'R'; + } else if (24 > lat && lat >= 16) { + LetterDesignator = 'Q'; + } else if (16 > lat && lat >= 8) { + LetterDesignator = 'P'; + } else if (8 > lat && lat >= 0) { + LetterDesignator = 'N'; + } else if (0 > lat && lat >= -8) { + LetterDesignator = 'M'; + } else if (-8 > lat && lat >= -16) { + LetterDesignator = 'L'; + } else if (-16 > lat && lat >= -24) { + LetterDesignator = 'K'; + } else if (-24 > lat && lat >= -32) { + LetterDesignator = 'J'; + } else if (-32 > lat && lat >= -40) { + LetterDesignator = 'H'; + } else if (-40 > lat && lat >= -48) { + LetterDesignator = 'G'; + } else if (-48 > lat && lat >= -56) { + LetterDesignator = 'F'; + } else if (-56 > lat && lat >= -64) { + LetterDesignator = 'E'; + } else if (-64 > lat && lat >= -72) { + LetterDesignator = 'D'; + } else if (-72 > lat && lat >= -80) { + LetterDesignator = 'C'; + } + return LetterDesignator; + } + function encode(utm, accuracy) { + var seasting = '' + utm.easting, snorthing = '' + utm.northing; + return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); + } + function get100kID(easting, northing, zoneNumber) { + var setParm = get100kSetForZone(zoneNumber); + var setColumn = Math.floor(easting / 100000); + var setRow = Math.floor(northing / 100000) % 20; + return getLetter100kID(setColumn, setRow, setParm); + } + function get100kSetForZone(i) { + var setParm = i % NUM_100K_SETS; + if (setParm === 0) { + setParm = NUM_100K_SETS; + } + return setParm; + } + function getLetter100kID(column, row, parm) { + var index = parm - 1; + var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); + var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); + var colInt = colOrigin + column - 1; + var rowInt = rowOrigin + row; + var rollover = false; + if (colInt > Z) { + colInt = colInt - Z + A - 1; + rollover = true; + } + if (colInt === I || colOrigin < I && colInt > I || (colInt > I || colOrigin < I) && rollover) { + colInt++; + } + if (colInt === O || colOrigin < O && colInt > O || (colInt > O || colOrigin < O) && rollover) { + colInt++; + if (colInt === I) { + colInt++; + } + } + if (colInt > Z) { + colInt = colInt - Z + A - 1; + } + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + rollover = true; + } else { + rollover = false; + } + if (rowInt === I || rowOrigin < I && rowInt > I || (rowInt > I || rowOrigin < I) && rollover) { + rowInt++; + } + if (rowInt === O || rowOrigin < O && rowInt > O || (rowInt > O || rowOrigin < O) && rollover) { + rowInt++; + if (rowInt === I) { + rowInt++; + } + } + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + } + var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); + return twoLetter; + } + function decode(mgrsString) { + if (mgrsString && mgrsString.length === 0) { + throw 'MGRSPoint coverting from nothing'; + } + var length = mgrsString.length; + var hunK = null; + var sb = ''; + var testChar; + var i = 0; + while (!/[A-Z]/.test(testChar = mgrsString.charAt(i))) { + if (i >= 2) { + throw 'MGRSPoint bad conversion from: ' + mgrsString; + } + sb += testChar; + i++; + } + var zoneNumber = parseInt(sb, 10); + if (i === 0 || i + 3 > length) { + throw 'MGRSPoint bad conversion from: ' + mgrsString; + } + var zoneLetter = mgrsString.charAt(i++); + if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { + throw 'MGRSPoint zone letter ' + zoneLetter + ' not handled: ' + mgrsString; + } + hunK = mgrsString.substring(i, i += 2); + var set = get100kSetForZone(zoneNumber); + var east100k = getEastingFromChar(hunK.charAt(0), set); + var north100k = getNorthingFromChar(hunK.charAt(1), set); + while (north100k < getMinNorthing(zoneLetter)) { + north100k += 2000000; + } + var remainder = length - i; + if (remainder % 2 !== 0) { + throw 'MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters' + mgrsString; + } + var sep = remainder / 2; + var sepEasting = 0; + var sepNorthing = 0; + var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; + if (sep > 0) { + accuracyBonus = 100000 / Math.pow(10, sep); + sepEastingString = mgrsString.substring(i, i + sep); + sepEasting = parseFloat(sepEastingString) * accuracyBonus; + sepNorthingString = mgrsString.substring(i + sep); + sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; + } + easting = sepEasting + east100k; + northing = sepNorthing + north100k; + return { + easting: easting, + northing: northing, + zoneLetter: zoneLetter, + zoneNumber: zoneNumber, + accuracy: accuracyBonus + }; + } + function getEastingFromChar(e, set) { + var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); + var eastingValue = 100000; + var rewindMarker = false; + while (curCol !== e.charCodeAt(0)) { + curCol++; + if (curCol === I) { + curCol++; + } + if (curCol === O) { + curCol++; + } + if (curCol > Z) { + if (rewindMarker) { + throw 'Bad character: ' + e; + } + curCol = A; + rewindMarker = true; + } + eastingValue += 100000; + } + return eastingValue; + } + function getNorthingFromChar(n, set) { + if (n > 'V') { + throw 'MGRSPoint given invalid Northing ' + n; + } + var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); + var northingValue = 0; + var rewindMarker = false; + while (curRow !== n.charCodeAt(0)) { + curRow++; + if (curRow === I) { + curRow++; + } + if (curRow === O) { + curRow++; + } + if (curRow > V) { + if (rewindMarker) { + throw 'Bad character: ' + n; + } + curRow = A; + rewindMarker = true; + } + northingValue += 100000; + } + return northingValue; + } + function getMinNorthing(zoneLetter) { + var northing; + switch (zoneLetter) { + case 'C': + northing = 1100000; + break; + case 'D': + northing = 2000000; + break; + case 'E': + northing = 2800000; + break; + case 'F': + northing = 3700000; + break; + case 'G': + northing = 4600000; + break; + case 'H': + northing = 5500000; + break; + case 'J': + northing = 6400000; + break; + case 'K': + northing = 7300000; + break; + case 'L': + northing = 8200000; + break; + case 'M': + northing = 9100000; + break; + case 'N': + northing = 0; + break; + case 'P': + northing = 800000; + break; + case 'Q': + northing = 1700000; + break; + case 'R': + northing = 2600000; + break; + case 'S': + northing = 3500000; + break; + case 'T': + northing = 4400000; + break; + case 'U': + northing = 5300000; + break; + case 'V': + northing = 6200000; + break; + case 'W': + northing = 7000000; + break; + case 'X': + northing = 7900000; + break; + default: + northing = -1; + } + if (northing >= 0) { + return northing; + } else { + throw 'Invalid zone letter: ' + zoneLetter; + } + } + return exports; + }, + {} + ], + 67: [ + function (_dereq_, module, exports) { + module.exports = { + 'name': 'proj4', + 'version': '2.2.1', + 'description': 'Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.', + 'main': 'lib/index.js', + 'directories': { + 'test': 'test', + 'doc': 'docs' + }, + 'scripts': { 'test': './node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js' }, + 'repository': { + 'type': 'git', + 'url': 'git://github.com/proj4js/proj4js.git' + }, + 'author': '', + 'license': 'MIT', + 'jam': { + 'main': 'dist/proj4.js', + 'include': [ + 'dist/proj4.js', + 'README.md', + 'AUTHORS', + 'LICENSE.md' + ] + }, + 'devDependencies': { + 'grunt-cli': '~0.1.13', + 'grunt': '~0.4.2', + 'grunt-contrib-connect': '~0.6.0', + 'grunt-contrib-jshint': '~0.8.0', + 'chai': '~1.8.1', + 'mocha': '~1.17.1', + 'grunt-mocha-phantomjs': '~0.4.0', + 'browserify': '~3.24.5', + 'grunt-browserify': '~1.3.0', + 'grunt-contrib-uglify': '~0.3.2', + 'curl': 'git://github.com/cujojs/curl.git', + 'istanbul': '~0.2.4', + 'tin': '~0.4.0' + }, + 'dependencies': { 'mgrs': '0.0.0' } + }; + return exports; + }, + {} + ], + './includedProjections': [ + function (_dereq_, module, exports) { + module.exports = _dereq_('gWUPNW'); + return exports; + }, + {} + ], + 'gWUPNW': [ + function (_dereq_, module, exports) { + var projs = [ + _dereq_('./lib/projections/tmerc'), + _dereq_('./lib/projections/utm'), + _dereq_('./lib/projections/sterea'), + _dereq_('./lib/projections/stere'), + _dereq_('./lib/projections/somerc'), + _dereq_('./lib/projections/omerc'), + _dereq_('./lib/projections/lcc'), + _dereq_('./lib/projections/krovak'), + _dereq_('./lib/projections/cass'), + _dereq_('./lib/projections/laea'), + _dereq_('./lib/projections/aea'), + _dereq_('./lib/projections/gnom'), + _dereq_('./lib/projections/cea'), + _dereq_('./lib/projections/eqc'), + _dereq_('./lib/projections/poly'), + _dereq_('./lib/projections/nzmg'), + _dereq_('./lib/projections/mill'), + _dereq_('./lib/projections/sinu'), + _dereq_('./lib/projections/moll'), + _dereq_('./lib/projections/eqdc'), + _dereq_('./lib/projections/vandg'), + _dereq_('./lib/projections/aeqd') + ]; + module.exports = function (proj4) { + projs.forEach(function (proj) { + proj4.Proj.projections.add(proj); + }); + }; + return exports; + }, + { + './lib/projections/aea': 39, + './lib/projections/aeqd': 40, + './lib/projections/cass': 41, + './lib/projections/cea': 42, + './lib/projections/eqc': 43, + './lib/projections/eqdc': 44, + './lib/projections/gnom': 46, + './lib/projections/krovak': 47, + './lib/projections/laea': 48, + './lib/projections/lcc': 49, + './lib/projections/mill': 52, + './lib/projections/moll': 53, + './lib/projections/nzmg': 54, + './lib/projections/omerc': 55, + './lib/projections/poly': 56, + './lib/projections/sinu': 57, + './lib/projections/somerc': 58, + './lib/projections/stere': 59, + './lib/projections/sterea': 60, + './lib/projections/tmerc': 61, + './lib/projections/utm': 62, + './lib/projections/vandg': 63 + } + ] + }, {}, [35])(35); +}); +!function (root, factory) { + if (true) { + proj4leaflet07x = function (leaflet, proj4) { + return typeof factory === 'function' ? factory(leaflet, proj4) : factory; + }(leaflet, proj4); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + L = leaflet; + proj4 = proj4; + module.exports = factory(L, proj4); + } else { + if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined') + throw 'Leaflet and proj4 must be loaded first'; + factory(root.L, root.proj4); + } +}(this, function (L, proj4) { + L.Proj = {}; + L.Proj._isProj4Obj = function (a) { + return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined'; + }; + L.Proj.ScaleDependantTransformation = function (scaleTransforms) { + this.scaleTransforms = scaleTransforms; + }; + L.Proj.ScaleDependantTransformation.prototype.transform = function (point, scale) { + return this.scaleTransforms[scale].transform(point, scale); + }; + L.Proj.ScaleDependantTransformation.prototype.untransform = function (point, scale) { + return this.scaleTransforms[scale].untransform(point, scale); + }; + L.Proj.Projection = L.Class.extend({ + initialize: function (a, def) { + if (L.Proj._isProj4Obj(a)) { + this._proj = a; + } else { + var code = a; + if (def) { + proj4.defs(code, def); + } else if (proj4.defs[code] === undefined) { + var urn = code.split(':'); + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + if (proj4.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + this._proj = proj4(code); + } + }, + project: function (latlng) { + var point = this._proj.forward([ + latlng.lng, + latlng.lat + ]); + return new L.Point(point[0], point[1]); + }, + unproject: function (point, unbounded) { + var point2 = this._proj.inverse([ + point.x, + point.y + ]); + return new L.LatLng(point2[1], point2[0], unbounded); + } + }); + L.Proj.CRS = L.Class.extend({ + includes: L.CRS, + options: { transformation: new L.Transformation(1, 0, -1, 0) }, + initialize: function (a, b, c) { + var code, proj, def, options; + if (L.Proj._isProj4Obj(a)) { + proj = a; + code = proj.srsCode; + options = b || {}; + this.projection = new L.Proj.Projection(proj); + } else { + code = a; + def = b; + options = c || {}; + this.projection = new L.Proj.Projection(code, def); + } + L.Util.setOptions(this, options); + this.code = code; + this.transformation = this.options.transformation; + if (this.options.origin) { + this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]); + } + if (this.options.scales) { + this._scales = this.options.scales; + } else if (this.options.resolutions) { + this._scales = []; + for (var i = this.options.resolutions.length - 1; i >= 0; i--) { + if (this.options.resolutions[i]) { + this._scales[i] = 1 / this.options.resolutions[i]; + } + } + } + }, + scale: function (zoom) { + var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff; + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = zoom - iZoom; + return baseScale + scaleDiff * zDiff; + } + }, + getSize: function (zoom) { + var b = this.options.bounds, s, min, max; + if (b) { + s = this.scale(zoom); + min = this.transformation.transform(b.min, s); + max = this.transformation.transform(b.max, s); + return L.point(Math.abs(max.x - min.x), Math.abs(max.y - min.y)); + } else { + s = 256 * Math.pow(2, zoom); + return L.point(s, s); + } + } + }); + L.Proj.CRS.TMS = L.Proj.CRS.extend({ + options: { tileSize: 256 }, + initialize: function (a, b, c, d) { + var code, def, proj, projectedBounds, options; + if (L.Proj._isProj4Obj(a)) { + proj = a; + projectedBounds = b; + options = c || {}; + options.origin = [ + projectedBounds[0], + projectedBounds[3] + ]; + L.Proj.CRS.prototype.initialize.call(this, proj, options); + } else { + code = a; + def = b; + projectedBounds = c; + options = d || {}; + options.origin = [ + projectedBounds[0], + projectedBounds[3] + ]; + L.Proj.CRS.prototype.initialize.call(this, code, def, options); + } + this.projectedBounds = projectedBounds; + this._sizes = this._calculateSizes(); + }, + _calculateSizes: function () { + var sizes = [], crsBounds = this.projectedBounds, projectedTileSize, i, x, y; + for (i = this._scales.length - 1; i >= 0; i--) { + if (this._scales[i]) { + projectedTileSize = this.options.tileSize / this._scales[i]; + x = Math.ceil(parseFloat((crsBounds[2] - crsBounds[0]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i]; + y = Math.ceil(parseFloat((crsBounds[3] - crsBounds[1]) / projectedTileSize).toPrecision(3)) * projectedTileSize * this._scales[i]; + sizes[i] = L.point(x, y); + } + } + return sizes; + }, + getSize: function (zoom) { + return this._sizes[zoom]; + } + }); + L.Proj.TileLayer = {}; + L.Proj.TileLayer.TMS = L.TileLayer.extend({ + options: { continuousWorld: true }, + initialize: function (urlTemplate, crs, options) { + var boundsMatchesGrid = true, scaleTransforms, upperY, crsBounds, i; + if (!(crs instanceof L.Proj.CRS.TMS)) { + throw 'CRS is not L.Proj.CRS.TMS.'; + } + L.TileLayer.prototype.initialize.call(this, urlTemplate, options); + this.options.tms = false; + this.crs = crs; + crsBounds = this.crs.projectedBounds; + for (i = this.options.minZoom; i < this.options.maxZoom && boundsMatchesGrid; i++) { + var gridHeight = (crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i); + boundsMatchesGrid = Math.abs(gridHeight - Math.round(gridHeight)) > 0.001; + } + if (!boundsMatchesGrid) { + scaleTransforms = {}; + for (i = this.options.minZoom; i < this.options.maxZoom; i++) { + upperY = crsBounds[1] + Math.ceil((crsBounds[3] - crsBounds[1]) / this._projectedTileSize(i)) * this._projectedTileSize(i); + scaleTransforms[this.crs.scale(i)] = new L.Transformation(1, -crsBounds[0], -1, upperY); + } + this.crs = new L.Proj.CRS.TMS(this.crs.projection._proj, crsBounds, this.crs.options); + this.crs.transformation = new L.Proj.ScaleDependantTransformation(scaleTransforms); + } + }, + getTileUrl: function (tilePoint) { + var zoom = this._map.getZoom(), gridHeight = Math.ceil((this.crs.projectedBounds[3] - this.crs.projectedBounds[1]) / this._projectedTileSize(zoom)); + return L.Util.template(this._url, L.Util.extend({ + s: this._getSubdomain(tilePoint), + z: this._getZoomForUrl(), + x: tilePoint.x, + y: gridHeight - tilePoint.y - 1 + }, this.options)); + }, + _projectedTileSize: function (zoom) { + return this.options.tileSize / this.crs.scale(zoom); + } + }); + L.Proj.GeoJSON = L.GeoJSON.extend({ + initialize: function (geojson, options) { + this._callLevel = 0; + L.GeoJSON.prototype.initialize.call(this, null, options); + if (geojson) { + this.addData(geojson); + } + }, + addData: function (geojson) { + var crs; + if (geojson) { + if (geojson.crs && geojson.crs.type === 'name') { + crs = new L.Proj.CRS(geojson.crs.properties.name); + } else if (geojson.crs && geojson.crs.type) { + crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code); + } + if (crs !== undefined) { + this.options.coordsToLatLng = function (coords) { + var point = L.point(coords[0], coords[1]); + return crs.projection.unproject(point); + }; + } + } + this._callLevel++; + try { + L.GeoJSON.prototype.addData.call(this, geojson); + } finally { + this._callLevel--; + if (this._callLevel === 0) { + delete this.options.coordsToLatLng; + } + } + } + }); + L.Proj.geoJson = function (geojson, options) { + return new L.Proj.GeoJSON(geojson, options); + }; + L.Proj.ImageOverlay = L.ImageOverlay.extend({ + initialize: function (url, bounds, options) { + L.ImageOverlay.prototype.initialize.call(this, url, null, options); + this._projBounds = bounds; + }, + _animateZoom: function (e) { + var northwest = L.point(this._projBounds.min.x, this._projBounds.max.y), southeast = L.point(this._projBounds.max.x, this._projBounds.min.y), topLeft = this._projectedToNewLayerPoint(northwest, e.zoom, e.center), size = this._projectedToNewLayerPoint(southeast, e.zoom, e.center).subtract(topLeft), origin = topLeft.add(size._multiplyBy((1 - 1 / e.scale) / 2)); + this._image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + this._map.getZoomScale(e.zoom) + ') '; + }, + _reset: function () { + var zoom = this._map.getZoom(), pixelOrigin = this._map.getPixelOrigin(), bounds = L.bounds(this._transform(this._projBounds.min, zoom)._subtract(pixelOrigin), this._transform(this._projBounds.max, zoom)._subtract(pixelOrigin)), size = bounds.getSize(), image = this._image; + L.DomUtil.setPosition(image, bounds.min); + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; + }, + _projectedToNewLayerPoint: function (point, newZoom, newCenter) { + var topLeft = this._map._getNewTopLeftPoint(newCenter, newZoom).add(this._map._getMapPanePos()); + return this._transform(point, newZoom)._subtract(topLeft); + }, + _transform: function (p, zoom) { + var crs = this._map.options.crs, transformation = crs.transformation, scale = crs.scale(zoom); + return transformation.transform(p, scale); + } + }); + L.Proj.imageOverlay = function (url, bounds, options) { + return new L.Proj.ImageOverlay(url, bounds, options); + }; + if (typeof L.CRS !== 'undefined') { + L.CRS.proj4js = function () { + return function (code, def, transformation, options) { + options = options || {}; + if (transformation) { + options.transformation = transformation; + } + return new L.Proj.CRS(code, def, options); + }; + }(); + } + return L.Proj; +}); +!function (root, factory) { + if (true) { + proj4leaflet10x = function (leaflet, proj4) { + return typeof factory === 'function' ? factory(leaflet, proj4) : factory; + }(leaflet, proj4); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + L = leaflet; + proj4 = proj4; + module.exports = factory(L, proj4); + } else { + if (typeof root.L === 'undefined' || typeof root.proj4 === 'undefined') + throw 'Leaflet and proj4 must be loaded first'; + factory(root.L, root.proj4); + } +}(this, function (L, proj4) { + L.Proj = {}; + L.Proj._isProj4Obj = function (a) { + return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined'; + }; + L.Proj.Projection = L.Class.extend({ + initialize: function (code, def, bounds) { + var isP4 = L.Proj._isProj4Obj(code); + this._proj = isP4 ? code : this._projFromCodeDef(code, def); + this.bounds = isP4 ? def : bounds; + }, + project: function (latlng) { + var point = this._proj.forward([ + latlng.lng, + latlng.lat + ]); + return new L.Point(point[0], point[1]); + }, + unproject: function (point, unbounded) { + var point2 = this._proj.inverse([ + point.x, + point.y + ]); + return new L.LatLng(point2[1], point2[0], unbounded); + }, + _projFromCodeDef: function (code, def) { + if (def) { + proj4.defs(code, def); + } else if (proj4.defs[code] === undefined) { + var urn = code.split(':'); + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + if (proj4.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + return proj4(code); + } + }); + L.Proj.CRS = L.Class.extend({ + includes: L.CRS, + options: { transformation: new L.Transformation(1, 0, -1, 0) }, + initialize: function (a, b, c) { + var code, proj, def, options; + if (L.Proj._isProj4Obj(a)) { + proj = a; + code = proj.srsCode; + options = b || {}; + this.projection = new L.Proj.Projection(proj, options.bounds); + } else { + code = a; + def = b; + options = c || {}; + this.projection = new L.Proj.Projection(code, def, options.bounds); + } + L.Util.setOptions(this, options); + this.code = code; + this.transformation = this.options.transformation; + if (this.options.origin) { + this.transformation = new L.Transformation(1, -this.options.origin[0], -1, this.options.origin[1]); + } + if (this.options.scales) { + this._scales = this.options.scales; + } else if (this.options.resolutions) { + this._scales = []; + for (var i = this.options.resolutions.length - 1; i >= 0; i--) { + if (this.options.resolutions[i]) { + this._scales[i] = 1 / this.options.resolutions[i]; + } + } + } + this.infinite = !this.options.bounds; + }, + scale: function (zoom) { + var iZoom = Math.floor(zoom), baseScale, nextScale, scaleDiff, zDiff; + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = zoom - iZoom; + return baseScale + scaleDiff * zDiff; + } + }, + zoom: function (scale) { + var downScale = this._closestElement(this._scales, scale), downZoom = this._scales.indexOf(downScale), nextZoom, scaleDiff; + if (scale === downScale) { + return downZoom; + } + nextZoom = downZoom + 1; + scaleDiff = this._scales[nextZoom] - downScale; + return (scale - downScale) / scaleDiff + downZoom; + }, + _closestElement: function (array, element) { + var low; + for (var i = array.length; i--;) { + if (array[i] <= element && (low === undefined || low < array[i])) { + low = array[i]; + } + } + return low; + } + }); + L.Proj.GeoJSON = L.GeoJSON.extend({ + initialize: function (geojson, options) { + if (geojson.crs && geojson.crs.type === 'name') { + var crs = new L.Proj.CRS(geojson.crs.properties.name); + options = options || {}; + options.coordsToLatLng = function (coords) { + var point = L.point(coords[0], coords[1]); + return crs.projection.unproject(point); + }; + } + L.GeoJSON.prototype.initialize.call(this, geojson, options); + } + }); + L.Proj.geoJson = function (geojson, options) { + return new L.Proj.GeoJSON(geojson, options); + }; + return L.Proj; +}); +LeafletCRSProj4Leaflet = function (require, L, proj4) { + return { + load: function () { + console.log('loading lib proj4leaflet ...'); + var proj4leaflet = null; + if (L.version.lastIndexOf('0.7', 0) === 0) { + proj4leaflet = proj4leaflet07x; + console.log('loaded version for leaflet 0.7.7 ...'); + } else if (L.version.lastIndexOf('1.0', 0) === 0) { + proj4leaflet = proj4leaflet10x; + console.log('loaded version for leaflet 1.0.0 ...'); + } else { + console.log('version leaflet incompatible !'); + return; + } + L.Proj = proj4leaflet; + return L.Proj; + } + }; +}({}, leaflet, proj4); +CommonUtilsRegister = function (proj4) { + var Register = { + isLoaded: false, + get: function (name) { + if (name === '' || name === null || typeof name === 'undefined') { + return; + } + var s = name.split(':'); + if (s.length !== 2) { + return; + } + var register = s[0]; + var code = s[1]; + if (!this.hasOwnProperty(register)) { + return; + } + if (!this[register].hasOwnProperty(code)) { + return; + } + return this[register][code]; + }, + load: function () { + if (!this.isLoaded) { + var registers = [ + 'IGNF', + 'EPSG', + 'CRS' + ]; + for (var i = 0; i < registers.length; i++) { + var register = registers[i]; + var codes = this[register]; + for (var code in codes) { + if (codes.hasOwnProperty(code)) { + var name = register + ':' + code; + proj4.defs(name, this.get(name)); + } + } + } + this.isLoaded = true; + } + }, + EPSG: { + 4149: '+title=CH1903 +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ', + 4150: '+title=CH1903plus +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs ', + 4151: '+title=CHTRF95 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4171: '+title=RGF93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4230: '+title=ED50 +proj=longlat +ellps=intl +no_defs ', + 4235: '+title=Guyane Francaise +proj=longlat +ellps=intl +no_defs ', + 4258: '+title=ETRS89 +proj=longlat +ellps=GRS80 +no_defs ', + 4275: '+title=NTF +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs ', + 4322: '+title=WGS 72 +proj=longlat +ellps=WGS72 +no_defs ', + 4326: '+title=WGS 84 +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ', + 4467: '+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 4470: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4471: '+proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 4474: '+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ', + 4558: '+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4559: '+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 4621: '+title=Fort Marigot +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs ', + 4622: '+title=Guadeloupe 1948 +proj=longlat +ellps=intl +no_defs ', + 4623: '+title=CSG67 +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs ', + 4624: '+title=RGFG95 +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs ', + 4625: '+title=Martinique 1938 +proj=longlat +ellps=intl +no_defs ', + 4626: '+title=Reunion 1947 +proj=longlat +ellps=intl +no_defs ', + 4627: '+title=RGR92 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4628: '+title=Tahiti 52 +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs ', + 4629: '+title=Tahaa 54 +proj=longlat +ellps=intl +no_defs ', + 4630: '+title=IGN72 Nuku Hiva +proj=longlat +ellps=intl +no_defs ', + 4632: '+title=Combani 1950 +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs ', + 4633: '+title=IGN56 Lifou +proj=longlat +ellps=intl +no_defs ', + 4634: '+title=IGN72 Grand Terre +proj=longlat +ellps=intl +no_defs ', + 4637: '+title=Perroud 1950 +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs ', + 4638: '+title=Saint Pierre et Miquelon 1950 +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs ', + 4640: '+title=RRAF 1991 +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4641: '+title=IGN53 Mare +proj=longlat +ellps=intl +no_defs ', + 4645: '+title=RGNC 1991 +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4687: '+proj=longlat +ellps=GRS80 +no_defs ', + 4662: '+title=IGN72 Grande Terre +proj=longlat +ellps=intl +no_defs ', + 4689: '+title=IGN63 Hiva Oa +proj=longlat +ellps=intl +no_defs ', + 4690: '+title=Tahiti 79 +proj=longlat +ellps=intl +no_defs ', + 4691: '+title=Moorea 87 +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs ', + 4692: '+title=Maupiti 83 +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs ', + 4698: '+title=IGN 1962 Kerguelen +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs ', + 4749: '+title=RGNC91-93 +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs ', + 4750: '+title=ST87 Ouvea +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs ', + 4807: '+title=NTF (Paris) +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs ', + 2056: '+title=CH1903+ / LV95 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ', + 2154: '+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 2213: '+title=ETRS89 / TM 30 NE +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ', + 2969: '+title=Fort Marigot / UTM zone 20N +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs ', + 2970: '+title=Guadeloupe 1948 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ', + 2971: '+title=CSG67 / UTM zone 22N +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ', + 2972: '+title=RGFG95 / UTM zone 22N +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ', + 2973: '+title=Martinique 1938 / UTM zone 20N +proj=utm +zone=20 +ellps=intl +units=m +no_defs ', + 2975: '+title=RGR92 / UTM zone 40S +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 2976: '+title=Tahiti 52 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs ', + 2977: '+title=Tahaa 54 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs ', + 2978: '+title=IGN72 Nuku Hiva / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ', + 2980: '+title=Combani 1950 / UTM zone 38S +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs ', + 2981: '+title=IGN56 Lifou / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ', + 2982: '+title=IGN72 Grand Terre / UTM zone 58S (deprecated) +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ', + 2984: '+title=RGNC 1991 / Lambert New Caledonia (deprecated) +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 2986: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67.000000000 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs', + 2987: '+title=Saint Pierre et Miquelon 1950 / UTM zone 21N +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs ', + 2989: '+title=RRAF 1991 / UTM zone 20N +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 2990: '+title=Reunion 1947 / TM Reunion (deprecated) +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs ', + 2995: '+title=IGN53 Mare / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ', + 3038: '+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3039: '+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3040: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3041: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3045: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3046: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3047: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3048: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3049: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3050: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3051: '+proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3034: '+title=ETRS89 / ETRS-LCC +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs ', + 3035: '+title=ETRS89 / ETRS-LAEA +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ', + 3042: '+title=ETRS89 / ETRS-TM30 +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ', + 3043: '+title=ETRS89 / ETRS-TM31 +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ', + 3044: '+title=ETRS89 / ETRS-TM32 +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ', + 25828: '+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25829: '+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25833: '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25834: '+proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25835: '+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25836: '+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25837: '+proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 25838: '+proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3060: '+title=IGN72 Grande Terre / UTM zone 58S +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs ', + 3163: '+title=RGNC91-93 / Lambert New Caledonia +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3164: '+title=ST87 Ouvea / UTM zone 58S +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs ', + 3165: '+title=NEA74 Noumea / Noumea Lambert +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs ', + 3166: '+title=NEA74 Noumea / Noumea Lambert 2 +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs ', + 3169: '+title=RGNC91-93 / UTM zone 57S +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3170: '+title=RGNC91-93 / UTM zone 58S +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3171: '+title=RGNC91-93 / UTM zone 59S +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ', + 3172: '+title=IGN53 Mare / UTM zone 59S +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs ', + 3296: '+title=RGPF / UTM zone 5S +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs ', + 3297: '+title=RGPF / UTM zone 6S +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs ', + 3298: '+title=RGPF / UTM zone 7S +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs ', + 3299: '+title=RGPF / UTM zone 8S +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs ', + 3302: '+title=IGN63 Hiva Oa / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs ', + 3303: '+title=Fatu Iva 72 / UTM zone 7S +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs ', + 3304: '+title=Tahiti 79 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs ', + 3305: '+title=Moorea 87 / UTM zone 6S +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs ', + 3306: '+title=Maupiti 83 / UTM zone 5S +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs ', + 3312: '+title=CSG67 / UTM zone 21N +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs ', + 3313: '+title=RGFG95 / UTM zone 21N +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs ', + 3336: '+title=IGN 1962 Kerguelen / UTM zone 42S +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs ', + 3395: '+title=WGS 84 / World Mercator +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 3727: '+title=Reunion 1947 / TM Reunion +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs ', + 21781: '+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs ', + 25830: '+title=ETRS89 / UTM zone 30N +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs ', + 25831: '+title=ETRS89 / UTM zone 31N +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs ', + 25832: '+title=ETRS89 / UTM zone 32N +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs ', + 27561: '+title=NTF (Paris) / Lambert Nord France +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27562: '+title=NTF (Paris) / Lambert Centre France +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27563: '+title=NTF (Paris) / Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27564: '+title=NTF (Paris) / Lambert Corse +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27571: '+title=NTF (Paris) / Lambert zone I +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27572: '+title=NTF (Paris) / Lambert zone II +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27573: '+title=NTF (Paris) / Lambert zone III +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27574: '+title=NTF (Paris) / Lambert zone IV +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27581: '+title=NTF (Paris) / France I (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27582: '+title=NTF (Paris) / France II (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27583: '+title=NTF (Paris) / France III (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27584: '+title=NTF (Paris) / France IV (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27591: '+title=NTF (Paris) / Nord France (deprecated) +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27592: '+title=NTF (Paris) / Centre France (deprecated) +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27593: '+title=NTF (Paris) / Sud France (deprecated) +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 27594: '+title=NTF (Paris) / Corse (deprecated) +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.9999447100000001 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs ', + 32601: '+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32602: '+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32603: '+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32604: '+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32605: '+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32606: '+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32607: '+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32608: '+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32609: '+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32610: '+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32611: '+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32612: '+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32613: '+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32614: '+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32615: '+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32616: '+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32617: '+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32618: '+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32619: '+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32620: '+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32621: '+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32622: '+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32623: '+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32624: '+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32625: '+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32626: '+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32627: '+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32628: '+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32629: '+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32630: '+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32631: '+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32632: '+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32633: '+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32634: '+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32635: '+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32636: '+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32637: '+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32638: '+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32639: '+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32640: '+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32641: '+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32642: '+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32643: '+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32644: '+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32645: '+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32646: '+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32647: '+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32648: '+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32649: '+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32650: '+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32651: '+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32652: '+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32653: '+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32654: '+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32655: '+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32656: '+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32657: '+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32658: '+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32659: '+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32660: '+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32661: '+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32662: '+title=WGS 84 / Plate Carree +proj=eqc +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32701: '+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32702: '+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32703: '+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32704: '+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32705: '+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32706: '+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32707: '+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32708: '+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32709: '+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32710: '+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32711: '+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32712: '+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32713: '+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32714: '+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32715: '+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32716: '+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32717: '+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32718: '+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32719: '+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32720: '+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32721: '+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32722: '+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32723: '+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32724: '+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32725: '+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32726: '+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32727: '+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32728: '+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32729: '+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32730: '+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32731: '+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32732: '+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32733: '+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32734: '+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32735: '+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32736: '+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32737: '+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32738: '+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32739: '+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32740: '+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32741: '+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32742: '+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32743: '+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32744: '+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32745: '+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32746: '+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32747: '+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32748: '+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32749: '+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32750: '+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32751: '+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32752: '+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32753: '+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32754: '+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32755: '+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32756: '+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32757: '+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32758: '+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32759: '+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32760: '+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 32761: '+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ', + 310024802: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310915814: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310486805: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310700806: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310702807: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310706808: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310547809: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310642810: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310032811: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310642812: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310642801: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310642813: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 310642901: '+title=Geoportail - Monde +proj=mill +towgs84=0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.000000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + 5489: '+title=RGAF09 geographiques (dms) +proj=longlat +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +units=m +no_defs', + 5490: '+title=RGAF09 UTM Nord Fuseau 20 +proj=tmerc +nadgrids=@null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137 +rf=298.257222101 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs' + }, + CRS: { 84: '+title=WGS 84 longitude-latitude +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' }, + IGNF: { + AMST63: '+title=Amsterdam 1963 +proj=geocent +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + CROZ63: '+title=Crozet 1963 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + CSG67: '+title=Guyane CSG67 +proj=geocent +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + ED50: '+title=ED50 +proj=geocent +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + ETRS89: '+title=Systeme de reference terrestre Europeen (1989) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + GUAD48: '+title=Guadeloupe Ste Anne +proj=geocent +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + GUADFM49: '+title=Guadeloupe Fort Marigot +proj=geocent +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + IGN63: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=geocent +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + IGN72: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=geocent +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + KERG62CAR: '+title=Kerguelen - K0 +proj=geocent +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MART38: '+title=Martinique Fort-Desaix +proj=geocent +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MAYO50: '+title=Mayotte Combani +proj=geocent +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MOOREA87: '+title=Moorea 1987 +proj=geocent +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + NTF: '+title=Nouvelle Triangulation Francaise +proj=geocent +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs', + NUKU72: '+title=IGN 1972 Nuku Hiva +proj=geocent +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + REUN47: '+title=Reunion 1947 +proj=geocent +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + RGF93: '+title=Reseau geodesique francais 1993 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGFG95: '+title=Reseau geodesique francais de Guyane 1995 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGM04: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGNC: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGPF: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGR92: '+title=Reseau geodesique Reunion 1992 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGSPM06: '+title=Reseau Geodesique Saint-Pierre-et-Miquelon (2006) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGTAAF07: '+title=Reseau Geodesique des TAAF (2007) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RRAF91: '+title=RRAF 1991 (Reseau de Reference des Antilles Francaises) +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + STPL69: '+title=Saint-Paul 1969 +proj=geocent +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + STPM50: '+title=St Pierre et Miquelon 1950 +proj=geocent +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs', + TAHAA: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=geocent +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + TAHI79: '+title=IGN79 (Tahiti) Iles de la Societe +proj=geocent +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + TERA50: '+title=Pointe Geologie - Perroud 1950 +proj=geocent +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + WALL78: '+title=Wallis-Uvea 1978 (MOP78) +proj=geocent +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + WGS72: '+title=World Geodetic System 1972 +proj=geocent +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs', + WGS84: '+title=World Geodetic System 1984 +proj=geocent +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + AMST63GEO: '+title=Amsterdam 1963 +proj=longlat +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + CROZ63GEO: '+title=Crozet 1963 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + CSG67GEO: '+title=Guyane CSG67 +proj=longlat +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + ED50G: '+title=ED50 +proj=longlat +towgs84=-84.0000,-97.0000,-117.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + GUAD48GEO: '+title=Guadeloupe Ste Anne +proj=longlat +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + GUADFM49GEO: '+title=Guadeloupe Fort Marigot +proj=longlat +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + IGN63GEO: '+title=IGN 1963 (Hiva Oa, Tahuata, Mohotani) +proj=longlat +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + IGN72GEO: '+title=IGN 1972 Grande-Terre / Ile des Pins +proj=longlat +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + KERG62GEO: '+title=Kerguelen - K0 +proj=longlat +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MART38GEO: '+title=Martinique Fort-Desaix +proj=longlat +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MAYO50GEO: '+title=Mayotte Combani +proj=longlat +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + MOOREA87GEO: '+title=Moorea 1987 +proj=longlat +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + NTFG: '+title=Nouvelle Triangulation Francaise Greenwich degres sexagesimaux +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +units=m +no_defs', + NTFP: '+title=Nouvelle Triangulation Francaise Paris grades +proj=longlat +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +units=m +no_defs', + NUKU72GEO: '+title=IGN 1972 Nuku Hiva +proj=longlat +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + REUN47GEO: '+title=Reunion 1947 +proj=longlat +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + RGF93G: '+title=Reseau geodesique francais 1993 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGFG95GEO: '+title=Reseau geodesique francais de Guyane 1995 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGM04GEO: '+title=RGM04 (Reseau Geodesique de Mayotte 2004) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGNCGEO: '+title=Reseau Geodesique de Nouvelle-Caledonie +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGPFGEO: '+title=RGPF (Reseau Geodesique de Polynesie Francaise) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGR92GEO: '+title=Reseau geodesique de la Reunion 1992 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGSPM06GEO: '+title=Saint-Pierre-et-Miquelon (2006) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + RGTAAF07G: '+title=Reseau Geodesique des TAAF (2007) (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + STPL69GEO: '+title=Saint-Paul 1969 +proj=longlat +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + STPM50GEO: '+title=St Pierre et Miquelon 1950 +proj=longlat +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +units=m +no_defs', + TAHAAGEO: '+title=Raiatea - Tahaa 51-54 (Tahaa, Base Terme Est) +proj=longlat +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + TAHI79GEO: '+title=IGN79 (Tahiti) Iles de la Societe +proj=longlat +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + TERA50G: '+title=Pointe Geologie - Perroud 1950 +proj=longlat +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + WALL78GEO: '+title=Wallis - Uvea 1978 (MOP78) +proj=longlat +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +units=m +no_defs', + WGS72G: '+title=WGS72 +proj=longlat +towgs84=0.0000,12.0000,6.0000 +a=6378135.0000 +rf=298.2600000000000 +units=m +no_defs', + WGS84G: '+title=World Geodetic System 1984 +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + WGS84RRAFGEO: '+title=Reseau de reference des Antilles francaises (1988-1991) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + XGEO: '+title=Systeme CIO-BIH +proj=longlat +towgs84=0.0000,0.0000,0.5000,0.0000,0.0000,0.0140,-0.100000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + AMST63UTM43S: '+title=Amsterdam 1963 UTM fuseau 43 Sud +proj=tmerc +towgs84=109.753,-528.133,-362.244,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + CROZ63UTM39S: '+title=Crozet 1963 +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + CSG67UTM21: '+title=Guyane CSG67 UTM fuseau 21 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + CSG67UTM22: '+title=Guyane CSG67 UTM fuseau 22 +proj=tmerc +towgs84=-193.0660,236.9930,105.4470,0.4814,-0.8074,0.1276,1.564900 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALANF: '+title=Geoportail - Antilles francaises +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALASP: '+title=Geoportail - Amsterdam et Saint-Paul +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-38.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALCRZ: '+title=Geoportail - Crozet +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-46.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALFXX: '+title=Geoportail - France metropolitaine +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=46.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALGUF: '+title=Geoportail - Guyane +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=4.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALKER: '+title=Geoportail - Kerguelen +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-49.500000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALMYT: '+title=Geoportail - Mayotte +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-12.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALNCL: '+title=Geoportail - Nouvelle-Caledonie +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-22.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALPYF: '+title=Geoportail - Polynesie francaise +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-15.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALREU: '+title=Geoportail - Reunion et dependances +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-21.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALSPM: '+title=Geoportail - Saint-Pierre et Miquelon +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=47.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GEOPORTALWLF: '+title=Geoportail - Wallis et Futuna +proj=eqc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=0.000000000 +lat_ts=-14.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + GUAD48UTM20: '+title=Guadeloupe Ste Anne +proj=tmerc +towgs84=-472.2900,-5.6300,-304.1200,0.4362,-0.8374,0.2563,1.898400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + GUADFM49U20: '+title=Guadeloupe Fort Marigot +proj=tmerc +towgs84=136.5960,248.1480,-429.7890 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + IGN63UTM7S: '+title=IGN 1963 - Hiva Oa, Tahuata, Mohotani - UTM fuseau 7 Sud +proj=tmerc +towgs84=410.7210,55.0490,80.7460,-2.5779,-2.3514,-0.6664,17.331100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + IGN72UTM58S: '+title=IGN 1972 - UTM fuseau 58 Sud +proj=tmerc +towgs84=-11.6400,-348.6000,291.6800 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + KERG62UTM42S: '+title=Kerguelen 1962 +proj=tmerc +towgs84=144.8990,-186.7700,100.9230 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + LAMB1: '+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs', + LAMB1C: '+title=Lambert I Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=1200000.000 +units=m +no_defs', + LAMB2: '+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs', + LAMB2C: '+title=Lambert II Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs', + LAMB3: '+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs', + LAMB3C: '+title=Lambert III Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=3200000.000 +units=m +no_defs', + LAMB4: '+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs', + LAMB4C: '+title=Lambert IV Carto +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=4185861.369 +units=m +no_defs', + LAMB93: '+title=Lambert 93 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.500000000 +lon_0=3.000000000 +lat_1=44.000000000 +lat_2=49.000000000 +x_0=700000.000 +y_0=6600000.000 +units=m +no_defs', + RGF93CC42: '+title=Lambert conique conforme Zone 1 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.200000000 +lat_2=42.800000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs', + RGF93CC43: '+title=Lambert conique conforme Zone 2 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.200000000 +lat_2=43.800000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs', + RGF93CC44: '+title=Lambert conique conforme Zone 3 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.200000000 +lat_2=44.800000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs', + RGF93CC45: '+title=Lambert conique conforme Zone 4 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.200000000 +lat_2=45.800000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs', + RGF93CC46: '+title=Lambert conique conforme Zone 5 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.200000000 +lat_2=46.800000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs', + RGF93CC47: '+title=Lambert conique conforme Zone 6 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.200000000 +lat_2=47.800000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs', + RGF93CC48: '+title=Lambert conique conforme Zone 7 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.200000000 +lat_2=48.800000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs', + RGF93CC49: '+title=Lambert conique conforme Zone 8 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.200000000 +lat_2=49.800000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs', + RGF93CC50: '+title=Lambert conique conforme Zone 9 +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.200000000 +lat_2=50.800000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs', + LAMBE: '+title=Lambert II etendu +proj=lcc +nadgrids=ntf_r93.gsb,null +wktext +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=2200000.000 +units=m +no_defs', + MART38UTM20: '+title=Martinique Fort-Desaix +proj=tmerc +towgs84=126.9260,547.9390,130.4090,-2.7867,5.1612,-0.8584,13.822650 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + MAYO50UTM38S: '+title=Mayotte Combani +proj=tmerc +towgs84=-599.9280,-275.5520,-195.6650,-0.0835,-0.4715,0.0602,49.281400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + MILLER: '+title=Geoportail - Monde +proj=mill +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lon_0=0.000000000 +x_0=0.000 +y_0=0.000 +units=m +no_defs', + MOOREA87U6S: '+title=Moorea 1987 - UTM fuseau 6 Sud +proj=tmerc +towgs84=215.9820,149.5930,176.2290,3.2624,1.6920,1.1571,10.477300 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + NUKU72U7S: '+title=IGN 1972 Nuku Hiva - UTM fuseau 7 Sud +proj=tmerc +towgs84=165.7320,216.7200,180.5050,-0.6434,-0.4512,-0.0791,7.420400 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + REUN47GAUSSL: '+title=Reunion Gauss Laborde +proj=gstmerc +towgs84=789.5240,-626.4860,-89.9040,0.6006,76.7946,-10.5788,-32.324100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-21.116666667 +lon_0=55.533333333 +k_0=1.00000000 +x_0=160000.000 +y_0=50000.000 +units=m +no_defs', + RGM04UTM38S: '+title=UTM fuseau 38 Sud (Reseau Geodesique de Mayotte 2004) +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGNCUTM57S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 57 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=159.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGNCUTM58S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 58 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=165.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGNCUTM59S: '+title=Reseau Geodesique de Nouvelle-Caledonie - UTM fuseau 59 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=171.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGPFUTM5S: '+title=RGPF - UTM fuseau 5 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGPFUTM6S: '+title=RGPF - UTM fuseau 6 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGPFUTM7S: '+title=RGPF - UTM fuseau 7 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-141.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGR92UTM40S: '+title=RGR92 UTM fuseau 40 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + RGSPM06U21: '+title=Saint-Pierre-et-Miquelon (2006) UTM Fuseau 21 Nord +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + STPL69UTM43S: '+title=Saint-Paul 1969 UTM fuseau 43 Sud +proj=tmerc +towgs84=225.571,-346.608,-46.567,0,0,0,0 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + STPM50UTM21: '+title=St Pierre et Miquelon 1950 +proj=tmerc +towgs84=-95.5930,573.7630,173.4420,-0.9602,1.2510,-1.3918,42.626500 +a=6378206.4000 +rf=294.9786982000000 +lat_0=0.000000000 +lon_0=-57.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + TAHAAUTM05S: '+title=Tahaa 1951 +proj=tmerc +towgs84=72.4380,345.9180,79.4860,-1.6045,-0.8823,-0.5565,1.374600 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-153.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + TAHI51UTM06S: '+title=Tahiti-Terme Nord UTM fuseau 6 Sud +proj=tmerc +towgs84=162.0000,117.0000,154.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + TAHI79UTM6S: '+title=Tahiti 1979 +proj=tmerc +towgs84=221.5250,152.9480,176.7680,2.3847,1.3896,0.8770,11.474100 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-147.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + TERA50STEREO: '+title=Terre Adelie 1950 +proj=stere +towgs84=324.9120,153.2820,172.0260 +a=6378388.0000 +rf=297.0000000000000 +lat_0=-90.000000000 +lon_0=140.000000000 +lat_ts=-67 +k=0.96027295 +x_0=300000.000 +y_0=-2299363.482 +units=m +no_defs', + UTM01SW84: '+title=World Geodetic System 1984 UTM fuseau 01 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + UTM20W84GUAD: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Guadeloupe +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM20W84MART: '+title=World Geodetic System 1984 UTM fuseau 20 Nord-Martinique +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-63.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM22RGFG95: '+title=RGFG95 UTM fuseau 22 Nord-Guyane +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM39SW84: '+title=World Geodetic System 1984 UTM fuseau 39 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=51.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + UTM42SW84: '+title=World Geodetic System 1984 UTM fuseau 42 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=69.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + UTM43SW84: '+title=World Geodetic System 1984 UTM fuseau 43 Sud +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=75.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + WALL78UTM1S: '+title=Wallis-Uvea 1978 (MOP78) UTM 1 SUD +proj=tmerc +towgs84=253.0000,-133.0000,-127.0000 +a=6378388.0000 +rf=297.0000000000000 +lat_0=0.000000000 +lon_0=-177.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=10000000.000 +units=m +no_defs', + ETRS89GEO: '+title=ETRS89 geographiques (dms) +proj=longlat +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +units=m +no_defs', + ETRS89LAEA: '+title=ETRS89 Lambert Azimutal Equal Area +proj=laea +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=10.000000000 +x_0=4321000.000 +y_0=3210000.000 +units=m +no_defs', + ETRS89LCC: '+title=ETRS89 Lambert Conformal Conic +proj=lcc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=52.000000000 +lon_0=9.999999995 +lat_1=35.000000000 +lat_2=65.000000000 +x_0=4000000.000 +y_0=2800000.000 +units=m +no_defs', + UTM26ETRS89: '+title=Europe - de 30d a 24d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM27ETRS89: '+title=Europe - de 24d a 18d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM28ETRS89: '+title=Europe - de 18d a 12d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM29ETRS89: '+title=Europe - de 12d a 6d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM30ETRS89: '+title=Europe - de -6d a 0d Ouest +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=-3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM31ETRS89: '+title=Europe - de 0d a 6d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=3.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM32ETRS89: '+title=Europe - de 6d a 12d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=9.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM33ETRS89: '+title=Europe - de 12d a 18d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=15.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM34ETRS89: '+title=Europe - de 18d a 24d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=21.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM35ETRS89: '+title=Europe - de 24d a 30d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=27.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM36ETRS89: '+title=Europe - de 30d a 36d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=33.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM37ETRS89: '+title=Europe - de 36d a 42d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=39.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs', + UTM38ETRS89: '+title=Europe - de 42d a 48d Est +proj=tmerc +nadgrids=null +wktext +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=0.000000000 +lon_0=45.000000000 +k_0=0.99960000 +x_0=500000.000 +y_0=0.000 +units=m +no_defs' + } + }; + return Register; +}(proj4); +LeafletCRSEPSG2154 = function (Config, Register, L) { + var EPSG2154 = { + instance: null, + build: function () { + if (!this.instance) { + var crs = new L.Proj.CRS('EPSG:2154', Register.get('EPSG:2154'), { + resolutions: this._getResolutions(), + origin: this._getOrigin() + }); + this.instance = crs; + } + return this.instance; + }, + _getResolutions: function () { + var resolutions = []; + if (Config.isConfigLoaded()) { + var o = Config.getTileMatrix('LAMB93'); + resolutions = o.nativeResolutions; + } + if (resolutions.length) { + return resolutions; + } + return [ + 104579.22454989408, + 52277.53235379051, + 26135.487078595408, + 13066.891381800004, + 6533.228604113456, + 3266.5595244626675, + 1633.2660045974187, + 816.6295549860224, + 408.31391467683596, + 204.15674151090204, + 102.07831678324082, + 51.0391448966112, + 25.519569074269395, + 12.759783693647506, + 6.379891635966491, + 3.18994576530532, + 1.5949728694977277, + 0.7974864315474559, + 0.398743214900604, + 0.19937160727567999, + 0.099685803696052, + 0.049842901818919996 + ]; + }, + _getOrigin: function () { + return [ + 0, + 12000000 + ]; + } + }; + return EPSG2154; +}(CommonUtilsConfig, CommonUtilsRegister, leaflet); +LeafletCRSEPSG27572 = function (Config, Register, L) { + var EPSG27572 = { + instance: null, + build: function () { + if (!this.instance) { + var crs = new L.Proj.CRS('EPSG:27572', Register.get('EPSG:27572'), { + resolutions: this._getResolutions(), + origin: this._getOrigin() + }); + this.instance = crs; + } + return this.instance; + }, + _getResolutions: function () { + var resolutions = []; + if (Config.isConfigLoaded()) { + var o = Config.getTileMatrix('LAMB2E'); + if (o && Object.keys(o)) { + resolutions = o.nativeResolutions; + } + } + if (resolutions.length) { + return resolutions; + } + return [ + 104579.22454989408, + 52277.53235379051, + 26135.487078595408, + 13066.891381800004, + 6533.228604113456, + 3266.5595244626675, + 1633.2660045974187, + 816.6295549860224, + 408.31391467683596, + 204.15674151090204, + 102.07831678324082, + 51.0391448966112, + 25.519569074269395, + 12.759783693647506, + 6.379891635966491, + 3.18994576530532, + 1.5949728694977277, + 0.7974864315474559, + 0.398743214900604, + 0.19937160727567999, + 0.099685803696052, + 0.049842901818919996 + ]; + }, + _getOrigin: function () { + return [ + 0, + 12000000 + ]; + } + }; + return EPSG27572; +}(CommonUtilsConfig, CommonUtilsRegister, leaflet); +LeafletCRSEPSG4326 = function (Config, Register, L) { + var EPSG4326 = { + instance: null, + build: function () { + if (!this.instance) { + var crs = new L.Proj.CRS('EPSG:4326', Register.get('EPSG:4326'), { + resolutions: this._getResolutions(), + origin: [ + -180, + 90 + ] + }); + this.instance = crs; + } + return this.instance; + }, + _getResolutions: function () { + var resolutions = []; + if (Config.isConfigLoaded()) { + resolutions = Config.getResolutions(); + } + if (resolutions.length) { + return resolutions; + } + return [ + 1.40625, + 0.703125, + 0.3515625, + 0.17578125, + 0.087890625, + 0.0439453125, + 0.02197265625, + 0.010986328125, + 0.0054931640625, + 0.00274658203125, + 0.001373291015625, + 0.0006866455078125, + 0.00034332275390625, + 0.000171661376953126, + 0.0000858306884765628, + 0.0000429153442382813, + 0.0000214576721191407, + 0.0000107288360595703, + 0.00000536441802978517, + 0.00000268220901489259, + 0.0000013411045074463, + 6.70552253723145e-7, + 3.3527612686157e-7 + ]; + }, + _getOrigin: function () { + } + }; + return EPSG4326; +}(CommonUtilsConfig, CommonUtilsRegister, leaflet); +LeafletCRSCRS = function (Proj4, Register, Epsg2154, Epsg27572, Epsg4326) { + (function () { + Proj4.load(); + Register.load(); + }()); + var CRS = { + EPSG2154: function () { + return Epsg2154.build(); + }, + EPSG27572: function () { + return Epsg27572.build(); + }, + EPSG4326: function () { + return Epsg4326.build(); + } + }; + return CRS; +}(LeafletCRSProj4Leaflet, CommonUtilsRegister, LeafletCRSEPSG2154, LeafletCRSEPSG27572, LeafletCRSEPSG4326); +LeafletControlsMousePosition = function (L, woodman, Gp, RightManagement, ID, MousePositionDOM, PositionFormater, CRS) { + var MousePosition = L.Control.extend({ + includes: MousePositionDOM, + options: { + position: 'bottomleft', + collapsed: true, + units: [], + systems: [], + displayAltitude: true, + displayCoordinates: true, + altitude: { + triggerDelay: 200, + responseDelay: 500, + noDataValue: -99999, + noDataValueTolerance: 90000, + serviceOptions: {} + } + }, + initialize: function (options) { + L.Util.extend(this.options, options); + this._uid = ID.generate(); + this._projectionSystems = []; + this._initProjectionSystems(); + this._projectionUnits = {}; + this._initProjectionUnits(); + this._isDesktop = this._detectSupport(); + if (this.options.altitude.triggerDelay < 100) { + this.options.altitude.triggerDelay = 100; + } + this._timer = this.options.altitude.triggerDelay; + this._currentProjectionSystems = this._projectionSystems[0]; + this._projectionSystemsContainer = null; + this._currentProjectionType = this._projectionSystems[0].type; + this._currentProjectionUnits = this._projectionUnits[this._currentProjectionType][0].code; + this._projectionUnitsContainer = null; + this._showMousePositionContainer = null; + if (!this.options.displayAltitude && !this.options.displayCoordinates) { + this.options.displayCoordinates = true; + } + this._noRightManagement = false; + if (this.options.displayAltitude) { + this._checkRightsManagement(); + } + L.Util.setOptions(this, this.options); + }, + onAdd: function (map) { + var container = this._container = this._initLayout(); + if (!this.options.collapsed) { + if (this._isDesktop) { + map.on('mousemove', this.onMouseMove, this); + } else { + map.on('move', this.onMapMove, this); + } + } + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + L.DomEvent.addListener(container, 'mousemove', L.DomEvent.stopPropagation).addListener(container, 'mousemove', L.DomEvent.preventDefault); + return container; + }, + onRemove: function (map) { + map.off('mousemove', this.onMouseMove); + }, + _initProjectionSystems: function () { + var projectionSystemsByDefault = [ + { + label: 'Géographique', + crs: L.CRS.Simple, + type: 'Geographical' + }, + { + label: 'Web Mercator', + crs: L.CRS.EPSG3395, + type: 'Metric' + }, + { + label: 'Lambert 93', + crs: CRS.EPSG2154, + type: 'Metric', + geoBBox: { + left: -9.86, + bottom: 41.15, + right: 10.38, + top: 51.56 + } + }, + { + label: 'Lambert II étendu', + crs: CRS.EPSG27572, + type: 'Metric', + geoBBox: { + left: -4.87, + bottom: 42.33, + right: 8.23, + top: 51.14 + } + } + ]; + var systems = this.options.systems; + for (var i = 0; i < systems.length; i++) { + var sys = systems[i]; + if (!sys.label) { + continue; + } + if (!sys.crs) { + continue; + } + if (!sys.type) { + sys.type = 'Metric'; + } + this._projectionSystems.push(systems[i]); + var found = false; + for (var j = 0; j < projectionSystemsByDefault.length; j++) { + var obj = projectionSystemsByDefault[j]; + if (sys.crs === obj.crs) { + found = true; + } + } + if (!found) { + } + } + if (this._projectionSystems.length === 0) { + this._projectionSystems = projectionSystemsByDefault; + } + for (var k = 0; k < this._projectionSystems.length; ++k) { + this._projectionSystems[k].code = k; + } + }, + _initProjectionUnits: function () { + var projectionUnitsByDefault = { + Geographical: [ + { + code: 'DEC', + label: 'degrés décimaux', + convert: this._displayDEC + }, + { + code: 'DMS', + label: 'degrés sexagésimaux', + convert: this._displayDMS + }, + { + code: 'RAD', + label: 'radians', + convert: this._displayRAD + }, + { + code: 'GON', + label: 'grades', + convert: this._displayGON + } + ], + Metric: [ + { + code: 'M', + label: 'mètres', + convert: this._displayMeter + }, + { + code: 'KM', + label: 'kilomètres', + convert: this._displayKMeter + } + ] + }; + var units = this.options.units; + for (var type in projectionUnitsByDefault) { + if (projectionUnitsByDefault.hasOwnProperty(type)) { + var found = false; + for (var j = 0; j < projectionUnitsByDefault[type].length; j++) { + var obj = projectionUnitsByDefault[type][j]; + for (var i = 0; i < units.length; i++) { + var unit = units[i]; + if (obj.code === unit) { + found = true; + if (!this._projectionUnits[type]) { + this._projectionUnits[type] = []; + } + this._projectionUnits[type].push(obj); + } + } + } + if (!found) { + this._projectionUnits[type] = projectionUnitsByDefault[type]; + } + } + } + if (Object.keys(this._projectionUnits).length === 0) { + this._projectionUnits = projectionUnitsByDefault; + } + }, + _checkRightsManagement: function () { + var rightManagement = RightManagement.check({ + key: this.options.apiKey, + resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'], + services: ['Elevation'] + }); + if (!rightManagement) { + this._noRightManagement = true; + } + if (!this.options.apiKey) { + this.options.apiKey = rightManagement.key; + } + }, + _detectSupport: function () { + var isDesktop = true; + var userAgent = window.navigator.userAgent.toLowerCase(); + 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) { + isDesktop = false; + } + if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) { + isDesktop = true; + } + return isDesktop; + }, + _initLayout: function () { + var container = this._createMainContainerElement(); + var inputShow = this._showMousePositionContainer = this._createShowMousePositionElement(); + container.appendChild(inputShow); + if (!this.options.collapsed) { + inputShow.checked = true; + } + var picto = this._createShowMousePositionPictoElement(this._isDesktop); + container.appendChild(picto); + var panel = this._createMousePositionPanelElement(this.options.displayAltitude, this.options.displayCoordinates); + var settings = this._createMousePositionSettingsElement(); + var systems = this._projectionSystemsContainer = this._createMousePositionSettingsSystemsElement(this._projectionSystems); + var units = this._projectionUnitsContainer = this._createMousePositionSettingsUnitsElement(this._projectionUnits[this._currentProjectionType]); + settings.appendChild(systems); + settings.appendChild(units); + panel.appendChild(settings); + container.appendChild(panel); + var center = this._createMapCenter(); + var map = this._map; + map.getContainer().appendChild(center); + return container; + }, + _setElevationPanel: function (active) { + var div = null; + if (!active) { + div = L.DomUtil.get(this._addUID('GPmousePositionAltitude')); + div.style.display = 'none'; + } + if (active && this._noRightManagement) { + div = L.DomUtil.get(this._addUID('GPmousePositionAlt')); + div.innerHTML = 'no right !'; + } + }, + _setCoordinatePanel: function (active) { + if (!active) { + var div = L.DomUtil.get(this._addUID('GPmousePositionCoordinate')); + div.style.display = 'none'; + } + }, + _setSettingsPanel: function (active) { + if (!active) { + var divPicto = L.DomUtil.get('GPshowMousePositionSettingsPicto'); + var divPanel = L.DomUtil.get(this._addUID('GPmousePositionSettings')); + divPicto.style.display = 'none'; + divPanel.style.display = 'none'; + } + }, + _setTypeUnitsPanel: function (type) { + var container = this._projectionUnitsContainer; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + var units = this._projectionUnits[type]; + for (var j = 0; j < units.length; j++) { + var obj = units[j]; + var option = document.createElement('option'); + option.value = obj.code ? obj.code : j; + option.text = obj.label || j; + container.appendChild(option); + } + this._currentProjectionType = type; + this._currentProjectionUnits = this._projectionUnits[type][0].code; + }, + _displayDEC: function (oLatLng) { + var coordinate = {}; + coordinate.lat = PositionFormater.roundToDecimal(oLatLng.lat, 6); + coordinate.lng = PositionFormater.roundToDecimal(oLatLng.lng, 6); + return coordinate; + }, + _displayDMS: function (oLatLng) { + var coordinate = {}; + coordinate.lat = PositionFormater.decimalLatToDMS(oLatLng.lat); + coordinate.lng = PositionFormater.decimalLongToDMS(oLatLng.lng); + return coordinate; + }, + _displayRAD: function (oLatLng) { + var coordinate = {}; + coordinate.lat = PositionFormater.decimalToRadian(oLatLng.lat); + coordinate.lng = PositionFormater.decimalToRadian(oLatLng.lng); + return coordinate; + }, + _displayGON: function (oLatLng) { + var coordinate = {}; + coordinate.lat = PositionFormater.decimalToGrade(oLatLng.lat); + coordinate.lng = PositionFormater.decimalToGrade(oLatLng.lng); + return coordinate; + }, + _displayMeter: function (oXY) { + var coordinate = {}; + coordinate.x = L.Util.formatNum(oXY.x, 2); + coordinate.y = L.Util.formatNum(oXY.y, 2); + coordinate.unit = 'm'; + return coordinate; + }, + _displayKMeter: function (oXY) { + var coordinate = {}; + coordinate.x = L.Util.formatNum(oXY.x / 1000, 2); + coordinate.y = L.Util.formatNum(oXY.y / 1000, 2); + coordinate.unit = 'km'; + return coordinate; + }, + _project: function (oLatLng, crs) { + if (typeof crs === 'function') { + crs = crs(); + } + if (typeof crs !== 'object') { + return; + } + if (crs === L.CRS.Simple) { + return oLatLng; + } + if (!crs.projection || typeof crs.projection !== 'object') { + return; + } + var oPoint = crs.projection.project(oLatLng); + if (this._currentProjectionType === 'Geographical') { + oPoint.lat = oPoint.y; + oPoint.lng = oPoint.x; + } + if (!oPoint || Object.keys(oPoint).length === 0) { + } + return oPoint; + }, + _setCoordinate: function (oLatLng) { + var type = this._currentProjectionSystems.type; + var convert = null; + var units = this._projectionUnits[type]; + for (var i = 0; i < units.length; i++) { + if (units[i].code === this._currentProjectionUnits) { + convert = units[i].convert; + break; + } + } + var coordinate = {}; + var oSrs = this._currentProjectionSystems.crs; + if (!oSrs) { + return; + } + coordinate = convert(this._project(oLatLng, oSrs)); + if (!coordinate || Object.keys(coordinate).lenght === 0) { + return; + } + this.GPdisplayCoords(coordinate); + }, + _setElevation: function (oLatLng) { + var delay = this.options.altitude.responseDelay; + var noDataValue = this.options.altitude.noDataValue; + var noDataValueTolerance = this.options.altitude.noDataValueTolerance; + this.GPdisplayElevation(oLatLng, delay, noDataValue, noDataValueTolerance); + }, + onMoveStopped: function (oLatLng) { + if (this._noRightManagement) { + return; + } + this._setElevation(oLatLng); + }, + onMouseMove: function (e) { + var self = this; + var oLatLng = e.latlng; + this._setCoordinate(oLatLng); + clearTimeout(this._timer); + this._timer = setTimeout(function () { + self.onMoveStopped(oLatLng); + }, this.options.altitude.triggerDelay); + }, + onMapMove: function () { + var self = this; + var map = this._map; + var oLatLng = map.getCenter(); + this._setCoordinate(oLatLng); + clearTimeout(this._timer); + this._timer = setTimeout(function () { + self.onMoveStopped(oLatLng); + }, this.options.altitude.triggerDelay); + }, + onRequestAltitude: function (coordinate, callback) { + if (!coordinate || Object.keys(coordinate).length === 0) { + return; + } + if (!this.options.displayAltitude) { + return; + } + if (this._noRightManagement) { + return; + } + var options = {}; + L.Util.extend(options, this.options.altitude.serviceOptions); + L.Util.extend(options, { + zonly: true, + positions: [{ + lon: coordinate.lon || coordinate.lng, + lat: coordinate.lat + }] + }); + L.Util.extend(options, { + scope: this, + onSuccess: function (results) { + if (results && Object.keys(results)) { + callback.call(this, results.elevations[0].z); + } + }, + onFailure: function (error) { + } + }); + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey }); + Gp.Services.getAltitude(options); + }, + onShowMousePositionClick: function (e) { + var map = this._map; + if (this._showMousePositionContainer.checked) { + this._isDesktop ? map.off('mousemove', this.onMouseMove, this) : map.off('move', this.onMapMove, this); + } else { + this._isDesktop ? map.on('mousemove', this.onMouseMove, this) : map.on('move', this.onMapMove, this); + } + this._setElevationPanel(this.options.displayAltitude); + this._setCoordinatePanel(this.options.displayCoordinates); + if (!this.options.displayCoordinates) { + this._setSettingsPanel(false); + } + }, + onMousePositionProjectionSystemChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + var label = e.target.options[idx].label; + this._setCurrentSystem(value); + }, + _setCurrentSystem: function (systemCode) { + var type = null; + for (var i = 0; i < this._projectionSystems.length; ++i) { + if (this._projectionSystems[i].code == systemCode) { + type = this._projectionSystems[i].type; + break; + } + } + if (!type) { + return; + } + if (type !== this._currentProjectionType) { + this._setTypeUnitsPanel(type); + } + this._currentProjectionSystems = this._projectionSystems[Number(systemCode)]; + if (!this._isDesktop) { + this.onMapMove(); + } + }, + onMousePositionProjectionSystemMouseOver: function (e) { + var map = this._map; + if (!map) { + return; + } + var systemList = document.getElementById(this._addUID('GPmousePositionProjectionSystem')); + systemList.innerHTML = ''; + for (var j = 0; j < this._projectionSystems.length; j++) { + var proj = this._projectionSystems[j]; + if (proj.geoBBox) { + if (map.getBounds()._southWest.lng > proj.geoBBox.right || map.getBounds()._southWest.lat > proj.geoBBox.top || map.getBounds()._northEast.lng < proj.geoBBox.left || map.getBounds()._northEast.lat < proj.geoBBox.bottom) { + if (proj === this._currentProjectionSystems) { + var option = document.createElement('option'); + option.value = proj.code; + option.text = proj.label || j; + option.setAttribute('selected', 'selected'); + option.setAttribute('disabled', 'disabled'); + systemList.appendChild(option); + } + continue; + } + } + var option = document.createElement('option'); + option.value = proj.code; + option.text = proj.label || j; + if (proj === this._currentProjectionSystems) { + option.setAttribute('selected', 'selected'); + } + systemList.appendChild(option); + } + }, + onMousePositionProjectionUnitsChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + var label = e.target.options[idx].label; + this._currentProjectionUnits = value; + if (!this._isDesktop) { + this.onMapMove(); + } + } + }); + return MousePosition; +}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsMousePositionDOM, LeafletControlsUtilsPositionFormater, LeafletCRSCRS); +CommonControlsReverseGeocodingDOM = function () { + var ReverseGeocodingDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPreverseGeocoding'); + container.className = 'GPwidget'; + return container; + }, + _createShowReverseGeocodingElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowReverseGeocoding'); + input.type = 'checkbox'; + return input; + }, + _createShowReverseGeocodingPictoElement: function () { + var self = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowReverseGeocodingPicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowReverseGeocoding'); + label.title = 'Ouvrir la recherche inverse'; + if (label.addEventListener) { + label.addEventListener('click', function () { + self.onShowReverseGeocodingClick(); + }); + } else if (label.attachEvent) { + label.attachEvent('onclick', function () { + self.onShowReverseGeocodingClick(); + }); + } + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowReverseGeocodingOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createReverseGeocodingWaitingElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPreverseGeocodingCalcWaitingContainer'); + div.className = 'GPreverseGeocodingCalcWaitingContainerHidden'; + var p = document.createElement('p'); + p.className = 'GPreverseGeocodingCalcWaiting'; + p.innerHTML = 'Recherche en cours...'; + div.appendChild(p); + return div; + }, + _createReverseGeocodingResultsPanelElement: function () { + var resultsPanelDiv = document.createElement('div'); + resultsPanelDiv.id = this._addUID('GPreverseGeocodingResultsPanel'); + resultsPanelDiv.className = 'GPpanel GPreverseGeocodingComponentHidden'; + return resultsPanelDiv; + }, + _createReverseGeocodingResultsListElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPreverseGeocodingResultsList'); + return container; + }, + _createReverseGeocodingResultElement: function (locationDescription, id) { + var context = this; + var container = document.getElementById(this._addUID('GPreverseGeocodingResultsList')); + var div = document.createElement('div'); + div.id = this._addUID('ReverseGeocodedLocation_' + id); + div.className = 'GPautoCompleteProposal'; + div.innerHTML = locationDescription; + div.title = locationDescription; + if (div.addEventListener) { + div.addEventListener('mouseover', function (e) { + context.onReverseGeocodingResultMouseOver(e); + }); + div.addEventListener('mouseout', function (e) { + context.onReverseGeocodingResultMouseOut(e); + }); + div.addEventListener('click', function (e) { + if (typeof context.onReverseGeocodingResultClick === 'function') { + context.onReverseGeocodingResultClick(e); + } + }); + } else if (div.attachEvent) { + div.attachEvent('onmouseover', function (e) { + context.onReverseGeocodingResultMouseOver(e); + }); + div.attachEvent('onmouseout', function (e) { + context.onReverseGeocodingResultMouseOut(e); + }); + div.attachEvent('onclick', function (e) { + if (typeof context.onReverseGeocodingResultClick === 'function') { + context.onReverseGeocodingResultClick(e); + } + }); + } + container.appendChild(div); + }, + _createReverseGeocodingPanelElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPreverseGeocodingPanel'); + div.className = 'GPpanel'; + return div; + }, + _createReverseGeocodingPanelHeaderElement: function () { + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + return container; + }, + _createReverseGeocodingPanelReturnPictoElement: function () { + var self = this; + var divNew = document.createElement('div'); + divNew.id = this._addUID('GPreverseGeocodingReturnPicto'); + divNew.title = 'Nouvelle recherche'; + divNew.className = 'GPreverseGeocodingReturnPictoHidden'; + if (divNew.addEventListener) { + divNew.addEventListener('click', function (e) { + document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden'; + document.getElementById(self._addUID('GPreverseGeocodingForm')).className = ''; + document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse'; + document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden'; + self.onGPreverseGeocodingReturnPictoClick(e); + }); + } else if (divNew.attachEvent) { + divNew.attachEvent('onclick', function (e) { + document.getElementById(self._addUID('GPreverseGeocodingResultsPanel')).className = 'GProuteComponentHidden'; + document.getElementById(self._addUID('GPreverseGeocodingForm')).className = ''; + document.getElementById(self._addUID('GPreverseGeocodingHeaderTitle')).innerHTML = 'Recherche inverse'; + document.getElementById(self._addUID('GPreverseGeocodingReturnPicto')).className = 'GPreverseGeocodingReturnPictoHidden'; + self.onGPreverseGeocodingReturnPictoClick(e); + }); + } + return divNew; + }, + _createReverseGeocodingPanelTitleElement: function () { + var div = document.createElement('div'); + div.className = 'GPpanelTitle'; + div.id = this._addUID('GPreverseGeocodingHeaderTitle'); + div.innerHTML = 'Recherche inverse'; + return div; + }, + _createReverseGeocodingPanelCloseElement: function () { + var self = this; + var divClose = document.createElement('div'); + divClose.id = this._addUID('GPreverseGeocodingPanelClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer le panneau'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click(); + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPshowReverseGeocodingPicto')).click(); + }); + } + return divClose; + }, + _createReverseGeocodingPanelFormElement: function () { + var self = this; + var form = document.createElement('form'); + form.id = this._addUID('GPreverseGeocodingForm'); + if (form.addEventListener) { + form.addEventListener('submit', function (e) { + e.preventDefault(); + self.onReverseGeocodingSubmit(); + }); + } else if (form.attachEvent) { + form.attachEvent('onsubmit', function (e) { + e.preventDefault(); + self.onReverseGeocodingSubmit(); + }); + } + return form; + }, + _createReverseGeocodingFormModeChoiceGeocodingTypeElement: function (resources) { + var context = this; + var div = document.createElement('div'); + div.className = 'GPflexInput'; + var label = document.createElement('label'); + label.className = 'GPreverseGeocodingCodeLabel'; + label.innerHTML = 'Recherche par'; + label.title = 'Recherche par'; + div.appendChild(label); + var select = document.createElement('select'); + select.className = 'GPreverseGeocodingCode'; + if (select.addEventListener) { + select.addEventListener('change', function (e) { + context.onReverseGeocodingTypeChange(e); + }); + } else if (select.attachEvent) { + select.attachEvent('onchange', function (e) { + context.onReverseGeocodingTypeChange(e); + }); + } + if (!resources || !Array.isArray(resources)) { + resources = [ + 'StreetAddress', + 'PositionOfInterest', + 'CadastralParcel' + ]; + } + for (var i = 0; i < resources.length; i++) { + switch (resources[i]) { + case 'PositionOfInterest': + var POIOption = document.createElement('option'); + POIOption.value = 'PositionOfInterest'; + POIOption.text = 'Lieux/toponymes'; + select.appendChild(POIOption); + break; + case 'StreetAddress': + var SAOption = document.createElement('option'); + SAOption.value = 'StreetAddress'; + SAOption.text = 'Adresses'; + select.appendChild(SAOption); + break; + case 'CadastralParcel': + var CPOption = document.createElement('option'); + CPOption.value = 'CadastralParcel'; + CPOption.text = 'Parcelles cadastrales'; + select.appendChild(CPOption); + break; + case 'Administratif': + var adminOption = document.createElement('option'); + adminOption.value = 'Administratif'; + adminOption.text = 'Unités administratives'; + select.appendChild(adminOption); + break; + default: + break; + } + } + div.appendChild(select); + return div; + }, + _createReverseGeocodingFormModeChoiceGeocodingDelimitationElement: function (delimitations) { + var context = this; + var div = document.createElement('div'); + div.className = 'GPflexInput'; + var label = document.createElement('label'); + label.className = 'GPreverseGeocodingCodeLabel'; + label.innerHTML = 'Délimitation'; + label.title = 'Délimitation'; + div.appendChild(label); + var select = document.createElement('select'); + select.className = 'GPreverseGeocodingCode'; + if (select.addEventListener) { + select.addEventListener('change', function (e) { + context.onReverseGeocodingDelimitationChange(e); + }); + } else if (select.attachEvent) { + select.attachEvent('onchange', function (e) { + context.onReverseGeocodingDelimitationChange(e); + }); + } + if (!delimitations || !Array.isArray(delimitations)) { + delimitations = [ + 'Point', + 'Circle', + 'Extent' + ]; + } + for (var i = 0; i < delimitations.length; i++) { + switch (delimitations[i].toLowerCase()) { + case 'point': + var pointOption = document.createElement('option'); + pointOption.value = 'point'; + pointOption.text = 'Pointer un lieu'; + select.appendChild(pointOption); + break; + case 'circle': + var circleOption = document.createElement('option'); + circleOption.value = 'circle'; + circleOption.text = 'Dessiner un cercle'; + select.appendChild(circleOption); + break; + case 'extent': + var extentOption = document.createElement('option'); + extentOption.value = 'extent'; + extentOption.text = 'Dessiner une emprise'; + select.appendChild(extentOption); + break; + default: + break; + } + } + div.appendChild(select); + return div; + }, + _createReverseGeocodingSubmitFormElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPreverseGeocodingSubmit'); + input.className = 'GPinputSubmit'; + input.type = 'submit'; + input.value = 'Rechercher'; + return input; + } + }; + return ReverseGeocodingDOM; +}(); +LeafletControlsReverseGeocoding = function (L, P, woodman, Gp, RightManagement, ID, IconDefault, ReverseGeocodingDOM) { + var ReverseGeocoding = L.Control.extend({ + includes: ReverseGeocodingDOM, + options: { + position: 'bottomleft', + collapsed: true, + resources: [ + 'StreetAddress', + 'PositionOfInterest' + ], + delimitations: [ + 'Point', + 'Circle', + 'Extent' + ], + reverseGeocodeOptions: {} + }, + initialize: function (options) { + L.Util.extend(this.options, options); + this._noRightManagement = false; + this._servicesRightManagement = {}; + this._checkRightsManagement(); + this._checkInputOptions(); + this._uid = ID.generate(); + this._currentGeocodingType = null; + this._initGeocodingType(); + this._currentGeocodingDelimitation = null; + this._initGeocodingDelimitation(); + this._showReverseGeocodingContainer = null; + this._panelHeaderContainer = null; + this._panelTitleContainer = null; + this._returnPictoContainer = null; + this._formContainer = null; + this._resultsContainer = null; + this._resultsListContainer = null; + this._waitingContainer = null; + this._inputFeaturesLayer = null; + this._inputResultsLayer = null; + this._lastIdLayer = 0; + this._currentIdLayer = 0; + this._currentFeature = null; + this._requestPosition = null; + this._requestCircleFilter = null; + this._requestBboxFilter = null; + this._waiting = false; + this._timer = null; + this._reverseGeocodingLocations = []; + }, + onAdd: function (map) { + var container = this._container = this._initLayout(); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + if (map) { + if (!this.options.collapsed) { + this._activateMapInteraction(map); + } + } + return container; + }, + onRemove: function () { + }, + _checkRightsManagement: function () { + var _resources = []; + var _key; + var _opts = null; + _key = this.options.reverseGeocodeOptions.apiKey; + _opts = this.options.reverseGeocodeOptions.filterOptions; + _resources = _opts ? _opts.type : []; + if (!_resources || _resources.length === 0) { + _resources = this.options.resources; + } + if (!_resources || _resources.length === 0) { + _resources = [ + 'StreetAddress', + 'PositionOfInterest' + ]; + } + var rightManagementGeocode = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _resources, + services: ['Geocode'] + }); + if (!rightManagementGeocode) { + this._noRightManagement = true; + return; + } + if (!this.options.apiKey) { + this.options.apiKey = rightManagementGeocode.key; + } + if (rightManagementGeocode) { + this._servicesRightManagement['Geocode'] = rightManagementGeocode['Geocode']; + } + }, + _checkInputOptions: function () { + var i; + if (this.options.resources) { + var resources = this.options.resources; + if (!Array.isArray(resources)) { + console.log('[ReverseGeocoding] \'options.resources\' parameter should be an array'); + resources = null; + } + var resourcesList = [ + 'StreetAddress', + 'PositionOfInterest', + 'CadastralParcel', + 'Administratif' + ]; + for (i = 0; i < resources.length; i++) { + if (resourcesList.indexOf(resources[i]) === -1) { + console.log('[ReverseGeocoding] options.resources : ' + resources[i] + ' is not a resource for reverse geocode'); + } + } + } + if (this.options.delimitations) { + var delimitations = this.options.delimitations; + if (!Array.isArray(delimitations)) { + console.log('[ReverseGeocoding] \'options.delimitations\' parameter should be an array'); + delimitations = null; + } + var delimitationsList = [ + 'Circle', + 'Point', + 'Extent' + ]; + for (i = 0; i < delimitations.length; i++) { + if (delimitationsList.indexOf(delimitations[i]) === -1) { + console.log('[ReverseGeocoding] options.delimitations : ' + delimitations[i] + ' is not a delimitation for reverse geocode'); + } + } + } + }, + _initGeocodingType: function () { + this._currentGeocodingType = 'StreetAddress'; + var resources = this.options.resources; + if (!resources || resources.length === 0) { + this.options.resources = [ + 'StreetAddress', + 'PositionOfInterest', + 'CadastralParcel' + ]; + } + if (Array.isArray(resources) && resources.length) { + var noRightsIndexes = []; + for (var i = 0; i < resources.length; i++) { + if (this._servicesRightManagement['Geocode'].indexOf(resources[i]) < 0) { + noRightsIndexes.push(i); + console.log('[ReverseGeocode] no rights for options.resources : ' + resources[i]); + } + } + if (noRightsIndexes.length !== 0) { + for (var j = 0; j < noRightsIndexes.length; j++) { + resources.splice(noRightsIndexes[j], 1); + } + } + if (resources[0] === 'StreetAddress' || resources[0] === 'PositionOfInterest' || resources[0] === 'CadastralParcel' || resources[0] === 'Administratif') { + this._currentGeocodingType = resources[0]; + } + } + var serviceOptions = this.options.reverseGeocodeOptions; + if (serviceOptions.filterOptions && Array.isArray(serviceOptions.filterOptions.type) && serviceOptions.filterOptions.type.length !== 0) { + this._currentGeocodingType = serviceOptions.filterOptions.type[0]; + } + }, + _initGeocodingDelimitation: function () { + this._currentGeocodingDelimitation = 'Point'; + var delimitations = this.options.delimitations; + if (!delimitations || delimitations.length === 0) { + this.options.delimitations = [ + 'Point', + 'Circle', + 'Extent' + ]; + } + if (Array.isArray(delimitations) && delimitations.length) { + var d = delimitations[0].toLowerCase(); + if (d === 'point' || d === 'circle' || d === 'extent') { + this._currentGeocodingDelimitation = delimitations[0]; + } + } + }, + _initLayout: function () { + var container = this._createMainContainerElement(); + var inputShow = this._showReverseGeocodingContainer = this._createShowReverseGeocodingElement(); + container.appendChild(inputShow); + if (!this.options.collapsed) { + inputShow.checked = true; + } + var picto = this._createShowReverseGeocodingPictoElement(); + container.appendChild(picto); + var reverseGeocodingPanel = this._createReverseGeocodingPanelElement(); + var panelHeader = this._panelHeaderContainer = this._createReverseGeocodingPanelHeaderElement(); + var returnPicto = this._returnPictoContainer = this._createReverseGeocodingPanelReturnPictoElement(); + panelHeader.appendChild(returnPicto); + var panelTitle = this._panelTitleContainer = this._createReverseGeocodingPanelTitleElement(); + panelHeader.appendChild(panelTitle); + var closeDiv = this._createReverseGeocodingPanelCloseElement(); + panelHeader.appendChild(closeDiv); + reverseGeocodingPanel.appendChild(panelHeader); + var reverseGeocodingForm = this._formContainer = this._createReverseGeocodingPanelFormElement(); + reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingTypeElement(this.options.resources)); + reverseGeocodingForm.appendChild(this._createReverseGeocodingFormModeChoiceGeocodingDelimitationElement(this.options.delimitations)); + var submit = this._createReverseGeocodingSubmitFormElement(); + reverseGeocodingForm.appendChild(submit); + reverseGeocodingPanel.appendChild(reverseGeocodingForm); + var waiting = this._waitingContainer = this._createReverseGeocodingWaitingElement(); + reverseGeocodingPanel.appendChild(waiting); + var resultsPanel = this._resultsContainer = this._createReverseGeocodingResultsPanelElement(); + var reverseGeocodingResultsList = this._resultsListContainer = this._createReverseGeocodingResultsListElement(); + resultsPanel.appendChild(reverseGeocodingResultsList); + reverseGeocodingPanel.appendChild(resultsPanel); + container.appendChild(reverseGeocodingPanel); + return container; + }, + _activateMapInteraction: function (map) { + if (this._inputFeaturesLayer === null) { + this._inputFeaturesLayer = new L.FeatureGroup(); + map.addLayer(this._inputFeaturesLayer); + var self = this; + map.on('draw:created', function (e) { + var layer = e.layer; + var type = e.layerType; + self._setFeaturePosition(layer, type); + self._currentIdLayer = L.Util.stamp(layer); + self._setFeatureLayer(layer); + }); + map.on('draw:drawstart', function () { + self._removeFeatureLayer(self._lastIdLayer); + self._lastIdLayer = self._currentIdLayer; + }); + map.on('draw:drawstop', function () { + }); + } + var delimitation = this._currentGeocodingDelimitation.toLowerCase(); + switch (delimitation) { + case 'point': + this._activatePointInteraction(map); + break; + case 'circle': + this._activateCircleInteraction(map); + break; + case 'extent': + this._activateBoxInteraction(map); + break; + default: + break; + } + }, + _removeMapInteraction: function (map) { + if (!map) { + return; + } + if (this._inputFeaturesLayer !== null) { + map.off('draw:created'); + map.off('draw:drawstart'); + map.off('draw:drawstop'); + map.removeLayer(this._inputFeaturesLayer); + this._inputFeaturesLayer = null; + } + this._lastIdLayer = this._currentIdLayer = 0; + if (this._currentFeature) { + this._currentFeature.disable(); + } + }, + _activatePointInteraction: function (map) { + if (this._currentFeature) { + this._currentFeature.disable(); + } + L.drawLocal.draw.handlers.marker.tooltip.start = 'click map to place search point'; + var markerOptions = { repeatMode: true }; + this._currentFeature = new L.Draw.Marker(map, markerOptions); + this._currentFeature.enable(); + }, + _activateCircleInteraction: function (map) { + if (this._currentFeature) { + this._currentFeature.disable(); + } + var circleOptions = { repeatMode: true }; + this._currentFeature = new L.Draw.Circle(map, circleOptions); + this._currentFeature.enable(); + }, + _activateBoxInteraction: function (map) { + if (this._currentFeature) { + this._currentFeature.disable(); + } + var rectangleOptions = { repeatMode: true }; + this._currentFeature = new L.Draw.Rectangle(map, rectangleOptions); + this._currentFeature.enable(); + }, + _setFeaturePosition: function (layer, type) { + var oLatLng = null; + if (type === 'marker') { + oLatLng = layer.getLatLng(); + this._requestPosition = { + x: oLatLng.lat, + y: oLatLng.lng + }; + } else if (type === 'circle') { + oLatLng = layer.getLatLng(); + this._requestPosition = { + x: oLatLng.lat, + y: oLatLng.lng + }; + this._requestCircleFilter = { + x: oLatLng.lat, + y: oLatLng.lng, + radius: layer.getRadius() + }; + } else if (type === 'rectangle') { + oLatLng = layer.getBounds(); + var center = { + lng: (oLatLng.getSouthWest().lng + oLatLng.getNorthEast().lng) / 2, + lat: (oLatLng.getSouthWest().lat + oLatLng.getNorthEast().lat) / 2 + }; + this._requestPosition = { + x: center.lat, + y: center.lng + }; + this._requestBboxFilter = { + left: oLatLng.getSouthWest().lat, + right: oLatLng.getNorthEast().lat, + bottom: oLatLng.getSouthWest().lng, + top: oLatLng.getNorthEast().lng + }; + } else { + } + }, + _setFeatureLayer: function (layer) { + if (!this._inputFeaturesLayer) { + return; + } + this._inputFeaturesLayer.addLayer(layer); + }, + _removeFeatureLayer: function (id) { + if (!this._inputFeaturesLayer) { + return; + } + if (id === 0) { + return; + } + if (!id) { + this._inputFeaturesLayer.clearLayers(); + } else { + this._inputFeaturesLayer.removeLayer(id); + } + }, + _reverseGeocodingRequest: function (settings) { + var map = this._map; + this._removeMapInteraction(map); + var options = {}; + L.Util.extend(options, this.options.reverseGeocodeOptions); + L.Util.extend(options, settings); + L.Util.extend(options, { + apiKey: this.options.apiKey, + srs: 'EPSG:4326', + returnFreeForm: false, + timeOut: 30000, + protocol: 'XHR' + }); + var _type = options.filterOptions.type; + if (this._currentGeocodingDelimitation.toLowerCase() === 'circle' && this._requestCircleFilter) { + if (this._requestCircleFilter.radius > 1000) { + this._requestCircleFilter.radius = 1000; + } + L.Util.extend(options, { + filterOptions: { + type: _type, + circle: this._requestCircleFilter + } + }); + } + if (this._currentGeocodingDelimitation.toLowerCase() === 'extent' && this._requestBboxFilter) { + L.Util.extend(options, { + filterOptions: { + type: _type, + bbox: this._requestBboxFilter + } + }); + } + this._displayWaitingContainer(); + Gp.Services.reverseGeocode(options); + }, + _displayGeocodedLocations: function (locations) { + this._clearLocations(); + this._clearLocationsFeature(); + this._reverseGeocodingLocations = locations; + if (!locations || locations.length === 0) { + this._clearInputRequest(); + return; + } + this._formContainer.className = 'GPreverseGeocodingComponentHidden'; + this._hideWaitingContainer(); + this._panelTitleContainer.innerHTML = 'Résultats de la recherche'; + this._returnPictoContainer.className = ''; + this._resultsContainer.className = 'GPpanel'; + this._fillGeocodedLocationListContainer(locations); + this._displayGeocodedLocationsOnMap(locations); + var map = this._map; + map.fitBounds(this._inputResultsLayer.getBounds()); + }, + _fillGeocodedLocationListContainer: function (locations) { + for (var i = 0; i < locations.length; i++) { + var location = locations[i]; + var locationDescription = this._fillGeocodedLocationDescription(location); + if (locationDescription.length !== 0) { + this._createReverseGeocodingResultElement(locationDescription, i); + } + } + }, + _fillGeocodedLocationDescription: function (location) { + if (!location || !location.placeAttributes) { + return; + } + var attr = location.placeAttributes; + var locationDescription = ''; + switch (location.type) { + case 'StreetAddress': + if (attr.street) { + locationDescription += attr.number ? attr.number + ' ' : ''; + locationDescription += attr.street + ', '; + } + locationDescription += attr.postalCode + ' ' + attr.commune; + break; + case 'PositionOfInterest': + if (location.matchType === 'City' && attr.commune) { + locationDescription += attr.commune; + locationDescription += attr.postalCode ? ', ' + attr.postalCode : ''; + } else if (location.matchType === 'Département' && attr.municipality) { + locationDescription += attr.municipality; + locationDescription += attr.postalCode ? ', ' + attr.postalCode : ''; + } else if (location.matchType === 'Toponym' && attr.municipality) { + locationDescription += attr.municipality; + locationDescription += attr.postalCode ? ', ' + attr.postalCode : ''; + locationDescription += attr.commune ? ' ' + attr.commune : ''; + } else { + locationDescription += attr.municipality ? attr.municipality : ''; + } + locationDescription += attr.nature ? ' (' + attr.nature + ') ' : ''; + break; + case 'CadastralParcel': + locationDescription += attr.cadastralParcel ? attr.cadastralParcel : ''; + locationDescription += attr.municipality ? ' (' + attr.municipality + ')' : ''; + break; + case 'Administratif': + locationDescription += attr.municipality ? attr.municipality : ''; + if (attr.inseeDepartment) { + locationDescription += '(Département)'; + } else if (attr.inseeRegion) { + locationDescription += '(Région)'; + } + break; + default: + locationDescription += attr.municipality ? attr.municipality : ''; + break; + } + return locationDescription; + }, + _displayGeocodedLocationsOnMap: function (locations) { + var map = this._map; + var self = this; + function _setHighLight(e) { + var layer = e.target; + layer.setIcon(new IconDefault('red')); + var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid); + L.DomUtil.addClass(div, 'GPreverseGeocodedLocationHighlight'); + div.scrollIntoView(false); + } + function _resetHighLight(e) { + var layer = e.target; + layer.setIcon(new IconDefault('green')); + var div = L.DomUtil.get('ReverseGeocodedLocation_' + layer.options.id + '-' + self._uid); + L.DomUtil.removeClass(div, 'GPreverseGeocodedLocationHighlight'); + } + this._inputResultsLayer = new L.FeatureGroup(); + map.addLayer(this._inputResultsLayer); + for (var i = 0; i < locations.length; i++) { + var location = locations[i]; + if (!location) { + continue; + } + var options = { + id: i, + icon: new IconDefault('green'), + riseOnHover: true, + draggable: false, + clickable: true, + zIndexOffset: 1000 + }; + var _marker = L.marker(L.latLng(location.position.x, location.position.y), options); + var popupContent = '
    '; + var attributes = location.placeAttributes; + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr)) { + if (attr !== 'bbox') { + popupContent += '
  • '; + popupContent += '' + attr.toUpperCase() + ' : '; + popupContent += attributes[attr]; + popupContent += '
  • '; + } + } + } + popupContent += '
'; + _marker.bindPopup(popupContent); + _marker.on('mouseover', _setHighLight); + _marker.on('mouseout', _resetHighLight); + this._inputResultsLayer.addLayer(_marker); + } + }, + onShowReverseGeocodingClick: function () { + var map = this._map; + if (this._showReverseGeocodingContainer.checked) { + this._removeMapInteraction(map); + } else { + if (!this._waiting && !this._reverseGeocodingLocations.length) { + this._activateMapInteraction(map); + } + } + }, + onReverseGeocodingTypeChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + if (!value) { + return; + } + this._currentGeocodingType = value; + }, + onReverseGeocodingDelimitationChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + if (!value) { + return; + } + this._currentGeocodingDelimitation = value; + this._clearInputRequest(); + var map = this._map; + this._removeMapInteraction(map); + this._activateMapInteraction(map); + }, + onGPreverseGeocodingReturnPictoClick: function () { + this._clearLocations(); + this._clearLocationsFeature(); + this._clearInputRequest(); + this._activateMapInteraction(this._map); + }, + onReverseGeocodingSubmit: function () { + if (!this._requestPosition) { + return; + } + if (this._noRightManagement) { + return; + } + var self = this; + this._reverseGeocodingRequest({ + position: self._requestPosition, + filterOptions: { type: [self._currentGeocodingType] }, + onSuccess: function (results) { + if (results) { + var locations = results.locations; + self._displayGeocodedLocations(locations); + self._hideWaitingContainer(); + } + }, + onFailure: function (error) { + self._hideWaitingContainer(); + self._clearLocations(); + self._clearLocationsFeature(); + self._clearInputRequest(); + } + }); + }, + onReverseGeocodingResultClick: function (e) { + }, + onReverseGeocodingResultMouseOver: function (e) { + var idx = ID.index(e.target.id); + if (e.target.classList) { + e.target.classList.add('GPreverseGeocodedLocationHighlight'); + } + if (!this._inputResultsLayer) { + return; + } + this._inputResultsLayer.eachLayer(function (layer) { + if (layer.options.id === parseInt(idx, 10)) { + layer.fire('mouseover'); + } + }); + }, + onReverseGeocodingResultMouseOut: function (e) { + var idx = ID.index(e.target.id); + if (e.target.classList) { + e.target.classList.remove('GPreverseGeocodedLocationHighlight'); + } + if (!this._inputResultsLayer) { + return; + } + this._inputResultsLayer.eachLayer(function (layer) { + if (layer.options.id === parseInt(idx, 10)) { + layer.fire('mouseout'); + } + }); + }, + _clearLocations: function () { + this._reverseGeocodingLocations = []; + if (this._resultsListContainer) { + while (this._resultsListContainer.firstChild) { + this._resultsListContainer.removeChild(this._resultsListContainer.firstChild); + } + } + }, + _clearLocationsFeature: function () { + var map = this._map; + if (this._inputResultsLayer !== null) { + map.removeLayer(this._inputResultsLayer); + this._inputResultsLayer = null; + } + }, + _clearInputRequest: function () { + this._requestPosition = null; + this._requestCircleFilter = null; + this._requestBboxFilter = null; + }, + _displayWaitingContainer: function () { + this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerVisible'; + this._waiting = true; + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + var context = this; + this._timer = setTimeout(function () { + if (context._waiting === true) { + context._hideWaitingContainer(); + } else { + if (context._timer) { + clearTimeout(context._timer); + } + } + }, 16000); + }, + _hideWaitingContainer: function () { + if (this._waiting) { + this._waitingContainer.className = 'GPreverseGeocodingCalcWaitingContainerHidden'; + this._waiting = false; + clearTimeout(this._timer); + this._timer = null; + } + } + }); + return ReverseGeocoding; +}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsUtilsIconDefault, CommonControlsReverseGeocodingDOM); +CommonControlsRouteDOM = function (ID) { + var RouteDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GProute'); + container.className = 'GPwidget'; + return container; + }, + _createShowRouteElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowRoute'); + input.type = 'checkbox'; + return input; + }, + _createShowRoutePictoElement: function () { + var context = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowRoutePicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowRoute'); + label.title = 'Ouvrir le calcul d\'itinéraire'; + if (label.addEventListener) { + label.addEventListener('click', function (e) { + context.onShowRoutePanelClick(e); + }); + } else if (label.attachEvent) { + label.attachEvent('onclick', function (e) { + context.onShowRoutePanelClick(e); + }); + } + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowRouteOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createRoutePanelElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProutePanel'); + div.className = 'GPpanel'; + return div; + }, + _createRoutePanelHeaderElement: function () { + var self = this; + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var div = document.createElement('div'); + div.className = 'GPpanelTitle'; + div.innerHTML = 'Calcul d\'itinéraire'; + container.appendChild(div); + var divClose = document.createElement('div'); + divClose.id = this._addUID('GProutePanelClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Masquer le panneau'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPshowRoutePicto')).click(); + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPshowRoutePicto')).click(); + }); + } + container.appendChild(divClose); + return container; + }, + _createRoutePanelFormElement: function () { + var self = this; + var form = document.createElement('form'); + form.id = this._addUID('GProuteForm'); + form.setAttribute('onkeypress', 'return event.keyCode != 13;'); + form.addEventListener('submit', function (e) { + console.log(e); + e.preventDefault(); + var points = document.getElementsByClassName(self._addUID('GPlocationPoint')); + var start = points[0].childNodes[0].id; + var end = points[points.length - 1].childNodes[0].id; + var startID = ID.index(start); + var endID = ID.index(end); + if (document.getElementById(self._addUID('GPlocationOrigin_' + startID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + startID)).value == '' || document.getElementById(self._addUID('GPlocationOrigin_' + endID)).value == '' && document.getElementById(self._addUID('GPlocationOriginCoords_' + endID)).value == '') { + return false; + } + var id; + document.getElementById(self._addUID('GProuteResultsStages')).innerHTML = ''; + for (var i = 0; i < points.length; i++) { + var tag = points[i].childNodes[0].id; + id = ID.index(tag); + if (document.getElementById(self._addUID('GPlocationPoint_' + id)).className == 'GPflexInput GPlocationStageFlexInput') { + var resultStage = document.createElement('div'); + resultStage.className = 'GProuteResultsStages'; + var resultStageLabel = document.createElement('div'); + resultStageLabel.className = 'GProuteResultStageLabel'; + resultStageLabel.innerHTML = document.getElementById(self._addUID('GPlocationOriginLabel_' + id)).innerHTML + ' :'; + resultStage.appendChild(resultStageLabel); + var resultStageValue = document.createElement('div'); + resultStageValue.className = 'GProuteResultStageValue'; + var elementCoords = document.getElementById(self._addUID('GPlocationOriginCoords_' + id)); + var stageCoords = elementCoords.value; + var visible = elementCoords.className === 'GPlocationOriginVisible' ? true : false; + if (stageCoords != null && stageCoords != '' && visible) { + resultStageValue.innerHTML = stageCoords; + } else { + resultStageValue.innerHTML = document.getElementById(self._addUID('GPlocationOrigin_' + id)).value; + } + resultStage.appendChild(resultStageValue); + if (resultStageValue.innerHTML != '') { + document.getElementById(self._addUID('GProuteResultsStages')).appendChild(resultStage); + } + } + } + var modeComputation = null; + if (document.getElementById(self._addUID('GProuteComputationSelect'))) { + var select = document.getElementById(self._addUID('GProuteResultsComputationSelect')); + select.selectedIndex = document.getElementById(self._addUID('GProuteComputationSelect')).selectedIndex; + modeComputation = select.options[select.selectedIndex].value; + } + var modeTransport = null; + if (document.getElementById(self._addUID('GProuteTransportCar'))) { + if (document.getElementById(self._addUID('GProuteTransportCar')).checked) { + modeTransport = document.getElementById(self._addUID('GProuteTransportCar')).value; + } + } + if (document.getElementById(self._addUID('GProuteTransportPedestrian'))) { + if (document.getElementById(self._addUID('GProuteTransportPedestrian')).checked) { + modeTransport = document.getElementById(self._addUID('GProuteTransportPedestrian')).value; + } + } + var exclusions = []; + var exclusionsElement = document.getElementsByClassName('GProuteExclusionsOption'); + for (var j = 0; j < exclusionsElement.length; j++) { + id = exclusionsElement[j].htmlFor; + var el = document.getElementById(id); + if (!el.checked) { + exclusions.push(el.value); + } + } + self.onRouteComputationSubmit({ + computation: modeComputation, + transport: modeTransport, + exclusions: exclusions + }); + return false; + }); + return form; + }, + _createRoutePanelResultsElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GProuteResultsPanel'); + container.className = 'GProuteComponentHidden'; + container.appendChild(this._createRouteResultsStagesElement()); + container.appendChild(this._createRouteResultsElement()); + var divBorderUp = document.createElement('div'); + divBorderUp.className = 'GPfakeBorder GPfakeBorderLeft'; + container.appendChild(divBorderUp); + container.appendChild(this._createRouteShowResultsDetailsElement()); + var labelShow = document.createElement('label'); + labelShow.htmlFor = this._addUID('GProuteResultsShowDetails'); + labelShow.innerHTML = 'Afficher le détail'; + container.appendChild(labelShow); + var labelHide = document.createElement('label'); + labelHide.htmlFor = this._addUID('GProuteResultsShowDetails'); + labelHide.innerHTML = 'Masquer le détail'; + container.appendChild(labelHide); + var divBorderDown = document.createElement('div'); + divBorderDown.className = 'GPfakeBorder'; + container.appendChild(divBorderDown); + container.appendChild(this._createRouteResultsDetailsElement()); + return container; + }, + _createRouteWaitingElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProuteCalcWaitingContainer'); + div.className = 'GProuteCalcWaitingContainerHidden'; + var p = document.createElement('p'); + p.className = 'GProuteCalcWaiting'; + p.innerHTML = 'Calcul en cours...'; + div.appendChild(p); + return div; + }, + _createRouteResultsStagesElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProuteResultsStages'); + return div; + }, + _createRouteResultsElement: function () { + var self = this; + var container = document.createElement('div'); + container.id = this._addUID('GProuteResults'); + var divValue = document.createElement('div'); + divValue.id = this._addUID('GProuteResultsValues'); + container.appendChild(divValue); + var divMode = document.createElement('div'); + divMode.id = this._addUID('GProuteResultsMode'); + var select = document.createElement('select'); + select.id = this._addUID('GProuteResultsComputationSelect'); + select.className = 'GPinputSelect'; + select.addEventListener('change', function (e) { + self.onRouteModeComputationChangeAndRun(e); + }); + var computes = [ + { + code: 'fastest', + label: 'Plus rapide' + }, + { + code: 'shortest', + label: 'Plus court' + } + ]; + for (var i = 0; i < computes.length; i++) { + var option = document.createElement('option'); + option.value = computes[i].code; + option.text = computes[i].label; + select.appendChild(option); + } + divMode.appendChild(select); + container.appendChild(divMode); + var divNew = document.createElement('div'); + divNew.id = this._addUID('GProuteResultsNew'); + divNew.title = 'Modifier le calcul'; + divNew.addEventListener('click', function (e) { + document.getElementById(self._addUID('GProuteResultsPanel')).className = 'GProuteComponentHidden'; + document.getElementById(self._addUID('GProuteForm')).className = ''; + self.onShowRouteResultsNewClick(e); + }); + container.appendChild(divNew); + return container; + }, + _addRouteResultsValuesElement: function (distance, duration, fconvert) { + var div = document.getElementById(this._addUID('GProuteResultsValues')); + if (div.childElementCount) { + while (div.firstChild) { + div.removeChild(div.firstChild); + } + } + var containerDistance = document.createElement('div'); + containerDistance.className = 'GProuteResultsValue'; + var labelDistance = document.createElement('label'); + labelDistance.className = 'GProuteResultsValueLabel'; + labelDistance.innerHTML = 'Distance :'; + containerDistance.appendChild(labelDistance); + var distanceLabel = 0; + var isKm = parseInt(distance / 1000, 10); + if (!isKm) { + distanceLabel = Math.round(distance) + ' m'; + } else { + var distanceArrondi = Math.round(distance); + distanceArrondi = distanceArrondi / 1000; + distanceLabel = distanceArrondi + ' km'; + } + var divDistance = document.createElement('div'); + divDistance.id = this._addUID('GProuteResultsValueDist'); + divDistance.innerHTML = distanceLabel; + containerDistance.appendChild(divDistance); + div.appendChild(containerDistance); + var containerDuration = document.createElement('div'); + containerDuration.className = 'GProuteResultsValue'; + var labelDuration = document.createElement('label'); + labelDuration.className = 'GProuteResultsValueLabel'; + labelDuration.innerHTML = 'Durée :'; + containerDuration.appendChild(labelDuration); + var divDuration = document.createElement('div'); + divDuration.id = this._addUID('GProuteResultsValueDist'); + divDuration.innerHTML = fconvert(duration); + containerDuration.appendChild(divDuration); + div.appendChild(containerDuration); + return div; + }, + _createRouteShowResultsDetailsElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GProuteResultsShowDetails'); + input.type = 'checkbox'; + return input; + }, + _createRouteResultsDetailsElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProuteResultsDetails'); + return div; + }, + _addRouteResultsDetailsElement: function (instructions, fconvert) { + var context = this; + var div = document.getElementById(this._addUID('GProuteResultsDetails')); + if (div.childElementCount) { + while (div.firstChild) { + div.removeChild(div.firstChild); + } + } + var distanceCumul = 0; + var durationCumul = 0; + for (var i = 0; i < instructions.length; i++) { + var id = i + 1; + var o = instructions[i]; + var divNum = document.createElement('div'); + divNum.className = 'GProuteResultsDetailsNumber'; + divNum.innerHTML = id + '.'; + div.appendChild(divNum); + durationCumul += parseFloat(o.duration); + distanceCumul += parseFloat(o.distance); + var distance = 0; + var isCumulKm = parseInt(distanceCumul / 1000, 10); + if (!isCumulKm) { + distance = Math.round(distanceCumul) + ' m'; + } else { + var distanceArrondi = Math.round(distanceCumul); + distanceArrondi = distanceArrondi / 1000; + distance = distanceArrondi + ' km'; + } + var divIns = document.createElement('div'); + divIns.className = 'GProuteResultsDetailsInstruction'; + divIns.id = this._addUID('GProuteResultsDetailsInstruction_' + id); + divIns.title = 'distance : ' + distance + ' / ' + 'temps : ' + fconvert(durationCumul); + divIns.innerHTML = o.instruction; + divIns.addEventListener('mouseover', function (e) { + context.onRouteResultsDetailsMouseOver(e); + }); + divIns.addEventListener('mouseout', function (e) { + context.onRouteResultsDetailsMouseOut(e); + }); + divIns.addEventListener('click', function (e) { + if (typeof context.onRouteResultsDetailsClick === 'function') { + context.onRouteResultsDetailsClick(e); + } + }); + div.appendChild(divIns); + } + return div; + }, + _createRoutePanelFormPointElement: function (n, text, visibility) { + var context = this; + var div = document.createElement('div'); + div.id = 'GProutePoint' + n; + div.className = visibility ? 'GPflexInput GProuteStageFlexInput' : 'GPflexInput GProuteStageFlexInputHidden'; + var labelOrigin = document.createElement('label'); + labelOrigin.id = 'GProuteOriginLabel' + n; + labelOrigin.htmlFor = 'GProuteOrigin' + n; + labelOrigin.innerHTML = text; + labelOrigin.addEventListener('click', function () { + var i = this.id.charAt(this.id.length - 1); + document.getElementById('GProuteOriginCoords' + i).value = ''; + for (var j = 1; j < 8; j++) { + document.getElementById('GProutePoint' + j).style.display = 'flex'; + } + document.getElementById('GProuteForm').className = ''; + document.getElementById('GProuteOriginPointer' + i).checked = false; + document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible'; + document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden'; + }); + div.appendChild(labelOrigin); + var inputOrigin = document.createElement('input'); + inputOrigin.id = 'GProuteOrigin' + n; + inputOrigin.className = 'GProuteOriginVisible'; + inputOrigin.type = 'text'; + inputOrigin.placeholder = 'Saisir une adresse'; + inputOrigin.addEventListener('keyup', function (e) { + var charCode = e.which || e.keyCode; + if (charCode === 13 || charCode === 10) { + return; + } + var i = this.id.charAt(this.id.length - 1); + if (document.getElementById('GProuteOrigin' + i).value.length > 2) { + document.getElementById('GProuteAutoCompleteList' + i).style.display = 'block'; + } else { + document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none'; + } + context.onAutoCompleteSearchText(e); + }); + inputOrigin.addEventListener('blur', function () { + var i = this.id.charAt(this.id.length - 1); + document.getElementById('GProuteAutoCompleteList' + i).style.display = 'none'; + }); + div.appendChild(inputOrigin); + var inputOriginCoord = document.createElement('input'); + inputOriginCoord.id = 'GProuteOriginCoords' + n; + inputOriginCoord.className = 'GProuteOriginHidden'; + inputOriginCoord.type = 'text'; + inputOriginCoord.disabled = true; + div.appendChild(inputOriginCoord); + var inputOriginPointer = document.createElement('input'); + inputOriginPointer.id = 'GProuteOriginPointer' + n; + inputOriginPointer.type = 'checkbox'; + div.appendChild(inputOriginPointer); + var labelOriginPointer = document.createElement('label'); + labelOriginPointer.id = 'GProuteOriginPointerImg' + n; + labelOriginPointer.htmlFor = 'GProuteOriginPointer' + n; + labelOriginPointer.className = 'GProuteOriginPointerImg'; + labelOriginPointer.title = 'Pointer un lieu sur la carte'; + labelOriginPointer.addEventListener('click', function (evt) { + evt.preventDefault(); + evt.stopPropagation(); + var i = this.id.charAt(this.id.length - 1); + var j; + for (j = 1; j < 8; j++) { + if (i != j) { + document.getElementById('GProuteOriginPointer' + j).checked = false; + if (document.getElementById('GProuteOriginCoords' + j).value == 'Pointer un lieu sur la carte') { + document.getElementById('GProuteOriginCoords' + j).value = ''; + document.getElementById('GProuteOrigin' + j).className = 'GProuteOriginVisible'; + document.getElementById('GProuteOriginCoords' + j).className = 'GProuteOriginHidden'; + } + } + } + if (document.getElementById('GProuteOriginPointer' + i).checked) { + document.getElementById('GProuteOriginCoords' + i).value = ''; + for (j = 1; j < 8; j++) { + document.getElementById('GProutePoint' + j).style.display = 'flex'; + } + document.getElementById('GProuteForm').className = ''; + document.getElementById('GProuteOriginPointer' + i).checked = false; + document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible'; + document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden'; + } else { + document.getElementById('GProuteOriginCoords' + i).value = 'Pointer un lieu sur la carte'; + for (j = 1; j < 8; j++) { + if (i == j) { + document.getElementById('GProutePoint' + j).style.display = 'flex'; + } else { + document.getElementById('GProutePoint' + j).style.display = 'none'; + } + } + document.getElementById('GProuteForm').className = 'GProuteFormMini'; + document.getElementById('GProuteOriginPointer' + i).checked = true; + document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginHidden'; + document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginVisible'; + } + context.onRouteMapPointClick(evt); + }); + div.appendChild(labelOriginPointer); + return div; + }, + _createRoutePanelFormRemoveStageElement: function (n) { + var context = this; + var divRm = document.createElement('div'); + divRm.id = 'GProuteStageRemove' + n; + divRm.className = 'GProuteStageRemove'; + divRm.title = 'Supprimer l\'étape'; + if (n != 1 && n != 7) { + divRm.addEventListener('click', function (e) { + var i = this.id.charAt(this.id.length - 1); + document.getElementById('GProutePoint' + i).className = 'GPflexInput GProuteStageFlexInputHidden'; + document.getElementById('GProuteOrigin' + i).value = ''; + document.getElementById('GProuteOrigin' + i).className = 'GProuteOriginVisible'; + document.getElementById('GProuteOriginCoords' + i).value = ''; + document.getElementById('GProuteOriginCoords' + i).className = 'GProuteOriginHidden'; + document.getElementById('GProuteStageAdd').style.display = ''; + var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top; + document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) - 33).toString() + 'px'; + context.onRouteRemovePointClick(e); + }); + } + return divRm; + }, + _createRoutePanelFormAddStageElement: function () { + var context = this; + var divAdd = document.createElement('div'); + divAdd.id = 'GProuteStageAdd'; + divAdd.title = 'Ajouter une étape'; + divAdd.addEventListener('click', function (e) { + var lastStage = 1; + var nbStages = 0; + for (var i = 2; i < 7; i++) { + if (document.getElementById('GProutePoint' + i).className == 'GPflexInput GProuteStageFlexInputHidden') { + if (lastStage == 1) { + lastStage = i; + } + } else { + nbStages++; + } + } + if (lastStage < 7) { + document.getElementById('GProutePoint' + lastStage).className = 'GPflexInput GProuteStageFlexInput'; + var exclusionsPictoTop = document.getElementById('GPshowRouteExclusionsPicto').style.top; + document.getElementById('GPshowRouteExclusionsPicto').style.top = (parseInt(exclusionsPictoTop, 10) + 33).toString() + 'px'; + } + if (nbStages == 4) { + document.getElementById('GProuteStageAdd').style.display = 'none'; + } + context.onRouteAddPointClick(e); + }); + return divAdd; + }, + _createRoutePanelFormAutoCompleteListElement: function (n) { + var context = this; + var div = document.createElement('div'); + div.id = 'GProuteAutoCompleteList' + n; + div.className = 'GPadvancedAutoCompleteList'; + if (div.addEventListener) { + div.addEventListener('click', function (e) { + context.onAutoCompletedResultsItemClick(e); + document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none'; + }, false); + } else if (div.attachEvent) { + div.attachEvent('onclick', function (e) { + context.onAutoCompletedResultsItemClick(e); + document.getElementById('GProuteAutoCompleteList' + n).style.display = 'none'; + }); + } + return div; + }, + _createRouteAutoCompletedLocationElement: function (location, n, id) { + var container = document.getElementById('GProuteAutoCompleteList' + n); + var div = document.createElement('div'); + div.id = 'AutoCompletedLocation' + id; + div.className = 'GPautoCompleteProposal'; + div.innerHTML = location.fullText; + container.appendChild(div); + }, + _createRoutePanelFormModeChoiceElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProuteModeChoice'); + return div; + }, + _createRoutePanelFormModeChoiceTransportElement: function (transports) { + var context = this; + var div = document.createElement('div'); + div.id = this._addUID('GProuteTransportChoice'); + var span = document.createElement('span'); + span.className = 'GProuteModeLabel'; + span.innerHTML = 'Mode de transport'; + div.appendChild(span); + for (var i = 0; i < transports.length; i++) { + var transport = transports[i]; + if (transport === 'Voiture') { + var inputCar = document.createElement('input'); + inputCar.id = this._addUID('GProuteTransportCar'); + inputCar.type = 'radio'; + inputCar.name = 'GProuteTransport'; + inputCar.value = 'Voiture'; + if (i === 0) { + inputCar.checked = true; + } + if (inputCar.addEventListener) { + inputCar.addEventListener('change', function (e) { + context.onRouteModeTransportChange(e); + }); + } else if (inputCar.attachEvent) { + inputCar.attachEvent('onchange', function (e) { + context.onRouteModeTransportChange(e); + }); + } + div.appendChild(inputCar); + var labelCar = document.createElement('label'); + labelCar.className = 'GProuteTransportImg'; + labelCar.htmlFor = this._addUID('GProuteTransportCar'); + labelCar.title = 'Voiture'; + div.appendChild(labelCar); + } + if (transport === 'Pieton') { + var inputPedestrian = document.createElement('input'); + inputPedestrian.id = this._addUID('GProuteTransportPedestrian'); + inputPedestrian.type = 'radio'; + inputPedestrian.name = 'GProuteTransport'; + inputPedestrian.value = 'Pieton'; + if (i === 0) { + inputPedestrian.checked = true; + } + if (inputPedestrian.addEventListener) { + inputPedestrian.addEventListener('change', function (e) { + context.onRouteModeTransportChange(e); + }); + } else if (inputPedestrian.attachEvent) { + inputPedestrian.attachEvent('onchange', function (e) { + context.onRouteModeTransportChange(e); + }); + } + div.appendChild(inputPedestrian); + var labelPedestrian = document.createElement('label'); + labelPedestrian.className = 'GProuteTransportImg'; + labelPedestrian.htmlFor = this._addUID('GProuteTransportPedestrian'); + labelPedestrian.title = 'Piéton'; + div.appendChild(labelPedestrian); + } + } + return div; + }, + _createRoutePanelFormModeChoiceComputeElement: function () { + var context = this; + var div = document.createElement('div'); + div.id = this._addUID('GProuteComputationChoice'); + var span = document.createElement('span'); + span.className = 'GProuteModeLabel'; + span.innerHTML = 'Mode de calcul'; + div.appendChild(span); + var select = document.createElement('select'); + select.id = this._addUID('GProuteComputationSelect'); + select.className = 'GPinputSelect'; + select.addEventListener('change', function (e) { + context.onRouteModeComputationChange(e); + }); + var computes = [ + { + code: 'fastest', + label: 'Plus rapide' + }, + { + code: 'shortest', + label: 'Plus court' + } + ]; + for (var i = 0; i < computes.length; i++) { + var option = document.createElement('option'); + option.value = computes[i].code; + option.text = computes[i].label; + select.appendChild(option); + } + div.appendChild(select); + return div; + }, + _createShowRouteExclusionsElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowRouteExclusions'); + input.type = 'checkbox'; + return input; + }, + _createShowRouteExclusionsPictoElement: function () { + var context = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowRouteExclusionsPicto'); + label.className = 'GPshowMoreOptions GPshowRouteExclusionsPicto'; + label.htmlFor = this._addUID('GPshowRouteExclusions'); + label.title = 'Exclusions'; + label.style.top = '185px'; + if (label.addEventListener) { + label.addEventListener('click', function (e) { + context.onShowRouteExclusionsClick(e); + }); + } else if (label.attachEvent) { + label.attachEvent('onclick', function (e) { + context.onShowRouteExclusionsClick(e); + }); + } + return label; + }, + _createRoutePanelFormExclusionsElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GProuteExclusions'); + var span = document.createElement('span'); + span.className = 'GProuteExclusionsLabel'; + span.innerHTML = 'Passages autorisés'; + div.appendChild(span); + return div; + }, + _createRoutePanelFormExclusionOptionsElement: function (exclusions) { + var context = this; + var div = document.createElement('div'); + div.className = 'GProuteExclusionsOptions'; + for (var value in exclusions) { + if (exclusions.hasOwnProperty(value)) { + var status = exclusions[value]; + switch (value) { + case 'toll': + var inputToll = document.createElement('input'); + inputToll.id = this._addUID('GProuteExclusionsToll'); + inputToll.type = 'checkbox'; + inputToll.value = 'Toll'; + inputToll.checked = !status; + if (inputToll.addEventListener) { + inputToll.addEventListener('change', function (e) { + context.onRouteExclusionsChange(e); + }); + } else if (inputToll.attachEvent) { + inputToll.attachEvent('onchange', function (e) { + context.onRouteExclusionsChange(e); + }); + } + div.appendChild(inputToll); + var labelToll = document.createElement('label'); + labelToll.className = 'GProuteExclusionsOption'; + labelToll.htmlFor = this._addUID('GProuteExclusionsToll'); + labelToll.innerHTML = 'Péages'; + div.appendChild(labelToll); + break; + case 'tunnel': + var inputTunnel = document.createElement('input'); + inputTunnel.id = this._addUID('GProuteExclusionsTunnel'); + inputTunnel.type = 'checkbox'; + inputTunnel.value = 'Tunnel'; + inputTunnel.checked = !status; + if (inputTunnel.addEventListener) { + inputTunnel.addEventListener('change', function (e) { + context.onRouteExclusionsChange(e); + }); + } else if (inputTunnel.attachEvent) { + inputTunnel.attachEvent('onchange', function (e) { + context.onRouteExclusionsChange(e); + }); + } + div.appendChild(inputTunnel); + var labelTunnel = document.createElement('label'); + labelTunnel.className = 'GProuteExclusionsOption'; + labelTunnel.htmlFor = this._addUID('GProuteExclusionsTunnel'); + labelTunnel.innerHTML = 'Tunnels'; + div.appendChild(labelTunnel); + break; + case 'bridge': + var inputBridge = document.createElement('input'); + inputBridge.id = this._addUID('GProuteExclusionsBridge'); + inputBridge.type = 'checkbox'; + inputBridge.value = 'Bridge'; + inputBridge.checked = !status; + if (inputBridge.addEventListener) { + inputBridge.addEventListener('change', function (e) { + context.onRouteExclusionsChange(e); + }); + } else if (inputBridge.attachEvent) { + inputBridge.attachEvent('onchange', function (e) { + context.onRouteExclusionsChange(e); + }); + } + div.appendChild(inputBridge); + var labelBridge = document.createElement('label'); + labelBridge.className = 'GProuteExclusionsOption'; + labelBridge.htmlFor = this._addUID('GProuteExclusionsBridge'); + labelBridge.innerHTML = 'Ponts'; + div.appendChild(labelBridge); + break; + } + } + } + return div; + }, + _createRouteSubmitFormElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GProuteSubmit'); + input.className = 'GPinputSubmit'; + input.type = 'submit'; + input.value = 'Calculer'; + return input; + }, + _createRouteFormResetElement: function () { + var self = this; + var divReset = document.createElement('div'); + divReset.id = this._addUID('GProuteReset'); + divReset.title = 'Réinitialiser les paramètres'; + divReset.addEventListener('click', function (e) { + self.onRouteResetClick(e); + }); + return divReset; + } + }; + return RouteDOM; +}(CommonUtilsSelectorID); +LeafletControlsRoute = function (L, woodman, Gp, RightManagement, ID, LocationSelector, RouteDOM) { + var Route = L.Control.extend({ + includes: RouteDOM, + options: { + position: 'topleft', + collapsed: true, + graphs: [ + 'Voiture', + 'Pieton' + ], + exclusions: { + toll: false, + tunnel: false, + bridge: false + }, + disableReverse: false, + routeOptions: {}, + autocompleteOptions: {} + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._uid = ID.generate(); + this._initTransport(); + this._initExclusions(); + this._initComputation(); + this._waitingContainer = null; + this._formRouteContainer = null; + this._resultsRouteContainer = null; + this._isDesktop = this._detectSupport(); + this._currentPoints = []; + this._currentTransport = null; + this._currentComputation = null; + this._currentExclusions = []; + this._geojsonRoute = null; + this._geojsonSections = null; + this._waiting = false; + this._timer = null; + this._currentRouteInformations = null; + this._resources = {}; + this._noRightManagement = false; + this._checkRightsManagement(); + }, + onAdd: function (map) { + var container = this._container = this._initLayout(map); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + return container; + }, + onRemove: function () { + }, + _initTransport: function () { + this._currentTransport = 'Voiture'; + var transport = this.options.graphs; + if (!transport || transport.length === 0) { + this.options.graphs = [ + 'Voiture', + 'Pieton' + ]; + } + if (L.Util.isArray(transport) && transport.length) { + if (transport[0] === 'Voiture' || transport[0] === 'Pieton') { + this._currentTransport = transport[0]; + } + } + var serviceOptions = this.options.routeOptions; + if (serviceOptions.graph) { + this._currentTransport = serviceOptions.graph; + } + }, + _initComputation: function () { + this._currentComputation = 'fastest'; + var serviceOptions = this.options.routeOptions; + if (serviceOptions.routePreference) { + this._currentComputation = serviceOptions.routePreference; + } + }, + _initExclusions: function () { + this._currentExclusions = []; + var exclusion = this.options.exclusions; + if (!exclusion || Object.keys(exclusion).length === 0) { + this.options.exclusions = { + toll: false, + tunnel: false, + bridge: false + }; + } + if (exclusion && Object.keys(exclusion).length) { + for (var k in exclusion) { + if (exclusion.hasOwnProperty(k)) { + if (exclusion.k) { + this._currentExclusions.push(k); + } + } + } + } + var serviceOptions = this.options.routeOptions; + if (L.Util.isArray(serviceOptions.exclusions)) { + this._currentExclusions = serviceOptions.exclusions; + } + }, + _checkRightsManagement: function () { + var _opts = null; + var _res = []; + var _key = null; + _key = this.options.routeOptions.apiKey; + _opts = this.options.routeOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'Voiture', + 'Pieton' + ]; + } + var rightManagementRoute = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['Itineraire'] + }); + _key = this.options.autocompleteOptions.apiKey; + _opts = this.options.autocompleteOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = [ + 'StreetAddress', + 'PositionOfInterest' + ]; + } + var rightManagementAutoComplete = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['AutoCompletion'] + }); + if (!rightManagementRoute && !rightManagementAutoComplete) { + this._noRightManagement = true; + } + if (rightManagementAutoComplete) { + this._resources['AutoCompletion'] = {}; + this._resources['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion']; + this._resources['AutoCompletion']['key'] = rightManagementAutoComplete['key']; + } + if (rightManagementRoute) { + this._resources['Itineraire'] = {}; + this._resources['Itineraire']['resources'] = rightManagementRoute['Itineraire']; + this._resources['Itineraire']['key'] = rightManagementRoute['key']; + } + }, + _detectSupport: function () { + var isDesktop = true; + var userAgent = window.navigator.userAgent.toLowerCase(); + 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) { + isDesktop = false; + } + if (userAgent.indexOf('msie') !== -1 || userAgent.indexOf('trident') !== -1) { + isDesktop = true; + } + return isDesktop; + }, + _initLayout: function (map) { + var container = this._createMainContainerElement(); + var inputShow = this._showRouteContainer = this._createShowRouteElement(); + container.appendChild(inputShow); + if (!this.options.collapsed) { + inputShow.checked = true; + } + var picto = this._createShowRoutePictoElement(); + container.appendChild(picto); + var routePanel = this._createRoutePanelElement(); + var routeHeader = this._createRoutePanelHeaderElement(); + routePanel.appendChild(routeHeader); + var routeForm = this._formRouteContainer = this._createRoutePanelFormElement(); + var points = this._createRoutePanelFormPointsElement(map); + for (var i = 0; i < points.length; i++) { + routeForm.appendChild(points[i]); + } + var choice = this._createRoutePanelFormModeChoiceElement(); + choice.appendChild(this._createRoutePanelFormModeChoiceTransportElement(this.options.graphs)); + choice.appendChild(this._createRoutePanelFormModeChoiceComputeElement()); + routeForm.appendChild(choice); + routeForm.appendChild(this._createShowRouteExclusionsElement()); + routeForm.appendChild(this._createShowRouteExclusionsPictoElement()); + var exclusion = this._createRoutePanelFormExclusionsElement(); + exclusion.appendChild(this._createRoutePanelFormExclusionOptionsElement(this.options.exclusions)); + routeForm.appendChild(exclusion); + var submit = this._createRouteSubmitFormElement(); + routeForm.appendChild(submit); + routePanel.appendChild(routeForm); + var routeResults = this._resultsRouteContainer = this._createRoutePanelResultsElement(); + routePanel.appendChild(routeResults); + var waiting = this._waitingContainer = this._createRouteWaitingElement(); + routePanel.appendChild(waiting); + container.appendChild(routePanel); + return container; + }, + _createRoutePanelFormPointsElement: function (map) { + var points = []; + var count = 1; + var start = new LocationSelector({ + apiKey: this.options.apiKey || null, + tag: { + id: count, + unique: this._uid, + label: 'Départ', + color: 'blue', + display: true + }, + disableReverse: this.options.disableReverse, + autocompleteOptions: this.options.autocompleteOptions || null + }); + start.setMap(map); + points.push(start.getContainer()); + this._currentPoints.push(start); + for (count = 2; count < 7; count++) { + var step = new LocationSelector({ + apiKey: this.options.apiKey || null, + tag: { + id: count, + unique: this._uid, + label: 'Etape', + color: 'green', + display: false, + removeOption: true + }, + disableReverse: this.options.disableReverse, + autocompleteOptions: this.options.autocompleteOptions || null + }); + step.setMap(map); + points.push(step.getContainer()); + this._currentPoints.push(step); + } + var end = new LocationSelector({ + apiKey: this.options.apiKey || null, + tag: { + id: count, + unique: this._uid, + label: 'Arrivée', + color: 'red', + display: true, + addOption: true, + removeOption: false + }, + disableReverse: this.options.disableReverse, + autocompleteOptions: this.options.autocompleteOptions || null + }); + end.setMap(map); + points.push(end.getContainer()); + this._currentPoints.push(end); + return points; + }, + onShowRoutePanelClick: function (e) { + if (!this._geojsonSections) { + this._clear(); + } + }, + onRouteModeComputationChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + if (!value) { + return; + } + this._currentComputation = value; + }, + onRouteModeComputationChangeAndRun: function (e) { + this.onRouteModeComputationChange(e); + this._clearRouteResultsDetails(); + this._clearRouteResultsGeometry(); + this._clearRouteResultsFeatureGeometry(); + this.onRouteComputationSubmit({ + computation: this._currentComputation, + transport: this._currentTransport, + exclusions: this._currentExclusions + }); + }, + onRouteModeTransportChange: function (e) { + var value = e.target.value; + if (!value) { + return; + } + this._currentTransport = value; + }, + onShowRouteExclusionsClick: function (e) { + }, + onRouteExclusionsChange: function (e) { + var value = e.target.value; + var checked = e.target.checked; + if (!value) { + return; + } + var bFound = false; + var iFound = null; + for (var i = 0; i < this._currentExclusions.length; i++) { + if (this._currentExclusions[i] === value) { + iFound = i; + bFound = true; + } + } + if (!bFound && checked) { + this._currentExclusions.push(value); + } + if (bFound && !checked) { + this._currentExclusions[iFound] = null; + } + }, + onRouteComputationSubmit: function (options) { + var points = this._currentPoints; + var start = points[0].getCoordinate(); + points[0].dragging(false); + var end = points[points.length - 1].getCoordinate(); + points[points.length - 1].dragging(false); + var step = []; + for (var i = 1; i < points.length - 1; i++) { + var coordinate = points[i].getCoordinate(); + points[i].dragging(false); + if (coordinate) { + step.push(coordinate); + } + } + if (this._noRightManagement) { + return; + } + this._currentTransport = options.transport; + this._currentComputation = options.computation; + this._currentExclusions = options.exclusions; + this._displayWaitingContainer(); + var context = this; + this._requestRouting({ + startPoint: start, + endPoint: end, + viaPoints: step, + graph: this._currentTransport, + routePreference: this._currentComputation, + exclusions: this._currentExclusions, + geometryInInstructions: true, + distanceUnit: 'm', + onSuccess: function (results) { + if (results) { + context._fillRouteResultsDetails(results); + } + }, + onFailure: function (error) { + context._hideWaitingContainer(); + context._clearRouteResultsDetails(); + } + }); + }, + onShowRouteResultsNewClick: function (e) { + var points = this._currentPoints; + for (var i = 0; i < points.length; i++) { + points[i].dragging(true); + } + this._clearRouteResultsDetails(); + this._clearRouteResultsGeometry(); + this._clearRouteResultsFeatureGeometry(); + }, + onRouteResultsDetailsMouseOver: function (e) { + var idx = ID.index(e.target.id); + if (!this._isDesktop) { + return; + } + if (!this._geojsonSections) { + return; + } + this._geojsonSections.eachLayer(function (layer) { + if (layer.feature.id === parseInt(idx, 10)) { + layer.setStyle({ + weight: 10, + color: '#0F9DE8', + opacity: 0.5 + }); + } + }); + }, + onRouteResultsDetailsMouseOut: function (e) { + var idx = ID.index(e.target.id); + if (!this._isDesktop) { + return; + } + if (!this._geojsonSections) { + return; + } + this._geojsonSections.eachLayer(function (layer) { + if (layer.feature.id === parseInt(idx, 10)) { + layer.setStyle({ + color: '#ED7F10', + weight: 5, + opacity: 0.75 + }); + } + }); + }, + onRouteResultsDetailsClick: function (e) { + var idx = ID.index(e.target.id); + var self = this; + if (this._isDesktop) { + return; + } + if (!this._geojsonSections) { + return; + } + var newInstruction = e.target.title; + var oldInstruction = e.target.innerHTML; + this._geojsonSections.eachLayer(function (layer) { + if (layer.feature.id === parseInt(idx, 10)) { + e.target.innerHTML = newInstruction; + layer.setStyle({ + weight: 10, + color: '#0F9DE8', + opacity: 0.5 + }); + } + }); + clearTimeout(1000); + setTimeout(function () { + self._geojsonSections.eachLayer(function (layer) { + if (layer.feature.id === parseInt(idx, 10)) { + e.target.innerHTML = oldInstruction; + layer.setStyle({ + color: '#ED7F10', + weight: 5, + opacity: 0.75 + }); + } + }); + }, 1000); + }, + _requestRouting: function (settings) { + if (!settings || Object.keys(settings).length === 0) { + return; + } + if (!settings.startPoint) { + return; + } + if (!settings.endPoint) { + return; + } + if (this._noRightManagement) { + console.log('no rights for all service !?'); + return; + } + if (!this._resources['Itineraire']) { + console.log('no rights for this service !?'); + return; + } + var resources = this._resources['Itineraire'].resources; + if (!resources || Object.keys(resources).length === 0) { + return; + } + var key = this._resources['Itineraire']['key']; + var options = {}; + L.Util.extend(options, this.options.routeOptions); + L.Util.extend(options, settings); + var bFound = false; + for (var i = 0; i < resources.length; i++) { + if (resources[i] === options.graph) { + bFound = true; + } + } + if (!bFound) { + console.log('no rights for this service !?'); + return; + } + L.Util.extend(options, { apiKey: this.options.routeOptions.apiKey || this.options.apiKey || key }); + Gp.Services.route(options); + }, + _fillRouteResultsDetails: function (results) { + var distance = results.totalDistance; + var duration = results.totalTime; + var instructions = this._simplifiedInstructions(results.routeInstructions); + if (instructions) { + this._fillRouteResultsDetailsContainer(distance, duration, instructions); + } + var geometry = results.routeGeometry; + if (geometry) { + this._fillRouteResultsDetailsGeometry(geometry); + } + var bGeometryInstructions = instructions[0].geometry.length !== 0 ? true : false; + if (instructions && bGeometryInstructions) { + this._fillRouteResultsDetailsFeatureGeometry(instructions); + } + var bbox = results.bbox; + if (bbox) { + var map = this._map; + var bounds = L.latLngBounds([ + bbox.bottom, + bbox.left + ], [ + bbox.top, + bbox.right + ]); + map.fitBounds(bounds, { + padding: [ + 1, + 1 + ] + }); + } + this._currentRouteInformations = results; + this._formRouteContainer.className = 'GProuteComponentHidden'; + this._hideWaitingContainer(); + this._resultsRouteContainer.className = ''; + }, + _fillRouteResultsDetailsContainer: function (distance, duration, instructions) { + this._resultsRouteValuesContainer = this._addRouteResultsValuesElement(distance, duration, this._convertSecondsToTime); + this._resultsRouteDetailsContainer = this._addRouteResultsDetailsElement(instructions, this._convertSecondsToTime); + }, + _fillRouteResultsDetailsGeometry: function (geometry) { + this._clearRouteResultsGeometry(); + var map = this._map; + var _style = { + color: '#ff7800', + weight: 5, + opacity: 0.65 + }; + this._geojsonRoute = L.geoJson(geometry, { style: _style }).addTo(map); + }, + _fillRouteResultsDetailsFeatureGeometry: function (instructions) { + this._clearRouteResultsFeatureGeometry(); + var map = this._map; + var _style = { + color: '#ED7F10', + weight: 5, + opacity: 0.75 + }; + var _geometry = { + type: 'FeatureCollection', + features: [] + }; + for (var i = 0; i < instructions.length; i++) { + var o = instructions[i]; + var id = i + 1; + _geometry.features.push({ + id: id, + type: 'Feature', + geometry: o.geometry, + properties: { popupContent: '(' + id + ') distance : ' + this._convertDistance(o.distance) + ' / temps : ' + this._convertSecondsToTime(o.duration) } + }); + } + var self = this; + function resetHighlight(e) { + var layer = e.target; + self._geojsonSections.resetStyle(layer); + var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid); + L.DomUtil.removeClass(div, 'GProuteResultsDetailsHighlight'); + } + function highlightFeature(e) { + var layer = e.target; + layer.setStyle({ + weight: 10, + color: '#0F9DE8', + opacity: 0.5 + }); + var div = L.DomUtil.get('GProuteResultsDetailsInstruction_' + layer.feature.id + '-' + self._uid); + L.DomUtil.addClass(div, 'GProuteResultsDetailsHighlight'); + } + this._geojsonSections = L.geoJson(_geometry, { + style: _style, + onEachFeature: function (feature, layer) { + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlight + }); + layer.bindPopup(feature.properties.popupContent); + } + }).addTo(map); + }, + _clear: function () { + this._currentTransport = null; + this._currentExclusions = []; + this._currentComputation = null; + this._clearRouteResultsDetails(); + this._clearRouteResultsGeometry(); + this._clearRouteResultsFeatureGeometry(); + for (var i = 0; i < this._currentPoints.length; i++) { + this._currentPoints[i].clear(); + } + }, + _clearRouteResultsDetails: function () { + this._currentRouteInformations = null; + if (this._resultsRouteDetailsContainer) { + var divD = this._resultsRouteDetailsContainer; + if (divD.childElementCount) { + while (divD.firstChild) { + divD.removeChild(divD.firstChild); + } + } + } + if (this._resultsRouteValuesContainer) { + var divV = this._resultsRouteValuesContainer; + if (divV.childElementCount) { + while (divV.firstChild) { + divV.removeChild(divV.firstChild); + } + } + } + }, + _clearRouteResultsGeometry: function () { + var map = this._map; + if (this._geojsonRoute != null) { + map.removeLayer(this._geojsonRoute); + this._geojsonRoute = null; + } + }, + _clearRouteResultsFeatureGeometry: function () { + var map = this._map; + if (this._geojsonSections != null) { + map.removeLayer(this._geojsonSections); + this._geojsonSections = null; + } + }, + _displayWaitingContainer: function () { + this._waitingContainer.className = 'GProuteCalcWaitingContainerVisible'; + this._waiting = true; + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + var context = this; + this._timer = setTimeout(function () { + if (context._waiting === true) { + context._hideWaitingContainer(); + } else { + if (context._timer) { + clearTimeout(context._timer); + } + } + }, 16000); + }, + _hideWaitingContainer: function () { + if (this._waiting) { + this._waitingContainer.className = 'GProuteCalcWaitingContainerHidden'; + this._waiting = false; + clearTimeout(this._timer); + this._timer = null; + } + }, + _simplifiedInstructions: function (instructions) { + var newInstructions = []; + var current = instructions[0]; + if (instructions.length === 1) { + newInstructions.push(current); + } + for (var i = 1; i < instructions.length; i++) { + var o = instructions[i]; + if (o.instruction === current.instruction) { + current.distance = (parseFloat(o.distance) + parseFloat(current.distance)).toString(); + current.duration = (parseFloat(o.duration) + parseFloat(current.duration)).toString(); + for (var j = 1; j < o.geometry.coordinates.length; j++) { + current.geometry.coordinates.push(o.geometry.coordinates[j]); + } + if (i === instructions.length - 1) { + newInstructions.push(current); + current = null; + } + } else { + newInstructions.push(current); + current = o; + if (i === instructions.length - 1) { + newInstructions.push(o); + current = null; + } + } + } + return newInstructions; + }, + _convertSecondsToTime: function (duration) { + var time = ''; + duration = Math.round(duration); + var hours = Math.floor(duration / (60 * 60)); + if (!hours) { + hours = '00'; + } + var divisor4minutes = duration % (60 * 60); + var minutes = Math.floor(divisor4minutes / 60); + if (!minutes) { + minutes = '00'; + } + var divisor4seconds = divisor4minutes % 60; + var seconds = Math.ceil(divisor4seconds); + if (!seconds) { + seconds = '00'; + } + time = hours + 'h ' + minutes + 'm ' + seconds + 's'; + return time; + }, + _convertDistance: function (distance) { + var d = ''; + var distanceKm = parseInt(distance / 1000, 10); + if (!distanceKm) { + d = parseInt(distance, 10) + ' m'; + } else { + d = distanceKm + ' km'; + } + return d; + } + }); + return Route; +}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, CommonControlsRouteDOM); +CommonControlsSearchEngineDOM = function (ID) { + var SearchEngineDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPsearchEngine'); + container.className = 'GPwidget'; + return container; + }, + _createShowSearchEngineElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowSearchEngine'); + input.type = 'checkbox'; + return input; + }, + _createShowSearchEnginePictoElement: function () { + var self = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowSearchEnginePicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowSearchEngine'); + label.title = 'Afficher/masquer la recherche par lieux'; + label.addEventListener('click', function () { + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + var showAdvancedSearch = document.getElementById(self._addUID('GPshowAdvancedSearch')); + if (showAdvancedSearch) { + showAdvancedSearch.style.display = null; + document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none'; + } + var id = '#GPsearchInput-' + self._uid; + document.querySelector(id + ' input').disabled = false; + self.onShowSearchEngineClick(); + }); + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowSearchEngineOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createSearchInputElement: function () { + var self = this; + var form = document.createElement('form'); + form.id = this._addUID('GPsearchInput'); + form.addEventListener('submit', function (e) { + e.preventDefault(); + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block'; + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + self.onGeocodingSearchSubmit(e); + return false; + }); + var input = document.createElement('input'); + input.id = this._addUID('GPsearchInputText'); + input.type = 'text'; + input.placeholder = 'Rechercher un lieu, une adresse'; + input.autocomplete = 'off'; + input.addEventListener('keyup', function (e) { + var charCode = e.which || e.keyCode; + if (charCode === 13 || charCode === 10 || charCode === 38 || charCode === 40) { + return; + } + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + if (input.value.length > 2) { + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'block'; + } else { + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + } + self.onAutoCompleteSearchText(e); + }); + input.addEventListener('keydown', function (e) { + if (true) { + return; + } + var charCode = e.which || e.keyCode; + var container = document.getElementById(self._addUID('GPautocompleteResults')); + if (!container) { + return; + } + var curr = container.getElementsByClassName('GPautoCompleteProposal current'); + var list = container.getElementsByClassName('GPautoCompleteProposal'); + var length = list.length; + if (!length) { + return; + } + var current = null; + if (!curr.length) { + current = list[0]; + current.className = 'GPautoCompleteProposal current'; + current.style.color = '#000000'; + current.style['background-color'] = '#CEDBEF'; + return; + } else { + current = curr[0]; + } + var index = parseInt(ID.index(current.id), 10); + var next = index === length - 1 ? list[0] : list[index + 1]; + var prev = index === 0 ? list[length - 1] : list[index - 1]; + current.style['background-color'] = ''; + current.style.color = ''; + prev.style['background-color'] = ''; + prev.style.color = ''; + next.style['background-color'] = ''; + next.style.color = ''; + switch (charCode) { + case 38: + current.className = 'GPautoCompleteProposal'; + prev.className = 'GPautoCompleteProposal current'; + prev.style.color = '#000000'; + prev.style['background-color'] = '#CEDBEF'; + break; + case 40: + current.className = 'GPautoCompleteProposal'; + next.className = 'GPautoCompleteProposal current'; + next.style.color = '#000000'; + next.style['background-color'] = '#CEDBEF'; + break; + case 13: + current.click(e); + break; + } + current.focus(); + }); + form.appendChild(input); + var div = document.createElement('div'); + div.id = this._addUID('GPsearchInputReset'); + div.addEventListener('click', function () { + document.getElementById(self._addUID('GPsearchInputText')).value = ''; + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + self.onSearchResetClick(); + }); + form.appendChild(div); + return form; + }, + _createShowAdvancedSearchElement: function () { + var self = this; + var div = document.createElement('div'); + div.id = this._addUID('GPshowAdvancedSearch'); + div.className = 'GPshowAdvancedToolPicto'; + div.title = 'Ouvrir la recherche avancée'; + div.addEventListener('click', function () { + var id = '#GPsearchInput-' + self._uid; + document.querySelector(id + ' input').disabled = true; + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'none'; + document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'inline-block'; + }); + var span = document.createElement('span'); + span.id = this._addUID('GPshowAdvancedSearchOpen'); + span.className = 'GPshowAdvancedToolOpen'; + div.appendChild(span); + return div; + }, + _createAdvancedSearchPanelElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPadvancedSearchPanel'); + div.className = 'GPpanel'; + div.style.display = 'none'; + return div; + }, + _createGeocodeResultsElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPgeocodeResultsList'); + div.className = 'GPpanel'; + div.style.display = 'none'; + div.appendChild(this._createGeocodeResultsHeaderElement()); + return div; + }, + _createAutoCompleteElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPautoCompleteList'); + div.className = 'GPautoCompleteList'; + div.style.display = 'none'; + return div; + }, + _createAutoCompleteListElement: function () { + var self = this; + var container = document.createElement('div'); + container.id = this._addUID('GPautocompleteResults'); + if (container.addEventListener) { + container.addEventListener('click', function (e) { + self.onAutoCompletedResultsItemClick(e); + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + }, false); + } else if (container.attachEvent) { + container.attachEvent('onclick', function (e) { + self.onAutoCompletedResultsItemClick(e); + document.getElementById(self._addUID('GPautoCompleteList')).style.display = 'none'; + }); + } + return container; + }, + _createAutoCompletedLocationElement: function (location, id) { + var container = document.getElementById(this._addUID('GPautocompleteResults')); + var div = document.createElement('div'); + div.id = this._addUID('AutoCompletedLocation_' + id); + div.className = 'GPautoCompleteProposal'; + div.innerHTML = location.fullText; + if (div.addEventListener) { + div.addEventListener('click', function (e) { + container.click(e); + }, false); + } else if (div.attachEvent) { + div.attachEvent('onclick', function (e) { + container.click(e); + }); + } + container.appendChild(div); + }, + _createAdvancedSearchPanelHeaderElement: function () { + var self = this; + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var divTitle = document.createElement('div'); + divTitle.className = 'GPpanelTitle'; + divTitle.innerHTML = 'Recherche avancée'; + container.appendChild(divTitle); + var divClose = document.createElement('div'); + divClose.id = this._addUID('GPadvancedSearchClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer la recherche avancée'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + var id = '#GPsearchInput-' + self._uid; + document.querySelector(id + ' input').disabled = false; + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block'; + document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none'; + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + var id = '#GPsearchInput-' + self._uid; + document.querySelector(id + ' input').disabled = false; + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + document.getElementById(self._addUID('GPshowAdvancedSearch')).style.display = 'inline-block'; + document.getElementById(self._addUID('GPadvancedSearchPanel')).style.display = 'none'; + }); + } + container.appendChild(divClose); + return container; + }, + _createAdvancedSearchPanelFormElement: function (advancedSearchCodes) { + var self = this; + var form = document.createElement('form'); + form.id = this._addUID('GPadvancedSearchForm'); + form.addEventListener('submit', function (e) { + e.preventDefault(); + var data = []; + var id = '#GPadvancedSearchFilters-' + self._uid; + var matchesFilters = document.querySelectorAll(id + ' > div > div > input'); + for (var i = 0; i < matchesFilters.length; i++) { + var element = matchesFilters[i]; + data.push({ + key: element.name, + value: element.value + }); + } + self.onGeocodingAdvancedSearchSubmit(e, data); + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'block'; + return false; + }); + var div = document.createElement('div'); + div.className = 'GPflexInput'; + var label = document.createElement('label'); + label.className = 'GPadvancedSearchCodeLabel'; + label.innerHTML = 'Recherche par'; + div.appendChild(label); + var select = this._createAdvancedSearchFormCodeElement(advancedSearchCodes); + div.appendChild(select); + form.appendChild(div); + return form; + }, + _createAdvancedSearchFormCodeElement: function (codes) { + var self = this; + var select = document.createElement('select'); + select.id = this._addUID('GPadvancedSearchCode'); + select.className = 'GPadvancedSearchCode'; + select.addEventListener('change', function (e) { + self.onGeocodingAdvancedSearchCodeChange(e); + }, false); + if (!codes) { + codes = [ + { + id: 'PositionOfInterest', + title: 'Lieux/toponymes' + }, + { + id: 'StreetAddress', + title: 'Adresses' + }, + { + id: 'CadastralParcel', + title: 'Parcelles cadastrales' + }, + { + id: 'Administratif', + title: 'Administratif' + } + ]; + } + for (var i = 0; i < codes.length; i++) { + var option = document.createElement('option'); + option.value = codes[i].id; + option.text = codes[i].title; + select.appendChild(option); + } + return select; + }, + _createAdvancedSearchFormInputElement: function () { + var input = document.createElement('input'); + input.type = 'submit'; + input.id = this._addUID('GPadvancedSearchSubmit'); + input.className = 'GPinputSubmit'; + input.value = 'Chercher'; + return input; + }, + _createAdvancedSearchFormFiltersElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPadvancedSearchFilters'); + return container; + }, + _createAdvancedSearchFiltersTableElement: function (code, display) { + var container = document.createElement('div'); + container.id = this._addUID(code); + if (!display) { + container.style.display = 'none'; + } + return container; + }, + _createAdvancedSearchFiltersAttributElement: function (filterAttributes) { + var container = null; + var name = filterAttributes.name; + var title = filterAttributes.title; + var description = filterAttributes.description; + var code = filterAttributes.code; + var value = filterAttributes.value; + var div = document.createElement('div'); + div.className = 'GPflexInput'; + var label = document.createElement('label'); + label.className = 'GPadvancedSearchFilterLabel'; + label.htmlFor = name; + label.title = description || title; + label.innerHTML = title; + div.appendChild(label); + var input = document.createElement('input'); + input.id = name; + input.className = 'GPadvancedSearchFilterInput'; + input.type = 'text'; + input.name = name; + if (value) { + input.value = value; + } + div.appendChild(input); + container = document.getElementById(this._addUID(code)); + if (container) { + container.appendChild(div); + } else { + container = div; + } + return container; + }, + _createGeocodeResultsHeaderElement: function () { + var self = this; + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var divTitle = document.createElement('div'); + divTitle.className = 'GPpanelTitle'; + divTitle.innerHTML = 'Résultats de la recherche'; + container.appendChild(divTitle); + var divClose = document.createElement('div'); + divClose.id = this._addUID('GPgeocodeResultsClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer la fenêtre de résultats'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + }); + } + container.appendChild(divClose); + return container; + }, + _createGeocodeResultsListElement: function () { + var self = this; + var container = document.createElement('div'); + container.id = this._addUID('GPgeocodeResults'); + if (container.addEventListener) { + container.addEventListener('click', function (e) { + if (!e.ctrlKey) { + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + } + self.onGeocodedResultsItemClick(e); + }, false); + } else if (container.attachEvent) { + container.attachEvent('onclick', function (e) { + if (!e.ctrlKey) { + document.getElementById(self._addUID('GPgeocodeResultsList')).style.display = 'none'; + } + self.onGeocodedResultsItemClick(e); + }); + } + return container; + }, + _createGeocodedLocationElement: function (location, id) { + var container = document.getElementById(this._addUID('GPgeocodeResults')); + var div = document.createElement('div'); + div.id = this._addUID('GeocodedLocation_' + id); + div.className = 'GPautoCompleteProposal'; + if (typeof location === 'string') { + div.innerHTML = location; + } else { + var places = location.placeAttributes; + if (places.freeform) { + div.innerHTML = places.freeform; + } else if (places.postalCode) { + div.innerHTML = places.postalCode + ' ' + places.commune; + } else if (places.cadastralParcel) { + div.innerHTML = places.cadastralParcel; + } else { + div.innerHTML = '...'; + } + } + container.appendChild(div); + } + }; + return SearchEngineDOM; +}(CommonUtilsSelectorID); +CommonControlsSearchEngineUtils = function () { + var SearchEngineUtils = { + advancedSearchFiltersByDefault: { + PositionOfInterest: [ + { + name: 'importance', + title: 'Importance' + }, + { + name: 'nature', + title: 'Nature' + }, + { + name: 'territory', + title: 'Territoire' + }, + { + name: 'insee', + title: 'Code INSEE' + }, + { + name: 'municipality', + title: 'Ville' + }, + { + name: 'department', + title: 'Département' + } + ], + StreetAddress: [ + { + name: 'territory', + title: 'Territoire' + }, + { + name: 'insee', + title: 'Code INSEE' + }, + { + name: 'municipality', + title: 'Ville' + }, + { + name: 'department', + title: 'Département' + } + ], + CadastralParcel: [ + { + name: 'department', + title: 'Département', + description: 'Numéro du département (ex: 01, 94)' + }, + { + name: 'commune', + title: 'Code commune (INSEE)', + description: 'Code commune (INSEE) : 3 chiffres (ex: 067)' + }, + { + name: 'absorbedCity', + title: 'Commune absorbée', + description: 'Commune absorbée : 3 chiffres (ex: 000, 001)' + }, + { + name: 'section', + title: 'Section', + description: 'Section : 2 caractères (ex: AA, 0D)' + }, + { + name: 'number', + title: 'Numéro', + description: 'Numéro de la parcelle : 4 chiffres (ex: 0041, 0250)' + } + ], + Administratif: [ + { + name: 'prefecture', + title: 'Préfecture' + }, + { + name: 'inseeRegion', + title: 'Code région (INSEE)' + }, + { + name: 'inseeDepartment', + title: 'Code département (INSEE)' + }, + { + name: 'municipality', + title: 'Ville' + } + ] + }, + zoomToResultsByDefault: function (info) { + var zoom = 15; + var service = info.service; + var fields = info.fields; + var type = info.type; + var importance = { + 1: 11, + 2: 12, + 3: 13, + 4: 14, + 5: 15, + 6: 16, + 7: 17, + 8: 17 + }; + if (service === 'SuggestedLocation') { + if (type === 'PositionOfInterest') { + zoom = importance[fields.classification]; + } + } + if (service === 'DirectGeocodedLocation') { + if (type === 'PositionOfInterest') { + zoom = importance[fields.importance] || 14; + } + } + if (type === 'StreetAddress') { + zoom = 17; + } + if (type === 'CadastralParcel') { + zoom = 17; + } + if (type === 'Administratif') { + zoom = 12; + } + return zoom; + } + }; + return SearchEngineUtils; +}(); +LeafletControlsSearchEngine = function (L, woodman, Gp, RightManagement, ID, SearchEngineDOM, SearchEngineUtils) { + var SearchEngine = L.Control.extend({ + includes: SearchEngineDOM, + options: { + position: 'topleft', + collapsed: true, + displayInfo: true, + zoomTo: '', + resources: [], + displayAdvancedSearch: true, + advancedSearch: {}, + geocodeOptions: {}, + autocompleteOptions: {} + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._uid = ID.generate(); + this._inputContainer = null; + this._suggestedContainer = null; + this._suggestedLocations = []; + this._geocodedContainer = null; + this._geocodedLocations = []; + this._filterContainer = null; + this._currentGeocodingCode = null; + this._currentGeocodingLocation = null; + this._advancedSearchFilters = {}; + this._advancedSearchCodes = []; + this._marker = null; + this._servicesRightManagement = {}; + this._noRightManagement = false; + this._checkRightsManagement(); + }, + onAdd: function () { + this._initAdvancedSearchCodes(); + this._initAdvancedSearchFilters(); + var container = this._initLayout(); + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + return container; + }, + onRemove: function () { + }, + _checkRightsManagement: function () { + if (!this.options.resources || this.options.resources.length === 0) { + this.options.resources = [ + 'StreetAddress', + 'PositionOfInterest' + ]; + } + var _opts = null; + var _res = []; + var _key = null; + _key = this.options.geocodeOptions.apiKey; + _opts = this.options.geocodeOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = this.options.resources || [ + 'StreetAddress', + 'PositionOfInterest' + ]; + } + var rightManagementGeocode = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['Geocode'] + }); + _key = this.options.autocompleteOptions.apiKey; + _opts = this.options.autocompleteOptions.filterOptions; + _res = _opts ? _opts.type : []; + if (!_res || _res.length === 0) { + _res = this.options.resources || [ + 'StreetAddress', + 'PositionOfInterest' + ]; + } + var rightManagementAutoComplete = RightManagement.check({ + key: _key || this.options.apiKey, + resources: _res, + services: ['AutoCompletion'] + }); + if (!rightManagementGeocode && !rightManagementAutoComplete) { + this._noRightManagement = true; + } + if (rightManagementAutoComplete) { + this._servicesRightManagement['AutoCompletion'] = {}; + this._servicesRightManagement['AutoCompletion']['resources'] = rightManagementAutoComplete['AutoCompletion']; + this._servicesRightManagement['AutoCompletion']['key'] = rightManagementAutoComplete['key']; + } + if (rightManagementGeocode) { + this._servicesRightManagement['Geocode'] = {}; + this._servicesRightManagement['Geocode']['resources'] = rightManagementGeocode['Geocode']; + this._servicesRightManagement['Geocode']['key'] = rightManagementGeocode['key']; + } + if (!this.options.advancedSearch || Object.keys(this.options.advancedSearch).length === 0) { + var r = this._servicesRightManagement['Geocode']['resources']; + for (var i = 0; i < r.length; i++) { + var code = r[i]; + this.options.advancedSearch[code] = []; + } + } + }, + _initLayout: function () { + var container = this._createMainContainerElement(); + var inputShow = this._createShowSearchEngineElement(); + container.appendChild(inputShow); + if (!this.options.collapsed) { + inputShow.checked = 'true'; + } + var picto = this._createShowSearchEnginePictoElement(); + container.appendChild(picto); + var search = this._createSearchInputElement(); + container.appendChild(search); + if (this.options.displayAdvancedSearch) { + var advancedShow = this._createShowAdvancedSearchElement(); + container.appendChild(advancedShow); + var advancedPanel = this._createAdvancedSearchPanelElement(); + var advancedHeader = this._createAdvancedSearchPanelHeaderElement(); + var advancedForm = this._createAdvancedSearchPanelFormElement(this._advancedSearchCodes); + var advancedFormFilters = this._filterContainer = this._createAdvancedSearchFormFiltersElement(); + this._setFilter(this._advancedSearchCodes[0].id); + var advancedFormInput = this._createAdvancedSearchFormInputElement(); + advancedForm.appendChild(advancedFormFilters); + advancedForm.appendChild(advancedFormInput); + advancedPanel.appendChild(advancedHeader); + advancedPanel.appendChild(advancedForm); + container.appendChild(advancedPanel); + } + var autocomplete = this._createAutoCompleteElement(); + var autocompleteList = this._suggestedContainer = this._createAutoCompleteListElement(); + autocomplete.appendChild(autocompleteList); + container.appendChild(autocomplete); + var geocode = this._createGeocodeResultsElement(); + var geocodeList = this._geocodedContainer = this._createGeocodeResultsListElement(); + geocode.appendChild(geocodeList); + container.appendChild(geocode); + return container; + }, + _initAdvancedSearchCodes: function () { + var advancedSearchCodesByDefault = [ + { + id: 'PositionOfInterest', + title: 'Lieux/toponymes' + }, + { + id: 'StreetAddress', + title: 'Adresses' + }, + { + id: 'CadastralParcel', + title: 'Parcelles cadastrales' + }, + { + id: 'Administratif', + title: 'Administratif' + } + ]; + var _resources = Object.keys(this.options.advancedSearch); + for (var i = 0; i < _resources.length; i++) { + var id = _resources[i]; + for (var j = 0; j < advancedSearchCodesByDefault.length; j++) { + if (advancedSearchCodesByDefault[j].id === id) { + this._advancedSearchCodes.push(advancedSearchCodesByDefault[j]); + } + } + } + if (this._advancedSearchCodes.length === 0) { + this._advancedSearchCodes = advancedSearchCodesByDefault; + } + }, + _initAdvancedSearchFilters: function () { + var advancedSearchFiltersByDefault = { + PositionOfInterest: [ + { + name: 'city', + title: 'Ville', + filter: false, + sep: true + }, + { + name: 'importance', + title: 'Importance', + filter: true + }, + { + name: 'nature', + title: 'Nature', + filter: true + }, + { + name: 'territory', + title: 'Territoire', + filter: true + }, + { + name: 'insee', + title: 'Code commune (INSEE)', + filter: true + }, + { + name: 'department', + title: 'Département', + filter: true + } + ], + StreetAddress: [ + { + name: 'number', + title: 'Numéro', + filter: false, + sep: true + }, + { + name: 'street', + title: 'Rue', + filter: false, + sep: true + }, + { + name: 'postalCode', + title: 'Code Postal', + filter: false, + sep: true + }, + { + name: 'city', + title: 'Ville', + filter: false, + sep: true + }, + { + name: 'territory', + title: 'Territoire', + filter: true + }, + { + name: 'insee', + title: 'Code commune (INSEE)', + filter: true + }, + { + name: 'department', + title: 'Département', + filter: true + } + ], + CadastralParcel: [ + { + name: 'department', + title: 'Département', + filter: false, + sep: false, + value: '__' + }, + { + name: 'commune', + title: 'Commune', + filter: false, + sep: false, + value: '___' + }, + { + name: 'absorbedCity', + title: 'Commune absorbée', + filter: false, + sep: false, + value: '___' + }, + { + name: 'section', + title: 'Section', + filter: false, + sep: false, + value: '__' + }, + { + name: 'number', + title: 'Numéro', + filter: false, + sep: false, + value: '____' + } + ], + Administratif: [ + { + name: 'prefecture', + title: 'Préfecture', + filter: true + }, + { + name: 'inseeRegion', + title: 'Code région (INSEE)', + filter: true + }, + { + name: 'inseeDepartment', + title: 'Code département (INSEE)', + filter: true + }, + { + name: 'city', + title: 'Ville', + filter: false, + sep: true + } + ] + }; + var advancedSearchFiltersCustom = this.options.advancedSearch; + for (var code in advancedSearchFiltersCustom) { + if (advancedSearchFiltersCustom.hasOwnProperty(code)) { + if (!advancedSearchFiltersCustom[code] || advancedSearchFiltersCustom[code].length === 0) { + advancedSearchFiltersCustom[code] = advancedSearchFiltersByDefault[code]; + continue; + } + var filters = advancedSearchFiltersCustom[code]; + for (var i = 0; i < filters.length; i++) { + var o = filters[i]; + if (!o.hasOwnProperty('filter')) { + o.filter = o.name === 'municipality' ? false : true; + } + } + } + } + L.Util.extend(this._advancedSearchFilters, advancedSearchFiltersByDefault, advancedSearchFiltersCustom); + }, + _setFilter: function (code) { + var container = this._filterContainer; + var codeFound = false; + for (var i = 0; i < this._advancedSearchCodes.length; i++) { + if (this._advancedSearchCodes[i].id === code) { + codeFound = true; + break; + } + } + if (!codeFound) { + while (container.firstChild) { + container.removeChild(container.firstChild); + } + return; + } + this._currentGeocodingCode = code; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + var lstAttributs = this._advancedSearchFilters[code]; + if (!lstAttributs || lstAttributs.length === 0) { + return; + } + var divTable = this._createAdvancedSearchFiltersTableElement(code, true); + for (var j = 0; j < lstAttributs.length; j++) { + var divFilter = this._createAdvancedSearchFiltersAttributElement(lstAttributs[j]); + divTable.appendChild(divFilter); + } + container.appendChild(divTable); + return container; + }, + _requestAutoComplete: function (settings) { + if (!settings || Object.keys(settings).length === 0) { + return; + } + if (!settings.text) { + return; + } + if (this._noRightManagement) { + console.log('no rights for all service !?'); + return; + } + if (!this._servicesRightManagement['AutoCompletion']) { + console.log('no rights for this service !?'); + return; + } + var options = {}; + L.Util.extend(options, this.options.autocompleteOptions); + L.Util.extend(options, settings); + var resources = this._servicesRightManagement['AutoCompletion'].resources; + if (!resources || Object.keys(resources).length === 0) { + return; + } + if (resources && L.Util.isArray(resources) && !options.filterOptions) { + if (!options.filterOptions) { + options.filterOptions = {}; + } + options.filterOptions.type = resources; + } + var key = this._servicesRightManagement['AutoCompletion']['key']; + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key }); + Gp.Services.autoComplete(options); + }, + _fillAutoCompletedLocationListContainer: function (locations) { + if (!locations || locations.length === 0) { + return; + } + var element = this._suggestedContainer; + if (element.childElementCount) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + } + for (var i = 0; i < locations.length; i++) { + this._createAutoCompletedLocationElement(locations[i], i); + } + this._suggestedLocations = locations; + }, + _requestGeocoding: function (settings) { + if (!settings || Object.keys(settings).length === 0) { + return; + } + if (!settings.location) { + return; + } + if (this._noRightManagement) { + console.log('no rights for all service !?'); + return; + } + if (!this._servicesRightManagement['Geocode']) { + console.log('no rights for this service !?'); + return; + } + var options = {}; + L.Util.extend(options, this.options.geocodeOptions); + L.Util.extend(options, settings); + if (!options.hasOwnProperty('returnFreeForm')) { + L.Util.extend(options, { returnFreeForm: false }); + } + var resources = this._servicesRightManagement['Geocode'].resources; + if (!resources || Object.keys(resources).length === 0) { + return; + } + if (resources && L.Util.isArray(resources) && !options.filterOptions) { + if (!options.filterOptions) { + options.filterOptions = {}; + } + options.filterOptions.type = resources; + } + var key = this._servicesRightManagement['Geocode']['key']; + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey || key }); + Gp.Services.geocode(options); + }, + _fillGeocodedLocationListContainer: function (locations) { + if (!locations || locations.length === 0) { + this._clearGeocodedLocation(); + return; + } + var element = this._geocodedContainer; + if (element.childElementCount) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + } + for (var i = 0; i < locations.length; i++) { + this._createGeocodedLocationElement(locations[i], i); + } + this._geocodedLocations = locations; + }, + _setLabel: function (label) { + var element = L.DomUtil.get('GPsearchInputText-' + this._uid); + element.value = label || ''; + }, + _setPosition: function (position, zoom) { + var map = this._map; + map.setZoomAround(L.latLng(position.x, position.y), zoom, true); + map.panTo(L.latLng(position.x, position.y)); + }, + _getZoom: function (info) { + var map = this._map; + var key = this.options.zoomTo; + var zoom = null; + if (typeof key === 'function') { + zoom = key.call(this, info); + } + if (typeof key === 'number') { + zoom = key; + } + if (typeof key === 'string') { + if (key === 'auto') { + zoom = SearchEngineUtils.zoomToResultsByDefault(info); + } else { + var value = parseInt(key, 10); + if (!isNaN(value)) { + zoom = value; + } + } + } + Number.isInteger = Number.isInteger || function (value) { + return typeof value === 'number' && isFinite(value) && Math.floor(value) === value; + }; + if (!zoom || zoom === '' || !Number.isInteger(zoom)) { + zoom = map.getZoom(); + } + var min = map.getMinZoom(); + var max = map.getMaxZoom(); + if (zoom < min) { + zoom = min; + } + if (zoom > max) { + zoom = max; + } + return zoom; + }, + _setMarker: function (position, information, display) { + var map = this._map; + if (this._marker != null) { + map.removeLayer(this._marker); + this._marker = null; + } + if (position) { + var options = { + clickable: true, + zIndexOffset: 1000 + }; + this._marker = L.marker(L.latLng(position.x, position.y), options); + this._marker.addTo(map); + if (display) { + var popupContent = null; + if (typeof information !== 'string') { + var values = []; + if (information.service === 'DirectGeocodedLocation') { + if (information.fields.freeform) { + popupContent = information.fields.freeform; + } else { + var attributs = this._advancedSearchFilters[information.type]; + for (var i = 0; i < attributs.length; i++) { + var key = attributs[i].name; + var value = information.fields[key]; + if (typeof value === 'string' || typeof value === 'number') { + values.push(value); + } + } + popupContent = values.join(' - '); + } + } else if (information.service === 'SuggestedLocation') { + if (information.fields.fullText) { + popupContent = information.fields.fullText; + } else { + values.push(information.fields.street || ''); + values.push(information.fields.postalCode || ''); + values.push(information.fields.commune || ''); + if (information.type === 'PositionOfInterest') { + values.push(information.fields.poi || ''); + values.push(information.fields.kind || ''); + } + popupContent = values.join(' - '); + } + } else { + popupContent = 'sans informations.'; + } + } else { + popupContent = information; + } + this._marker.bindPopup(popupContent); + } + } + }, + _clearResults: function () { + this._currentGeocodingLocation = null; + this._clearSuggestedLocation(); + this._clearGeocodedLocation(); + this._setMarker(); + }, + _clearSuggestedLocation: function () { + this._suggestedLocations = []; + if (this._suggestedContainer) { + while (this._suggestedContainer.firstChild) { + this._suggestedContainer.removeChild(this._suggestedContainer.firstChild); + } + } + }, + _clearGeocodedLocation: function () { + this._geocodedLocations = []; + if (this._geocodedContainer) { + while (this._geocodedContainer.firstChild) { + this._geocodedContainer.removeChild(this._geocodedContainer.firstChild); + } + } + }, + onShowSearchEngineClick: function () { + }, + onSearchResetClick: function () { + this._clearResults(); + }, + onAutoCompleteSearchText: function (e) { + var value = e.target.value; + if (!value) { + return; + } + if (this._noRightManagement) { + return; + } + this._currentGeocodingLocation = value; + if (value.length < 3) { + return; + } + var context = this; + this._requestAutoComplete({ + text: value, + onSuccess: function (results) { + if (results) { + var locations = results.suggestedLocations; + context._fillAutoCompletedLocationListContainer(locations); + } + }, + onFailure: function (error) { + context._clearSuggestedLocation(); + } + }); + }, + onAutoCompletedResultsItemClick: function (e) { + var idx = ID.index(e.target.id); + var label = e.target.innerHTML; + if (!idx) { + return; + } + var position = { + x: this._suggestedLocations[idx].position.y, + y: this._suggestedLocations[idx].position.x + }; + var info = { + service: 'SuggestedLocation', + type: this._suggestedLocations[idx].type, + fields: this._suggestedLocations[idx] + }; + var zoom = this._getZoom(info); + this._setLabel(label); + this._setPosition(position, zoom); + this._setMarker(position, info, this.options.displayInfo); + }, + onGeocodingSearchSubmit: function (e) { + var value = e.target[0].value; + if (!value) { + return; + } + if (this._noRightManagement) { + return; + } + this._currentGeocodingLocation = value; + var context = this; + this._requestGeocoding({ + location: value, + onSuccess: function (results) { + if (results) { + var locations = results.locations; + context._fillGeocodedLocationListContainer(locations); + } + }, + onFailure: function (error) { + context._clearGeocodedLocation(); + } + }); + }, + onGeocodedResultsItemClick: function (e) { + var idx = ID.index(e.target.id); + var label = e.target.innerHTML; + if (!idx) { + return; + } + var position = this._geocodedLocations[idx].position; + var info = { + service: 'DirectGeocodedLocation', + type: this._geocodedLocations[idx].type, + fields: this._geocodedLocations[idx].placeAttributes + }; + var zoom = this._getZoom(info); + this._setLabel(label); + this._setPosition(position, zoom); + this._setMarker(position, info, this.options.displayInfo); + }, + onGeocodingAdvancedSearchCodeChange: function (e) { + var idx = e.target.selectedIndex; + var value = e.target.options[idx].value; + if (!value) { + return; + } + this._setFilter(value); + }, + onGeocodingAdvancedSearchSubmit: function (e, data) { + if (!data || data.length === 0) { + return; + } + var _filterOptions = {}; + _filterOptions['type'] = [this._currentGeocodingCode]; + var _location = this._currentGeocodingLocation || ''; + if (this._currentGeocodingCode === 'CadastralParcel') { + _location = ''; + } + for (var i = 0; i < data.length; i++) { + var filter = data[i]; + if (!filter.value) { + continue; + } + var filters = this._advancedSearchFilters[this._currentGeocodingCode]; + for (var j = 0; j < filters.length; j++) { + var o = filters[j]; + if (o.name === filter.key) { + if (o.filter) { + _filterOptions[filter.key] = filter.value; + } else { + if (o.value) { + var cur = filter.value.length; + var max = o.value.length; + if (max !== cur) { + var masked = max - cur; + var filler = o.value.charAt(0); + while (filler.length < masked) { + filler += filler; + } + var fillerSlice = filler.slice(0, masked); + filter.value = filter.value + fillerSlice; + } + _location += filter.value; + } else { + if (typeof _location === 'string') { + _location = {}; + } + _location[filter.key] = filter.value; + } + } + } + } + } + var context = this; + this._requestGeocoding({ + location: _location, + filterOptions: _filterOptions, + onSuccess: function (results) { + if (results) { + var locations = results.locations; + context._fillGeocodedLocationListContainer(locations); + } + }, + onFailure: function (error) { + context._clearGeocodedLocation(); + } + }); + } + }); + return SearchEngine; +}(leaflet, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, CommonControlsSearchEngineDOM, CommonControlsSearchEngineUtils); +CommonControlsElevationPathDOM = function () { + var ElevationPathDOM = { + _addUID: function (id) { + return id + '-' + this._uid; + }, + _createMainContainerElement: function () { + var container = document.createElement('div'); + container.id = this._addUID('GPelevationPath'); + container.className = 'GPwidget'; + return container; + }, + _createShowElevationPathElement: function () { + var input = document.createElement('input'); + input.id = this._addUID('GPshowElevationPath'); + input.type = 'checkbox'; + return input; + }, + _createShowElevationPathPictoElement: function () { + var context = this; + var label = document.createElement('label'); + label.id = this._addUID('GPshowElevationPathPicto'); + label.className = 'GPshowAdvancedToolPicto'; + label.htmlFor = this._addUID('GPshowElevationPath'); + label.title = 'Calculer un profil'; + if (label.addEventListener) { + label.addEventListener('click', function (e) { + context.onShowElevationPathClick(e); + }); + } else if (label.attachEvent) { + label.attachEvent('onclick', function (e) { + context.onShowElevationPathClick(e); + }); + } + var spanOpen = document.createElement('span'); + spanOpen.id = this._addUID('GPshowElevationPathOpen'); + spanOpen.className = 'GPshowAdvancedToolOpen'; + label.appendChild(spanOpen); + return label; + }, + _createElevationPathPanelElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPelevationPathPanel'); + div.className = 'GPpanel'; + return div; + }, + _createElevationPathPanelHeaderElement: function () { + var self = this; + var container = document.createElement('div'); + container.className = 'GPpanelHeader'; + var div = document.createElement('div'); + div.className = 'GPpanelTitle'; + div.innerHTML = 'Profil Altimétrique'; + container.appendChild(div); + var divReduce = document.createElement('div'); + divReduce.id = this._addUID('GPelevationPathPanelReduce'); + divReduce.className = 'GPpanelReduce'; + divReduce.title = 'Masquer le panneau'; + if (divReduce.addEventListener) { + divReduce.addEventListener('click', function () { + if (typeof self.onReduceElevationPathPanelClick === 'function') { + document.getElementById(self._addUID('GPshowElevationPath')).checked = false; + self.onReduceElevationPathPanelClick(); + } + }, false); + } else if (divReduce.attachEvent) { + divReduce.attachEvent('onclick', function () { + if (typeof self.onReduceElevationPathPanelClick === 'function') { + document.getElementById(self._addUID('GPshowElevationPath')).checked = false; + self.onReduceElevationPathPanelClick(); + } + }); + } + container.appendChild(divReduce); + var divClose = document.createElement('div'); + divClose.id = this._addUID('GPelevationPathPanelClose'); + divClose.className = 'GPpanelClose'; + divClose.title = 'Fermer le panneau'; + if (divClose.addEventListener) { + divClose.addEventListener('click', function () { + document.getElementById(self._addUID('GPshowElevationPathPicto')).click(); + }, false); + } else if (divClose.attachEvent) { + divClose.attachEvent('onclick', function () { + document.getElementById(self._addUID('GPshowElevationPathPicto')).click(); + }); + } + container.appendChild(divClose); + return container; + }, + _createElevationPathPanelProfilElement: function () { + var div = document.createElement('div'); + div.id = 'GPelevationPathProfil'; + return div; + }, + _createElevationPathWaitingElement: function () { + var div = document.createElement('div'); + div.id = this._addUID('GPelevationPathCalcWaitingContainer'); + div.className = 'GPelevationPathCalcWaitingContainerHidden'; + var p = document.createElement('p'); + p.className = 'GPelevationPathCalcWaiting'; + p.innerHTML = 'Calcul en cours...'; + div.appendChild(p); + return div; + } + }; + return ElevationPathDOM; +}(); +LeafletControlsElevationPath = function (L, P, woodman, Gp, RightManagement, ID, LocationSelector, PositionFormater, IconDefault, ElevationPathDOM) { + var ElevationPath = L.Control.extend({ + includes: ElevationPathDOM, + options: { + position: 'topleft', + active: false, + elevationPathOptions: {}, + stylesOptions: {}, + displayProfileOptions: { + apply: null, + target: null + } + }, + initialize: function (options) { + L.Util.setOptions(this, options); + this._uid = ID.generate(); + this._initDisplayProfileOptions(); + this._showContainer = null; + this._pictoContainer = null; + this._panelContainer = null; + this._profilContainer = null; + this._waitingContainer = null; + this._reducePanel = false; + this._featuresLayer = null; + this._lastIdLayer = 0; + this._currentIdLayer = 0; + this._currentFeature = null; + this._profile = null; + this._marker = null; + this._geometry = null; + this._noRightManagement = false; + this._checkRightsManagement(); + }, + onAdd: function (map) { + var container = this._container = this._initLayout(); + if (map) { + if (this.options.active) { + if (this._profile === null) { + this._panelContainer.style.display = 'none'; + } + this._activateMapInteraction(map); + } + } + L.DomEvent.disableClickPropagation(container).disableScrollPropagation(container); + return container; + }, + onRemove: function () { + }, + _checkRightsManagement: function () { + var rightManagement = RightManagement.check({ + key: this.options.apiKey, + resources: ['SERVICE_CALCUL_ALTIMETRIQUE_RSC'], + services: ['ElevationLine'] + }); + if (!rightManagement) { + this._noRightManagement = true; + } + if (!this.options.apiKey) { + this.options.apiKey = rightManagement.key; + } + }, + _initDisplayProfileOptions: function () { + var profil = this.options.displayProfileOptions || {}; + if (typeof profil === 'undefined' || Object.keys(profil).length === 0) { + this.options.displayProfileOptions = { + apply: ElevationPath.DISPLAY_PROFILE_BY_DEFAULT, + target: null + }; + } else { + this.options.displayProfileOptions = {}; + } + var displayFunction = profil.apply || this.options.displayProfileOptions.apply; + this.options.displayProfileOptions.apply = typeof displayFunction === 'function' ? displayFunction : ElevationPath.DISPLAY_PROFILE_BY_DEFAULT; + var displayContainer = profil.target || this.options.displayProfileOptions.target; + this.options.displayProfileOptions.target = typeof displayContainer === 'undefined' ? null : displayContainer; + }, + _initLayout: function () { + var container = this._createMainContainerElement(); + var inputShow = this._showContainer = this._createShowElevationPathElement(); + container.appendChild(inputShow); + if (this.options.active) { + this._showContainer.checked = true; + } + var picto = this._pictoContainer = this._createShowElevationPathPictoElement(); + container.appendChild(picto); + var panel = this._panelContainer = this._createElevationPathPanelElement(); + var header = this._createElevationPathPanelHeaderElement(); + panel.appendChild(header); + var profil = this._profilContainer = this._createElevationPathPanelProfilElement(); + panel.appendChild(profil); + var waiting = this._waitingContainer = this._createElevationPathWaitingElement(); + panel.appendChild(waiting); + container.appendChild(panel); + return container; + }, + onShowElevationPathClick: function (e) { + var map = this._map; + if (!this._reducePanel) { + if (this._showContainer.checked) { + this._pictoContainer.style.display = 'block'; + this._panelContainer.style.display = 'none'; + this._removeMapInteraction(map); + this._clear(); + } else { + if (this._profile === null) { + this._panelContainer.style.display = 'none'; + } + this._activateMapInteraction(map); + } + } else { + if (this._profile !== null) { + if (this.options.displayProfileOptions.target === null) { + this._pictoContainer.style.display = 'none'; + } + this._panelContainer.style.display = 'block'; + } + } + this._reducePanel = false; + }, + onReduceElevationPathPanelClick: function () { + this._reducePanel = true; + this._pictoContainer.style.display = 'block'; + this._panelContainer.style.display = 'none'; + }, + _activateMapInteraction: function (map) { + if (this._featuresLayer === null) { + this._featuresLayer = new L.FeatureGroup(); + map.addLayer(this._featuresLayer); + var self = this; + map.on('draw:created', function (e) { + self._currentIdLayer = L.Util.stamp(e.layer); + self._getFeatureGeometry(e.layer); + self._addFeatureLayer(e.layer); + }); + map.on('draw:drawstart', function () { + self._removeFeatureLayer(self._lastIdLayer); + self._lastIdLayer = self._currentIdLayer; + }); + map.on('draw:drawstop', function () { + if (typeof self.options.elevationPathOptions.onSuccess === 'undefined' && self.options.displayProfileOptions.target === null) { + self._pictoContainer.style.display = 'none'; + self._panelContainer.style.display = 'block'; + } + self._altiRequest(); + }); + } + this._activatePolyLineInteraction(map); + }, + _removeMapInteraction: function (map) { + if (!map) { + return; + } + if (this._featuresLayer !== null) { + map.off('draw:created'); + map.off('draw:drawstart'); + map.off('draw:drawstop'); + map.removeLayer(this._featuresLayer); + this._featuresLayer = null; + } + this._lastIdLayer = this._currentIdLayer = 0; + if (this._currentFeature) { + this._currentFeature.disable(); + } + }, + _activatePolyLineInteraction: function (map) { + if (this._currentFeature) { + this._currentFeature.disable(); + } + var styles = this.options.stylesOptions || {}; + var _shapeOptions = Object.keys(styles).length !== 0 ? styles : { + stroke: true, + color: '#C77A04', + weight: 4, + opacity: 0.5, + fill: false + }; + this._currentFeature = new L.Draw.Polyline(map, { shapeOptions: _shapeOptions }); + this._currentFeature.enable(); + }, + _getFeatureGeometry: function (layer) { + if (this._geometry !== null) { + this._geometry = null; + } + this._geometry = []; + var geometry = layer.getLatLngs(); + for (var i = 0; i < geometry.length; i++) { + var LatLng = geometry[i]; + this._geometry.push({ + lon: LatLng.lng, + lat: LatLng.lat + }); + } + }, + _addFeatureLayer: function (layer) { + if (!this._featuresLayer) { + return; + } + this._featuresLayer.addLayer(layer); + }, + _removeFeatureLayer: function (id) { + if (!this._featuresLayer) { + return; + } + if (id === 0) { + return; + } + if (!id) { + this._featuresLayer.clearLayers(); + } else { + this._featuresLayer.removeLayer(id); + } + }, + _altiRequest: function () { + if (!this._geometry) { + return; + } + if (this._noRightManagement) { + return; + } + var options = {}; + L.Util.extend(options, this.options.elevationPathOptions); + L.Util.extend(options, { apiKey: options.apiKey || this.options.apiKey }); + var self = this; + L.Util.extend(options, { + sampling: options.sampling || 200, + onSuccess: this.options.elevationPathOptions.onSuccess || function (result) { + if (result) { + if (self.options.displayProfileOptions.target !== null) { + self._pictoContainer.style.display = 'block'; + self._panelContainer.style.display = 'block'; + } + self._displayProfil(result.elevations); + self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden'; + self._waiting = false; + } + }, + onFailure: this.options.elevationPathOptions.onFailure || function (error) { + self._pictoContainer.style.display = 'block'; + self._panelContainer.style.display = 'none'; + self._waitingContainer.className = 'GPelevationPathCalcWaitingContainerHidden'; + self._waiting = false; + self._clear(); + } + }); + var positions = this._geometry; + L.Util.extend(options, { positions: positions }); + this._waitingContainer.className = 'GPelevationPathCalcWaitingContainerVisible'; + Gp.Services.getAltitude(options); + }, + _computeElevationMeasure: function (elevations) { + var _haversineDistance = function (c1, c2) { + var lat1 = PositionFormater.decimalToRadian(c1[1]); + var lat2 = PositionFormater.decimalToRadian(c2[1]); + var deltaLatBy2 = (lat2 - lat1) / 2; + var deltaLonBy2 = PositionFormater.decimalToRadian(c2[0] - c1[0]) / 2; + var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * Math.cos(lat1) * Math.cos(lat2); + return 2 * 6378137 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + }; + elevations[0].dist = 0; + var distance = 0; + for (var i = 1; i < elevations.length; i++) { + distance += _haversineDistance([ + elevations[i].lon, + elevations[i].lat + ], [ + elevations[i - 1].lon, + elevations[i - 1].lat + ]) / 1000; + elevations[i].dist = distance; + elevations[i].lat = Math.round(elevations[i].lat * 10000) / 10000; + elevations[i].lon = Math.round(elevations[i].lon * 10000) / 10000; + } + var coeffArrond = 100; + if (distance > 100) { + coeffArrond = 1; + } else if (distance > 10) { + coeffArrond = 10; + } + for (var j = 0; j < elevations.length; j++) { + var data = elevations[j]; + if (data.z < 0) { + data.z = 0; + } + data.dist = Math.round(data.dist * coeffArrond) / coeffArrond; + } + return elevations; + }, + _displayProfil: function (elevations) { + var data = this._computeElevationMeasure(elevations); + var container = this.options.displayProfileOptions.target; + if (container) { + container.appendChild(this._panelContainer); + } + container = this._profilContainer; + var context = this; + var displayFunction = this.options.displayProfileOptions.apply; + if (typeof AmCharts !== 'undefined' && typeof d3 !== 'undefined') { + } + displayFunction.call(this, data, container, context); + }, + _activateProfilEvent: function (position) { + if (this._profile === null) { + return; + } + var map = this._map; + var self = this; + if (self._marker) { + map.removeLayer(self._marker); + self._marker = null; + } + self._marker = L.marker(L.latLng(position.lat, position.lon), { + icon: new IconDefault('orange'), + draggable: false, + clickable: false, + zIndexOffset: 1000 + }); + self._marker.addTo(map); + var changed = function (e) { + var obj = e.chart.dataProvider[e.index]; + self._marker.setLatLng(L.latLng(obj.lat, obj.lon)); + self._marker.update(); + }; + self._profile.removeListener('changed', changed); + self._profile.addListener('changed', changed); + var mouseover = function (e) { + if (self._profile === null) { + return; + } + self._marker = L.marker(L.latLng(position.lat, position.lon), { + icon: new IconDefault('orange'), + draggable: false, + clickable: false, + zIndexOffset: 1000 + }); + self._marker.addTo(map); + }; + var mouseout = function (e) { + if (self._profile === null) { + return; + } + if (self._marker) { + map.removeLayer(self._marker); + self._marker = null; + } + }; + var mousemove = function (e) { + if (self._profile === null) { + return; + } + if (self._marker) { + self._marker.setLatLng(L.latLng(e.lat, e.lon)); + self._marker.update(); + } + }; + }, + _clear: function () { + this._geometry = null; + this._profile = null; + if (this._profilContainer) { + while (this._profilContainer.firstChild) { + this._profilContainer.removeChild(this._profilContainer.firstChild); + } + } + var map = this._map; + if (this._marker) { + map.removeLayer(this._marker); + this._marker = null; + } + } + }); + ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = function (data, container, context) { + if (container) { + while (container.firstChild) { + container.removeChild(container.firstChild); + } + } + if (!data) { + return; + } + var sortedElev = JSON.parse(JSON.stringify(data)); + sortedElev.sort(function (e1, e2) { + return e1.z - e2.z; + }); + var minZ = sortedElev[0].z; + var maxZ = sortedElev[sortedElev.length - 1].z; + var diff = maxZ - minZ; + var dist = data[data.length - 1].dist; + var barwidth = 100 / data.length; + var self = this; + var map = context._map; + var div = document.createElement('div'); + div.id = 'profileElevationByDefault'; + div.addEventListener('mouseover', function (e) { + var _lon = parseFloat(e.target.dataset['lon']); + var _lat = parseFloat(e.target.dataset['lat']); + if (_lon && _lat) { + self._marker = L.marker(L.latLng(_lat, _lon), { + icon: new IconDefault('orange'), + draggable: false, + clickable: false, + zIndexOffset: 1000 + }); + self._marker.addTo(map); + } + }); + div.addEventListener('mousemove', function () { + }); + div.addEventListener('mouseout', function () { + if (self._marker) { + map.removeLayer(self._marker); + self._marker = null; + } + }); + container.appendChild(div); + var divZ = document.createElement('div'); + divZ.className = 'z-title-vertical'; + divZ.innerHTML = minZ + ' / ' + maxZ + ' m'; + div.appendChild(divZ); + var ul = document.createElement('ul'); + ul.id = 'data-default'; + ul.className = 'z-axis x-axis'; + div.appendChild(ul); + for (var i = 0; i < data.length; i++) { + var d = data[i]; + var li = document.createElement('li'); + li.setAttribute('data-z', d.z); + li.setAttribute('data-lon', d.lon); + li.setAttribute('data-lat', d.lat); + li.setAttribute('data-dist', d.dist); + var pct = Math.floor((d.z - minZ) * 100 / diff); + li.setAttribute('class', 'percent v' + pct); + li.title = 'altitude : ' + d.z + 'm'; + li.setAttribute('style', 'width: ' + barwidth + '%'); + ul.appendChild(li); + } + var divX = document.createElement('div'); + divX.className = 'x-title-horizontal'; + divX.innerHTML = dist + ' km'; + div.appendChild(divX); + context._profile = container; + }; + ElevationPath.DISPLAY_PROFILE_RAW = function (data, container, context) { + if (container) { + while (container.firstChild) { + container.removeChild(container.firstChild); + } + } + var div = document.createElement('textarea'); + div.id = 'profilElevationResults'; + div.rows = 10; + div.cols = 50; + div.style.width = '100%'; + div.innerHTML = JSON.stringify(data, undefined, 4); + container.appendChild(div); + context._profile = container; + }; + ElevationPath.DISPLAY_PROFILE_LIB_D3 = function (data, container, context) { + if (typeof d3 === 'undefined') { + console.log('Lib. D3 is not loaded !'); + return; + } + if (container) { + while (container.firstChild) { + container.removeChild(container.firstChild); + } + } + var margin = { + top: 20, + right: 20, + bottom: 30, + left: 40 + }; + var width = container.clientWidth - margin.left - margin.right; + var height = container.clientHeight - margin.top - margin.bottom; + var x = d3.scale.linear().range([ + 0, + width + ]); + var y = d3.scale.linear().range([ + height, + 0 + ]); + var xAxis = d3.svg.axis().scale(x).orient('bottom').ticks(5); + var yAxis = d3.svg.axis().scale(y).orient('left').ticks(5); + var line = d3.svg.line().interpolate('basis').x(function (d) { + return x(d.dist); + }).y(function (d) { + return y(d.z); + }); + var area = d3.svg.area().interpolate('basis').x(function (d) { + return x(d.dist); + }).y0(height).y1(function (d) { + return y(d.z); + }); + var svg = d3.select(container).append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom).append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + var xDomain = d3.extent(data, function (d) { + return d.dist; + }); + x.domain(xDomain); + var yDomain = [ + 0, + d3.max(data, function (d) { + return d.z; + }) + ]; + y.domain(yDomain); + svg.append('path').datum(data).attr('class', 'area-d3').attr('d', area); + svg.append('g').attr('class', 'x axis-d3').attr('transform', 'translate(0,' + height + ')').call(xAxis).append('text').attr('y', -15).attr('dy', '.71em').attr('x', width).text('Distance (km)'); + svg.append('g').attr('class', 'y axis-d3').call(yAxis).append('text').attr('transform', 'rotate(-90)').attr('y', 6).attr('dy', '.71em').text('Altitude (m)'); + svg.append('g').attr('class', 'grid-d3 vertical').attr('transform', 'translate(0,' + height + ')').call(xAxis.orient('bottom').tickSize(-height, 0, 0).tickFormat('')); + svg.append('g').attr('class', 'grid-d3 horizontal').call(yAxis.orient('left').tickSize(-width, 0, 0).tickFormat('')); + svg.append('path').datum(data).attr('class', 'line-d3').attr('d', line); + svg.selectAll('circle').data(data).enter().append('circle').attr('cx', function (d) { + return x(d.dist); + }).attr('cy', function (d) { + return y(d.z); + }).attr('r', 0).attr('class', 'circle-d3'); + var focus = svg.append('g').style('display', 'none'); + focus.append('line').attr('id', 'focusLineX').attr('class', 'focusLine-d3'); + focus.append('line').attr('id', 'focusLineY').attr('class', 'focusLine-d3'); + focus.append('circle').attr('id', 'focusCircle').attr('r', 4).attr('class', 'circle-d3 focusCircle-d3'); + var div = d3.select(container).append('div').attr('class', 'tooltip-d3').style('opacity', 0); + var bisectDist = d3.bisector(function (d) { + return d.dist; + }).left; + var self = this; + var map = context._map; + svg.append('rect').attr('class', 'overlay-d3').attr('width', width).attr('height', height).on('mouseover', function () { + focus.style('display', null); + self._marker = L.marker(L.latLng(data[0].lat, data[0].lon), { + icon: new IconDefault('orange'), + draggable: false, + clickable: false, + zIndexOffset: 1000 + }); + self._marker.addTo(map); + }).on('mouseout', function () { + focus.style('display', 'none'); + if (self._marker) { + map.removeLayer(self._marker); + self._marker = null; + } + div.transition().duration(500).style('opacity', 0); + }).on('mousemove', function () { + var m = d3.mouse(this); + var distance = x.invert(m[0]); + var i = bisectDist(data, distance); + var d0 = data[i - 1]; + var d1 = data[i]; + var d = distance - d0[0] > d1[0] - distance ? d1 : d0; + var xc = x(d.dist); + var yc = y(d.z); + focus.select('#focusCircle').attr('cx', xc).attr('cy', yc); + focus.select('#focusLineX').attr('x1', xc).attr('y1', y(yDomain[0])).attr('x2', xc).attr('y2', y(yDomain[1])); + focus.select('#focusLineY').attr('x1', x(xDomain[0])).attr('y1', yc).attr('x2', x(xDomain[1])).attr('y2', yc); + self._marker.setLatLng(L.latLng(d.lat, d.lon)); + self._marker.update(); + div.transition().duration(200).style('opacity', 0.9); + div.html('Alt : ' + d.z + ' m
' + 'Lon : ' + d.lon + '
' + 'Lat : ' + d.lat).style('left', d3.event.pageX + 'px').style('top', d3.event.pageY - 28 + 'px'); + }); + context._profile = d3.selectAll('rect.overlay')[0][0]; + }; + ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = function (data, container, context) { + if (typeof AmCharts === 'undefined') { + console.log('Lib. AmCharts is not loaded !'); + return; + } + AmCharts.addInitHandler(function () { + }); + context._profile = AmCharts.makeChart(container, { + type: 'serial', + pathToImages: 'http://cdn.amcharts.com/lib/3/images/', + categoryField: 'dist', + autoMarginOffset: 0, + marginRight: 10, + marginTop: 10, + startDuration: 0, + color: '#5E5E5E', + fontSize: 10, + theme: 'light', + thousandsSeparator: '', + categoryAxis: { + color: '#5E5E5E', + gridPosition: 'start', + minHorizontalGap: 40, + tickPosition: 'start', + title: 'Distance (km)', + titleColor: '#5E5E5E', + startOnAxis: true + }, + chartCursor: { + animationDuration: 0, + bulletsEnabled: true, + bulletSize: 10, + categoryBalloonEnabled: false, + cursorColor: '#F90', + graphBulletAlpha: 1, + graphBulletSize: 1, + zoomable: false + }, + trendLines: [], + graphs: [{ + balloonColor: '#CCCCCC', + balloonText: '[[title]] : [[value]]m
(lat: [[lat]] / lon:[[lon]])', + bullet: 'round', + bulletAlpha: 0, + bulletBorderColor: '#FFF', + bulletBorderThickness: 2, + bulletColor: '#F90', + bulletSize: 6, + hidden: false, + id: 'AmGraph-1', + fillAlphas: 0.4, + fillColors: '#C77A04', + lineAlpha: 1, + lineColor: '#C77A04', + lineThickness: 1, + title: 'Altitude', + valueField: 'z' + }], + guides: [], + valueAxes: [{ + id: 'ValueAxis-1', + minVerticalGap: 20, + title: 'Altitude (m)' + }], + allLabel: [], + balloon: { + borderColor: '#CCCCCC', + borderThickness: 1, + fillColor: '#FFFFFF', + showBullet: true + }, + titles: [], + dataProvider: data + }); + var _initPosition = data[0]; + context._activateProfilEvent(_initPosition); + }; + return ElevationPath; +}(leaflet, leafletDraw, {}, gp, CommonUtilsCheckRightManagement, CommonUtilsSelectorID, LeafletControlsLocationSelector, LeafletControlsUtilsPositionFormater, LeafletControlsUtilsIconDefault, CommonControlsElevationPathDOM); +LeafletControlsLogo = function (L) { + var Logo = L.Control.extend({ + options: { + position: 'topright', + picto: null, + url: null, + text: null, + size: '30px' + }, + initialize: function (options) { + L.setOptions(this, options); + }, + onAdd: function () { + var container = L.DomUtil.create('div', 'gp-control-logo', container); + var bLink = this.options.url || this.options.text ? true : false; + var link = null; + if (bLink) { + link = L.DomUtil.create('a', '', container); + link.target = '_blank'; + if (this.options.url) { + link.href = this.options.url; + this.options.text ? link.title = this.options.text : null; + } + } + if (bLink && this.options.text) { + link.text = this.options.text; + } + var bImage = this.options.picto ? true : false; + var image = null; + if (bImage) { + if (bLink) { + image = L.DomUtil.create('img', '', link); + } else { + image = L.DomUtil.create('img', '', container); + } + image.src = this.options.picto; + if (typeof this.options.size === 'string') { + image.style.height = image.style.width = this.options.size; + } else { + image.style.height = this.options.size.height; + image.style.width = this.options.size.width; + } + } + return container; + } + }); + return Logo; +}(leaflet); +LeafletControlsControls = function (LayerSwitcher, Isocurve, MousePosition, ReverseGeocoding, Route, SearchEngine, ElevationPath, Logo) { + var Controls = { + LayerSwitcher: function (options) { + return new LayerSwitcher(options); + }, + Isocurve: function (options) { + return new Isocurve(options); + }, + MousePosition: function (options) { + return new MousePosition(options); + }, + ReverseGeocode: function (options) { + return new ReverseGeocoding(options); + }, + Route: function (options) { + return new Route(options); + }, + SearchEngine: function (options) { + return new SearchEngine(options); + }, + ElevationPath: function (options) { + return new ElevationPath(options); + }, + Logo: function (options) { + return new Logo(options); + } + }; + return Controls; +}(LeafletControlsLayerSwitcher, LeafletControlsIsocurve, LeafletControlsMousePosition, LeafletControlsReverseGeocoding, LeafletControlsRoute, LeafletControlsSearchEngine, LeafletControlsElevationPath, LeafletControlsLogo); +CommonUtilsLayerUtils = function () { + var LayerUtils = { + getZoomLevelFromScaleDenominator: function (scaleDenominator, crs) { + var resolutionsNatives = {}; + switch (crs) { + case 'EPSG:2154': + resolutionsNatives = { + 0: 104579.224549894, + 1: 52277.5323537905, + 2: 26135.4870785954, + 3: 13066.8913818, + 4: 6533.2286041135, + 5: 3266.5595244627, + 6: 1633.2660045974, + 7: 816.629554986, + 8: 408.3139146768, + 9: 204.1567415109, + 10: 102.0783167832, + 11: 51.0391448966, + 12: 25.5195690743, + 13: 12.7597836936, + 14: 6.379891636, + 15: 3.1899457653, + 16: 1.5949728695, + 17: 0.7974864315, + 18: 0.3987432149, + 19: 0.1993716073, + 20: 0.0996858037, + 21: 0.0498429018 + }; + break; + default: + resolutionsNatives = { + 0: 156543.033928041, + 1: 78271.51696402048, + 2: 39135.758482010235, + 3: 19567.87924100512, + 4: 9783.93962050256, + 5: 4891.96981025128, + 6: 2445.98490512564, + 7: 1222.99245256282, + 8: 611.49622628141, + 9: 305.7481131407048, + 10: 152.8740565703525, + 11: 76.43702828517624, + 12: 38.21851414258813, + 13: 19.10925707129406, + 14: 9.554628535647032, + 15: 4.777314267823516, + 16: 2.388657133911758, + 17: 1.194328566955879, + 18: 0.5971642834779395, + 19: 0.2985821417389697, + 20: 0.1492910708694849, + 21: 0.0746455354347424 + }; + break; + } + var resolution = scaleDenominator * 0.00028; + for (var index in resolutionsNatives) { + if (resolutionsNatives.hasOwnProperty(index)) { + if (resolutionsNatives[index] <= resolution) { + return index; + } + } + } + return 0; + }, + getAttributions: function (params) { + var zoom = params.zoom; + var attributions = []; + if (params.originators != null && params.visibility) { + var drawLogo; + for (var j = 0, jl = params.originators.length; j < jl; j++) { + drawLogo = true; + var originator = params.originators[j]; + var constraints = params.originators[j].constraints || []; + for (var k = 0, kl = constraints.length; k < kl; k++) { + var constraint = constraints[k]; + drawLogo = true; + var minZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.maxScaleDenominator, params.crs); + var maxZoomLevel = this.getZoomLevelFromScaleDenominator(constraint.minScaleDenominator, params.crs); + if (minZoomLevel && minZoomLevel > zoom) { + drawLogo = false; + } + if (drawLogo && maxZoomLevel && maxZoomLevel < zoom) { + drawLogo = false; + } + var bbox = constraint.bbox; + if (drawLogo && bbox) { + drawLogo = false; + var viewExtent = params.extent; + if (viewExtent) { + var bounds = [ + bbox.top, + bbox.left, + bbox.bottom, + bbox.right + ]; + if (this.intersects(viewExtent, bounds)) { + drawLogo = true; + break; + } + } + } + } + if (drawLogo) { + var logo = originator.logo; + var url = originator.url; + var name = originator.name ? originator.name : ''; + var text = originator.attribution; + var container = document.createElement('div'); + container.className = 'gp-control-attribution'; + var link = null; + link = document.createElement('a'); + link.className = 'gp-control-attribution-link'; + link.target = '_blank'; + container.appendChild(link); + if (url) { + link.href = url; + } + var bImage = logo ? true : false; + var image = null; + if (bImage) { + image = document.createElement('img'); + if (link) { + image.className = 'gp-control-attribution-image'; + link.appendChild(image); + } else { + image.className = ''; + container.appendChild(image); + } + image.src = logo; + image.title = text || name; + image.style.height = '30px'; + image.style.width = '30px'; + } else { + if (name) { + link.textContent = name; + } else if (text) { + link.textContent = text; + } else if (url) { + link.textContent = url; + } else { + link.textContent = ''; + } + } + attributions.push(container.innerHTML + ' '); + } + } + } + return attributions; + }, + intersects: function (extent1, extent2) { + var intersectsX = extent1[1] <= extent2[3] && extent2[1] <= extent1[3]; + var intersectsY = extent1[2] <= extent2[0] && extent2[2] <= extent1[0]; + return intersectsX && intersectsY; + } + }; + return LayerUtils; +}(); +LeafletLayersLayerConfig = function (woodman, Config, Util) { + var LayerConfig = { + get: function (options) { + var params = {}; + if (!Config.isConfigLoaded()) { + return; + } + params = Config.getLayerParams(options.layer, options.service, options.key); + if (!params) { + return; + } + params.minZoom = Util.getZoomLevelFromScaleDenominator(params.maxScale) || 1; + params.maxZoom = Util.getZoomLevelFromScaleDenominator(params.minScale) || 21; + return params; + } + }; + return LayerConfig; +}({}, CommonUtilsConfig, CommonUtilsLayerUtils); +LeafletLayersLayerEvent = function (woodman, LayerUtil) { + var LayerEvent = { + _id: null, + _attributions: [], + _visibility: true, + _originators: [], + isEnable: function (map) { + if (!map.attributionControl) { + return false; + } + return true; + }, + setVisible: function (visibility) { + this._visibility = visibility; + }, + getVisible: function () { + return this._visibility; + }, + _onRemoveLayer: function (e) { + if (e.layer._geoportal_id != this._geoportal_id) { + return; + } + this.setVisible(false); + }, + _onAddLayer: function (e) { + if (e.layer._geoportal_id != this._geoportal_id) { + return; + } + this.setVisible(true); + }, + _onMoveEndLayer: function (e) { + this.updateAttributions(this._map, this); + }, + updateAttributions: function (map) { + if (!this.isEnable(map)) { + return; + } + this.removeAttributions(map); + this.addAttributions(map); + }, + removeAttributions: function (map) { + if (!this.isEnable(map)) { + return; + } + for (var i = 0; i < this._attributions.length; i++) { + map.attributionControl.removeAttribution(this._attributions[i]); + } + if (this._attributions) { + this._attributions = []; + } + }, + addAttributions: function (map) { + if (!this.isEnable(map)) { + return; + } + var topLeft = map.getBounds().getNorthWest(); + var bottomRight = map.getBounds().getSouthEast(); + var arrayBounds = [ + topLeft.lat, + topLeft.lng, + bottomRight.lat, + bottomRight.lng + ]; + var params = { + extent: arrayBounds, + zoom: map.getZoom(), + originators: this._originators, + visibility: this._visibility + }; + var attributionsOriginators = LayerUtil.getAttributions(params); + if (attributionsOriginators && attributionsOriginators.length !== 0) { + for (var i = 0; i < attributionsOriginators.length; i++) { + this._attributions.push(attributionsOriginators[i]); + map.attributionControl.addAttribution(attributionsOriginators[i]); + } + } + } + }; + return LayerEvent; +}({}, CommonUtilsLayerUtils); +LeafletLayersWMS = function (L, Gp, woodman, LayerEvent) { + var WMS = L.TileLayer.WMS.extend({ + includes: LayerEvent, + initialize: function (url, options) { + var settings = {}; + L.Util.extend(settings, options.paramsWms, options.paramsNative); + L.TileLayer.WMS.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), settings); + this._originators = options.originators; + this._legends = options.legends; + this._metadata = options.metadata; + this._title = options.title; + this._description = options.description; + this._quicklookUrl = options.quicklookUrl; + this._geoportal_id = 0; + }, + onAdd: function (map) { + this._map = map; + this._geoportal_id = L.stamp(this); + L.TileLayer.WMS.prototype.onAdd.call(this, map); + this.setVisible(true); + this.updateAttributions(map); + map.on({ + overlayremove: this._onRemoveLayer, + overlayadd: this._onAddLayer, + layerremove: this._onRemoveLayer, + layeradd: this._onAddLayer, + moveend: this._onMoveEndLayer + }, this); + }, + onRemove: function (map) { + this._map = map; + L.TileLayer.prototype.onRemove.call(this, map); + this.setVisible(false); + this.removeAttributions(map); + map.off({ + overlayremove: this._onRemoveLayer, + overlayadd: this._onAddLayer, + layerremove: this._onRemoveLayer, + layeradd: this._onAddLayer, + moveend: this._onMoveEndLayer + }, this); + }, + getTileUrl: function (tilePoint) { + var lstProjEpsgGeographic = ['EPSG:4326']; + var map = this._map; + var tileSize = this.options.tileSize; + var nwPoint = tilePoint.multiplyBy(tileSize); + var sePoint = nwPoint.add([ + tileSize, + tileSize + ]); + var nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)); + var se = this._crs.project(map.unproject(sePoint, tilePoint.z)); + var bbox = this._wmsVersion >= 1.3 && lstProjEpsgGeographic.indexOf(this._crs.code) !== -1 ? [ + se.y, + nw.x, + nw.y, + se.x + ].join(',') : [ + nw.x, + se.y, + se.x, + nw.y + ].join(','); + var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) }); + return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; + } + }); + return WMS; +}(leaflet, gp, {}, LeafletLayersLayerEvent); +LeafletLayersWMTS = function (L, Gp, woodman, LayerEvent) { + var WMTS = L.TileLayer.extend({ + includes: LayerEvent, + defaultWmtsParams: { + service: 'WMTS', + request: 'GetTile', + version: '1.0.0', + layer: '', + style: '', + tilematrixset: 'PM', + format: 'image/jpeg' + }, + initialize: function (url, options) { + this._wmtsParams = {}; + L.Util.extend(this._wmtsParams, this.defaultWmtsParams, options.paramsWmts); + L.TileLayer.prototype.initialize.call(this, Gp.Helper.normalyzeUrl(url, { 'gp-leaflet-ext': '0.8.1' }, false), options.paramsNative); + this._originators = options.originators; + this._legends = options.legends; + this._metadata = options.metadata; + this._title = options.title; + this._description = options.description; + this._quicklookUrl = options.quicklookUrl; + this._geoportal_id = 0; + }, + onAdd: function (map) { + this._map = map; + this._geoportal_id = L.stamp(this); + L.TileLayer.prototype.onAdd.call(this, map); + this.setVisible(true); + this.updateAttributions(map); + map.on({ + overlayremove: this._onRemoveLayer, + overlayadd: this._onAddLayer, + layerremove: this._onRemoveLayer, + layeradd: this._onAddLayer, + moveend: this._onMoveEndLayer + }, this); + }, + onRemove: function (map) { + this._map = map; + L.TileLayer.prototype.onRemove.call(this, map); + this.setVisible(false); + this.removeAttributions(map); + map.off({ + overlayremove: this._onRemoveLayer, + overlayadd: this._onAddLayer, + layerremove: this._onRemoveLayer, + layeradd: this._onAddLayer, + moveend: this._onMoveEndLayer + }, this); + }, + getTileUrl: function (tilePoint) { + var zoom = this._getZoomForUrl(); + var url = L.Util.template(this._url, { s: this._getSubdomain(tilePoint) }); + return url + L.Util.getParamString(this._wmtsParams, url) + '&tilematrix=' + zoom + '&tilerow=' + tilePoint.y + '&tilecol=' + tilePoint.x; + }, + setParams: function (params, noRedraw) { + L.extend(this._wmtsParams, params); + if (!noRedraw) { + this.redraw(); + } + return this; + } + }); + return WMTS; +}(leaflet, gp, {}, LeafletLayersLayerEvent); +LeafletLayersLayers = function (L, woodman, LayerConfig, WMS, WMTS) { + var Layers = { + options: {}, + params: {}, + serviceUrl: 'http://localhost?no-rights-found-for=[{layer}]', + _initLogger: function () { + }, + _initOptions: function () { + if (!this.options || Object.keys(this.options) === 0) { + throw new Error('PARAM_MISSING : options !'); + } + if (!this.options.layer) { + throw new Error('PARAM_MISSING : layer !'); + } + if (!this.options.apiKey) { + console.log('PARAM_MISSING : apiKey !'); + } + }, + _initParams: function (service) { + if (!service) { + service = 'WMTS'; + } + this.params = LayerConfig.get({ + key: this.options.apiKey, + layer: this.options.layer, + service: service + }); + if (!this.params || Object.keys(this.params) === 0) { + this.params = {}; + if (!this.options.apiKey) { + console.log('WARNING PARAM_MISSING : parameter \'apiKey\' is mandatory if the contract key configuration has not been loaded !'); + } + } + }, + WMS: function (options, settings) { + this._initLogger(); + this.options = options || {}; + this._initOptions(); + this.settings = settings || {}; + this._initParams('WMS'); + var serviceUrl = null; + if (this.params.key || this.options.apiKey) { + serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/r/wms', { key: this.params.key || this.options.apiKey }); + } else { + serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer }); + } + var paramsWms = { + layers: this.options.layer, + styles: this.params.styles || 'normal', + format: this.params.format || 'image/jpeg', + version: this.params.version || '1.3.0' + }; + var paramsNative = { + minZoom: this.params.minZoom || 1, + maxZoom: this.params.maxZoom || 21 + }; + L.Util.extend(paramsNative, this.settings); + return new WMS(serviceUrl, { + paramsNative: paramsNative, + paramsWms: paramsWms, + originators: this.params.originators || [], + legends: this.params.legends || [], + metadata: this.params.metadata || [], + title: this.params.title || null, + description: this.params.description || null, + quicklookUrl: this.params.quicklookUrl || null + }); + }, + WMTS: function (options, settings) { + this._initLogger(); + this.options = options || {}; + this._initOptions(); + this.settings = settings || {}; + this._initParams('WMTS'); + var serviceUrl = null; + if (this.params.key || this.options.apiKey) { + serviceUrl = this.params.url || L.Util.template('http://wxs.ign.fr/{key}/geoportail/wmts', { key: this.params.key || this.options.apiKey }); + } else { + serviceUrl = L.Util.template(this.serviceUrl, { layer: this.options.layer }); + } + var paramsWmts = { + layer: this.options.layer, + style: this.params.styles || 'normal', + format: this.params.format || 'image/jpeg', + version: this.params.version || '1.0.0', + tilematrixset: this.params.TMSLink || 'PM' + }; + var paramsNative = { + minZoom: this.params.minZoom || 1, + maxZoom: this.params.maxZoom || 21 + }; + L.Util.extend(paramsNative, this.settings); + return new WMTS(serviceUrl, { + paramsNative: paramsNative, + paramsWmts: paramsWmts, + originators: this.params.originators || [], + legends: this.params.legends || [], + metadata: this.params.metadata || [], + title: this.params.title || '', + description: this.params.description || '', + quicklookUrl: this.params.quicklookUrl || '' + }); + } + }; + return Layers; +}(leaflet, {}, LeafletLayersLayerConfig, LeafletLayersWMS, LeafletLayersWMTS); +LeafletGpPluginLeaflet = function (L, P, Gp, Controls, ElevationPath, Layers, CRS, Register) { + Gp.leafletExtVersion = '0.8.1'; + Gp.leafletExtDate = '2016-12-02'; + Gp.Register = Register; + L.geoportalLayer = Layers; + L.geoportalControl = Controls; + L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3 = ElevationPath.DISPLAY_PROFILE_LIB_D3; + L.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS = ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS; + L.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW = ElevationPath.DISPLAY_PROFILE_RAW; + L.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT = ElevationPath.DISPLAY_PROFILE_BY_DEFAULT; + L.geoportalCRS = CRS; + L.geoportalCRS.EPSG2154 = CRS.EPSG2154(); + L.geoportalCRS.EPSG27572 = CRS.EPSG27572(); + L.geoportalCRS.EPSG4326 = CRS.EPSG4326(); + return Gp; +}(leaflet, leafletDraw, gp, LeafletControlsControls, LeafletControlsElevationPath, LeafletLayersLayers, LeafletCRSCRS, CommonUtilsRegister); +window.proj4 = proj4; + +return Gp; +})); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet-gp-3.0.2.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,157 @@ +/*! + * @brief Geoportal Extension for Leaflet + * + * This software is released under the licence CeCILL-B (Free BSD compatible) + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt + * @see http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt + * @see http://www.cecill.info/ + * + * copyright CeCILL-B + * copyright IGN + * @author IGN + * @version 0.9.0 + * @date 2016-12-04 + * + */ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont ributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/jakearchibald/es6-promise/ master/LICENSE + * @version 3.0.2 + */ +/*! + * Sortable -- minimalist JavaScript library for reorderable drag-and-drop lists + * + * Released under MIT LICENSE + * + * Copyright 2013-2016 Lebedev Konstantin + * http://rubaxa.github.io/Sortable/ + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*! + * Proj4js - Javascript reprojection library. + * + * Authors: + * + * - Mike Adair madairATdmsolutions.ca + * - Richard Greenwood richATgreenwoodmap.com + * - Didier Richard didier.richardATign.fr + * - Stephen Irons stephen.ironsATclear.net.nz + * - Olivier Terral oterralATgmail.com + * - Calvin Metcalf cmetcalfATappgeo.com + * + * Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * _THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE._ + * + */ +/*! + * Copyright 2012-2016 Jacob Toye and Leaflet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*! + * Proj4Leaflet -- Smooth Proj4js integration with Leaflet + * + * Copyright (c) 2012, Kartena AB + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(['leaflet'], factory); + } else if (typeof exports === 'object') { + module.exports = factory(require('leaflet')); + } else { + root.Gp = factory(root.L); + } +}(this, function(leaflet) { +var gp,CommonUtilsAutoLoadConfig,leafletDraw,sortable,CommonControlsLayerSwitcherDOM,LeafletControlsLayerSwitcher,CommonUtilsConfig,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,CommonControlsLocationSelectorDOM,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,LeafletControlsLocationSelector,CommonControlsIsoDOM,LeafletControlsIsocurve,CommonControlsMousePositionDOM,proj4,proj4leaflet07x,proj4leaflet10x,LeafletCRSProj4Leaflet,CommonUtilsRegister,LeafletCRSEPSG2154,LeafletCRSEPSG27572,LeafletCRSEPSG4326,LeafletCRSCRS,LeafletControlsMousePosition,CommonControlsReverseGeocodingDOM,LeafletControlsReverseGeocoding,CommonControlsRouteDOM,LeafletControlsRoute,CommonControlsSearchEngineDOM,CommonControlsSearchEngineUtils,LeafletControlsSearchEngine,CommonControlsElevationPathDOM,LeafletControlsElevationPath,LeafletControlsLogo,LeafletControlsControls,CommonUtilsLayerUtils,LeafletLayersLayerConfig,LeafletLayersLayerEvent,LeafletLayersWMS,LeafletLayersWMTS,LeafletLayersLayers,LeafletGpPluginLeaflet;!function(t,e){gp=function(){return"function"==typeof e?e():e}()}(this,function(){var t,e,i,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D,N,U,j,F,z,B,q,W,H,V,Y,K,X,Z,Q,J,$,tt,et,it,nt,ot,st,rt,at,lt,ct,ht,ut,dt,pt,mt,ft,_t,gt,vt,yt,Et,Pt,Ct,St,Mt,wt,Lt,Rt,bt,xt,Gt,It,At,Tt,kt,Ot,Dt,Nt,Ut,jt,Ft,zt,Bt;return t=void 0,e={loggers:[{root:!0,level:"all",appenders:[{type:"Console",layout:{type:"PatternLayout",pattern:"%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n"}}]}]},i=function(t,e){var i={getLogger:function(i){t.load(e,function(t){if(t)throw t});var n=i||"default";return t.getLogger(n)}};return i}(t,e),n=function(){var t={normalyzeParameters:function(t){var e=null;if(t){var i=[];for(var n in t)if(t.hasOwnProperty(n)){var o=t[n];o||(o=""),i.push(n+"="+o)}e=i.join("&")}return e},normalyzeUrl:function(t,e,i){var n=t;if(t){var o=t.indexOf("?");o===-1&&(n+="?"),o!==-1&&o!==t.length-1&&(n+="&")}return e&&(n+="string"==typeof e?e:this.normalyzeParameters(e)),i&&(n=encodeURIComponent(n)),n},indent:function(t,e){var i=t||0;return new Array(i+1).join("\t")+e}};return t}(),function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function i(t){return"object"==typeof t&&null!==t}function n(t){B=t}function s(t){V=t}function r(){return function(){process.nextTick(u)}}function a(){return function(){z(u)}}function l(){var t=0,e=new X(u),i=document.createTextNode("");return e.observe(i,{characterData:!0}),function(){i.data=t=++t%2}}function c(){var t=new MessageChannel;return t.port1.onmessage=u,function(){t.port2.postMessage(0)}}function h(){return function(){setTimeout(u,1)}}function u(){for(var t=0;t0&&(r=window.setTimeout(function(){var t="TimeOut Occured on Http Request with XMLHttpRequest !";n({message:t,status:-1})},t.timeOut)),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(t){console.log(t),n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)window.clearTimeout(r),i(s.response);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.response+"')",e=s.status;n({message:t,status:e})}};var a=t.data&&o?t.data:null;s.send(a)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");s=new XDomainRequest,s.open(t.method,t.url),s.overrideMimeType=t.content,t.timeOut>0&&(s.timeout=t.timeout),o&&s.setRequestHeader("Content-type",t.content),s.onerror=function(){n(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},s.ontimeout=function(){n(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},s.onload=function(){if(200==s.status)i(s.responseText);else{var t="Errors Occured on Http Request (status : '"+s.status+"' | response : '"+s.responseText+"')",e=s.status;n({message:t,status:e})}};var l=t.data&&o?t.data:null;s.send(l)}});return i},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch(function(e){throw console.log("_callJSON failed on : ",t.url,e),e})},__callXML:function(t){return this.__call(t).then(function(t){var e;if(window.DOMParser){var i=new DOMParser;e=i.parseFromString(t,"text/xml")}else e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async=!1,e.loadXML(t);return e}).catch(function(e){throw console.log("__callXML failed on : ",t.url,e),e})}};return n}(i,n,o),r=function(){var t={PARAM_MISSING:"Parameter(s) '%var%' missing",PARAM_EMPTY:"Parameter(s) '%var%' empty",PARAM_TYPE:"Wrong type(s) for parameter(s) '%var%'",PARAM_FORMAT:"Parameter(s) '%var%' not correctly formatted",PARAM_NOT_SUPPORT:"Value(s) for parameter(s) '%var%' not supported",PARAM_UNKNOWN:"Value(s) for parameter(s) '%var%' unknown",SERVICE_REQUEST_BUILD:"An error occurred during the request building of the service",SERVICE_REQUEST_EMPTY:"The request sent to the service is empty",SERVICE_RESPONSE_EXCEPTION:"The service returned an exception : '%var%'",SERVICE_RESPONSE_EXCEPTION_2:"The service returned an exception",SERVICE_RESPONSE_ANALYSE:"An error occurred while parsing the response '%var%' of the service",SERVICE_RESPONSE_ANALYSE_2:"An unknown error occurred while parsing the response",SERVICE_RESPONSE_EMPTY:"The response of the service is empty",SERVICE_RESPONSE_EMPTY_2:"The response from the service could not be analyzed or is empty",SERVICE_RESPONSE_FORMAT:"The format of the service response is not supported (handled format(s) : '%var%')",SERVICE_RESPONSE_FORMAT_2:"The format of the service response is not supported",SERVICE_RESPONSE_FORMAT_3:"No suggestion matching the search",CLASS_CONSTRUCTOR:"'%var%' constructor cannot be called as a function.",getMessage:function(t,e){if(!arguments)return"Message indefined !";var i=Array.prototype.slice.call(arguments),n=i.shift(),o=i,s=this[n];try{s=Array.isArray(o)&&o.length>0?s.replace("%var%",o.join(" - ")):s.replace("%var%","%var% (not specified)")}catch(t){}return s}};return t}(),a=function(){function t(e){if(!(this instanceof t))throw new TypeError("ErrorService constructor cannot be called as a function.");var i=e;"string"==typeof e||e instanceof String?(this.message=e,this.status=-1,this.type=t.TYPE_UNKERR):(this.message=i.message||"undefined!?",this.type=i.type,this.status=i.status||-1),this.name="ErrorService",this.stack=(new Error).stack}return t.TYPE_SRVERR="SERVICE_ERROR",t.TYPE_USEERR="USAGE_ERROR",t.TYPE_UNKERR="UNKNOWN_ERROR",t.prototype=Object.create(Error.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),t}(),l=function(t){var e={uuid:function(){var t=Math.floor(Date.now());return function(){return t++}}(),call:function(t){if(!t)throw new Error("missing parameter : options !");if(!t.url)throw new Error("missing parameter : options.url !");if(t.timeOut||(t.timeOut=0),!t.onResponse)throw new Error("missing parameter : options.onResponse !");var e="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),i=!1,n=!1,o=t.url.indexOf("callback=");if(o!=-1){i=!0;var s=t.url.indexOf("&",o);s===-1&&(s=t.url.length);var r=t.url.substring(o+9,s);r&&(n=!0,t.callbackName=r)}if(!i){var a=t.url.indexOf("?");a===-1?t.url=t.url+"?callback=":a===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback="}var l=!!t.callbackName||n;if(n||(t.callbackName||(t.callbackName="callback",(e||""===e)&&(t.callbackName+=e)),t.url=t.url.replace("callback=","callback="+t.callbackName)),t.onTimeOut||(t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!l){var c=this,h=null;t.timeOut>0&&(h=window.setTimeout(function(){window[t.callbackName]=function(){},t.onTimeOut(),c._deleteScript(e)},t.timeOut)),window[t.callbackName]=function(i){window.clearTimeout(h),t.onResponse(i),c._deleteScript(e)}}this._createScript(e,t.url)},_createScript:function(t,e){var i,n=document.getElementById("results"+t);i=document.createElement("script"),i.setAttribute("type","text/javascript"),i.setAttribute("src",e),i.setAttribute("charset","UTF-8"),i.setAttribute("id","results"+t),i.setAttribute("async","true");var o=document.documentElement||document.getElementsByTagName("head")[0];null===n?o.appendChild(i):o.replaceChild(i,n)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var i=e.parentNode||document.documentElement;if(!i)return;i.removeChild(e)}}};return e}(i),c=function(t,e,i){var n={send:function(n){var o=n||{method:"GET",protocol:"JSONP",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("XHR"===n.protocol||"json"===n.format?o.wrap=!1:"JSONP"===n.protocol&&"xml"===n.format&&(o.wrap=!0),o.callback=("JSONP"==n.protocol,null),o.output=o.wrap?"json":null,o.wrap){var s={};s.output=o.output,s.callback=o.callback,delete s.callback,o.url=t.normalyzeUrl(n.url,s)}switch(o.protocol){case"XHR":"GET"===n.method&&n.nocache&&(o.url=t.normalyzeUrl(o.url,{t:(new Date).getTime()})),e.call(o);break;case"JSONP":o.data&&(o.url=t.normalyzeUrl(o.url,o.data)),i.call(o);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}};return n}(n,s,l),h=function(){var t=location&&location.protocol&&0===location.protocol.indexOf("https:")?"https://":"http://",e="wxs.ign.fr",i="%KEY%",n=t+e.concat("/",i),o=function(t){return this._key.replace(t?i:null,t)},s={Alti:{_key:{"elevation-json":n+"/alti/rest/elevation.json","elevation-xml":n+"/alti/rest/elevation.xml","profil-json":n+"/alti/rest/elevationLine.json","profil-xml":n+"/alti/rest/elevationLine.xml",wps:n+"/alti/wps"},url:function(t){return{"elevation-json":this._key["elevation-json"].replace(t?i:null,t),"elevation-xml":this._key["elevation-xml"].replace(t?i:null,t),"profil-json":this._key["profil-json"].replace(t?i:null,t),"profil-xml":this._key["profil-xml"].replace(t?i:null,t),wps:this._key.wps.replace(t?i:null,t)}}},ProcessIsoCurve:{_key:{"iso-json":n+"/isochrone/isochrone.json","iso-xml":n+"/isochrone/isochrone.xml"},url:function(t){return{"iso-json":this._key["iso-json"].replace(t?i:null,t),"iso-xml":this._key["iso-xml"].replace(t?i:null,t)}}},AutoComplete:{_key:n+"/ols/apis/completion",url:o},ReverseGeocode:{_key:n+"/geoportail/ols",url:o},AutoConf:{_key:{apiKey:n+"/autoconf",apiKeys:n+"/autoconf?keys=%KEYS%"},url:function(n){var o="";if(Array.isArray(n)&&n.length>0){o=n[0];for(var s=1;se||t",input:"__KEY__=__DATA__"},post:{value:'__IDENTIFIER____RAWDATAOUTPUT__',input:"__KEY____DATA__"}},namespaceByDefault:function(){var t=['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"'];return t.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(){var t="";if("POST"==this.method)t=this.template.post.value;else{if("GET"!=this.method)return!1;t=this.template.get.value}return t=t.replace(/__SERVICE__/g,this.paramservice),t=t.replace(/__VERSION__/g,this.paramversion),t=t.replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput),t=t.replace(/__IDENTIFIER__/g,this.paramidentifier),t=t.replace(/__REQUEST__/g,this.paramrequest),"POST"==this.method&&(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault),t=t.replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),!!(t=t.replace(//g,this.__addDataInputs()))&&(this.requestString=t,!0)},__addDataInputs:function(){for(var t="GET"==this.method?this.template.get.input:this.template.post.input,e="GET"==this.method?";":"",i="",n=this,o=this.DataObject.getData(),s=0;s0)for(var r=n.getElementsByTagName("parsererror"),a=0;a0){ +var i=s(t);e.attributes=i}if(t.hasChildNodes())for(var n,r={},a=t.childNodes,l=0;l0){for(var e={},i=t.attributes,n=0;n0){for(var e={},i=t.attributes,n=0;n0){var e=f(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==y.VERSION)return void console.log("[AutoConfResponseReader] autoconf version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==y.NAMESPACES.xmlns)return void console.log("[AutoConfResponseReader] autoconf response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&y.NAMESPACES[o]&&y.NAMESPACES[o]!==e[i])return void console.log("[AutoConfResponseReader] autoconf response "+i+" namespace is not the expected one");if("schemaLocation"===o&&e[i]!==y.SCHEMALOCATION[0]&&e[i]!==y.SCHEMALOCATION[1])return void console.log("[AutoConfResponseReader] autoconf response schema location is not the expected one")}}}var y={};return y.VERSION="1.1.0",y.NAMESPACES={xmlns:"http://www.opengis.net/context",gpp:"http://api.ign.fr/geoportail",ows:"http://www.opengis.net/ows/1.1",sld:"http://www.opengis.net/sld",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},y.SCHEMALOCATION=["http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://wxs.ign.fr/schemas/autoconf/autoconf.xsd","http://www.opengis.net/context http://gpp3-wxs.ign.fr/schemas/extContext.xsd http://api.ign.fr/geoportail http://gpp3-wxs.ign.fr/schemas/autoconf.xsd"],y.DEFAULTPREFIX="context",y.READERS={context:{ViewContext:function(t){v(t);var i=new e;return _(t,i),i},Title:function(t,e){e&&e.generalOptions?e.generalOptions.title=g(t):e&&e.lyr&&(e.lyr.title=g(t))},Abstract:function(t,e){e&&e.lyr&&(e.lyr.description=g(t))},Server:function(t,e){var i=t.getAttribute("service"),n=t.getAttribute("title"),o=t.getAttribute("version");if(i)if(e&&e.services&&"object"==typeof e.services&&!e.services[i]){var s=new l;s.title=n,s.version=o,_(t,s),e.services[i]=s}else e&&e.lyr&&(e.lyr.serviceParams||(e.lyr.serviceParams={}),e.lyr.serviceParams.id=i,e.lyr.serviceParams.version=o)},OnlineResource:function(t,e){e&&e.hasOwnProperty("serverUrl")&&(e.serverUrl=t.getAttribute("xlink:href"))},LayerList:function(t,e){if(_(t,e),e&&e.layers&&e.generalOptions&&e.services)for(var i in e.layers)if(e.layers.hasOwnProperty(i)){var n=e.layers[i],o=n.apiKeys;if(o&&Array.isArray(o))for(var s=0;s0?this.options.serverUrl=i.apiKeys:this.options.serverUrl=i.apiKey}"XHR"===this.options.protocol&&"POST"===this.options.httpMethod&&(this.options.httpMethod="GET"),this.options.outputFormat="xml"}return a.prototype=Object.create(s.prototype,{}),a.prototype.constructor=a,a.prototype.buildRequest=function(t,e){var i="undefined"!=typeof window?window:{};if(i.Gp&&i.Gp.Config&&i.Gp.Config.generalOptions&&i.Gp.Config.layers&&i.Gp.Config.generalOptions.apiKeys[this.options.apiKey]){if(!this.options.layerId)return void this.options.onSuccess.call(this,i.Gp.Config);if(i.Gp.Config.layers[this.options.layerId]&&i.Gp.Config.layers[this.options.layerId].aggregatedLayers)return void this.options.onSuccess.call(this,i.Gp.Config)}this.request="";var o;o=this.options.serverUrl.indexOf("http://")===-1,!o&&this.layerId&&(this.request=n.normalyzeParameters({layerId:this.layerId})),e.call(this,this.request)},a.prototype.analyzeResponse=function(t,n){if(this.response){var o={layerId:this.options.layerId,response:this.response,rawResponse:this.options.rawResponse,onSuccess:n,onError:t,scope:this};r.build(o)}else t.call(this,new i(e.getMessage("SERVICE_RESPONSE_EMPTY")))},a}(i,r,a,n,h,u,F),B=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RequestHeader constructor cannot be called as a function.");this.options=t||{srsName:"EPSG:4326"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'',constructor:e,toString:function(){var t=null;return t=this.template,t=t.replace(/__SRSNAME__/g,this.options.srsName),this.requestString=t,this.requestString}},e}(i),q=function(t){function e(t){if(!(this instanceof e))throw new TypeError("Request constructor cannot be called as a function.");this.options=t||{maximumResponses:25,methodName:null,version:"1.2"};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={requestString:null,template:'',constructor:e,guid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0,i="x"===t?e:3&e|8;return i.toString(16)})},toString:function(){var t=null;return t=this.template,t=t.replace(/__MAXRESPONSES__/g,this.options.maximumResponses), +t=t.replace(/__METHODNAME__/g,this.options.methodName),t=t.replace(/__UUID__/g,this.guid()),t=t.replace(/__VERSION__/g,this.options.version),this.requestString=t,this.requestString}},e}(i),W=function(t){function e(t){if(!(this instanceof e))throw new TypeError("AbstractService constructor cannot be called as a function.");this.options=t||{};for(var i in t)t.hasOwnProperty(i)&&(this.options[i]=t[i])}return e.prototype={strRequest:null,oRequest:null,oFilter:null,constructor:e,addRequest:function(t){},addFilter:function(t){},toString:function(){}},e}(i),H=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("XLS constructor cannot be called as a function.");this.options={srsName:"EPSG:4326",maximumResponses:25};for(var e in t)t.hasOwnProperty(e)&&t[e]&&(this.options[e]=t[e])}return o.VERSION="1.2",o.prototype={requestString:null,namespace:!1,oService:null,constructor:o,template:'\n\n__REQUESTHEADER__\n__REQUEST__\n\n',namespaceByDefault:function(){var t=['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:xls="http://www.opengis.net/xls"','xmlns:gml="http://www.opengis.net/gml"'];return t.join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd"'},setService:function(t){t&&t instanceof n&&(this.oService=t)},getService:function(){return this.oService}},o.prototype.addNamespace=function(t,e){for(var i=t.key,n=!1,o=this.namespaceByDefault().split(" "),s=0;s])/g,h="<"+i+":$1",e=e.replace(c,h),c=/<\/(\w+[\s>])/g,h="/g,this.getService().toString())),n)return this.namespace&&(n=this.addNamespace({key:"xls",url:"http://www.opengis.net/xls"},n)),this.requestString=n,this.requestString},o}(i,B,q,W),V=function(t,e){function i(t){if(!(this instanceof i))throw new TypeError("Address constructor cannot be called as a function.");if(this.options=t||{location:{},type:["StreetAddress"],filter:{}},!t.location)throw new Error("l'option 'location' n'est pas renseignée !");for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e])}return i.prototype={constructor:i,requestString:null,template:{address:'
__LOCATION____PLACE____POSTALCODE____ENVELOPE__
',location:{freeFormAddress:"__FREEFORMADDRESSVALUE__",streetAddress:{container:"__STREET____BUILDING__",building:'',street:"__STREETVALUE__"}},place:'__PLACEVALUE__',postalCode:"__POSTALCODEVALUE__",envelope:"__LEFT__ __BOTTOM____RIGHT__ __TOP__"}},i.prototype.toString=function(){var t=null;if(t=this.template.address,t=t.replace(/__COUNTRYCODE__/g,this.options.type),"string"==typeof this.options.location){var e=this.template.location.freeFormAddress;e=e.replace(/__FREEFORMADDRESSVALUE__/g,this.options.location),t=t.replace(/__LOCATION__/g,e)}else{var i="",n="";this.options.location.number&&(i=this.template.location.streetAddress.building,i=i.replace(/__BUILDINGVALUE__/g,this.options.location.number)),this.options.location.street&&(n=this.template.location.streetAddress.street,n=n.replace(/__STREETVALUE__/g,this.options.location.street));var o=this.template.location.streetAddress.container;o=o.replace(/__STREET__/g,n),o=o.replace(/__BUILDING__/g,i),t=t.replace(/__LOCATION__/g,o)}var s="";this.options.location.postalCode&&(s=this.template.postalCode,s=s.replace(/__POSTALCODEVALUE__/g,this.options.location.postalCode));var r="";if(this.options.filter){var a=this.options.filter.bbox;a&&(r=this.template.envelope,r=r.replace(/__LEFT__/g,a.left),r=r.replace(/__BOTTOM__/g,a.bottom),r=r.replace(/__RIGHT__/g,a.right),r=r.replace(/__TOP__/g,a.top))}var l=[],c="";if(this.options.filter){var h=this.options.filter;for(var u in h)"bbox"!==u&&(c=this.template.place,c=c.replace(/__PLACETYPE__/g,u),c=c.replace(/__PLACEVALUE__/g,h[u]),l.push(c))}var d="";return this.options.location.city&&(d=this.template.place,d=d.replace(/__PLACETYPE__/g,"Municipality"),d=d.replace(/__PLACEVALUE__/g,this.options.location.city),l.push(d)),t=t.replace(/__POSTALCODE__/g,s),t=t.replace(/__PLACE__/g,l.join("\n")),t=t.replace(/__ENVELOPE__/g,r),this.requestString=t,this.requestString},i}(Bt,i),Y=function(t){function e(){if(!(this instanceof e))throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function.");this.filters=[]}return e.prototype={constructor:e,addFilterExtensions:function(t){t&&this.filters.push(t)},getNames:function(){var t=[];for(var e in this.filters)t.push(this.filters[e].CLASSNAME);return t},getFilter:function(t){var e=null;for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i]);return e},getFilters:function(){return this.filters},getAttributs:function(t){var e=[];for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].attributesList);return e},setPlaceAttributs:function(t,e){var i=this.getFilter(t),n=this.getAttributs(t);for(var o in n){var s=n[o];e[s]&&(i.placeAttributes[s]=e[s])}},getPlaceAttributs:function(t){var e={};for(var i in this.filters)this.filters[i].CLASSNAME==t&&(e=this.filters[i].placeAttributes);return e}},e}(i),K=function(t,e,i){function n(t){if(!(this instanceof n))throw new TypeError("GeocodeRequest constructor cannot be called as a function.");this.options=t||{};for(var e in t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.CLASSNAME="GeocodeRequest"}return n.prototype={strRequest:null,oAddress:null,oFilter:null,template:'__ADDRESS__',addAddress:function(t){t instanceof e&&(this.oAddress=t)},addFilter:function(t){t instanceof i&&(this.oFilter=t)},constructor:n,toString:function(){var t="";if(t=this.template,!this.oAddress){var i={};if(i.location=this.options.location,i.type=this.options.filterOptions.type||["StreetAddress"],i.filter=this.options.filterOptions,delete i.filter.type,this.oFilter){i.filter={};for(var n in i.type){var o=i.type[n],s=this.oFilter.getFilter(o);if(s){for(var r=this.options.filterOptions,a=s.attributesList,l=0;l__GMLPOINT____GMLFILTER__",gml:{point:'__X__ __Y__',pos:null,filter:{bbox:'__LEFT__ __BOTTOM____RIGHT__ __TOP__',circle:'__X__ __Y____RADIUS__',polygon:'__XY__',multipolygon:null}}}},e.prototype.toString=function(){var t=this.template.position,e=this.template.gml.point;e=e.replace(/__X__/g,this.options.position.x),e=e.replace(/__Y__/g,this.options.position.y);var i="";if(this.options.filter){var n=this.options.filter;for(var o in n)switch(o){case"circle":i=this.template.gml.filter[o],i=i.replace(/__X__/g,n[o].x),i=i.replace(/__Y__/g,n[o].y),i=i.replace(/__RADIUS__/g,n[o].radius);break;case"bbox":i=this.template.gml.filter[o],i=i.replace(/__LEFT__/g,n[o].left),i=i.replace(/__BOTTOM__/g,n[o].bottom),i=i.replace(/__RIGHT__/g,n[o].right),i=i.replace(/__TOP__/g,n[o].top);break;case"polygon":i=this.template.gml.filter[o];for(var s="",r=n[o],a=0;a__TYPE__"},e.prototype.toString=function(){for(var t=[],e="",i=0;i__POSITION____PREFERENCE__',addPosition:function(t){t instanceof e&&(this.oPosition=t)},addPreferences:function(t){t instanceof i&&(this.oPreference=t)},toString:function(){var t="";if(t=this.template,!this.oPreference&&(this.oPreference=new i(this.options.filterOptions.type||["StreetAddress"]),!this.oPreference))throw new Error("Les preferences ne sont pas definies !?");if(t=t.replace(/__PREFERENCE__/g,this.oPreference.toString()),!this.oPosition){var n={position:this.options.position,filter:{}};if(this.options.filterOptions&&(n.filter=this.options.filterOptions,delete n.filter.type),this.oPosition=new e(n),!this.oPosition)throw new Error("La position et ses filtres ne sont pas definis !?")}return t=t.replace(/__POSITION__/g,this.oPosition.toString()),t=t.replace(/__RETURNFREEFORM__/g,this.options.returnFreeForm?"true":"false"),this.strRequest=t,this.strRequest}},n}(i,X,Z),J=function(t,e,i,n,o){function s(t){if(!(this instanceof s))throw new TypeError("LocationUtilityService constructor cannot be called as a function.");this.CLASSNAME="LocationUtilityService",this.CLASSTYPE=null,e.apply(this,arguments),this.options&&(this.CLASSTYPE=this.options.location?"GeocodeRequest":this.options.position?"ReverseGeocodeRequest":null)}return s.prototype=Object.create(e.prototype,{}),s.prototype.constructor=s,s.prototype.addRequest=function(t){switch(this.CLASSTYPE=t.CLASSNAME,this.CLASSTYPE){case"GeocodeRequest":case"ReverseGeocodeRequest":this.oRequest=t;break;default:throw new Error("Ce n'est pas un objet de type 'LUS Request' !?")}},s.prototype.addFilter=function(t){t instanceof o&&(this.oFilter=t)},s.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("GeocodeRequest"===this.CLASSTYPE){var t={location:this.options.location,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}else if("ReverseGeocodeRequest"===this.CLASSTYPE){var e={position:this.options.position,returnFreeForm:this.options.returnFreeForm,filterOptions:this.options.filterOptions||{}};this.oRequest=new n(e)}}if(!this.oRequest)throw new Error("Type de Geocodage indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},s}(i,W,K,Q,Y),$=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeLocation constructor cannot be called as a function.");this.placeAttributes={},this.attributesList=[],this.serviceAttributes=[]}return t.prototype={constructor:t},t}(),tt=function(t){function e(){if(!(this instanceof e))throw new TypeError("StreetAddress constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="StreetAddress",this.attributesList=["bbox","ID","IDTR","quality","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","ID","IDTR","Qualite","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),et=function(t){function e(){if(!(this instanceof e))throw new TypeError("PositionOfInterest constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="PositionOfInterest",this.attributesList=["bbox","importance","nature","territory","commune","department","insee","municipality"],this.serviceAttributes=["bbox","Importance","Nature","Territoire","Commune","Departement","INSEE","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),it=function(t){function e(){if(!(this instanceof e))throw new TypeError("CadastralParcel constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="CadastralParcel",this.attributesList=["absorbedCity","sheet","number","section","commune","department","insee","municipality","origin"],this.serviceAttributes=["CommuneAbsorbee","Feuille","Numero","Section","Commune","Departement","INSEE","Municipality","Type"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),nt=function(t){function e(){if(!(this instanceof e))throw new TypeError("Administratif constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="Administratif",this.attributesList=["bbox","prefecture","inseeRegion","inseeDepartment","municipality"],this.serviceAttributes=["bbox","Prefecture","InseeRegion","InseeDepartement","Municipality"]}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}($),ot=function(t,e,i,n,o,s,r,a){var l={build:function(t){var l=null,c=new n;c.addFilterExtensions(new a),c.addFilterExtensions(new o),c.addFilterExtensions(new s),c.addFilterExtensions(new r);var h=new i({location:t.location,returnFreeForm:t.returnFreeForm,filterOptions:t.filterOptions});h.addFilter(c);var u=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(u.namespace=!0,u.setService(h),l=u.build(),"GET"==t.httpMethod){var d="qxml="+encodeURIComponent(l).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");l=d}return l}};return l}(i,H,J,Y,tt,et,it,nt),st=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodeResponse constructor cannot be called as a function.");this.locations=[]}return t.prototype={constructor:t},t}(),rt=function(){function t(){if(!(this instanceof t))throw new TypeError("GeocodedLocation constructor cannot be called as a function.");this.position={x:null,y:null},this.matchType=null,this.placeAttributes={},this.type=null}return t.prototype={constructor:t},t}(),at=function(t){function e(){if(!(this instanceof e))throw new TypeError("DirectGeocodedLocation constructor cannot be called as a function.");t.apply(this,arguments),this.CLASSNAME="DirectGeocodedLocation",this.accuracy=null}return e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e}(rt),lt=function(t,e,i,n,o){function s(t){if(t.attributes.length>0){for(var e={},i=t.attributes,n=0;n0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[DirectGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[DirectGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[DirectGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},GeocodedAddress:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},GeocodeMatchCode:function(t,e){var i=t.getAttribute("accuracy");i&&e&&(e.accuracy=parseFloat(i));var n=t.getAttribute("matchType");n&&e&&(e.matchType=n)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},freeFormAddress:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.freeform=a(t))},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&("StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t)))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o0){for(var e={},i=t.attributes,n=0;n0){var e=s(t);for(var i in e)if(e.hasOwnProperty(i)){if("version"===i&&e.version!==c.VERSION)return void console.log("[ReverseGeocodeResponseReader] geocode version is not the expected one : there may be errors in parsing");if("xmlns"===i){if(e[i]!==c.NAMESPACES[c.DEFAULTPREFIX])return void console.log("[ReverseGeocodeResponseReader] geocode response default namespace is not the expected one");continue}var n=i.split(":")[0],o=i.split(":")[1];if("xmlns"===n&&o&&c.NAMESPACES[o]&&c.NAMESPACES[o]!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response "+i+" namespace is not the expected one");if("schemaLocation"===o&&c.SCHEMALOCATION!==e[i])return void console.log("[ReverseGeocodeResponseReader] geocode response schema location is not the expected one")}}}var c={};return c.VERSION="1.2",c.NAMESPACES={xmlns:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xls:"http://www.opengis.net/xls",xlsext:"http://www.opengis.net/xlsext",xsi:"http://www.w3.org/2001/XMLSchema-instance"},c.SCHEMALOCATION="http://wxs.ign.fr/schemas/olsAll.xsd",c.DEFAULTPREFIX="xls",c.READERS={xls:{XLS:function(t){var e=new n;return l(t),r(t,e),e},ReverseGeocodedLocation:function(t,e){var i=new o;r(t,i),e&&Array.isArray(e.locations)&&e.locations.push(i)},Address:function(t,e){var i=t.getAttribute("countryCode");e&&i&&(e.type=i),r(t,e)},Building:function(t,e){var i=t.getAttribute("number");e&&e.hasOwnProperty("placeAttributes")&&(i?e.placeAttributes.number=i:t.getAttribute("buildingName")?e.placeAttributes.number=t.getAttribute("buildingName"):t.getAttribute("subdivision")&&(e.placeAttributes.number=t.getAttribute("subdivision")))},Street:function(t,e){"StreetAddress"===e.type?e.placeAttributes.street=a(t):"CadastralParcel"===e.type&&(e.placeAttributes.cadastralParcel=a(t))},Place:function(t,e){var i=t.getAttribute("type"),n=a(t);if(e&&e.hasOwnProperty("placeAttributes"))if("Municipality"===i)e.placeAttributes.municipality=n;else if("Bbox"===i){var o=n.split(";");4===o.length&&(e.placeAttributes.bbox={left:parseFloat(o[0]),right:parseFloat(o[2]),top:parseFloat(o[1]),bottom:parseFloat(o[3])})}else"Commune"===i?e.placeAttributes.commune=n:"Departement"===i?e.placeAttributes.department=n:"INSEE"===i?e.placeAttributes.insee=n:"Qualite"===i?e.placeAttributes.quality=n:"Territoire"===i?e.placeAttributes.territory=n:"ID"===i?e.placeAttributes.ID=n:"ID_TR"===i?e.placeAttributes.IDTR=n:"Importance"===i?e.placeAttributes.importance=parseInt(n,10):"Nature"===i?e.placeAttributes.nature=n:"Numero"===i?e.placeAttributes.number=n:"Feuille"===i?e.placeAttributes.sheet=n:"Section"===i?e.placeAttributes.section=n:"CommuneAbsorbee"===i?e.placeAttributes.absorbedCity=n:"Arrondissement"===i?n&&(e.placeAttributes.arrondissement=n):"Type"===i?e.placeAttributes.origin=n:"Prefecture"===i?e.placeAttributes.prefecture=n:"InseeRegion"===i?e.placeAttributes.inseeRegion=n:"InseeDepartment"===i&&(e.placeAttributes.inseeDepartment=n)},PostalCode:function(t,e){e&&e.hasOwnProperty("placeAttributes")&&(e.placeAttributes.postalCode=a(t))},SearchCentreDistance:function(t,e){e&&(e.searchCenterDistance=parseFloat(t.getAttribute("value")))},Error:function(t){var n=t.getAttribute("message"),o=t.getAttribute("errorCode"),s=e.getMessage("SERVICE_RESPONSE_EXCEPTION","("+o+") : "+n);throw new i({message:s,type:i.TYPE_SRVERR})}},gml:{pos:function(t,e){var i=a(t);e&&i&&(e.position={x:parseFloat(i.split(" ")[0]),y:parseFloat(i.split(" ")[1])})}},xlsext:{ExtendedGeocodeMatchCode:function(t,e){e&&(e.matchType=a(t))}},ExceptionReport:function(t){var e={};if(t.hasChildNodes())for(var i,n=t.childNodes,o=0;o__ROUTEPREFERENCE____GRAPH____WAYPOINTLIST____AVOIDLIST__",routePreference:"__VALUEROUTEPREFERENCE__",graph:'',wayPointList:{container:"__STARTPOINT____VIAPOINT____ENDPOINT__",point:'__X__ __Y__',startPoint:"__POINT__",endPoint:"__POINT__",viaPoint:"__POINT__"},avoidList:{container:"__AVOIDFEATURE__",avoidFeature:"__VALUEAVOIDFEATURE__"}},toString:function(){var t="";if(t=this.template.routePlan,this.options.routePreference){var e=this.template.routePreference;e=e.replace(/__VALUEROUTEPREFERENCE__/,this.options.routePreference),t=t.replace(/__ROUTEPREFERENCE__/g,e)}if(t=t.replace(/__ROUTEPREFERENCE__/g,""),this.options.avoidFeature){for(var i=this.template.avoidList.container,n=[],o=0;o__ROUTEPLAN____ROUTEINSTRUCTIONREQUEST____ROUTEGEOMETRYREQUEST____ROUTEMAPREQUEST__',routeInstructionRequest:'',routeGeometryRequest:"",routeMapRequest:""},addRoute:function(t){t instanceof e&&(this.oRoutePlan=t)},constructor:i,toString:function(){var t="";if(t=this.template.determineRouteRequest,t=t.replace(/__DISTANCEUNIT__/g,this.options.distanceUnit||"KM"),!this.oRoutePlan){var i=this.options.route;if(this.oRoutePlan=new e(i),!this.oRoutePlan)throw new Error("La construction du calcul d'initineraire n'est pas correctement definie !?")}t=t.replace(/__ROUTEPLAN__/g,this.oRoutePlan.toString());var n=this.template.routeInstructionRequest;n=n.replace(/__PROVIDEGEOMETRY__/g,this.options.provideGeometry||!1),n=n.replace(/__PROVIDEBBOX__/g,this.options.provideBoundingBox||!1),t=t.replace(/__ROUTEINSTRUCTIONREQUEST__/g,n);var o=this.template.routeGeometryRequest;t=t.replace(/__ROUTEGEOMETRYREQUEST__/g,o);var s=this.template.routeMapRequest;return t=t.replace(/__ROUTEMAPREQUEST__/g,s),this.strRequest=t,this.strRequest}},i}(i,Et),Ct=void 0,St=function(t,e,i,n){function o(t){if(!(this instanceof o))throw new TypeError("RouteService constructor cannot be called as a function.");this.CLASSNAME="RouteService",this.CLASSTYPE="RouteRequest",e.apply(this,arguments)}return o.prototype=Object.create(e.prototype,{}),o.prototype.constructor=o,o.prototype.addRequest=function(t){if("DetermineRouteRequest"!==t.CLASSNAME)throw new Error("Ce n'est pas un objet de type 'Route Request' !?");this.oRequest=t},o.prototype.addFilter=function(t){t instanceof n&&(this.oFilter=t)},o.prototype.toString=function(){if(!this.oRequest){if(!this.options)throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !");if("RouteRequest"===this.CLASSTYPE){var t={distanceUnit:this.options.distanceUnit||null,provideGeometry:this.options.provideGeometry||null,provideBoundingBox:this.options.provideBoundingBox||null,route:{routePreference:this.options.routePreference||null,startPoint:this.options.startPoint,viaPoint:this.options.viaPoint||null,endPoint:this.options.endPoint,avoidFeature:this.options.avoidFeature||null,graph:this.options.graph||null,expectedStartTime:this.options.expectedStartTime||null}};this.oRequest=new i(t),this.oFilter&&this.oRequest.addFilter(this.oFilter)}}if(!this.oRequest)throw new Error("Type de requête indefini !");return this.strRequest=this.oRequest.toString(),this.strRequest},o}(i,W,Pt,Ct),Mt=function(t,e,i){var n={build:function(t){var n=null,o={startPoint:t.startPoint,endPoint:t.endPoint,viaPoint:t.viaPoints,provideBoundingBox:t.provideBbox,avoidFeature:t.exclusions,expectedStartTime:t.expectedStartTime,distanceUnit:t.distanceUnit,graph:t.graph,provideGeometry:t.geometryInInstructions,routePreference:t.routePreference},s=new i(o),r=new e({srsName:t.srs,maximumResponses:t.maximumResponses});if(r.namespace=!0,r.setService(s),n=r.build(),"GET"==t.httpMethod){var a="qxml="+encodeURIComponent(n).replace(/\-/g,"%2D").replace(/\_/g,"%5F").replace(/\./g,"%2E").replace(/\!/g,"%21").replace(/\~/g,"%7E").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");n=a}return n}};return n}(i,H,St),wt=function(t){function e(t){if(!(this instanceof e))throw new TypeError("RouteParamREST constructor cannot be called as a function.");if(this.options=t||{},this.origin=this.options.startPoint.x+","+this.options.startPoint.y,this.destination=this.options.endPoint.x+","+this.options.endPoint.y,this.waypoints=this.options.viaPoints||null,this.startDateTime=this.options.expectedStartTime||null,this.graphName=this.options.graph,this.srs=this.options.srs,this.exclusions=this.options.exclusions,this.method="TIME",this.options.routePreference){var i=this.options.routePreference;switch(i){case"fastest":this.method="TIME";break;case"shortest":this.method="DISTANCE";break;default:this.method="TIME"}}this.format=this.options.geometryInInstructions?"STANDARDEXT":"STANDARD",this.tolerance=10,this.profileId=null,this.profileName=null}return e.CLASSNAME="RouteParamREST",e.prototype={constructor:e,getWaypoints:function(){if(this.waypoints){for(var t=[],e=0;e\n\n__ID__\t\n\t\t__X__\n\t\t__Y__\n\t\n\t__SRS__\n\t__GRAPHNAME__\n__PROFIL____EXCLUSIONS__\t__METHOD__\n__TIME____DISTANCE__\t__REVERSE__\n\t__SMOOTHING__\n\t__HOLES__\n',id:"\t__IDVALUE__\n",profil:"\t__PROFILID__\n\t__PROFILNAME__\n",exclusions:{container:"\t\n__EXCLUSIONFEATURE__\n\t\n",feature:"\t\t__EXCLUSIONVALUE__"},time:"\t\n",distance:"\t__DISTANCEVALUE__\n"},processRequestString:function(){var t="",e=0;switch(this.mode){case"GET":var n=new i(this.settings),o=n.getParams();for(e=0;e1){for(var o=[],s=0;sError: shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}},L.Draw={},L.Draw.Feature=L.Handler.extend({includes:L.Mixin.Events,initialize:function(t,e){this._map=t,this._container=t._container,this._overlayPane=t._panes.overlayPane,this._popupPane=t._panes.popupPane,e&&e.shapeOptions&&(e.shapeOptions=L.Util.extend({},this.options.shapeOptions,e.shapeOptions)),L.setOptions(this,e)},enable:function(){this._enabled||(L.Handler.prototype.enable.call(this),this.fire("enabled",{handler:this.type}),this._map.fire("draw:drawstart",{layerType:this.type}))},disable:function(){this._enabled&&(L.Handler.prototype.disable.call(this),this._map.fire("draw:drawstop",{layerType:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(L.DomUtil.disableTextSelection(),t.getContainer().focus(),this._tooltip=new L.Tooltip(this._map),L.DomEvent.on(this._container,"keyup",this._cancelDrawing,this))},removeHooks:function(){this._map&&(L.DomUtil.enableTextSelection(),this._tooltip.dispose(),this._tooltip=null,L.DomEvent.off(this._container,"keyup",this._cancelDrawing,this))},setOptions:function(t){L.setOptions(this,t)},_fireCreatedEvent:function(t){this._map.fire("draw:created",{layer:t,layerType:this.type})},_cancelDrawing:function(t){27===t.keyCode&&this.disable()}}),L.Draw.Polyline=L.Draw.Feature.extend({statics:{TYPE:"polyline"},Poly:L.Polyline,options:{allowIntersection:!0,repeatMode:!1,drawError:{color:"#b00b00",timeout:2500},icon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"}),touchIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-touch-icon"}),guidelineDistance:20,maxGuideLineLength:4e3,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!1,clickable:!0},metric:!0,feet:!0,showLength:!0,zIndexOffset:2e3},initialize:function(t,e){L.Browser.touch&&(this.options.icon=this.options.touchIcon),this.options.drawError.message=L.drawLocal.draw.handlers.polyline.error,e&&e.drawError&&(e.drawError=L.Util.extend({},this.options.drawError,e.drawError)),this.type=L.Draw.Polyline.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._markers=[],this._markerGroup=new L.LayerGroup,this._map.addLayer(this._markerGroup),this._poly=new L.Polyline([],this.options.shapeOptions),this._tooltip.updateContent(this._getTooltipText()),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("mousedown",this._onMouseDown,this).on("mouseout",this._onMouseOut,this).on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).addTo(this._map),this._map.on("mouseup",this._onMouseUp,this).on("mousemove",this._onMouseMove,this).on("zoomlevelschange",this._onZoomEnd,this).on("click",this._onTouch,this).on("zoomend",this._onZoomEnd,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._clearHideErrorTimeout(),this._cleanUpShape(),this._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers,this._map.removeLayer(this._poly),delete this._poly,this._mouseMarker.off("mousedown",this._onMouseDown,this).off("mouseout",this._onMouseOut,this).off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._clearGuides(),this._map.off("mouseup",this._onMouseUp,this).off("mousemove",this._onMouseMove,this).off("mouseup",this._onMouseUp,this).off("zoomend",this._onZoomEnd,this).off("click",this._onTouch,this)},deleteLastVertex:function(){if(!(this._markers.length<=1)){var t=this._markers.pop(),e=this._poly,i=this._poly.spliceLatLngs(e.getLatLngs().length-1,1)[0];this._markerGroup.removeLayer(t),e.getLatLngs().length<2&&this._map.removeLayer(e),this._vertexChanged(i,!1)}},addVertex:function(t){var e=this._markers.length;return e>0&&!this.options.allowIntersection&&this._poly.newLatLngIntersects(t)?void this._showErrorTooltip():(this._errorShown&&this._hideErrorTooltip(),this._markers.push(this._createMarker(t)),this._poly.addLatLng(t),2===this._poly.getLatLngs().length&&this._map.addLayer(this._poly),void this._vertexChanged(t,!0))},completeShape:function(){this._markers.length<=1||(this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable())},_finishShape:function(){var t=this._poly.newLatLngIntersects(this._poly.getLatLngs()[0],!0);return!this.options.allowIntersection&&t||!this._shapeIsValid()?void this._showErrorTooltip():(this._fireCreatedEvent(),this.disable(),void(this.options.repeatMode&&this.enable()))},_shapeIsValid:function(){return!0},_onZoomEnd:function(){this._updateGuide()},_onMouseMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent),i=this._map.layerPointToLatLng(e);this._currentLatLng=i,this._updateTooltip(i),this._updateGuide(e),this._mouseMarker.setLatLng(i),L.DomEvent.preventDefault(t.originalEvent)},_vertexChanged:function(t,e){this._map.fire("draw:drawvertex",{layers:this._markerGroup}),this._updateFinishHandler(),this._updateRunningMeasure(t,e),this._clearGuides(),this._updateTooltip()},_onMouseDown:function(t){var e=t.originalEvent;this._mouseDownOrigin=L.point(e.clientX,e.clientY)},_onMouseUp:function(e){if(this._mouseDownOrigin){var i=L.point(e.originalEvent.clientX,e.originalEvent.clientY).distanceTo(this._mouseDownOrigin);Math.abs(i)<9*(t.devicePixelRatio||1)&&this.addVertex(e.latlng)}this._mouseDownOrigin=null},_onTouch:function(t){L.Browser.touch&&(this._onMouseDown(t),this._onMouseUp(t))},_onMouseOut:function(){this._tooltip&&this._tooltip._onMouseOut.call(this._tooltip)},_updateFinishHandler:function(){var t=this._markers.length;t>1&&this._markers[t-1].on("click",this._finishShape,this),t>2&&this._markers[t-2].off("click",this._finishShape,this)},_createMarker:function(t){var e=new L.Marker(t,{icon:this.options.icon,zIndexOffset:2*this.options.zIndexOffset});return this._markerGroup.addLayer(e),e},_updateGuide:function(t){var e=this._markers.length;e>0&&(t=t||this._map.latLngToLayerPoint(this._currentLatLng),this._clearGuides(),this._drawGuide(this._map.latLngToLayerPoint(this._markers[e-1].getLatLng()),t))},_updateTooltip:function(t){var e=this._getTooltipText();t&&this._tooltip.updatePosition(t),this._errorShown||this._tooltip.updateContent(e)},_drawGuide:function(t,e){var i,n,o,s=Math.floor(Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))),r=this.options.guidelineDistance,a=this.options.maxGuideLineLength,l=s>a?s-a:r;for(this._guidesContainer||(this._guidesContainer=L.DomUtil.create("div","leaflet-draw-guides",this._overlayPane));s>l;l+=this.options.guidelineDistance)i=l/s,n={x:Math.floor(t.x*(1-i)+i*e.x),y:Math.floor(t.y*(1-i)+i*e.y)},o=L.DomUtil.create("div","leaflet-draw-guide-dash",this._guidesContainer),o.style.backgroundColor=this._errorShown?this.options.drawError.color:this.options.shapeOptions.color,L.DomUtil.setPosition(o,n)},_updateGuideColor:function(t){if(this._guidesContainer)for(var e=0,i=this._guidesContainer.childNodes.length;i>e;e++)this._guidesContainer.childNodes[e].style.backgroundColor=t},_clearGuides:function(){if(this._guidesContainer)for(;this._guidesContainer.firstChild;)this._guidesContainer.removeChild(this._guidesContainer.firstChild)},_getTooltipText:function(){var t,e,i=this.options.showLength;return 0===this._markers.length?t={text:L.drawLocal.draw.handlers.polyline.tooltip.start}:(e=i?this._getMeasurementString():"",t=1===this._markers.length?{text:L.drawLocal.draw.handlers.polyline.tooltip.cont,subtext:e}:{text:L.drawLocal.draw.handlers.polyline.tooltip.end,subtext:e}),t},_updateRunningMeasure:function(t,e){var i,n,o=this._markers.length;1===this._markers.length?this._measurementRunningTotal=0:(i=o-(e?2:1),n=t.distanceTo(this._markers[i].getLatLng()),this._measurementRunningTotal+=n*(e?1:-1))},_getMeasurementString:function(){var t,e=this._currentLatLng,i=this._markers[this._markers.length-1].getLatLng();return t=this._measurementRunningTotal+e.distanceTo(i),L.GeometryUtil.readableDistance(t,this.options.metric,this.options.feet)},_showErrorTooltip:function(){this._errorShown=!0,this._tooltip.showAsError().updateContent({text:this.options.drawError.message}),this._updateGuideColor(this.options.drawError.color),this._poly.setStyle({color:this.options.drawError.color}),this._clearHideErrorTimeout(),this._hideErrorTimeout=setTimeout(L.Util.bind(this._hideErrorTooltip,this),this.options.drawError.timeout)},_hideErrorTooltip:function(){this._errorShown=!1,this._clearHideErrorTimeout(),this._tooltip.removeError().updateContent(this._getTooltipText()),this._updateGuideColor(this.options.shapeOptions.color),this._poly.setStyle({color:this.options.shapeOptions.color})},_clearHideErrorTimeout:function(){this._hideErrorTimeout&&(clearTimeout(this._hideErrorTimeout),this._hideErrorTimeout=null)},_cleanUpShape:function(){this._markers.length>1&&this._markers[this._markers.length-1].off("click",this._finishShape,this)},_fireCreatedEvent:function(){var t=new this.Poly(this._poly.getLatLngs(),this.options.shapeOptions);L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Draw.Polygon=L.Draw.Polyline.extend({statics:{TYPE:"polygon"},Poly:L.Polygon,options:{showArea:!1,shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0}},initialize:function(t,e){L.Draw.Polyline.prototype.initialize.call(this,t,e),this.type=L.Draw.Polygon.TYPE},_updateFinishHandler:function(){var t=this._markers.length;1===t&&this._markers[0].on("click",this._finishShape,this),t>2&&(this._markers[t-1].on("dblclick",this._finishShape,this),t>3&&this._markers[t-2].off("dblclick",this._finishShape,this))},_getTooltipText:function(){var t,e;return 0===this._markers.length?t=L.drawLocal.draw.handlers.polygon.tooltip.start:this._markers.length<3?t=L.drawLocal.draw.handlers.polygon.tooltip.cont:(t=L.drawLocal.draw.handlers.polygon.tooltip.end,e=this._getMeasurementString()),{text:t,subtext:e}},_getMeasurementString:function(){var t=this._area;return t?L.GeometryUtil.readableArea(t,this.options.metric):null},_shapeIsValid:function(){return this._markers.length>=3},_vertexChanged:function(t,e){var i;!this.options.allowIntersection&&this.options.showArea&&(i=this._poly.getLatLngs(),this._area=L.GeometryUtil.geodesicArea(i)),L.Draw.Polyline.prototype._vertexChanged.call(this,t,e)},_cleanUpShape:function(){var t=this._markers.length;t>0&&(this._markers[0].off("click",this._finishShape,this),t>2&&this._markers[t-1].off("dblclick",this._finishShape,this))}}),L.SimpleShape={},L.Draw.SimpleShape=L.Draw.Feature.extend({options:{repeatMode:!1},initialize:function(t,e){this._endLabelText=L.drawLocal.draw.handlers.simpleshape.tooltip.end,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._mapDraggable=this._map.dragging.enabled(),this._mapDraggable&&this._map.dragging.disable(),this._container.style.cursor="crosshair",this._tooltip.updateContent({text:this._initialLabelText}),this._map.on("mousedown",this._onMouseDown,this).on("mousemove",this._onMouseMove,this).on("touchstart",this._onMouseDown,this).on("touchmove",this._onMouseMove,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._mapDraggable&&this._map.dragging.enable(),this._container.style.cursor="",this._map.off("mousedown",this._onMouseDown,this).off("mousemove",this._onMouseMove,this).off("touchstart",this._onMouseDown,this).off("touchmove",this._onMouseMove,this),L.DomEvent.off(e,"mouseup",this._onMouseUp,this),L.DomEvent.off(e,"touchend",this._onMouseUp,this),this._shape&&(this._map.removeLayer(this._shape),delete this._shape)),this._isDrawing=!1},_getTooltipText:function(){return{text:this._endLabelText}},_onMouseDown:function(t){this._isDrawing=!0,this._startLatLng=t.latlng,L.DomEvent.on(e,"mouseup",this._onMouseUp,this).on(e,"touchend",this._onMouseUp,this).preventDefault(t.originalEvent)},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._isDrawing&&(this._tooltip.updateContent(this._getTooltipText()),this._drawShape(e))},_onMouseUp:function(){this._shape&&this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()}}),L.Draw.Rectangle=L.Draw.SimpleShape.extend({statics:{TYPE:"rectangle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},metric:!0},initialize:function(t,e){this.type=L.Draw.Rectangle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.rectangle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setBounds(new L.LatLngBounds(this._startLatLng,t)):(this._shape=new L.Rectangle(new L.LatLngBounds(this._startLatLng,t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Rectangle(this._shape.getBounds(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_getTooltipText:function(){var t,e,i,n=L.Draw.SimpleShape.prototype._getTooltipText.call(this),o=this._shape;return o&&(t=this._shape.getLatLngs(),e=L.GeometryUtil.geodesicArea(t),i=L.GeometryUtil.readableArea(e,this.options.metric)),{text:n.text,subtext:i}}}),L.Draw.Circle=L.Draw.SimpleShape.extend({statics:{TYPE:"circle"},options:{shapeOptions:{stroke:!0,color:"#f06eaa",weight:4,opacity:.5,fill:!0,fillColor:null,fillOpacity:.2,clickable:!0},showRadius:!0,metric:!0,feet:!0},initialize:function(t,e){this.type=L.Draw.Circle.TYPE,this._initialLabelText=L.drawLocal.draw.handlers.circle.tooltip.start,L.Draw.SimpleShape.prototype.initialize.call(this,t,e)},_drawShape:function(t){this._shape?this._shape.setRadius(this._startLatLng.distanceTo(t)):(this._shape=new L.Circle(this._startLatLng,this._startLatLng.distanceTo(t),this.options.shapeOptions),this._map.addLayer(this._shape))},_fireCreatedEvent:function(){var t=new L.Circle(this._startLatLng,this._shape.getRadius(),this.options.shapeOptions);L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this,t)},_onMouseMove:function(t){var e,i=t.latlng,n=this.options.showRadius,o=this.options.metric;this._tooltip.updatePosition(i),this._isDrawing&&(this._drawShape(i),e=this._shape.getRadius().toFixed(1),this._tooltip.updateContent({text:this._endLabelText,subtext:n?L.drawLocal.draw.handlers.circle.radius+": "+L.GeometryUtil.readableDistance(e,o,this.options.feet):""}))}}),L.Draw.Marker=L.Draw.Feature.extend({statics:{TYPE:"marker"},options:{icon:new L.Icon.Default,repeatMode:!1,zIndexOffset:2e3},initialize:function(t,e){this.type=L.Draw.Marker.TYPE,L.Draw.Feature.prototype.initialize.call(this,t,e)},addHooks:function(){L.Draw.Feature.prototype.addHooks.call(this),this._map&&(this._tooltip.updateContent({text:L.drawLocal.draw.handlers.marker.tooltip.start}),this._mouseMarker||(this._mouseMarker=L.marker(this._map.getCenter(),{icon:L.divIcon({className:"leaflet-mouse-marker",iconAnchor:[20,20],iconSize:[40,40]}),opacity:0,zIndexOffset:this.options.zIndexOffset})),this._mouseMarker.on("click",this._onClick,this).addTo(this._map),this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onTouch,this))},removeHooks:function(){L.Draw.Feature.prototype.removeHooks.call(this),this._map&&(this._marker&&(this._marker.off("click",this._onClick,this),this._map.off("click",this._onClick,this).off("click",this._onTouch,this).removeLayer(this._marker),delete this._marker),this._mouseMarker.off("click",this._onClick,this),this._map.removeLayer(this._mouseMarker),delete this._mouseMarker,this._map.off("mousemove",this._onMouseMove,this))},_onMouseMove:function(t){var e=t.latlng;this._tooltip.updatePosition(e),this._mouseMarker.setLatLng(e),this._marker?(e=this._mouseMarker.getLatLng(),this._marker.setLatLng(e)):(this._marker=new L.Marker(e,{icon:this.options.icon,zIndexOffset:this.options.zIndexOffset}),this._marker.on("click",this._onClick,this),this._map.on("click",this._onClick,this).addLayer(this._marker))},_onClick:function(){this._fireCreatedEvent(),this.disable(),this.options.repeatMode&&this.enable()},_onTouch:function(t){this._onMouseMove(t),this._onClick()},_fireCreatedEvent:function(){var t=new L.Marker.Touch(this._marker.getLatLng(),{icon:this.options.icon});L.Draw.Feature.prototype._fireCreatedEvent.call(this,t)}}),L.Edit=L.Edit||{},L.Edit.Marker=L.Handler.extend({initialize:function(t,e){this._marker=t,L.setOptions(this,e)},addHooks:function(){var t=this._marker;t.dragging.enable(),t.on("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},removeHooks:function(){var t=this._marker;t.dragging.disable(),t.off("dragend",this._onDragEnd,t),this._toggleMarkerHighlight()},_onDragEnd:function(t){var e=t.target;e.edited=!0},_toggleMarkerHighlight:function(){var t=this._marker._icon;t&&(t.style.display="none",L.DomUtil.hasClass(t,"leaflet-edit-marker-selected")?(L.DomUtil.removeClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,-4)):(L.DomUtil.addClass(t,"leaflet-edit-marker-selected"),this._offsetMarker(t,4)),t.style.display="")},_offsetMarker:function(t,e){var i=parseInt(t.style.marginTop,10)-e,n=parseInt(t.style.marginLeft,10)-e;t.style.marginTop=i+"px",t.style.marginLeft=n+"px"}}),L.Marker.addInitHook(function(){L.Edit.Marker&&(this.editing=new L.Edit.Marker(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Poly=L.Handler.extend({options:{},initialize:function(t,e){this.latlngs=[t._latlngs],t._holes&&(this.latlngs=this.latlngs.concat(t._holes)),this._verticesHandlers=[];for(var i=0;it;t++)n=this._createMarker(o[t],t),n.on("click",this._onMarkerClick,this),this._markers.push(n);var s,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||L.Polygon&&this._poly instanceof L.Polygon)&&(s=this._markers[e],r=this._markers[t],this._createMiddleMarker(s,r),this._updatePrevNext(s,r))},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._fireEdit,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._fireEdit,this).on("MSPointerUp",this._fireEdit,this),this._markerGroup.addLayer(i),i},_onMarkerDragStart:function(){this._poly.fire("editstart")},_spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._poly._convertLatLngs(this._latlngs,!0),this._poly.redraw(),t},_removeMarker:function(t){var e=t._index;this._markerGroup.removeLayer(t),this._markers.splice(e,1),this._spliceLatLngs(e,1),this._updateIndexes(e,-1),t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._fireEdit,this).off("touchmove",this._onMarkerDrag,this).off("touchend",this._fireEdit,this).off("click",this._onMarkerClick,this)},_fireEdit:function(){this._poly.edited=!0,this._poly.fire("edit"),this._poly._map.fire("draw:editvertex",{layers:this._markerGroup})},_onMarkerDrag:function(t){var e=t.target;L.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw(),this._poly.fire("editdrag")},_onMarkerClick:function(t){var e=L.Polygon&&this._poly instanceof L.Polygon?4:3,i=t.target;this._latlngs.lengtht&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),r=this._createMarker(s);r.setOpacity(.6),t._middleRight=e._middleLeft=r,n=function(){var n=e._index;r._index=n,r.off("click",i,this).on("click",this._onMarkerClick,this),s.lat=r.getLatLng().lat,s.lng=r.getLatLng().lng,this._spliceLatLngs(n,0,s),this._markers.splice(n,0,r),r.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,r),this._updatePrevNext(r,e),this._poly.fire("editstart")},o=function(){r.off("dragstart",n,this),r.off("dragend",o,this),r.off("touchmove",n,this),this._createMiddleMarker(t,r),this._createMiddleMarker(r,e)},i=function(){n.call(this),o.call(this),this._fireEdit()},r.on("click",i,this).on("dragstart",n,this).on("dragend",o,this).on("touchmove",n,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.project(t.getLatLng()),o=i.project(e.getLatLng());return i.unproject(n._add(o)._divideBy(2))}}),L.Polyline.addInitHook(function(){this.editing||(L.Edit.Poly&&(this.editing=new L.Edit.Poly(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()}))}),L.Edit=L.Edit||{},L.Edit.SimpleShape=L.Handler.extend({options:{moveIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move"}),resizeIcon:new L.DivIcon({iconSize:new L.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize"}),touchMoveIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-move leaflet-touch-icon"}),touchResizeIcon:new L.DivIcon({iconSize:new L.Point(20,20),className:"leaflet-div-icon leaflet-editing-icon leaflet-edit-resize leaflet-touch-icon"})},initialize:function(t,e){L.Browser.touch&&(this.options.moveIcon=this.options.touchMoveIcon,this.options.resizeIcon=this.options.touchResizeIcon),this._shape=t,L.Util.setOptions(this,e)},addHooks:function(){var t=this._shape;this._shape._map&&(this._map=this._shape._map,t.setStyle(t.options.editing),t._map&&(this._map=t._map,this._markerGroup||this._initMarkers(),this._map.addLayer(this._markerGroup)))},removeHooks:function(){var t=this._shape;if(t.setStyle(t.options.original),t._map){ +this._unbindMarker(this._moveMarker);for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._unbindMarker(this._resizeMarkers[e]);this._resizeMarkers=null,this._map.removeLayer(this._markerGroup),delete this._markerGroup}this._map=null},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new L.LayerGroup),this._createMoveMarker(),this._createResizeMarker()},_createMoveMarker:function(){},_createResizeMarker:function(){},_createMarker:function(t,e){var i=new L.Marker.Touch(t,{draggable:!0,icon:e,zIndexOffset:10});return this._bindMarker(i),this._markerGroup.addLayer(i),i},_bindMarker:function(t){t.on("dragstart",this._onMarkerDragStart,this).on("drag",this._onMarkerDrag,this).on("dragend",this._onMarkerDragEnd,this).on("touchstart",this._onTouchStart,this).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onTouchEnd,this).on("MSPointerUp",this._onTouchEnd,this)},_unbindMarker:function(t){t.off("dragstart",this._onMarkerDragStart,this).off("drag",this._onMarkerDrag,this).off("dragend",this._onMarkerDragEnd,this).off("touchstart",this._onTouchStart,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onTouchEnd,this).off("MSPointerUp",this._onTouchEnd,this)},_onMarkerDragStart:function(t){var e=t.target;e.setOpacity(0),this._shape.fire("editstart")},_fireEdit:function(){this._shape.edited=!0,this._shape.fire("edit")},_onMarkerDrag:function(t){var e=t.target,i=e.getLatLng();e===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),this._shape.fire("editdrag")},_onMarkerDragEnd:function(t){var e=t.target;e.setOpacity(1),this._fireEdit()},_onTouchStart:function(t){if(L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t),"function"==typeof this._getCorners){var e=this._getCorners(),i=t.target,n=i._cornerIndex;i.setOpacity(0),this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)}this._shape.fire("editstart")},_onTouchMove:function(t){var e=this._map.mouseEventToLayerPoint(t.originalEvent.touches[0]),i=this._map.layerPointToLatLng(e),n=t.target;return n===this._moveMarker?this._move(i):this._resize(i),this._shape.redraw(),!1},_onTouchEnd:function(t){var e=t.target;e.setOpacity(1),this.updateMarkers(),this._fireEdit()},_move:function(){},_resize:function(){}}),L.Edit=L.Edit||{},L.Edit.Rectangle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getBounds(),e=t.getCenter();this._moveMarker=this._createMarker(e,this.options.moveIcon)},_createResizeMarker:function(){var t=this._getCorners();this._resizeMarkers=[];for(var e=0,i=t.length;i>e;e++)this._resizeMarkers.push(this._createMarker(t[e],this.options.resizeIcon)),this._resizeMarkers[e]._cornerIndex=e},_onMarkerDragStart:function(t){L.Edit.SimpleShape.prototype._onMarkerDragStart.call(this,t);var e=this._getCorners(),i=t.target,n=i._cornerIndex;this._oppositeCorner=e[(n+2)%4],this._toggleCornerMarkers(0,n)},_onMarkerDragEnd:function(t){var e,i,n=t.target;n===this._moveMarker&&(e=this._shape.getBounds(),i=e.getCenter(),n.setLatLng(i)),this._toggleCornerMarkers(1),this._repositionCornerMarkers(),L.Edit.SimpleShape.prototype._onMarkerDragEnd.call(this,t)},_move:function(t){for(var e,i=this._shape.getLatLngs(),n=this._shape.getBounds(),o=n.getCenter(),s=[],r=0,a=i.length;a>r;r++)e=[i[r].lat-o.lat,i[r].lng-o.lng],s.push([t.lat+e[0],t.lng+e[1]]);this._shape.setLatLngs(s),this._repositionCornerMarkers()},_resize:function(t){var e;this._shape.setBounds(L.latLngBounds(t,this._oppositeCorner)),e=this._shape.getBounds(),this._moveMarker.setLatLng(e.getCenter())},_getCorners:function(){var t=this._shape.getBounds(),e=t.getNorthWest(),i=t.getNorthEast(),n=t.getSouthEast(),o=t.getSouthWest();return[e,i,n,o]},_toggleCornerMarkers:function(t){for(var e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setOpacity(t)},_repositionCornerMarkers:function(){for(var t=this._getCorners(),e=0,i=this._resizeMarkers.length;i>e;e++)this._resizeMarkers[e].setLatLng(t[e])}}),L.Rectangle.addInitHook(function(){L.Edit.Rectangle&&(this.editing=new L.Edit.Rectangle(this),this.options.editable&&this.editing.enable())}),L.Edit=L.Edit||{},L.Edit.Circle=L.Edit.SimpleShape.extend({_createMoveMarker:function(){var t=this._shape.getLatLng();this._moveMarker=this._createMarker(t,this.options.moveIcon)},_createResizeMarker:function(){var t=this._shape.getLatLng(),e=this._getResizeMarkerPoint(t);this._resizeMarkers=[],this._resizeMarkers.push(this._createMarker(e,this.options.resizeIcon))},_getResizeMarkerPoint:function(t){var e=this._shape._radius*Math.cos(Math.PI/4),i=this._map.project(t);return this._map.unproject([i.x+e,i.y-e])},_move:function(t){var e=this._getResizeMarkerPoint(t);this._resizeMarkers[0].setLatLng(e),this._shape.setLatLng(t)},_resize:function(t){var e=this._moveMarker.getLatLng(),i=e.distanceTo(t);this._shape.setRadius(i)}}),L.Circle.addInitHook(function(){L.Edit.Circle&&(this.editing=new L.Edit.Circle(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),L.Map.mergeOptions({touchExtend:!0}),L.Map.TouchExtend=L.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){L.DomEvent.on(this._container,"touchstart",this._onTouchStart,this),L.DomEvent.on(this._container,"touchend",this._onTouchEnd,this),L.DomEvent.on(this._container,"touchmove",this._onTouchMove,this),this._detectIE()?(L.DomEvent.on(this._container,"MSPointerDown",this._onTouchStart,this),L.DomEvent.on(this._container,"MSPointerUp",this._onTouchEnd,this),L.DomEvent.on(this._container,"MSPointerMove",this._onTouchMove,this),L.DomEvent.on(this._container,"MSPointerCancel",this._onTouchCancel,this)):(L.DomEvent.on(this._container,"touchcancel",this._onTouchCancel,this),L.DomEvent.on(this._container,"touchleave",this._onTouchLeave,this))},removeHooks:function(){L.DomEvent.off(this._container,"touchstart",this._onTouchStart),L.DomEvent.off(this._container,"touchend",this._onTouchEnd),L.DomEvent.off(this._container,"touchmove",this._onTouchMove),this._detectIE()?(L.DomEvent.off(this._container,"MSPointerDowm",this._onTouchStart),L.DomEvent.off(this._container,"MSPointerUp",this._onTouchEnd),L.DomEvent.off(this._container,"MSPointerMove",this._onTouchMove),L.DomEvent.off(this._container,"MSPointerCancel",this._onTouchCancel)):(L.DomEvent.off(this._container,"touchcancel",this._onTouchCancel),L.DomEvent.off(this._container,"touchleave",this._onTouchLeave))},_touchEvent:function(t,e){var i={};if("undefined"!=typeof t.touches){if(!t.touches.length)return;i=t.touches[0]}else{if("touch"!==t.pointerType)return;if(i=t,!this._filterClick(t))return}var n=this._map.mouseEventToContainerPoint(i),o=this._map.mouseEventToLayerPoint(i),s=this._map.layerPointToLatLng(o);this._map.fire(e,{latlng:s,layerPoint:o,containerPoint:n,pageX:i.pageX,pageY:i.pageY,originalEvent:t})},_filterClick:function(t){var e=t.timeStamp||t.originalEvent.timeStamp,i=L.DomEvent._lastClick&&e-L.DomEvent._lastClick;return i&&i>100&&500>i||t.target._simulatedClick&&!t._simulated?(L.DomEvent.stop(t),!1):(L.DomEvent._lastClick=e,!0)},_onTouchStart:function(t){if(this._map._loaded){var e="touchstart";this._touchEvent(t,e)}},_onTouchEnd:function(t){if(this._map._loaded){var e="touchend";this._touchEvent(t,e)}},_onTouchCancel:function(t){if(this._map._loaded){var e="touchcancel";this._detectIE()&&(e="pointercancel"),this._touchEvent(t,e)}},_onTouchLeave:function(t){if(this._map._loaded){var e="touchleave";this._touchEvent(t,e)}},_onTouchMove:function(t){if(this._map._loaded){var e="touchmove";this._touchEvent(t,e)}},_detectIE:function(){var e=t.navigator.userAgent,i=e.indexOf("MSIE ");if(i>0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.Map.addInitHook("addHandler","touchExtend",L.Map.TouchExtend),L.Marker.Touch=L.Marker.extend({_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu","touchstart","touchend","touchmove"];this._detectIE?e.concat(["MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel"]):e.concat(["touchcancel"]),L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this),L.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i0)return parseInt(e.substring(i+5,e.indexOf(".",i)),10);var n=e.indexOf("Trident/");if(n>0){var o=e.indexOf("rv:");return parseInt(e.substring(o+3,e.indexOf(".",o)),10)}var s=e.indexOf("Edge/");return s>0&&parseInt(e.substring(s+5,e.indexOf(".",s)),10)}}),L.LatLngUtil={cloneLatLngs:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(this.cloneLatLng(t[i]));return e},cloneLatLng:function(t){return L.latLng(t.lat,t.lng)}},L.GeometryUtil=L.extend(L.GeometryUtil||{},{geodesicArea:function(t){var e,i,n=t.length,o=0,s=L.LatLng.DEG_TO_RAD;if(n>2){for(var r=0;n>r;r++)e=t[r],i=t[(r+1)%n],o+=(i.lng-e.lng)*s*(2+Math.sin(e.lat*s)+Math.sin(i.lat*s));o=6378137*o*6378137/2}return Math.abs(o)},readableArea:function(t,e){var i;return e?i=t>=1e4?(1e-4*t).toFixed(2)+" ha":t.toFixed(2)+" m²":(t/=.836127,i=t>=3097600?(t/3097600).toFixed(2)+" mi²":t>=4840?(t/4840).toFixed(2)+" acres":Math.ceil(t)+" yd²"),i},readableDistance:function(t,e,i){var n;if(e)n=t>1e3?(t/1e3).toFixed(2)+" km":Math.ceil(t)+" m";else if(t*=1.09361,t>1760)n=(t/1760).toFixed(2)+" miles";else{var o=" yd";i&&(t=3*t,o=" ft"),n=Math.ceil(t)+o}return n}}),L.Util.extend(L.LineUtil,{segmentsIntersect:function(t,e,i,n){return this._checkCounterclockwise(t,i,n)!==this._checkCounterclockwise(e,i,n)&&this._checkCounterclockwise(t,e,i)!==this._checkCounterclockwise(t,e,n)},_checkCounterclockwise:function(t,e,i){return(i.y-t.y)*(e.x-t.x)>(e.y-t.y)*(i.x-t.x)}}),L.Polyline.include({intersects:function(){var t,e,i,n=this._originalPoints,o=n?n.length:0;if(this._tooFewPointsForIntersection())return!1;for(t=o-1;t>=3;t--)if(e=n[t-1],i=n[t],this._lineSegmentsIntersectsRange(e,i,t-2))return!0;return!1},newLatLngIntersects:function(t,e){return!!this._map&&this.newPointIntersects(this._map.latLngToLayerPoint(t),e)},newPointIntersects:function(t,e){var i=this._originalPoints,n=i?i.length:0,o=i?i[n-1]:null,s=n-2;return!this._tooFewPointsForIntersection(1)&&this._lineSegmentsIntersectsRange(o,t,s,e?1:0)},_tooFewPointsForIntersection:function(t){var e=this._originalPoints,i=e?e.length:0;return i+=t||0,!this._originalPoints||3>=i},_lineSegmentsIntersectsRange:function(t,e,i,n){var o,s,r=this._originalPoints;n=n||0;for(var a=i;a>n;a--)if(o=r[a-1],s=r[a],L.LineUtil.segmentsIntersect(t,e,o,s))return!0;return!1}}),L.Polygon.include({intersects:function(){var t,e,i,n,o,s=this._originalPoints;return!this._tooFewPointsForIntersection()&&(!!(t=L.Polyline.prototype.intersects.call(this))||(e=s.length,i=s[0],n=s[e-1],o=e-2,this._lineSegmentsIntersectsRange(n,i,o,1)))}}),L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:!1},initialize:function(t){if(L.version<"0.7")throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/");L.Control.prototype.initialize.call(this,t);var e;this._toolbars={},L.DrawToolbar&&this.options.draw&&(e=new L.DrawToolbar(this.options.draw),this._toolbars[L.DrawToolbar.TYPE]=e,this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.EditToolbar&&this.options.edit&&(e=new L.EditToolbar(this.options.edit),this._toolbars[L.EditToolbar.TYPE]=e,this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)),L.toolbar=this},onAdd:function(t){var e,i=L.DomUtil.create("div","leaflet-draw"),n=!1,o="leaflet-draw-toolbar-top";for(var s in this._toolbars)this._toolbars.hasOwnProperty(s)&&(e=this._toolbars[s].addToolbar(t),e&&(n||(L.DomUtil.hasClass(e,o)||L.DomUtil.addClass(e.childNodes[0],o),n=!0),i.appendChild(e)));return i},onRemove:function(){for(var t in this._toolbars)this._toolbars.hasOwnProperty(t)&&this._toolbars[t].removeToolbar()},setDrawingOptions:function(t){for(var e in this._toolbars)this._toolbars[e]instanceof L.DrawToolbar&&this._toolbars[e].setOptions(t)},_toolbarEnabled:function(t){var e=t.target;for(var i in this._toolbars)this._toolbars[i]!==e&&this._toolbars[i].disable()}}),L.Map.mergeOptions({drawControlTooltips:!0,drawControl:!1}),L.Map.addInitHook(function(){this.options.drawControl&&(this.drawControl=new L.Control.Draw,this.addControl(this.drawControl))}),L.Toolbar=L.Class.extend({includes:[L.Mixin.Events],initialize:function(t){L.setOptions(this,t),this._modes={},this._actionButtons=[],this._activeMode=null},enabled:function(){return null!==this._activeMode},disable:function(){this.enabled()&&this._activeMode.handler.disable()},addToolbar:function(t){var e,i=L.DomUtil.create("div","leaflet-draw-section"),n=0,o=this._toolbarClass||"",s=this.getModeHandlers(t);for(this._toolbarContainer=L.DomUtil.create("div","leaflet-draw-toolbar leaflet-bar"),this._map=t,e=0;ee;e++)this._disposeButton(this._actionButtons[e].button,this._actionButtons[e].callback,this);this._actionButtons=[],this._actionsContainer=null},_initModeHandler:function(t,e,i,n,o){var s=t.type;this._modes[s]={},this._modes[s].handler=t,this._modes[s].button=this._createButton({type:s,title:o,className:n+"-"+s,container:e,callback:this._modes[s].handler.enable,context:this._modes[s].handler}),this._modes[s].buttonIndex=i,this._modes[s].handler.on("enabled",this._handlerActivated,this).on("disabled",this._handlerDeactivated,this)},_createButton:function(t){var e=L.DomUtil.create("a",t.className||"",t.container);return e.href="#",t.text&&(e.innerHTML=t.text),t.title&&(e.title=t.title),L.DomEvent.on(e,"click",L.DomEvent.stopPropagation).on(e,"mousedown",L.DomEvent.stopPropagation).on(e,"dblclick",L.DomEvent.stopPropagation).on(e,"click",L.DomEvent.preventDefault).on(e,"click",t.callback,t.context),e},_disposeButton:function(t,e){L.DomEvent.off(t,"click",L.DomEvent.stopPropagation).off(t,"mousedown",L.DomEvent.stopPropagation).off(t,"dblclick",L.DomEvent.stopPropagation).off(t,"click",L.DomEvent.preventDefault).off(t,"click",e)},_handlerActivated:function(t){this.disable(),this._activeMode=this._modes[t.handler],L.DomUtil.addClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._showActionsToolbar(),this.fire("enable")},_handlerDeactivated:function(){this._hideActionsToolbar(),L.DomUtil.removeClass(this._activeMode.button,"leaflet-draw-toolbar-button-enabled"),this._activeMode=null,this.fire("disable")},_createActions:function(t){var e,i,n,o,s=this._actionsContainer,r=this.getActions(t),a=r.length;for(i=0,n=this._actionButtons.length;n>i;i++)this._disposeButton(this._actionButtons[i].button,this._actionButtons[i].callback);for(this._actionButtons=[];s.firstChild;)s.removeChild(s.firstChild);for(var l=0;a>l;l++)"enabled"in r[l]&&!r[l].enabled||(e=L.DomUtil.create("li","",s),o=this._createButton({title:r[l].title,text:r[l].text,container:e,callback:r[l].callback,context:r[l].context}),this._actionButtons.push({button:o,callback:r[l].callback}))},_showActionsToolbar:function(){var t=this._activeMode.buttonIndex,e=this._lastButtonIndex,i=this._activeMode.button.offsetTop-1;this._createActions(this._activeMode.handler),this._actionsContainer.style.top=i+"px",0===t&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-top")),t===e&&(L.DomUtil.addClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.addClass(this._actionsContainer,"leaflet-draw-actions-bottom")),this._actionsContainer.style.display="block"},_hideActionsToolbar:function(){this._actionsContainer.style.display="none",L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-notop"),L.DomUtil.removeClass(this._toolbarContainer,"leaflet-draw-toolbar-nobottom"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-top"),L.DomUtil.removeClass(this._actionsContainer,"leaflet-draw-actions-bottom")}}),L.Tooltip=L.Class.extend({initialize:function(t){this._map=t,this._popupPane=t._panes.popupPane,this._container=t.options.drawControlTooltips?L.DomUtil.create("div","leaflet-draw-tooltip",this._popupPane):null,this._singleLineLabel=!1,this._map.on("mouseout",this._onMouseOut,this)},dispose:function(){this._map.off("mouseout",this._onMouseOut,this),this._container&&(this._popupPane.removeChild(this._container),this._container=null)},updateContent:function(t){return this._container?(t.subtext=t.subtext||"",0!==t.subtext.length||this._singleLineLabel?t.subtext.length>0&&this._singleLineLabel&&(L.DomUtil.removeClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!1):(L.DomUtil.addClass(this._container,"leaflet-draw-tooltip-single"),this._singleLineLabel=!0),this._container.innerHTML=(t.subtext.length>0?''+t.subtext+"
":"")+""+t.text+"",this):this},updatePosition:function(t){var e=this._map.latLngToLayerPoint(t),i=this._container;return this._container&&(i.style.visibility="inherit",L.DomUtil.setPosition(i,e)),this},showAsError:function(){return this._container&&L.DomUtil.addClass(this._container,"leaflet-error-draw-tooltip"),this},removeError:function(){return this._container&&L.DomUtil.removeClass(this._container,"leaflet-error-draw-tooltip"),this},_onMouseOut:function(){this._container&&(this._container.style.visibility="hidden")}}),L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(t){for(var e in this.options)this.options.hasOwnProperty(e)&&t[e]&&(t[e]=L.extend({},this.options[e],t[e]));this._toolbarClass="leaflet-draw-draw",L.Toolbar.prototype.initialize.call(this,t)},getModeHandlers:function(t){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(t,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(t,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(t,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(t,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(t,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(t){return[{enabled:t.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:t.completeShape,context:t},{enabled:t.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:t.deleteLastVertex,context:t},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(t){L.setOptions(this,t);for(var e in this._modes)this._modes.hasOwnProperty(e)&&t.hasOwnProperty(e)&&this._modes[e].handler.setOptions(t[e])}}),L.EditToolbar=L.Toolbar.extend({statics:{TYPE:"edit"},options:{edit:{selectedPathOptions:{dashArray:"10, 10",fill:!0,fillColor:"#fe57a1",fillOpacity:.1,maintainColor:!1}},remove:{},featureGroup:null},initialize:function(t){t.edit&&("undefined"==typeof t.edit.selectedPathOptions&&(t.edit.selectedPathOptions=this.options.edit.selectedPathOptions),t.edit.selectedPathOptions=L.extend({},this.options.edit.selectedPathOptions,t.edit.selectedPathOptions)),t.remove&&(t.remove=L.extend({},this.options.remove,t.remove)),this._toolbarClass="leaflet-draw-edit",L.Toolbar.prototype.initialize.call(this,t),this._selectedFeatureCount=0},getModeHandlers:function(t){var e=this.options.featureGroup;return[{enabled:this.options.edit,handler:new L.EditToolbar.Edit(t,{featureGroup:e,selectedPathOptions:this.options.edit.selectedPathOptions}),title:L.drawLocal.edit.toolbar.buttons.edit},{enabled:this.options.remove,handler:new L.EditToolbar.Delete(t,{featureGroup:e}),title:L.drawLocal.edit.toolbar.buttons.remove}]},getActions:function(){return[{title:L.drawLocal.edit.toolbar.actions.save.title,text:L.drawLocal.edit.toolbar.actions.save.text,callback:this._save,context:this},{title:L.drawLocal.edit.toolbar.actions.cancel.title,text:L.drawLocal.edit.toolbar.actions.cancel.text,callback:this.disable,context:this}]},addToolbar:function(t){var e=L.Toolbar.prototype.addToolbar.call(this,t);return this._checkDisabled(),this.options.featureGroup.on("layeradd layerremove",this._checkDisabled,this),e},removeToolbar:function(){this.options.featureGroup.off("layeradd layerremove",this._checkDisabled,this),L.Toolbar.prototype.removeToolbar.call(this)},disable:function(){this.enabled()&&(this._activeMode.handler.revertLayers(),L.Toolbar.prototype.disable.call(this))},_save:function(){this._activeMode.handler.save(),this._activeMode.handler.disable()},_checkDisabled:function(){var t,e=this.options.featureGroup,i=0!==e.getLayers().length;this.options.edit&&(t=this._modes[L.EditToolbar.Edit.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.edit:L.drawLocal.edit.toolbar.buttons.editDisabled)),this.options.remove&&(t=this._modes[L.EditToolbar.Delete.TYPE].button,i?L.DomUtil.removeClass(t,"leaflet-disabled"):L.DomUtil.addClass(t,"leaflet-disabled"),t.setAttribute("title",i?L.drawLocal.edit.toolbar.buttons.remove:L.drawLocal.edit.toolbar.buttons.removeDisabled))}}),L.EditToolbar.Edit=L.Handler.extend({statics:{TYPE:"edit"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.setOptions(this,e),this._featureGroup=e.featureGroup,!(this._featureGroup instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this._uneditedLayerProps={},this.type=L.EditToolbar.Edit.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:editstart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._featureGroup.on("layeradd",this._enableLayerEdit,this).on("layerremove",this._disableLayerEdit,this))},disable:function(){this._enabled&&(this._featureGroup.off("layeradd",this._enableLayerEdit,this).off("layerremove",this._disableLayerEdit,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:editstop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._featureGroup.eachLayer(this._enableLayerEdit,this),this._tooltip=new L.Tooltip(this._map),this._updateTooltip(),this._map.on("mousemove",this._onMouseMove,this).on("touchmove",this._onMouseMove,this).on("MSPointerMove",this._onMouseMove,this).on("click",this._editStyle,this).on("draw:editvertex",this._updateTooltip,this))},removeHooks:function(){this._map&&(this._featureGroup.eachLayer(this._disableLayerEdit,this),this._uneditedLayerProps={},this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this).off("touchmove",this._onMouseMove,this).off("MSPointerMove",this._onMouseMove,this))},revertLayers:function(){this._featureGroup.eachLayer(function(t){this._revertLayer(t)},this)},save:function(){var t=new L.LayerGroup;this._featureGroup.eachLayer(function(e){e.edited&&(t.addLayer(e),e.edited=!1)}),this._map.fire("draw:edited",{layers:t})},_backupLayer:function(t){var e=L.Util.stamp(t);this._uneditedLayerProps[e]||(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?this._uneditedLayerProps[e]={latlngs:L.LatLngUtil.cloneLatLngs(t.getLatLngs())}:t instanceof L.Circle?this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng()),radius:t.getRadius()}:t instanceof L.Marker&&(this._uneditedLayerProps[e]={latlng:L.LatLngUtil.cloneLatLng(t.getLatLng())}))},_getTooltipText:function(){return{text:L.drawLocal.edit.handlers.edit.tooltip.text,subtext:L.drawLocal.edit.handlers.edit.tooltip.subtext}},_updateTooltip:function(){this._tooltip.updateContent(this._getTooltipText())},_revertLayer:function(t){var e=L.Util.stamp(t);t.edited=!1,this._uneditedLayerProps.hasOwnProperty(e)&&(t instanceof L.Polyline||t instanceof L.Polygon||t instanceof L.Rectangle?t.setLatLngs(this._uneditedLayerProps[e].latlngs):t instanceof L.Circle?(t.setLatLng(this._uneditedLayerProps[e].latlng),t.setRadius(this._uneditedLayerProps[e].radius)):t instanceof L.Marker&&t.setLatLng(this._uneditedLayerProps[e].latlng),t.fire("revert-edited",{layer:t}))},_enableLayerEdit:function(t){var e,i=t.layer||t.target||t;this._backupLayer(i),this.options.selectedPathOptions&&(e=L.Util.extend({},this.options.selectedPathOptions),e.maintainColor&&(e.color=i.options.color,e.fillColor=i.options.fillColor),i.options.original=L.extend({},i.options),i.options.editing=e),this.isMarker?(i.dragging.enable(),i.on("dragend",this._onMarkerDragEnd).on("touchmove",this._onTouchMove,this).on("MSPointerMove",this._onTouchMove,this).on("touchend",this._onMarkerDragEnd,this).on("MSPointerUp",this._onMarkerDragEnd,this)):i.editing.enable()},_disableLayerEdit:function(t){var e=t.layer||t.target||t;e.edited=!1,e.editing.disable(),delete e.options.editing,delete e.options.original,this._selectedPathOptions&&(e instanceof L.Marker?this._toggleMarkerHighlight(e):(e.setStyle(e.options.previousOptions),delete e.options.previousOptions)),e instanceof L.Marker?(e.dragging.disable(),e.off("dragend",this._onMarkerDragEnd,this).off("touchmove",this._onTouchMove,this).off("MSPointerMove",this._onTouchMove,this).off("touchend",this._onMarkerDragEnd,this).off("MSPointerUp",this._onMarkerDragEnd,this)):e.editing.disable()},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_onTouchMove:function(t){var e=t.originalEvent.changedTouches[0],i=this._map.mouseEventToLayerPoint(e),n=this._map.layerPointToLatLng(i);t.target.setLatLng(n)},_hasAvailableLayers:function(){return 0!==this._featureGroup.getLayers().length}}),L.EditToolbar.Delete=L.Handler.extend({statics:{TYPE:"remove"},includes:L.Mixin.Events,initialize:function(t,e){if(L.Handler.prototype.initialize.call(this,t),L.Util.setOptions(this,e),this._deletableLayers=this.options.featureGroup,!(this._deletableLayers instanceof L.FeatureGroup))throw new Error("options.featureGroup must be a L.FeatureGroup");this.type=L.EditToolbar.Delete.TYPE},enable:function(){!this._enabled&&this._hasAvailableLayers()&&(this.fire("enabled",{handler:this.type}),this._map.fire("draw:deletestart",{handler:this.type}),L.Handler.prototype.enable.call(this),this._deletableLayers.on("layeradd",this._enableLayerDelete,this).on("layerremove",this._disableLayerDelete,this))},disable:function(){this._enabled&&(this._deletableLayers.off("layeradd",this._enableLayerDelete,this).off("layerremove",this._disableLayerDelete,this),L.Handler.prototype.disable.call(this),this._map.fire("draw:deletestop",{handler:this.type}),this.fire("disabled",{handler:this.type}))},addHooks:function(){var t=this._map;t&&(t.getContainer().focus(),this._deletableLayers.eachLayer(this._enableLayerDelete,this),this._deletedLayers=new L.LayerGroup,this._tooltip=new L.Tooltip(this._map),this._tooltip.updateContent({text:L.drawLocal.edit.handlers.remove.tooltip.text}),this._map.on("mousemove",this._onMouseMove,this))},removeHooks:function(){this._map&&(this._deletableLayers.eachLayer(this._disableLayerDelete,this),this._deletedLayers=null,this._tooltip.dispose(),this._tooltip=null,this._map.off("mousemove",this._onMouseMove,this))},revertLayers:function(){this._deletedLayers.eachLayer(function(t){this._deletableLayers.addLayer(t),t.fire("revert-deleted",{layer:t})},this)},save:function(){this._map.fire("draw:deleted",{layers:this._deletedLayers})},_enableLayerDelete:function(t){var e=t.layer||t.target||t;e.on("click",this._removeLayer,this)},_disableLayerDelete:function(t){var e=t.layer||t.target||t;e.off("click",this._removeLayer,this),this._deletedLayers.removeLayer(e)},_removeLayer:function(t){var e=t.layer||t.target||t;this._deletableLayers.removeLayer(e),this._deletedLayers.addLayer(e),e.fire("deleted")},_onMouseMove:function(t){this._tooltip.updatePosition(t.latlng)},_hasAvailableLayers:function(){return 0!==this._deletableLayers.getLayers().length}})}(window,document),leafletDraw=void 0,function(t){"use strict";sortable=function(){return"function"==typeof t?t():t}()}(function(){"use strict";function t(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(t);this.el=t,this.options=e=v({},e),t[U]=this;var i={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(t.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var n in i)!(n in e)&&(e[n]=i[n]);K(e);for(var s in this)"_"===s.charAt(0)&&(this[s]=this[s].bind(this));this.nativeDraggable=!e.forceFallback&&B,o(t,"mousedown",this._onTapStart),o(t,"touchstart",this._onTapStart),this.nativeDraggable&&(o(t,"dragover",this),o(t,"dragenter",this)),V.push(this._onDragOver),e.store&&this.sort(e.store.get(this))}function e(t){C&&C.state!==t&&(a(C,"display",t?"none":""),!t&&C.state&&S.insertBefore(C,y),C.state=t)}function i(t,e,i){if(t){i=i||F;do if(">*"===e&&t.parentNode===i||_(t,e))return t;while(t!==i&&(t=t.parentNode))}return null}function n(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move"),t.preventDefault()}function o(t,e,i){t.addEventListener(e,i,!1)}function s(t,e,i){t.removeEventListener(e,i,!1)}function r(t,e,i){if(t)if(t.classList)t.classList[i?"add":"remove"](e);else{var n=(" "+t.className+" ").replace(N," ").replace(" "+e+" "," ");t.className=(n+(i?" "+e:"")).replace(N," ")}}function a(t,e,i){var n=t&&t.style;if(n){if(void 0===i)return F.defaultView&&F.defaultView.getComputedStyle?i=F.defaultView.getComputedStyle(t,""):t.currentStyle&&(i=t.currentStyle),void 0===e?i:i[e];e in n||(e="-webkit-"+e),n[e]=i+("string"==typeof i?"":"px")}}function l(t,e,i){if(t){var n=t.getElementsByTagName(e),o=0,s=n.length;if(i)for(;o5||e.clientX-(n.right+n.width)>5)&&i}function m(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,i=e.length,n=0;i--;)n+=e.charCodeAt(i);return n.toString(36)}function f(t,e){var i=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"!==t.nodeName.toUpperCase()&&_(t,e)&&i++;return i}function _(t,e){if(t){e=e.split(".");var i=e.shift().toUpperCase(),n=new RegExp("\\s("+e.join("|")+")(?=\\s)","g");return!(""!==i&&t.nodeName.toUpperCase()!=i||e.length&&((" "+t.className+" ").match(n)||[]).length!=e.length)}return!1}function g(t,e){var i,n;return function(){void 0===i&&(i=arguments,n=this,setTimeout(function(){1===i.length?t.call(n,i[0]):t.apply(n,i),i=void 0},e))}}function v(t,e){if(t&&e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}if("undefined"==typeof window||"undefined"==typeof window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k,O,D={},N=/\s+/g,U="Sortable"+(new Date).getTime(),j=window,F=j.document,z=j.parseInt,B=!!("draggable"in F.createElement("div")),q=function(t){return t=F.createElement("x"),t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),W=!1,H=Math.abs,V=([].slice,[]),Y=g(function(t,e,i){if(i&&e.scroll){var n,o,s,r,a=e.scrollSensitivity,l=e.scrollSpeed,c=t.clientX,h=t.clientY,u=window.innerWidth,d=window.innerHeight;if(L!==i&&(w=e.scroll,L=i,w===!0)){w=i;do if(w.offsetWidth-1){for(;n--;)V[n]({clientX:k.clientX,clientY:k.clientY,target:t,rootEl:e});break}t=e}while(e=e.parentNode);q||a(P,"display","")}},_onTouchMove:function(e){if(T){t.active||this._dragStarted(),this._appendGhost();var i=e.touches?e.touches[0]:e,n=i.clientX-T.clientX,o=i.clientY-T.clientY,s=e.touches?"translate3d("+n+"px,"+o+"px,0)":"translate("+n+"px,"+o+"px)";O=!0,k=i,a(P,"webkitTransform",s),a(P,"mozTransform",s),a(P,"msTransform",s),a(P,"transform",s),e.preventDefault()}},_appendGhost:function(){if(!P){var t,e=y.getBoundingClientRect(),i=a(y),n=this.options;P=y.cloneNode(!0),r(P,n.ghostClass,!1),r(P,n.fallbackClass,!0),a(P,"top",e.top-z(i.marginTop,10)),a(P,"left",e.left-z(i.marginLeft,10)),a(P,"width",e.width),a(P,"height",e.height),a(P,"opacity","0.8"),a(P,"position","fixed"),a(P,"zIndex","100000"),a(P,"pointerEvents","none"),n.fallbackOnBody&&F.body.appendChild(P)||S.appendChild(P),t=P.getBoundingClientRect(),a(P,"width",2*e.width-t.width),a(P,"height",2*e.height-t.height)}},_onDragStart:function(t,e){var i=t.dataTransfer,n=this.options;this._offUpEvents(),"clone"==A.pull&&(C=y.cloneNode(!0),a(C,"display","none"),S.insertBefore(C,y)),e?("touch"===e?(o(F,"touchmove",this._onTouchMove),o(F,"touchend",this._onDrop),o(F,"touchcancel",this._onDrop)):(o(F,"mousemove",this._onTouchMove),o(F,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(i&&(i.effectAllowed="move",n.setData&&n.setData.call(this,i,y)),o(F,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(t){var n,o,s,r=this.el,l=this.options,c=l.group,u=c.put,m=A===c,f=l.sort;if(void 0!==t.preventDefault&&(t.preventDefault(),!l.dragoverBubble&&t.stopPropagation()),O=!0,A&&!l.disabled&&(m?f||(s=!S.contains(y)):A.pull&&u&&(A.name===c.name||u.indexOf&&~u.indexOf(A.name)))&&(void 0===t.rootEl||t.rootEl===this.el)){if(Y(t,l,this.el),W)return;if(n=i(t.target,l.draggable,r),o=y.getBoundingClientRect(),s)return e(!0),void(C||M?S.insertBefore(y,C||M):f||S.appendChild(y));if(0===r.children.length||r.children[0]===P||r===t.target&&(n=p(r,t))){if(n){if(n.animated)return;g=n.getBoundingClientRect()}e(m),h(S,r,y,o,n,g)!==!1&&(y.contains(r)||(r.appendChild(y),E=r),this._animate(o,y),n&&this._animate(g,n))}else if(n&&!n.animated&&n!==y&&void 0!==n.parentNode[U]){R!==n&&(R=n,b=a(n),x=a(n.parentNode));var _,g=n.getBoundingClientRect(),v=g.right-g.left,w=g.bottom-g.top,L=/left|right|inline/.test(b.cssFloat+b.display)||"flex"==x.display&&0===x["flex-direction"].indexOf("row"),G=n.offsetWidth>y.offsetWidth,I=n.offsetHeight>y.offsetHeight,T=(L?(t.clientX-g.left)/v:(t.clientY-g.top)/w)>.5,k=n.nextElementSibling,D=h(S,r,y,o,n,g);if(D!==!1){if(W=!0,setTimeout(d,30),e(m),1===D||D===-1)_=1===D;else if(L){var N=y.offsetTop,j=n.offsetTop;_=N===j?n.previousElementSibling===y&&!G||T&&G:j>N}else _=k!==y&&!I||T&&I;y.contains(r)||(_&&!k?r.appendChild(y):n.parentNode.insertBefore(y,_?k:n)),E=y.parentNode,this._animate(o,y),this._animate(g,n)}}}},_animate:function(t,e){var i=this.options.animation;if(i){var n=e.getBoundingClientRect();a(e,"transition","none"),a(e,"transform","translate3d("+(t.left-n.left)+"px,"+(t.top-n.top)+"px,0)"),e.offsetWidth,a(e,"transition","all "+i+"ms"),a(e,"transform","translate3d(0,0,0)"),clearTimeout(e.animated),e.animated=setTimeout(function(){a(e,"transition",""),a(e,"transform",""),e.animated=!1},i)}},_offUpEvents:function(){var t=this.el.ownerDocument;s(F,"touchmove",this._onTouchMove),s(t,"mouseup",this._onDrop),s(t,"touchend",this._onDrop),s(t,"touchcancel",this._onDrop)},_onDrop:function(e){var i=this.el,n=this.options;clearInterval(this._loopId),clearInterval(D.pid),clearTimeout(this._dragStartTimer),s(F,"mousemove",this._onTouchMove),this.nativeDraggable&&(s(F,"drop",this),s(i,"dragstart",this._onDragStart)),this._offUpEvents(),e&&(O&&(e.preventDefault(),!n.dropBubble&&e.stopPropagation()),P&&P.parentNode.removeChild(P),y&&(this.nativeDraggable&&s(y,"dragend",this),u(y),r(y,this.options.ghostClass,!1),r(y,this.options.chosenClass,!1),S!==E?(I=f(y,n.draggable),I>=0&&(c(null,E,"sort",y,S,G,I),c(this,S,"sort",y,S,G,I),c(null,E,"add",y,S,G,I),c(this,S,"remove",y,S,G,I))):(C&&C.parentNode.removeChild(C),y.nextSibling!==M&&(I=f(y,n.draggable),I>=0&&(c(this,S,"update",y,S,G,I),c(this,S,"sort",y,S,G,I)))),t.active&&(null!==I&&I!==-1||(I=G),c(this,S,"end",y,S,G,I),this.save()))),this._nulling()},_nulling:function(){S=y=E=P=M=C=w=L=T=k=O=I=R=b=A=t.active=null},handleEvent:function(t){var e=t.type;"dragover"===e||"dragenter"===e?y&&(this._onDragOver(t),n(t)):"drop"!==e&&"dragend"!==e||this._onDrop(t)},toArray:function(){for(var t,e=[],n=this.el.children,o=0,s=n.length,r=this.options;othis._map.getZoom()||e.layer.options.maxZoome.getZoom()||o.options.maxZoom2?document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="block":document.getElementById(i._addUID("GPlocationAutoCompleteList_"+o)).style.display="none",i.onAutoCompleteSearchText(e)}}),n.addEventListener("keydown",function(n){var o=n.which||n.keyCode,s=document.getElementById(i._addUID("GPlocationAutoCompleteList_"+e));if(s){var r=s.getElementsByClassName("GPautoCompleteProposal current"),a=s.getElementsByClassName("GPautoCompleteProposal"),l=a.length;if(l){var c=null;if(!r.length)return c=a[0],c.className="GPautoCompleteProposal current",c.style.color="#000000",void(c.style["background-color"]="#CEDBEF");c=r[0];var h=parseInt(t.index(c.id),10),u=h===l-1?a[0]:a[h+1],d=0===h?a[l-1]:a[h-1];switch(c.style["background-color"]="",c.style.color="",d.style["background-color"]="",d.style.color="",u.style["background-color"]="",u.style.color="",o){case 38:console.log("arrow up"),c.className="GPautoCompleteProposal",d.className="GPautoCompleteProposal current",d.style.color="#000000",d.style["background-color"]="#CEDBEF";break;case 40:console.log("arrow down"),c.className="GPautoCompleteProposal",u.className="GPautoCompleteProposal current",u.style.color="#000000",u.style["background-color"]="#CEDBEF";break;case 13:console.log("enter"),c.click(n)}c.focus()}}}),n},_createLocationCoordinateInputElement:function(e){var i=this,n=document.createElement("input");return n.id=this._addUID("GPlocationOriginCoords_"+e),n.className="GPlocationOriginHidden",n.type="text",n.disabled=!1,n.addEventListener("click",function(){var e=t.index(this.id);document.getElementById(i._addUID("GPlocationOriginLabel_"+e)).click()}),n},_createLocationPointerShowInputElement:function(t){var e=document.createElement("input");return e.id=this._addUID("GPlocationOriginPointer_"+t),e.type="checkbox",e},_createLocationPointerInputElement:function(e){var i=this,n=document.createElement("label");return n.id=this._addUID("GPlocationOriginPointerImg_"+e),n.htmlFor="GPlocationOriginPointer_"+e,n.className="GPlocationOriginPointerImg",n.title="Pointer un lieu sur la carte",n.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var n,o,s,r=t.index(this.id),a=document.getElementsByClassName(i._addUID("GPlocationPoint"));for(n=0;n",color:"blue",display:!0,addOption:!1,removeOption:!1},disableReverse:!1,displayInfo:!0,autocompleteOptions:{},reverseGeocodeOptions:{}},initialize:function(e){t.Util.setOptions(this,e),this._uid=this.options.tag.unique||null,this._activeDragAndDrop=!1,this._pressedKeyOnDragAndDrop=!1,this._map=null,this._inputsContainer=null,this._inputLabelContainer=null,this._inputAutoCompleteContainer=null,this._inputShowPointerContainer=null,this._inputCoordinateContainer=null,this._coordinate=null,this._suggestedContainer=null,this._suggestedLocations=[],this._currentLocation=null,this._marker=null,this._resources={},this._noRightManagement=!1,this._checkRightsManagement(),this._container=this._uid?this._initLayout():null},onAdd:function(){this._uid=o.generate();var e=this._initLayout();return t.DomEvent.disableClickPropagation(e).disableScrollPropagation(e),e},onRemove:function(){},getCoordinate:function(){return this._coordinate},getCoordinateInverse:function(){if(this._coordinate){var t={x:this._coordinate.y,y:this._coordinate.x};return t}},setMap:function(t){this._map||(this._map=t)},clear:function(){this._setCursor(),this._setMarker(),this._clearResults(),this._inputLabelContainer.click()},dragging:function(t){this._marker&&(t?this._marker.dragging.enable():this._marker.dragging.disable())},_initLayout:function(){var t=this.options.tag.id,e=this._createMainContainerElement(),i=this._inputsContainer=this._createLocationPointElement(t,this.options.tag.display);e.appendChild(i);var n=this._inputLabelContainer=this._createLocationPointLabelElement(t,this.options.tag.label);i.appendChild(n);var o=this._inputAutoCompleteContainer=this._createLocationAutoCompleteteInputElement(t);i.appendChild(o);var s=this._inputCoordinateContainer=this._createLocationCoordinateInputElement(t);i.appendChild(s);var r=this._inputShowPointerContainer=this._createLocationPointerShowInputElement(t);i.appendChild(r);var a=this._createLocationPointerInputElement(t);if(i.appendChild(a),this.options.tag.addOption){var l=this._createLocationAddPointElement();i.appendChild(l)}if(this.options.tag.removeOption){var c=this._createLocationRemovePointElement(t);i.appendChild(c)}var h=this._suggestedContainer=this._createLocationAutoCompleteResultElement(t);return e.appendChild(h),e},_checkRightsManagement:function(){var t=null,e=[],i=null;i=this.options.reverseGeocodeOptions.apiKey,t=this.options.reverseGeocodeOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var o=n.check({key:i||this.options.apiKey,resources:e,services:["ReverseGeocode"]});i=this.options.autocompleteOptions.apiKey,t=this.options.autocompleteOptions.filterOptions,e=t?t.type:[],e&&0!==e.length||(e=["PositionOfInterest","StreetAddress"]);var s=n.check({key:i||this.options.apiKey,resources:e,services:["AutoCompletion"]});o||s||(this._noRightManagement=!0),s&&(this._resources.AutoCompletion={},this._resources.AutoCompletion.resources=s.AutoCompletion,this._resources.AutoCompletion.key=s.key),o&&(this._resources.ReverseGeocode={},this._resources.ReverseGeocode.resources=o.ReverseGeocode,this._resources.ReverseGeocode.key=o.key)},_setLabel:function(t){this._inputAutoCompleteContainer.value=t||""},_setCoordinate:function(t){this._coordinate={x:t.lng,y:t.lat};var e=null,i=null;e=r.roundToDecimal(t.lat,4),i=r.roundToDecimal(t.lng,4);var n=i+" , "+e;this.GPdisplayCoordinate(n)},_setPosition:function(e){var i=this._map;i.panTo(t.latLng(e.y,e.x))},_setMarker:function(e,i,n){if(!this._activeDragAndDrop){var o=this._map;if(null!=this._marker&&(this._marker.off("mousedown",this.onMouseDownMarker,this),this._marker.off("dragstart",this.onStartDragMarker,this),this._marker.off("drag",this.onDragMarker,this),this._marker.off("dragend",this.onEndDragMarker,this),o.removeLayer(this._marker),this._marker=null),e){var s={icon:new a(this.options.tag.color),draggable:!0,clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.y,e.x),s),this._marker.on("mousedown",this.onMouseDownMarker,this),this._marker.on("dragstart",this.onStartDragMarker,this),this._marker.on("drag",this.onDragMarker,this),this._marker.on("dragend",this.onEndDragMarker,this),this._marker.addTo(o),n){var r=null;if("string"!=typeof i)if(i.fields.fullText)r=i.fields.fullText;else{var l=[];l.push(i.fields.street||""),l.push(i.fields.postalCode||""),l.push(i.fields.commune||""),"PositionOfInterest"===i.type&&(l.push(i.fields.poi||""),l.push(i.fields.kind||"")),r=l.join(" - ")}else r=i;this._marker.bindPopup(r)}}}},_setCursor:function(t){var e=this._map.getContainer();t?e.style.cursor=t:e.style.cursor=null},_clearResults:function(){this._currentLocation=null,this._coordinate=null,this._clearSuggestedLocation()},_clearSuggestedLocation:function(){if(this._suggestedLocations=[],this._suggestedContainer)for(;this._suggestedContainer.firstChild;)this._suggestedContainer.removeChild(this._suggestedContainer.firstChild)},_requestAutoComplete:function(e){if(e&&0!==Object.keys(e).length&&e.text){if(this._noRightManagement)return void console.log("no rights for all service !?");if(!this._resources.AutoCompletion)return void console.log("no rights for this service !?");var n=this._resources.AutoCompletion.resources;if(n&&0!==Object.keys(n).length){var o=this._resources.AutoCompletion.key,s={};t.Util.extend(s,this.options.autocompleteOptions),t.Util.extend(s,e),t.Util.extend(s,{apiKey:s.apiKey||this.options.apiKey||o}),i.Services.autoComplete(s)}}},_fillAutoCompletedLocationListContainer:function(t){if(t&&0!==t.length){var e=this._suggestedContainer;if(e.childElementCount)for(;e.firstChild;)e.removeChild(e.firstChild);for(var i=0;is;s++)if(!e||2!==s||void 0!==i.z)switch(0===s?(n=r,o="x"):1===s?(n=a,o="y"):(n=l,o="z"),t.axis[s]){case"e":i[o]=n;break;case"w":i[o]=-n;break;case"n":i[o]=n;break;case"s":i[o]=-n;break;case"u":void 0!==i[o]&&(i.z=n);break;case"d":void 0!==i[o]&&(i.z=-n);break;default:return null}return i}},{}],4:[function(t,e){var i=Math.PI/2,n=t("./sign");e.exports=function(t){return Math.abs(t)1&&(t=t>1?1:-1),Math.asin(t)}},{}],7:[function(t,e){e.exports=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))}},{}],8:[function(t,e){e.exports=function(t){return.375*t*(1+.25*t*(1+.46875*t))}},{}],9:[function(t,e){e.exports=function(t){return.05859375*t*t*(1+.75*t)}},{}],10:[function(t,e){e.exports=function(t){return t*t*t*(35/3072)}},{}],11:[function(t,e){e.exports=function(t,e,i){var n=e*i;return t/Math.sqrt(1-n*n)}},{}],12:[function(t,e){e.exports=function(t,e,i,n,o){var s,r;s=t/e;for(var a=0;15>a;a++)if(r=(t-(e*s-i*Math.sin(2*s)+n*Math.sin(4*s)-o*Math.sin(6*s)))/(e-2*i*Math.cos(2*s)+4*n*Math.cos(4*s)-6*o*Math.cos(6*s)),s+=r,Math.abs(r)<=1e-10)return s;return NaN}},{}],13:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){var n=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(e)-n)<1e-6)return 0>e?-1*i:i;for(var o,s,r,a,l=Math.asin(.5*e),c=0;30>c;c++)if(s=Math.sin(l),r=Math.cos(l),a=t*s,o=Math.pow(1-a*a,2)/(2*r)*(e/(1-t*t)-s/(1-a*a)+.5/t*Math.log((1-a)/(1+a))),l+=o,Math.abs(o)<=1e-10)return l;return NaN}},{}],14:[function(t,e){e.exports=function(t,e,i,n,o){return t*o-e*Math.sin(2*o)+i*Math.sin(4*o)-n*Math.sin(6*o)}},{}],15:[function(t,e){e.exports=function(t,e,i){var n=t*e;return i/Math.sqrt(1-n*n)}},{}],16:[function(t,e){var i=Math.PI/2;e.exports=function(t,e){for(var n,o,s=.5*t,r=i-2*Math.atan(e),a=0;15>=a;a++)if(n=t*Math.sin(r),o=i-2*Math.atan(e*Math.pow((1-n)/(1+n),s))-r,r+=o,Math.abs(o)<=1e-10)return r;return-9999}},{}],17:[function(t,e){var i=1,n=.25,o=.046875,s=.01953125,r=.01068115234375,a=.75,l=.46875,c=.013020833333333334,h=.007120768229166667,u=.3645833333333333,d=.005696614583333333,p=.3076171875;e.exports=function(t){var e=[];e[0]=i-t*(n+t*(o+t*(s+t*r))),e[1]=t*(a-t*(o+t*(s+t*r)));var m=t*t;return e[2]=m*(l-t*(c+t*h)),m*=t,e[3]=m*(u-t*d),e[4]=m*t*p,e}},{}],18:[function(t,e){var i=t("./pj_mlfn"),n=1e-10,o=20;e.exports=function(t,e,s){for(var r=1/(1-e),a=t,l=o;l;--l){var c=Math.sin(a),h=1-e*c*c;if(h=(i(a,c,Math.cos(a),s)-t)*h*Math.sqrt(h)*r,a-=h,Math.abs(h)1e-7?(i=t*e,(1-t*t)*(e/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*e}},{}],21:[function(t,e){e.exports=function(t){return 0>t?-1:1}},{}],22:[function(t,e){e.exports=function(t,e){return Math.pow((1-t)/(1+t),e)}},{}],23:[function(t,e){e.exports=function(t){var e={x:t[0],y:t[1]};return t.length>2&&(e.z=t[2]),t.length>3&&(e.m=t[3]),e}},{}],24:[function(t,e){var i=Math.PI/2;e.exports=function(t,e,n){var o=t*n,s=.5*t;return o=Math.pow((1-o)/(1+o),s),Math.tan(.5*(i-e))/o}},{}],25:[function(t,e,i){i.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},i.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},i.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},i.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},i.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},i.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},i.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},i.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},i.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},i.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},i.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},i.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},i.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},i.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},i.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},i.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(t,e,i){i.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},i.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},i.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},i.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},i.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},i.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},i.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},i.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},i.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},i.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},i.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},i.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},i.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},i.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},i.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},i.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},i.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},i.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},i.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},i.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},i.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},i.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},i.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},i.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},i.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},i.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},i.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},i.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},i.hough={a:6378270,rf:297,ellipseName:"Hough"},i.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},i.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},i.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},i.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},i.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},i.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},i.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},i.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},i.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},i.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},i.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},i.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},i.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},i.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(t,e,i){i.greenwich=0,i.lisbon=-9.131906111111,i.paris=2.337229166667,i.bogota=-74.080916666667,i.madrid=-3.687938888889,i.rome=12.452333333333,i.bern=7.439583333333,i.jakarta=106.807719444444,i.ferro=-17.666666666667,i.brussels=4.367975,i.stockholm=18.058277777778,i.athens=23.7163375,i.oslo=10.722916666667},{}],28:[function(t,e){function i(t,e,i){var n;return Array.isArray(i)?(n=r(t,e,i),3===i.length?[n.x,n.y,n.z]:[n.x,n.y]):r(t,e,i)}function n(t){return t instanceof s?t:t.oProj?t.oProj:s(t)}function o(t,e,o){t=n(t);var s,r=!1;return"undefined"==typeof e?(e=t,t=a,r=!0):("undefined"!=typeof e.x||Array.isArray(e))&&(o=e,e=t,t=a,r=!0),e=n(e),o?i(t,e,o):(s={forward:function(n){return i(t,e,n)},inverse:function(n){return i(e,t,n)}},r&&(s.oProj=e),s)}var s=t("./Proj"),r=t("./transform"),a=s("WGS84");e.exports=o},{"./Proj":2,"./transform":64}],29:[function(t,e){var i=Math.PI/2,n=1,o=2,s=3,r=4,a=5,l=484813681109536e-20,c=1.0026,h=.3826834323650898,u=function(t){if(!(this instanceof u))return new u(t);if(this.datum_type=r,t){if(t.datumCode&&"none"===t.datumCode&&(this.datum_type=a),t.datum_params){for(var e=0;e3&&(0!==t.datum_params[3]||0!==t.datum_params[4]||0!==t.datum_params[5]||0!==t.datum_params[6])&&(this.datum_type=o,t.datum_params[3]*=l,t.datum_params[4]*=l,t.datum_params[5]*=l,t.datum_params[6]=t.datum_params[6]/1e6+1)}this.datum_type=t.grids?s:this.datum_type,this.a=t.a,this.b=t.b,this.es=t.es,this.ep2=t.ep2,this.datum_params=t.datum_params,this.datum_type===s&&(this.grids=t.grids)}};u.prototype={compare_datums:function(t){return this.datum_type===t.datum_type&&(!(this.a!==t.a||Math.abs(this.es-t.es)>5e-11)&&(this.datum_type===n?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]:this.datum_type===o?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]&&this.datum_params[3]===t.datum_params[3]&&this.datum_params[4]===t.datum_params[4]&&this.datum_params[5]===t.datum_params[5]&&this.datum_params[6]===t.datum_params[6]:this.datum_type!==s&&t.datum_type!==s||this.nadgrids===t.nadgrids))},geodetic_to_geocentric:function(t){var e,n,o,s,r,a,l,c=t.x,h=t.y,u=t.z?t.z:0,d=0;if(-i>h&&h>-1.001*i)h=-i;else if(h>i&&1.001*i>h)h=i;else if(-i>h||h>i)return null;return c>Math.PI&&(c-=2*Math.PI),r=Math.sin(h),l=Math.cos(h),a=r*r,s=this.a/Math.sqrt(1-this.es*a),e=(s+u)*l*Math.cos(c),n=(s+u)*l*Math.sin(c),o=(s*(1-this.es)+u)*r,t.x=e,t.y=n,t.z=o,d},geocentric_to_geodetic:function(t){var e,n,o,s,r,a,l,c,h,u,d,p,m,f,_,g,v,y=1e-12,E=y*y,P=30,C=t.x,S=t.y,M=t.z?t.z:0;if(m=!1,e=Math.sqrt(C*C+S*S),n=Math.sqrt(C*C+S*S+M*M),e/this.aE&&P>f);return g=Math.atan(d/Math.abs(u)),t.x=_,t.y=g,t.z=v,t},geocentric_to_geodetic_noniter:function(t){var e,n,o,s,r,a,l,u,d,p,m,f,_,g,v,y,E,P=t.x,C=t.y,S=t.z?t.z:0;if(P=parseFloat(P),C=parseFloat(C),S=parseFloat(S),E=!1,0!==P)e=Math.atan2(C,P);else if(C>0)e=i;else if(0>C)e=-i;else if(E=!0,e=0,S>0)n=i;else{if(!(0>S))return n=i,void(o=-this.b);n=-i}return r=P*P+C*C,s=Math.sqrt(r),a=S*c,u=Math.sqrt(a*a+r),p=a/u,f=s/u,m=p*p*p,l=S+this.b*this.ep2*m,y=s-this.a*this.es*f*f*f,d=Math.sqrt(l*l+y*y),_=l/d,g=y/d,v=this.a/Math.sqrt(1-this.es*_*_),o=g>=h?s/g-v:-h>=g?s/-g-v:S/_+v*(this.es-1),E===!1&&(n=Math.atan(_/g)),t.x=e,t.y=n,t.z=o,t},geocentric_to_wgs84:function(t){if(this.datum_type===n)t.x+=this.datum_params[0],t.y+=this.datum_params[1],t.z+=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=c*(t.x-l*t.y+a*t.z)+e,u=c*(l*t.x+t.y-r*t.z)+i,d=c*(-a*t.x+r*t.y+t.z)+s;t.x=h,t.y=u,t.z=d}},geocentric_from_wgs84:function(t){if(this.datum_type===n)t.x-=this.datum_params[0],t.y-=this.datum_params[1],t.z-=this.datum_params[2];else if(this.datum_type===o){var e=this.datum_params[0],i=this.datum_params[1],s=this.datum_params[2],r=this.datum_params[3],a=this.datum_params[4],l=this.datum_params[5],c=this.datum_params[6],h=(t.x-e)/c,u=(t.y-i)/c,d=(t.z-s)/c;t.x=h+l*u-a*d,t.y=-l*h+u+r*d,t.z=a*h-r*u+d}}},e.exports=u},{}],30:[function(t,e){var i=1,n=2,o=3,s=5,r=6378137,a=.006694379990141316;e.exports=function(t,e,l){function c(t){return t===i||t===n}var h,u,d;if(t.compare_datums(e))return l;if(t.datum_type===s||e.datum_type===s)return l;var p=t.a,m=t.es,f=e.a,_=e.es,g=t.datum_type;if(g===o)if(0===this.apply_gridshift(t,0,l))t.a=r,t.es=a;else{if(!t.datum_params)return t.a=p,t.es=t.es,l;for(h=1,u=0,d=t.datum_params.length;d>u;u++)h*=t.datum_params[u];if(0===h)return t.a=p,t.es=t.es,l;g=t.datum_params.length>3?n:i}return e.datum_type===o&&(e.a=r,e.es=a),(t.es!==e.es||t.a!==e.a||c(g)||c(e.datum_type))&&(t.geodetic_to_geocentric(l),c(t.datum_type)&&t.geocentric_to_wgs84(l),c(e.datum_type)&&e.geocentric_from_wgs84(l),e.geocentric_to_geodetic(l)),e.datum_type===o&&this.apply_gridshift(e,1,l),t.a=p,t.es=m,e.a=f,e.es=_,l}},{}],31:[function(t,e){function i(t){var e=this;if(2===arguments.length){var n=arguments[1];i[t]="string"==typeof n?"+"===n[0]?o(arguments[1]):s(arguments[1]):n}else if(1===arguments.length){if(Array.isArray(t))return t.map(function(t){Array.isArray(t)?i.apply(e,t):i(t)});if("string"==typeof t){if(t in i)return i[t]}else"EPSG"in t?i["EPSG:"+t.EPSG]=t:"ESRI"in t?i["ESRI:"+t.ESRI]=t:"IAU2000"in t?i["IAU2000:"+t.IAU2000]=t:console.log(t);return}}var n=t("./global"),o=t("./projString"),s=t("./wkt");n(i),e.exports=i},{"./global":34,"./projString":37,"./wkt":65}],32:[function(t,e){var i=t("./constants/Datum"),n=t("./constants/Ellipsoid"),o=t("./extend"),s=t("./datum"),r=1e-10,a=.16666666666666666,l=.04722222222222222,c=.022156084656084655;e.exports=function(t){if(t.datumCode&&"none"!==t.datumCode){var e=i[t.datumCode];e&&(t.datum_params=e.towgs84?e.towgs84.split(","):null,t.ellps=e.ellipse,t.datumName=e.datumName?e.datumName:t.datumCode)}if(!t.a){var h=n[t.ellps]?n[t.ellps]:n.WGS84;o(t,h)}return t.rf&&!t.b&&(t.b=(1-1/t.rf)*t.a),(0===t.rf||Math.abs(t.a-t.b)n?(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):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)},i.forward=function(t){var e=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var n=s(this.e3,this.sin_phi,this.cos_phi),o=this.a*Math.sqrt(this.c-this.ns0*n)/this.ns0,a=this.ns0*r(e-this.long0),l=o*Math.sin(a)+this.x0,c=this.rh-o*Math.cos(a)+this.y0;return t.x=l,t.y=c,t},i.inverse=function(t){var e,i,n,o,s,a;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(e=Math.sqrt(t.x*t.x+t.y*t.y),n=1):(e=-Math.sqrt(t.x*t.x+t.y*t.y),n=-1),o=0,0!==e&&(o=Math.atan2(n*t.x,n*t.y)),n=e*this.ns0/this.a,this.sphere?a=Math.asin((this.c-n*n)/(2*this.ns0)):(i=(this.c-n*n)/this.ns0,a=this.phi1z(this.e3,i)),s=r(o/this.ns0+this.long0),t.x=s,t.y=a,t},i.phi1z=function(t,e){var i,o,s,r,l,c=a(.5*e);if(n>t)return c;for(var h=t*t,u=1;25>=u;u++)if(i=Math.sin(c),o=Math.cos(c),s=t*i,r=1-s*s,l=.5*r*r/o*(e/(1-h)-i/r+.5/t*Math.log((1-s)/(1+s))),c+=l,Math.abs(l)<=1e-7)return c;return null},i.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],40:[function(t,e,i){var n=t("../common/adjust_lon"),o=Math.PI/2,s=1e-10,r=t("../common/mlfn"),a=t("../common/e0fn"),l=t("../common/e1fn"),c=t("../common/e2fn"),h=t("../common/e3fn"),u=t("../common/gN"),d=t("../common/asinz"),p=t("../common/imlfn");i.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},i.forward=function(t){var e,i,d,p,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T=t.x,k=t.y,O=Math.sin(t.y),D=Math.cos(t.y),N=n(T-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=s?(t.x=this.x0+this.a*(o-k)*Math.sin(N),t.y=this.y0-this.a*(o-k)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(t.x=this.x0+this.a*(o+k)*Math.sin(N),t.y=this.y0+this.a*(o+k)*Math.cos(N),t):(R=this.sin_p12*O+this.cos_p12*D*Math.cos(N),w=Math.acos(R),L=w/Math.sin(w),t.x=this.x0+this.a*L*D*Math.sin(N),t.y=this.y0+this.a*L*(this.cos_p12*O-this.sin_p12*D*Math.cos(N)),t):(e=a(this.es),i=l(this.es),d=c(this.es),p=h(this.es),Math.abs(this.sin_p12-1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m-f)*Math.sin(N),t.y=this.y0-(m-f)*Math.cos(N),t):Math.abs(this.sin_p12+1)<=s?(m=this.a*r(e,i,d,p,o),f=this.a*r(e,i,d,p,k),t.x=this.x0+(m+f)*Math.sin(N),t.y=this.y0+(m+f)*Math.cos(N),t):(_=O/D,g=u(this.a,this.e,this.sin_p12),v=u(this.a,this.e,O),y=Math.atan((1-this.es)*_+this.es*g*this.sin_p12/(v*D)),E=Math.atan2(Math.sin(N),this.cos_p12*Math.tan(y)-this.sin_p12*Math.cos(N)),b=0===E?Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.abs(Math.abs(E)-Math.PI)<=s?-Math.asin(this.cos_p12*Math.sin(y)-this.sin_p12*Math.cos(y)):Math.asin(Math.sin(N)*Math.cos(y)/Math.sin(E)),P=this.e*this.sin_p12/Math.sqrt(1-this.es),C=this.e*this.cos_p12*Math.cos(E)/Math.sqrt(1-this.es),S=P*C,M=C*C,x=b*b,G=x*b,I=G*b,A=I*b,w=g*b*(1-x*M*(1-M)/6+G/8*S*(1-2*M)+I/120*(M*(4-7*M)-3*P*P*(1-7*M))-A/48*S),t.x=this.x0+w*Math.sin(E),t.y=this.y0+w*Math.cos(E),t))},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,m,f,_,g,v,y,E,P,C,S,M,w,L,R,b,x,G,I,A,T,k;if(this.sphere){if(e=Math.sqrt(t.x*t.x+t.y*t.y),e>2*o*this.a)return;return i=e/this.a,m=Math.sin(i),f=Math.cos(i),_=this.long0,Math.abs(e)<=s?g=this.lat0:(g=d(f*this.sin_p12+t.y*m*this.cos_p12/e),v=Math.abs(this.lat0)-o,_=n(Math.abs(v)<=s?this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y):this.long0+Math.atan2(t.x*m,e*this.cos_p12*f-t.y*this.sin_p12*m))),t.x=_,t.y=g,t}return y=a(this.es),E=l(this.es),P=c(this.es),C=h(this.es),Math.abs(this.sin_p12-1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=S-e,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,-1*t.y)),t.x=_,t.y=g,t):Math.abs(this.sin_p12+1)<=s?(S=this.a*r(y,E,P,C,o),e=Math.sqrt(t.x*t.x+t.y*t.y),M=e-S,g=p(M/this.a,y,E,P,C),_=n(this.long0+Math.atan2(t.x,t.y)),t.x=_,t.y=g,t):(e=Math.sqrt(t.x*t.x+t.y*t.y),R=Math.atan2(t.x,t.y),w=u(this.a,this.e,this.sin_p12),b=Math.cos(R),x=this.e*this.cos_p12*b,G=-x*x/(1-this.es),I=3*this.es*(1-G)*this.sin_p12*this.cos_p12*b/(1-this.es),A=e/w,T=A-G*(1+G)*Math.pow(A,3)/6-I*(1+3*G)*Math.pow(A,4)/24,k=1-G*T*T/2-A*T*T*T/6,L=Math.asin(this.sin_p12*Math.cos(T)+this.cos_p12*Math.sin(T)*b),_=n(this.long0+Math.asin(Math.sin(R)*Math.sin(T)/Math.cos(L))),g=Math.atan((1-this.es*k*this.sin_p12/Math.sin(L))*Math.tan(L)/(1-this.es)),t.x=_,t.y=g,t)},i.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],41:[function(t,e,i){var n=t("../common/mlfn"),o=t("../common/e0fn"),s=t("../common/e1fn"),r=t("../common/e2fn"),a=t("../common/e3fn"),l=t("../common/gN"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=Math.PI/2,p=1e-10;i.init=function(){this.sphere||(this.e0=o(this.es),this.e1=s(this.es),this.e2=r(this.es),this.e3=a(this.es),this.ml0=this.a*n(this.e0,this.e1,this.e2,this.e3,this.lat0))},i.forward=function(t){var e,i,o=t.x,s=t.y;if(o=c(o-this.long0),this.sphere)e=this.a*Math.asin(Math.cos(s)*Math.sin(o)),i=this.a*(Math.atan2(Math.tan(s),Math.cos(o))-this.lat0);else{var r=Math.sin(s),a=Math.cos(s),h=l(this.a,this.e,r),u=Math.tan(s)*Math.tan(s),d=o*Math.cos(s),p=d*d,m=this.es*a*a/(1-this.es),f=this.a*n(this.e0,this.e1,this.e2,this.e3,s);e=h*d*(1-p*u*(1/6-(8-u+8*m)*p/120)),i=f-this.ml0+h*r/a*p*(.5+(5-u+6*m)*p/24)}return t.x=e+this.x0,t.y=i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,n=t.x/this.a,o=t.y/this.a;if(this.sphere){var s=o+this.lat0;e=Math.asin(Math.sin(s)*Math.cos(n)),i=Math.atan2(Math.tan(n),Math.cos(s))}else{var r=this.ml0/this.a+o,a=u(r,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(a)-d)<=p)return t.x=this.long0,t.y=d,0>o&&(t.y*=-1),t;var m=l(this.a,this.e,Math.sin(a)),f=m*m*m/this.a/this.a*(1-this.es),_=Math.pow(Math.tan(a),2),g=n*this.a/m,v=g*g;e=a-m*Math.tan(a)/f*g*g*(.5-(1+3*_)*g*g/24),i=g*(1-v*(_/3+(1+3*_)*_*v/15))/Math.cos(a)}return t.x=c(i+this.long0),t.y=h(e),t},i.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/qsfnz"),s=t("../common/msfnz"),r=t("../common/iqsfnz");i.init=function(){this.sphere||(this.k0=s(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},i.forward=function(t){var e,i,s=t.x,r=t.y,a=n(s-this.long0);if(this.sphere)e=this.x0+this.a*a*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(r)/Math.cos(this.lat_ts);else{var l=o(this.e,Math.sin(r));e=this.x0+this.a*this.k0*a,i=this.y0+this.a*l*.5/this.k0}return t.x=e,t.y=i,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i;return this.sphere?(e=n(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=r(this.e,2*t.y*this.k0/this.a),e=n(this.long0+t.x/(this.a*this.k0))),t.x=e,t.y=i,t},i.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],43:[function(t,e,i){var n=t("../common/adjust_lon"),o=t("../common/adjust_lat");i.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)},i.forward=function(t){var e=t.x,i=t.y,s=n(e-this.long0),r=o(i-this.lat0);return t.x=this.x0+this.a*s*this.rc,t.y=this.y0+this.a*r,t},i.inverse=function(t){var e=t.x,i=t.y;return t.x=n(this.long0+(e-this.x0)/(this.a*this.rc)),t.y=o(this.lat0+(i-this.y0)/this.a),t},i.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],44:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/msfnz"),l=t("../common/mlfn"),c=t("../common/adjust_lon"),h=t("../common/adjust_lat"),u=t("../common/imlfn"),d=1e-10;i.init=function(){Math.abs(this.lat1+this.lat2)=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),e=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),e=-1);var s=0;if(0!==i&&(s=Math.atan2(e*t.x,e*t.y)),this.sphere)return o=c(this.long0+s/this.ns),n=h(this.g-i/this.a),t.x=o,t.y=n,t;var r=this.g-i/this.a;return n=u(r,this.e0,this.e1,this.e2,this.e3),o=c(this.long0+s/this.ns),t.x=o,t.y=n,t},i.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],45:[function(t,e,i){var n=Math.PI/4,o=t("../common/srat"),s=Math.PI/2,r=20;i.init=function(){var t=Math.sin(this.lat0),e=Math.cos(this.lat0);e*=e,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*e*e/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+n)/(Math.pow(Math.tan(.5*this.lat0+n),this.C)*o(this.e*t,this.ratexp))},i.forward=function(t){var e=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+n),this.C)*o(this.e*Math.sin(i),this.ratexp))-s,t.x=this.C*e,t},i.inverse=function(t){for(var e=1e-14,i=t.x/this.C,a=t.y,l=Math.pow(Math.tan(.5*a+n)/this.K,1/this.C),c=r;c>0&&(a=2*Math.atan(l*o(this.e*Math.sin(t.y),-.5*this.e))-s,!(Math.abs(a-t.y)0||Math.abs(l)<=o?(c=this.x0+this.a*a*i*Math.sin(s)/l,h=this.y0+this.a*a*(this.cos_p14*e-this.sin_p14*i*r)/l):(c=this.x0+this.infinity_dist*i*Math.sin(s),h=this.y0+this.infinity_dist*(this.cos_p14*e-this.sin_p14*i*r)),t.x=c,t.y=h,t},i.inverse=function(t){var e,i,o,r,a,l;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(e=Math.sqrt(t.x*t.x+t.y*t.y))?(r=Math.atan2(e,this.rc),i=Math.sin(r),o=Math.cos(r),l=s(o*this.sin_p14+t.y*i*this.cos_p14/e),a=Math.atan2(t.x*i,e*this.cos_p14*o-t.y*this.sin_p14*i),a=n(this.long0+a)):(l=this.phic0,a=0),t.x=a,t.y=l,t},i.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],47:[function(t,e,i){var n=t("../common/adjust_lon");i.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},i.forward=function(t){var e,i,o,s,r,a,l,c=t.x,h=t.y,u=n(c-this.long0);return e=Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(h/2+this.s45),this.alfa)/e)-this.s45),o=-u*this.alfa,s=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(o)),r=Math.asin(Math.cos(i)*Math.sin(o)/Math.cos(s)),a=this.n*r,l=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(s/2+this.s45),this.n),t.y=l*Math.cos(a)/1,t.x=l*Math.sin(a)/1,this.czech||(t.y*=-1,t.x*=-1),t},i.inverse=function(t){var e,i,n,o,s,r,a,l,c=t.x;t.x=t.y,t.y=c,this.czech||(t.y*=-1,t.x*=-1),r=Math.sqrt(t.x*t.x+t.y*t.y),s=Math.atan2(t.y,t.x),o=s/Math.sin(this.s0),n=2*(Math.atan(Math.pow(this.ro0/r,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),e=Math.asin(Math.cos(this.ad)*Math.sin(n)-Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),i=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(e)),t.x=this.long0-i/this.alfa,a=e,l=0;var h=0;do t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(e/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-t.y)<1e-10&&(l=1),a=t.y,h+=1;while(0===l&&15>h);return h>=15?null:t},i.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],48:[function(t,e,i){var n=Math.PI/2,o=Math.PI/4,s=1e-10,r=t("../common/qsfnz"),a=t("../common/adjust_lon");i.S_POLE=1,i.N_POLE=2,i.EQUIT=3,i.OBLIQ=4,i.init=function(){var t=Math.abs(this.lat0);if(this.mode=Math.abs(t-n)0){var e;switch(this.qp=r(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;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=r(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))},i.forward=function(t){var e,i,l,c,h,u,d,p,m,f,_=t.x,g=t.y;if(_=a(_-this.long0),this.sphere){if(h=Math.sin(g),f=Math.cos(g),l=Math.cos(_),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(i=this.mode===this.EQUIT?1+f*l:1+this.sinph0*h+this.cosph0*f*l,s>=i)return null;i=Math.sqrt(2/i),e=i*f*Math.sin(_),i*=this.mode===this.EQUIT?h:this.cosph0*h-this.sinph0*f*l}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(l=-l),Math.abs(g+this.phi0)=0?(e=(m=Math.sqrt(u))*c,i=l*(this.mode===this.S_POLE?m:-m)):e=i=0}}return t.x=this.a*e+this.x0,t.y=this.a*i+this.y0,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e,i,o,r,l,c,h,u=t.x/this.a,d=t.y/this.a;if(this.sphere){var p,m=0,f=0;if(p=Math.sqrt(u*u+d*d),i=.5*p,i>1)return null;switch(i=2*Math.asin(i),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(f=Math.sin(i),m=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(p)<=s?0:Math.asin(d*f/p),u*=f,d=m*p;break;case this.OBLIQ:i=Math.abs(p)<=s?this.phi0:Math.asin(m*this.sinph0+d*f*this.cosph0/p),u*=f*this.cosph0,d=(m-Math.sin(i)*this.sinph0)*p;break;case this.N_POLE:d=-d,i=n-i;break;case this.S_POLE:i-=n}e=0!==d||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(u,d):0}else{if(h=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(u/=this.dd,d*=this.dd,c=Math.sqrt(u*u+d*d),s>c)return t.x=0,t.y=this.phi0,t;r=2*Math.asin(.5*c/this.rq),o=Math.cos(r),u*=r=Math.sin(r),this.mode===this.OBLIQ?(h=o*this.sinb1+d*r*this.cosb1/c,l=this.qp*h,d=c*this.cosb1*o-d*this.sinb1*r):(h=d*r/c,l=this.qp*h,d=c*o)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(d=-d),l=u*u+d*d,!l)return t.x=0,t.y=this.phi0,t;h=1-l/this.qp,this.mode===this.S_POLE&&(h=-h)}e=Math.atan2(u,d),i=this.authlat(Math.asin(h),this.apa)}return t.x=a(this.long0+e),t.y=i,t},i.P00=.3333333333333333,i.P01=.17222222222222222,i.P02=.10257936507936508,i.P10=.06388888888888888,i.P11=.0664021164021164,i.P20=.016415012942191543,i.authset=function(t){var e,i=[];return i[0]=t*this.P00,e=t*t,i[0]+=e*this.P01,i[1]=e*this.P10,e*=t,i[0]+=e*this.P02,i[1]+=e*this.P11,i[2]=e*this.P20,i},i.authlat=function(t,e){var i=t+t;return t+e[0]*Math.sin(i)+e[1]*Math.sin(i+i)+e[2]*Math.sin(i+i+i)},i.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],49:[function(t,e,i){var n=1e-10,o=t("../common/msfnz"),s=t("../common/tsfnz"),r=Math.PI/2,a=t("../common/sign"),l=t("../common/adjust_lon"),c=t("../common/phi2z");i.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)n?Math.log(r/h)/Math.log(a/u):e,isNaN(this.ns)&&(this.ns=e),this.f0=r/(this.ns*Math.pow(a,this.ns)),this.rh=this.a*this.f0*Math.pow(d,this.ns),this.title||(this.title="Lambert Conformal Conic")}},i.forward=function(t){var e=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=n&&(i=a(i)*(r-2*n));var o,c,h=Math.abs(Math.abs(i)-r);if(h>n)o=s(this.e,i,Math.sin(i)),c=this.a*this.f0*Math.pow(o,this.ns);else{if(h=i*this.ns,0>=h)return null;c=0}var u=this.ns*l(e-this.long0);return t.x=this.k0*c*Math.sin(u)+this.x0,t.y=this.k0*(this.rh-c*Math.cos(u))+this.y0,t},i.inverse=function(t){var e,i,n,o,s,a=(t.x-this.x0)/this.k0,h=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(e=Math.sqrt(a*a+h*h),i=1):(e=-Math.sqrt(a*a+h*h),i=-1);var u=0;if(0!==e&&(u=Math.atan2(i*a,i*h)),0!==e||this.ns>0){if(i=1/this.ns,n=Math.pow(e/(this.a*this.f0),i),o=c(this.e,n),-9999===o)return null}else o=-r;return s=l(u/this.ns+this.long0),t.x=s,t.y=o,t},i.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],50:[function(t,e,i){function n(t){return t}i.init=function(){},i.forward=n,i.inverse=n,i.names=["longlat","identity"]},{}],51:[function(t,e,i){var n=t("../common/msfnz"),o=Math.PI/2,s=1e-10,r=57.29577951308232,a=t("../common/adjust_lon"),l=Math.PI/4,c=t("../common/tsfnz"),h=t("../common/phi2z");i.init=function(){var t=this.b/this.a;this.es=1-t*t,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.k0=this.sphere?Math.cos(this.lat_ts):n(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k0=this.k?this.k:1)},i.forward=function(t){var e=t.x,i=t.y;if(i*r>90&&-90>i*r&&e*r>180&&-180>e*r)return null;var n,h;if(Math.abs(Math.abs(i)-o)<=s)return null;if(this.sphere)n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0+this.a*this.k0*Math.log(Math.tan(l+.5*i));else{var u=Math.sin(i),d=c(this.e,i,u);n=this.x0+this.a*this.k0*a(e-this.long0),h=this.y0-this.a*this.k0*Math.log(d)}return t.x=n,t.y=h,t},i.inverse=function(t){var e,i,n=t.x-this.x0,s=t.y-this.y0;if(this.sphere)i=o-2*Math.atan(Math.exp(-s/(this.a*this.k0)));else{var r=Math.exp(-s/(this.a*this.k0));if(i=h(this.e,r),-9999===i)return null}return e=a(this.long0+n/(this.a*this.k0)),t.x=e,t.y=i,t},i.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],52:[function(t,e,i){var n=t("../common/adjust_lon");i.init=function(){},i.forward=function(t){var e=t.x,i=t.y,o=n(e-this.long0),s=this.x0+this.a*o,r=this.y0+this.a*Math.log(Math.tan(Math.PI/4+i/2.5))*1.25;return t.x=s,t.y=r,t},i.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var e=n(this.long0+t.x/this.a),i=2.5*(Math.atan(Math.exp(.8*t.y/this.a))-Math.PI/4);return t.x=e,t.y=i,t},i.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],53:[function(t,e,i){var n=t("../common/adjust_lon"),o=1e-10;i.init=function(){},i.forward=function(t){for(var e=t.x,i=t.y,s=n(e-this.long0),r=i,a=Math.PI*Math.sin(i),l=0;!0;l++){var c=-(r+Math.sin(r)-a)/(1+Math.cos(r));if(r+=c,Math.abs(c).999999999999&&(i=.999999999999),e=Math.asin(i);var o=n(this.long0+t.x/(.900316316158*this.a*Math.cos(e)));o<-Math.PI&&(o=-Math.PI),o>Math.PI&&(o=Math.PI),i=(2*e+Math.sin(2*e))/Math.PI,Math.abs(i)>1&&(i=1);var s=Math.asin(i);return t.x=o,t.y=s,t},i.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],54:[function(t,e,i){var n=484813681109536e-20;i.iterations=1,i.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},i.forward=function(t){var e,i=t.x,o=t.y,s=o-this.lat0,r=i-this.long0,a=s/n*1e-5,l=r,c=1,h=0;for(e=1;10>=e;e++)c*=a,h+=this.A[e]*c;var u,d,p=h,m=l,f=1,_=0,g=0,v=0;for(e=1;6>=e;e++)u=f*p-_*m,d=_*p+f*m,f=u,_=d,g=g+this.B_re[e]*f-this.B_im[e]*_,v=v+this.B_im[e]*f+this.B_re[e]*_;return t.x=v*this.a+this.x0,t.y=g*this.a+this.y0,t},i.inverse=function(t){var e,i,o,s=t.x,r=t.y,a=s-this.x0,l=r-this.y0,c=l/this.a,h=a/this.a,u=1,d=0,p=0,m=0;for(e=1;6>=e;e++)i=u*c-d*h,o=d*c+u*h,u=i,d=o,p=p+this.C_re[e]*u-this.C_im[e]*d,m=m+this.C_im[e]*u+this.C_re[e]*d;for(var f=0;f=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,E+=(e-1)*(this.B_re[e]*v-this.B_im[e]*y),P+=(e-1)*(this.B_im[e]*v+this.B_re[e]*y);v=1,y=0;var C=this.B_re[1],S=this.B_im[1];for(e=2;6>=e;e++)_=v*p-y*m,g=y*p+v*m,v=_,y=g,C+=e*(this.B_re[e]*v-this.B_im[e]*y),S+=e*(this.B_im[e]*v+this.B_re[e]*y);var M=C*C+S*S;p=(E*C+P*S)/M,m=(P*C-E*S)/M}var w=p,L=m,R=1,b=0;for(e=1;9>=e;e++)R*=w,b+=this.D[e]*R;var x=this.lat0+b*n*1e5,G=this.long0+L;return t.x=G,t.y=x,t},i.names=["New_Zealand_Map_Grid","nzmg"]},{}],55:[function(t,e,i){var n=t("../common/tsfnz"),o=t("../common/adjust_lon"),s=t("../common/phi2z"),r=Math.PI/2,a=Math.PI/4,l=1e-10;i.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),e=Math.cos(this.lat0),i=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(e,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-i*i);var s=n(this.e,this.lat0,t),r=this.bl/e*Math.sqrt((1-this.es)/(1-i*i));1>r*r&&(r=1);var a,l;if(isNaN(this.longc)){var c=n(this.e,this.lat1,Math.sin(this.lat1)),h=n(this.e,this.lat2,Math.sin(this.lat2));this.el=this.lat0>=0?(r+Math.sqrt(r*r-1))*Math.pow(s,this.bl):(r-Math.sqrt(r*r-1))*Math.pow(s,this.bl);var u=Math.pow(c,this.bl),d=Math.pow(h,this.bl);a=this.el/u,l=.5*(a-1/a);var p=(this.el*this.el-d*u)/(this.el*this.el+d*u),m=(d-u)/(d+u),f=o(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(p*Math.tan(.5*this.bl*f)/m)/this.bl,this.long0=o(this.long0);var _=o(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*_)/l),this.alpha=Math.asin(r*Math.sin(this.gamma0))}else a=this.lat0>=0?r+Math.sqrt(r*r-1):r-Math.sqrt(r*r-1),this.el=a*Math.pow(s,this.bl),l=.5*(a-1/a),this.gamma0=Math.asin(Math.sin(this.alpha)/r),this.long0=this.longc-Math.asin(l*Math.tan(this.gamma0))/this.bl;this.uc=this.no_off?0:this.lat0>=0?this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha)):-1*this.al/this.bl*Math.atan2(Math.sqrt(r*r-1),Math.cos(this.alpha))},i.forward=function(t){var e,i,s,c=t.x,h=t.y,u=o(c-this.long0);if(Math.abs(Math.abs(h)-r)<=l)s=h>0?-1:1,i=this.al/this.bl*Math.log(Math.tan(a+s*this.gamma0*.5)),e=-1*s*r*this.al/this.bl;else{var d=n(this.e,h,Math.sin(h)),p=this.el/Math.pow(d,this.bl),m=.5*(p-1/p),f=.5*(p+1/p),_=Math.sin(this.bl*u),g=(m*Math.sin(this.gamma0)-_*Math.cos(this.gamma0))/f;i=Math.abs(Math.abs(g)-1)<=l?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-g)/(1+g))/this.bl,e=Math.abs(Math.cos(this.bl*u))<=l?this.al*this.bl*u:this.al*Math.atan2(m*Math.cos(this.gamma0)+_*Math.sin(this.gamma0),Math.cos(this.bl*u))/this.bl}return this.no_rot?(t.x=this.x0+e,t.y=this.y0+i):(e-=this.uc,t.x=this.x0+i*Math.cos(this.alpha)+e*Math.sin(this.alpha),t.y=this.y0+e*Math.cos(this.alpha)-i*Math.sin(this.alpha)),t},i.inverse=function(t){var e,i;this.no_rot?(i=t.y-this.y0,e=t.x-this.x0):(i=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),e=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),e+=this.uc);var n=Math.exp(-1*this.bl*i/this.al),a=.5*(n-1/n),c=.5*(n+1/n),h=Math.sin(this.bl*e/this.al),u=(h*Math.cos(this.gamma0)+a*Math.sin(this.gamma0))/c,d=Math.pow(this.el/Math.sqrt((1+u)/(1-u)),1/this.bl);return Math.abs(u-1)r?(r=Math.sin(e),i=this.long0+t.x*Math.sqrt(1-this.es*r*r)/(this.a*Math.cos(e)),s=n(i)):c>r-h&&(s=this.long0)),t.x=s,t.y=e,t},i.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],58:[function(t,e,i){i.init=function(){var t=this.lat0;this.lambda0=this.long0;var e=Math.sin(t),i=this.a,n=this.rf,o=1/n,s=2*o-Math.pow(o,2),r=this.e=Math.sqrt(s);this.R=this.k0*i*Math.sqrt(1-s)/(1-s*Math.pow(e,2)),this.alpha=Math.sqrt(1+s/(1-s)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(e/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),l=Math.log(Math.tan(Math.PI/4+t/2)),c=Math.log((1+r*e)/(1-r*e));this.K=a-this.alpha*l+this.alpha*r/2*c},i.forward=function(t){var e=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),n=-this.alpha*(e+i)+this.K,o=2*(Math.atan(Math.exp(n))-Math.PI/4),s=this.alpha*(t.x-this.lambda0),r=Math.atan(Math.sin(s)/(Math.sin(this.b0)*Math.tan(o)+Math.cos(this.b0)*Math.cos(s))),a=Math.asin(Math.cos(this.b0)*Math.sin(o)-Math.sin(this.b0)*Math.cos(o)*Math.cos(s));return t.y=this.R/2*Math.log((1+Math.sin(a))/(1-Math.sin(a)))+this.y0,t.x=this.R*r+this.x0,t},i.inverse=function(t){for(var e=t.x-this.x0,i=t.y-this.y0,n=e/this.R,o=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),s=Math.asin(Math.cos(this.b0)*Math.sin(o)+Math.sin(this.b0)*Math.cos(o)*Math.cos(n)),r=Math.atan(Math.sin(n)/(Math.cos(this.b0)*Math.cos(n)-Math.sin(this.b0)*Math.tan(o))),a=this.lambda0+r/this.alpha,l=0,c=s,h=-1e3,u=0;Math.abs(c-h)>1e-7;){if(++u>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+s/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(c))/2)),h=c,c=2*Math.atan(Math.exp(l))-Math.PI/2}return t.x=a,t.y=c,t},i.names=["somerc"]},{}],59:[function(t,e,i){var n=Math.PI/2,o=1e-10,s=t("../common/sign"),r=t("../common/msfnz"),a=t("../common/tsfnz"),l=t("../common/phi2z"),c=t("../common/adjust_lon");i.ssfn_=function(t,e,i){return e*=i,Math.tan(.5*(n+t))*Math.pow((1-e)/(1+e),.5*i)},i.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)<=o&&(this.k0=.5*(1+s(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=o&&(this.con=this.lat0>0?1:-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)<=o&&(this.k0=.5*this.cons*r(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/a(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=r(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-n,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},i.forward=function(t){var e,i,s,r,l,h,u=t.x,d=t.y,p=Math.sin(d),m=Math.cos(d),f=c(u-this.long0);return Math.abs(Math.abs(u-this.long0)-Math.PI)<=o&&Math.abs(d+this.lat0)<=o?(t.x=NaN,t.y=NaN,t):this.sphere?(e=2*this.k0/(1+this.sinlat0*p+this.coslat0*m*Math.cos(f)),t.x=this.a*e*m*Math.sin(f)+this.x0,t.y=this.a*e*(this.coslat0*p-this.sinlat0*m*Math.cos(f))+this.y0,t):(i=2*Math.atan(this.ssfn_(d,p,this.e))-n,r=Math.cos(i),s=Math.sin(i),Math.abs(this.coslat0)<=o?(l=a(this.e,d*this.con,this.con*p),h=2*this.a*this.k0*l/this.cons,t.x=this.x0+h*Math.sin(u-this.long0),t.y=this.y0-this.con*h*Math.cos(u-this.long0),t):(Math.abs(this.sinlat0)=h?(t.x=e,t.y=i,t):(i=Math.asin(Math.cos(u)*this.sinlat0+t.y*Math.sin(u)*this.coslat0/h),e=c(Math.abs(this.coslat0)0?this.long0+Math.atan2(t.x,-1*t.y):this.long0+Math.atan2(t.x,t.y):this.long0+Math.atan2(t.x*Math.sin(u),h*this.coslat0*Math.cos(u)-t.y*this.sinlat0*Math.sin(u))),t.x=e,t.y=i,t)}if(Math.abs(this.coslat0)<=o){if(o>=h)return i=this.lat0,e=this.long0,t.x=e,t.y=i,t;t.x*=this.con,t.y*=this.con,s=h*this.cons/(2*this.a*this.k0),i=this.con*l(this.e,s),e=this.con*c(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else r=2*Math.atan(h*this.cosX0/(2*this.a*this.k0*this.ms1)),e=this.long0,o>=h?a=this.X0:(a=Math.asin(Math.cos(r)*this.sinX0+t.y*Math.sin(r)*this.cosX0/h),e=c(this.long0+Math.atan2(t.x*Math.sin(r),h*this.cosX0*Math.cos(r)-t.y*this.sinX0*Math.sin(r)))),i=-1*l(this.e,Math.tan(.5*(n+a)));return t.x=e,t.y=i,t},i.names=["stere"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],60:[function(t,e,i){var n=t("./gauss"),o=t("../common/adjust_lon");i.init=function(){n.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"))},i.forward=function(t){var e,i,s,r;return t.x=o(t.x-this.long0),n.forward.apply(this,[t]),e=Math.sin(t.y),i=Math.cos(t.y),s=Math.cos(t.x),r=this.k0*this.R2/(1+this.sinc0*e+this.cosc0*i*s),t.x=r*i*Math.sin(t.x),t.y=r*(this.cosc0*e-this.sinc0*i*s),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},i.inverse=function(t){var e,i,s,r,a;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,a=Math.sqrt(t.x*t.x+t.y*t.y)){var l=2*Math.atan2(a,this.R2);e=Math.sin(l),i=Math.cos(l),r=Math.asin(i*this.sinc0+t.y*e*this.cosc0/a),s=Math.atan2(t.x*e,a*this.cosc0*i-t.y*this.sinc0*e)}else r=this.phic0,s=0;return t.x=s,t.y=r,n.inverse.apply(this,[t]),t.x=o(t.x+this.long0),t},i.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":45}],61:[function(t,e,i){var n=t("../common/e0fn"),o=t("../common/e1fn"),s=t("../common/e2fn"),r=t("../common/e3fn"),a=t("../common/mlfn"),l=t("../common/adjust_lon"),c=Math.PI/2,h=1e-10,u=t("../common/sign"),d=t("../common/asinz");i.init=function(){this.e0=n(this.es),this.e1=o(this.es),this.e2=s(this.es),this.e3=r(this.es),this.ml0=this.a*a(this.e0,this.e1,this.e2,this.e3,this.lat0)},i.forward=function(t){var e,i,n,o=t.x,s=t.y,r=l(o-this.long0),c=Math.sin(s),h=Math.cos(s);if(this.sphere){var u=h*Math.sin(r);if(Math.abs(Math.abs(u)-1)<1e-10)return 93;i=.5*this.a*this.k0*Math.log((1+u)/(1-u)),e=Math.acos(h*Math.cos(r)/Math.sqrt(1-u*u)),0>s&&(e=-e),n=this.a*this.k0*(e-this.lat0)}else{var d=h*r,p=Math.pow(d,2),m=this.ep2*Math.pow(h,2),f=Math.tan(s),_=Math.pow(f,2);e=1-this.es*Math.pow(c,2);var g=this.a/Math.sqrt(e),v=this.a*a(this.e0,this.e1,this.e2,this.e3,s);i=this.k0*g*d*(1+p/6*(1-_+m+p/20*(5-18*_+Math.pow(_,2)+72*m-58*this.ep2)))+this.x0,n=this.k0*(v-this.ml0+g*f*p*(.5+p/24*(5-_+9*m+4*Math.pow(m,2)+p/30*(61-58*_+Math.pow(_,2)+600*m-330*this.ep2))))+this.y0}return t.x=i,t.y=n,t},i.inverse=function(t){var e,i,n,o,s,r,a=6;if(this.sphere){var p=Math.exp(t.x/(this.a*this.k0)),m=.5*(p-1/p),f=this.lat0+t.y/(this.a*this.k0),_=Math.cos(f);e=Math.sqrt((1-_*_)/(1+m*m)),s=d(e),0>f&&(s=-s),r=0===m&&0===_?this.long0:l(Math.atan2(m,_)+this.long0)}else{var g=t.x-this.x0,v=t.y-this.y0;for(e=(this.ml0+v/this.k0)/this.a,i=e,o=0;n=(e+this.e1*Math.sin(2*i)-this.e2*Math.sin(4*i)+this.e3*Math.sin(6*i))/this.e0-i,i+=n,!(Math.abs(n)<=h);o++)if(o>=a)return 95;if(Math.abs(i)=0?this.y0+Math.PI*this.R*Math.tan(.5*h):this.y0+Math.PI*this.R*-Math.tan(.5*h));var u=.5*Math.abs(Math.PI/c-c/Math.PI),d=u*u,p=Math.sin(h),m=Math.cos(h),f=m/(p+m-1),_=f*f,g=f*(2/p-1),v=g*g,y=Math.PI*this.R*(u*(f-v)+Math.sqrt(d*(f-v)*(f-v)-(v+d)*(_-v)))/(v+d);0>c&&(y=-y),e=this.x0+y;var E=d+f;return y=Math.PI*this.R*(g*E-u*Math.sqrt((v+d)*(d+1)-E*E))/(v+d),i=l>=0?this.y0+y:this.y0-y,t.x=e,t.y=i,t},i.inverse=function(t){var e,i,o,r,a,l,c,h,u,d,p,m,f;return t.x-=this.x0,t.y-=this.y0,p=Math.PI*this.R,o=t.x/p,r=t.y/p,a=o*o+r*r,l=-Math.abs(r)*(1+a),c=l-2*r*r+o*o,h=-2*l+1+2*r*r+a*a,f=r*r/h+(2*c*c*c/h/h/h-9*l*c/h/h)/27,u=(l-c*c/3/h)/h,d=2*Math.sqrt(-u/3),p=3*f/u/d,Math.abs(p)>1&&(p=p>=0?1:-1),m=Math.acos(p)/3,i=t.y>=0?(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI:-(-d*Math.cos(m+Math.PI/3)-c/3/h)*Math.PI,e=Math.abs(o)-1?(e[o]={name:t[0].toLowerCase(),convert:t[1]},3===t.length&&(e[o].auth=t[2])):"SPHEROID"===o?(e[o]={name:t[0],a:t[1],rf:t[2]},4===t.length&&(e[o].auth=t[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(o)>-1?(t[0]=["name",t[0]],i(e,o,t)):t.every(function(t){return Array.isArray(t)})?i(e,o,t):n(t,e[o])):e[o]=!0)):void(e[t]=!0)}function o(t,e){var i=e[0],n=e[1];!(i in t)&&n in t&&(t[i]=t[n],3===e.length&&(t[i]=e[2](t[i])))}function s(t){return t*a}function r(t){function e(e){var i=t.to_meter||1;return parseFloat(e,10)*i}"GEOGCS"===t.type?t.projName="longlat":"LOCAL_CS"===t.type?(t.projName="identity",t.local=!0):t.projName="object"==typeof t.PROJECTION?Object.keys(t.PROJECTION)[0]:t.PROJECTION,t.UNIT&&(t.units=t.UNIT.name.toLowerCase(),"metre"===t.units&&(t.units="meter"),t.UNIT.convert&&(t.to_meter=parseFloat(t.UNIT.convert,10))),t.GEOGCS&&(t.datumCode=t.GEOGCS.DATUM?t.GEOGCS.DATUM.name.toLowerCase():t.GEOGCS.name.toLowerCase(),"d_"===t.datumCode.slice(0,2)&&(t.datumCode=t.datumCode.slice(2)),("new_zealand_geodetic_datum_1949"===t.datumCode||"new_zealand_1949"===t.datumCode)&&(t.datumCode="nzgd49"),"wgs_1984"===t.datumCode&&("Mercator_Auxiliary_Sphere"===t.PROJECTION&&(t.sphere=!0),t.datumCode="wgs84"),"_ferro"===t.datumCode.slice(-6)&&(t.datumCode=t.datumCode.slice(0,-6)),"_jakarta"===t.datumCode.slice(-8)&&(t.datumCode=t.datumCode.slice(0,-8)),~t.datumCode.indexOf("belge")&&(t.datumCode="rnb72"),t.GEOGCS.DATUM&&t.GEOGCS.DATUM.SPHEROID&&(t.ellps=t.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===t.ellps.toLowerCase().slice(0,13)&&(t.ellps="intl"),t.a=t.GEOGCS.DATUM.SPHEROID.a,t.rf=parseFloat(t.GEOGCS.DATUM.SPHEROID.rf,10)),~t.datumCode.indexOf("osgb_1936")&&(t.datumCode="osgb36")),t.b&&!isFinite(t.b)&&(t.b=t.a);var i=function(e){return o(t,e)},n=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",s],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",s],["x0","false_easting",e],["y0","false_northing",e],["long0","central_meridian",s],["lat0","latitude_of_origin",s],["lat0","standard_parallel_1",s],["lat1","standard_parallel_1",s],["lat2","standard_parallel_2",s],["alpha","azimuth",s],["srsCode","name"]];n.forEach(i),t.long0||!t.longc||"Albers_Conic_Equal_Area"!==t.PROJECTION&&"Lambert_Azimuthal_Equal_Area"!==t.PROJECTION||(t.long0=t.longc)}var a=.017453292519943295,l=t("./extend");e.exports=function(t,e){var i=JSON.parse((","+t).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]')),o=i.shift(),s=i.shift();i.unshift(["name",s]),i.unshift(["type",o]),i.unshift("output");var a={};return n(i,a),r(a.output),l(e,a.output)}},{"./extend":33}],66:[function(t,e,i){function n(t){return t*(Math.PI/180)}function o(t){return 180*(t/Math.PI)}function s(t){var e,i,o,s,r,l,c,h,u,d=t.lat,p=t.lon,m=6378137,f=.00669438,_=.9996,g=n(d),v=n(p);u=Math.floor((p+180)/6)+1,180===p&&(u=60),d>=56&&64>d&&p>=3&&12>p&&(u=32),d>=72&&84>d&&(p>=0&&9>p?u=31:p>=9&&21>p?u=33:p>=21&&33>p?u=35:p>=33&&42>p&&(u=37)),e=6*(u-1)-180+3,h=n(e),i=f/(1-f),o=m/Math.sqrt(1-f*Math.sin(g)*Math.sin(g)),s=Math.tan(g)*Math.tan(g),r=i*Math.cos(g)*Math.cos(g),l=Math.cos(g)*(v-h),c=m*((1-f/4-3*f*f/64-5*f*f*f/256)*g-(3*f/8+3*f*f/32+45*f*f*f/1024)*Math.sin(2*g)+(15*f*f/256+45*f*f*f/1024)*Math.sin(4*g)-35*f*f*f/3072*Math.sin(6*g));var y=_*o*(l+(1-s+r)*l*l*l/6+(5-18*s+s*s+72*r-58*i)*l*l*l*l*l/120)+5e5,E=_*(c+o*Math.tan(g)*(l*l/2+(5-s+9*r+4*r*r)*l*l*l*l/24+(61-58*s+s*s+600*r-330*i)*l*l*l*l*l*l/720));return 0>d&&(E+=1e7),{northing:Math.round(E),easting:Math.round(y),zoneNumber:u,zoneLetter:a(d)}}function r(t){var e=t.northing,i=t.easting,n=t.zoneLetter,s=t.zoneNumber;if(0>s||s>60)return null;var a,l,c,h,u,d,p,m,f,_,g=.9996,v=6378137,y=.00669438,E=(1-Math.sqrt(1-y))/(1+Math.sqrt(1-y)),P=i-5e5,C=e;"N">n&&(C-=1e7),m=6*(s-1)-180+3,a=y/(1-y),p=C/g,f=p/(v*(1-y/4-3*y*y/64-5*y*y*y/256)),_=f+(3*E/2-27*E*E*E/32)*Math.sin(2*f)+(21*E*E/16-55*E*E*E*E/32)*Math.sin(4*f)+151*E*E*E/96*Math.sin(6*f),l=v/Math.sqrt(1-y*Math.sin(_)*Math.sin(_)),c=Math.tan(_)*Math.tan(_),h=a*Math.cos(_)*Math.cos(_),u=v*(1-y)/Math.pow(1-y*Math.sin(_)*Math.sin(_),1.5),d=P/(l*g);var S=_-l*Math.tan(_)/u*(d*d/2-(5+3*c+10*h-4*h*h-9*a)*d*d*d*d/24+(61+90*c+298*h+45*c*c-252*a-3*h*h)*d*d*d*d*d*d/720);S=o(S);var M=(d-(1+2*c+h)*d*d*d/6+(5-2*h+28*c-3*h*h+8*a+24*c*c)*d*d*d*d*d/120)/Math.cos(_);M=m+o(M);var w;if(t.accuracy){var L=r({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});w={top:L.lat,right:L.lon,bottom:S,left:M}}else w={lat:S,lon:M};return w}function a(t){var e="Z";return 84>=t&&t>=72?e="X":72>t&&t>=64?e="W":64>t&&t>=56?e="V":56>t&&t>=48?e="U":48>t&&t>=40?e="T":40>t&&t>=32?e="S":32>t&&t>=24?e="R":24>t&&t>=16?e="Q":16>t&&t>=8?e="P":8>t&&t>=0?e="N":0>t&&t>=-8?e="M":-8>t&&t>=-16?e="L":-16>t&&t>=-24?e="K":-24>t&&t>=-32?e="J":-32>t&&t>=-40?e="H":-40>t&&t>=-48?e="G":-48>t&&t>=-56?e="F":-56>t&&t>=-64?e="E":-64>t&&t>=-72?e="D":-72>t&&t>=-80&&(e="C"),e}function l(t,e){var i=""+t.easting,n=""+t.northing;return t.zoneNumber+t.zoneLetter+c(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,e)+n.substr(n.length-5,e)}function c(t,e,i){var n=h(i),o=Math.floor(t/1e5),s=Math.floor(e/1e5)%20;return u(o,s,n)}function h(t){var e=t%_;return 0===e&&(e=_),e}function u(t,e,i){var n=i-1,o=g.charCodeAt(n),s=v.charCodeAt(n),r=o+t-1,a=s+e,l=!1;r>S&&(r=r-S+y-1,l=!0),(r===E||E>o&&r>E||(r>E||E>o)&&l)&&r++,(r===P||P>o&&r>P||(r>P||P>o)&&l)&&(r++,r===E&&r++),r>S&&(r=r-S+y-1),a>C?(a=a-C+y-1, +l=!0):l=!1,(a===E||E>s&&a>E||(a>E||E>s)&&l)&&a++,(a===P||P>s&&a>P||(a>P||P>s)&&l)&&(a++,a===E&&a++),a>C&&(a=a-C+y-1);var c=String.fromCharCode(r)+String.fromCharCode(a);return c}function d(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var e,i=t.length,n=null,o="",s=0;!/[A-Z]/.test(e=t.charAt(s));){if(s>=2)throw"MGRSPoint bad conversion from: "+t;o+=e,s++}var r=parseInt(o,10);if(0===s||s+3>i)throw"MGRSPoint bad conversion from: "+t;var a=t.charAt(s++);if("A">=a||"B"===a||"Y"===a||a>="Z"||"I"===a||"O"===a)throw"MGRSPoint zone letter "+a+" not handled: "+t;n=t.substring(s,s+=2);for(var l=h(r),c=p(n.charAt(0),l),u=m(n.charAt(1),l);u0&&(_=1e5/Math.pow(10,P),g=t.substring(s,s+P),C=parseFloat(g)*_,v=t.substring(s+P),S=parseFloat(v)*_),y=C+c,E=S+u,{easting:y,northing:E,zoneLetter:a,zoneNumber:r,accuracy:_}}function p(t,e){for(var i=g.charCodeAt(e-1),n=1e5,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>S){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function m(t,e){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=v.charCodeAt(e-1),n=0,o=!1;i!==t.charCodeAt(0);){if(i++,i===E&&i++,i===P&&i++,i>C){if(o)throw"Bad character: "+t;i=y,o=!0}n+=1e5}return n}function f(t){var e;switch(t){case"C":e=11e5;break;case"D":e=2e6;break;case"E":e=28e5;break;case"F":e=37e5;break;case"G":e=46e5;break;case"H":e=55e5;break;case"J":e=64e5;break;case"K":e=73e5;break;case"L":e=82e5;break;case"M":e=91e5;break;case"N":e=0;break;case"P":e=8e5;break;case"Q":e=17e5;break;case"R":e=26e5;break;case"S":e=35e5;break;case"T":e=44e5;break;case"U":e=53e5;break;case"V":e=62e5;break;case"W":e=7e6;break;case"X":e=79e5;break;default:e=-1}if(e>=0)return e;throw"Invalid zone letter: "+t}var _=6,g="AJSAJS",v="AFAFAF",y=65,E=73,P=79,C=86,S=90;i.forward=function(t,e){return e=e||5,l(s({lat:t[1],lon:t[0]}),e)},i.inverse=function(t){var e=r(d(t.toUpperCase()));return[e.left,e.bottom,e.right,e.top]},i.toPoint=function(t){var e=i.inverse(t);return[(e[2]+e[0])/2,(e[3]+e[1])/2]}},{}],67:[function(t,e){e.exports={name:"proj4",version:"2.2.1",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~3.24.5","grunt-browserify":"~1.3.0","grunt-contrib-uglify":"~0.3.2",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"0.0.0"}}},{}],"./includedProjections":[function(t,e){e.exports=t("gWUPNW")},{}],gWUPNW:[function(t,e){var i=[t("./lib/projections/tmerc"),t("./lib/projections/utm"),t("./lib/projections/sterea"),t("./lib/projections/stere"),t("./lib/projections/somerc"),t("./lib/projections/omerc"),t("./lib/projections/lcc"),t("./lib/projections/krovak"),t("./lib/projections/cass"),t("./lib/projections/laea"),t("./lib/projections/aea"),t("./lib/projections/gnom"),t("./lib/projections/cea"),t("./lib/projections/eqc"),t("./lib/projections/poly"),t("./lib/projections/nzmg"),t("./lib/projections/mill"),t("./lib/projections/sinu"),t("./lib/projections/moll"),t("./lib/projections/eqdc"),t("./lib/projections/vandg"),t("./lib/projections/aeqd")];e.exports=function(t){i.forEach(function(e){t.Proj.projections.add(e)})}},{"./lib/projections/aea":39,"./lib/projections/aeqd":40,"./lib/projections/cass":41,"./lib/projections/cea":42,"./lib/projections/eqc":43,"./lib/projections/eqdc":44,"./lib/projections/gnom":46,"./lib/projections/krovak":47,"./lib/projections/laea":48,"./lib/projections/lcc":49,"./lib/projections/mill":52,"./lib/projections/moll":53,"./lib/projections/nzmg":54,"./lib/projections/omerc":55,"./lib/projections/poly":56,"./lib/projections/sinu":57,"./lib/projections/somerc":58,"./lib/projections/stere":59,"./lib/projections/sterea":60,"./lib/projections/tmerc":61,"./lib/projections/utm":62,"./lib/projections/vandg":63}]},{},[35])(35)}),!function(t,e){proj4leaflet07x=function(t,i){return"function"==typeof e?e(t,i):e}(leaflet,proj4)}(this,function(t,e){return t.Proj={},t.Proj._isProj4Obj=function(t){return"undefined"!=typeof t.inverse&&"undefined"!=typeof t.forward},t.Proj.ScaleDependantTransformation=function(t){this.scaleTransforms=t},t.Proj.ScaleDependantTransformation.prototype.transform=function(t,e){return this.scaleTransforms[e].transform(t,e)},t.Proj.ScaleDependantTransformation.prototype.untransform=function(t,e){return this.scaleTransforms[e].untransform(t,e)},t.Proj.Projection=t.Class.extend({initialize:function(i,n){if(t.Proj._isProj4Obj(i))this._proj=i;else{var o=i;if(n)e.defs(o,n);else if(void 0===e.defs[o]){var s=o.split(":");if(s.length>3&&(o=s[s.length-3]+":"+s[s.length-1]),void 0===e.defs[o])throw"No projection definition for code "+o}this._proj=e(o)}},project:function(e){var i=this._proj.forward([e.lng,e.lat]);return new t.Point(i[0],i[1])},unproject:function(e,i){var n=this._proj.inverse([e.x,e.y]);return new t.LatLng(n[1],n[0],i)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},getSize:function(e){var i,n,o,s=this.options.bounds;return s?(i=this.scale(e),n=this.transformation.transform(s.min,i),o=this.transformation.transform(s.max,i),t.point(Math.abs(o.x-n.x),Math.abs(o.y-n.y))):(i=256*Math.pow(2,e),t.point(i,i))}}),t.Proj.CRS.TMS=t.Proj.CRS.extend({options:{tileSize:256},initialize:function(e,i,n,o){var s,r,a,l,c;t.Proj._isProj4Obj(e)?(a=e,l=i,c=n||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,a,c)):(s=e,r=i,l=n,c=o||{},c.origin=[l[0],l[3]],t.Proj.CRS.prototype.initialize.call(this,s,r,c)),this.projectedBounds=l,this._sizes=this._calculateSizes()},_calculateSizes:function(){var e,i,n,o,s=[],r=this.projectedBounds;for(i=this._scales.length-1;i>=0;i--)this._scales[i]&&(e=this.options.tileSize/this._scales[i],n=Math.ceil(parseFloat((r[2]-r[0])/e).toPrecision(3))*e*this._scales[i],o=Math.ceil(parseFloat((r[3]-r[1])/e).toPrecision(3))*e*this._scales[i],s[i]=t.point(n,o));return s},getSize:function(t){return this._sizes[t]}}),t.Proj.TileLayer={},t.Proj.TileLayer.TMS=t.TileLayer.extend({options:{continuousWorld:!0},initialize:function(e,i,n){var o,s,r,a,l=!0;if(!(i instanceof t.Proj.CRS.TMS))throw"CRS is not L.Proj.CRS.TMS.";for(t.TileLayer.prototype.initialize.call(this,e,n),this.options.tms=!1,this.crs=i,r=this.crs.projectedBounds,a=this.options.minZoom;a.001}if(!l){for(o={},a=this.options.minZoom;a3&&(t=n[n.length-3]+":"+n[n.length-1]),void 0===e.defs[t])throw"No projection definition for code "+t}return e(t)}}),t.Proj.CRS=t.Class.extend({includes:t.CRS,options:{transformation:new t.Transformation(1,0,-1,0)},initialize:function(e,i,n){var o,s,r,a;if(t.Proj._isProj4Obj(e)?(s=e,o=s.srsCode,a=i||{},this.projection=new t.Proj.Projection(s,a.bounds)):(o=e,r=i,a=n||{},this.projection=new t.Proj.Projection(o,r,a.bounds)),t.Util.setOptions(this,a),this.code=o,this.transformation=this.options.transformation,this.options.origin&&(this.transformation=new t.Transformation(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales)this._scales=this.options.scales;else if(this.options.resolutions){this._scales=[];for(var l=this.options.resolutions.length-1;l>=0;l--)this.options.resolutions[l]&&(this._scales[l]=1/this.options.resolutions[l])}this.infinite=!this.options.bounds},scale:function(t){var e,i,n,o,s=Math.floor(t);return t===s?this._scales[t]:(e=this._scales[s],i=this._scales[s+1],n=i-e,o=t-s,e+n*o)},zoom:function(t){var e,i,n=this._closestElement(this._scales,t),o=this._scales.indexOf(n);return t===n?o:(e=o+1,i=this._scales[e]-n,(t-n)/i+o)},_closestElement:function(t,e){for(var i,n=t.length;n--;)t[n]<=e&&(void 0===i||io.geoBBox.right||e.getBounds()._southWest.lat>o.geoBBox.top||e.getBounds()._northEast.lng1e3&&(this._requestCircleFilter.radius=1e3),t.Util.extend(o,{filterOptions:{type:s,circle:this._requestCircleFilter}})),"extent"===this._currentGeocodingDelimitation.toLowerCase()&&this._requestBboxFilter&&t.Util.extend(o,{filterOptions:{type:s,bbox:this._requestBboxFilter}}),this._displayWaitingContainer(),n.Services.reverseGeocode(o)},_displayGeocodedLocations:function(t){if(this._clearLocations(),this._clearLocationsFeature(),this._reverseGeocodingLocations=t,!t||0===t.length)return void this._clearInputRequest();this._formContainer.className="GPreverseGeocodingComponentHidden",this._hideWaitingContainer(),this._panelTitleContainer.innerHTML="Résultats de la recherche",this._returnPictoContainer.className="",this._resultsContainer.className="GPpanel",this._fillGeocodedLocationListContainer(t),this._displayGeocodedLocationsOnMap(t);var e=this._map;e.fitBounds(this._inputResultsLayer.getBounds())},_fillGeocodedLocationListContainer:function(t){for(var e=0;e",d=l.placeAttributes;for(var p in d)d.hasOwnProperty(p)&&"bbox"!==p&&(u+="
  • ",u+=''+p.toUpperCase()+" : ",u+=d[p],u+="
  • ");u+=" ",h.bindPopup(u),h.on("mouseover",i),h.on("mouseout",n),this._inputResultsLayer.addLayer(h)}}},onShowReverseGeocodingClick:function(){var t=this._map;this._showReverseGeocodingContainer.checked?this._removeMapInteraction(t):this._waiting||this._reverseGeocodingLocations.length||this._activateMapInteraction(t)},onReverseGeocodingTypeChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;i&&(this._currentGeocodingType=i)},onReverseGeocodingDelimitationChange:function(t){var e=t.target.selectedIndex,i=t.target.options[e].value;if(i){this._currentGeocodingDelimitation=i,this._clearInputRequest();var n=this._map;this._removeMapInteraction(n),this._activateMapInteraction(n)}},onGPreverseGeocodingReturnPictoClick:function(){this._clearLocations(),this._clearLocationsFeature(),this._clearInputRequest(),this._activateMapInteraction(this._map)},onReverseGeocodingSubmit:function(){if(this._requestPosition&&!this._noRightManagement){var t=this;this._reverseGeocodingRequest({position:t._requestPosition,filterOptions:{type:[t._currentGeocodingType]},onSuccess:function(e){if(e){var i=e.locations;t._displayGeocodedLocations(i),t._hideWaitingContainer()}},onFailure:function(e){t._hideWaitingContainer(),t._clearLocations(),t._clearLocationsFeature(),t._clearInputRequest()}})}},onReverseGeocodingResultClick:function(t){},onReverseGeocodingResultMouseOver:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.add("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseover")})},onReverseGeocodingResultMouseOut:function(t){var e=s.index(t.target.id);t.target.classList&&t.target.classList.remove("GPreverseGeocodedLocationHighlight"),this._inputResultsLayer&&this._inputResultsLayer.eachLayer(function(t){t.options.id===parseInt(e,10)&&t.fire("mouseout")})},_clearLocations:function(){if(this._reverseGeocodingLocations=[],this._resultsListContainer)for(;this._resultsListContainer.firstChild;)this._resultsListContainer.removeChild(this._resultsListContainer.firstChild)},_clearLocationsFeature:function(){var t=this._map;null!==this._inputResultsLayer&&(t.removeLayer(this._inputResultsLayer),this._inputResultsLayer=null)},_clearInputRequest:function(){this._requestPosition=null,this._requestCircleFilter=null,this._requestBboxFilter=null},_displayWaitingContainer:function(){this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerVisible",this._waiting=!0,this._timer&&(clearTimeout(this._timer),this._timer=null);var t=this;this._timer=setTimeout(function(){t._waiting===!0?t._hideWaitingContainer():t._timer&&clearTimeout(t._timer)},16e3)},_hideWaitingContainer:function(){this._waiting&&(this._waitingContainer.className="GPreverseGeocodingCalcWaitingContainerHidden",this._waiting=!1,clearTimeout(this._timer),this._timer=null)}});return l}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsUtilsIconDefault,CommonControlsReverseGeocodingDOM),CommonControlsRouteDOM=function(t){var e={_addUID:function(t){return t+"-"+this._uid},_createMainContainerElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProute"),t.className="GPwidget",t},_createShowRouteElement:function(){var t=document.createElement("input");return t.id=this._addUID("GPshowRoute"),t.type="checkbox",t},_createShowRoutePictoElement:function(){var t=this,e=document.createElement("label");e.id=this._addUID("GPshowRoutePicto"),e.className="GPshowAdvancedToolPicto",e.htmlFor=this._addUID("GPshowRoute"),e.title="Ouvrir le calcul d'itinéraire",e.addEventListener?e.addEventListener("click",function(e){t.onShowRoutePanelClick(e)}):e.attachEvent&&e.attachEvent("onclick",function(e){t.onShowRoutePanelClick(e)});var i=document.createElement("span");return i.id=this._addUID("GPshowRouteOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createRoutePanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProutePanel"),t.className="GPpanel",t},_createRoutePanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Calcul d'itinéraire",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GProutePanelClose"),n.className="GPpanelClose",n.title="Masquer le panneau",n.addEventListener?n.addEventListener("click",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()},!1):n.attachEvent&&n.attachEvent("onclick",function(){document.getElementById(t._addUID("GPshowRoutePicto")).click()}),e.appendChild(n),e},_createRoutePanelFormElement:function(){var e=this,i=document.createElement("form");return i.id=this._addUID("GProuteForm"),i.setAttribute("onkeypress","return event.keyCode != 13;"),i.addEventListener("submit",function(i){console.log(i),i.preventDefault();var n=document.getElementsByClassName(e._addUID("GPlocationPoint")),o=n[0].childNodes[0].id,s=n[n.length-1].childNodes[0].id,r=t.index(o),a=t.index(s);if(""==document.getElementById(e._addUID("GPlocationOrigin_"+r)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+r)).value||""==document.getElementById(e._addUID("GPlocationOrigin_"+a)).value&&""==document.getElementById(e._addUID("GPlocationOriginCoords_"+a)).value)return!1;var l;document.getElementById(e._addUID("GProuteResultsStages")).innerHTML="";for(var c=0;c2?document.getElementById("GProuteAutoCompleteList"+i).style.display="block":document.getElementById("GProuteAutoCompleteList"+i).style.display="none",n.onAutoCompleteSearchText(t)}}),r.addEventListener("blur",function(){var t=this.id.charAt(this.id.length-1);document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),o.appendChild(r);var a=document.createElement("input");a.id="GProuteOriginCoords"+t,a.className="GProuteOriginHidden",a.type="text",a.disabled=!0,o.appendChild(a);var l=document.createElement("input");l.id="GProuteOriginPointer"+t,l.type="checkbox",o.appendChild(l);var c=document.createElement("label");return c.id="GProuteOriginPointerImg"+t,c.htmlFor="GProuteOriginPointer"+t,c.className="GProuteOriginPointerImg",c.title="Pointer un lieu sur la carte",c.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var e,i=this.id.charAt(this.id.length-1);for(e=1;e<8;e++)i!=e&&(document.getElementById("GProuteOriginPointer"+e).checked=!1,"Pointer un lieu sur la carte"==document.getElementById("GProuteOriginCoords"+e).value&&(document.getElementById("GProuteOriginCoords"+e).value="",document.getElementById("GProuteOrigin"+e).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+e).className="GProuteOriginHidden"));if(document.getElementById("GProuteOriginPointer"+i).checked){for(document.getElementById("GProuteOriginCoords"+i).value="",e=1;e<8;e++)document.getElementById("GProutePoint"+e).style.display="flex";document.getElementById("GProuteForm").className="",document.getElementById("GProuteOriginPointer"+i).checked=!1,document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden"}else{for(document.getElementById("GProuteOriginCoords"+i).value="Pointer un lieu sur la carte",e=1;e<8;e++)i==e?document.getElementById("GProutePoint"+e).style.display="flex":document.getElementById("GProutePoint"+e).style.display="none";document.getElementById("GProuteForm").className="GProuteFormMini",document.getElementById("GProuteOriginPointer"+i).checked=!0,document.getElementById("GProuteOrigin"+i).className="GProuteOriginHidden",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginVisible"}n.onRouteMapPointClick(t)}),o.appendChild(c),o},_createRoutePanelFormRemoveStageElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteStageRemove"+t,i.className="GProuteStageRemove",i.title="Supprimer l'étape",1!=t&&7!=t&&i.addEventListener("click",function(t){var i=this.id.charAt(this.id.length-1);document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInputHidden",document.getElementById("GProuteOrigin"+i).value="",document.getElementById("GProuteOrigin"+i).className="GProuteOriginVisible",document.getElementById("GProuteOriginCoords"+i).value="",document.getElementById("GProuteOriginCoords"+i).className="GProuteOriginHidden",document.getElementById("GProuteStageAdd").style.display="";var n=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(n,10)-33).toString()+"px",e.onRouteRemovePointClick(t)}),i},_createRoutePanelFormAddStageElement:function(){var t=this,e=document.createElement("div");return e.id="GProuteStageAdd",e.title="Ajouter une étape",e.addEventListener("click",function(e){for(var i=1,n=0,o=2;o<7;o++)"GPflexInput GProuteStageFlexInputHidden"==document.getElementById("GProutePoint"+o).className?1==i&&(i=o):n++;if(i<7){document.getElementById("GProutePoint"+i).className="GPflexInput GProuteStageFlexInput";var s=document.getElementById("GPshowRouteExclusionsPicto").style.top;document.getElementById("GPshowRouteExclusionsPicto").style.top=(parseInt(s,10)+33).toString()+"px"}4==n&&(document.getElementById("GProuteStageAdd").style.display="none"),t.onRouteAddPointClick(e)}),e},_createRoutePanelFormAutoCompleteListElement:function(t){var e=this,i=document.createElement("div");return i.id="GProuteAutoCompleteList"+t,i.className="GPadvancedAutoCompleteList",i.addEventListener?i.addEventListener("click",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"},!1):i.attachEvent&&i.attachEvent("onclick",function(i){e.onAutoCompletedResultsItemClick(i),document.getElementById("GProuteAutoCompleteList"+t).style.display="none"}),i},_createRouteAutoCompletedLocationElement:function(t,e,i){var n=document.getElementById("GProuteAutoCompleteList"+e),o=document.createElement("div");o.id="AutoCompletedLocation"+i,o.className="GPautoCompleteProposal",o.innerHTML=t.fullText,n.appendChild(o)},_createRoutePanelFormModeChoiceElement:function(){var t=document.createElement("div");return t.id=this._addUID("GProuteModeChoice"),t},_createRoutePanelFormModeChoiceTransportElement:function(t){var e=this,i=document.createElement("div");i.id=this._addUID("GProuteTransportChoice");var n=document.createElement("span");n.className="GProuteModeLabel",n.innerHTML="Mode de transport",i.appendChild(n);for(var o=0;o2?document.getElementById(t._addUID("GPautoCompleteList")).style.display="block":document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",t.onAutoCompleteSearchText(e))}),i.addEventListener("keydown",function(t){return}),e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPsearchInputReset"),n.addEventListener("click",function(){document.getElementById(t._addUID("GPsearchInputText")).value="",document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",t.onSearchResetClick()}),e.appendChild(n),e},_createShowAdvancedSearchElement:function(){var t=this,e=document.createElement("div");e.id=this._addUID("GPshowAdvancedSearch"),e.className="GPshowAdvancedToolPicto",e.title="Ouvrir la recherche avancée",e.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!0,document.getElementById(t._addUID("GPautoCompleteList")).style.display="none",document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="none",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="inline-block"});var i=document.createElement("span");return i.id=this._addUID("GPshowAdvancedSearchOpen"),i.className="GPshowAdvancedToolOpen",e.appendChild(i),e},_createAdvancedSearchPanelElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPadvancedSearchPanel"),t.className="GPpanel",t.style.display="none",t},_createGeocodeResultsElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPgeocodeResultsList"),t.className="GPpanel",t.style.display="none",t.appendChild(this._createGeocodeResultsHeaderElement()),t},_createAutoCompleteElement:function(){var t=document.createElement("div");return t.id=this._addUID("GPautoCompleteList"),t.className="GPautoCompleteList",t.style.display="none",t},_createAutoCompleteListElement:function(){var t=this,e=document.createElement("div");return e.id=this._addUID("GPautocompleteResults"),e.addEventListener?e.addEventListener("click",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"},!1):e.attachEvent&&e.attachEvent("onclick",function(e){t.onAutoCompletedResultsItemClick(e),document.getElementById(t._addUID("GPautoCompleteList")).style.display="none"}),e},_createAutoCompletedLocationElement:function(t,e){var i=document.getElementById(this._addUID("GPautocompleteResults")),n=document.createElement("div");n.id=this._addUID("AutoCompletedLocation_"+e),n.className="GPautoCompleteProposal",n.innerHTML=t.fullText,n.addEventListener?n.addEventListener("click",function(t){i.click(t)},!1):n.attachEvent&&n.attachEvent("onclick",function(t){i.click(t)}),i.appendChild(n)},_createAdvancedSearchPanelHeaderElement:function(){var t=this,e=document.createElement("div");e.className="GPpanelHeader";var i=document.createElement("div");i.className="GPpanelTitle",i.innerHTML="Recherche avancée",e.appendChild(i);var n=document.createElement("div");return n.id=this._addUID("GPadvancedSearchClose"),n.className="GPpanelClose",n.title="Fermer la recherche avancée",n.addEventListener?n.addEventListener("click",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"},!1):n.attachEvent&&n.attachEvent("onclick",function(){var e="#GPsearchInput-"+t._uid;document.querySelector(e+" input").disabled=!1,document.getElementById(t._addUID("GPgeocodeResultsList")).style.display="none",document.getElementById(t._addUID("GPshowAdvancedSearch")).style.display="inline-block",document.getElementById(t._addUID("GPadvancedSearchPanel")).style.display="none"}),e.appendChild(n),e},_createAdvancedSearchPanelFormElement:function(t){var e=this,i=document.createElement("form");i.id=this._addUID("GPadvancedSearchForm"),i.addEventListener("submit",function(t){t.preventDefault();for(var i=[],n="#GPadvancedSearchFilters-"+e._uid,o=document.querySelectorAll(n+" > div > div > input"),s=0;sa&&(n=a),n},_setMarker:function(e,i,n){var o=this._map;if(null!=this._marker&&(o.removeLayer(this._marker),this._marker=null),e){var s={clickable:!0,zIndexOffset:1e3};if(this._marker=t.marker(t.latLng(e.x,e.y),s),this._marker.addTo(o),n){var r=null;if("string"!=typeof i){var a=[];if("DirectGeocodedLocation"===i.service)if(i.fields.freeform)r=i.fields.freeform;else{for(var l=this._advancedSearchFilters[i.type],c=0;c100?o=1:i>10&&(o=10);for(var s=0;sr[0]-n?r:s,h=a(l.dist),u=c(l.z);g.select("#focusCircle").attr("cx",h).attr("cy",u),g.select("#focusLineX").attr("x1",h).attr("y1",c(_[0])).attr("x2",h).attr("y2",c(_[1])),g.select("#focusLineY").attr("x1",a(f[0])).attr("y1",u).attr("x2",a(f[1])).attr("y2",u),E._marker.setLatLng(t.latLng(l.lat,l.lon)),E._marker.update(),v.transition().duration(200).style("opacity",.9),v.html("Alt : "+l.z+" m
    Lon : "+l.lon+"
    Lat : "+l.lat).style("left",d3.event.pageX+"px").style("top",d3.event.pageY-28+"px")}),n._profile=d3.selectAll("rect.overlay")[0][0]},h.DISPLAY_PROFILE_LIB_AMCHARTS=function(t,e,i){if("undefined"==typeof AmCharts)return void console.log("Lib. AmCharts is not loaded !");AmCharts.addInitHandler(function(){}),i._profile=AmCharts.makeChart(e,{type:"serial",pathToImages:"http://cdn.amcharts.com/lib/3/images/",categoryField:"dist",autoMarginOffset:0,marginRight:10,marginTop:10,startDuration:0,color:"#5E5E5E",fontSize:10,theme:"light",thousandsSeparator:"",categoryAxis:{color:"#5E5E5E",gridPosition:"start",minHorizontalGap:40,tickPosition:"start",title:"Distance (km)",titleColor:"#5E5E5E",startOnAxis:!0},chartCursor:{animationDuration:0,bulletsEnabled:!0,bulletSize:10,categoryBalloonEnabled:!1,cursorColor:"#F90",graphBulletAlpha:1,graphBulletSize:1,zoomable:!1},trendLines:[],graphs:[{balloonColor:"#CCCCCC",balloonText:"[[title]] : [[value]]m
    (lat: [[lat]] / lon:[[lon]])",bullet:"round",bulletAlpha:0,bulletBorderColor:"#FFF",bulletBorderThickness:2,bulletColor:"#F90",bulletSize:6,hidden:!1,id:"AmGraph-1",fillAlphas:.4,fillColors:"#C77A04",lineAlpha:1,lineColor:"#C77A04",lineThickness:1,title:"Altitude",valueField:"z"}],guides:[],valueAxes:[{id:"ValueAxis-1",minVerticalGap:20,title:"Altitude (m)"}],allLabel:[],balloon:{borderColor:"#CCCCCC",borderThickness:1,fillColor:"#FFFFFF",showBullet:!0},titles:[],dataProvider:t});var n=t[0];i._activateProfilEvent(n)},h}(leaflet,leafletDraw,{},gp,CommonUtilsCheckRightManagement,CommonUtilsSelectorID,LeafletControlsLocationSelector,LeafletControlsUtilsPositionFormater,LeafletControlsUtilsIconDefault,CommonControlsElevationPathDOM),LeafletControlsLogo=function(t){var e=t.Control.extend({options:{position:"topright",picto:null,url:null,text:null,size:"30px"},initialize:function(e){t.setOptions(this,e)},onAdd:function(){var e=t.DomUtil.create("div","gp-control-logo",e),i=!(!this.options.url&&!this.options.text),n=null;i&&(n=t.DomUtil.create("a","",e),n.target="_blank",this.options.url&&(n.href=this.options.url,this.options.text?n.title=this.options.text:null)),i&&this.options.text&&(n.text=this.options.text);var o=!!this.options.picto,s=null;return o&&(s=i?t.DomUtil.create("img","",n):t.DomUtil.create("img","",e),s.src=this.options.picto,"string"==typeof this.options.size?s.style.height=s.style.width=this.options.size:(s.style.height=this.options.size.height,s.style.width=this.options.size.width)),e}});return e}(leaflet),LeafletControlsControls=function(t,e,i,n,o,s,r,a){var l={LayerSwitcher:function(e){return new t(e)},Isocurve:function(t){return new e(t)},MousePosition:function(t){return new i(t)},ReverseGeocode:function(t){return new n(t)},Route:function(t){return new o(t)},SearchEngine:function(t){return new s(t)},ElevationPath:function(t){return new r(t)},Logo:function(t){return new a(t)}};return l}(LeafletControlsLayerSwitcher,LeafletControlsIsocurve,LeafletControlsMousePosition,LeafletControlsReverseGeocoding,LeafletControlsRoute,LeafletControlsSearchEngine,LeafletControlsElevationPath,LeafletControlsLogo),CommonUtilsLayerUtils=function(){var t={getZoomLevelFromScaleDenominator:function(t,e){var i={};switch(e){case"EPSG:2154":i={0:104579.224549894,1:52277.5323537905,2:26135.4870785954,3:13066.8913818,4:6533.2286041135,5:3266.5595244627,6:1633.2660045974,7:816.629554986,8:408.3139146768,9:204.1567415109,10:102.0783167832,11:51.0391448966,12:25.5195690743,13:12.7597836936,14:6.379891636,15:3.1899457653,16:1.5949728695,17:.7974864315,18:.3987432149,19:.1993716073,20:.0996858037,21:.0498429018};break;default:i={0:156543.033928041,1:78271.51696402048,2:39135.758482010235,3:19567.87924100512,4:9783.93962050256,5:4891.96981025128,6:2445.98490512564,7:1222.99245256282,8:611.49622628141,9:305.7481131407048,10:152.8740565703525,11:76.43702828517624,12:38.21851414258813,13:19.10925707129406,14:9.554628535647032,15:4.777314267823516,16:2.388657133911758,17:1.194328566955879,18:.5971642834779395,19:.2985821417389697,20:.1492910708694849,21:.0746455354347424}}var n=28e-5*t;for(var o in i)if(i.hasOwnProperty(o)&&i[o]<=n)return o;return 0},getAttributions:function(t){var e=t.zoom,i=[];if(null!=t.originators&&t.visibility)for(var n,o=0,s=t.originators.length;oe&&(n=!1),n&&d&&d=1.3&&i.indexOf(this._crs.code)!==-1?[l.y,a.x,a.y,l.x].join(","):[a.x,l.y,l.x,a.y].join(","),h=t.Util.template(this._url,{s:this._getSubdomain(e)});return h+t.Util.getParamString(this.wmsParams,h,!0)+"&BBOX="+c}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersWMTS=function(t,e,i,n){var o=t.TileLayer.extend({includes:n,defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixset:"PM",format:"image/jpeg"},initialize:function(i,n){this._wmtsParams={},t.Util.extend(this._wmtsParams,this.defaultWmtsParams,n.paramsWmts), +t.TileLayer.prototype.initialize.call(this,e.Helper.normalyzeUrl(i,{"gp-leaflet-ext":"0.9.0"},!1),n.paramsNative),this._originators=n.originators,this._legends=n.legends,this._metadata=n.metadata,this._title=n.title,this._description=n.description,this._quicklookUrl=n.quicklookUrl,this._geoportal_id=0},onAdd:function(e){this._map=e,this._geoportal_id=t.stamp(this),t.TileLayer.prototype.onAdd.call(this,e),this.setVisible(!0),this.updateAttributions(e),e.on({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},onRemove:function(e){this._map=e,t.TileLayer.prototype.onRemove.call(this,e),this.setVisible(!1),this.removeAttributions(e),e.off({overlayremove:this._onRemoveLayer,overlayadd:this._onAddLayer,layerremove:this._onRemoveLayer,layeradd:this._onAddLayer,moveend:this._onMoveEndLayer},this)},getTileUrl:function(e){var i=this._getZoomForUrl(),n=t.Util.template(this._url,{s:this._getSubdomain(e)});return n+t.Util.getParamString(this._wmtsParams,n)+"&tilematrix="+i+"&tilerow="+e.y+"&tilecol="+e.x},setParams:function(e,i){return t.extend(this._wmtsParams,e),i||this.redraw(),this}});return o}(leaflet,gp,{},LeafletLayersLayerEvent),LeafletLayersLayers=function(t,e,i,n,o){var s={options:{},params:{},serviceUrl:"http://localhost?no-rights-found-for=[{layer}]",_initLogger:function(){},_initOptions:function(){if(!this.options||0===Object.keys(this.options))throw new Error("PARAM_MISSING : options !");if(!this.options.layer)throw new Error("PARAM_MISSING : layer !");this.options.apiKey||console.log("PARAM_MISSING : apiKey !")},_initParams:function(t){t||(t="WMTS"),this.params=i.get({key:this.options.apiKey,layer:this.options.layer,service:t}),this.params&&0!==Object.keys(this.params)||(this.params={},this.options.apiKey||console.log("WARNING PARAM_MISSING : parameter 'apiKey' is mandatory if the contract key configuration has not been loaded !"))},WMS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMS");var o=null;o=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/r/wms",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layers:this.options.layer,styles:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.3.0"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new n(o,{paramsNative:r,paramsWms:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||null,description:this.params.description||null,quicklookUrl:this.params.quicklookUrl||null})},WMTS:function(e,i){this._initLogger(),this.options=e||{},this._initOptions(),this.settings=i||{},this._initParams("WMTS");var n=null;n=this.params.key||this.options.apiKey?this.params.url||t.Util.template("http://wxs.ign.fr/{key}/geoportail/wmts",{key:this.params.key||this.options.apiKey}):t.Util.template(this.serviceUrl,{layer:this.options.layer});var s={layer:this.options.layer,style:this.params.styles||"normal",format:this.params.format||"image/jpeg",version:this.params.version||"1.0.0",tilematrixset:this.params.TMSLink||"PM"},r={minZoom:this.params.minZoom||1,maxZoom:this.params.maxZoom||21};return t.Util.extend(r,this.settings),new o(n,{paramsNative:r,paramsWmts:s,originators:this.params.originators||[],legends:this.params.legends||[],metadata:this.params.metadata||[],title:this.params.title||"",description:this.params.description||"",quicklookUrl:this.params.quicklookUrl||""})}};return s}(leaflet,{},LeafletLayersLayerConfig,LeafletLayersWMS,LeafletLayersWMTS),LeafletGpPluginLeaflet=function(t,e,i,n,o,s,r,a){return i.leafletExtVersion="0.9.0",i.leafletExtDate="2016-12-04",i.Register=a,t.geoportalLayer=s,t.geoportalControl=n,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_D3=o.DISPLAY_PROFILE_LIB_D3,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_LIB_AMCHARTS=o.DISPLAY_PROFILE_LIB_AMCHARTS,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_RAW=o.DISPLAY_PROFILE_RAW,t.geoportalControl.ElevationPath.DISPLAY_PROFILE_BY_DEFAULT=o.DISPLAY_PROFILE_BY_DEFAULT,t.geoportalCRS=r,t.geoportalCRS.EPSG2154=r.EPSG2154(),t.geoportalCRS.EPSG27572=r.EPSG27572(),t.geoportalCRS.EPSG4326=r.EPSG4326(),i}(leaflet,leafletDraw,gp,LeafletControlsControls,LeafletControlsElevationPath,LeafletLayersLayers,LeafletCRSCRS,CommonUtilsRegister),window.proj4=proj4; +return Gp; +})); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Control.Draw.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Control.Draw.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,118 @@ +/** + * @class L.Control.Draw + * @aka L.Draw + */ +L.Control.Draw = L.Control.extend({ + + // Options + options: { + position: 'topleft', + draw: {}, + edit: false + }, + + // @method initialize(): void + // Initializes draw control, toolbars from the options + initialize: function (options) { + if (L.version < '0.7') { + throw new Error('Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/'); + } + + L.Control.prototype.initialize.call(this, options); + + var toolbar; + + this._toolbars = {}; + + // Initialize toolbars + if (L.DrawToolbar && this.options.draw) { + toolbar = new L.DrawToolbar(this.options.draw); + + this._toolbars[L.DrawToolbar.TYPE] = toolbar; + + // Listen for when toolbar is enabled + this._toolbars[L.DrawToolbar.TYPE].on('enable', this._toolbarEnabled, this); + } + + if (L.EditToolbar && this.options.edit) { + toolbar = new L.EditToolbar(this.options.edit); + + this._toolbars[L.EditToolbar.TYPE] = toolbar; + + // Listen for when toolbar is enabled + this._toolbars[L.EditToolbar.TYPE].on('enable', this._toolbarEnabled, this); + } + L.toolbar = this; //set global var for editing the toolbar + }, + + // @method onAdd(): container + // Adds the toolbar container to the map + onAdd: function (map) { + var container = L.DomUtil.create('div', 'leaflet-draw'), + addedTopClass = false, + topClassName = 'leaflet-draw-toolbar-top', + toolbarContainer; + + for (var toolbarId in this._toolbars) { + if (this._toolbars.hasOwnProperty(toolbarId)) { + toolbarContainer = this._toolbars[toolbarId].addToolbar(map); + + if (toolbarContainer) { + // Add class to the first toolbar to remove the margin + if (!addedTopClass) { + if (!L.DomUtil.hasClass(toolbarContainer, topClassName)) { + L.DomUtil.addClass(toolbarContainer.childNodes[0], topClassName); + } + addedTopClass = true; + } + + container.appendChild(toolbarContainer); + } + } + } + + return container; + }, + + // @method onRemove(): void + // Removes the toolbars from the map toolbar container + onRemove: function () { + for (var toolbarId in this._toolbars) { + if (this._toolbars.hasOwnProperty(toolbarId)) { + this._toolbars[toolbarId].removeToolbar(); + } + } + }, + + // @method setDrawingOptions(options): void + // Sets options to all toolbar instances + setDrawingOptions: function (options) { + for (var toolbarId in this._toolbars) { + if (this._toolbars[toolbarId] instanceof L.DrawToolbar) { + this._toolbars[toolbarId].setOptions(options); + } + } + }, + + _toolbarEnabled: function (e) { + var enabledToolbar = e.target; + + for (var toolbarId in this._toolbars) { + if (this._toolbars[toolbarId] !== enabledToolbar) { + this._toolbars[toolbarId].disable(); + } + } + } +}); + +L.Map.mergeOptions({ + drawControlTooltips: true, + drawControl: false +}); + +L.Map.addInitHook(function () { + if (this.options.drawControl) { + this.drawControl = new L.Control.Draw(); + this.addControl(this.drawControl); + } +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Control.Draw.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Control.Draw.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Control.Draw=L.Control.extend({options:{position:"topleft",draw:{},edit:false},initialize:function(a){if(L.version<"0.7"){throw new Error("Leaflet.draw 0.2.3+ requires Leaflet 0.7.0+. Download latest from https://github.com/Leaflet/Leaflet/")}L.Control.prototype.initialize.call(this,a);var b;this._toolbars={};if(L.DrawToolbar&&this.options.draw){b=new L.DrawToolbar(this.options.draw);this._toolbars[L.DrawToolbar.TYPE]=b;this._toolbars[L.DrawToolbar.TYPE].on("enable",this._toolbarEnabled,this)}if(L.EditToolbar&&this.options.edit){b=new L.EditToolbar(this.options.edit);this._toolbars[L.EditToolbar.TYPE]=b;this._toolbars[L.EditToolbar.TYPE].on("enable",this._toolbarEnabled,this)}L.toolbar=this},onAdd:function(e){var b=L.DomUtil.create("div","leaflet-draw"),c=false,f="leaflet-draw-toolbar-top",a;for(var d in this._toolbars){if(this._toolbars.hasOwnProperty(d)){a=this._toolbars[d].addToolbar(e);if(a){if(!c){if(!L.DomUtil.hasClass(a,f)){L.DomUtil.addClass(a.childNodes[0],f)}c=true}b.appendChild(a)}}}return b},onRemove:function(){for(var a in this._toolbars){if(this._toolbars.hasOwnProperty(a)){this._toolbars[a].removeToolbar()}}},setDrawingOptions:function(a){for(var b in this._toolbars){if(this._toolbars[b] instanceof L.DrawToolbar){this._toolbars[b].setOptions(a)}}},_toolbarEnabled:function(c){var b=c.target;for(var a in this._toolbars){if(this._toolbars[a]!==b){this._toolbars[a].disable()}}}});L.Map.mergeOptions({drawControlTooltips:true,drawControl:false});L.Map.addInitHook(function(){if(this.options.drawControl){this.drawControl=new L.Control.Draw();this.addControl(this.drawControl)}}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Draw.Event.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Draw.Event.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,156 @@ +/** + * ### Events + * Once you have successfully added the Leaflet.draw plugin to your map you will want to respond to the different + * actions users can initiate. The following events will be triggered on the map: + * + * @class L.Draw.Event + * @aka Draw.Event + * + * Use `L.Draw.Event.EVENTNAME` constants to ensure events are correct. + * + * @example + * ```js + * map.on(L.Draw.Event.CREATED; function (e) { + * var type = e.layerType; + * layer = e.layer; + * + * if (type === 'marker') { + * // Do marker specific actions + * } + * + * // Do whatever else you need to. (save to db; add to map etc) + * map.addLayer(layer); + *}); + * ``` + */ +L.Draw.Event = {}; +/** + * @event draw:created: PolyLine; Polygon; Rectangle; Circle; Marker | String + * + * Layer that was just created. + * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker` + * Triggered when a new vector or marker has been created. + * + */ +L.Draw.Event.CREATED = 'draw:created'; + +/** + * @event draw:edited: LayerGroup + * + * List of all layers just edited on the map. + * + * + * Triggered when layers in the FeatureGroup; initialised with the plugin; have been edited and saved. + * + * @example + * ```js + * map.on('draw:edited'; function (e) { + * var layers = e.layers; + * layers.eachLayer(function (layer) { + * //do whatever you want; most likely save back to db + * }); + * }); + * ``` + */ +L.Draw.Event.EDITED = 'draw:edited'; + +/** + * @event draw:deleted: LayerGroup + * + * List of all layers just removed from the map. + * + * Triggered when layers have been removed (and saved) from the FeatureGroup. + */ +L.Draw.Event.DELETED = 'draw:deleted'; + +/** + * @event draw:drawstart: String + * + * The type of layer this is. One of:`polyline`; `polygon`; `rectangle`; `circle`; `marker` + * + * Triggered when the user has chosen to draw a particular vector or marker. + */ +L.Draw.Event.DRAWSTART = 'draw:drawstart'; + +/** + * @event draw:drawstop: String + * + * The type of layer this is. One of: `polyline`; `polygon`; `rectangle`; `circle`; `marker` + * + * Triggered when the user has finished a particular vector or marker. + */ + +L.Draw.Event.DRAWSTOP = 'draw:drawstop'; + +/** + * @event draw:drawvertex: LayerGroup + * + * List of all layers just being added from the map. + * + * Triggered when a vertex is created on a polyline or polygon. + */ +L.Draw.Event.DRAWVERTEX = 'draw:drawvertex'; + +/** + * @event draw:editstart: String + * + * The type of edit this is. One of: `edit` + * + * Triggered when the user starts edit mode by clicking the edit tool button. + */ + +L.Draw.Event.EDITSTART = 'draw:editstart'; + +/** + * @event draw:editmove: ILayer + * + * Layer that was just moved. + * + * Triggered as the user moves a rectangle; circle or marker. + */ +L.Draw.Event.EDITMOVE = 'draw:editmove'; + +/** + * @event draw:editresize: ILayer + * + * Layer that was just moved. + * + * Triggered as the user resizes a rectangle or circle. + */ +L.Draw.Event.EDITRESIZE = 'draw:editresize'; + +/** + * @event draw:editvertex: LayerGroup + * + * List of all layers just being edited from the map. + * + * Triggered when a vertex is edited on a polyline or polygon. + */ +L.Draw.Event.EDITVERTEX = 'draw:editvertex'; + +/** + * @event draw:editstop: String + * + * The type of edit this is. One of: `edit` + * + * Triggered when the user has finshed editing (edit mode) and saves edits. + */ +L.Draw.Event.EDITSTOP = 'draw:editstop'; + +/** + * @event draw:deletestart: String + * + * The type of edit this is. One of: `remove` + * + * Triggered when the user starts remove mode by clicking the remove tool button. + */ +L.Draw.Event.DELETESTART = 'draw:deletestart'; + +/** + * @event draw:deletestop: String + * + * The type of edit this is. One of: `remove` + * + * Triggered when the user has finished removing shapes (remove mode) and saves. + */ +L.Draw.Event.DELETESTOP = 'draw:deletestop'; \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Draw.Event.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Draw.Event.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.Draw.Event={};L.Draw.Event.CREATED="draw:created";L.Draw.Event.EDITED="draw:edited";L.Draw.Event.DELETED="draw:deleted";L.Draw.Event.DRAWSTART="draw:drawstart";L.Draw.Event.DRAWSTOP="draw:drawstop";L.Draw.Event.DRAWVERTEX="draw:drawvertex";L.Draw.Event.EDITSTART="draw:editstart";L.Draw.Event.EDITMOVE="draw:editmove";L.Draw.Event.EDITRESIZE="draw:editresize";L.Draw.Event.EDITVERTEX="draw:editvertex";L.Draw.Event.EDITSTOP="draw:editstop";L.Draw.Event.DELETESTART="draw:deletestart";L.Draw.Event.DELETESTOP="draw:deletestop"; \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Draw.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Draw.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,183 @@ +/** + * Leaflet.draw assumes that you have already included the Leaflet library. + */ +L.drawVersion = '0.4.2'; +/** + * @class L.Draw + * @aka Draw + * + * + * To add the draw toolbar set the option drawControl: true in the map options. + * + * @example + * ```js + * var map = L.map('map', {drawControl: true}).setView([51.505, -0.09], 13); + * + * L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + * attribution: '© OpenStreetMap contributors' + * }).addTo(map); + * ``` + * + * ### Adding the edit toolbar + * To use the edit toolbar you must initialise the Leaflet.draw control and manually add it to the map. + * + * ```js + * var map = L.map('map').setView([51.505, -0.09], 13); + * + * L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + * attribution: '© OpenStreetMap contributors' + * }).addTo(map); + * + * // FeatureGroup is to store editable layers + * var drawnItems = new L.FeatureGroup(); + * map.addLayer(drawnItems); + * + * var drawControl = new L.Control.Draw({ + * edit: { + * featureGroup: drawnItems + * } + * }); + * map.addControl(drawControl); + * ``` + * + * The key here is the featureGroup option. This tells the plugin which FeatureGroup contains the layers that + * should be editable. The featureGroup can contain 0 or more features with geometry types Point, LineString, and Polygon. + * Leaflet.draw does not work with multigeometry features such as MultiPoint, MultiLineString, MultiPolygon, + * or GeometryCollection. If you need to add multigeometry features to the draw plugin, convert them to a + * FeatureCollection of non-multigeometries (Points, LineStrings, or Polygons). + */ +L.Draw = {}; + +/** + * @class L.drawLocal + * @aka L.drawLocal + * + * The core toolbar class of the API — it is used to create the toolbar ui + * + * @example + * ```js + * var modifiedDraw = L.drawLocal.extend({ + * draw: { + * toolbar: { + * buttons: { + * polygon: 'Draw an awesome polygon' + * } + * } + * } + * }); + * ``` + * + * The default state for the control is the draw toolbar just below the zoom control. + * This will allow map users to draw vectors and markers. + * **Please note the edit toolbar is not enabled by default.** + */ +L.drawLocal = { + // format: { + // numeric: { + // delimiters: { + // thousands: ',', + // decimal: '.' + // } + // } + // }, + draw: { + toolbar: { + // #TODO: this should be reorganized where actions are nested in actions + // ex: actions.undo or actions.cancel + actions: { + title: 'Cancel drawing', + text: 'Cancel' + }, + finish: { + title: 'Finish drawing', + text: 'Finish' + }, + undo: { + title: 'Delete last point drawn', + text: 'Delete last point' + }, + buttons: { + polyline: 'Draw a polyline', + polygon: 'Draw a polygon', + rectangle: 'Draw a rectangle', + circle: 'Draw a circle', + marker: 'Draw a marker' + } + }, + handlers: { + circle: { + tooltip: { + start: 'Click and drag to draw circle.' + }, + radius: 'Radius' + }, + marker: { + tooltip: { + start: 'Click map to place marker.' + } + }, + polygon: { + tooltip: { + start: 'Click to start drawing shape.', + cont: 'Click to continue drawing shape.', + end: 'Click first point to close this shape.' + } + }, + polyline: { + error: 'Error: shape edges cannot cross!', + tooltip: { + start: 'Click to start drawing line.', + cont: 'Click to continue drawing line.', + end: 'Click last point to finish line.' + } + }, + rectangle: { + tooltip: { + start: 'Click and drag to draw rectangle.' + } + }, + simpleshape: { + tooltip: { + end: 'Release mouse to finish drawing.' + } + } + } + }, + edit: { + toolbar: { + actions: { + save: { + title: 'Save changes.', + text: 'Save' + }, + cancel: { + title: 'Cancel editing, discards all changes.', + text: 'Cancel' + }, + clearAll:{ + title: 'clear all layers.', + text: 'Clear All' + } + }, + buttons: { + edit: 'Edit layers.', + editDisabled: 'No layers to edit.', + remove: 'Delete layers.', + removeDisabled: 'No layers to delete.' + } + }, + handlers: { + edit: { + tooltip: { + text: 'Drag handles, or marker to edit feature.', + subtext: 'Click cancel to undo changes.' + } + }, + remove: { + tooltip: { + text: 'Click on a feature to remove' + } + } + } + } +}; diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.Draw.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.Draw.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.drawVersion="0.4.2";L.Draw={};L.drawLocal={draw:{toolbar:{actions:{title:"Cancel drawing",text:"Cancel"},finish:{title:"Finish drawing",text:"Finish"},undo:{title:"Delete last point drawn",text:"Delete last point"},buttons:{polyline:"Draw a polyline",polygon:"Draw a polygon",rectangle:"Draw a rectangle",circle:"Draw a circle",marker:"Draw a marker"}},handlers:{circle:{tooltip:{start:"Click and drag to draw circle."},radius:"Radius"},marker:{tooltip:{start:"Click map to place marker."}},polygon:{tooltip:{start:"Click to start drawing shape.",cont:"Click to continue drawing shape.",end:"Click first point to close this shape."}},polyline:{error:"Error: shape edges cannot cross!",tooltip:{start:"Click to start drawing line.",cont:"Click to continue drawing line.",end:"Click last point to finish line."}},rectangle:{tooltip:{start:"Click and drag to draw rectangle."}},simpleshape:{tooltip:{end:"Release mouse to finish drawing."}}}},edit:{toolbar:{actions:{save:{title:"Save changes.",text:"Save"},cancel:{title:"Cancel editing, discards all changes.",text:"Cancel"},clearAll:{title:"clear all layers.",text:"Clear All"}},buttons:{edit:"Edit layers.",editDisabled:"No layers to edit.",remove:"Delete layers.",removeDisabled:"No layers to delete."}},handlers:{edit:{tooltip:{text:"Drag handles, or marker to edit feature.",subtext:"Click cancel to undo changes."}},remove:{tooltip:{text:"Click on a feature to remove"}}}}}; \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.DrawToolbar.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.DrawToolbar.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,104 @@ +/** + * @class L.DrawToolbar + * @aka Toolbar + */ +L.DrawToolbar = L.Toolbar.extend({ + + statics: { + TYPE: 'draw' + }, + + options: { + polyline: {}, + polygon: {}, + rectangle: {}, + circle: {}, + marker: {} + }, + + // @method initialize(): void + initialize: function (options) { + // Ensure that the options are merged correctly since L.extend is only shallow + for (var type in this.options) { + if (this.options.hasOwnProperty(type)) { + if (options[type]) { + options[type] = L.extend({}, this.options[type], options[type]); + } + } + } + + this._toolbarClass = 'leaflet-draw-draw'; + L.Toolbar.prototype.initialize.call(this, options); + }, + + // @method getModeHandlers(): object + // Get mode handlers information + getModeHandlers: function (map) { + return [ + { + enabled: this.options.polyline, + handler: new L.Draw.Polyline(map, this.options.polyline), + title: L.drawLocal.draw.toolbar.buttons.polyline + }, + { + enabled: this.options.polygon, + handler: new L.Draw.Polygon(map, this.options.polygon), + title: L.drawLocal.draw.toolbar.buttons.polygon + }, + { + enabled: this.options.rectangle, + handler: new L.Draw.Rectangle(map, this.options.rectangle), + title: L.drawLocal.draw.toolbar.buttons.rectangle + }, + { + enabled: this.options.circle, + handler: new L.Draw.Circle(map, this.options.circle), + title: L.drawLocal.draw.toolbar.buttons.circle + }, + { + enabled: this.options.marker, + handler: new L.Draw.Marker(map, this.options.marker), + title: L.drawLocal.draw.toolbar.buttons.marker + } + ]; + }, + + // @method getActions(): object + // Get action information + getActions: function (handler) { + return [ + { + enabled: handler.completeShape, + title: L.drawLocal.draw.toolbar.finish.title, + text: L.drawLocal.draw.toolbar.finish.text, + callback: handler.completeShape, + context: handler + }, + { + enabled: handler.deleteLastVertex, + title: L.drawLocal.draw.toolbar.undo.title, + text: L.drawLocal.draw.toolbar.undo.text, + callback: handler.deleteLastVertex, + context: handler + }, + { + title: L.drawLocal.draw.toolbar.actions.title, + text: L.drawLocal.draw.toolbar.actions.text, + callback: this.disable, + context: this + } + ]; + }, + + // @method setOptions(): void + // Sets the options to the toolbar + setOptions: function (options) { + L.setOptions(this, options); + + for (var type in this._modes) { + if (this._modes.hasOwnProperty(type) && options.hasOwnProperty(type)) { + this._modes[type].handler.setOptions(options[type]); + } + } + } +}); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/leaflet.DrawToolbar.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +L.DrawToolbar=L.Toolbar.extend({statics:{TYPE:"draw"},options:{polyline:{},polygon:{},rectangle:{},circle:{},marker:{}},initialize:function(a){for(var b in this.options){if(this.options.hasOwnProperty(b)){if(a[b]){a[b]=L.extend({},this.options[b],a[b])}}}this._toolbarClass="leaflet-draw-draw";L.Toolbar.prototype.initialize.call(this,a)},getModeHandlers:function(a){return[{enabled:this.options.polyline,handler:new L.Draw.Polyline(a,this.options.polyline),title:L.drawLocal.draw.toolbar.buttons.polyline},{enabled:this.options.polygon,handler:new L.Draw.Polygon(a,this.options.polygon),title:L.drawLocal.draw.toolbar.buttons.polygon},{enabled:this.options.rectangle,handler:new L.Draw.Rectangle(a,this.options.rectangle),title:L.drawLocal.draw.toolbar.buttons.rectangle},{enabled:this.options.circle,handler:new L.Draw.Circle(a,this.options.circle),title:L.drawLocal.draw.toolbar.buttons.circle},{enabled:this.options.marker,handler:new L.Draw.Marker(a,this.options.marker),title:L.drawLocal.draw.toolbar.buttons.marker}]},getActions:function(a){return[{enabled:a.completeShape,title:L.drawLocal.draw.toolbar.finish.title,text:L.drawLocal.draw.toolbar.finish.text,callback:a.completeShape,context:a},{enabled:a.deleteLastVertex,title:L.drawLocal.draw.toolbar.undo.title,text:L.drawLocal.draw.toolbar.undo.text,callback:a.deleteLastVertex,context:a},{title:L.drawLocal.draw.toolbar.actions.title,text:L.drawLocal.draw.toolbar.actions.text,callback:this.disable,context:this}]},setOptions:function(a){L.setOptions(this,a);for(var b in this._modes){if(this._modes.hasOwnProperty(b)&&a.hasOwnProperty(b)){this._modes[b].handler.setOptions(a[b])}}}}); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/pyams_gis.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/pyams_gis.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,519 @@ +/** + * PyAMS_GIS package extension + */ +(function($, globals) { + + "use strict"; + + var MyAMS = globals.MyAMS; + var L; + + var PyAMS_GIS = { + + RPC_ENDPOINT: '/api/gis/json', + WGS_SRID: 4326, + + _layersControlAddItem: function(obj) { + var group = $('
    ').addClass('inline-group'), + label = $('').addClass(obj.overlay ? "checkbox" : "radio"), + input, + span = $(''), + name, + checked = this._map.hasLayer(obj.layer); + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers', checked); + } + input.layerId = L.stamp(obj.layer); + $(input).addClass(obj.overlay ? "checkbox" : "radio"); + L.DomEvent.on(input, 'click', this._onInputClick, this); + name = $('').text(' ' + obj.name); + label.append(input); + label.append(span); + label.append(name); + group.append(label); + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + $(container).append(group); + // $($(container).parents('form').get(0)).data("async", true); + return group; + }, + + init: function(context, options, callback) { + var map = context; + MyAMS.ajax.check(globals.L, + '/--static--/pyams_gis/js/leaflet-1.0.3' + MyAMS.devext + '.js', + function(first_load) { + if (first_load) { + L = globals.L; + L.Control.Layers.prototype._addItem = PyAMS_GIS._layersControlAddItem; + MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-1.0.3' + MyAMS.devext + '.css', + 'leaflet'); + } + MyAMS.ajax.post('get-map-configuration.json', {}, function(config) { + var data = map.data(); + var settings = { + preferCanvas: data.mapLeafletPreferCanvas || false, + attributionControl: data.mapLeafletAttributionControl === undefined ? + config.attributionControl : + data.mapLeafletAttributionControl, + zoomControl: data.mapLeafletZoomControl === undefined ? + config.zoomControl : + data.mapLeafletZoomControl, + crs: data.mapLeafletCrs || MyAMS.getObject(config.crs) || globals.L.CRS.EPSG3857, + center: data.mapLeafletCenter || config.center, + zoom: data.mapLeafletZoom || config.zoom + }; + settings = $.extend({}, settings, options); + map.trigger('map.init', [map, settings, config]); + var leafmap = L.map(map.attr('id'), settings); + if (config.layers) { + for (var index = 0; index < config.layers.length; index++) { + var layerConfig = config.layers[index]; + map.trigger('map.layer.init', [map, layerConfig]); + PyAMS_GIS.getLayer(layerConfig).addTo(leafmap); + } + } else { + L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + id: 'osm', + attribution: '© OpenStreetMap' + }).addTo(leafmap); + } + if (config.zoomControl && (data.mapLeafletHideZoomControl !== true)) { + L.control.scale().addTo(leafmap); + } + if (config.bounds) { + leafmap.fitBounds(config.bounds); + } + map.data('leafmap', leafmap); + map.data('leafmap.config', config); + map.trigger('map.finishing', [map, leafmap]); + if (callback) { + callback(leafmap, config); + } + map.trigger('map.finished', [map, leafmap]); + }); + }); + }, + + getLayer: function(layer) { + var factory = MyAMS.getObject(layer.factory); + if (factory !== undefined) { + delete layer.factory; + var deferred = []; + if (layer.dependsOn) { + for (var name in layer.dependsOn) { + if (!layer.dependsOn.hasOwnProperty(name)) { + continue; + } + if (MyAMS.getObject(name) === undefined) { + deferred.push(MyAMS.getScript(layer.dependsOn[name])); + } + } + delete layer.dependsOn; + } + if (deferred.length > 0) { + $.when.apply($, deferred); + } + return factory(layer); + } + }, + + factory: { + TileLayer: function(layer) { + var url = layer.url; + delete layer.url; + return L.tileLayer(url, layer); + }, + WMS: function(layer) { + var url = layer.url; + delete layer.url; + return L.tileLayer.wms(url, layer); + }, + Geoportal: { + WMS: function(layer) { + MyAMS.getCSS('/--static--/pyams_gis/css/leaflet-gp-3.0.2' + MyAMS.devext + '.css', 'geoportal'); + return L.geoportalLayer.WMS(layer); + } + }, + ESRI: { + Feature: function(layer) { + return L.esri.featureLayer(layer); + } + }, + Google: function(layer) { + var apiKey = layer.apiKey; + delete layer.apiKey; + if (MyAMS.getObject('window.google.maps') === undefined) { + var script = MyAMS.getScript('https://maps.googleapis.com/maps/api/js?key=' + apiKey); + $.when.apply($, [script]); + } + return L.gridLayer.googleMutant(layer); + } + }, + + callJSON: function(method, params, callback) { + MyAMS.ajax.check($.jsonRPC, + MyAMS.baseURL + 'ext/jquery-jsonrpc' + MyAMS.devext + '.js', + function() { + $.jsonRPC.withOptions({ + endPoint: PyAMS_GIS.RPC_ENDPOINT, + cache: false + }, function() { + $.jsonRPC.request(method, { + id: new Date().getTime(), + params: params, + success: callback, + error: MyAMS.error.show + }); + }); + }); + }, + + /** + * Single position marker management + */ + position: { + + init: function() { + /* Position marker initialization */ + var map = $('.map', $(this)); + if (map.data('leafmap') === undefined) { + map.css('height', $(window).height() - 200); + PyAMS_GIS.init(map, {}, function (leafmap, config) { + var data = map.data(); + var icon = L.icon({ + iconUrl: '/--static--/pyams_gis/img/marker-icon.png', + iconSize: [25, 41], + iconAnchor: [13, 40] + }); + var marker = L.marker(); + marker.setIcon(icon); + var fieldname = data.mapLeafletFieldname; + var longitude = $('input[name="' + fieldname + '.widgets.longitude"]'); + var latitude = $('input[name="' + fieldname + '.widgets.latitude"]'); + if (longitude.val() && latitude.val()) { + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]'); + var params = { + point: { + longitude: parseFloat(longitude.val()), + latitude: parseFloat(latitude.val()) + }, + from_projection: projection.val() || PyAMS_GIS.WGS_SRID, + to_projection: PyAMS_GIS.WGS_SRID + }; + PyAMS_GIS.callJSON('transformPoint', params, function(result) { + if (!result.error) { + var point = result.result.point; + marker.setLatLng({ + lon: point.longitude, + lat: point.latitude + }); + marker.addTo(leafmap); + leafmap.setView(marker.getLatLng(), config.zoom || 13); + } + }); + } else { + marker.setLatLng([-90, 0]); + marker.addTo(leafmap); + } + map.data('marker', marker); + leafmap.on('click', PyAMS_GIS.position.onClick); + }); + } + }, + + onClick: function(event) { + var map = event.target.getContainer(); + var data = $(map).data(); + var marker = data.marker; + var latlng = event.latlng; + marker.setLatLng(latlng); + var fieldname = data.mapLeafletFieldname; + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]'); + var params = { + point: { + longitude: latlng.lng, + latitude: latlng.lat + }, + from_projection: PyAMS_GIS.WGS_SRID, + to_projection: projection.val() + }; + PyAMS_GIS.callJSON('transformPoint', params, function(result) { + if (!result.error) { + var point = result.result.point; + $('input[name="' + fieldname + '.widgets.longitude"]').val(point.longitude); + $('input[name="' + fieldname + '.widgets.latitude"]').val(point.latitude); + } + }); + }, + + changedCoordinate: function() { + var input = $(this); + var map = $('.map', input.parents('fieldset:first')); + if (!map.data('marker')) { + return; + } + var fieldname = map.data('map-leaflet-fieldname'); + var longitude = $('input[name="' + fieldname + '.widgets.longitude"]'); + var latitude = $('input[name="' + fieldname + '.widgets.latitude"]'); + if (longitude.val() && latitude.val()) { + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]'); + var params = { + point: { + longitude: parseFloat(longitude.val()), + latitude: parseFloat(latitude.val()) + }, + from_projection: projection.val(), + to_projection: 4326 + }; + PyAMS_GIS.callJSON('transformPoint', params, function (result) { + if (!result.error) { + var point = result.result.point; + var marker = map.data('marker'); + marker.setLatLng({ + lon: point.longitude, + lat: point.latitude + }); + } + }); + } + }, + + changedProjection: function(event) { + var select = $(this); + var map = $('.map', select.parents('fieldset:first')); + var fieldname = map.data('map-leaflet-fieldname'); + var longitude = $('input[name="' + fieldname + '.widgets.longitude"]'); + var latitude = $('input[name="' + fieldname + '.widgets.latitude"]'); + if (event.removed) { + var previous = event.removed.id; + var current = event.added.id; + if (previous !== current) { + if (longitude.val() && latitude.val()) { + var params = { + point: { + longitude: parseFloat(longitude.val()), + latitude: parseFloat(latitude.val()) + }, + from_projection: previous, + to_projection: current + }; + PyAMS_GIS.callJSON('transformPoint', params, function (result) { + if (!result.error) { + var point = result.result.point; + longitude.val(point.longitude); + latitude.val(point.latitude); + } + }); + } + } + } else { + PyAMS_GIS.position.changedCoordinate.apply(longitude); + } + }, + + clear: function(event) { + var fieldset = $(this).parents('fieldset:first'); + $('input', fieldset).val(null); + } + }, + + + /** + * Single rectangular area management + */ + area: { + + init: function () { + var map = $('.map', $(this)); + if (map.data('leafmap') === undefined) { + map.css('height', $(window).height() - 200); + PyAMS_GIS.init(map, {}, function(leafmap) { + L.Draw = L.Draw || {}; + L.Edit = L.Edit || {}; + MyAMS.ajax.check([L.Draw, L.Draw.Event, L.Map.TouchExtend, L.Edit.SimpleShape], + ['/--static--/pyams_gis/js/leaflet.Draw' + MyAMS.devext + '.js', + '/--static--/pyams_gis/js/leaflet.Draw.Event' + MyAMS.devext + '.js', + '/--static--/pyams_gis/js/TouchEvents' + MyAMS.devext + '.js', + '/--static--/pyams_gis/js/Edit.SimpleShape' + MyAMS.devext + '.js'], + function() { + MyAMS.ajax.check(L.Edit.Rectangle, + '/--static--/pyams_gis/js/Edit.Rectangle' + MyAMS.devext + '.js', + function () { + + function initRectangle(p1, p2) { + var group = new L.FeatureGroup(); + rectangle = L.rectangle([p1, p2]); + group.addLayer(rectangle); + leafmap.addLayer(group); + leafmap.fitBounds(rectangle.getBounds()); + rectangle.editing.enable(); + map.data('area', rectangle); + leafmap.on(L.Draw.Event.EDITMOVE, PyAMS_GIS.area.changedArea); + leafmap.on(L.Draw.Event.EDITRESIZE, PyAMS_GIS.area.changedArea); + leafmap.on(L.Draw.Event.EDITVERTEX, PyAMS_GIS.area.changedArea); + } + + var data = map.data(); + var fieldname = data.mapLeafletFieldname; + var x1 = $('input[name="' + fieldname + '.widgets.x1"]'); + var y1 = $('input[name="' + fieldname + '.widgets.y1"]'); + var x2 = $('input[name="' + fieldname + '.widgets.x2"]'); + var y2 = $('input[name="' + fieldname + '.widgets.y2"]'); + var p1, + p2, + rectangle; + if (x1.val() && y1.val() && x2.val() && y2.val()) { + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]'); + var params = { + area: { + x1: parseFloat(x1.val()), + y1: parseFloat(y1.val()), + x2: parseFloat(x2.val()), + y2: parseFloat(y2.val()) + }, + from_projection: projection.val(), + to_projection: PyAMS_GIS.WGS_SRID + }; + PyAMS_GIS.callJSON('transformArea', params, function(result) { + if (!result.error) { + var area = result.result.area; + p1 = L.latLng({lon: area.x1, lat: area.y1}); + p2 = L.latLng({lon: area.x2, lat: area.y2}); + initRectangle(p1, p2); + } + }); + } else { + p1 = L.latLng({lon: -168, lat: -56.37}); + p2 = L.latLng({lon: 191.25, lat: 83.72}); + initRectangle(p1, p2); + } + }); + }); + }); + } + }, + + last_event: null, + + changedArea: function(event) { + PyAMS_GIS.area.last_event = event; + setTimeout(function() { + if (event === PyAMS_GIS.area.last_event) { + var map = event.target.getContainer(); + var data = $(map).data(); + var area = data.area.getBounds(); + var fieldname = data.mapLeafletFieldname; + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]').val(); + var params = { + area: { + x1: area.getWest(), + y1: area.getSouth(), + x2: area.getEast(), + y2: area.getNorth() + }, + from_projection: PyAMS_GIS.WGS_SRID, + to_projection: projection + }; + PyAMS_GIS.callJSON('transformArea', params, function(result) { + if (!result.error) { + var area = result.result.area; + $('input[name="' + fieldname + '.widgets.x1"]').val(area.x1); + $('input[name="' + fieldname + '.widgets.y1"]').val(area.y1); + $('input[name="' + fieldname + '.widgets.x2"]').val(area.x2); + $('input[name="' + fieldname + '.widgets.y2"]').val(area.y2); + } + }); + } + }, 100); + }, + + changedCoordinate: function() { + var input = $(this); + var map = $('.map', input.parents('fieldset:first')); + if (!map.data('area')) { + return; + } + var fieldname = map.data('map-leaflet-fieldname'); + var x1 = $('input[name="' + fieldname + '.widgets.x1"]'); + var y1 = $('input[name="' + fieldname + '.widgets.y1"]'); + var x2 = $('input[name="' + fieldname + '.widgets.x2"]'); + var y2 = $('input[name="' + fieldname + '.widgets.y2"]'); + if (x1.val() && y1.val() && x2.val() && y2.val()) { + var projection = $('select[name="' + fieldname + '.widgets.projection:list"]'); + var params = { + area: { + x1: parseFloat(x1.val()), + y1: parseFloat(y1.val()), + x2: parseFloat(x2.val()), + y2: parseFloat(y2.val()) + }, + from_projection: projection.val(), + to_projection: 4326 + }; + PyAMS_GIS.callJSON('transformArea', params, function (result) { + if (!result.error) { + var area = result.result.area; + var rect = map.data('area'); + rect.editing.disable(); + rect.setBounds([L.latLng({lon: area.x1, lat: area.y1}), + L.latLng({lon: area.x2, lat: area.y2})]); + rect.editing.enable(); + } + }); + } + }, + + changedProjection: function(event) { + var select = $(this); + var map = $('.map', select.parents('fieldset:first')); + var fieldname = map.data('map-leaflet-fieldname'); + var x1 = $('input[name="' + fieldname + '.widgets.x1"]'); + var y1 = $('input[name="' + fieldname + '.widgets.y1"]'); + var x2 = $('input[name="' + fieldname + '.widgets.x2"]'); + var y2 = $('input[name="' + fieldname + '.widgets.y2"]'); + if (event.removed) { + var previous = event.removed.id; + var current = event.added.id; + if (previous !== current) { + if (x1.val() && y1.val() && x2.val() && y2.val()) { + var params = { + area: { + x1: parseFloat(x1.val()), + y1: parseFloat(y1.val()), + x2: parseFloat(x2.val()), + y2: parseFloat(y2.val()) + }, + from_projection: previous, + to_projection: current + }; + PyAMS_GIS.callJSON('transformArea', params, function (result) { + if (!result.error) { + var area = result.result.area; + x1.val(area.x1); + y1.val(area.y1); + x2.val(area.x2); + y2.val(area.y2); + } + }); + } + } + } else { + PyAMS_GIS.area.changedCoordinate.apply(x1); + } + }, + + clear: function(event) { + var fieldset = $(this).parents('fieldset:first'); + $('input', fieldset).val(null); + } + } + }; + globals.PyAMS_GIS = PyAMS_GIS; + +})(jQuery, this); diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/resources/js/pyams_gis.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/resources/js/pyams_gis.min.js Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ +(function(c,b){var d=b.MyAMS;var a;var e={RPC_ENDPOINT:"/api/gis/json",WGS_SRID:4326,_layersControlAddItem:function(m){var l=c("
    ").addClass("inline-group"),i=c("").addClass(m.overlay?"checkbox":"radio"),g,j=c(""),h,k=this._map.hasLayer(m.layer);if(m.overlay){g=document.createElement("input");g.type="checkbox";g.className="leaflet-control-layers-selector";g.defaultChecked=k}else{g=this._createRadioElement("leaflet-base-layers",k)}g.layerId=a.stamp(m.layer);c(g).addClass(m.overlay?"checkbox":"radio");a.DomEvent.on(g,"click",this._onInputClick,this);h=c("").text(" "+m.name);i.append(g);i.append(j);i.append(h);l.append(i);var f=m.overlay?this._overlaysList:this._baseLayersList;c(f).append(l);return l},init:function(g,f,i){var h=g;d.ajax.check(b.L,"/--static--/pyams_gis/js/leaflet-1.0.3"+d.devext+".js",function(j){if(j){a=b.L;a.Control.Layers.prototype._addItem=e._layersControlAddItem;d.getCSS("/--static--/pyams_gis/css/leaflet-1.0.3"+d.devext+".css","leaflet")}d.ajax.post("get-map-configuration.json",{},function(m){var p=h.data();var n={preferCanvas:p.mapLeafletPreferCanvas||false,attributionControl:p.mapLeafletAttributionControl===undefined?m.attributionControl:p.mapLeafletAttributionControl,zoomControl:p.mapLeafletZoomControl===undefined?m.zoomControl:p.mapLeafletZoomControl,crs:p.mapLeafletCrs||d.getObject(m.crs)||b.L.CRS.EPSG3857,center:p.mapLeafletCenter||m.center,zoom:p.mapLeafletZoom||m.zoom};n=c.extend({},n,f);h.trigger("map.init",[h,n,m]);var o=a.map(h.attr("id"),n);if(m.layers){for(var l=0;lOpenStreetMap'}).addTo(o)}if(m.zoomControl&&(p.mapLeafletHideZoomControl!==true)){a.control.scale().addTo(o)}if(m.bounds){o.fitBounds(m.bounds)}h.data("leafmap",o);h.data("leafmap.config",m);h.trigger("map.finishing",[h,o]);if(i){i(o,m)}h.trigger("map.finished",[h,o])})})},getLayer:function(i){var g=d.getObject(i.factory);if(g!==undefined){delete i.factory;var f=[];if(i.dependsOn){for(var h in i.dependsOn){if(!i.dependsOn.hasOwnProperty(h)){continue}if(d.getObject(h)===undefined){f.push(d.getScript(i.dependsOn[h]))}}delete i.dependsOn}if(f.length>0){c.when.apply(c,f)}return g(i)}},factory:{TileLayer:function(g){var f=g.url;delete g.url;return a.tileLayer(f,g)},WMS:function(g){var f=g.url;delete g.url;return a.tileLayer.wms(f,g)},Geoportal:{WMS:function(f){d.getCSS("/--static--/pyams_gis/css/leaflet-gp-3.0.2"+d.devext+".css","geoportal");return a.geoportalLayer.WMS(f)}},ESRI:{Feature:function(f){return a.esri.featureLayer(f)}},Google:function(g){var h=g.apiKey;delete g.apiKey;if(d.getObject("window.google.maps")===undefined){var f=d.getScript("https://maps.googleapis.com/maps/api/js?key="+h);c.when.apply(c,[f])}return a.gridLayer.googleMutant(g)}},callJSON:function(h,f,g){d.ajax.check(c.jsonRPC,d.baseURL+"ext/jquery-jsonrpc"+d.devext+".js",function(){c.jsonRPC.withOptions({endPoint:e.RPC_ENDPOINT,cache:false},function(){c.jsonRPC.request(h,{id:new Date().getTime(),params:f,success:g,error:d.error.show})})})},position:{init:function(){var f=c(".map",c(this));if(f.data("leafmap")===undefined){f.css("height",c(window).height()-200);e.init(f,{},function(o,h){var j=f.data();var p=a.icon({iconUrl:"/--static--/pyams_gis/img/marker-icon.png",iconSize:[25,41],iconAnchor:[13,40]});var k=a.marker();k.setIcon(p);var m=j.mapLeafletFieldname;var g=c('input[name="'+m+'.widgets.longitude"]');var n=c('input[name="'+m+'.widgets.latitude"]');if(g.val()&&n.val()){var l=c('select[name="'+m+'.widgets.projection:list"]');var i={point:{longitude:parseFloat(g.val()),latitude:parseFloat(n.val())},from_projection:l.val()||e.WGS_SRID,to_projection:e.WGS_SRID};e.callJSON("transformPoint",i,function(r){if(!r.error){var q=r.result.point;k.setLatLng({lon:q.longitude,lat:q.latitude});k.addTo(o);o.setView(k.getLatLng(),h.zoom||13)}})}else{k.setLatLng([-90,0]);k.addTo(o)}f.data("marker",k);o.on("click",e.position.onClick)})}},onClick:function(i){var k=i.target.getContainer();var j=c(k).data();var g=j.marker;var m=i.latlng;g.setLatLng(m);var h=j.mapLeafletFieldname;var f=c('select[name="'+h+'.widgets.projection:list"]');var l={point:{longitude:m.lng,latitude:m.lat},from_projection:e.WGS_SRID,to_projection:f.val()};e.callJSON("transformPoint",l,function(o){if(!o.error){var n=o.result.point;c('input[name="'+h+'.widgets.longitude"]').val(n.longitude);c('input[name="'+h+'.widgets.latitude"]').val(n.latitude)}})},changedCoordinate:function(){var h=c(this);var j=c(".map",h.parents("fieldset:first"));if(!j.data("marker")){return}var g=j.data("map-leaflet-fieldname");var i=c('input[name="'+g+'.widgets.longitude"]');var l=c('input[name="'+g+'.widgets.latitude"]');if(i.val()&&l.val()){var f=c('select[name="'+g+'.widgets.projection:list"]');var k={point:{longitude:parseFloat(i.val()),latitude:parseFloat(l.val())},from_projection:f.val(),to_projection:4326};e.callJSON("transformPoint",k,function(n){if(!n.error){var m=n.result.point;var o=j.data("marker");o.setLatLng({lon:m.longitude,lat:m.latitude})}})}},changedProjection:function(h){var n=c(this);var g=c(".map",n.parents("fieldset:first"));var k=g.data("map-leaflet-fieldname");var f=c('input[name="'+k+'.widgets.longitude"]');var m=c('input[name="'+k+'.widgets.latitude"]');if(h.removed){var j=h.removed.id;var l=h.added.id;if(j!==l){if(f.val()&&m.val()){var i={point:{longitude:parseFloat(f.val()),latitude:parseFloat(m.val())},from_projection:j,to_projection:l};e.callJSON("transformPoint",i,function(p){if(!p.error){var o=p.result.point;f.val(o.longitude);m.val(o.latitude)}})}}}else{e.position.changedCoordinate.apply(f)}},clear:function(g){var f=c(this).parents("fieldset:first");c("input",f).val(null)}},area:{init:function(){var f=c(".map",c(this));if(f.data("leafmap")===undefined){f.css("height",c(window).height()-200);e.init(f,{},function(g){a.Draw=a.Draw||{};a.Edit=a.Edit||{};d.ajax.check([a.Draw,a.Draw.Event,a.Map.TouchExtend,a.Edit.SimpleShape],["/--static--/pyams_gis/js/leaflet.Draw"+d.devext+".js","/--static--/pyams_gis/js/leaflet.Draw.Event"+d.devext+".js","/--static--/pyams_gis/js/TouchEvents"+d.devext+".js","/--static--/pyams_gis/js/Edit.SimpleShape"+d.devext+".js"],function(){d.ajax.check(a.Edit.Rectangle,"/--static--/pyams_gis/js/Edit.Rectangle"+d.devext+".js",function(){function h(v,u){var t=new a.FeatureGroup();p=a.rectangle([v,u]);t.addLayer(p);g.addLayer(t);g.fitBounds(p.getBounds());p.editing.enable();f.data("area",p);g.on(a.Draw.Event.EDITMOVE,e.area.changedArea);g.on(a.Draw.Event.EDITRESIZE,e.area.changedArea);g.on(a.Draw.Event.EDITVERTEX,e.area.changedArea)}var l=f.data();var n=l.mapLeafletFieldname;var j=c('input[name="'+n+'.widgets.x1"]');var q=c('input[name="'+n+'.widgets.y1"]');var i=c('input[name="'+n+'.widgets.x2"]');var o=c('input[name="'+n+'.widgets.y2"]');var s,r,p;if(j.val()&&q.val()&&i.val()&&o.val()){var m=c('select[name="'+n+'.widgets.projection:list"]');var k={area:{x1:parseFloat(j.val()),y1:parseFloat(q.val()),x2:parseFloat(i.val()),y2:parseFloat(o.val())},from_projection:m.val(),to_projection:e.WGS_SRID};e.callJSON("transformArea",k,function(t){if(!t.error){var u=t.result.area;s=a.latLng({lon:u.x1,lat:u.y1});r=a.latLng({lon:u.x2,lat:u.y2});h(s,r)}})}else{s=a.latLng({lon:-168,lat:-56.37});r=a.latLng({lon:191.25,lat:83.72});h(s,r)}})})})}},last_event:null,changedArea:function(f){e.area.last_event=f;setTimeout(function(){if(f===e.area.last_event){var k=f.target.getContainer();var j=c(k).data();var i=j.area.getBounds();var h=j.mapLeafletFieldname;var g=c('select[name="'+h+'.widgets.projection:list"]').val();var l={area:{x1:i.getWest(),y1:i.getSouth(),x2:i.getEast(),y2:i.getNorth()},from_projection:e.WGS_SRID,to_projection:g};e.callJSON("transformArea",l,function(m){if(!m.error){var n=m.result.area;c('input[name="'+h+'.widgets.x1"]').val(n.x1);c('input[name="'+h+'.widgets.y1"]').val(n.y1);c('input[name="'+h+'.widgets.x2"]').val(n.x2);c('input[name="'+h+'.widgets.y2"]').val(n.y2)}})}},100)},changedCoordinate:function(){var n=c(this);var f=c(".map",n.parents("fieldset:first"));if(!f.data("area")){return}var j=f.data("map-leaflet-fieldname");var h=c('input[name="'+j+'.widgets.x1"]');var m=c('input[name="'+j+'.widgets.y1"]');var g=c('input[name="'+j+'.widgets.x2"]');var l=c('input[name="'+j+'.widgets.y2"]');if(h.val()&&m.val()&&g.val()&&l.val()){var k=c('select[name="'+j+'.widgets.projection:list"]');var i={area:{x1:parseFloat(h.val()),y1:parseFloat(m.val()),x2:parseFloat(g.val()),y2:parseFloat(l.val())},from_projection:k.val(),to_projection:4326};e.callJSON("transformArea",i,function(o){if(!o.error){var q=o.result.area;var p=f.data("area");p.editing.disable();p.setBounds([a.latLng({lon:q.x1,lat:q.y1}),a.latLng({lon:q.x2,lat:q.y2})]);p.editing.enable()}})}},changedProjection:function(g){var p=c(this);var f=c(".map",p.parents("fieldset:first"));var l=f.data("map-leaflet-fieldname");var i=c('input[name="'+l+'.widgets.x1"]');var o=c('input[name="'+l+'.widgets.y1"]');var h=c('input[name="'+l+'.widgets.x2"]');var n=c('input[name="'+l+'.widgets.y2"]');if(g.removed){var k=g.removed.id;var m=g.added.id;if(k!==m){if(i.val()&&o.val()&&h.val()&&n.val()){var j={area:{x1:parseFloat(i.val()),y1:parseFloat(o.val()),x2:parseFloat(h.val()),y2:parseFloat(n.val())},from_projection:k,to_projection:m};e.callJSON("transformArea",j,function(q){if(!q.error){var r=q.result.area;i.val(r.x1);o.val(r.y1);h.val(r.x2);n.val(r.y2)}})}}}else{e.area.changedCoordinate.apply(i)}},clear:function(g){var f=c(this).parents("fieldset:first");c("input",f).val(null)}}};b.PyAMS_GIS=e})(jQuery,this); \ No newline at end of file diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/rpc/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/rpc/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces + +# import packages diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/rpc/json/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/rpc/json/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,81 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +try: + from osgeo.osr import SpatialReference, CoordinateTransformation + have_gdal = True +except ImportError: + have_gdal = False + +# import interfaces + +# import packages +from pyramid_rpc.jsonrpc import jsonrpc_method + + +@jsonrpc_method(endpoint='gis') +def transformPoint(request, point, from_projection, to_projection): + """Transform point given in source projection to another projection + + :param point: point coordinates given as a mapping with 'longitude' and 'latitude' values + :param from_projection: source coordinates system given as SRID + :param to_projection: target coordinates system given as SRID + :return: mapping with new 'point' key containing transformed coordinates, and 'projection' + key containing SRID of result projection system + """ + from_projection = int(from_projection) + to_projection = int(to_projection) + if (not have_gdal) or (from_projection == to_projection): + return {'point': point, + 'projection': from_projection} + source = SpatialReference() + source.ImportFromEPSG(from_projection) + destination = SpatialReference() + destination.ImportFromEPSG(to_projection) + target = CoordinateTransformation(source, destination).TransformPoint(point['longitude'], + point['latitude']) + return {'point': {'longitude': target[0], + 'latitude': target[1]}, + 'projection': to_projection} + + +@jsonrpc_method(endpoint='gis') +def transformArea(request, area, from_projection, to_projection): + """Transform area given in source projection to another projection + + :param area: area coordinates given as a mapping with 'x1', 'y1', 'x2', and 'y2' values + :param from_projection: source coordinates system given as SRID + :param to_projection: target coordinates system given as SRID + :return: mapping with new 'area' key containing transformed coordinates, and 'projection' + key containing SRID of result projection system + """ + from_projection = int(from_projection) + to_projection = int(to_projection) + if (not have_gdal) or (from_projection == to_projection): + return {'area': area, + 'projection': from_projection} + source = SpatialReference() + source.ImportFromEPSG(from_projection) + destination = SpatialReference() + destination.ImportFromEPSG(to_projection) + transformation = CoordinateTransformation(source, destination) + point1 = transformation.TransformPoint(area['x1'], area['y1']) + point2 = transformation.TransformPoint(area['x2'], area['y2']) + return {'area': {'x1': point1[0], + 'y1': point1[1], + 'x2': point2[0], + 'y2': point2[1]}, + 'projection': to_projection} diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/schema.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/schema.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,66 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces import IGeoPoint, IGeoPointZ, IGeoArea +from zope.schema.interfaces import IObject + +# import packages +from zope.interface import implementer +from zope.schema import Object + + +class IGeoPointField(IObject): + """GeoPoint schema field interface""" + + +@implementer(IGeoPointField) +class GeoPointField(Object): + """GeoPoint field class""" + + def __init__(self, **kwargs): + if 'schema' in kwargs: + del kwargs['schema'] + super(GeoPointField, self).__init__(IGeoPoint, **kwargs) + + +class IGeoPointZField(IObject): + """GeoPointZ schema field interface""" + + +@implementer(IGeoPointZField) +class GeoPointZField(Object): + """GeoPointZ field class""" + + def __init__(self, **kwargs): + if 'schema' in kwargs: + del kwargs['schema'] + super(GeoPointZField, self).__init__(IGeoPointZ, **kwargs) + + +class IGeoAreaField(IObject): + """GeoArea schema field interface""" + + +@implementer(IGeoAreaField) +class GeoAreaField(Object): + """GeoArea field class""" + + def __init__(self, **kwargs): + if 'schema' in kwargs: + del kwargs['schema'] + super(GeoAreaField, self).__init__(IGeoArea, **kwargs) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/site.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/site.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,48 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.utility import IMapManager +from pyams_utils.interfaces.site import ISiteGenerations +from zope.site.interfaces import INewLocalSite + +# import packages +from pyams_gis.utility import MapManager +from pyams_utils.registry import utility_config +from pyams_utils.site import check_required_utilities +from pyramid.events import subscriber + + +REQUIRED_UTILITIES = ((IMapManager, '', MapManager, 'Maps manager'), ) + + +@subscriber(INewLocalSite) +def handle_new_local_site(event): + """Create a new map manager when a site is created""" + site = event.manager.__parent__ + check_required_utilities(site, REQUIRED_UTILITIES) + + +@utility_config(name='PyAMS GIS', provides=ISiteGenerations) +class MapGenerationsChecker(object): + """Maps generations checker""" + + generation = 1 + + def evolve(self, site, current=None): + """Check for required utilities""" + check_required_utilities(site, REQUIRED_UTILITIES) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/tests/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/tests/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,1 @@ + diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/tests/test_utilsdocs.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/tests/test_utilsdocs.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,59 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +""" +Generic Test case for pyams_gis doctest +""" +__docformat__ = 'restructuredtext' + +import unittest +import doctest +import sys +import os + + +current_dir = os.path.dirname(__file__) + +def doc_suite(test_dir, setUp=None, tearDown=None, globs=None): + """Returns a test suite, based on doctests found in /doctest.""" + suite = [] + if globs is None: + globs = globals() + + flags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | + doctest.REPORT_ONLY_FIRST_FAILURE) + + package_dir = os.path.split(test_dir)[0] + if package_dir not in sys.path: + sys.path.append(package_dir) + + doctest_dir = os.path.join(package_dir, 'doctests') + + # filtering files on extension + docs = [os.path.join(doctest_dir, doc) for doc in + os.listdir(doctest_dir) if doc.endswith('.txt')] + + for test in docs: + suite.append(doctest.DocFileSuite(test, optionflags=flags, + globs=globs, setUp=setUp, + tearDown=tearDown, + module_relative=False)) + + return unittest.TestSuite(suite) + +def test_suite(): + """returns the test suite""" + return doc_suite(current_dir) + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') + diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/tests/test_utilsdocstrings.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/tests/test_utilsdocstrings.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,62 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +""" +Generic Test case for pyams_gis doc strings +""" +__docformat__ = 'restructuredtext' + +import unittest +import doctest +import sys +import os + + +current_dir = os.path.abspath(os.path.dirname(__file__)) + +def doc_suite(test_dir, globs=None): + """Returns a test suite, based on doc tests strings found in /*.py""" + suite = [] + if globs is None: + globs = globals() + + flags = (doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | + doctest.REPORT_ONLY_FIRST_FAILURE) + + package_dir = os.path.split(test_dir)[0] + if package_dir not in sys.path: + sys.path.append(package_dir) + + # filtering files on extension + docs = [doc for doc in + os.listdir(package_dir) if doc.endswith('.py')] + docs = [doc for doc in docs if not doc.startswith('__')] + + for test in docs: + fd = open(os.path.join(package_dir, test)) + content = fd.read() + fd.close() + if '>>> ' not in content: + continue + test = test.replace('.py', '') + location = 'pyams_gis.%s' % test + suite.append(doctest.DocTestSuite(location, optionflags=flags, + globs=globs)) + + return unittest.TestSuite(suite) + +def test_suite(): + """returns the test suite""" + return doc_suite(current_dir) + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/utility.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/utility.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,47 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.configuration import IMapConfigurationTarget +from pyams_gis.interfaces.utility import IMapManager +from pyams_i18n.interfaces import II18n + +# import packages +from pyams_utils.registry import get_utility +from pyams_utils.request import check_request +from pyams_utils.vocabulary import vocabulary_config +from zope.container.folder import Folder +from zope.interface import implementer +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm + + +@implementer(IMapManager, IMapConfigurationTarget) +class MapManager(Folder): + """Map manager utility""" + + +@vocabulary_config(name='PyAMS map layers') +class MapLayersVocabulary(SimpleVocabulary): + """Map manager layers vocabulary""" + + def __init__(self, context): + request = check_request() + manager = get_utility(IMapManager) + super(MapLayersVocabulary, self).__init__([SimpleTerm(layer.__name__, + title=II18n(layer).query_attribute('title', + request=request)) + for layer in manager.values()]) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/widget/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/widget/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces + +# import packages diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/widget/area.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/widget/area.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,97 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +import json + +# import interfaces +from pyams_form.interfaces.form import IFormLayer, IForm +from pyams_gis.interfaces import IGeoArea +from pyams_gis.interfaces.widget import IGeoAreaWidget +from pyams_gis.schema import IGeoAreaField +from pyams_utils.interfaces.data import IObjectData +from z3c.form.interfaces import IFieldWidget, IObjectFactory + +# import packages +from pyams_form.widget import widgettemplate_config +from pyams_gis.area import GeoArea +from pyams_utils.adapter import adapter_config +from z3c.form.browser.object import ObjectWidget +from z3c.form.object import getIfName +from z3c.form.widget import FieldWidget +from zope.interface import implementer_only, alsoProvides, Interface + + +@adapter_config(name=getIfName(IGeoArea), + context=(Interface, IFormLayer, IForm, IGeoAreaWidget), provides=IObjectFactory) +class GeoAreaObjectFactory(object): + """GeoArea object factory""" + + def __init__(self, context, request, form, widget): + self.context = context + self.request = request + self.form = form + self.widget = widget + + def __call__(self, data): + result = GeoArea() + for name, value in data.items(): + setattr(result, name, value) + return result + + +@widgettemplate_config(mode='input', template='templates/geoarea-input.pt', layer=IFormLayer) +@implementer_only(IGeoAreaWidget) +class GeoAreaWidget(ObjectWidget): + """GeoArea widget""" + + def updateWidgets(self, setErrors=True): + super(GeoAreaWidget, self).updateWidgets() + widgets = self.subform.widgets + widgets['x1'].input_css_class = 'col-md-2' + widgets['y1'].input_css_class = 'col-md-2' + widgets['x2'].input_css_class = 'col-md-2' + widgets['y2'].input_css_class = 'col-md-2' + widgets['x1'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + widgets['y1'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + widgets['x2'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + widgets['y2'].object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.area.changedProjection'}} + alsoProvides(widgets['x1'], IObjectData) + alsoProvides(widgets['y1'], IObjectData) + alsoProvides(widgets['x2'], IObjectData) + alsoProvides(widgets['y2'], IObjectData) + alsoProvides(widgets['projection'], IObjectData) + + @property + def wgs_coordinates(self): + value = self.field.get(self.field.interface(self.context)) + if not value: + return json.dumps({'x1': None, + 'y1': None, + 'x2': None, + 'y2': None}) + else: + point1, point2 = value.wgs_coordinates + return json.dumps({'x1': float(point1[0]), + 'y1': float(point1[1]), + 'x2': float(point2[0]), + 'y2': float(point2[1])}) + + +@adapter_config(context=(IGeoAreaField, IFormLayer), provides=IFieldWidget) +def GeoAreaFieldWidget(field, request): + """GeoArea field widget factory""" + return FieldWidget(field, GeoAreaWidget(request)) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/widget/point.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/widget/point.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,141 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +import json + +# import interfaces +from pyams_gis.interfaces import IGeoPointZ +from pyams_form.interfaces.form import IFormLayer, IForm +from pyams_gis.interfaces.widget import IGeoPointWidget, IGeoPointZWidget +from pyams_gis.schema import IGeoPoint, IGeoPointField, IGeoPointZField +from pyams_utils.interfaces.data import IObjectData +from z3c.form.interfaces import IFieldWidget, IObjectFactory + +# import packages +from pyams_form.widget import widgettemplate_config +from pyams_gis.point import GeoPoint, GeoPointZ +from pyams_utils.adapter import adapter_config +from z3c.form.browser.object import ObjectWidget +from z3c.form.object import getIfName +from z3c.form.widget import FieldWidget +from zope.interface import implementer_only, alsoProvides, Interface + + +@adapter_config(name=getIfName(IGeoPoint), + context=(Interface, IFormLayer, IForm, IGeoPointWidget), provides=IObjectFactory) +class GeoPointObjectFactory(object): + """GeoPointZ object factory""" + + def __init__(self, context, request, form, widget): + self.context = context + self.request = request + self.form = form + self.widget = widget + + def __call__(self, data): + result = GeoPoint() + for name, value in data.items(): + setattr(result, name, value) + return result + + +@widgettemplate_config(mode='input', template='templates/geopoint-input.pt', layer=IFormLayer) +@implementer_only(IGeoPointWidget) +class GeoPointWidget(ObjectWidget): + """GeoPoint widget""" + + def updateWidgets(self, setErrors=True): + super(GeoPointWidget, self).updateWidgets(setErrors) + widgets = self.subform.widgets + widgets['longitude'].input_css_class = 'col-md-2' + widgets['latitude'].input_css_class = 'col-md-2' + widgets['longitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'} + widgets['latitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'} + widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.position.changedProjection'}} + alsoProvides(widgets['longitude'], IObjectData) + alsoProvides(widgets['latitude'], IObjectData) + alsoProvides(widgets['projection'], IObjectData) + + @property + def wgs_coordinates(self): + value = self.field.get(self.field.interface(self.context)) + if not value: + return json.dumps({'longitude': None, + 'latitude': None}) + else: + point = value.wgs_coordinates + return json.dumps({'longitude': float(point[0]), + 'latitude': float(point[1])}) + + +@adapter_config(context=(IGeoPointField, IFormLayer), provides=IFieldWidget) +def GeoPointFieldWidget(field, request): + """GeoPoint field widget factory""" + return FieldWidget(field, GeoPointWidget(request)) + + +@adapter_config(name=getIfName(IGeoPointZ), + context=(Interface, IFormLayer, IForm, IGeoPointZWidget), provides=IObjectFactory) +class GeoPointZObjectFactory(object): + """GeoPointZ object factory""" + + def __init__(self, context, request, form, widget): + self.context = context + self.request = request + self.form = form + self.widget = widget + + def __call__(self, data): + result = GeoPointZ() + for name, value in data.items(): + setattr(result, name, value) + return result + + +@widgettemplate_config(mode='input', template='templates/geopoint-input.pt', layer=IFormLayer) +@implementer_only(IGeoPointZWidget) +class GeoPointZWidget(ObjectWidget): + """GeoPointZ widget""" + + def updateWidgets(self, setErrors=True): + super(GeoPointZWidget, self).updateWidgets(setErrors) + widgets = self.subform.widgets + widgets['longitude'].input_css_class = 'col-md-2' + widgets['latitude'].input_css_class = 'col-md-2' + widgets['altitude'].input_css_class = 'col-md-2' + widgets['longitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'} + widgets['latitude'].object_data = {'ams-change-handler': 'PyAMS_GIS.position.changedCoordinate'} + widgets['projection'].object_data = {'ams-events-handlers': {'change.select2': 'PyAMS_GIS.position.changedProjection'}} + alsoProvides(widgets['longitude'], IObjectData) + alsoProvides(widgets['latitude'], IObjectData) + alsoProvides(widgets['projection'], IObjectData) + + @property + def wgs_coordinates(self): + value = self.field.get(self.field.interface(self.context)) + if not value: + return json.dumps({'longitude': None, + 'latitude': None}) + else: + point = value.wgs_coordinates + return json.dumps({'longitude': float(point[0]), + 'latitude': float(point[1])}) + + +@adapter_config(context=(IGeoPointZField, IFormLayer), provides=IFieldWidget) +def GeoPointZFieldWidget(field, request): + """GeoPointZ field widget factory""" + return FieldWidget(field, GeoPointZWidget(request)) diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/widget/templates/geoarea-input.pt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/widget/templates/geoarea-input.pt Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,76 @@ +
    +
    + + + + + + +
    + +
    + +
    +
    +
    +
    + +
    +
    diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/widget/templates/geopoint-input.pt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/widget/templates/geopoint-input.pt Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,76 @@ +
    +
    + + + + + + +
    + +
    + +
    +
    +
    +
    + +
    +
    diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/zmi/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/zmi/__init__.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces + +# import packages diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/zmi/interfaces.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/zmi/interfaces.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_skin.interfaces.viewlet import IMenuItem + +# import packages +from zope.interface import Interface + + +class IMapManagerMenu(IMenuItem): + """Map manager menu interface""" + + +class ILayerAddForm(Interface): + """Layer add form marker interface""" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/zmi/layer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/zmi/layer.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,440 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_form.form import AJAXAddForm, AJAXEditForm +from pyams_gis.interfaces.layer import ITileMapLayer, IWMSMapLayer, IGeoportalMapLayer, IEsriFeatureMapLayer, \ + IGoogleMapLayer +from pyams_gis.interfaces.utility import IMapManager +from pyams_gis.layer import TileMapLayer, WMSMapLayer, GeoportalMapLayer, EsriFeatureMapLayer, GoogleMapLayer +from pyams_gis.zmi.interfaces import ILayerAddForm +from pyams_i18n.interfaces import II18n +from pyams_skin.interfaces.viewlet import IToolbarAddingMenu +from pyams_skin.layer import IPyAMSLayer +from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, VIEW_SYSTEM_PERMISSION +from pyams_zmi.layer import IAdminLayer +from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE +from zope.component.interfaces import ISite + +# import packages +from pyams_gis.zmi.utility import MapManagerLayersTable +from pyams_pagelet.pagelet import pagelet_config +from pyams_skin.viewlet.toolbar import ToolbarMenuItem +from pyams_utils.registry import query_utility +from pyams_utils.url import absolute_url +from pyams_viewlet.viewlet import viewlet_config +from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm +from pyramid.events import subscriber +from pyramid.view import view_config +from z3c.form import field +from zope.interface import implementer, Invalid + +from pyams_gis import _ + + +@subscriber(IDataExtractedEvent, form_selector=ILayerAddForm) +def handle_new_geoportal_layer_data(event): + """Handle new layer data extraction""" + manager = query_utility(IMapManager) + name = event.data.get('name') + if name in manager: + event.form.widgets.errors += (Invalid(_("Specified layer name already exists!"))) + + +# +# Base tiles layer forms +# + +@viewlet_config(name='add-tile-layer.menu', context=ISite, layer=IAdminLayer, + view=MapManagerLayersTable, manager=IToolbarAddingMenu, + permission=MANAGE_SYSTEM_PERMISSION, weight=10) +class TileLayerAddMenu(ToolbarMenuItem): + """Tile layer add menu""" + + label = _("Add tile layer...") + label_css_class = 'fa fa-fw fa-globe' + url = 'add-tile-layer.html' + modal_target = True + + +@pagelet_config(name='add-tile-layer.html', context=ISite, layer=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION) +@implementer(ILayerAddForm) +class TileLayerAddForm(AdminDialogAddForm): + """Tile layer add form""" + + title = _("Maps manager") + legend = _("Add tile layer") + icon_css_class = 'fa fa-fw fa-globe' + dialog_class = 'modal-large' + + fields = field.Fields(ITileMapLayer).omit('__name__', '__parent__') + ajax_handler = 'add-tile-layer.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def create(self, data): + return TileMapLayer() + + def add(self, layer): + context = query_utility(IMapManager) + context[layer.name] = layer + + def nextURL(self): + return absolute_url(self.context, self.request, 'map-manager.html') + + +@view_config(name='add-tile-layer.json', context=ISite, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class TileLayerAJAXAddForm(AJAXAddForm, TileLayerAddForm): + """Tile layer add form, JSON renderer""" + + +@pagelet_config(name='properties.html', context=ITileMapLayer, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +class TileLayerEditForm(AdminDialogEditForm): + """Tile layer edit form""" + + @property + def title(self): + return II18n(self.context).query_attribute('title', request=self.request) + + legend = _("Edit layer properties") + icon_css_class = 'fa fa-fw fa-globe' + dialog_class = 'modal-large' + + fields = field.Fields(ITileMapLayer).omit('__name__', '__parent__') + ajax_handler = 'properties.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def updateWidgets(self, prefix=None): + super(TileLayerEditForm, self).updateWidgets(prefix) + if 'name' in self.widgets: + self.widgets['name'].mode = DISPLAY_MODE + + +@view_config(name='properties.json', context=ITileMapLayer, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class TileLayerAJAXEditForm(AJAXEditForm, TileLayerEditForm): + """Tile layer edit form, JSON renderer""" + + +# +# WMS layer forms +# + +@viewlet_config(name='add-wms-layer.menu', context=ISite, layer=IAdminLayer, + view=MapManagerLayersTable, manager=IToolbarAddingMenu, + permission=MANAGE_SYSTEM_PERMISSION, weight=20) +class WMSLayerAddMenu(ToolbarMenuItem): + """WMS layer add menu""" + + label = _("Add WMS layer...") + label_css_class = 'fa fa-fw fa-map' + url = 'add-wms-layer.html' + modal_target = True + + +@pagelet_config(name='add-wms-layer.html', context=ISite, layer=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION) +@implementer(ILayerAddForm) +class WMSLayerAddForm(AdminDialogAddForm): + """WMS layer add form""" + + title = _("Maps manager") + legend = _("Add WMS layer") + icon_css_class = 'fa fa-fw fa-map' + dialog_class = 'modal-large' + + fields = field.Fields(IWMSMapLayer).omit('__name__', '__parent__') + ajax_handler = 'add-wms-layer.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def create(self, data): + return WMSMapLayer() + + def add(self, layer): + context = query_utility(IMapManager) + context[layer.name] = layer + + def nextURL(self): + return absolute_url(self.context, self.request, 'map-manager.html') + + +@view_config(name='add-wms-layer.json', context=ISite, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class WMSLayerAJAXAddForm(AJAXAddForm, WMSLayerAddForm): + """WMS layer add form, JSON renderer""" + + +@pagelet_config(name='properties.html', context=IWMSMapLayer, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +class WMSLayerEditForm(AdminDialogEditForm): + """WMS layer edit form""" + + @property + def title(self): + return II18n(self.context).query_attribute('title', request=self.request) + + legend = _("Edit layer properties") + icon_css_class = 'fa fa-fw fa-map' + dialog_class = 'modal-large' + + fields = field.Fields(IWMSMapLayer).omit('__name__', '__parent__') + ajax_handler = 'properties.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def updateWidgets(self, prefix=None): + super(WMSLayerEditForm, self).updateWidgets(prefix) + if 'name' in self.widgets: + self.widgets['name'].mode = DISPLAY_MODE + + +@view_config(name='properties.json', context=IWMSMapLayer, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class WMSLayerAJAXEditForm(AJAXEditForm, WMSLayerEditForm): + """WMS layer edit form, JSON renderer""" + + +# +# Geoportal layer forms +# + +@viewlet_config(name='add-geoportal-layer.menu', context=ISite, layer=IAdminLayer, + view=MapManagerLayersTable, manager=IToolbarAddingMenu, + permission=MANAGE_SYSTEM_PERMISSION, weight=50) +class GeoportalLayerAddMenu(ToolbarMenuItem): + """Geoportal layer add menu""" + + label = _("Add Geoportal WMS layer...") + label_css_class = 'fa fa-fw fa-map-o' + url = 'add-geoportal-layer.html' + modal_target = True + + +@pagelet_config(name='add-geoportal-layer.html', context=ISite, layer=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION) +@implementer(ILayerAddForm) +class GeoportalLayerAddForm(AdminDialogAddForm): + """Geoportal layer add form""" + + title = _("Maps manager") + legend = _("Add IGN Geoportal layer") + icon_css_class = 'fa fa-fw fa-map-o' + dialog_class = 'modal-large' + + fields = field.Fields(IGeoportalMapLayer).omit('__name__', '__parent__') + ajax_handler = 'add-geoportal-layer.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def create(self, data): + return GeoportalMapLayer() + + def add(self, layer): + context = query_utility(IMapManager) + context[layer.name] = layer + + def nextURL(self): + return absolute_url(self.context, self.request, 'map-manager.html') + + +@view_config(name='add-geoportal-layer.json', context=ISite, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class GeoportalLayerAJAXAddForm(AJAXAddForm, GeoportalLayerAddForm): + """Geoportal layer add form, JSON renderer""" + + +@pagelet_config(name='properties.html', context=IGeoportalMapLayer, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +class GeoportalLayerEditForm(AdminDialogEditForm): + """Geoportal layer edit form""" + + @property + def title(self): + return II18n(self.context).query_attribute('title', request=self.request) + + legend = _("Edit layer properties") + icon_css_class = 'fa fa-fw fa-map-o' + dialog_class = 'modal-large' + + fields = field.Fields(IGeoportalMapLayer).omit('__name__', '__parent__') + ajax_handler = 'properties.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def updateWidgets(self, prefix=None): + super(GeoportalLayerEditForm, self).updateWidgets(prefix) + if 'name' in self.widgets: + self.widgets['name'].mode = DISPLAY_MODE + + +@view_config(name='properties.json', context=IGeoportalMapLayer, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class GeoportalLayerAJAXEditForm(AJAXEditForm, GeoportalLayerEditForm): + """Geoportal layer edit form, JSON renderer""" + + +# +# ESRI feature layer forms +# + +@viewlet_config(name='add-esri-feature-layer.menu', context=ISite, layer=IAdminLayer, + view=MapManagerLayersTable, manager=IToolbarAddingMenu, + permission=MANAGE_SYSTEM_PERMISSION, weight=70) +class EsriFeatureLayerAddMenu(ToolbarMenuItem): + """ESRI feature layer add menu""" + + label = _("Add ESRI feature layer...") + label_css_class = 'fa fa-fw fa-map-signs' + url = 'add-esri-feature-layer.html' + modal_target = True + + +@pagelet_config(name='add-esri-feature-layer.html', context=ISite, layer=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION) +@implementer(ILayerAddForm) +class EsriFeatureLayerAddForm(AdminDialogAddForm): + """ESRI feature layer add form""" + + title = _("Maps manager") + legend = _("Add ESRI feature layer") + icon_css_class = 'fa fa-fw fa-map-signs' + dialog_class = 'modal-large' + + fields = field.Fields(IEsriFeatureMapLayer).omit('__name__', '__parent__') + ajax_handler = 'add-esri-feature-layer.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def create(self, data): + return EsriFeatureMapLayer() + + def add(self, layer): + context = query_utility(IMapManager) + context[layer.name] = layer + + def nextURL(self): + return absolute_url(self.context, self.request, 'map-manager.html') + + +@view_config(name='add-esri-feature-layer.json', context=ISite, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class EsriFeatureLayerAJAXAddForm(AJAXAddForm, EsriFeatureLayerAddForm): + """ESRI feature layer add form, JSON renderer""" + + +@pagelet_config(name='properties.html', context=IEsriFeatureMapLayer, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +class EsriFeatureLayerEditForm(AdminDialogEditForm): + """ESRI feature layer edit form""" + + @property + def title(self): + return II18n(self.context).query_attribute('title', request=self.request) + + legend = _("Edit layer properties") + icon_css_class = 'fa fa-fw fa-map-signs' + dialog_class = 'modal-large' + + fields = field.Fields(IEsriFeatureMapLayer).omit('__name__', '__parent__') + ajax_handler = 'properties.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def updateWidgets(self, prefix=None): + super(EsriFeatureLayerEditForm, self).updateWidgets(prefix) + if 'name' in self.widgets: + self.widgets['name'].mode = DISPLAY_MODE + + +@view_config(name='properties.json', context=IEsriFeatureMapLayer, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class EsriFeatureLayerAJAXEditForm(AJAXEditForm, EsriFeatureLayerEditForm): + """ESRI feature layer edit form, JSON renderer""" + + +# +# Google maps layer forms +# + +@viewlet_config(name='add-google-layer.menu', context=ISite, layer=IAdminLayer, + view=MapManagerLayersTable, manager=IToolbarAddingMenu, + permission=MANAGE_SYSTEM_PERMISSION, weight=80) +class GoogleMapLayerAddMenu(ToolbarMenuItem): + """Google Maps layer add menu""" + + label = _("Add Google Maps layer...") + label_css_class = 'fa fa-fw fa-map-marker' + url = 'add-google-layer.html' + modal_target = True + + +@pagelet_config(name='add-google-layer.html', context=ISite, layer=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION) +@implementer(ILayerAddForm) +class GoogleMapLayerAddForm(AdminDialogAddForm): + """Google Maps layer add form""" + + title = _("Maps manager") + legend = _("Add Google Maps layer") + icon_css_class = 'fa fa-fw fa-map-marker' + dialog_class = 'modal-large' + + fields = field.Fields(IGoogleMapLayer).omit('__name__', '__parent__') + ajax_handler = 'add-google-layer.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def create(self, data): + return GoogleMapLayer() + + def add(self, layer): + context = query_utility(IMapManager) + context[layer.name] = layer + + def nextURL(self): + return absolute_url(self.context, self.request, 'map-manager.html') + + +@view_config(name='add-google-layer.json', context=ISite, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class GoogleMapLayerAJAXAddForm(AJAXAddForm, GoogleMapLayerAddForm): + """Google Maps layer add form, JSON renderer""" + + +@pagelet_config(name='properties.html', context=IGoogleMapLayer, layer=IPyAMSLayer, + permission=VIEW_SYSTEM_PERMISSION) +class GoogleMapLayerEditForm(AdminDialogEditForm): + """Google Maps layer edit form""" + + @property + def title(self): + return II18n(self.context).query_attribute('title', request=self.request) + + legend = _("Edit layer properties") + icon_css_class = 'fa fa-fw fa-map-marker' + dialog_class = 'modal-large' + + fields = field.Fields(IGoogleMapLayer).omit('__name__', '__parent__') + ajax_handler = 'properties.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def updateWidgets(self, prefix=None): + super(GoogleMapLayerEditForm, self).updateWidgets(prefix) + if 'name' in self.widgets: + self.widgets['name'].mode = DISPLAY_MODE + + +@view_config(name='properties.json', context=IGoogleMapLayer, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class GoogleMapLayerAJAXEditForm(AJAXEditForm, GoogleMapLayerEditForm): + """Google Maps layer edit form, JSON renderer""" diff -r 000000000000 -r c73bb834ccbe src/pyams_gis/zmi/utility.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/zmi/utility.py Thu May 18 17:23:48 2017 +0200 @@ -0,0 +1,232 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_gis.interfaces.configuration import IMapConfiguration +from pyams_gis.interfaces.utility import IMapManager +from pyams_gis.zmi.interfaces import IMapManagerMenu +from pyams_skin.interfaces import IInnerPage, IPageHeader +from pyams_skin.interfaces.container import ITableElementEditor +from pyams_skin.layer import IPyAMSLayer +from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, VIEW_SYSTEM_PERMISSION +from pyams_zmi.interfaces.menu import IControlPanelMenu +from pyams_zmi.layer import IAdminLayer +from z3c.table.interfaces import IColumn, IValues +from zope.component.interfaces import ISite + +# import packages +from pyams_form.form import AJAXEditForm +from pyams_i18n.column import I18nAttrColumn +from pyams_pagelet.pagelet import pagelet_config +from pyams_skin.container import ContainerView +from pyams_skin.page import DefaultPageHeaderAdapter +from pyams_skin.table import DefaultElementEditorAdapter, BaseTable, I18nColumn, TrashColumn +from pyams_skin.viewlet.menu import MenuItem +from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter +from pyams_utils.registry import query_utility +from pyams_utils.traversing import get_parent +from pyams_utils.url import absolute_url +from pyams_viewlet.manager import viewletmanager_config +from pyams_viewlet.viewlet import viewlet_config +from pyams_zmi.form import AdminDialogEditForm +from pyams_zmi.view import AdminView +from pyramid.url import resource_url +from pyramid.view import view_config +from z3c.form import field +from z3c.table.column import GetAttrColumn +from zope.interface import implementer, Interface + +from pyams_gis import _ + + +@adapter_config(context=(IMapManager, IAdminLayer, Interface), provides=ITableElementEditor) +class MapManagerTableElementEditor(DefaultElementEditorAdapter): + """Map manager table element editor""" + + view_name = 'map-manager.html' + modal_target = False + + @property + def url(self): + site = get_parent(self.context, ISite) + return resource_url(site, self.request, 'admin#{0}'.format(self.view_name)) + + +@viewlet_config(name='map-manager.menu', context=ISite, layer=IAdminLayer, manager=IControlPanelMenu, + permission=VIEW_SYSTEM_PERMISSION, weight=6) +@viewletmanager_config(name='map-manager.menu', context=ISite, layer=IAdminLayer) +@implementer(IMapManagerMenu) +class MapManagerMenuItem(MenuItem): + """Map manager menu""" + + label = _("Maps manager") + icon_class = 'fa-map-marker' + url = '#map-manager.html' + + +class MapManagerLayersTable(BaseTable): + """Map manager layers table""" + + id = 'map_manager_layers_table' + title = _("Map manager layers") + + @property + def data_attributes(self): + manager = query_utility(IMapManager) + attributes = super(MapManagerLayersTable, self).data_attributes + table_attrs = {'data-ams-location': absolute_url(manager, self.request), + 'data-ams-delete-target': 'delete-layer.json'} + if 'table' in attributes: + attributes['table'].update(table_attrs) + else: + attributes['table'] = table_attrs + return attributes + + +@adapter_config(name='name', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn) +class MapManagerLayersNameColumn(I18nColumn, GetAttrColumn): + """Map manager layers name column""" + + _header = _("Name") + attrName = 'name' + weight = 10 + + +@adapter_config(name='layer_type', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn) +class MapManagerLayersTypeColumn(I18nColumn, GetAttrColumn): + """Map manager layers type column""" + + _header = _("Type") + attrName = 'layer_type' + weight = 15 + + def getValue(self, obj): + return self.request.localizer.translate(super(MapManagerLayersTypeColumn, self).getValue(obj)) + + +@adapter_config(name='title', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn) +class MapManagerLayersTitleColumn(I18nColumn, I18nAttrColumn): + """Map manager layers title column""" + + _header = _("Title") + attrName = 'title' + defaultValue = '--' + weight = 20 + + +@adapter_config(name='trash', context=(Interface, IAdminLayer, MapManagerLayersTable), provides=IColumn) +class MapManagerLayersTrashCOlumn(TrashColumn): + """Map manager layer trash column""" + + icon_hint = _("Delete layer") + permission = MANAGE_SYSTEM_PERMISSION + + +@adapter_config(context=(ISite, IAdminLayer, MapManagerLayersTable), provides=IValues) +class MapManagerValuesAdapter(ContextRequestViewAdapter): + """Map manager layers table values adapter""" + + @property + def values(self): + manager = query_utility(IMapManager) + if manager is not None: + return list(manager.values()) + return () + + +@pagelet_config(name='map-manager.html', context=ISite, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) +@implementer(IInnerPage) +class MapManagerView(AdminView, ContainerView): + """Map manager layers view""" + + table_class = MapManagerLayersTable + + +@adapter_config(context=(ISite, IAdminLayer, MapManagerView), provides=IPageHeader) +class MapManagerHeaderAdapter(DefaultPageHeaderAdapter): + """Map manager view header adapter""" + + icon_class = 'fa fa-fw fa-map-marker' + title = _("Control panel") + subtitle = _("Maps manager") + + +@viewlet_config(name='map-manager.configuration.menu', context=ISite, layer=IAdminLayer, + manager=IMapManagerMenu, permission=VIEW_SYSTEM_PERMISSION, weight=1) +class MapManagerConfigurationMenuItem(MenuItem): + """Map manager properties menu""" + + label = _("Configuration...") + url = 'configuration.html' + modal_target = True + + def get_url(self): + manager = query_utility(IMapManager) + return resource_url(manager, self.request, self.url) + + +@pagelet_config(name='configuration.html', context=IMapManager, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) +class MapManagerConfigurationEditForm(AdminDialogEditForm): + """Map manager edit form""" + + title = _("Maps manager") + legend = _("Default map configuration") + icon_css_class = 'fa fa-fw fa-map-marker' + dialog_class = 'modal-large' + + fields = field.Fields(IMapConfiguration) + + ajax_handler = 'configuration.json' + edit_permission = MANAGE_SYSTEM_PERMISSION + + def getContent(self): + return query_utility(IMapManager) + + +@view_config(name='configuration.json', context=IMapManager, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +class MapManagerConfigurationAJAXEditForm(AJAXEditForm, MapManagerConfigurationEditForm): + """Map manager edit form, JSON renderer""" + + +@view_config(name='delete-layer.json', context=IMapManager, request_type=IPyAMSLayer, + permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) +def delete_map_manager_layer(request): + """Delete layer from map manager""" + translate = request.localizer.translate + name = request.params.get('object_name') + if not name: + return {'status': 'message', + 'messagebox': {'status': 'error', + 'content': translate(_("No provided object_name argument!"))}} + if name not in request.context: + return {'status': 'message', + 'messagebox': {'status': 'error', + 'content': translate(_("Given layer name doesn't exist!"))}} + del request.context[name] + return {'status': 'success'} + + +@view_config(name='get-map-configuration.json', context=Interface, request_type=IPyAMSLayer, + renderer='json', xhr=True) +def get_map_configuration(request): + """Get map configuration in JSON format""" + manager = query_utility(IMapManager) + if manager is not None: + configuration = IMapConfiguration(manager) + if configuration is not None: + return configuration.get_configuration()