From bdcf6673db9d8cee2a98ea94fb340534ec04290a Mon Sep 17 00:00:00 2001 From: elias couppe Date: Mon, 30 Oct 2023 17:09:51 +0100 Subject: [PATCH] Release beta : 3.4.0-beta2 --- geoportal-access-lib-3.4.0-beta2.tgz | Bin 535230 -> 535375 bytes .../package/LICENCE.md | 47 + .../package/README.md | 376 + .../package/dist/GpServices-map.js | 836 ++ .../package/dist/GpServices-src.js | 10814 ++++++++++++++++ .../package/dist/GpServices.js | 30 + .../package/package.json | 96 + .../package/src/Exceptions/ErrorService.js | 72 + .../package/src/Formats/GML.js | 4 + .../package/src/Formats/GML/Geometry.js | 267 + .../package/src/Formats/WKT.js | 142 + .../package/src/Formats/WPS.js | 306 + .../package/src/Formats/XLS.js | 482 + .../src/Formats/XLS/AbstractService.js | 85 + .../src/Formats/XLS/LocationUtilityService.js | 194 + .../GeocodeFilterExtension.js | 188 + .../LocationUtilityService/GeocodeRequest.js | 226 + .../ReverseGeocodeRequest.js | 177 + .../LocationUtilityService/model/Address.js | 281 + .../LocationUtilityService/model/Building.js | 26 + .../XLS/LocationUtilityService/model/Place.js | 25 + .../LocationUtilityService/model/Position.js | 180 + .../model/PostalCode.js | 21 + .../model/Preference.js | 81 + .../LocationUtilityService/model/Street.js | 22 + .../model/StreetAddress.js | 32 + .../package/src/Formats/XLS/Request.js | 113 + .../package/src/Formats/XLS/RequestHeader.js | 83 + .../package/src/Formats/XLS/RouteService.js | 312 + .../XLS/RouteService/DetermineRouteRequest.js | 211 + .../XLS/RouteService/RouteRequestExtension.js | 10 + .../XLS/RouteService/model/AvoidList.js | 37 + .../model/RouteGeometryRequest.js | 31 + .../model/RouteInstructionsRequest.js | 35 + .../XLS/RouteService/model/RouteMapRequest.js | 35 + .../XLS/RouteService/model/RoutePlan.js | 255 + .../XLS/RouteService/model/RoutePreference.js | 31 + .../XLS/RouteService/model/WayPointList.js | 58 + .../package/src/Formats/XML.js | 360 + .../package/src/Gp.js | 109 + .../package/src/Protocols/JSONP.js | 247 + .../package/src/Protocols/Protocol.js | 139 + .../package/src/Protocols/XHR.js | 423 + .../package/src/Services/Alti/Alti.js | 253 + .../Alti/Formats/AltiResponseReader.js | 391 + .../Alti/Request/AltiRequestFactory.js | 130 + .../Services/Alti/Request/AltiRequestREST.js | 209 + .../Services/Alti/Request/AltiRequestWPS.js | 113 + .../Request/model/AltiElevationRequest.js | 108 + .../Alti/Request/model/AltiProfilRequest.js | 106 + .../Alti/Request/model/AltiRequest.js | 220 + .../Alti/Response/AltiResponseFactory.js | 188 + .../Alti/Response/model/AltiResponse.js | 23 + .../Services/Alti/Response/model/Elevation.js | 27 + .../Services/Alti/Response/model/Measure.js | 30 + .../src/Services/AutoComplete/AutoComplete.js | 227 + .../Response/AutoCompleteResponseFactory.js | 142 + .../Response/model/AutoCompleteResponse.js | 23 + .../Response/model/SuggestedLocation.js | 123 + .../package/src/Services/CommonService.js | 493 + .../package/src/Services/Config/Config.js | 310 + .../src/Services/Config/ConfigInterface.js | 319 + .../package/src/Services/DefaultUrlService.js | 295 + .../Geocode/Formats/GeocodeResponseParser.js | 134 + .../package/src/Services/Geocode/Geocode.js | 281 + .../Geocode/Request/GeocodeLocation.js | 48 + .../Geocode/Request/GeocodeRequestFactory.js | 54 + .../Geocode/Request/GeocodeRequestREST.js | 87 + .../Geocode/Request/model/CadastralParcel.js | 60 + .../Geocode/Request/model/GeocodeParamREST.js | 175 + .../Request/model/PositionOfInterest.js | 55 + .../Geocode/Request/model/StreetAddress.js | 56 + .../Response/GeocodeResponseFactory.js | 86 + .../Geocode/Response/model/GeocodeResponse.js | 24 + .../Response/model/GeocodedLocation.js | 77 + .../src/Services/Geocode/ReverseGeocode.js | 341 + .../Formats/ProcessIsoCurveResponseReader.js | 284 + .../ProcessIsoCurve/ProcessIsoCurve.js | 323 + .../Request/ProcessIsoCurveRequest.js | 190 + .../Request/model/ProcessIsoCurveParam.js | 202 + .../ProcessIsoCurveResponseFactory.js | 106 + .../Response/model/ProcessIsoCurveResponse.js | 45 + .../Route/Request/RouteRequestFactory.js | 86 + .../Route/Request/RouteRequestREST.js | 102 + .../Route/Request/model/RouteParamREST.js | 242 + .../Route/Response/RouteResponseFactory.js | 247 + .../Route/Response/model/RouteInstruction.js | 48 + .../Route/Response/model/RouteResponse.js | 40 + .../package/src/Services/Route/Route.js | 328 + .../package/src/Services/Services.js | 290 + .../package/src/Utils/Helper.js | 117 + .../package/src/Utils/LoggerByDefault.js | 21 + .../package/src/Utils/MessagesResources.js | 78 + 93 files changed, 25456 insertions(+) create mode 100644 geoportal-access-lib-3.4.0-beta2/package/LICENCE.md create mode 100644 geoportal-access-lib-3.4.0-beta2/package/README.md create mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/package.json create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Exceptions/ErrorService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/GML.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/GML/Geometry.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/DetermineRouteRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Gp.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js create mode 100644 geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js diff --git a/geoportal-access-lib-3.4.0-beta2.tgz b/geoportal-access-lib-3.4.0-beta2.tgz index f3fe97d62aaee2367148b45f264b83727f06b139..e401b714a873e4ddc846647929b96e60a84f37f6 100644 GIT binary patch delta 504989 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˓<=g6BV3%k(Ds_Q>K)4$})!>;X!+&_t+R4Iy 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%0Ait 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 ei?>Iq32wLnrPm&CFTA>Ar6*jy(DW(6ZF>BL=P# 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≥iP7-2i9|xBxQ_-qW&|XzQuC3N6kIPe0;6 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 z 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≷(p0IfPg;i#>aHo1M27OTcRyi~s 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%0DcU3ddu5q@{CEZ`gpD!Lf0(5 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

FaoYBv3#^C)< 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

(back to top)

+ +## Utilisation + +Le chargement de la bibliothèque d'accès vous donne accès au namespace [Gp.Services](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html) à partir duquel vous pouvez utiliser les différentes fonctions proposées. + + + +### Géocoder des adresses, toponymes et parcelles cadastrales + +La fonction [Gp.Services.geocode](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~geocode) permet d'utiliser le service de géocodage de la plateforme Géoportail pour obtenir la position d'un toponyme, d'une adresse ou d'une parcelle cadastrale. Elle prend en paramètres : + +* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. + +* le **localisant** dont on veut obtenir les coordonnées ; + +* le **type de localisant** : adresse ("StreetAddress"), toponyme ("PositionOfInterest") ou parcelle cadastrale ("CadastralParcel"). Choix multiple possible. Par défaut les adresses seront utilisées. + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GeocodeResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GeocodeResponse.html). + + +``` javascript +Gp.Services.geocode({ + apiKey : "calcul", // clef d'accès à la plateforme + location : "tour eiffel", // localisant à géocoder + filterOptions : { + type : ["PositionOfInterest"] // type de localisant + }, + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.GeocodeResponse + ... + } + +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/saye4oaz/embedded/result,js,html,css/) + +

(back to top)

+ + + +### Obtenir des suggestions d'adresses ou de toponymes à partir de textes incomplets + +La fonction [Gp.Services.autoComplete](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~autoComplete) permet d'utiliser le service d'autocomplétion de la plateforme Géoportail pour obtenir des suggestions de loclalisants (toponyme ou adresse) à partir d'un texte incomplet. Elle prend en paramètres : + +* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. + +* le **texte** pour lequel on souhaite obtenir des suggestions + +* le **type de localisant** : adresse ("StreetAddress") ou toponyme ("PositionOfInterest"). Choix multiple possible. Par défaut les adresses seront utilisées. + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.AutoCompleteResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AutoCompleteResponse.html). + + +``` javascript +Gp.Services.autoComplete({ + apiKey : "calcul", // clef d'accès à la plateforme + text : "23 rue des et", // texte à compléter + filterOptions : { + type : ["StreetAddress"] // type de texte + }, + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.AutoCompleteResponse + ... + } + +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/jsjqk4wq/embedded/result,js,html,css/) + +

(back to top)

+ + + +### Obtenir des localisants (toponymes, adresses, parcelles cadastrales) proches d'une position donnée (géocodage inverse) + +La fonction [Gp.Services.reverseGeocode](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~reverseGeocode) permet d'utiliser le service de géocodage inverse de la plateforme Géoportail pour trouver des toponymes, adresses ou parcelles cadastrales proches d'une position donnée. Elle prend en paramètres : + +* une (ou des) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources de recherche OpenLS du Géoportail. + +* une **position** donnée + +* le **type de localisant** : adresse ("StreetAddress"), toponyme ("PositionOfInterest") ou parcelle cadastrale ("CadastralParcel"). Choix multiple possible. Par défaut les adresses seront utilisées. + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GeocodeResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GeocodeResponse.html). + + +``` javascript +Gp.Services.reverseGeocode({ + apiKey : "calcul", // clef d'accès à la plateforme + position : { // position de recherche + x: 2.29, + y: 48.85 + }, + filterOptions : { + type : ["PositionOfInterest"] // type de localisant + }, + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.ReverseGeocodeResponse + ... + } + +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/4t0wfey5/embedded/result,js,html,css/) + +

(back to top)

+ + + +### Obtenir des altitudes en un ou plusieurs points ou calculer des profils altimétriques + +La fonction [Gp.Services.getAltitude()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getAltitude) permet d'utiliser le service d'altimétrie de la plateforme Géoportail pour obtenir les altitudes de une ou plusieurs positions données ou calculer un profil altimétrique le long d'une liste de positions. Elle prend en paramètres : + +* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources altimétriques du Géoportail. + +* une **liste de positions** données + +* un éventuel paramètre (sampling) indiquant le **nombre de points intermédiaires** à utiliser dans le cas du calcul d'un profil altimétrique. + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.AltiResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.AltiResponse.html). + + +``` javascript +Gp.Services.getAltitude({ + apiKey : "altimetrie", // clef d'accès à la plateforme + positions : [ // positions pour le calcul alti + { lon: 2.29, lat: 48.85 }, + { lon: 2.3, lat: 48.9 }, + { lon: 2.4, lat: 49 } + ], + sampling : 50, // nombre de points pour le profil + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.AltiResponse + ... + } +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/owxffaf3/embedded/result,js,html,css/) + +

(back to top)

+ + + +### Calculer un itinéraire piéton ou routier + +La fonction [Gp.Services.route()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~route) permet d'utiliser le service de calcul d'itinéraires de la plateforme Géoportail. Elle prend en paramètres : + +* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources utilisés par le calcul d'itinéraire du Géoportail : graphe routier ou piéton. + +* des **points de départ, d'arrivée** et éventuellement **intermédiaires**. + +* le **graphe** utilisé pour le calcul correspondant au profil de véhicule (piéton ou routier) + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.RouteResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.RouteResponse.html). + + +``` javascript +Gp.Services.route({ + apiKey : "carte", // clef d'accès à la plateforme + startPoint : { x: 2, y: 45}, // point de départ + viaPoints : [ // points intermédiaires + { x: 3, y: 46 }, + { x: 3.5, y: 46 } + ], + endPoint : { x: 4, y: 47}, // point d'arrivée + graph : "Voiture", // grapĥe utilisé + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.RouteResponse + ... + } +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/prvrjd93/embedded/result,js,html,css/) + +

(back to top)

+ + + +### Calculer des isochrones / isodistances autour d'un point + +La fonction [Gp.Services.isoCurve()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~isoCurve) permet d'utiliser le service de calcul d'isochrones / isodistances de la plateforme Géoportail. Elle prend en paramètres : + +* une **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) ayant les droits sur les ressources utilisés par le calcul d'isochrones / isodistances du Géoportail : graphe routier ou piéton. + +* une **position de référence** (départ ou arrivée) pour le calcul. + +* la **limite de temps ou distance** pour le calcul. + +* le **type de calcul** (isochrone ou isodistance). + +* le **graphe** utilisé pour le calcul correspondant au profil de véhicule (piéton ou routier) + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.IsoCurveResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.IsoCurveResponse.html). + + +``` javascript +Gp.Services.isoCurve({ + apiKey : "carte", // clef d'accès à la plateforme + position : { x: 2, y: 45}, // point de référence + method : "time", // méthode de calcul (isochrone) + time : 1000, // limite de temps (isochrone) + graph : "Pieton", // grapĥe utilisé + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.IsoCurveResponse + ... + } +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/x1hcak86/embedded/result,js,html,css/) + +

(back to top)

+ + + +## Obtenir des informations relatives à un contrat d'accès au Géoportail + +La fonction [Gp.Services.getConfig()](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/module-Services.html#~getConfig) permet de consulter les ressources disponibles pour une clef d'accès à la plateforme et d'avoir les paramètres permettant leur utilisation. Elle prend en paramètres : + +* une (ou plusieurs) **clef d'accès à la plateforme Géoportail** obtenue sur le site [geoservices.ign.fr](https://geoservices.ign.fr/services-web) dont on veut consulter les droits. + +* d'autres paramètres éventuels à passer au service... + +* la **fonction de traitement des résultats** qui sera appelée lorsqu'ils seront reçus. Cette fonction prend en paramètres un objet de type : [Gp.Services.GetConfigResponse](http://ignf.github.io/geoportal-access-lib/latest/jsdoc/Gp.Services.GetConfigResponse.html). Les informations portées par cet objet sont aussi enregistrées en variable globale de l'application sous le nom : Gp.Config. + + +``` javascript +Gp.Services.getConfig({ + apiKey : "carte", // clef d'accès à la plateforme + onSuccess : function (result) { + // exploitation des resultats : "result" est de type Gp.Services.GetConfigResponse + ... + } +}); +``` + +**Exemple d'utilisation** [![jsFiddle](http://jsfiddle.net/img/embeddable/logo-dark.png)](http://jsfiddle.net/ignfgeoportail/0hsanbv2/embedded/result,js,html,css/) + +

(back to top)

diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js new file mode 100644 index 00000000..f33b7d72 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-map.js @@ -0,0 +1,836 @@ +/*! + * @brief Geoportal resources access library + * + * 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 3.4.0-beta2 + * @date 27/10/2023 + * + */ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.4 + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("node-fetch"), require("xmldom")); + else if(typeof define === 'function' && define.amd) + define("Gp", ["require", "require"], factory); + else if(typeof exports === 'object') + exports["Gp"] = factory(require("node-fetch"), require("xmldom")); + else + root["Gp"] = factory(root[undefined], root[undefined]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_node_fetch__, __WEBPACK_EXTERNAL_MODULE_xmldom__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/es6-promise/dist/es6-promise.js": +/*!******************************************************!*\ + !*** ./node_modules/es6-promise/dist/es6-promise.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(process, global) {/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\tundefined;\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && \"function\" === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ \"./node_modules/process/browser.js\"), __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzPzEzNjgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLEtBQTREO0FBQzdELENBQUMsU0FDK0I7QUFDaEMsQ0FBQyxxQkFBcUI7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0Y7O0FBRWhGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHNCQUFzQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQyx5Q0FBeUMsVUFBYztBQUN4RDtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxVQUFVLElBQUk7QUFDZDtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQix3QkFBd0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiw2Q0FBNkM7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxNQUFNO0FBQ2hCLFVBQVUsT0FBTztBQUNqQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLE1BQU07QUFDaEI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxxQkFBcUIsWUFBWTtBQUNqQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFVBQVUsSUFBSTtBQUNkO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsVUFBVSxTQUFTO0FBQ25CLFVBQVUsU0FBUztBQUNuQjtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLFNBQVM7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLFlBQVksU0FBUztBQUNyQixhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLENBQUM7Ozs7QUFJRCIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3N0ZWZhbnBlbm5lci9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICB2NC4yLjgrMWU2OGRjZTZcbiAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChnbG9iYWwuRVM2UHJvbWlzZSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHg7XG4gIHJldHVybiB4ICE9PSBudWxsICYmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuXG5cbnZhciBfaXNBcnJheSA9IHZvaWQgMDtcbmlmIChBcnJheS5pc0FycmF5KSB7XG4gIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbn0gZWxzZSB7XG4gIF9pc0FycmF5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xufVxuXG52YXIgaXNBcnJheSA9IF9pc0FycmF5O1xuXG52YXIgbGVuID0gMDtcbnZhciB2ZXJ0eE5leHQgPSB2b2lkIDA7XG52YXIgY3VzdG9tU2NoZWR1bGVyRm4gPSB2b2lkIDA7XG5cbnZhciBhc2FwID0gZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgYXJnKSB7XG4gIHF1ZXVlW2xlbl0gPSBjYWxsYmFjaztcbiAgcXVldWVbbGVuICsgMV0gPSBhcmc7XG4gIGxlbiArPSAyO1xuICBpZiAobGVuID09PSAyKSB7XG4gICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgIC8vIElmIGFkZGl0aW9uYWwgY2FsbGJhY2tzIGFyZSBxdWV1ZWQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmbHVzaGVkLCB0aGV5XG4gICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgIGlmIChjdXN0b21TY2hlZHVsZXJGbikge1xuICAgICAgY3VzdG9tU2NoZWR1bGVyRm4oZmx1c2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZUZsdXNoKCk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICBjdXN0b21TY2hlZHVsZXJGbiA9IHNjaGVkdWxlRm47XG59XG5cbmZ1bmN0aW9uIHNldEFzYXAoYXNhcEZuKSB7XG4gIGFzYXAgPSBhc2FwRm47XG59XG5cbnZhciBicm93c2VyV2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG52YXIgYnJvd3Nlckdsb2JhbCA9IGJyb3dzZXJXaW5kb3cgfHwge307XG52YXIgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGlzTm9kZSA9IHR5cGVvZiBzZWxmID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4vLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxudmFyIGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuLy8gbm9kZVxuZnVuY3Rpb24gdXNlTmV4dFRpY2soKSB7XG4gIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N1am9qcy93aGVuL2lzc3Vlcy80MTAgZm9yIGRldGFpbHNcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gIH07XG59XG5cbi8vIHZlcnR4XG5mdW5jdGlvbiB1c2VWZXJ0eFRpbWVyKCkge1xuICBpZiAodHlwZW9mIHZlcnR4TmV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmVydHhOZXh0KGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbn1cblxuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLmRhdGEgPSBpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMjtcbiAgfTtcbn1cblxuLy8gd2ViIHdvcmtlclxuZnVuY3Rpb24gdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZmx1c2g7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVNldFRpbWVvdXQoKSB7XG4gIC8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIGVzNi1wcm9taXNlIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuICAvLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbiAgdmFyIGdsb2JhbFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnbG9iYWxTZXRUaW1lb3V0KGZsdXNoLCAxKTtcbiAgfTtcbn1cblxudmFyIHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcbiAgICB2YXIgYXJnID0gcXVldWVbaSArIDFdO1xuXG4gICAgY2FsbGJhY2soYXJnKTtcblxuICAgIHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgIHF1ZXVlW2kgKyAxXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRWZXJ0eCgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmVydHggPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpLnJlcXVpcmUoJ3ZlcnR4Jyk7XG4gICAgdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICByZXR1cm4gdXNlVmVydHhUaW1lcigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbiAgfVxufVxuXG52YXIgc2NoZWR1bGVGbHVzaCA9IHZvaWQgMDtcbi8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG5pZiAoaXNOb2RlKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VOZXh0VGljaygpO1xufSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTXV0YXRpb25PYnNlcnZlcigpO1xufSBlbHNlIGlmIChpc1dvcmtlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTtcbn0gZWxzZSBpZiAoYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSBhdHRlbXB0VmVydHgoKTtcbn0gZWxzZSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIHBhcmVudCA9IHRoaXM7XG5cbiAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaWYgKGNoaWxkW1BST01JU0VfSURdID09PSB1bmRlZmluZWQpIHtcbiAgICBtYWtlUHJvbWlzZShjaGlsZCk7XG4gIH1cblxuICB2YXIgX3N0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuXG4gIGlmIChfc3RhdGUpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbX3N0YXRlIC0gMV07XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaW52b2tlQ2FsbGJhY2soX3N0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHBhcmVudC5fcmVzdWx0KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAgYFByb21pc2UucmVzb2x2ZWAgcmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSByZXNvbHZlZCB3aXRoIHRoZVxuICBwYXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHJlc29sdmUoMSk7XG4gIH0pO1xuXG4gIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgLy8gdmFsdWUgPT09IDFcbiAgfSk7XG4gIGBgYFxuXG4gIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKDEpO1xuXG4gIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgLy8gdmFsdWUgPT09IDFcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgcmVzb2x2ZVxuICBAc3RhdGljXG4gIEBwYXJhbSB7QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aFxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIGZ1bGZpbGxlZCB3aXRoIHRoZSBnaXZlblxuICBgdmFsdWVgXG4qL1xuZnVuY3Rpb24gcmVzb2x2ZSQxKG9iamVjdCkge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxudmFyIFBST01JU0VfSUQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMik7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgUEVORElORyA9IHZvaWQgMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcblxuZnVuY3Rpb24gc2VsZkZ1bGZpbGxtZW50KCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG59XG5cbmZ1bmN0aW9uIGNhbm5vdFJldHVybk93bigpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VGhlbih0aGVuJCQxLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gIHRyeSB7XG4gICAgdGhlbiQkMS5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuJCQxKSB7XG4gIGFzYXAoZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgdmFyIGVycm9yID0gdHJ5VGhlbih0aGVuJCQxLCB0aGVuYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoc2VhbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHNlYWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgIH1cbiAgfSwgcHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IEZVTEZJTExFRCkge1xuICAgIGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBSRUpFQ1RFRCkge1xuICAgIHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkMSkge1xuICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3RvciAmJiB0aGVuJCQxID09PSB0aGVuICYmIG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IucmVzb2x2ZSA9PT0gcmVzb2x2ZSQxKSB7XG4gICAgaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoZW4kJDEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odGhlbiQkMSkpIHtcbiAgICAgIGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuJCQxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkge1xuICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICByZWplY3QocHJvbWlzZSwgc2VsZkZ1bGZpbGxtZW50KCkpO1xuICB9IGVsc2UgaWYgKG9iamVjdE9yRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIHRoZW4kJDEgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW4kJDEgPSB2YWx1ZS50aGVuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCB0aGVuJCQxKTtcbiAgfSBlbHNlIHtcbiAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gIH1cblxuICBwdWJsaXNoKHByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRDtcblxuICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHJldHVybjtcbiAgfVxuICBwcm9taXNlLl9zdGF0ZSA9IFJFSkVDVEVEO1xuICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgYXNhcChwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gIHZhciBfc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICB2YXIgbGVuZ3RoID0gX3N1YnNjcmliZXJzLmxlbmd0aDtcblxuXG4gIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgX3N1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICBfc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwYXJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkge1xuICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdm9pZCAwLFxuICAgICAgY2FsbGJhY2sgPSB2b2lkIDAsXG4gICAgICBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xufVxuXG5mdW5jdGlvbiBpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gIHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgdmFsdWUgPSB2b2lkIDAsXG4gICAgICBlcnJvciA9IHZvaWQgMCxcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGVycm9yID0gZTtcbiAgICB9XG5cbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJlamVjdChwcm9taXNlLCBjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gZGV0YWlsO1xuICB9XG5cbiAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgLy8gbm9vcFxuICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKHN1Y2NlZWRlZCA9PT0gZmFsc2UpIHtcbiAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IEZVTEZJTExFRCkge1xuICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKSB7XG4gICAgcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplUHJvbWlzZShwcm9taXNlLCByZXNvbHZlcikge1xuICB0cnkge1xuICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKSB7XG4gICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikge1xuICAgICAgcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZWplY3QocHJvbWlzZSwgZSk7XG4gIH1cbn1cblxudmFyIGlkID0gMDtcbmZ1bmN0aW9uIG5leHRJZCgpIHtcbiAgcmV0dXJuIGlkKys7XG59XG5cbmZ1bmN0aW9uIG1ha2VQcm9taXNlKHByb21pc2UpIHtcbiAgcHJvbWlzZVtQUk9NSVNFX0lEXSA9IGlkKys7XG4gIHByb21pc2UuX3N0YXRlID0gdW5kZWZpbmVkO1xuICBwcm9taXNlLl9yZXN1bHQgPSB1bmRlZmluZWQ7XG4gIHByb21pc2UuX3N1YnNjcmliZXJzID0gW107XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRpb25FcnJvcigpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG59XG5cbnZhciBFbnVtZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgIHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG5cbiAgICBpZiAoIXRoaXMucHJvbWlzZVtQUk9NSVNFX0lEXSkge1xuICAgICAgbWFrZVByb21pc2UodGhpcy5wcm9taXNlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgdGhpcy5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuXG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICAgIHRoaXMuX2VudW1lcmF0ZShpbnB1dCk7XG4gICAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICBmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3QodGhpcy5wcm9taXNlLCB2YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgfVxuICB9XG5cbiAgRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uIF9lbnVtZXJhdGUoaW5wdXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgdGhpcy5fc3RhdGUgPT09IFBFTkRJTkcgJiYgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgIH1cbiAgfTtcblxuICBFbnVtZXJhdG9yLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24gX2VhY2hFbnRyeShlbnRyeSwgaSkge1xuICAgIHZhciBjID0gdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcbiAgICB2YXIgcmVzb2x2ZSQkMSA9IGMucmVzb2x2ZTtcblxuXG4gICAgaWYgKHJlc29sdmUkJDEgPT09IHJlc29sdmUkMSkge1xuICAgICAgdmFyIF90aGVuID0gdm9pZCAwO1xuICAgICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgICAgdmFyIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBfdGhlbiA9IGVudHJ5LnRoZW47XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoZW4gPT09IHRoZW4gJiYgZW50cnkuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgICAgIHRoaXMuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgX3RoZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG4gICAgICAgIHRoaXMuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgfSBlbHNlIGlmIChjID09PSBQcm9taXNlJDEpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgYyhub29wKTtcbiAgICAgICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIGVudHJ5LCBfdGhlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHByb21pc2UsIGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBjKGZ1bmN0aW9uIChyZXNvbHZlJCQxKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUkJDEoZW50cnkpO1xuICAgICAgICB9KSwgaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChyZXNvbHZlJCQxKGVudHJ5KSwgaSk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbiBfc2V0dGxlZEF0KHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG5cbiAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuXG4gICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgICAgIHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiBfd2lsbFNldHRsZUF0KHByb21pc2UsIGkpIHtcbiAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICBzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIGVudW1lcmF0b3IuX3NldHRsZWRBdChSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRW51bWVyYXRvcjtcbn0oKTtcblxuLyoqXG4gIGBQcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaFxuICBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiBmdWxmaWxsbWVudCB2YWx1ZXMgZm9yIHRoZSBwYXNzZWQgcHJvbWlzZXMsIG9yXG4gIHJlamVjdGVkIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gYmUgcmVqZWN0ZWQuIEl0IGNhc3RzIGFsbFxuICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlc29sdmUoMik7XG4gIGxldCBwcm9taXNlMyA9IHJlc29sdmUoMyk7XG4gIGxldCBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdO1xuXG4gIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXtcbiAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEsIDIsIDMgXTtcbiAgfSk7XG4gIGBgYFxuXG4gIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlXG4gIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZXMnc1xuICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6XG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlamVjdChuZXcgRXJyb3IoXCIyXCIpKTtcbiAgbGV0IHByb21pc2UzID0gcmVqZWN0KG5ldyBFcnJvcihcIjNcIikpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhXG4gIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgLy8gZXJyb3IubWVzc2FnZSA9PT0gXCIyXCJcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgYWxsXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlc1xuICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVuXG4gIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLlxuICBAc3RhdGljXG4qL1xuZnVuY3Rpb24gYWxsKGVudHJpZXMpIHtcbiAgcmV0dXJuIG5ldyBFbnVtZXJhdG9yKHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yYWNlYCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2ggaXMgc2V0dGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlXG4gIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIHNldHRsZS5cblxuICBFeGFtcGxlOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMicpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHJlc3VsdCA9PT0gJ3Byb21pc2UgMicgYmVjYXVzZSBpdCB3YXMgcmVzb2x2ZWQgYmVmb3JlIHByb21pc2UxXG4gICAgLy8gd2FzIHJlc29sdmVkLlxuICB9KTtcbiAgYGBgXG5cbiAgYFByb21pc2UucmFjZWAgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0aGF0IG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICBzZXR0bGVkIHByb21pc2UgbWF0dGVycy4gRm9yIGV4YW1wbGUsIGV2ZW4gaWYgb3RoZXIgcHJvbWlzZXMgZ2l2ZW4gdG8gdGhlXG4gIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlzZSBoYXNcbiAgYmVjb21lIHJlamVjdGVkIGJlZm9yZSB0aGUgb3RoZXIgcHJvbWlzZXMgYmVjYW1lIGZ1bGZpbGxlZCwgdGhlIHJldHVybmVkXG4gIHByb21pc2Ugd2lsbCBiZWNvbWUgcmVqZWN0ZWQ6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMScpO1xuICAgIH0sIDIwMCk7XG4gIH0pO1xuXG4gIGxldCBwcm9taXNlMiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcigncHJvbWlzZSAyJykpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zXG4gIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgcHJvbWlzZSAyIGJlY2FtZSByZWplY3RlZCBiZWZvcmVcbiAgICAvLyBwcm9taXNlIDEgYmVjYW1lIGZ1bGZpbGxlZFxuICB9KTtcbiAgYGBgXG5cbiAgQW4gZXhhbXBsZSByZWFsLXdvcmxkIHVzZSBjYXNlIGlzIGltcGxlbWVudGluZyB0aW1lb3V0czpcblxuICBgYGBqYXZhc2NyaXB0XG4gIFByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24nKSwgdGltZW91dCg1MDAwKV0pXG4gIGBgYFxuXG4gIEBtZXRob2QgcmFjZVxuICBAc3RhdGljXG4gIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzIHRvIG9ic2VydmVcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2Ugd2hpY2ggc2V0dGxlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0IHBhc3NlZFxuICBwcm9taXNlIHRvIHNldHRsZS5cbiovXG5mdW5jdGlvbiByYWNlKGVudHJpZXMpIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkoZW50cmllcykpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gIGBQcm9taXNlLnJlamVjdGAgcmV0dXJucyBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgcGFzc2VkIGByZWFzb25gLlxuICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZWplY3RcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FueX0gcmVhc29uIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoLlxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC5cbiovXG5mdW5jdGlvbiByZWplY3QkMShyZWFzb24pIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG4gIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5cbnZhciBQcm9taXNlJDEgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICB0aGlzW1BST01JU0VfSURdID0gbmV4dElkKCk7XG4gICAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgIGlmIChub29wICE9PSByZXNvbHZlcikge1xuICAgICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlID8gaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpIDogbmVlZHNOZXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gIH0pO1xuICBgYGBcbiAgIENoYWluaW5nXG4gIC0tLS0tLS0tXG4gICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gIH0pO1xuICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgfSk7XG4gIGBgYFxuICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyBuZXZlciByZWFjaGVkXG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgQXNzaW1pbGF0aW9uXG4gIC0tLS0tLS0tLS0tLVxuICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gIH0pO1xuICBgYGBcbiAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgU2ltcGxlIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IHJlc3VsdDtcbiAgIHRyeSB7XG4gICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH1cbiAgfSk7XG4gIGBgYFxuICAgUHJvbWlzZSBFeGFtcGxlO1xuICAgYGBgamF2YXNjcmlwdFxuICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyBmYWlsdXJlXG4gIH0pO1xuICBgYGBcbiAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IGF1dGhvciwgYm9va3M7XG4gICB0cnkge1xuICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gICB9XG4gICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuICAgfVxuICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgaWYgKGVycikge1xuICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgLy8gZmFpbHVyZVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICB9XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfVxuICB9KTtcbiAgYGBgXG4gICBQcm9taXNlIEV4YW1wbGU7XG4gICBgYGBqYXZhc2NyaXB0XG4gIGZpbmRBdXRob3IoKS5cbiAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgIC8vIGZvdW5kIGJvb2tzXG4gIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgfSk7XG4gIGBgYFxuICAgQG1ldGhvZCB0aGVuXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuXG4gIC8qKlxuICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gIH1cbiAgLy8gc3luY2hyb25vdXNcbiAgdHJ5IHtcbiAgZmluZEF1dGhvcigpO1xuICB9IGNhdGNoKHJlYXNvbikge1xuICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICB9XG4gIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gIH0pO1xuICBgYGBcbiAgQG1ldGhvZCBjYXRjaFxuICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG5cblxuICBQcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgIGBmaW5hbGx5YCB3aWxsIGJlIGludm9rZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJvbWlzZSdzIGZhdGUganVzdCBhcyBuYXRpdmVcbiAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzXG4gIFxuICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6XG4gIFxuICAgIGBgYGpzXG4gICAgZmluZEF1dGhvcigpIHtcbiAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3IoKTtcbiAgICB9XG4gIFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZmluZEF1dGhvcigpOyAvLyBzdWNjZWVkIG9yIGZhaWxcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmluZE90aGVyQXV0aGVyKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGFsd2F5cyBydW5zXG4gICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBBc3luY2hyb25vdXMgZXhhbXBsZTpcbiAgXG4gICAgYGBganNcbiAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIHJldHVybiBmaW5kT3RoZXJBdXRoZXIoKTtcbiAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCl7XG4gICAgICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwgb3Igbm90XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgZmluYWxseVxuICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgQHJldHVybiB7UHJvbWlzZX1cbiAgKi9cblxuXG4gIFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgPSBmdW5jdGlvbiBfZmluYWxseShjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gdGhpcztcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihjYWxsYmFjaywgY2FsbGJhY2spO1xuICB9O1xuXG4gIHJldHVybiBQcm9taXNlO1xufSgpO1xuXG5Qcm9taXNlJDEucHJvdG90eXBlLnRoZW4gPSB0aGVuO1xuUHJvbWlzZSQxLmFsbCA9IGFsbDtcblByb21pc2UkMS5yYWNlID0gcmFjZTtcblByb21pc2UkMS5yZXNvbHZlID0gcmVzb2x2ZSQxO1xuUHJvbWlzZSQxLnJlamVjdCA9IHJlamVjdCQxO1xuUHJvbWlzZSQxLl9zZXRTY2hlZHVsZXIgPSBzZXRTY2hlZHVsZXI7XG5Qcm9taXNlJDEuX3NldEFzYXAgPSBzZXRBc2FwO1xuUHJvbWlzZSQxLl9hc2FwID0gYXNhcDtcblxuLypnbG9iYWwgc2VsZiovXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgdmFyIGxvY2FsID0gdm9pZCAwO1xuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gIGlmIChQKSB7XG4gICAgdmFyIHByb21pc2VUb1N0cmluZyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2VUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2lsZW50bHkgaWdub3JlZFxuICAgIH1cblxuICAgIGlmIChwcm9taXNlVG9TdHJpbmcgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbG9jYWwuUHJvbWlzZSA9IFByb21pc2UkMTtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZSQxLnBvbHlmaWxsID0gcG9seWZpbGw7XG5Qcm9taXNlJDEuUHJvbWlzZSA9IFByb21pc2UkMTtcblxucmV0dXJuIFByb21pc2UkMTtcblxufSkpKTtcblxuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNi1wcm9taXNlLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/es6-promise/dist/es6-promise.js\n"); + +/***/ }), + +/***/ "./node_modules/loglevel/lib/loglevel.js": +/*!***********************************************!*\ + !*** ./node_modules/loglevel/lib/loglevel.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwQztBQUNsRCxRQUFRLG9DQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxvR0FBQztBQUMxQixLQUFLLE1BQU0sRUFJTjtBQUNMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRCxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/loglevel/lib/loglevel.js\n"); + +/***/ }), + +/***/ "./node_modules/process/browser.js": +/*!*****************************************!*\ + !*** ./node_modules/process/browser.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanM/ZjI4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanM/Y2QwMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n"); + +/***/ }), + +/***/ "./package.json": +/*!**********************!*\ + !*** ./package.json ***! + \**********************/ +/*! exports provided: name, version, date, description, module, main, homepage, scripts, nyc, repository, keywords, author, license, dependencies, devDependencies, bundledDependencies, peerDependencies, optionalDependencies, default */ +/***/ (function(module) { + +eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"geoportal-access-lib\\\",\\\"version\\\":\\\"3.4.0-beta2\\\",\\\"date\\\":\\\"27/10/2023\\\",\\\"description\\\":\\\"French Geoportal resources access library\\\",\\\"module\\\":\\\"src/Gp.js\\\",\\\"main\\\":\\\"dist/GpServices-src.js\\\",\\\"homepage\\\":\\\"https://github.com/IGNF/geoportal-access-lib#readme\\\",\\\"scripts\\\":{\\\"clean\\\":\\\"echo \\\\\\\"Warning: no yet implemented!\\\\\\\" && exit 0\\\",\\\"setup\\\":\\\"npm install\\\",\\\"cover\\\":\\\"nyc --reporter=lcov --reporter=text npm run test\\\",\\\"eslint\\\":\\\"eslint src/\\\",\\\"build\\\":\\\"webpack --mode=none\\\",\\\"build:prod\\\":\\\"webpack --mode=production\\\",\\\"build:dev\\\":\\\"webpack --mode=development\\\",\\\"test\\\":\\\"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\\\\\\"test_*.js\\\\\\\" test/spec/\\\",\\\"test:serve\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js\\\",\\\"test:serve:docker\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js\\\",\\\"test:end-to-end:serve\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js\\\",\\\"test:end-to-end:serve:docker\\\":\\\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js\\\",\\\"sample\\\":\\\"npm run sample:serve\\\",\\\"sample:serve\\\":\\\"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"sample:serve:prod\\\":\\\"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"sample:serve:dev\\\":\\\"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path '/dist/' --port 9001 --open\\\",\\\"doc\\\":\\\"npm run doc:serve\\\",\\\"doc:serve\\\":\\\"webpack-dev-server --content-base jsdoc --port 9001 --open\\\"},\\\"nyc\\\":{\\\"include\\\":[\\\"src/**/*.js\\\"],\\\"instrument\\\":false,\\\"sourceMap\\\":false},\\\"repository\\\":{\\\"type\\\":\\\"git\\\",\\\"url\\\":\\\"https://github.com/IGNF/geoportal-access-lib.git\\\"},\\\"keywords\\\":[\\\"geoportail\\\",\\\"webservice\\\",\\\"javascript\\\",\\\"es6\\\"],\\\"author\\\":\\\"IGNF\\\",\\\"license\\\":\\\"CECILL-B\\\",\\\"dependencies\\\":{\\\"es6-promise\\\":\\\"^4.2.4\\\",\\\"node-fetch\\\":\\\"^2.6.1\\\",\\\"xmldom\\\":\\\"^0.1.27\\\"},\\\"devDependencies\\\":{\\\"@babel/core\\\":\\\"^7.12.10\\\",\\\"@babel/plugin-transform-template-literals\\\":\\\"^7.12.1\\\",\\\"@babel/preset-env\\\":\\\"^7.12.11\\\",\\\"babel-loader\\\":\\\"^8.2.2\\\",\\\"chai\\\":\\\"^4.1.2\\\",\\\"clean-webpack-plugin\\\":\\\"^3.0.0\\\",\\\"copy-webpack-plugin\\\":\\\"^5.1.2\\\",\\\"eslint\\\":\\\"^7.18.0\\\",\\\"eslint-config-standard\\\":\\\"^16.0.2\\\",\\\"eslint-loader\\\":\\\"^4.0.2\\\",\\\"eslint-plugin-import\\\":\\\"^2.22.1\\\",\\\"eslint-plugin-node\\\":\\\"^11.1.0\\\",\\\"eslint-plugin-promise\\\":\\\"^4.2.1\\\",\\\"eslint-plugin-standard\\\":\\\"^5.0.0\\\",\\\"glob\\\":\\\"^7.1.2\\\",\\\"handlebars-layouts\\\":\\\"^3.1.4\\\",\\\"handlebars-webpack-plugin\\\":\\\"^1.4.1\\\",\\\"html-webpack-plugin\\\":\\\"^4.5.1\\\",\\\"istanbul-instrumenter-loader\\\":\\\"^3.0.1\\\",\\\"jsdoc-webpack-plugin\\\":\\\"^0.3.0\\\",\\\"loglevel\\\":\\\"^1.6.1\\\",\\\"mocha\\\":\\\"^7.2.0\\\",\\\"mocha-loader\\\":\\\"^5.1.5\\\",\\\"mocha-webpack\\\":\\\"^2.0.0-beta.0\\\",\\\"mochawesome\\\":\\\"^6.2.1\\\",\\\"nyc\\\":\\\"^15.1.0\\\",\\\"path\\\":\\\"^0.12.7\\\",\\\"replace-bundle-webpack-plugin\\\":\\\"^1.0.0\\\",\\\"sinon\\\":\\\"^9.2.4\\\",\\\"sinon-es6\\\":\\\"0.0.3\\\",\\\"speed-measure-webpack-plugin\\\":\\\"^1.4.2\\\",\\\"string-template\\\":\\\"^1.0.0\\\",\\\"terser-webpack-plugin\\\":\\\"^2.3.8\\\",\\\"webpack\\\":\\\"^4.46.0\\\",\\\"webpack-cli\\\":\\\"^3.3.12\\\",\\\"webpack-dev-server\\\":\\\"^3.11.2\\\",\\\"webpack-node-externals\\\":\\\"^2.5.2\\\",\\\"webpack-shell-plugin\\\":\\\"^0.5.0\\\"},\\\"bundledDependencies\\\":[],\\\"peerDependencies\\\":{},\\\"optionalDependencies\\\":{}}\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiIuL3BhY2thZ2UuanNvbi5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./package.json\n"); + +/***/ }), + +/***/ "./src/Exceptions/ErrorService.js": +/*!****************************************!*\ + !*** ./src/Exceptions/ErrorService.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Errors raised by API for one among three reasons : wrong API usage, underlying service error or unknown reason.\n *\n * @property {String} message - Error message\n * @property {Number} status - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} ; -1 otherwise.\n * @property {String} type - Error type ({@link Gp.Error.TYPE_SRVERR}, {@link Gp.Error.TYPE_USEERR} or {@link Gp.Error.TYPE_UNKERR}).\n *\n * @namespace\n * @alias Gp.Error\n * @param {Object|String} error - Options for creating error object. Can be a String (message) or an Object.\n * @param {String} error.message - Error message to return to user.\n * @param {enum} [error.type=TYPE_UNKERR] - Error type\n * @param {status} [error.status=-1] - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}.\n *\n */\nfunction ErrorService(error) {\n if (!(this instanceof ErrorService)) {\n throw new TypeError(\"ErrorService constructor cannot be called as a function.\");\n }\n var e = error;\n if (typeof error === \"string\" || error instanceof String) {\n this.message = error;\n this.status = -1;\n this.type = ErrorService.TYPE_UNKERR;\n } else {\n this.message = e.message || \"undefined!?\";\n this.type = e.type;\n this.status = e.status || -1;\n }\n this.name = \"ErrorService\";\n this.stack = new Error().stack;\n}\n\n/**\n * Error raised when underlying geoportal service answers on error.\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_SRVERR = \"SERVICE_ERROR\";\n/**\n * Error raised when funcion use is inappropriate\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_USEERR = \"USAGE_ERROR\";\n/**\n * Error raised when API can't perform the job for a reason other than the two other ones.\n *\n * @type {String}\n * @constant\n * @static\n */\nErrorService.TYPE_UNKERR = \"UNKNOWN_ERROR\";\n\n/**\n * @lends module:ErrorService\n */\nErrorService.prototype = Object.create(Error.prototype, {\n constructor: {\n value: ErrorService,\n writable: true,\n configurable: true\n }\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (ErrorService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9FeGNlcHRpb25zL0Vycm9yU2VydmljZS5qcz9mOWI2Il0sIm5hbWVzIjpbIkVycm9yU2VydmljZSIsImVycm9yIiwiVHlwZUVycm9yIiwiZSIsIlN0cmluZyIsIm1lc3NhZ2UiLCJzdGF0dXMiLCJ0eXBlIiwiVFlQRV9VTktFUlIiLCJuYW1lIiwic3RhY2siLCJFcnJvciIsIlRZUEVfU1JWRVJSIiwiVFlQRV9VU0VFUlIiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsInZhbHVlIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWUEsQ0FBRUMsS0FBSyxFQUFFO0VBQzFCLElBQUksRUFBRSxJQUFJLFlBQVlELFlBQVksQ0FBQyxFQUFFO0lBQ2pDLE1BQU0sSUFBSUUsU0FBUyxDQUFDLDBEQUEwRCxDQUFDO0VBQ25GO0VBRUEsSUFBSUMsQ0FBQyxHQUFHRixLQUFLO0VBQ2IsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLFlBQVlHLE1BQU0sRUFBRTtJQUN0RCxJQUFJLENBQUNDLE9BQU8sR0FBR0osS0FBSztJQUNwQixJQUFJLENBQUNLLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUdQLFlBQVksQ0FBQ1EsV0FBVztFQUN4QyxDQUFDLE1BQU07SUFDSCxJQUFJLENBQUNILE9BQU8sR0FBR0YsQ0FBQyxDQUFDRSxPQUFPLElBQUksYUFBYTtJQUN6QyxJQUFJLENBQUNFLElBQUksR0FBR0osQ0FBQyxDQUFDSSxJQUFJO0lBQ2xCLElBQUksQ0FBQ0QsTUFBTSxHQUFHSCxDQUFDLENBQUNHLE1BQU0sSUFBSSxDQUFDLENBQUM7RUFDaEM7RUFFQSxJQUFJLENBQUNHLElBQUksR0FBRyxjQUFjO0VBQzFCLElBQUksQ0FBQ0MsS0FBSyxHQUFJLElBQUlDLEtBQUssQ0FBQyxDQUFDLENBQUVELEtBQUs7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQVYsWUFBWSxDQUFDWSxXQUFXLEdBQUcsZUFBZTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBWixZQUFZLENBQUNhLFdBQVcsR0FBRyxhQUFhO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FiLFlBQVksQ0FBQ1EsV0FBVyxHQUFHLGVBQWU7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBUixZQUFZLENBQUNjLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUNMLEtBQUssQ0FBQ0csU0FBUyxFQUFFO0VBQ3BERyxXQUFXLEVBQUc7SUFDVkMsS0FBSyxFQUFHbEIsWUFBWTtJQUNwQm1CLFFBQVEsRUFBRyxJQUFJO0lBQ2ZDLFlBQVksRUFBRztFQUNuQjtBQUNKLENBQUMsQ0FBQztBQUVhcEIsMkVBQVkiLCJmaWxlIjoiLi9zcmMvRXhjZXB0aW9ucy9FcnJvclNlcnZpY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVycm9ycyByYWlzZWQgYnkgQVBJIGZvciBvbmUgYW1vbmcgdGhyZWUgcmVhc29ucyA6IHdyb25nIEFQSSB1c2FnZSwgdW5kZXJseWluZyBzZXJ2aWNlIGVycm9yIG9yIHVua25vd24gcmVhc29uLlxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHN0YXR1cyAtIEVycm9yIHN0YXR1cyA6IHdoZW4ge0BsaW5rIEdwLkVycm9yLlRZUEVfU1JWRVJSfSwgZ2l2ZXMgdGhlIFtIVFRQIHN0YXR1cyBvZiB0aGUgdW5kZXJseWluZyB3ZWIgc2VydmljZSByZXNwb25zZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9IVFRQX3N0YXR1c19jb2Rlc30gOyAtMSBvdGhlcndpc2UuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdHlwZSAtIEVycm9yIHR5cGUgKHtAbGluayBHcC5FcnJvci5UWVBFX1NSVkVSUn0sIHtAbGluayBHcC5FcnJvci5UWVBFX1VTRUVSUn0gb3Ige0BsaW5rIEdwLkVycm9yLlRZUEVfVU5LRVJSfSkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLkVycm9yXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGVycm9yIC0gT3B0aW9ucyBmb3IgY3JlYXRpbmcgZXJyb3Igb2JqZWN0LiBDYW4gYmUgYSBTdHJpbmcgKG1lc3NhZ2UpIG9yIGFuIE9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvci5tZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byByZXR1cm4gdG8gdXNlci5cbiAqIEBwYXJhbSB7ZW51bX0gW2Vycm9yLnR5cGU9VFlQRV9VTktFUlJdIC0gRXJyb3IgdHlwZVxuICogQHBhcmFtIHtzdGF0dXN9IFtlcnJvci5zdGF0dXM9LTFdIC0gRXJyb3Igc3RhdHVzIDogd2hlbiB7QGxpbmsgR3AuRXJyb3IuVFlQRV9TUlZFUlJ9LCBnaXZlcyB0aGUgW0hUVFAgc3RhdHVzIG9mIHRoZSB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIHJlc3BvbnNlXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0hUVFBfc3RhdHVzX2NvZGVzfS5cbiAqXG4gKi9cbmZ1bmN0aW9uIEVycm9yU2VydmljZSAoZXJyb3IpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRXJyb3JTZXJ2aWNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXJyb3JTZXJ2aWNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIGUgPSBlcnJvcjtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9yO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IC0xO1xuICAgICAgICB0aGlzLnR5cGUgPSBFcnJvclNlcnZpY2UuVFlQRV9VTktFUlI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gZS5tZXNzYWdlIHx8IFwidW5kZWZpbmVkIT9cIjtcbiAgICAgICAgdGhpcy50eXBlID0gZS50eXBlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGUuc3RhdHVzIHx8IC0xO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IFwiRXJyb3JTZXJ2aWNlXCI7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG59XG5cbi8qKlxuICogRXJyb3IgcmFpc2VkIHdoZW4gdW5kZXJseWluZyBnZW9wb3J0YWwgc2VydmljZSBhbnN3ZXJzIG9uIGVycm9yLlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAY29uc3RhbnRcbiAqIEBzdGF0aWNcbiAqL1xuRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSID0gXCJTRVJWSUNFX0VSUk9SXCI7XG4vKipcbiAqIEVycm9yIHJhaXNlZCB3aGVuIGZ1bmNpb24gdXNlIGlzIGluYXBwcm9wcmlhdGVcbiAqXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGNvbnN0YW50XG4gKiBAc3RhdGljXG4gKi9cbkVycm9yU2VydmljZS5UWVBFX1VTRUVSUiA9IFwiVVNBR0VfRVJST1JcIjtcbi8qKlxuICogRXJyb3IgcmFpc2VkIHdoZW4gQVBJIGNhbid0IHBlcmZvcm0gdGhlIGpvYiBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiB0aGUgdHdvIG90aGVyIG9uZXMuXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBjb25zdGFudFxuICogQHN0YXRpY1xuICovXG5FcnJvclNlcnZpY2UuVFlQRV9VTktFUlIgPSBcIlVOS05PV05fRVJST1JcIjtcblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkVycm9yU2VydmljZVxuICovXG5FcnJvclNlcnZpY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvciA6IHtcbiAgICAgICAgdmFsdWUgOiBFcnJvclNlcnZpY2UsXG4gICAgICAgIHdyaXRhYmxlIDogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBFcnJvclNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Exceptions/ErrorService.js\n"); + +/***/ }), + +/***/ "./src/Formats/WPS.js": +/*!****************************!*\ + !*** ./src/Formats/WPS.js ***! + \****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Standard WPS\n *\n * @constructor\n * @alias Gp.Formats.WPS\n * @param {Object} options - options\n * @param {Object} options.data - objet\n * @param {String} options.method - POST|GET\n * @param {String} options.param.service - \"WPS\"\n * @param {String} options.param.version - \"1.0.0\"\n * @param {String} options.param.identifier - \"gs:WPSElevation|gs:WPSLineElevation\"\n * @param {String} options.param.rawdataoutput - \"result\"\n * @param {String} options.param.request - \"Execute\"\n * @param {Function} options.onsuccess - function callback success (TODO)\n * @param {Function} options.onerror - function callback error (TODO)\n * @private\n */\nfunction WPS(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur WPS()]\");\n if (!(this instanceof WPS)) {\n throw new TypeError(\"WPS constructor cannot be called as a function.\");\n }\n this.options = options || {};\n\n /**\n * Objet DATA\n */\n this.DataObject = this.options.data;\n if (!this.DataObject) {\n throw new TypeError(\"This data object is not defined !\");\n }\n\n /**\n * param service.\n * Par defaut, \"WPS\".\n */\n this.paramservice = this.options.param.service || \"WPS\";\n\n /**\n * param version.\n * Par defaut, \"1.0.0\".\n */\n this.paramversion = this.options.param.version || \"1.0.0\";\n\n /**\n * param identifier\n * Par defaut, \"gs:WPS\"\n */\n this.paramidentifier = this.options.param.identifier || \"gs:WPS\";\n\n /**\n * param rawdataoutput\n * Par defaut, \"result\".\n */\n this.paramrawdataoutput = this.options.param.rawdataoutput || \"result\";\n\n /**\n * param request\n * Par defaut, \"Execute\".\n */\n this.paramrequest = this.options.param.request || \"Execute\";\n\n /**\n * methode.\n * Par defaut, \"GET\".\n */\n this.method = this.options.method || \"GET\";\n}\nWPS.prototype = {\n /**\n * @lends module:WPS#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: WPS,\n /**\n * Template de la requête.\n */\n template: {\n get: {\n value: \"service=__SERVICE__\" + \"&version=__VERSION__\" + \"&rawdataoutput=__RAWDATAOUTPUT__\" + \"&identifier=__IDENTIFIER__\" + \"&request=__REQUEST__\" + \"&datainputs=\",\n input: \"__KEY__=__DATA__\"\n },\n post: {\n value: \"\" + \"\" + \"__IDENTIFIER__\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"__RAWDATAOUTPUT__\" + \"\" + \"\" + \"\",\n input: \"\" + \"__KEY__\" + \"\" + \"__DATA__\" + \"\" + \"\"\n }\n },\n /**\n * Namespace par defaut de la requete POST.\n *\n * @returns {String} namespace\n */\n namespaceByDefault: function namespaceByDefault() {\n 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\\\"\"];\n return ns.join(\" \");\n },\n /**\n * Schemalocation par defaut.\n *\n * @returns {String} schemaLocation\n */\n schemaLocationByDefault: function schemaLocationByDefault() {\n return \"xsi:schemaLocation=\\\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\\\"\";\n },\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out :\n * // service=__SERVICE__\n * // &version=__VERSION__\n * // &rawdataoutput=__RAWDATAOUTPUT__\n * // &identifier=__IDENTIFIER__\n * // &request=__REQUEST__\n * // &datainputs=\"__DATAINPUTS__\"\n * // avec __DATAINPUTS__ = __KEY__=__DATA__;...\n *\n * // POST out :\n * // \n * // \n * // __IDENTIFIER__\n * // \n * // \n * // \n * // \n * // \n * // __RAWDATAOUTPUT__\n * // \n * // \n * // \",\n * // avec __DATAINPUTS__\n * // \n * // __KEY__\n * // \n * // __DATA__\n * // \n * // \n *\n * @returns {Boolean} validation de la construction de la requete\n */\n processRequestString: function processRequestString() {\n this.logger.trace(\"WPS::processRequestString ()\");\n var template = \"\";\n if (this.method === \"POST\") {\n template = this.template.post.value;\n } else if (this.method === \"GET\") {\n template = this.template.get.value;\n } else {\n this.logger.error(\"No other method supported by the service !\");\n return false;\n }\n template = template.replace(/__SERVICE__/g, this.paramservice);\n template = template.replace(/__VERSION__/g, this.paramversion);\n template = template.replace(/__RAWDATAOUTPUT__/g, this.paramrawdataoutput);\n template = template.replace(/__IDENTIFIER__/g, this.paramidentifier);\n template = template.replace(/__REQUEST__/g, this.paramrequest);\n\n // ajout +\n if (this.method === \"POST\") {\n template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault);\n template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault);\n }\n\n // ajout des datainputs\n template = template.replace(//g, this.__addDataInputs());\n if (!template) {\n this.logger.warn(\"traduction tmpl : empty request !?\");\n return false;\n }\n this.requestString = template;\n this.logger.trace(\"traduction tmpl\", template);\n return true;\n },\n /**\n * Ajout des données\n *\n * @returns {String} Données concaténées dans une chaine\n */\n __addDataInputs: function __addDataInputs() {\n this.logger.trace(\"WPS::__addDataInputs ()\");\n\n // c'est un peu grossier...\n var tmpl = this.method === \"GET\" ? this.template.get.input : this.template.post.input;\n var sep = this.method === \"GET\" ? \";\" : \"\";\n var result = \"\";\n var that = this;\n var map = this.DataObject.getData();\n for (var i = 0; i < map.length; i++) {\n // FIXME closure ?\n (function (j) {\n if (sep) {\n sep = j === map.length - 1 ? \"\" : \";\";\n }\n result = result.concat(that.__addDataInput(tmpl, map[j].k, map[j].v), sep);\n })(i);\n }\n return result;\n },\n /**\n * Ajout d'une donnée.\n *\n * @param {String} tmpl - template\n * @param {String} key - clef\n * @param {String} data - valeur\n * @returns {String} chaine avec les substitutions clef/valeur\n */\n __addDataInput: function __addDataInput(tmpl, key, data) {\n var tmp = tmpl;\n tmp = tmp.replace(/__KEY__/g, key);\n tmp = tmp.replace(/__DATA__/g, data);\n return tmp;\n },\n /**\n * Definir le mode de requête\n *\n * @param {String} method - GET|POST\n */\n setMethod: function setMethod(method) {\n if (method === \"GET\" || method === \"POST\") {\n this.method = method;\n } else {\n this.logger.warn(\"support only GET and POST method !\");\n }\n },\n /**\n * Retourne le mode de requete (GET|POST).\n *\n * @returns {AltiRequest.options.mode|String} methode (GET|POST)\n */\n getMethod: function getMethod() {\n return this.method;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (WPS);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Gb3JtYXRzL1dQUy5qcz8xODQ0Il0sIm5hbWVzIjpbIldQUyIsIm9wdGlvbnMiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIlR5cGVFcnJvciIsIkRhdGFPYmplY3QiLCJkYXRhIiwicGFyYW1zZXJ2aWNlIiwicGFyYW0iLCJzZXJ2aWNlIiwicGFyYW12ZXJzaW9uIiwidmVyc2lvbiIsInBhcmFtaWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJwYXJhbXJhd2RhdGFvdXRwdXQiLCJyYXdkYXRhb3V0cHV0IiwicGFyYW1yZXF1ZXN0IiwicmVxdWVzdCIsIm1ldGhvZCIsInByb3RvdHlwZSIsInJlcXVlc3RTdHJpbmciLCJjb25zdHJ1Y3RvciIsInRlbXBsYXRlIiwiZ2V0IiwidmFsdWUiLCJpbnB1dCIsInBvc3QiLCJuYW1lc3BhY2VCeURlZmF1bHQiLCJucyIsImpvaW4iLCJzY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCIsInByb2Nlc3NSZXF1ZXN0U3RyaW5nIiwiZXJyb3IiLCJyZXBsYWNlIiwiX19hZGREYXRhSW5wdXRzIiwid2FybiIsInRtcGwiLCJzZXAiLCJyZXN1bHQiLCJ0aGF0IiwibWFwIiwiZ2V0RGF0YSIsImkiLCJsZW5ndGgiLCJqIiwiY29uY2F0IiwiX19hZGREYXRhSW5wdXQiLCJrIiwidiIsImtleSIsInRtcCIsInNldE1ldGhvZCIsImdldE1ldGhvZCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBR0EsQ0FBRUMsT0FBTyxFQUFFO0VBQ25CLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLHNCQUFzQixDQUFDO0VBRXpDLElBQUksRUFBRSxJQUFJLFlBQVlMLEdBQUcsQ0FBQyxFQUFFO0lBQ3hCLE1BQU0sSUFBSU0sU0FBUyxDQUFDLGlEQUFpRCxDQUFDO0VBQzFFO0VBRUEsSUFBSSxDQUFDTCxPQUFPLEdBQUdBLE9BQU8sSUFBSSxDQUFDLENBQUM7O0VBRTVCO0FBQ0o7QUFDQTtFQUNJLElBQUksQ0FBQ00sVUFBVSxHQUFHLElBQUksQ0FBQ04sT0FBTyxDQUFDTyxJQUFJO0VBRW5DLElBQUksQ0FBQyxJQUFJLENBQUNELFVBQVUsRUFBRTtJQUNsQixNQUFNLElBQUlELFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQztFQUM1RDs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0csWUFBWSxHQUFHLElBQUksQ0FBQ1IsT0FBTyxDQUFDUyxLQUFLLENBQUNDLE9BQU8sSUFBSSxLQUFLOztFQUV2RDtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUksQ0FBQ1gsT0FBTyxDQUFDUyxLQUFLLENBQUNHLE9BQU8sSUFBSSxPQUFPOztFQUV6RDtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsZUFBZSxHQUFHLElBQUksQ0FBQ2IsT0FBTyxDQUFDUyxLQUFLLENBQUNLLFVBQVUsSUFBSSxRQUFROztFQUVoRTtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0Msa0JBQWtCLEdBQUcsSUFBSSxDQUFDZixPQUFPLENBQUNTLEtBQUssQ0FBQ08sYUFBYSxJQUFJLFFBQVE7O0VBRXRFO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxZQUFZLEdBQUcsSUFBSSxDQUFDakIsT0FBTyxDQUFDUyxLQUFLLENBQUNTLE9BQU8sSUFBSSxTQUFTOztFQUUzRDtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ21CLE1BQU0sSUFBSSxLQUFLO0FBQzlDO0FBRUFwQixHQUFHLENBQUNxQixTQUFTLEdBQUc7RUFFWjtBQUNKO0FBQ0E7O0VBRUk7QUFDSjtBQUNBO0FBQ0E7RUFDSUMsYUFBYSxFQUFHLElBQUk7RUFFcEI7QUFDSjtBQUNBO0VBQ0lDLFdBQVcsRUFBR3ZCLEdBQUc7RUFFakI7QUFDSjtBQUNBO0VBQ0l3QixRQUFRLEVBQUc7SUFDUEMsR0FBRyxFQUFHO01BQ0ZDLEtBQUssRUFBRyxxQkFBcUIsR0FDekIsc0JBQXNCLEdBQ3RCLGtDQUFrQyxHQUNsQyw0QkFBNEIsR0FDNUIsc0JBQXNCLEdBQ3RCLHFDQUFxQztNQUV6Q0MsS0FBSyxFQUFHO0lBRVosQ0FBQztJQUNEQyxJQUFJLEVBQUc7TUFFSEYsS0FBSyxFQUFHLDRDQUE0QyxHQUNoRCxtRUFBbUUsR0FDbkUsbUNBQW1DLEdBQ25DLGlEQUFpRCxHQUNqRCxrQkFBa0IsR0FDbEIseUJBQXlCLEdBQ3pCLG1CQUFtQixHQUNuQixvQkFBb0IsR0FDcEIscUJBQXFCLEdBQ3JCLG9EQUFvRCxHQUNwRCxzQkFBc0IsR0FDdEIscUJBQXFCLEdBQ3JCLG9CQUFvQjtNQUV4QkMsS0FBSyxFQUFHLGFBQWEsR0FDakIsMENBQTBDLEdBQzFDLFlBQVksR0FDWiw2Q0FBNkMsR0FDN0MsYUFBYSxHQUNiO0lBQ1I7RUFDSixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJRSxrQkFBa0IsRUFBRyxTQUFBQSxtQkFBQSxFQUFZO0lBQzdCLElBQUlDLEVBQUUsR0FBRyxDQUNMLHlEQUF5RCxFQUN6RCw0Q0FBNEMsRUFDNUMsMENBQTBDLEVBQzFDLGdEQUFnRCxFQUNoRCw4Q0FBOEMsRUFDOUMsMENBQTBDLEVBQzFDLDBDQUEwQyxFQUMxQyxnREFBZ0QsRUFDaEQsOENBQThDLENBQ2pEO0lBRUQsT0FBT0EsRUFBRSxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQ3ZCLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLHVCQUF1QixFQUFHLFNBQUFBLHdCQUFBLEVBQVk7SUFDbEMsT0FBTyx5R0FBeUc7RUFDcEgsQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLG9CQUFvQixFQUFHLFNBQUFBLHFCQUFBLEVBQVk7SUFDL0IsSUFBSSxDQUFDL0IsTUFBTSxDQUFDRyxLQUFLLENBQUMsOEJBQThCLENBQUM7SUFFakQsSUFBSW1CLFFBQVEsR0FBRyxFQUFFO0lBQ2pCLElBQUksSUFBSSxDQUFDSixNQUFNLEtBQUssTUFBTSxFQUFFO01BQ3hCSSxRQUFRLEdBQUcsSUFBSSxDQUFDQSxRQUFRLENBQUNJLElBQUksQ0FBQ0YsS0FBSztJQUN2QyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNOLE1BQU0sS0FBSyxLQUFLLEVBQUU7TUFDOUJJLFFBQVEsR0FBRyxJQUFJLENBQUNBLFFBQVEsQ0FBQ0MsR0FBRyxDQUFDQyxLQUFLO0lBQ3RDLENBQUMsTUFBTTtNQUNILElBQUksQ0FBQ3hCLE1BQU0sQ0FBQ2dDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQztNQUMvRCxPQUFPLEtBQUs7SUFDaEI7SUFFQVYsUUFBUSxHQUFHQSxRQUFRLENBQUNXLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDMUIsWUFBWSxDQUFDO0lBQzlEZSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ1csT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUN2QixZQUFZLENBQUM7SUFDOURZLFFBQVEsR0FBR0EsUUFBUSxDQUFDVyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDbkIsa0JBQWtCLENBQUM7SUFDMUVRLFFBQVEsR0FBR0EsUUFBUSxDQUFDVyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDckIsZUFBZSxDQUFDO0lBQ3BFVSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ1csT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUNqQixZQUFZLENBQUM7O0lBRTlEO0lBQ0EsSUFBSSxJQUFJLENBQUNFLE1BQU0sS0FBSyxNQUFNLEVBQUU7TUFDeEJJLFFBQVEsR0FBR0EsUUFBUSxDQUFDVyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDTixrQkFBa0IsQ0FBQztNQUN0RUwsUUFBUSxHQUFHQSxRQUFRLENBQUNXLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUNILHVCQUF1QixDQUFDO0lBQ3BGOztJQUVBO0lBQ0FSLFFBQVEsR0FBR0EsUUFBUSxDQUFDVyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBRS9FLElBQUksQ0FBQ1osUUFBUSxFQUFFO01BQ1gsSUFBSSxDQUFDdEIsTUFBTSxDQUFDbUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDO01BQ3RELE9BQU8sS0FBSztJQUNoQjtJQUVBLElBQUksQ0FBQ2YsYUFBYSxHQUFHRSxRQUFRO0lBQzdCLElBQUksQ0FBQ3RCLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLGlCQUFpQixFQUFFbUIsUUFBUSxDQUFDO0lBRTlDLE9BQU8sSUFBSTtFQUNmLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0lZLGVBQWUsRUFBRyxTQUFBQSxnQkFBQSxFQUFZO0lBQzFCLElBQUksQ0FBQ2xDLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLHlCQUF5QixDQUFDOztJQUU1QztJQUNBLElBQUlpQyxJQUFJLEdBQUcsSUFBSSxDQUFDbEIsTUFBTSxLQUFLLEtBQUssR0FBRyxJQUFJLENBQUNJLFFBQVEsQ0FBQ0MsR0FBRyxDQUFDRSxLQUFLLEdBQUcsSUFBSSxDQUFDSCxRQUFRLENBQUNJLElBQUksQ0FBQ0QsS0FBSztJQUNyRixJQUFJWSxHQUFHLEdBQUcsSUFBSSxDQUFDbkIsTUFBTSxLQUFLLEtBQUssR0FBRyxHQUFHLEdBQUcsRUFBRTtJQUUxQyxJQUFJb0IsTUFBTSxHQUFHLEVBQUU7SUFDZixJQUFJQyxJQUFJLEdBQUcsSUFBSTtJQUNmLElBQUlDLEdBQUcsR0FBRyxJQUFJLENBQUNuQyxVQUFVLENBQUNvQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0YsR0FBRyxDQUFDRyxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO01BQ2pDO01BQ0EsQ0FBQyxVQUFVRSxDQUFDLEVBQUU7UUFDVixJQUFJUCxHQUFHLEVBQUU7VUFDTEEsR0FBRyxHQUFJTyxDQUFDLEtBQUtKLEdBQUcsQ0FBQ0csTUFBTSxHQUFHLENBQUMsR0FBSSxFQUFFLEdBQUcsR0FBRztRQUMzQztRQUNBTCxNQUFNLEdBQUdBLE1BQU0sQ0FBQ08sTUFBTSxDQUFDTixJQUFJLENBQUNPLGNBQWMsQ0FBQ1YsSUFBSSxFQUFFSSxHQUFHLENBQUNJLENBQUMsQ0FBQyxDQUFDRyxDQUFDLEVBQUVQLEdBQUcsQ0FBQ0ksQ0FBQyxDQUFDLENBQUNJLENBQUMsQ0FBQyxFQUFFWCxHQUFHLENBQUM7TUFDOUUsQ0FBQyxFQUFFSyxDQUFDLENBQUM7SUFDVDtJQUVBLE9BQU9KLE1BQU07RUFDakIsQ0FBQztFQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSVEsY0FBYyxFQUFHLFNBQUFBLGVBQVVWLElBQUksRUFBRWEsR0FBRyxFQUFFM0MsSUFBSSxFQUFFO0lBQ3hDLElBQUk0QyxHQUFHLEdBQUdkLElBQUk7SUFDZGMsR0FBRyxHQUFHQSxHQUFHLENBQUNqQixPQUFPLENBQUMsVUFBVSxFQUFFZ0IsR0FBRyxDQUFDO0lBQ2xDQyxHQUFHLEdBQUdBLEdBQUcsQ0FBQ2pCLE9BQU8sQ0FBQyxXQUFXLEVBQUUzQixJQUFJLENBQUM7SUFDcEMsT0FBTzRDLEdBQUc7RUFDZCxDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxTQUFTLEVBQUcsU0FBQUEsVUFBVWpDLE1BQU0sRUFBRTtJQUMxQixJQUFJQSxNQUFNLEtBQUssS0FBSyxJQUFJQSxNQUFNLEtBQUssTUFBTSxFQUFFO01BQ3ZDLElBQUksQ0FBQ0EsTUFBTSxHQUFHQSxNQUFNO0lBQ3hCLENBQUMsTUFBTTtNQUNILElBQUksQ0FBQ2xCLE1BQU0sQ0FBQ21DLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQztJQUMxRDtFQUNKLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0lpQixTQUFTLEVBQUcsU0FBQUEsVUFBQSxFQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDbEMsTUFBTTtFQUN0QjtBQUNKLENBQUM7QUFFY3BCLGtFQUFHIiwiZmlsZSI6Ii4vc3JjL0Zvcm1hdHMvV1BTLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogU3RhbmRhcmQgV1BTXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuRm9ybWF0cy5XUFNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5kYXRhIC0gb2JqZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMubWV0aG9kIC0gUE9TVHxHRVRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0uc2VydmljZSAtIFwiV1BTXCJcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0udmVyc2lvbiAtIFwiMS4wLjBcIlxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5pZGVudGlmaWVyIC0gXCJnczpXUFNFbGV2YXRpb258Z3M6V1BTTGluZUVsZXZhdGlvblwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnJhd2RhdGFvdXRwdXQgLSBcInJlc3VsdFwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnJlcXVlc3QgLSBcIkV4ZWN1dGVcIlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vbnN1Y2Nlc3MgLSBmdW5jdGlvbiBjYWxsYmFjayBzdWNjZXNzIChUT0RPKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vbmVycm9yICAgLSBmdW5jdGlvbiBjYWxsYmFjayBlcnJvciAgIChUT0RPKVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gV1BTIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIFdQUygpXVwiKTtcblxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXUFMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJXUFMgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLyoqXG4gICAgICogT2JqZXQgREFUQVxuICAgICAqL1xuICAgIHRoaXMuRGF0YU9iamVjdCA9IHRoaXMub3B0aW9ucy5kYXRhO1xuXG4gICAgaWYgKCF0aGlzLkRhdGFPYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoaXMgZGF0YSBvYmplY3QgaXMgbm90IGRlZmluZWQgIVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwYXJhbSBzZXJ2aWNlLlxuICAgICAqIFBhciBkZWZhdXQsIFwiV1BTXCIuXG4gICAgICovXG4gICAgdGhpcy5wYXJhbXNlcnZpY2UgPSB0aGlzLm9wdGlvbnMucGFyYW0uc2VydmljZSB8fCBcIldQU1wiO1xuXG4gICAgLyoqXG4gICAgICogcGFyYW0gdmVyc2lvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIjEuMC4wXCIuXG4gICAgICovXG4gICAgdGhpcy5wYXJhbXZlcnNpb24gPSB0aGlzLm9wdGlvbnMucGFyYW0udmVyc2lvbiB8fCBcIjEuMC4wXCI7XG5cbiAgICAvKipcbiAgICAgKiBwYXJhbSBpZGVudGlmaWVyXG4gICAgICogUGFyIGRlZmF1dCwgXCJnczpXUFNcIlxuICAgICAqL1xuICAgIHRoaXMucGFyYW1pZGVudGlmaWVyID0gdGhpcy5vcHRpb25zLnBhcmFtLmlkZW50aWZpZXIgfHwgXCJnczpXUFNcIjtcblxuICAgIC8qKlxuICAgICAqIHBhcmFtIHJhd2RhdGFvdXRwdXRcbiAgICAgKiBQYXIgZGVmYXV0LCBcInJlc3VsdFwiLlxuICAgICAqL1xuICAgIHRoaXMucGFyYW1yYXdkYXRhb3V0cHV0ID0gdGhpcy5vcHRpb25zLnBhcmFtLnJhd2RhdGFvdXRwdXQgfHwgXCJyZXN1bHRcIjtcblxuICAgIC8qKlxuICAgICAqIHBhcmFtIHJlcXVlc3RcbiAgICAgKiBQYXIgZGVmYXV0LCBcIkV4ZWN1dGVcIi5cbiAgICAgKi9cbiAgICB0aGlzLnBhcmFtcmVxdWVzdCA9IHRoaXMub3B0aW9ucy5wYXJhbS5yZXF1ZXN0IHx8IFwiRXhlY3V0ZVwiO1xuXG4gICAgLyoqXG4gICAgICogbWV0aG9kZS5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIkdFVFwiLlxuICAgICAqL1xuICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiO1xufVxuXG5XUFMucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpXUFMjXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiByZXF1ZXN0XG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXF1ZXN0U3RyaW5nIDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBXUFMsXG5cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZSA6IHtcbiAgICAgICAgZ2V0IDoge1xuICAgICAgICAgICAgdmFsdWUgOiBcInNlcnZpY2U9X19TRVJWSUNFX19cIiArXG4gICAgICAgICAgICAgICAgXCImdmVyc2lvbj1fX1ZFUlNJT05fX1wiICtcbiAgICAgICAgICAgICAgICBcIiZyYXdkYXRhb3V0cHV0PV9fUkFXREFUQU9VVFBVVF9fXCIgK1xuICAgICAgICAgICAgICAgIFwiJmlkZW50aWZpZXI9X19JREVOVElGSUVSX19cIiArXG4gICAgICAgICAgICAgICAgXCImcmVxdWVzdD1fX1JFUVVFU1RfX1wiICtcbiAgICAgICAgICAgICAgICBcIiZkYXRhaW5wdXRzPTwhLS0gX19EQVRBSU5QVVRTX18gLS0+XCIsXG5cbiAgICAgICAgICAgIGlucHV0IDogXCJfX0tFWV9fPV9fREFUQV9fXCJcblxuICAgICAgICB9LFxuICAgICAgICBwb3N0IDoge1xuXG4gICAgICAgICAgICB2YWx1ZSA6IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cIiArXG4gICAgICAgICAgICAgICAgXCI8d3BzOl9fUkVRVUVTVF9fIHZlcnNpb249XFxcIl9fVkVSU0lPTl9fXFxcIiBzZXJ2aWNlPVxcXCJfX1NFUlZJQ0VfX1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgIFwiX19OQU1FU1BBQ0VfXyBfX1NDSEVNQUxPQ0FUSU9OX18+XCIgK1xuICAgICAgICAgICAgICAgIFwiPG93czpJZGVudGlmaWVyPl9fSURFTlRJRklFUl9fPC9vd3M6SWRlbnRpZmllcj5cIiArXG4gICAgICAgICAgICAgICAgXCI8d3BzOkRhdGFJbnB1dHM+XCIgK1xuICAgICAgICAgICAgICAgIFwiPCEtLSBfX0RBVEFJTlBVVFNfXyAtLT5cIiArXG4gICAgICAgICAgICAgICAgXCI8L3dwczpEYXRhSW5wdXRzPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6UmVzcG9uc2VGb3JtPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6UmF3RGF0YU91dHB1dD5cIiArXG4gICAgICAgICAgICAgICAgXCI8b3dzOklkZW50aWZpZXI+X19SQVdEQVRBT1VUUFVUX188L293czpJZGVudGlmaWVyPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOlJhd0RhdGFPdXRwdXQ+XCIgK1xuICAgICAgICAgICAgICAgIFwiPC93cHM6UmVzcG9uc2VGb3JtPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOl9fUkVRVUVTVF9fPlwiLFxuXG4gICAgICAgICAgICBpbnB1dCA6IFwiPHdwczpJbnB1dD5cIiArXG4gICAgICAgICAgICAgICAgXCI8b3dzOklkZW50aWZpZXI+X19LRVlfXzwvb3dzOklkZW50aWZpZXI+XCIgK1xuICAgICAgICAgICAgICAgIFwiPHdwczpEYXRhPlwiICtcbiAgICAgICAgICAgICAgICBcIjx3cHM6TGl0ZXJhbERhdGE+X19EQVRBX188L3dwczpMaXRlcmFsRGF0YT5cIiArXG4gICAgICAgICAgICAgICAgXCI8L3dwczpEYXRhPlwiICtcbiAgICAgICAgICAgICAgICBcIjwvd3BzOklucHV0PlwiXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmFtZXNwYWNlIHBhciBkZWZhdXQgZGUgbGEgcmVxdWV0ZSBQT1NULlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gbmFtZXNwYWNlXG4gICAgICovXG4gICAgbmFtZXNwYWNlQnlEZWZhdWx0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnMgPSBbXG4gICAgICAgICAgICBcInhtbG5zOnhzaT1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMFxcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6d2ZzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dmc1xcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6d3BzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMFxcXCJcIixcbiAgICAgICAgICAgIFwieG1sbnM6b3dzPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L293cy8xLjFcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOmdtbD1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWxcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOm9nYz1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2NcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOndjcz1cXFwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93Y3MvMS4xLjFcXFwiXCIsXG4gICAgICAgICAgICBcInhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIlwiXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIG5zLmpvaW4oXCIgXCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2hlbWFsb2NhdGlvbiBwYXIgZGVmYXV0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gc2NoZW1hTG9jYXRpb25cbiAgICAgKi9cbiAgICBzY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieHNpOnNjaGVtYUxvY2F0aW9uPVxcXCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMCBodHRwOi8vc2NoZW1hcy5vcGVuZ2lzLm5ldC93cHMvMS4wLjAvd3BzQWxsLnhzZFxcXCJcIjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGRlIGxhIHJlcXXDqnRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBHRVQgIG91dCA6XG4gICAgICogLy8gIHNlcnZpY2U9X19TRVJWSUNFX19cbiAgICAgKiAvLyAgJnZlcnNpb249X19WRVJTSU9OX19cbiAgICAgKiAvLyAgJnJhd2RhdGFvdXRwdXQ9X19SQVdEQVRBT1VUUFVUX19cbiAgICAgKiAvLyAgJmlkZW50aWZpZXI9X19JREVOVElGSUVSX19cbiAgICAgKiAvLyAgJnJlcXVlc3Q9X19SRVFVRVNUX19cbiAgICAgKiAvLyAgJmRhdGFpbnB1dHM9XCJfX0RBVEFJTlBVVFNfX1wiXG4gICAgICogLy8gIGF2ZWMgX19EQVRBSU5QVVRTX18gPSBfX0tFWV9fPV9fREFUQV9fOy4uLlxuICAgICAqXG4gICAgICogLy8gUE9TVCBvdXQgOlxuICAgICAqIC8vICAgICAgPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cbiAgICAgKiAvLyAgICAgIDx3cHM6X19SRVFVRVNUX18gdmVyc2lvbj1cXFwiX19WRVJTSU9OX19cXFwiIHNlcnZpY2U9XFxcIl9fU0VSVklDRV9fXFxcIlxuICAgICAqIC8vICAgICAgICAgX19OQU1FU1BBQ0VfXyBfX1NDSEVNQUxPQ0FUSU9OX18+XG4gICAgICogLy8gICAgICAgICAgPG93czpJZGVudGlmaWVyPl9fSURFTlRJRklFUl9fPC9vd3M6SWRlbnRpZmllcj5cbiAgICAgKiAvLyAgICAgICAgICA8d3BzOkRhdGFJbnB1dHM+XG4gICAgICogLy8gICAgICAgICAgICAgIDwhLS0gX19EQVRBSU5QVVRTX18gLS0+XG4gICAgICogLy8gICAgICAgICAgPC93cHM6RGF0YUlucHV0cz5cbiAgICAgKiAvLyAgICAgICAgICA8d3BzOlJlc3BvbnNlRm9ybT5cbiAgICAgKiAvLyAgICAgICAgICAgICAgPHdwczpSYXdEYXRhT3V0cHV0PlxuICAgICAqIC8vICAgICAgICAgICAgICA8b3dzOklkZW50aWZpZXI+X19SQVdEQVRBT1VUUFVUX188L293czpJZGVudGlmaWVyPlxuICAgICAqIC8vICAgICAgICAgICAgICA8L3dwczpSYXdEYXRhT3V0cHV0PlxuICAgICAqIC8vICAgICAgICAgIDwvd3BzOlJlc3BvbnNlRm9ybT5cbiAgICAgKiAvLyAgICAgIDwvd3BzOl9fUkVRVUVTVF9fPlwiLFxuICAgICAqIC8vICAgICAgYXZlYyBfX0RBVEFJTlBVVFNfX1xuICAgICAqIC8vICAgICAgICAgICAgIDx3cHM6SW5wdXQ+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICA8b3dzOklkZW50aWZpZXI+X19LRVlfXzwvb3dzOklkZW50aWZpZXI+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICA8d3BzOkRhdGE+XG4gICAgICogLy8gICAgICAgICAgICAgICAgICAgIDx3cHM6TGl0ZXJhbERhdGE+X19EQVRBX188L3dwczpMaXRlcmFsRGF0YT5cbiAgICAgKiAvLyAgICAgICAgICAgICAgICAgIDwvd3BzOkRhdGE+XG4gICAgICogLy8gICAgICAgICAgICAgIDwvd3BzOklucHV0PlxuICAgICAqXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHZhbGlkYXRpb24gZGUgbGEgY29uc3RydWN0aW9uIGRlIGxhIHJlcXVldGVcbiAgICAgKi9cbiAgICBwcm9jZXNzUmVxdWVzdFN0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJXUFM6OnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpXCIpO1xuXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5wb3N0LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUuZ2V0LnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJObyBvdGhlciBtZXRob2Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2aWNlICFcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fU0VSVklDRV9fL2csIHRoaXMucGFyYW1zZXJ2aWNlKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1ZFUlNJT05fXy9nLCB0aGlzLnBhcmFtdmVyc2lvbik7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19SQVdEQVRBT1VUUFVUX18vZywgdGhpcy5wYXJhbXJhd2RhdGFvdXRwdXQpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fSURFTlRJRklFUl9fL2csIHRoaXMucGFyYW1pZGVudGlmaWVyKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1JFUVVFU1RfXy9nLCB0aGlzLnBhcmFtcmVxdWVzdCk7XG5cbiAgICAgICAgLy8gYWpvdXQgK1xuICAgICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fTkFNRVNQQUNFX18vZywgdGhpcy5uYW1lc3BhY2VCeURlZmF1bHQpO1xuICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1NDSEVNQUxPQ0FUSU9OX18vZywgdGhpcy5zY2hlbWFMb2NhdGlvbkJ5RGVmYXVsdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBham91dCBkZXMgZGF0YWlucHV0c1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoLzwhLS0gX19EQVRBSU5QVVRTX18gLS0+L2csIHRoaXMuX19hZGREYXRhSW5wdXRzKCkpO1xuXG4gICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJ0cmFkdWN0aW9uIHRtcGwgOiBlbXB0eSByZXF1ZXN0ICE/XCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0U3RyaW5nID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwidHJhZHVjdGlvbiB0bXBsXCIsIHRlbXBsYXRlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWpvdXQgZGVzIGRvbm7DqWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBEb25uw6llcyBjb25jYXTDqW7DqWVzIGRhbnMgdW5lIGNoYWluZVxuICAgICAqL1xuICAgIF9fYWRkRGF0YUlucHV0cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJXUFM6Ol9fYWRkRGF0YUlucHV0cyAoKVwiKTtcblxuICAgICAgICAvLyBjJ2VzdCB1biBwZXUgZ3Jvc3NpZXIuLi5cbiAgICAgICAgdmFyIHRtcGwgPSB0aGlzLm1ldGhvZCA9PT0gXCJHRVRcIiA/IHRoaXMudGVtcGxhdGUuZ2V0LmlucHV0IDogdGhpcy50ZW1wbGF0ZS5wb3N0LmlucHV0O1xuICAgICAgICB2YXIgc2VwID0gdGhpcy5tZXRob2QgPT09IFwiR0VUXCIgPyBcIjtcIiA6IFwiXCI7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuRGF0YU9iamVjdC5nZXREYXRhKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBjbG9zdXJlID9cbiAgICAgICAgICAgIChmdW5jdGlvbiAoaikge1xuICAgICAgICAgICAgICAgIGlmIChzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VwID0gKGogPT09IG1hcC5sZW5ndGggLSAxKSA/IFwiXCIgOiBcIjtcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGF0Ll9fYWRkRGF0YUlucHV0KHRtcGwsIG1hcFtqXS5rLCBtYXBbal0udiksIHNlcCk7XG4gICAgICAgICAgICB9KShpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFqb3V0IGQndW5lIGRvbm7DqWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdG1wbCAtIHRlbXBsYXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIGNsZWZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSAtIHZhbGV1clxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGNoYWluZSBhdmVjIGxlcyBzdWJzdGl0dXRpb25zIGNsZWYvdmFsZXVyXG4gICAgICovXG4gICAgX19hZGREYXRhSW5wdXQgOiBmdW5jdGlvbiAodG1wbCwga2V5LCBkYXRhKSB7XG4gICAgICAgIHZhciB0bXAgPSB0bXBsO1xuICAgICAgICB0bXAgPSB0bXAucmVwbGFjZSgvX19LRVlfXy9nLCBrZXkpO1xuICAgICAgICB0bXAgPSB0bXAucmVwbGFjZSgvX19EQVRBX18vZywgZGF0YSk7XG4gICAgICAgIHJldHVybiB0bXA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlZmluaXIgbGUgbW9kZSBkZSByZXF1w6p0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCAtIEdFVHxQT1NUXG4gICAgICovXG4gICAgc2V0TWV0aG9kIDogZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiIHx8IG1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcInN1cHBvcnQgb25seSBHRVQgYW5kIFBPU1QgbWV0aG9kICFcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGUgbW9kZSBkZSByZXF1ZXRlIChHRVR8UE9TVCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QWx0aVJlcXVlc3Qub3B0aW9ucy5tb2RlfFN0cmluZ30gbWV0aG9kZSAoR0VUfFBPU1QpXG4gICAgICovXG4gICAgZ2V0TWV0aG9kIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2Q7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgV1BTO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Formats/WPS.js\n"); + +/***/ }), + +/***/ "./src/Formats/XML.js": +/*!****************************!*\ + !*** ./src/Formats/XML.js ***! + \****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* global require */\n\n\n// import __xmldom from \"xmldom\";\n\n/**\n * @classdesc\n *\n * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM,\n * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques.\n *\n * @constructor\n * @alias Gp.Formats.XML\n *\n * @param {Object} [options] - options du format XML\n *\n * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)\n * utile pour interpréter le XML lorsque sa structure est connue.\n * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.\n *\n * @param {Object} [options.writers] - writers\n *\n * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter.\n *\n * @private\n */\nfunction XML(options) {\n if (!(this instanceof XML)) {\n throw new TypeError(\"XML constructor cannot be called as a function.\");\n }\n\n // FIXME : notion de singleton\n\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur XML ()]\");\n\n /**\n * Chaîne de caractères contenant le texte XML\n * @type {String}\n */\n this.xmlString = null;\n\n /**\n * DOM Element correspondant à la structure du XML.\n * @type {DOMElement}\n */\n this.xmlDoc = null;\n\n /**\n * Objet contenant des fonctions de lecture des différentes balises XML.\n * @type {Object}\n */\n this.reader = null;\n\n // traitement des paramètres d'options s'il y en a\n if (options) {\n if (options.xmlString && typeof options.xmlString === \"string\") {\n this.xmlString = options.xmlString;\n // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document\n this.xmlDoc = __getXMLDOC(options.xmlString);\n }\n if (options.reader) {\n this.setReader(options.reader);\n }\n }\n}\nXML.prototype = {\n /**\n * @lends module:XML\n */\n\n /*\n * Constructeur (alias)\n */\n constructor: XML,\n /**\n * Méthode permettant de récupérer la chaîne de caractères associée au format XML\n *\n * @returns {String} xmlString - la chaîne de caractères correspondant au format XML\n */\n getXMLString: function getXMLString() {\n return this.xmlString;\n },\n /**\n * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString).\n * La méthode va aussi transformer cette chaîne de caractères en document XML,\n * afin de remplir l'attribut xmlDoc.\n *\n * @param {String} xmlString - la chaîne de caractères correspondant au format XML\n */\n setXMLString: function setXMLString(xmlString) {\n if (xmlString && typeof xmlString === \"string\") {\n this.xmlString = xmlString;\n this.xmlDoc = __getXMLDOC(xmlString);\n }\n },\n /**\n * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis\n *\n * @return {Object} readers - les readers associés au format XML, s'ils existent,\n * sous forme d'une collection de fonctions\n */\n getReader: function getReader() {\n return this.reader;\n },\n /**\n * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data),\n * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)).\n *\n * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.)\n * utile pour interpréter le XML lorsque sa structure est connue.\n * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture.\n */\n setReader: function setReader(reader) {\n if (reader && reader.read && typeof reader.read === \"function\") {\n this.reader = reader;\n }\n },\n /**\n * Méthode permettant de récupérer le document XML associé au format, s'il existe.\n *\n * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe\n */\n getXMLDoc: function getXMLDoc() {\n return this.xmlDoc;\n },\n /**\n * Setter\n */\n setXMLDoc: function setXMLDoc(doc) {\n this.xmlDoc = doc;\n },\n /**\n * Méthode initialisant la lecture du XML, à partir d'un XML Document :\n * création d'un objet JavaScript contenant les informations du XML,\n * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide).\n *\n * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML :\n * - soit toutes les informations si aucun reader n'a été spécifié à la création du format\n * - soit les informations spécifiées dans le reader.\n */\n parse: function parse() {\n // build xml document from xmlString\n if (!this.xmlDoc && this.xmlString) {\n this.xmlDoc = __getXMLDOC(this.xmlString);\n }\n if (this.xmlDoc) {\n var root = __getRootNode(this.xmlDoc);\n if (root) {\n var parserOutput;\n // call reader if exists\n if (this.reader && this.reader.read) {\n parserOutput = this.reader.read(root);\n } else {\n parserOutput = {};\n parserOutput[root.nodeName] = __readDefault(root);\n }\n return parserOutput;\n } else {\n return {};\n }\n }\n }\n};\n\n/**\n * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML,\n * en utilisant DOMParser () lorsque c'est possible.\n * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface\n *\n * @private\n * @memberof XML\n * @method __getXMLDOC\n * @param {String} xmlString - xml string to be converted into DOM element\n * @return {DOMElement} - the corresponding XML Document\n */\nfunction __getXMLDOC(xmlString) {\n if (typeof window === \"undefined\") {\n // env. nodejs\n var DOMParser = __webpack_require__(/*! xmldom */ \"xmldom\").DOMParser; // __xmldom.DOMParser;\n return new DOMParser().parseFromString(xmlString, \"text/xml\");\n } else {\n // env. browser\n\n var parser;\n var xmlDoc;\n var errorMsg = \"Erreur lors du parsing de la réponse du service : XML non conforme\";\n if (window.ActiveXObject) {\n // Internet Explorer < 9\n xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = false;\n xmlDoc.loadXML(xmlString);\n var parseError = xmlDoc.parseError;\n if (parseError.errorCode) {\n if (parseError.line && parseError.linepos) {\n errorMsg += \"( ligne \" + parseError.line + \", colonne \" + parseError.linepos;\n }\n if (parseError.reason) {\n errorMsg += \": \" + parseError.reason + \")\";\n }\n throw new Error(errorMsg);\n }\n return xmlDoc;\n } else if (window.DOMParser) {\n // les autres (Chrome, Mozilla, IE >= 9)\n parser = new window.DOMParser();\n try {\n xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n } catch (e) {\n // Internet Explorer browser raises exception if xmlString is not valid XML\n if (e.message === \"SyntaxError\") {\n throw new Error(errorMsg);\n } else {\n throw new Error(\"Erreur lors du parsing de la réponse du service : \" + e.message);\n }\n }\n // look for parsing error in case no exception was raised\n if (xmlDoc.getElementsByTagName(\"parsererror\").length > 0) {\n var parsererror = xmlDoc.getElementsByTagName(\"parsererror\");\n for (var i = 0; i < parsererror.length; i++) {\n var content = parsererror[i].innerHTML;\n // except in case parsererror is just because of huge xml, but parsing is done.\n if (content.indexOf(\"Huge input lookup\") === -1) {\n errorMsg += \"(\" + content + \")\";\n throw new Error(errorMsg);\n }\n }\n } else if (!xmlDoc.documentElement) {\n // may happen in chrome browser\n throw new Error(errorMsg);\n }\n return xmlDoc;\n } else {\n // FIXME\n throw new Error(\"Incompatible DOM Parser pour ce navigateur !\");\n }\n }\n}\n\n/**\n * Méthode de la classe (privée) permettant de récupérer le noeud racine du document,\n * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode)\n *\n * @private\n * @memberof XML\n * @method __getRootNode\n * @param {DOMElement} [xmlDoc] - a Document Node\n * @return {DOMElement} root - the document root node\n */\nfunction __getRootNode(xmlDoc) {\n var root;\n if (xmlDoc.nodeType === 9) {\n // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree)\n root = xmlDoc.documentElement;\n } else if (xmlDoc.nodeType === 1) {\n root = xmlDoc;\n }\n return root;\n}\n\n/**\n * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML,\n * lorsqu'aucun reader spécifique n'a été spécifié (parser brut)\n *\n * @private\n * @memberof XML\n * @method readDefault\n * @param {DOMElement} node - a DOM element node\n * @example final data object looks like :\n * data = {\n * attributeName: attributeValue,\n * childName: {\n * attributeName: attributeValue,\n * attributeName: attributeValue,\n * childName: {\n * \"textContent\": textContent\n * },\n * childName: {\n * childName: {\n * attributeName:attributeValue\n * }\n * }\n * }\n * }\n */\nfunction __readDefault(node) {\n var data = {};\n\n // if element node has attributes, set their values to data\n if (node.attributes.length > 0) {\n var dataAttributes = __getAttributes(node);\n data[\"attributes\"] = dataAttributes;\n }\n\n // if element node has childNodes, read them and set them to data\n if (node.hasChildNodes()) {\n var childData = {};\n var child;\n var children = node.childNodes;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.nodeType === 3) {\n // TEXT_NODE\n data[\"textContent\"] = child.nodeValue;\n } else if (child.nodeType === 1) {\n childData = __readDefault(child);\n if (!data[child.nodeName]) {\n // store childData in an object\n data[child.nodeName] = childData;\n } else {\n // in case several childNodes has the same name : store them in an array.\n // if data[nodeName] already exists but is not an array\n if (!Array.isArray(data[child.nodeName])) {\n var old = data[child.nodeName];\n data[child.nodeName] = [];\n data[child.nodeName].push(old);\n }\n data[child.nodeName].push(childData);\n }\n }\n // TODO : manage other node types (4=CDATA, etc)\n }\n }\n\n return data;\n}\n\n/**\n * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément\n *\n * @private\n * @memberof XML\n * @method __getAttributes\n * @param {DOMElement} node - noeud contenant l'attribut recherché\n * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs\n */\nfunction __getAttributes(node) {\n if (node.attributes.length > 0) {\n var nodeAttributes = {};\n var attributes = node.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n nodeAttributes[attribute.nodeName] = attribute.nodeValue;\n }\n return nodeAttributes;\n }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (XML);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Gb3JtYXRzL1hNTC5qcz9mNTc3Il0sIm5hbWVzIjpbIlhNTCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsInhtbFN0cmluZyIsInhtbERvYyIsInJlYWRlciIsIl9fZ2V0WE1MRE9DIiwic2V0UmVhZGVyIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRYTUxTdHJpbmciLCJzZXRYTUxTdHJpbmciLCJnZXRSZWFkZXIiLCJyZWFkIiwiZ2V0WE1MRG9jIiwic2V0WE1MRG9jIiwiZG9jIiwicGFyc2UiLCJyb290IiwiX19nZXRSb290Tm9kZSIsInBhcnNlck91dHB1dCIsIm5vZGVOYW1lIiwiX19yZWFkRGVmYXVsdCIsIndpbmRvdyIsIkRPTVBhcnNlciIsInJlcXVpcmUiLCJwYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJlcnJvck1zZyIsIkFjdGl2ZVhPYmplY3QiLCJhc3luYyIsImxvYWRYTUwiLCJwYXJzZUVycm9yIiwiZXJyb3JDb2RlIiwibGluZSIsImxpbmVwb3MiLCJyZWFzb24iLCJFcnJvciIsImUiLCJtZXNzYWdlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJwYXJzZXJlcnJvciIsImkiLCJjb250ZW50IiwiaW5uZXJIVE1MIiwiaW5kZXhPZiIsImRvY3VtZW50RWxlbWVudCIsIm5vZGVUeXBlIiwibm9kZSIsImRhdGEiLCJhdHRyaWJ1dGVzIiwiZGF0YUF0dHJpYnV0ZXMiLCJfX2dldEF0dHJpYnV0ZXMiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGREYXRhIiwiY2hpbGQiLCJjaGlsZHJlbiIsImNoaWxkTm9kZXMiLCJub2RlVmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJvbGQiLCJwdXNoIiwibm9kZUF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTs7QUFFOEM7QUFDOUM7O0FB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cmMvRm9ybWF0cy9YTUwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgcmVxdWlyZSAqL1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbi8vIGltcG9ydCBfX3htbGRvbSBmcm9tIFwieG1sZG9tXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICpcbiAqIENsYXNzZSBwZXJtZXR0YW50IGQnw6ljcmlyZSBvdSBkZSBsaXJlIGR1IFhNTCwgc291cyBmb3JtZSBkZSBkb2N1bWVudCBET00sXG4gKiDDqXZlbnR1ZWxsZW1lbnQgc2Vsb24gZGVzIGNsw6lzIGRlIGxlY3R1cmUgKHJlYWRlcnMpIG91IGQnw6ljcml0dXJlICh3cml0ZXJzKSBzcMOpY2lmaXF1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuRm9ybWF0cy5YTUxcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyBkdSBmb3JtYXQgWE1MXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJlYWRlcl0gLSBJbnN0YW5jZSBkJ3VuIFJlYWRlciBkZSBzZXJ2aWNlIChBbHRpUmVzcG9uc2VSZWFkZXIsIEdlb2NvZGVSZXF1ZXN0UmVhZGVyLCBldGMuKVxuICogICAgICB1dGlsZSBwb3VyIGludGVycHLDqXRlciBsZSBYTUwgbG9yc3F1ZSBzYSBzdHJ1Y3R1cmUgZXN0IGNvbm51ZS5cbiAqICAgICAgQ2UgcmVhZGVyIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIHVuZSBmb25jdGlvbiBzdGF0aXF1ZSByZWFkIChyb290KSBwZXJtZXR0YW50IGQnaW5pdGlhbGlzZXIgbGEgbGVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVyc10gLSB3cml0ZXJzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnhtbFN0cmluZ10gLSBjaGHDrm5lIGRlIGNhcmFjdMOocmUgY29udGVuYW50IGR1IFhNTCDDoCBpbnRlcnByw6l0ZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gWE1MIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlhNTCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FIDogbm90aW9uIGRlIHNpbmdsZXRvblxuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIFhNTCAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBDaGHDrm5lIGRlIGNhcmFjdMOocmVzIGNvbnRlbmFudCBsZSB0ZXh0ZSBYTUxcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMueG1sU3RyaW5nID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIERPTSBFbGVtZW50IGNvcnJlc3BvbmRhbnQgw6AgbGEgc3RydWN0dXJlIGR1IFhNTC5cbiAgICAgKiBAdHlwZSB7RE9NRWxlbWVudH1cbiAgICAgKi9cbiAgICB0aGlzLnhtbERvYyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBPYmpldCBjb250ZW5hbnQgZGVzIGZvbmN0aW9ucyBkZSBsZWN0dXJlIGRlcyBkaWZmw6lyZW50ZXMgYmFsaXNlcyBYTUwuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnJlYWRlciA9IG51bGw7XG5cbiAgICAvLyB0cmFpdGVtZW50IGRlcyBwYXJhbcOodHJlcyBkJ29wdGlvbnMgcydpbCB5IGVuIGFcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy54bWxTdHJpbmcgJiYgdHlwZW9mIG9wdGlvbnMueG1sU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnhtbFN0cmluZyA9IG9wdGlvbnMueG1sU3RyaW5nO1xuICAgICAgICAgICAgLy8gU2kgdW5lIGNoYWluZSBkZSBjYXJhY3TDqHJlIGEgw6l0w6kgcGFzc8OpZSBlbiBlbnRyw6llIDogb24gbGEgdHJhbnNmb3JtZSBhdXNzaSBlbiBYTUwgZG9jdW1lbnRcbiAgICAgICAgICAgIHRoaXMueG1sRG9jID0gX19nZXRYTUxET0Mob3B0aW9ucy54bWxTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJlYWRlcikge1xuICAgICAgICAgICAgdGhpcy5zZXRSZWFkZXIob3B0aW9ucy5yZWFkZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5YTUwucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpYTUxcbiAgICAgKi9cblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IFhNTCxcblxuICAgIC8qKlxuICAgICAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgcsOpY3Vww6lyZXIgbGEgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBhc3NvY2nDqWUgYXUgZm9ybWF0IFhNTFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30geG1sU3RyaW5nIC0gbGEgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBjb3JyZXNwb25kYW50IGF1IGZvcm1hdCBYTUxcbiAgICAgKi9cbiAgICBnZXRYTUxTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmluZztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTcOpdGhvZGUgcGVybWV0dGFudCBkJ2F0dHJpYnVlciB1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlcyBhdSBmb3JtYXQgWE1MIChhdHRyaWJ1dCB4bWxTdHJpbmcpLlxuICAgICAqIExhIG3DqXRob2RlIHZhIGF1c3NpIHRyYW5zZm9ybWVyIGNldHRlIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMgZW4gZG9jdW1lbnQgWE1MLFxuICAgICAqIGFmaW4gZGUgcmVtcGxpciBsJ2F0dHJpYnV0IHhtbERvYy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB4bWxTdHJpbmcgLSBsYSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIGNvcnJlc3BvbmRhbnQgYXUgZm9ybWF0IFhNTFxuICAgICAqL1xuICAgIHNldFhNTFN0cmluZyA6IGZ1bmN0aW9uICh4bWxTdHJpbmcpIHtcbiAgICAgICAgaWYgKHhtbFN0cmluZyAmJiB0eXBlb2YgeG1sU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnhtbFN0cmluZyA9IHhtbFN0cmluZztcbiAgICAgICAgICAgIHRoaXMueG1sRG9jID0gX19nZXRYTUxET0MoeG1sU3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIHLDqWN1cMOpcmVyIGxlcyByZWFkZXJzIGFzc29jacOpcyBhdSBmb3JtYXQgWE1MLCBzJ2lscyBvbnQgw6l0w6kgZMOpZmluaXNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gcmVhZGVycyAtIGxlcyByZWFkZXJzIGFzc29jacOpcyBhdSBmb3JtYXQgWE1MLCBzJ2lscyBleGlzdGVudCxcbiAgICAgKiAgICAgIHNvdXMgZm9ybWUgZCd1bmUgY29sbGVjdGlvbiBkZSBmb25jdGlvbnNcbiAgICAgKi9cbiAgICBnZXRSZWFkZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRlcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTcOpdGhvZGUgcGVybWV0dGFudCBkJ2F0dHJpYnVlciBkZXMgcmVhZGVycywgc291cyBsYSBmb3JtZSBkJ3VuIG9iamV0IGRlIGZvbmN0aW9ucyAobm9kZSwgZGF0YSksXG4gICAgICogICAgICBsb3JzcXUnaWxzIG4nb250IHBhcyDDqXTDqSBkw6lmaW5pcyBsb3JzIGRlIGwnaW5zdGFuY2lhdGlvbiBwYXIgZXhlbXBsZSAobmV3IFhNTCAob3B0aW9ucykpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlYWRlciAtIEluc3RhbmNlIGQndW4gUmVhZGVyIGRlIHNlcnZpY2UgKEFsdGlSZXNwb25zZVJlYWRlciwgR2VvY29kZVJlcXVlc3RSZWFkZXIsIGV0Yy4pXG4gICAgICogICAgICB1dGlsZSBwb3VyIGludGVycHLDqXRlciBsZSBYTUwgbG9yc3F1ZSBzYSBzdHJ1Y3R1cmUgZXN0IGNvbm51ZS5cbiAgICAgKiAgICAgIENlIHJlYWRlciBkb2l0IGNvbXBvcnRlciBhdSBtb2lucyB1bmUgZm9uY3Rpb24gc3RhdGlxdWUgcmVhZCAocm9vdCkgcGVybWV0dGFudCBkJ2luaXRpYWxpc2VyIGxhIGxlY3R1cmUuXG4gICAgICovXG4gICAgc2V0UmVhZGVyIDogZnVuY3Rpb24gKHJlYWRlcikge1xuICAgICAgICBpZiAocmVhZGVyICYmIHJlYWRlci5yZWFkICYmIHR5cGVvZiByZWFkZXIucmVhZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIHLDqWN1cMOpcmVyIGxlIGRvY3VtZW50IFhNTCBhc3NvY2nDqSBhdSBmb3JtYXQsIHMnaWwgZXhpc3RlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RE9NRWxlbWVudH0geG1sRG9jIC0gbGUgZG9jdW1lbnQgWE1MIChET00gZG9jdW1lbnQgbm9kZSkgcydpbCBleGlzdGVcbiAgICAgKi9cbiAgICBnZXRYTUxEb2MgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhtbERvYztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0dGVyXG4gICAgICovXG4gICAgc2V0WE1MRG9jIDogZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB0aGlzLnhtbERvYyA9IGRvYztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE3DqXRob2RlIGluaXRpYWxpc2FudCBsYSBsZWN0dXJlIGR1IFhNTCwgw6AgcGFydGlyIGQndW4gWE1MIERvY3VtZW50IDpcbiAgICAgKiAgICAgIGNyw6lhdGlvbiBkJ3VuIG9iamV0IEphdmFTY3JpcHQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZHUgWE1MLFxuICAgICAqICAgICAgc2F1ZiBkYW5zIGxlIGNhcyBvw7kgaWwgbidleGlzdGUgcGFzIGRlIFhNTCBEb2N1bWVudCDDoCBpbnRlcnByw6l0ZXIgKHJldG91cm5lIHVuIG9iamV0IHZpZGUpLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBbcGFyc2VyT3V0cHV0XSAtIHVuIG9iamV0IEphdmFTY3JpcHQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZHUgWE1MIDpcbiAgICAgKiAtIHNvaXQgdG91dGVzIGxlcyBpbmZvcm1hdGlvbnMgc2kgYXVjdW4gcmVhZGVyIG4nYSDDqXTDqSBzcMOpY2lmacOpIMOgIGxhIGNyw6lhdGlvbiBkdSBmb3JtYXRcbiAgICAgKiAtIHNvaXQgbGVzIGluZm9ybWF0aW9ucyBzcMOpY2lmacOpZXMgZGFucyBsZSByZWFkZXIuXG4gICAgICovXG4gICAgcGFyc2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHhtbCBkb2N1bWVudCBmcm9tIHhtbFN0cmluZ1xuICAgICAgICBpZiAoIXRoaXMueG1sRG9jICYmIHRoaXMueG1sU3RyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnhtbERvYyA9IF9fZ2V0WE1MRE9DKHRoaXMueG1sU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy54bWxEb2MpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gX19nZXRSb290Tm9kZSh0aGlzLnhtbERvYyk7XG4gICAgICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZXJPdXRwdXQ7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCByZWFkZXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZGVyICYmIHRoaXMucmVhZGVyLnJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyT3V0cHV0ID0gdGhpcy5yZWFkZXIucmVhZChyb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZXJPdXRwdXQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyT3V0cHV0W3Jvb3Qubm9kZU5hbWVdID0gX19yZWFkRGVmYXVsdChyb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlck91dHB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSBjcsOpZXIgdW4gWE1MIERvY3VtZW50IMOgIHBhcnRpciBkJ3VuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIFhNTCxcbiAqICAgICAgZW4gdXRpbGlzYW50IERPTVBhcnNlciAoKSBsb3JzcXVlIGMnZXN0IHBvc3NpYmxlLlxuICogICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOiBodHRwczovL2R2Y3MudzMub3JnL2hnL2lubmVyaHRtbC9yYXctZmlsZS90aXAvaW5kZXguaHRtbCN0aGUtZG9tcGFyc2VyLWludGVyZmFjZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgWE1MXG4gKiBAbWV0aG9kIF9fZ2V0WE1MRE9DXG4gKiBAcGFyYW0ge1N0cmluZ30geG1sU3RyaW5nIC0geG1sIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaW50byBET00gZWxlbWVudFxuICogQHJldHVybiB7RE9NRWxlbWVudH0gLSB0aGUgY29ycmVzcG9uZGluZyBYTUwgRG9jdW1lbnRcbiAqL1xuZnVuY3Rpb24gX19nZXRYTUxET0MgKHhtbFN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIGVudi4gbm9kZWpzXG4gICAgICAgIHZhciBET01QYXJzZXIgPSByZXF1aXJlKFwieG1sZG9tXCIpLkRPTVBhcnNlcjsgLy8gX194bWxkb20uRE9NUGFyc2VyO1xuICAgICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW52LiBicm93c2VyXG5cbiAgICAgICAgdmFyIHBhcnNlcjtcbiAgICAgICAgdmFyIHhtbERvYztcbiAgICAgICAgdmFyIGVycm9yTXNnID0gXCJFcnJldXIgbG9ycyBkdSBwYXJzaW5nIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBYTUwgbm9uIGNvbmZvcm1lXCI7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA8IDlcbiAgICAgICAgICAgIHhtbERvYyA9IG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxET01cIik7XG4gICAgICAgICAgICB4bWxEb2MuYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgICAgIHhtbERvYy5sb2FkWE1MKHhtbFN0cmluZyk7XG4gICAgICAgICAgICB2YXIgcGFyc2VFcnJvciA9IHhtbERvYy5wYXJzZUVycm9yO1xuICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3IuZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3IubGluZSAmJiBwYXJzZUVycm9yLmxpbmVwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2cgKz0gXCIoIGxpZ25lIFwiICsgcGFyc2VFcnJvci5saW5lICsgXCIsIGNvbG9ubmUgXCIgKyBwYXJzZUVycm9yLmxpbmVwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUVycm9yLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1zZyArPSBcIjogIFwiICsgcGFyc2VFcnJvci5yZWFzb24gKyBcIilcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB4bWxEb2M7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LkRPTVBhcnNlcikge1xuICAgICAgICAgICAgLy8gbGVzIGF1dHJlcyAoQ2hyb21lLCBNb3ppbGxhLCBJRSA+PSA5KVxuICAgICAgICAgICAgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgYnJvd3NlciByYWlzZXMgZXhjZXB0aW9uIGlmIHhtbFN0cmluZyBpcyBub3QgdmFsaWQgWE1MXG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gXCJTeW50YXhFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyZXVyIGxvcnMgZHUgcGFyc2luZyBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHBhcnNpbmcgZXJyb3IgaW4gY2FzZSBubyBleGNlcHRpb24gd2FzIHJhaXNlZFxuICAgICAgICAgICAgaWYgKHhtbERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyc2VyZXJyb3IgPSB4bWxEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXJzZXJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlcmVycm9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gcGFyc2VyZXJyb3JbaV0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgaW4gY2FzZSBwYXJzZXJlcnJvciBpcyBqdXN0IGJlY2F1c2Ugb2YgaHVnZSB4bWwsIGJ1dCBwYXJzaW5nIGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoXCJIdWdlIGlucHV0IGxvb2t1cFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnICs9IFwiKFwiICsgY29udGVudCArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXhtbERvYy5kb2N1bWVudEVsZW1lbnQpIHsgLy8gbWF5IGhhcHBlbiBpbiBjaHJvbWUgYnJvd3NlclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geG1sRG9jO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29tcGF0aWJsZSBET00gUGFyc2VyIHBvdXIgY2UgbmF2aWdhdGV1ciAhXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSByw6ljdXDDqXJlciBsZSBub2V1ZCByYWNpbmUgZHUgZG9jdW1lbnQsXG4gKiAgICAgIMOgIHBhcnRpciBkJ3VuIGRvY3VtZW50IG5vZGUgKG5vZGVUeXBlPTkpLCBwdWlzIGxlY3R1cmUgZGUgY2Ugbm9ldWQgKHJlYWROb2RlKVxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgWE1MXG4gKiBAbWV0aG9kIF9fZ2V0Um9vdE5vZGVcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gW3htbERvY10gLSBhIERvY3VtZW50IE5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR9IHJvb3QgLSB0aGUgZG9jdW1lbnQgcm9vdCBub2RlXG4gKi9cbmZ1bmN0aW9uIF9fZ2V0Um9vdE5vZGUgKHhtbERvYykge1xuICAgIHZhciByb290O1xuICAgIGlmICh4bWxEb2Mubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgLy8gSU5GTyA6IG5vZGVUeXBlIDkgcmVwcmVzZW50cyB0aGUgZW50aXJlIGRvY3VtZW50ICh0aGUgcm9vdC1ub2RlIG9mIHRoZSBET00gdHJlZSlcbiAgICAgICAgcm9vdCA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIGlmICh4bWxEb2Mubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcm9vdCA9IHhtbERvYztcbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKlxuICogTcOpdGhvZGUgZGUgbGEgY2xhc3NlIChwcml2w6llKSBwZXJtZXR0YW50IGRlIGxpcmUgYXV0b21hdGlxdWVtZW50IHVuIG5vZXVkIFhNTCxcbiAqICAgICAgbG9yc3F1J2F1Y3VuIHJlYWRlciBzcMOpY2lmaXF1ZSBuJ2Egw6l0w6kgc3DDqWNpZmnDqSAocGFyc2VyIGJydXQpXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBYTUxcbiAqIEBtZXRob2QgcmVhZERlZmF1bHRcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZSAtIGEgRE9NIGVsZW1lbnQgbm9kZVxuICogQGV4YW1wbGUgZmluYWwgZGF0YSBvYmplY3QgbG9va3MgbGlrZSA6XG4gKiAgICAgICAgICBkYXRhID0ge1xuICogICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IGF0dHJpYnV0ZVZhbHVlLFxuICogICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVWYWx1ZSxcbiAqICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlVmFsdWUsXG4gKiAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0Q29udGVudFwiOiB0ZXh0Q29udGVudFxuICogICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICBjaGlsZE5hbWU6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZToge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6YXR0cmlidXRlVmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgIH1cbiAqL1xuZnVuY3Rpb24gX19yZWFkRGVmYXVsdCAobm9kZSkge1xuICAgIHZhciBkYXRhID0ge307XG5cbiAgICAvLyBpZiBlbGVtZW50IG5vZGUgaGFzIGF0dHJpYnV0ZXMsIHNldCB0aGVpciB2YWx1ZXMgdG8gZGF0YVxuICAgIGlmIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZGF0YUF0dHJpYnV0ZXMgPSBfX2dldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIGRhdGFbXCJhdHRyaWJ1dGVzXCJdID0gZGF0YUF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gaWYgZWxlbWVudCBub2RlIGhhcyBjaGlsZE5vZGVzLCByZWFkIHRoZW0gYW5kIHNldCB0aGVtIHRvIGRhdGFcbiAgICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgdmFyIGNoaWxkRGF0YSA9IHt9O1xuICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHsgLy8gVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgZGF0YVtcInRleHRDb250ZW50XCJdID0gY2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNoaWxkRGF0YSA9IF9fcmVhZERlZmF1bHQoY2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2NoaWxkLm5vZGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBjaGlsZERhdGEgaW4gYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbY2hpbGQubm9kZU5hbWVdID0gY2hpbGREYXRhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugc2V2ZXJhbCBjaGlsZE5vZGVzIGhhcyB0aGUgc2FtZSBuYW1lIDogc3RvcmUgdGhlbSBpbiBhbiBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgZGF0YVtub2RlTmFtZV0gYWxyZWFkeSBleGlzdHMgYnV0IGlzIG5vdCBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YVtjaGlsZC5ub2RlTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkID0gZGF0YVtjaGlsZC5ub2RlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NoaWxkLm5vZGVOYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtjaGlsZC5ub2RlTmFtZV0ucHVzaChvbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbY2hpbGQubm9kZU5hbWVdLnB1c2goY2hpbGREYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPIDogbWFuYWdlIG90aGVyIG5vZGUgdHlwZXMgKDQ9Q0RBVEEsIGV0YylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE3DqXRob2RlIGRlIGxhIGNsYXNzZSAocHJpdsOpZSkgcGVybWV0dGFudCBkZSByw6ljdXDDqXJlciBsZXMgYXR0cmlidXRzIGQndW4gbm9ldWQgw6lsw6ltZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBYTUxcbiAqIEBtZXRob2QgX19nZXRBdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCBjb250ZW5hbnQgbCdhdHRyaWJ1dCByZWNoZXJjaMOpXG4gKiBAcmV0dXJuIHtPYmplY3R9IG5vZGVBdHRyaWJ1dGVzIC0gb2JqZXQgY29udGVuYW50IGxlcyBub21zIGV0IHZhbGV1cnMgZGVzIGRpZmbDqXJlbnRzIGF0dHJpYnV0c1xuICovXG5mdW5jdGlvbiBfX2dldEF0dHJpYnV0ZXMgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0ge307XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgbm9kZUF0dHJpYnV0ZXNbYXR0cmlidXRlLm5vZGVOYW1lXSA9IGF0dHJpYnV0ZS5ub2RlVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVBdHRyaWJ1dGVzO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWE1MO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Formats/XML.js\n"); + +/***/ }), + +/***/ "./src/Gp.js": +/*!*******************!*\ + !*** ./src/Gp.js ***! + \*******************/ +/*! exports provided: servicesVersion, servicesDate, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"servicesVersion\", function() { return servicesVersion; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"servicesDate\", function() { return servicesDate; });\n/* harmony import */ var _Services_Services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Services/Services */ \"./src/Services/Services.js\");\n/* harmony import */ var _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Services/DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Services/Alti/Response/model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Services/Alti/Response/model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\n/* harmony import */ var _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Services/AutoComplete/Response/model/AutoCompleteResponse */ \"./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\");\n/* harmony import */ var _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Services/AutoComplete/Response/model/SuggestedLocation */ \"./src/Services/AutoComplete/Response/model/SuggestedLocation.js\");\n/* harmony import */ var _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse */ \"./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\");\n/* harmony import */ var _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Services/Route/Response/model/RouteResponse */ \"./src/Services/Route/Response/model/RouteResponse.js\");\n/* harmony import */ var _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Services/Route/Response/model/RouteInstruction */ \"./src/Services/Route/Response/model/RouteInstruction.js\");\n/* harmony import */ var _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Services/Config/Config */ \"./src/Services/Config/Config.js\");\n/* harmony import */ var _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Protocols/XHR */ \"./src/Protocols/XHR.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_13___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../package.json */ \"./package.json\", 1);\n/**\n* Global variable Gp.\n*\n* @module Gp\n* @alias Gp\n* @description\n*\n* This is the global variable that is exposed in the browser environment.\n* Content is composed of constructor, functions and properties...\n*\n* > {@link Gp.Error Error()}\n* - .TYPE_SRVERR : \"SERVICE_ERROR\"\n* - .TYPE_UNKERR : \"UNKNOWN_ERROR\"\n* - .TYPE_USEERR : \"USAGE_ERROR\"\n*\n* > {@link module:Helper Helper}\n* - .indent()\n* - .normalyzeParameters()\n* - .normalyzeUrl()\n*\n* > {@link module:XHR Protocols.XHR}\n* - .call()\n*\n* > {@link module:Services Services (objects)}\n* - .Alti\n* - {@link Gp.Services.Alti.Elevation .Elevation()}\n* - {@link Gp.Services.AltiResponse .AltiResponse()}\n* - .AutoComplete\n* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()}\n* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()}\n* - {@link Gp.Services.Config .Config()}\n* - {@link Gp.Services.DefaultUrl .DefaultUrl()}\n* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()}\n* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()}\n* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()}\n* - .Route\n* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()}\n* - {@link Gp.Services.RouteResponse .RouteResponse()}\n*\n* > Services (factory)\n* - {@link module:Services~autoComplete .autoComplete()}\n* - {@link module:Services~geocode .geocode()}\n* - {@link module:Services~getAltitude .getAltitude()}\n* - {@link module:Services~getConfig .getConfig()}\n* - {@link module:Services~isoCurve .isoCurve()}\n* - {@link module:Services~reverseGeocode .reverseGeocode()}\n* - {@link module:Services~route .route()}\n*\n* > servicesDate : \"YYYY-MM-DD\"\n*\n* > servicesVersion : \"X.X.X\"\n*\n*/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/** Version */\nvar servicesVersion = _package_json__WEBPACK_IMPORTED_MODULE_13__.version;\n/** Publication date */\nvar servicesDate = _package_json__WEBPACK_IMPORTED_MODULE_13__.date;\n\n// on declare les ns dans root global\nvar Gp = {};\nGp.servicesVersion = servicesVersion;\nGp.servicesDate = servicesDate;\n\n// Export Protocols\nGp.Protocols = {};\nGp.Protocols.XHR = _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__[\"default\"];\n// Export services\nGp.Services = _Services_Services__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n// Export DefaultUrls\nGp.Services.DefaultUrl = _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n// Export Alti\nGp.Services.AltiResponse = _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\nGp.Services.Alti = {};\nGp.Services.Alti.Elevation = _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n// Export Autocomplete\nGp.Services.AutoCompleteResponse = _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__[\"default\"];\nGp.Services.AutoComplete = {};\nGp.Services.AutoComplete.SuggestedLocation = _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__[\"default\"];\n// Export Config\nGp.Services.Config = _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__[\"default\"];\n// Export IsoCurve\nGp.Services.IsoCurveResponse = _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__[\"default\"];\n// Export Route\nGp.Services.RouteResponse = _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nGp.Services.Route = {};\nGp.Services.Route.RouteInstruction = _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__[\"default\"];\n// Export Erreurs et Outils\nGp.Error = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\nGp.Helper = _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (Gp);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9HcC5qcz8xZjU2Il0sIm5hbWVzIjpbInNlcnZpY2VzVmVyc2lvbiIsIlBrZyIsInZlcnNpb24iLCJzZXJ2aWNlc0RhdGUiLCJkYXRlIiwiR3AiLCJQcm90b2NvbHMiLCJYSFIiLCJTZXJ2aWNlcyIsIkRlZmF1bHRVcmwiLCJBbHRpUmVzcG9uc2UiLCJBbHRpIiwiRWxldmF0aW9uIiwiQXV0b0NvbXBsZXRlUmVzcG9uc2UiLCJBdXRvQ29tcGxldGUiLCJTdWdnZXN0ZWRMb2NhdGlvbiIsIkNvbmZpZyIsIklzb0N1cnZlUmVzcG9uc2UiLCJSb3V0ZVJlc3BvbnNlIiwiUm91dGUiLCJSb3V0ZUluc3RydWN0aW9uIiwiRXJyb3IiLCJIZWxwZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTJDO0FBQ1c7QUFDaUI7QUFDTjtBQUM4QjtBQUNOO0FBQ1E7QUFDdkI7QUFDTTtBQUNsQztBQUNaO0FBQ1k7QUFDVjtBQUVGOztBQUVsQztBQUNPLElBQU1BLGVBQWUsR0FBR0MsMkNBQUcsQ0FBQ0MsT0FBTztBQUMxQztBQUNPLElBQU1DLFlBQVksR0FBR0YsMkNBQUcsQ0FBQ0csSUFBSTs7QUFFcEM7QUFDQSxJQUFJQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRVhBLEVBQUUsQ0FBQ0wsZUFBZSxHQUFHQSxlQUFlO0FBQ3BDSyxFQUFFLENBQUNGLFlBQVksR0FBR0EsWUFBWTs7QUFFOUI7QUFDQUUsRUFBRSxDQUFDQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCRCxFQUFFLENBQUNDLFNBQVMsQ0FBQ0MsR0FBRyxHQUFHQSx1REFBRztBQUN0QjtBQUNBRixFQUFFLENBQUNHLFFBQVEsR0FBR0EsMERBQVE7QUFDdEI7QUFDQUgsRUFBRSxDQUFDRyxRQUFRLENBQUNDLFVBQVUsR0FBR0EsbUVBQVU7QUFDbkM7QUFDQUosRUFBRSxDQUFDRyxRQUFRLENBQUNFLFlBQVksR0FBR0Esa0ZBQVk7QUFDdkNMLEVBQUUsQ0FBQ0csUUFBUSxDQUFDRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCTixFQUFFLENBQUNHLFFBQVEsQ0FBQ0csSUFBSSxDQUFDQyxTQUFTLEdBQUdBLCtFQUFTO0FBQ3RDO0FBQ0FQLEVBQUUsQ0FBQ0csUUFBUSxDQUFDSyxvQkFBb0IsR0FBR0Esa0dBQW9CO0FBQ3ZEUixFQUFFLENBQUNHLFFBQVEsQ0FBQ00sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUM3QlQsRUFBRSxDQUFDRyxRQUFRLENBQUNNLFlBQVksQ0FBQ0MsaUJBQWlCLEdBQUdBLCtGQUFpQjtBQUM5RDtBQUNBVixFQUFFLENBQUNHLFFBQVEsQ0FBQ1EsTUFBTSxHQUFHQSwrREFBTTtBQUMzQjtBQUNBWCxFQUFFLENBQUNHLFFBQVEsQ0FBQ1MsZ0JBQWdCLEdBQUdBLHdHQUFnQjtBQUMvQztBQUNBWixFQUFFLENBQUNHLFFBQVEsQ0FBQ1UsYUFBYSxHQUFHQSxvRkFBYTtBQUN6Q2IsRUFBRSxDQUFDRyxRQUFRLENBQUNXLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDdEJkLEVBQUUsQ0FBQ0csUUFBUSxDQUFDVyxLQUFLLENBQUNDLGdCQUFnQixHQUFHQSx1RkFBZ0I7QUFDckQ7QUFDQWYsRUFBRSxDQUFDZ0IsS0FBSyxHQUFHQSxpRUFBSztBQUNoQmhCLEVBQUUsQ0FBQ2lCLE1BQU0sR0FBR0Esc0RBQU07QUFFSGpCLGlFQUFFIiwiZmlsZSI6Ii4vc3JjL0dwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4qIEdsb2JhbCB2YXJpYWJsZSBHcC5cbipcbiogQG1vZHVsZSBHcFxuKiBAYWxpYXMgR3BcbiogQGRlc2NyaXB0aW9uXG4qXG4qIFRoaXMgaXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9zZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4qIENvbnRlbnQgaXMgY29tcG9zZWQgb2YgY29uc3RydWN0b3IsIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcy4uLlxuKlxuKiA+IHtAbGluayBHcC5FcnJvciBFcnJvcigpfVxuKiAgICAgLSAuVFlQRV9TUlZFUlIgOiBcIlNFUlZJQ0VfRVJST1JcIlxuKiAgICAgLSAuVFlQRV9VTktFUlIgOiBcIlVOS05PV05fRVJST1JcIlxuKiAgICAgLSAuVFlQRV9VU0VFUlIgOiBcIlVTQUdFX0VSUk9SXCJcbipcbiogPiB7QGxpbmsgbW9kdWxlOkhlbHBlciBIZWxwZXJ9XG4qICAgICAtIC5pbmRlbnQoKVxuKiAgICAgLSAubm9ybWFseXplUGFyYW1ldGVycygpXG4qICAgICAtIC5ub3JtYWx5emVVcmwoKVxuKlxuKiA+IHtAbGluayBtb2R1bGU6WEhSIFByb3RvY29scy5YSFJ9XG4qICAgICAtIC5jYWxsKClcbipcbiogPiB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzIFNlcnZpY2VzIChvYmplY3RzKX1cbiogICAgIC0gLkFsdGlcbiogICAgICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5BbHRpLkVsZXZhdGlvbiAuRWxldmF0aW9uKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5BbHRpUmVzcG9uc2UgLkFsdGlSZXNwb25zZSgpfVxuKiAgICAgLSAuQXV0b0NvbXBsZXRlXG4qICAgICAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uIC5TdWdnZXN0ZWRMb2NhdGlvbigpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlUmVzcG9uc2UgLkF1dG9Db21wbGV0ZVJlc3BvbnNlKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Db25maWcgLkNvbmZpZygpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuRGVmYXVsdFVybCAuRGVmYXVsdFVybCgpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlIC5HZW9jb2RlUmVzcG9uc2UoKX1cbiogICAgIC0ge0BsaW5rIEdwLlNlcnZpY2VzLkdldENvbmZpZ1Jlc3BvbnNlIC5HZXRDb25maWdSZXNwb25zZSgpfVxuKiAgICAgLSB7QGxpbmsgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZSAuSXNvQ3VydmVSZXNwb25zZSgpfVxuKiAgICAgLSAuUm91dGVcbiogICAgICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Sb3V0ZS5Sb3V0ZUluc3RydWN0aW9uIC5Sb3V0ZUluc3RydWN0aW9uKCl9XG4qICAgICAtIHtAbGluayBHcC5TZXJ2aWNlcy5Sb3V0ZVJlc3BvbnNlIC5Sb3V0ZVJlc3BvbnNlKCl9XG4qXG4qID4gU2VydmljZXMgKGZhY3RvcnkpXG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+YXV0b0NvbXBsZXRlIC5hdXRvQ29tcGxldGUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35nZW9jb2RlIC5nZW9jb2RlKCl9XG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0QWx0aXR1ZGUgLmdldEFsdGl0dWRlKCl9XG4qICAgICAtIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0Q29uZmlnIC5nZXRDb25maWcoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35pc29DdXJ2ZSAuaXNvQ3VydmUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yZXZlcnNlR2VvY29kZSAucmV2ZXJzZUdlb2NvZGUoKX1cbiogICAgIC0ge0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yb3V0ZSAucm91dGUoKX1cbipcbiogPiBzZXJ2aWNlc0RhdGUgOiBcIllZWVktTU0tRERcIlxuKlxuKiA+IHNlcnZpY2VzVmVyc2lvbiA6IFwiWC5YLlhcIlxuKlxuKi9cblxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL1NlcnZpY2VzL1NlcnZpY2VzXCI7XG5pbXBvcnQgRGVmYXVsdFVybCBmcm9tIFwiLi9TZXJ2aWNlcy9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IEFsdGlSZXNwb25zZSBmcm9tIFwiLi9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0VsZXZhdGlvblwiO1xuaW1wb3J0IEF1dG9Db21wbGV0ZVJlc3BvbnNlIGZyb20gXCIuL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9BdXRvQ29tcGxldGVSZXNwb25zZVwiO1xuaW1wb3J0IFN1Z2dlc3RlZExvY2F0aW9uIGZyb20gXCIuL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9TdWdnZXN0ZWRMb2NhdGlvblwiO1xuaW1wb3J0IElzb0N1cnZlUmVzcG9uc2UgZnJvbSBcIi4vU2VydmljZXMvUHJvY2Vzc0lzb0N1cnZlL1Jlc3BvbnNlL21vZGVsL1Byb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZSBmcm9tIFwiLi9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVJbnN0cnVjdGlvbiBmcm9tIFwiLi9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uXCI7XG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL1NlcnZpY2VzL0NvbmZpZy9Db25maWdcIjtcbmltcG9ydCBYSFIgZnJvbSBcIi4vUHJvdG9jb2xzL1hIUlwiO1xuaW1wb3J0IEVycm9yIGZyb20gXCIuL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgSGVscGVyIGZyb20gXCIuL1V0aWxzL0hlbHBlclwiO1xuXG5pbXBvcnQgUGtnIGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIjtcblxuLyoqIFZlcnNpb24gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlc1ZlcnNpb24gPSBQa2cudmVyc2lvbjtcbi8qKiBQdWJsaWNhdGlvbiBkYXRlICovXG5leHBvcnQgY29uc3Qgc2VydmljZXNEYXRlID0gUGtnLmRhdGU7XG5cbi8vIG9uIGRlY2xhcmUgbGVzIG5zIGRhbnMgcm9vdCBnbG9iYWxcbnZhciBHcCA9IHt9O1xuXG5HcC5zZXJ2aWNlc1ZlcnNpb24gPSBzZXJ2aWNlc1ZlcnNpb247XG5HcC5zZXJ2aWNlc0RhdGUgPSBzZXJ2aWNlc0RhdGU7XG5cbi8vIEV4cG9ydCBQcm90b2NvbHNcbkdwLlByb3RvY29scyA9IHt9O1xuR3AuUHJvdG9jb2xzLlhIUiA9IFhIUjtcbi8vIEV4cG9ydCBzZXJ2aWNlc1xuR3AuU2VydmljZXMgPSBTZXJ2aWNlcztcbi8vIEV4cG9ydCBEZWZhdWx0VXJsc1xuR3AuU2VydmljZXMuRGVmYXVsdFVybCA9IERlZmF1bHRVcmw7XG4vLyBFeHBvcnQgQWx0aVxuR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlID0gQWx0aVJlc3BvbnNlO1xuR3AuU2VydmljZXMuQWx0aSA9IHt9O1xuR3AuU2VydmljZXMuQWx0aS5FbGV2YXRpb24gPSBFbGV2YXRpb247XG4vLyBFeHBvcnQgQXV0b2NvbXBsZXRlXG5HcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGVSZXNwb25zZSA9IEF1dG9Db21wbGV0ZVJlc3BvbnNlO1xuR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlID0ge307XG5HcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGUuU3VnZ2VzdGVkTG9jYXRpb24gPSBTdWdnZXN0ZWRMb2NhdGlvbjtcbi8vIEV4cG9ydCBDb25maWdcbkdwLlNlcnZpY2VzLkNvbmZpZyA9IENvbmZpZztcbi8vIEV4cG9ydCBJc29DdXJ2ZVxuR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZSA9IElzb0N1cnZlUmVzcG9uc2U7XG4vLyBFeHBvcnQgUm91dGVcbkdwLlNlcnZpY2VzLlJvdXRlUmVzcG9uc2UgPSBSb3V0ZVJlc3BvbnNlO1xuR3AuU2VydmljZXMuUm91dGUgPSB7fTtcbkdwLlNlcnZpY2VzLlJvdXRlLlJvdXRlSW5zdHJ1Y3Rpb24gPSBSb3V0ZUluc3RydWN0aW9uO1xuLy8gRXhwb3J0IEVycmV1cnMgZXQgT3V0aWxzXG5HcC5FcnJvciA9IEVycm9yO1xuR3AuSGVscGVyID0gSGVscGVyO1xuXG5leHBvcnQgZGVmYXVsdCBHcDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Gp.js\n"); + +/***/ }), + +/***/ "./src/Protocols/JSONP.js": +/*!********************************!*\ + !*** ./src/Protocols/JSONP.js ***! + \********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/**\n * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail\n *\n * @module JSONP\n * @private\n * @alias Gp.Protocols.JSONP\n */\n\n\n// cf. https://github.com/sobstel/jsonp.js\nvar JSONP = {\n /**\n * Construction d'un identifiant statique basé sur le timestamp,\n * et qui s'incremente de +1 à chaque appel\n */\n uuid: function () {\n var id = Math.floor(Date.now());\n return function () {\n return id++;\n };\n }(),\n /**\n * Cette fonction réalise l'appel du service fourni via le paramètre \"options.url\"\n * en mettant en œuvre le protocole JSONP.\n *\n * @method call\n * @static\n * @param {Object} options - parametres d'invocation du service en JSONP\n * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP).\n * Cette URL contient déjà les paramètres du service.\n * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ;\n * sa valeur est déterminée en fonction du paramètre callbackName.\n * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu.\n * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut.\n * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL.\n * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: \"callback1458574396582 ()\"\n * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL.\n * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte.\n * La fonction de callback est créée dynamiquement par la fonction JSONP ;\n * elle a deux fonctions :\n * elle annule la condition de timeOut\n * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse.\n * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service.\n * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback.\n * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre.\n * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service.\n * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut.\n * @example\n * var options = {\n * url : 'http://localhost/some/test.json&callback=myResults',\n * timeOut : 100,\n * callbackName : 'myResults',\n * callbackSuffix : \"\",\n * onResponse : function (response) {\n * console.log('results : ', response);\n * },\n *\n * };\n * JSONP.call(options);\n */\n call: function call(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"JSONP\");\n logger.trace(\"[JSONP::call ()]\");\n\n // analyse parametres\n\n if (!options) {\n logger.error(\"missing parameter : options !\");\n throw new Error(\"missing parameter : options !\");\n }\n if (!options.url) {\n logger.error(\"missing parameter : options.url !\");\n throw new Error(\"missing parameter : options.url !\");\n }\n if (!options.timeOut) {\n logger.info(\"setting 'options.timeOut' default value\");\n options.timeOut = 0;\n }\n\n // FIXME si un callback coté client a été mis en place,\n // cette condition sur cette methode n'a pas de sens !?\n if (!options.onResponse) {\n logger.error(\"missing parameter : options.onResponse !\");\n throw new Error(\"missing parameter : options.onResponse !\");\n // FIXME doit on definir un callback interne par defaut !?\n // options.onResponse = function (data) {\n // console.log(\"response callback (inner) : \", data);\n // };\n }\n\n // ID du callback à utiliser : null ou string.\n // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = \"\")\n // sinon, on utilise un timestamp : this.uuid ()\n var callbackId = typeof options.callbackSuffix === \"string\" ? options.callbackSuffix : this.uuid();\n\n // on recherche le parametre callback et son nom de fonction dans l'url\n var urlHasCallbackKey = false;\n var urlHasCallbackName = false;\n var idx = options.url.indexOf(\"callback=\");\n if (idx !== -1) {\n urlHasCallbackKey = true;\n // extraction callbackName de l'url : entre \"callback=\" et \"&\" ou fin de ligne\n var j = options.url.indexOf(\"&\", idx);\n if (j === -1) {\n j = options.url.length;\n }\n\n // on ecrase le parametre options.callbackName s'il avait été défini\n var callbackName = options.url.substring(idx + 9, j);\n if (callbackName) {\n urlHasCallbackName = true;\n options.callbackName = callbackName;\n logger.info(\"setting 'options.callbackName' value (\" + options.callbackName + \") from 'options.url' parameter\");\n }\n }\n\n // on ajoute le parametre callback dans l'URL s'il n'existe pas\n if (!urlHasCallbackKey) {\n // gestion des autres param. et \"?\"\n var k = options.url.indexOf(\"?\");\n if (k === -1) {\n // aucun param., ni de '?'\n options.url = options.url + \"?\" + \"callback=\";\n } else if (k === options.url.length) {\n // uniquement le '?'\n options.url = options.url + \"callback=\";\n } else {\n // le '?' et les param. existent\n options.url = options.url + \"&\" + \"callback=\";\n }\n logger.info(\"setting callback default key in 'options.url' : \" + options.url);\n }\n\n // utilisation de la fonction callback coté client ?\n var HasCallbackName = options.callbackName ? true : urlHasCallbackName;\n\n // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas\n if (!urlHasCallbackName) {\n // fonction callback par defaut\n if (!options.callbackName) {\n logger.info(\"setting 'options.callbackName' default value\");\n options.callbackName = \"callback\"; // ou \"gp.protocol.jsonp\" ?\n // info : si on ne veut pas gerer d'ID dans le callback,\n // options.callbackSuffix = \"\"\n if (callbackId || callbackId === \"\") {\n options.callbackName += callbackId;\n }\n }\n options.url = options.url.replace(\"callback=\", \"callback=\" + options.callbackName);\n logger.info(\"setting callback function name in 'options.url' : \" + options.url);\n }\n\n // timeOut par defaut\n if (!options.onTimeOut) {\n logger.info(\"setting 'options.onTimeOut' default value\");\n /** callback timeout par defaut */\n options.onTimeOut = function /* error */\n () {\n console.log(\"TimeOut while invoking url : \" + options.url);\n };\n }\n if (!HasCallbackName) {\n var self = this;\n\n // event du timeout\n var onTimeOutTrigger = null;\n\n // declenche le timeout si > à 0 !\n if (options.timeOut > 0) {\n onTimeOutTrigger = window.setTimeout(function () {\n /** fonction de reponse du service */\n window[options.callbackName] = function () {};\n options.onTimeOut();\n self._deleteScript(callbackId);\n }, options.timeOut);\n }\n\n // FIXME le nom de la fonction n'accepte pas de namespace !\n // ex. Gp.Function.callback\n /**\n * fonction de reponse du service\n * @param {Object} data - data\n * @private\n */\n window[options.callbackName] = function (data) {\n window.clearTimeout(onTimeOutTrigger);\n options.onResponse(data);\n self._deleteScript(callbackId);\n };\n }\n this._createScript(callbackId, options.url);\n },\n /**\n * create Script\n * @param {String} callbackId - callback Id\n * @param {String} url - url\n * @private\n */\n _createScript: function _createScript(callbackId, url) {\n var scriptu;\n var scripto = document.getElementById(\"results\" + callbackId);\n scriptu = document.createElement(\"script\");\n scriptu.setAttribute(\"type\", \"text/javascript\");\n scriptu.setAttribute(\"src\", url);\n scriptu.setAttribute(\"charset\", \"UTF-8\");\n scriptu.setAttribute(\"id\", \"results\" + callbackId);\n scriptu.setAttribute(\"async\", \"true\"); // FIXME async ?\n // head ou body ou autres ?\n var node = document.documentElement || document.getElementsByTagName(\"head\")[0];\n if (scripto === null) {\n node.appendChild(scriptu);\n } else {\n // s'il existe déjà, on le remplace !\n node.replaceChild(scriptu, scripto);\n }\n },\n /**\n * delete Script\n * @param {String} callbackId - callback Id\n * @private\n */\n _deleteScript: function _deleteScript(callbackId) {\n var script = document.getElementById(\"results\" + callbackId);\n if (script) {\n var node = script.parentNode || document.documentElement;\n if (!node) {\n return;\n }\n node.removeChild(script);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (JSONP);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvSlNPTlAuanM/ZjVlYyJdLCJuYW1lcyI6WyJKU09OUCIsInV1aWQiLCJpZCIsIk1hdGgiLCJmbG9vciIsIkRhdGUiLCJub3ciLCJjYWxsIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiZXJyb3IiLCJFcnJvciIsInVybCIsInRpbWVPdXQiLCJpbmZvIiwib25SZXNwb25zZSIsImNhbGxiYWNrSWQiLCJjYWxsYmFja1N1ZmZpeCIsInVybEhhc0NhbGxiYWNrS2V5IiwidXJsSGFzQ2FsbGJhY2tOYW1lIiwiaWR4IiwiaW5kZXhPZiIsImoiLCJsZW5ndGgiLCJjYWxsYmFja05hbWUiLCJzdWJzdHJpbmciLCJrIiwiSGFzQ2FsbGJhY2tOYW1lIiwicmVwbGFjZSIsIm9uVGltZU91dCIsImNvbnNvbGUiLCJsb2ciLCJzZWxmIiwib25UaW1lT3V0VHJpZ2dlciIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJfZGVsZXRlU2NyaXB0IiwiZGF0YSIsImNsZWFyVGltZW91dCIsIl9jcmVhdGVTY3JpcHQiLCJzY3JpcHR1Iiwic2NyaXB0byIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwibm9kZSIsImRvY3VtZW50RWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJyZXBsYWNlQ2hpbGQiLCJzY3JpcHQiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM4Qzs7QUFFOUM7QUFDQSxJQUFJQSxLQUFLLEdBQUc7RUFFUjtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxJQUFJLEVBQUksWUFBWTtJQUNoQixJQUFJQyxFQUFFLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxJQUFJLENB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SVYsUUFBUSxDQUFDSyxlQUFlO01BQ3hELElBQUksQ0FBQ0QsSUFBSSxFQUFFO1FBQ1A7TUFDSjtNQUNBQSxJQUFJLENBQUNPLFdBQVcsQ0FBQ0YsTUFBTSxDQUFDO0lBQzVCO0VBQ0o7QUFDSixDQUFDO0FBRWN0RCxvRUFBSyIsImZpbGUiOiIuL3NyYy9Qcm90b2NvbHMvSlNPTlAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEpTT05QIDogSW1wbMOpbWVudGF0aW9uIGR1IHByb3RvY29sZSBKU09OUCBkZSBsYSBwbGF0ZWZvcm1lIEfDqW9wb3J0YWlsXG4gKlxuICogQG1vZHVsZSBKU09OUFxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBHcC5Qcm90b2NvbHMuSlNPTlBcbiAqL1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc29ic3RlbC9qc29ucC5qc1xudmFyIEpTT05QID0ge1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGQndW4gaWRlbnRpZmlhbnQgc3RhdGlxdWUgYmFzw6kgc3VyIGxlIHRpbWVzdGFtcCxcbiAgICAgKiBldCBxdWkgcydpbmNyZW1lbnRlIGRlICsxIMOgIGNoYXF1ZSBhcHBlbFxuICAgICAqL1xuICAgIHV1aWQgOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWQgPSBNYXRoLmZsb29yKERhdGUubm93KCkpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkKys7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIENldHRlIGZvbmN0aW9uIHLDqWFsaXNlIGwnYXBwZWwgZHUgc2VydmljZSBmb3VybmkgdmlhIGxlIHBhcmFtw6h0cmUgXCJvcHRpb25zLnVybFwiXG4gICAgICogZW4gbWV0dGFudCBlbiDFk3V2cmUgbGUgcHJvdG9jb2xlIEpTT05QLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBjYWxsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gcGFyYW1ldHJlcyBkJ2ludm9jYXRpb24gZHUgc2VydmljZSBlbiBKU09OUFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnVybCAtIFVSTCBkdSBzZXJ2aWNlIMOgIGludm9xdWVyIChpbmTDqXBlbmRhbW1lbnQgZHUgcHJvdG9jb2xlIEpTT05QKS5cbiAgICAgKiAgQ2V0dGUgVVJMIGNvbnRpZW50IGTDqWrDoCBsZXMgcGFyYW3DqHRyZXMgZHUgc2VydmljZS5cbiAgICAgKiAgU2kgbGUgcGFyYW3DqHRyZSBkw6lkacOpIMOgIGxhIG1pc2UgZW4gb2V1dnJlIGR1IHByb3RvY29sZSBKU09OUCAoY2FsbGJhY2s9eHh4KSBuJ2VzdCBwYXMgcHLDqXNlbnQsIGlsIGVzdCByYWpvdXTDqSBwYXIgbGEgZm9uY3Rpb24gO1xuICAgICAqICBzYSB2YWxldXIgZXN0IGTDqXRlcm1pbsOpZSBlbiBmb25jdGlvbiBkdSBwYXJhbcOodHJlIGNhbGxiYWNrTmFtZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dCA9IDBdIC0gTm9tYnJlIGRlIG1zIGF1IGJvdXQgZHVxdWVsIG9uIGNvbnNpZMOocmUgcXVlIGxlIHNlcnZpY2UgbidhIHBhcyByw6lwb25kdS5cbiAgICAgKiAgVW5lIHZhbGV1ciBkZSAwIHBvdXIgY2UgcGFyYW3DqHRyZSBwZXJtZXQgZGUgZMOpc2FjdGl2ZXIgbGEgZ2VzdGlvbiBkdSB0aW1lT3V0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCA9IG51bGxdIC0gU3VmZml4ZSBkZSBsYSBmb25jdGlvbiBkZSBjYWxsYmFjayDDoCByYWpvdXRlciBzdXIgbCdVUkwuXG4gICAgICogIFNpIGF1Y3VuIHN1ZmZpeGUgbidlc3Qgc3DDqWNpZmnDqSAoY2FzIHBhciBkw6lmYXV0KSwgb24gdXRpbGlzZXJhIGwnaWRlbnRpZmlhbnQgdGhpcy51dWlkICgpIGNvbW1lIHN1ZmZpeGUuIEV4OiBcImNhbGxiYWNrMTQ1ODU3NDM5NjU4MiAoKVwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNhbGxiYWNrTmFtZSA9IGdwLnByb3RvY29sLmpzb25wXSAtIFZhbGV1ciBkdSBwYXJhbcOodHJlIGNhbGxiYWNrIMOgIHJham91dGVyIHN1ciBsJ1VSTC5cbiAgICAgKiAgU2kgbCdVUkwgZm91cm5pZSBjb250aWVudCBkw6lqw6AgbGUgcGFyYW3DqHRyZSBjYWxsYmFjaywgbGUgcGFyYW3DqHRyZSBjYWxsYmFja05hbWUgbmUgc2VyYSBwYXMgcHJpcyBlbiBjb21wdGUuXG4gICAgICogIExhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIGVzdCBjcsOpw6llIGR5bmFtaXF1ZW1lbnQgcGFyIGxhIGZvbmN0aW9uIEpTT05QIDtcbiAgICAgKiAgZWxsZSBhIGRldXggZm9uY3Rpb25zIDpcbiAgICAgKiAgICBlbGxlIGFubnVsZSBsYSBjb25kaXRpb24gZGUgdGltZU91dFxuICAgICAqICAgIHB1aXMgYXBwZWxsZSBsYSBmb25jdGlvbiBmb3VybmllIHBhciBsJ3V0aWxpc2F0ZXVyIHZpYSBsZSBwYXJhbcOodHJlIG9uUmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblJlc3BvbnNlIC0gTm9tIGRlIGxhIGZvbmN0aW9uIHF1aSBzZXJhIGFwcGVsw6llIGxvcnMgZGUgbGEgcsOpY2VwdGlvbiBkZXMgcsOpc3VsdGF0cyBkdSBzZXJ2aWNlLlxuICAgICAqICBDZSBwYXJhbcOodHJlIHNlcmEgaWdub3LDqSBzaSBsJ1VSTCBjb250aWVudCBkw6lqw6AgbGUgcGFyYW3DqHRyZSBjYWxsYmFjay5cbiAgICAgKiAgTGEgZm9uY3Rpb24gZGUgcmFwcGVsIGFwcGVsw6llIHNlcmEgYWxvcnMgY2VsbGUgYXlhbnQgcG91ciBub20gbGEgdmFsZXVyIGRlIGNlIHBhcmFtw6h0cmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25UaW1lT3V0XSAtIE5vbSBkZSBsYSBmb25jdGlvbiBxdWkgc2VyYSBhcHBlbMOpZSBlbiBjYXMgZGUgbm9uIHLDqXBvbnNlIGR1IHNlcnZpY2UuXG4gICAgICogIExlIHRlbXBzIGF1IGJvdXQgZHVxdWVsIG9uIGNvbnNpZMOocmUgcXVlIGxlIHNlcnZpY2UgbidhIHBhcyByw6lwb25kdSBlc3QgZMOpdGVybWluw6kgcGFyIGxlIHBhcmFtw6h0cmUgdGltZU91dC5cbiAgICAgKiAgQGV4YW1wbGVcbiAgICAgKiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICB1cmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zb21lL3Rlc3QuanNvbiZjYWxsYmFjaz1teVJlc3VsdHMnLFxuICAgICAqICAgICAgdGltZU91dCA6IDEwMCxcbiAgICAgKiAgICAgIGNhbGxiYWNrTmFtZSA6ICdteVJlc3VsdHMnLFxuICAgICAqICAgICAgY2FsbGJhY2tTdWZmaXggOiBcIlwiLFxuICAgICAqICAgICAgb25SZXNwb25zZSA6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXN1bHRzIDogJywgcmVzcG9uc2UpO1xuICAgICAqICAgICAgfSxcbiAgICAgKlxuICAgICAqICAgfTtcbiAgICAgKiAgIEpTT05QLmNhbGwob3B0aW9ucyk7XG4gICAgICovXG4gICAgY2FsbCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkpTT05QXCIpO1xuICAgICAgICBsb2dnZXIudHJhY2UoXCJbSlNPTlA6OmNhbGwgKCldXCIpO1xuXG4gICAgICAgIC8vIGFuYWx5c2UgcGFyYW1ldHJlc1xuXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwibWlzc2luZyBwYXJhbWV0ZXIgOiBvcHRpb25zICFcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IG9wdGlvbnMgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy51cmwgIVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy51cmwgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy50aW1lT3V0KSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgJ29wdGlvbnMudGltZU91dCcgZGVmYXVsdCB2YWx1ZVwiKTtcbiAgICAgICAgICAgIG9wdGlvbnMudGltZU91dCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRSBzaSB1biBjYWxsYmFjayBjb3TDqSBjbGllbnQgYSDDqXTDqSBtaXMgZW4gcGxhY2UsXG4gICAgICAgIC8vIGNldHRlIGNvbmRpdGlvbiBzdXIgY2V0dGUgbWV0aG9kZSBuJ2EgcGFzIGRlIHNlbnMgIT9cbiAgICAgICAgaWYgKCFvcHRpb25zLm9uUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogb3B0aW9ucy5vblJlc3BvbnNlICFcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IG9wdGlvbnMub25SZXNwb25zZSAhXCIpO1xuICAgICAgICAgICAgLy8gRklYTUUgZG9pdCBvbiBkZWZpbmlyIHVuIGNhbGxiYWNrIGludGVybmUgcGFyIGRlZmF1dCAhP1xuICAgICAgICAgICAgLy8gb3B0aW9ucy5vblJlc3BvbnNlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIC8vICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2UgY2FsbGJhY2sgKGlubmVyKSA6IFwiLCBkYXRhKTtcbiAgICAgICAgICAgIC8vIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJRCBkdSBjYWxsYmFjayDDoCB1dGlsaXNlciA6IG51bGwgb3Ugc3RyaW5nLlxuICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGEgc3DDqWNpZmnDqSB1biBzdWZmaXhlIHBvdXIgbGUgY2FsbGJhY2ssIG9uIGxlIHLDqWN1cMOocmUgY29tbWUgdW4gSUQgKGV4OiBvcHRpb25zLmNhbGxiYWNrU3VmZml4ID0gXCJcIilcbiAgICAgICAgLy8gc2lub24sIG9uIHV0aWxpc2UgdW4gdGltZXN0YW1wIDogdGhpcy51dWlkICgpXG4gICAgICAgIHZhciBjYWxsYmFja0lkID0gKHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrU3VmZml4ID09PSBcInN0cmluZ1wiKSA/IG9wdGlvbnMuY2FsbGJhY2tTdWZmaXggOiB0aGlzLnV1aWQoKTtcblxuICAgICAgICAvLyBvbiByZWNoZXJjaGUgbGUgcGFyYW1ldHJlIGNhbGxiYWNrIGV0IHNvbiBub20gZGUgZm9uY3Rpb24gZGFucyBsJ3VybFxuICAgICAgICB2YXIgdXJsSGFzQ2FsbGJhY2tLZXkgPSBmYWxzZTtcbiAgICAgICAgdmFyIHVybEhhc0NhbGxiYWNrTmFtZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBpZHggPSBvcHRpb25zLnVybC5pbmRleE9mKFwiY2FsbGJhY2s9XCIpO1xuXG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgICB1cmxIYXNDYWxsYmFja0tleSA9IHRydWU7XG4gICAgICAgICAgICAvLyBleHRyYWN0aW9uIGNhbGxiYWNrTmFtZSBkZSBsJ3VybCA6IGVudHJlIFwiY2FsbGJhY2s9XCIgZXQgXCImXCIgb3UgZmluIGRlIGxpZ25lXG4gICAgICAgICAgICB2YXIgaiA9IG9wdGlvbnMudXJsLmluZGV4T2YoXCImXCIsIGlkeCk7XG4gICAgICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBqID0gb3B0aW9ucy51cmwubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbiBlY3Jhc2UgbGUgcGFyYW1ldHJlIG9wdGlvbnMuY2FsbGJhY2tOYW1lIHMnaWwgYXZhaXQgw6l0w6kgZMOpZmluaVxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrTmFtZSA9IG9wdGlvbnMudXJsLnN1YnN0cmluZyhpZHggKyA5LCBqKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIHVybEhhc0NhbGxiYWNrTmFtZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja05hbWUgPSBjYWxsYmFja05hbWU7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJzZXR0aW5nICdvcHRpb25zLmNhbGxiYWNrTmFtZScgdmFsdWUgKFwiICsgb3B0aW9ucy5jYWxsYmFja05hbWUgKyBcIikgZnJvbSAnb3B0aW9ucy51cmwnIHBhcmFtZXRlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIGFqb3V0ZSBsZSBwYXJhbWV0cmUgY2FsbGJhY2sgZGFucyBsJ1VSTCBzJ2lsIG4nZXhpc3RlIHBhc1xuICAgICAgICBpZiAoIXVybEhhc0NhbGxiYWNrS2V5KSB7XG4gICAgICAgICAgICAvLyBnZXN0aW9uIGRlcyBhdXRyZXMgcGFyYW0uIGV0IFwiP1wiXG4gICAgICAgICAgICB2YXIgayA9IG9wdGlvbnMudXJsLmluZGV4T2YoXCI/XCIpO1xuICAgICAgICAgICAgaWYgKGsgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gYXVjdW4gcGFyYW0uLCBuaSBkZSAnPydcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgXCI/XCIgKyBcImNhbGxiYWNrPVwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrID09PSBvcHRpb25zLnVybC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyB1bmlxdWVtZW50IGxlICc/J1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBcImNhbGxiYWNrPVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBsZSAnPycgZXQgbGVzIHBhcmFtLiBleGlzdGVudFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBcIiZcIiArIFwiY2FsbGJhY2s9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgY2FsbGJhY2sgZGVmYXVsdCBrZXkgaW4gJ29wdGlvbnMudXJsJyA6IFwiICsgb3B0aW9ucy51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXRpbGlzYXRpb24gZGUgbGEgZm9uY3Rpb24gY2FsbGJhY2sgY290w6kgY2xpZW50ID9cbiAgICAgICAgdmFyIEhhc0NhbGxiYWNrTmFtZSA9IG9wdGlvbnMuY2FsbGJhY2tOYW1lID8gdHJ1ZSA6IHVybEhhc0NhbGxiYWNrTmFtZTtcblxuICAgICAgICAvLyBvbiBham91dGUgbGUgbm9tIGRlIGxhIGZvbmN0aW9uIGNhbGxiYWNrIGRhbnMgbCdVUkwgc2kgZWxsZSBuJ2V4aXN0ZSBwYXNcbiAgICAgICAgaWYgKCF1cmxIYXNDYWxsYmFja05hbWUpIHtcbiAgICAgICAgICAgIC8vIGZvbmN0aW9uIGNhbGxiYWNrIHBhciBkZWZhdXRcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYWxsYmFja05hbWUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgJ29wdGlvbnMuY2FsbGJhY2tOYW1lJyBkZWZhdWx0IHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tOYW1lID0gXCJjYWxsYmFja1wiOyAvLyBvdSBcImdwLnByb3RvY29sLmpzb25wXCIgP1xuICAgICAgICAgICAgICAgIC8vIGluZm8gOiBzaSBvbiBuZSB2ZXV0IHBhcyBnZXJlciBkJ0lEIGRhbnMgbGUgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCA9IFwiXCJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tJZCB8fCBjYWxsYmFja0lkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tOYW1lICs9IGNhbGxiYWNrSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybC5yZXBsYWNlKFwiY2FsbGJhY2s9XCIsIFwiY2FsbGJhY2s9XCIgKyBvcHRpb25zLmNhbGxiYWNrTmFtZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcInNldHRpbmcgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBpbiAnb3B0aW9ucy51cmwnIDogXCIgKyBvcHRpb25zLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aW1lT3V0IHBhciBkZWZhdXRcbiAgICAgICAgaWYgKCFvcHRpb25zLm9uVGltZU91dCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJzZXR0aW5nICdvcHRpb25zLm9uVGltZU91dCcgZGVmYXVsdCB2YWx1ZVwiKTtcbiAgICAgICAgICAgIC8qKiBjYWxsYmFjayB0aW1lb3V0IHBhciBkZWZhdXQgKi9cbiAgICAgICAgICAgIG9wdGlvbnMub25UaW1lT3V0ID0gZnVuY3Rpb24gKC8qIGVycm9yICovKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaW1lT3V0IHdoaWxlIGludm9raW5nIHVybCA6IFwiICsgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghSGFzQ2FsbGJhY2tOYW1lKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIGV2ZW50IGR1IHRpbWVvdXRcbiAgICAgICAgICAgIHZhciBvblRpbWVPdXRUcmlnZ2VyID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gZGVjbGVuY2hlIGxlIHRpbWVvdXQgc2kgPiDDoCAwICFcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVPdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgb25UaW1lT3V0VHJpZ2dlciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogZm9uY3Rpb24gZGUgcmVwb25zZSBkdSBzZXJ2aWNlICovXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbb3B0aW9ucy5jYWxsYmFja05hbWVdID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVGltZU91dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlU2NyaXB0KGNhbGxiYWNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVPdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGSVhNRSBsZSBub20gZGUgbGEgZm9uY3Rpb24gbidhY2NlcHRlIHBhcyBkZSBuYW1lc3BhY2UgIVxuICAgICAgICAgICAgLy8gZXguIEdwLkZ1bmN0aW9uLmNhbGxiYWNrXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICogZm9uY3Rpb24gZGUgcmVwb25zZSBkdSBzZXJ2aWNlXG4gICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gZGF0YVxuICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHdpbmRvd1tvcHRpb25zLmNhbGxiYWNrTmFtZV0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQob25UaW1lT3V0VHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlc3BvbnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2RlbGV0ZVNjcmlwdChjYWxsYmFja0lkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jcmVhdGVTY3JpcHQoY2FsbGJhY2tJZCwgb3B0aW9ucy51cmwpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAqIGNyZWF0ZSBTY3JpcHRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYWxsYmFja0lkIC0gY2FsbGJhY2sgSWRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB1cmxcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfY3JlYXRlU2NyaXB0IDogZnVuY3Rpb24gKGNhbGxiYWNrSWQsIHVybCkge1xuICAgICAgICB2YXIgc2NyaXB0dTtcbiAgICAgICAgdmFyIHNjcmlwdG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3VsdHNcIiArIGNhbGxiYWNrSWQpO1xuXG4gICAgICAgIHNjcmlwdHUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzY3JpcHR1LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJ0ZXh0L2phdmFzY3JpcHRcIik7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHVybCk7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwiY2hhcnNldFwiLCBcIlVURi04XCIpO1xuICAgICAgICBzY3JpcHR1LnNldEF0dHJpYnV0ZShcImlkXCIsIFwicmVzdWx0c1wiICsgY2FsbGJhY2tJZCk7XG4gICAgICAgIHNjcmlwdHUuc2V0QXR0cmlidXRlKFwiYXN5bmNcIiwgXCJ0cnVlXCIpOyAvLyBGSVhNRSBhc3luYyA/XG4gICAgICAgIC8vIGhlYWQgb3UgYm9keSBvdSBhdXRyZXMgP1xuICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG4gICAgICAgIGlmIChzY3JpcHRvID09PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNjcmlwdHUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcydpbCBleGlzdGUgZMOpasOgLCBvbiBsZSByZW1wbGFjZSAhXG4gICAgICAgICAgICBub2RlLnJlcGxhY2VDaGlsZChzY3JpcHR1LCBzY3JpcHRvKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAqIGRlbGV0ZSBTY3JpcHRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYWxsYmFja0lkIC0gY2FsbGJhY2sgSWRcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfZGVsZXRlU2NyaXB0IDogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzdWx0c1wiICsgY2FsbGJhY2tJZCk7XG4gICAgICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gc2NyaXB0LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlNPTlA7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Protocols/JSONP.js\n"); + +/***/ }), + +/***/ "./src/Protocols/Protocol.js": +/*!***********************************!*\ + !*** ./src/Protocols/Protocol.js ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _XHR__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./XHR */ \"./src/Protocols/XHR.js\");\n/* harmony import */ var _JSONP__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./JSONP */ \"./src/Protocols/JSONP.js\");\n/**\n * Interface de dialogue avec les webservices\n *\n * @module Protocols\n * @private\n * @alias Gp.Protocols\n */\n\n\n\nvar Protocol = {\n /**\n * Interface unique d\"envoi d\"une requête.\n *\n * @method send\n * @static\n * @param {Object} options - options generales\n * @param {String} options.url - url du service\n * @param {String} options.method - GET, POST, PUT, DELETE\n * @param {String} options.protocol - XHR | JSONP\n * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)...\n * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP)\n * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix=\"\", la fonction s'appellera \"callback\")\n * @param {String} options.timeOut - 0 ms\n * @param {Boolean} options.nocache - true|false\n * @param {Object|String} options.data - content (post) ou param (get)\n * @param {Object|String} options.headers - (post) ex. referer\n * @param {Object|String} options.content - (post) ex. \"application/json\"\n * @param {String} options.scope - this (TODO)\n * @param {Function} options.onResponse - callback\n * @param {Function} options.onFailure - callback\n * @param {Function} options.onTimeOut - callback\n * @param {String} options.proxyUrl - (TODO)\n */\n send: function send(options) {\n // INFO\n // \"output\" - param est interne à la classe \"Protocol\" (parametrable via \"wrap\"), et à ajouter à l\"url\n // ce param est independant du service car il est géré par le filtre LUA :\n // ex. json|xml (json par defaut).\n // Ce param. permet d\"encapsuler du XML dans du JSON :\n // {http : {status:200, error:null},xml :\"réponse du service\"}\n // Utile pour les services qui ne repondent que du XML (ex. Geocodage)\n //\n // |-------------------------------------------------|\n // | \\service | | | |\n // | output\\ format| json | xml | remarques |\n // |--------\\------|------|-----|--------------------|\n // | json | json | json| json/xml encapsulé |\n // | xml | json | xml | param inactif |\n // |-------------------------------------------------|\n // ex. le service demande une reponse native au \"format\" json et avec un \"output\" json.\n // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas !\n // dans ce cas on ne renseigne pas output=json\n\n // INFO\n // \"wrap\" - choix d\"encapsuler ou non les reponses dans du JSON.\n // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) !\n\n // INFO\n // \"callback\" - param est interne à la classe \"Protocol\" (non parametrable), et à ajouter à l\"url\n // ce param est independant du service car il est géré aussi par le filtre LUA :\n // ex. callback|null\n // Ce param. permet de renvoyer une reponse javascript :\n // callback ({http : {status:200, error:null},xml :\"réponse du service\"})\n // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le\n // le protocol JSONP, et ce dernier implemente déjà le callback !\n\n // settings par defaut\n var settings = options || {\n method: \"GET\",\n // protocol : \"JSONP\",\n protocol: \"XHR\",\n timeOut: 0,\n format: null,\n wrap: true,\n nocache: true,\n output: \"json\",\n callback: null,\n callbackSuffix: null\n };\n\n // on determine l'environnement d'execution : browser ou non ?\n // et on stoppe pour nodeJS... sur un protocole JSONP !\n if (typeof window === \"undefined\" && options.protocol === \"JSONP\") {\n console.log(\"Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS\");\n return;\n }\n if (options.protocol === \"XHR\" || options.format === \"json\") {\n settings.wrap = false;\n } else if (options.protocol === \"JSONP\" && options.format === \"xml\") {\n settings.wrap = true;\n }\n settings.callback = null; // FIXME non géré !?\n settings.output = settings.wrap ? \"json\" : null;\n\n // on encapsule les reponses dans un objet JSON\n if (settings.wrap) {\n var params = {};\n params.output = settings.output;\n params.callback = settings.callback;\n delete params.callback; // FIXME non géré !?\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(options.url, params);\n }\n\n // choix de l\"implementation :\n // XHR ou JSONP\n switch (settings.protocol) {\n case \"XHR\":\n // on normalise l'url (gestion du cache)\n if (options.method === \"GET\" && options.nocache) {\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(settings.url, {\n t: new Date().getTime()\n });\n }\n // appel du service en XHR\n _XHR__WEBPACK_IMPORTED_MODULE_1__[\"default\"].call(settings);\n break;\n case \"JSONP\":\n // on normalise l'url si les params. sont renseignés dans la string|object \"data\"\n if (settings.data) {\n settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].normalyzeUrl(settings.url, settings.data);\n }\n\n // appel du service en JSONP\n _JSONP__WEBPACK_IMPORTED_MODULE_2__[\"default\"].call(settings);\n break;\n default:\n throw new Error(\"protocol not supported (XHR|JSONP) !\");\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Protocol);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvUHJvdG9jb2wuanM/YTE4MyJdLCJuYW1lcyI6WyJQcm90b2NvbCIsInNlbmQiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJtZXRob2QiLCJwcm90b2NvbCIsInRpbWVPdXQiLCJmb3JtYXQiLCJ3cmFwIiwibm9jYWNoZSIsIm91dHB1dCIsImNhbGxiYWNrIiwiY2FsbGJhY2tTdWZmaXgiLCJ3aW5kb3ciLCJjb25zb2xlIiwibG9nIiwicGFyYW1zIiwidXJsIiwiSGVscGVyIiwibm9ybWFseXplVXJsIiwidCIsIkRhdGUiLCJnZXRUaW1lIiwiWEhSIiwiY2FsbCIsImRhdGEiLCJKU09OUCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ2I7QUFDSTtBQUU1QixJQUFJQSxRQUFRLEdBQUc7RUFFWDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLElBQUksRUFBRyxTQUFBQSxLQUFVQyxPQUFPLEVBQUU7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztJQUVBO0lBQ0E7SUFDQTs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztJQUVBO0lBQ0EsSUFBSUMsUUFBUSxHQUFHRCxPQUFPLElBQUk7TUFDdEJFLE1BQU0sRUFBRyxLQUFLO01BQ2Q7TUFDQUMsUUFBUSxFQUFHLEtBQUs7TUFDaEJDLE9BQU8sRUFBRyxDQUFDO01BQ1hDLE1BQU0sRUFBRyxJQUFJO01BQ2JDLElBQUksRUFBRyxJQUFJO01BQ1hDLE9BQU8sRUFBRyxJQUFJO01BQ2RDLE1BQU0sRUFBRyxNQUFNO01BQ2ZDLFFBQVEsRUFBRyxJQUFJO01BQ2ZDLGNBQWMsRUFBRztJQUNyQixDQUFDOztJQUVEO0lBQ0E7SUFDQSxJQUFJLE9BQU9DLE1BQU0sS0FBSyxXQUFXLElBQUlYLE9BQU8sQ0FBQ0csUUFBUSxLQUFLLE9BQU8sRUFBRTtNQUMvRFMsT0FBTyxDQUFDQyxHQUFHLENBQUMsd0ZBQXdGLENBQUM7TUFDckc7SUFDSjtJQUVBLElBQUliLE9BQU8sQ0FBQ0csUUFBUSxLQUFLLEtBQUssSUFBSUgsT0FBTyxDQUFDSyxNQUFNLEtBQUssTUFBTSxFQUFFO01BQ3pESixRQUFRLENBQUNLLElBQUksR0FBRyxLQUFLO0lBQ3pCLENBQUMsTUFBTSxJQUFJTixPQUFPLENBQUNHLFFBQVEsS0FBSyxPQUFPLElBQUlILE9BQU8sQ0FBQ0ssTUFBTSxLQUFLLEtBQUssRUFBRTtNQUNqRUosUUFBUSxDQUFDSyxJQUFJLEdBQUcsSUFBSTtJQUN4QjtJQUVBTCxRQUFRLENBQUNRLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxQlIsUUFBUSxDQUFDTyxNQUFNLEdBQUdQLFFBQVEsQ0FBQ0ssSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJOztJQUUvQztJQUNBLElBQUlMLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO01BQ2YsSUFBSVEsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUNmQSxNQUFNLENBQUNOLE1BQU0sR0FBR1AsUUFBUSxDQUFDTyxNQUFNO01BQy9CTSxNQUFNLENBQUNMLFFBQVEsR0FBR1IsUUFBUSxDQUFDUSxRQUFRO01BQ25DLE9BQU9LLE1BQU0sQ0FBQ0wsUUFBUSxDQUFDLENBQUM7TUFDeEJSLFFBQVEsQ0FBQ2MsR0FBRyxHQUFHQyxxREFBTSxDQUFDQyxZQUFZLENBQUNqQixPQUFPLENBQUNlLEdBQUcsRUFBRUQsTUFBTSxDQUFDO0lBQzNEOztJQUVBO0lBQ0E7SUFDQSxRQUFRYixRQUFRLENBQUNFLFFBQVE7TUFDckIsS0FBSyxLQUFLO1FBQ047UUFDQSxJQUFJSCxPQUFPLENBQUNFLE1BQU0sS0FBSyxLQUFLLElBQUlGLE9BQU8sQ0FBQ08sT0FBTyxFQUFFO1VBQzdDTixRQUFRLENBQUNjLEdBQUcsR0FBR0MscURBQU0sQ0FBQ0MsWUFBWSxDQUFDaEIsUUFBUSxDQUFDYyxHQUFHLEVBQUU7WUFDN0NHLENBQUMsRUFBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUM7VUFDM0IsQ0FBQyxDQUFDO1FBQ047UUFDQTtRQUNBQyw0Q0FBRyxDQUFDQyxJQUFJLENBQUNyQixRQUFRLENBQUM7UUFDbEI7TUFDSixLQUFLLE9BQU87UUFFUjtRQUNBLElBQUlBLFFBQVEsQ0FBQ3NCLElBQUksRUFBRTtVQUNmdEIsUUFBUSxDQUFDYyxHQUFHLEdBQUdDLHFEQUFNLENBQUNDLFlBQVksQ0FBQ2hCLFFBQVEsQ0FBQ2MsR0FBRyxFQUFFZCxRQUFRLENBQUNzQixJQUFJLENBQUM7UUFDbkU7O1FBRUE7UUFDQUMsOENBQUssQ0FBQ0YsSUFBSSxDQUFDckIsUUFBUSxDQUFDO1FBQ3BCO01BQ0o7UUFDSSxNQUFNLElBQUl3QixLQUFLLENBQUMsc0NBQXNDLENBQUM7SUFDL0Q7RUFDSjtBQUVKLENBQUM7QUFFYzNCLHVFQUFRIiwiZmlsZSI6Ii4vc3JjL1Byb3RvY29scy9Qcm90b2NvbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJmYWNlIGRlIGRpYWxvZ3VlIGF2ZWMgbGVzIHdlYnNlcnZpY2VzXG4gKlxuICogQG1vZHVsZSBQcm90b2NvbHNcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgR3AuUHJvdG9jb2xzXG4gKi9cbmltcG9ydCBIZWxwZXIgZnJvbSBcIi4uL1V0aWxzL0hlbHBlclwiO1xuaW1wb3J0IFhIUiBmcm9tIFwiLi9YSFJcIjtcbmltcG9ydCBKU09OUCBmcm9tIFwiLi9KU09OUFwiO1xuXG52YXIgUHJvdG9jb2wgPSB7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmZhY2UgdW5pcXVlIGRcImVudm9pIGRcInVuZSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2VuZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZ2VuZXJhbGVzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXJsICAgICAgLSB1cmwgZHUgc2VydmljZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm1ldGhvZCAgIC0gR0VULCBQT1NULCBQVVQsIERFTEVURVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnByb3RvY29sIC0gWEhSIHwgSlNPTlBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5mb3JtYXQgICAtIGZvcm1hdCBkZSBsYSByZXBvbnNlIGR1IHNlcnZpY2UgOiBqc29uLCB4bWwgb3UgbnVsbCAoYnJ1dGUpLi4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMud3JhcCAgICAgLSBlbmNhcHN1bGVyIGxhIHJlcG9uc2UgZHUgc2VydmljZSBkYW5zIGR1IEpTT04gOiB0cnVlfGZhbHNlICh0cnVlIHBhciBkZWZhdXQgc3VyIGxlIHByb3RvY29sZSBKU09OUClcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5jYWxsYmFja1N1ZmZpeCAtIHN1ZmZpeGUgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgKEpTT05QIHVuaXF1ZW1lbnQpIChleDogc2kgY2FsbGJhY2tTdWZmaXg9XCJcIiwgbGEgZm9uY3Rpb24gcydhcHBlbGxlcmEgXCJjYWxsYmFja1wiKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRpbWVPdXQgIC0gMCBtc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5ub2NhY2hlICAtIHRydWV8ZmFsc2VcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnMuZGF0YSAgICAgICAgLSBjb250ZW50IChwb3N0KSBvdSBwYXJhbSAoZ2V0KVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9ucy5oZWFkZXJzICAgICAtIChwb3N0KSBleC4gcmVmZXJlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9ucy5jb250ZW50IC0gKHBvc3QpIGV4LiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnNjb3BlICAgICAgIC0gdGhpcyAoVE9ETylcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uUmVzcG9uc2UgLSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMub25GYWlsdXJlIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uVGltZU91dCAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucHJveHlVcmwgLSAgKFRPRE8pXG4gICAgICovXG4gICAgc2VuZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gXCJvdXRwdXRcIiAtIHBhcmFtIGVzdCBpbnRlcm5lIMOgIGxhIGNsYXNzZSBcIlByb3RvY29sXCIgKHBhcmFtZXRyYWJsZSB2aWEgXCJ3cmFwXCIpLCBldCDDoCBham91dGVyIMOgIGxcInVybFxuICAgICAgICAvLyAgICAgIGNlIHBhcmFtIGVzdCBpbmRlcGVuZGFudCBkdSBzZXJ2aWNlIGNhciBpbCBlc3QgZ8OpcsOpIHBhciBsZSBmaWx0cmUgTFVBIDpcbiAgICAgICAgLy8gICAgICAgICAgZXguIGpzb258eG1sIChqc29uIHBhciBkZWZhdXQpLlxuICAgICAgICAvLyAgICAgICAgICBDZSBwYXJhbS4gcGVybWV0IGRcImVuY2Fwc3VsZXIgZHUgWE1MIGRhbnMgZHUgSlNPTiA6XG4gICAgICAgIC8vICAgICAgICAgICAgICB7aHR0cCA6IHtzdGF0dXM6MjAwLCBlcnJvcjpudWxsfSx4bWwgOlwicsOpcG9uc2UgZHUgc2VydmljZVwifVxuICAgICAgICAvLyAgICAgICAgICBVdGlsZSBwb3VyIGxlcyBzZXJ2aWNlcyBxdWkgbmUgcmVwb25kZW50IHF1ZSBkdSBYTUwgKGV4LiBHZW9jb2RhZ2UpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAvLyB8ICAgICAgXFxzZXJ2aWNlIHwgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgIC8vIHwgb3V0cHV0XFwgZm9ybWF0fCBqc29uIHwgeG1sIHwgICAgIHJlbWFycXVlcyAgICAgIHxcbiAgICAgICAgLy8gfC0tLS0tLS0tXFwtLS0tLS18LS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAvLyB8ICAgIGpzb24gICAgICAgfCBqc29uIHwganNvbnwganNvbi94bWwgZW5jYXBzdWzDqSB8XG4gICAgICAgIC8vIHwgICAgeG1sICAgICAgICB8IGpzb24gfCB4bWwgfCBwYXJhbSBpbmFjdGlmICAgICAgfFxuICAgICAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgLy8gZXguIGxlIHNlcnZpY2UgZGVtYW5kZSB1bmUgcmVwb25zZSBuYXRpdmUgYXUgXCJmb3JtYXRcIiBqc29uIGV0IGF2ZWMgdW4gXCJvdXRwdXRcIiBqc29uLlxuICAgICAgICAvLyBvbiBhIGRvbmMgdW5lIHJlcG9uc2UganNvbiBlbmNhcHN1bMOpIGRhbnMgdW4ganNvbiA6IGNlIHF1J29uIG5lIHNvdWhhaXRlIHBhcyAhXG4gICAgICAgIC8vIGRhbnMgY2UgY2FzIG9uIG5lIHJlbnNlaWduZSBwYXMgb3V0cHV0PWpzb25cblxuICAgICAgICAvLyBJTkZPXG4gICAgICAgIC8vIFwid3JhcFwiIC0gY2hvaXggZFwiZW5jYXBzdWxlciBvdSBub24gbGVzIHJlcG9uc2VzIGRhbnMgZHUgSlNPTi5cbiAgICAgICAgLy8gICAgICBQYXIgZGVmYXV0LCBvbiBlbmNhcHN1bGUgdW5pcXVlbWVudCBsZXMgcmVwb25zZXMgc3VyIGxlIHByb3RvY29sZSBKU09OUCAoZXQgcXVpIHNvbnQgZW4geG1sKSAhXG5cbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyBcImNhbGxiYWNrXCIgLSBwYXJhbSBlc3QgaW50ZXJuZSDDoCBsYSBjbGFzc2UgXCJQcm90b2NvbFwiIChub24gcGFyYW1ldHJhYmxlKSwgZXQgw6AgYWpvdXRlciDDoCBsXCJ1cmxcbiAgICAgICAgLy8gICAgICBjZSBwYXJhbSBlc3QgaW5kZXBlbmRhbnQgZHUgc2VydmljZSBjYXIgaWwgZXN0IGfDqXLDqSBhdXNzaSBwYXIgbGUgZmlsdHJlIExVQSA6XG4gICAgICAgIC8vICAgICAgICAgIGV4LiBjYWxsYmFja3xudWxsXG4gICAgICAgIC8vICAgICAgICAgIENlIHBhcmFtLiBwZXJtZXQgZGUgcmVudm95ZXIgdW5lIHJlcG9uc2UgamF2YXNjcmlwdCA6XG4gICAgICAgIC8vICAgICAgICAgICAgICBjYWxsYmFjayAoe2h0dHAgOiB7c3RhdHVzOjIwMCwgZXJyb3I6bnVsbH0seG1sIDpcInLDqXBvbnNlIGR1IHNlcnZpY2VcIn0pXG4gICAgICAgIC8vICAgICAgICAgIENlIHBhcmFtLiBlc3Qgbm9uIHJlbnNlaWduw6kgcGFyIGRlZmF1dCBjYXIgcG91ciBkdSBKU09OUCwgb24gdXRpbGlzZSBsZVxuICAgICAgICAvLyAgICAgICAgICBsZSBwcm90b2NvbCBKU09OUCwgZXQgY2UgZGVybmllciBpbXBsZW1lbnRlIGTDqWrDoCBsZSBjYWxsYmFjayAhXG5cbiAgICAgICAgLy8gc2V0dGluZ3MgcGFyIGRlZmF1dFxuICAgICAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHtcbiAgICAgICAgICAgIG1ldGhvZCA6IFwiR0VUXCIsXG4gICAgICAgICAgICAvLyBwcm90b2NvbCA6IFwiSlNPTlBcIixcbiAgICAgICAgICAgIHByb3RvY29sIDogXCJYSFJcIixcbiAgICAgICAgICAgIHRpbWVPdXQgOiAwLFxuICAgICAgICAgICAgZm9ybWF0IDogbnVsbCxcbiAgICAgICAgICAgIHdyYXAgOiB0cnVlLFxuICAgICAgICAgICAgbm9jYWNoZSA6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXQgOiBcImpzb25cIixcbiAgICAgICAgICAgIGNhbGxiYWNrIDogbnVsbCxcbiAgICAgICAgICAgIGNhbGxiYWNrU3VmZml4IDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG9uIGRldGVybWluZSBsJ2Vudmlyb25uZW1lbnQgZCdleGVjdXRpb24gOiBicm93c2VyIG91IG5vbiA/XG4gICAgICAgIC8vIGV0IG9uIHN0b3BwZSBwb3VyIG5vZGVKUy4uLiBzdXIgdW4gcHJvdG9jb2xlIEpTT05QICFcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgJiYgb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZhbHVlIChzKSBmb3IgcGFyYW1ldGVyIChzKSAncHJvdG9jb2w9SlNPTlAgKGluc3RlYWQgdXNlIFhIUiknIG5vdCBzdXBwb3J0ZWQgdG8gTm9kZUpTXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09IFwiWEhSXCIgfHwgb3B0aW9ucy5mb3JtYXQgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy53cmFwID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiICYmIG9wdGlvbnMuZm9ybWF0ID09PSBcInhtbFwiKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy53cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmdzLmNhbGxiYWNrID0gbnVsbDsgLy8gRklYTUUgbm9uIGfDqXLDqSAhP1xuICAgICAgICBzZXR0aW5ncy5vdXRwdXQgPSBzZXR0aW5ncy53cmFwID8gXCJqc29uXCIgOiBudWxsO1xuXG4gICAgICAgIC8vIG9uIGVuY2Fwc3VsZSBsZXMgcmVwb25zZXMgZGFucyB1biBvYmpldCBKU09OXG4gICAgICAgIGlmIChzZXR0aW5ncy53cmFwKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgICAgICBwYXJhbXMub3V0cHV0ID0gc2V0dGluZ3Mub3V0cHV0O1xuICAgICAgICAgICAgcGFyYW1zLmNhbGxiYWNrID0gc2V0dGluZ3MuY2FsbGJhY2s7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmNhbGxiYWNrOyAvLyBGSVhNRSBub24gZ8OpcsOpICE/XG4gICAgICAgICAgICBzZXR0aW5ncy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKG9wdGlvbnMudXJsLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hvaXggZGUgbFwiaW1wbGVtZW50YXRpb24gOlxuICAgICAgICAvLyBYSFIgb3UgSlNPTlBcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5wcm90b2NvbCkge1xuICAgICAgICAgICAgY2FzZSBcIlhIUlwiOlxuICAgICAgICAgICAgICAgIC8vIG9uIG5vcm1hbGlzZSBsJ3VybCAoZ2VzdGlvbiBkdSBjYWNoZSlcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tZXRob2QgPT09IFwiR0VUXCIgJiYgb3B0aW9ucy5ub2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnVybCA9IEhlbHBlci5ub3JtYWx5emVVcmwoc2V0dGluZ3MudXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0IDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGVsIGR1IHNlcnZpY2UgZW4gWEhSXG4gICAgICAgICAgICAgICAgWEhSLmNhbGwoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkpTT05QXCI6XG5cbiAgICAgICAgICAgICAgICAvLyBvbiBub3JtYWxpc2UgbCd1cmwgc2kgbGVzIHBhcmFtcy4gc29udCByZW5zZWlnbsOpcyBkYW5zIGxhIHN0cmluZ3xvYmplY3QgXCJkYXRhXCJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKHNldHRpbmdzLnVybCwgc2V0dGluZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gYXBwZWwgZHUgc2VydmljZSBlbiBKU09OUFxuICAgICAgICAgICAgICAgIEpTT05QLmNhbGwoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm90b2NvbCBub3Qgc3VwcG9ydGVkIChYSFJ8SlNPTlApICFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb3RvY29sO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Protocols/Protocol.js\n"); + +/***/ }), + +/***/ "./src/Protocols/XHR.js": +/*!******************************!*\ + !*** ./src/Protocols/XHR.js ***! + \******************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! es6-promise */ \"./node_modules/es6-promise/dist/es6-promise.js\");\n/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_2__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/* global Promise, require, XDomainRequest */\n\n\n\n\n// import __request from \"request\";\n// import __xmldom from \"xmldom\";\n\n/**\n * Ajax Request (use of Promises)\n *\n * @module XHR\n * @alias Gp.Protocols.XHR\n * @see dependance 'es6-promise'\n */\n\n// cf. https://xhr.spec.whatwg.org/\n// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n\nvar XHR = {\n /**\n * Interface unique d'envoi d'une requête.\n *\n * @method call\n * @static\n * @param {Object} settings - options generales\n * @param {String} settings.url - url du service\n * @param {String} settings.method - GET, POST, PUT, DELETE\n * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute)\n * @param {String} settings.data - content (post) ou param (get)\n * @param {String} settings.proxy - proxy url\n * @param {Object|String} settings.headers - (post) ex. referer\n * @param {Object|String} settings.content - (post) ex. 'application/json'\n * @param {String} settings.timeOut - timeout = 0 par defaut\n * @param {String} settings.scope - this\n * @param {Function} settings.onResponse - callback\n * @param {Function} settings.onFailure - callback\n */\n call: function call(settings) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"XHR\");\n logger.trace(\"[XHR::call()]\");\n\n // FIXME\n // To polyfill the global environment\n es6_promise__WEBPACK_IMPORTED_MODULE_2___default.a.polyfill();\n\n // test sur les settings obligatoires\n if (!settings.url) {\n throw new Error(\"missing parameter : url is not defined !\");\n }\n if (!settings.method) {\n throw new Error(\"missing parameter : method is not defined !\");\n }\n if (!settings.format) {\n settings.format = \"text\"; // reponse brute !\n }\n\n var options = {};\n options.url = settings.url;\n options.data = settings.data ? settings.data : null;\n options.method = settings.method;\n options.timeOut = settings.timeOut || 0;\n options.scope = settings.scope || this;\n options.proxy = settings.proxy || null;\n options.content = settings.content || null;\n options.headers = settings.headers || {\n referer: \"http://localhost\"\n };\n\n // test sur les valeurs de 'settings.method'\n switch (settings.method) {\n case \"DELETE\":\n case \"GET\":\n break;\n case \"PUT\":\n case \"POST\":\n // on force sur ces params spécifiques au mode POST\n options.content = settings.content ? settings.content : \"application/x-www-form-urlencoded\"; // FIXME en attente des services : bascule en \"application/xml\" ou \"application/json\"\n options.headers = settings.headers ? settings.headers : {\n referer: \"http://localhost\"\n }; // FIXME parametrable...\n break;\n case \"HEAD\":\n case \"OPTIONS\":\n throw new Error(\"HTTP method not yet supported !\");\n default:\n throw new Error(\"HTTP method unknown !\");\n }\n\n // test sur les valeurs de 'settings.format'\n switch (settings.format) {\n case \"text\":\n this.__call(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n case \"json\":\n this.__callJSON(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n case \"xml\":\n this.__callXML(options).then(function (response) {\n logger.trace(response);\n settings.onResponse.call(this, response);\n })[\"catch\"](function (error) {\n settings.onFailure.call(this, error);\n });\n break;\n default:\n throw new Error(\"This output Format is not yet supported !\");\n }\n },\n /**\n * Requete\n *\n * @method __call\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __call: function __call(options) {\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"XHR\");\n logger.trace(\"[XHR::__call()]\");\n var promise = new Promise(function (resolve, reject) {\n // traitement du corps de la requête\n var corps = options.method === \"POST\" || options.method === \"PUT\" ? 1 : 0;\n\n // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères)\n if (options.data && (_typeof(options.data) === \"object\" && Object.keys(options.data).length || typeof options.data === \"string\" && options.data.length) && !corps) {\n if (options.scope.CLASSNAME === \"Geocode\" || options.scope.CLASSNAME === \"ReverseGeocode\") {\n options.url = options.url + options.data;\n } else {\n options.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(options.url, options.data);\n }\n }\n logger.trace(\"URL = \", options.url);\n var hXHR = null;\n\n // test on env. nodejs or browser\n if (typeof window === \"undefined\") {\n var nodefetch = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n var opts = {\n headers: {\n Referer: \"https://localhost\"\n }\n };\n if (options.data && typeof options.data === \"string\" && corps) {\n opts = {\n method: options.method,\n body: options.data,\n headers: {\n \"Content-Type\": options.content,\n Referer: \"https://localhost\"\n }\n };\n }\n return nodefetch(options.url, opts).then(function (response) {\n if (response.ok) {\n // res.status >= 200 && res.status < 300\n resolve(response.text());\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + response.statusText + \"' | url : '\" + response.url + \"')\";\n var status = response.status;\n reject({\n message: message,\n status: status\n });\n }\n })[\"catch\"](function (e) {\n reject({\n message: e,\n status: -1\n });\n });\n } else {\n if (window.XMLHttpRequest) {\n logger.trace(\"XMLHttpRequest\");\n hXHR = new XMLHttpRequest();\n hXHR.open(options.method, options.url, true); // async\n hXHR.overrideMimeType = options.content;\n\n // gestion du timeout\n var onTimeOutTrigger = null;\n if (options.timeOut > 0) {\n // FIXME le timeout interne ne me permet pas de declencher le bon message...\n // hXHR.timeout = options.timeOut;\n logger.trace(\"XHR - TimeOut actif !\");\n /**\n * Description\n *\n * @method onTimeOutTrigger\n * @private\n */\n onTimeOutTrigger = window.setTimeout(function () {\n var message = \"TimeOut Occured on Http Request with XMLHttpRequest !\";\n reject({\n message: message,\n status: -1\n });\n }, options.timeOut);\n }\n if (corps) {\n // headers, data, content of data\n // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader\n logger.trace(\"data = \", options.data);\n hXHR.setRequestHeader(\"Content-type\", options.content);\n // FIXME refused to set unsafe header content-length javascript\n // hXHR.setRequestHeader (\"Content-length\", options.data.length);\n // hXHR.setRequestHeader (\"Referer\", options.headers.referer);\n }\n\n /**\n * On Error\n * FIXME ne se declenche pas !?\n *\n * @param {Object} e - Event\n * @method onerror\n * @private\n */\n hXHR.onerror = function (e) {\n console.log(e);\n reject(new Error(\"Errors Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * On Timeout\n * FIXME ne se declenche pas !?\n *\n * @param {Object} e - Event\n * @method ontimeout\n * @private\n */\n hXHR.ontimeout = function (e) {\n console.log(e);\n reject(new Error(\"TimeOut Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * Description\n *\n * @method onreadystatechange\n * @private\n */\n hXHR.onreadystatechange = function (e) {\n if (hXHR.readyState === 4) {\n // DONE\n if (hXHR.status === 200) {\n window.clearTimeout(onTimeOutTrigger);\n resolve(hXHR.response);\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + e.target.statusText + \"' | url : '\" + e.target.responseURL + \"' | response : '\" + e.target.response + \"')\";\n var status = e.target.status;\n reject({\n message: message,\n status: status\n });\n }\n }\n };\n\n // gestion du content data\n var data4xhr = options.data && corps ? options.data : null;\n hXHR.send(data4xhr);\n } else if (window.XDomainRequest) {\n // worked in Internet Explorer 8–10 only !\n logger.trace(\"XDomainRequest\");\n hXHR = new XDomainRequest();\n hXHR.open(options.method, options.url);\n hXHR.overrideMimeType = options.content;\n if (options.timeOut > 0) {\n hXHR.timeout = options.timeout;\n logger.trace(\"XHR - TimeOut actif !\");\n }\n if (corps) {\n // headers, data, content of data\n // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader\n hXHR.setRequestHeader(\"Content-type\", options.content);\n // FIXME refused to set unsafe header content-length javascript\n // hXHR.setRequestHeader (\"Content-length\", options.data.length);\n // hXHR.setRequestHeader (\"Referer\", options.headers.referer);\n }\n\n /**\n * Description\n *\n * @method onerror\n * @private\n */\n hXHR.onerror = function () {\n reject(new Error(\"Errors Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * Description\n *\n * @method ontimeout\n * @private\n */\n hXHR.ontimeout = function () {\n reject(new Error(\"TimeOut Occured on Http Request with XMLHttpRequest !\"));\n };\n\n /**\n * On Load\n *\n * @method onload\n * @private\n */\n hXHR.onload = function (e) {\n if (hXHR.status === 200) {\n resolve(hXHR.responseText);\n } else {\n var message = \"Errors Occured on Http Request (status : '\" + e.target.statusText + \"' | url : '\" + e.target.responseURL + \"')\";\n var status = e.target.status;\n reject({\n message: message,\n status: status\n });\n }\n };\n var data4xdr = options.data && corps ? options.data : null;\n hXHR.send(data4xdr);\n } else {\n throw new Error(\"CORS not supported\");\n }\n }\n });\n return promise;\n },\n /**\n * Requete avec parser JSON\n *\n * @method __callJSON\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __callJSON: function __callJSON(options) {\n return this.__call(options).then(JSON.parse)[\"catch\"](function (error) {\n console.log(\"_callJSON failed on : \", options.url, error);\n // FIXME pas d'exception, laissons le fil se derouler...\n // throw error;\n });\n },\n\n /**\n * Requete avec parser XML\n *\n * @method __callXML\n * @private\n * @param {Object} options - options\n * @return {Object} promise\n */\n __callXML: function __callXML(options) {\n return this.__call(options).then(function (response) {\n var xmlDoc;\n\n // test on env. nodejs or browser\n if (typeof window === \"undefined\") {\n var DOMParser = __webpack_require__(/*! xmldom */ \"xmldom\").DOMParser; // __xmldom.DOMParser\n xmlDoc = new DOMParser().parseFromString(response, \"text/xml\");\n } else {\n if (window.DOMParser) {\n var parser = new window.DOMParser();\n xmlDoc = parser.parseFromString(response, \"text/xml\");\n } else {\n // IE\n xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = false;\n xmlDoc.loadXML(response);\n }\n }\n return xmlDoc;\n })[\"catch\"](function (error) {\n console.log(\"__callXML failed on : \", options.url, error);\n // FIXME pas d'exception, laissons le fil se derouler...\n // throw error;\n });\n }\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (XHR);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9Qcm90b2NvbHMvWEhSLmpzPzgzNGIiXSwibmFtZXMiOlsiWEhSIiwiY2FsbCIsInNldHRpbmdzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJFUzZQcm9taXNlIiwicG9seWZpbGwiLCJ1cmwiLCJFcnJvciIsIm1ldGhvZCIsImZvcm1hdCIsIm9wdGlvbnMiLCJkYXRhIiwidGltZU91dCIsInNjb3BlIiwicHJveHkiLCJjb250ZW50IiwiaGVhZGVycyIsInJlZmVyZXIiLCJfX2NhbGwiLCJ0aGVuIiwicmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiZXJyb3IiLCJvbkZhaWx1cmUiLCJfX2NhbGxKU09OIiwiX19jYWxsWE1MIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY29ycHMiLCJfdHlwZW9mIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIkNMQVNTTkFNRSIsIkhlbHBlciIsIm5vcm1hbHl6ZVVybCIsImhYSFIiLCJ3aW5kb3ciLCJub2RlZmV0Y2giLCJyZXF1aXJlIiwib3B0cyIsIlJlZmVyZXIiLCJib2R5Iiwib2siLCJ0ZXh0IiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJzdGF0dXMiLCJlIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib3ZlcnJpZGVNaW1lVHlwZSIsIm9uVGltZU91dFRyaWdnZXIiLCJzZXRUaW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIm9uZXJyb3IiLCJjb25zb2xlIiwibG9nIiwib250aW1lb3V0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsImNsZWFyVGltZW91dCIsInRhcmdldCIsInJlc3BvbnNlVVJMIiwiZGF0YTR4aHIiLCJzZW5kIiwiWERvbWFpblJlcXVlc3QiLCJ0aW1lb3V0Iiwib25sb2FkIiwicmVzcG9uc2VUZXh0IiwiZGF0YTR4ZHIiLCJKU09OIiwicGFyc2UiLCJ4bWxEb2MiLCJET01QYXJzZXIi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RCxLQUFLLEVBQUU7TUFDcEJvQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRWpELE9BQU8sQ0FBQ0osR0FBRyxFQUFFZ0IsS0FBSyxDQUFDO01BQ3pEO01BQ0E7SUFDSixDQUFDLENBQUM7RUFDVjtBQUVKLENBQUM7O0FBRWN6QixrRUFBRyIsImZpbGUiOiIuL3NyYy9Qcm90b2NvbHMvWEhSLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIFByb21pc2UsIHJlcXVpcmUsIFhEb21haW5SZXF1ZXN0ICovXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEhlbHBlciBmcm9tIFwiLi4vVXRpbHMvSGVscGVyXCI7XG5pbXBvcnQgRVM2UHJvbWlzZSBmcm9tIFwiZXM2LXByb21pc2VcIjtcbi8vIGltcG9ydCBfX3JlcXVlc3QgZnJvbSBcInJlcXVlc3RcIjtcbi8vIGltcG9ydCBfX3htbGRvbSBmcm9tIFwieG1sZG9tXCI7XG5cbi8qKlxuICogQWpheCBSZXF1ZXN0ICh1c2Ugb2YgUHJvbWlzZXMpXG4gKlxuICogQG1vZHVsZSBYSFJcbiAqIEBhbGlhcyBHcC5Qcm90b2NvbHMuWEhSXG4gKiBAc2VlIGRlcGVuZGFuY2UgJ2VzNi1wcm9taXNlJ1xuICovXG5cbi8vIGNmLiBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvXG4vLyBjZi4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0XG5cbnZhciBYSFIgPSB7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmZhY2UgdW5pcXVlIGQnZW52b2kgZCd1bmUgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGNhbGxcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIC0gb3B0aW9ucyBnZW5lcmFsZXNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ3MudXJsICAgIC0gdXJsIGR1IHNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ3MubWV0aG9kIC0gR0VULCBQT1NULCBQVVQsIERFTEVURVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5mb3JtYXQgLSBmb3JtYXQgZGUgbGEgcmVwb25zZSBkdSBzZXJ2aWNlIDoganNvbiwgeG1sIG91IG51bGwgKGJydXRlKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5kYXRhICAgLSBjb250ZW50IChwb3N0KSBvdSBwYXJhbSAoZ2V0KVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5wcm94eSAgLSBwcm94eSB1cmxcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNldHRpbmdzLmhlYWRlcnMgLSAocG9zdCkgZXguIHJlZmVyZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNldHRpbmdzLmNvbnRlbnQgLSAocG9zdCkgZXguICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy50aW1lT3V0IC0gdGltZW91dCA9IDAgcGFyIGRlZmF1dFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5ncy5zY29wZSAtIHRoaXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vblJlc3BvbnNlIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0aW5ncy5vbkZhaWx1cmUgIC0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBjYWxsIDogZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlhIUlwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW1hIUjo6Y2FsbCgpXVwiKTtcblxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvLyBUbyBwb2x5ZmlsbCB0aGUgZ2xvYmFsIGVudmlyb25tZW50XG4gICAgICAgIEVTNlByb21pc2UucG9seWZpbGwoKTtcblxuICAgICAgICAvLyB0ZXN0IHN1ciBsZXMgc2V0dGluZ3Mgb2JsaWdhdG9pcmVzXG4gICAgICAgIGlmICghc2V0dGluZ3MudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHBhcmFtZXRlciA6IHVybCBpcyBub3QgZGVmaW5lZCAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXR0aW5ncy5tZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgcGFyYW1ldGVyIDogbWV0aG9kIGlzIG5vdCBkZWZpbmVkICFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNldHRpbmdzLmZvcm1hdCkge1xuICAgICAgICAgICAgc2V0dGluZ3MuZm9ybWF0ID0gXCJ0ZXh0XCI7IC8vIHJlcG9uc2UgYnJ1dGUgIVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9ucy51cmwgPSBzZXR0aW5ncy51cmw7XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IHNldHRpbmdzLmRhdGEgPyBzZXR0aW5ncy5kYXRhIDogbnVsbDtcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBzZXR0aW5ncy5tZXRob2Q7XG4gICAgICAgIG9wdGlvbnMudGltZU91dCA9IHNldHRpbmdzLnRpbWVPdXQgfHwgMDtcbiAgICAgICAgb3B0aW9ucy5zY29wZSA9IHNldHRpbmdzLnNjb3BlIHx8IHRoaXM7XG4gICAgICAgIG9wdGlvbnMucHJveHkgPSBzZXR0aW5ncy5wcm94eSB8fCBudWxsO1xuICAgICAgICBvcHRpb25zLmNvbnRlbnQgPSBzZXR0aW5ncy5jb250ZW50IHx8IG51bGw7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHNldHRpbmdzLmhlYWRlcnMgfHwge1xuICAgICAgICAgICAgcmVmZXJlciA6IFwiaHR0cDovL2xvY2FsaG9zdFwiXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdGVzdCBzdXIgbGVzIHZhbGV1cnMgZGUgJ3NldHRpbmdzLm1ldGhvZCdcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgXCJERUxFVEVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJHRVRcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJQVVRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJQT1NUXCI6XG4gICAgICAgICAgICAgICAgLy8gb24gZm9yY2Ugc3VyIGNlcyBwYXJhbXMgc3DDqWNpZmlxdWVzIGF1IG1vZGUgUE9TVFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IHNldHRpbmdzLmNvbnRlbnQgPyBzZXR0aW5ncy5jb250ZW50IDogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjsgLy8gRklYTUUgZW4gYXR0ZW50ZSBkZXMgc2VydmljZXMgOiBiYXNjdWxlIGVuIFwiYXBwbGljYXRpb24veG1sXCIgb3UgXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBzZXR0aW5ncy5oZWFkZXJzID8gc2V0dGluZ3MuaGVhZGVycyA6IHsgcmVmZXJlciA6IFwiaHR0cDovL2xvY2FsaG9zdFwiIH07IC8vIEZJWE1FIHBhcmFtZXRyYWJsZS4uLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkhFQURcIjpcbiAgICAgICAgICAgIGNhc2UgXCJPUFRJT05TXCI6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSFRUUCBtZXRob2Qgbm90IHlldCBzdXBwb3J0ZWQgIVwiKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSFRUUCBtZXRob2QgdW5rbm93biAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVzdCBzdXIgbGVzIHZhbGV1cnMgZGUgJ3NldHRpbmdzLmZvcm1hdCdcbiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGwob3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25SZXNwb25zZS5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25GYWlsdXJlLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGxKU09OKG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uUmVzcG9uc2UuY2FsbCh0aGlzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9uRmFpbHVyZS5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwieG1sXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NhbGxYTUwob3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25SZXNwb25zZS5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub25GYWlsdXJlLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvdXRwdXQgRm9ybWF0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkICFcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBfX2NhbGxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb21pc2VcbiAgICAgKi9cbiAgICBfX2NhbGwgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlhIUlwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiW1hIUjo6X19jYWxsKCldXCIpO1xuXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJhaXRlbWVudCBkdSBjb3JwcyBkZSBsYSByZXF1w6p0ZVxuICAgICAgICAgICAgICAgIHZhciBjb3JwcyA9IChvcHRpb25zLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHwgb3B0aW9ucy5tZXRob2QgPT09IFwiUFVUXCIpID8gMSA6IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXVsZW1lbnQgc2kgb3B0aW9ucy5kYXRhIG4nZXN0IHBhcyB2aWRlIChwZXV0IMOqdHJlIHVuIG9iamV0IG91IHVuZSBjaGFpbmUgZGUgY2FyYWN0w6hyZXMpXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiAoKHR5cGVvZiBvcHRpb25zLmRhdGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5kYXRhKS5sZW5ndGgpIHx8ICh0eXBlb2Ygb3B0aW9ucy5kYXRhID09PSBcInN0cmluZ1wiICYmIG9wdGlvbnMuZGF0YS5sZW5ndGgpKSAmJiAhY29ycHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGUuQ0xBU1NOQU1FID09PSBcIkdlb2NvZGVcIiB8fCBvcHRpb25zLnNjb3BlLkNMQVNTTkFNRSA9PT0gXCJSZXZlcnNlR2VvY29kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgb3B0aW9ucy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBIZWxwZXIubm9ybWFseXplVXJsKG9wdGlvbnMudXJsLCBvcHRpb25zLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiVVJMID0gXCIsIG9wdGlvbnMudXJsKTtcblxuICAgICAgICAgICAgICAgIHZhciBoWEhSID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIHRlc3Qgb24gZW52LiBub2RlanMgb3IgYnJvd3NlclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub2RlZmV0Y2ggPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlciA6IFwiaHR0cHM6Ly9sb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgdHlwZW9mIG9wdGlvbnMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBjb3Jwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IDogb3B0aW9ucy5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCIgOiBvcHRpb25zLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZXIgOiBcImh0dHBzOi8vbG9jYWxob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVmZXRjaChvcHRpb25zLnVybCwgb3B0cylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykgeyAvLyByZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDwgMzAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IChzdGF0dXMgOiAnXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0ICsgXCInIHwgdXJsIDogJ1wiICsgcmVzcG9uc2UudXJsICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiBzdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiWE1MSHR0cFJlcXVlc3RcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub3BlbihvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy51cmwsIHRydWUpOyAvLyBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vdmVycmlkZU1pbWVUeXBlID0gb3B0aW9ucy5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGR1IHRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvblRpbWVPdXRUcmlnZ2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVPdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgbGUgdGltZW91dCBpbnRlcm5lIG5lIG1lIHBlcm1ldCBwYXMgZGUgZGVjbGVuY2hlciBsZSBib24gbWVzc2FnZS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIudGltZW91dCA9IG9wdGlvbnMudGltZU91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJYSFIgLSBUaW1lT3V0IGFjdGlmICFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBtZXRob2Qgb25UaW1lT3V0VHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25UaW1lT3V0VHJpZ2dlciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiVGltZU91dCBPY2N1cmVkIG9uIEh0dHAgUmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0ICFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVPdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ycHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJzLCBkYXRhLCBjb250ZW50IG9mIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy94aHIvcmF3LWZpbGUvdGlwL092ZXJ2aWV3Lmh0bWwjZG9tLXhtbGh0dHByZXF1ZXN0LXNldHJlcXVlc3RoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJkYXRhID0gXCIsIG9wdGlvbnMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIG9wdGlvbnMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVmdXNlZCB0byBzZXQgdW5zYWZlIGhlYWRlciBjb250ZW50LWxlbmd0aCBqYXZhc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaFhIUi5zZXRSZXF1ZXN0SGVhZGVyIChcIkNvbnRlbnQtbGVuZ3RoXCIsIG9wdGlvbnMuZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIuc2V0UmVxdWVzdEhlYWRlciAoXCJSZWZlcmVyXCIsIG9wdGlvbnMuaGVhZGVycy5yZWZlcmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBPbiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICogRklYTUUgbmUgc2UgZGVjbGVuY2hlIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBtZXRob2Qgb25lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIE9uIFRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FIG5lIHNlIGRlY2xlbmNoZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSAtIEV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9udGltZW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJUaW1lT3V0IE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQG1ldGhvZCBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFhIUi5yZWFkeVN0YXRlID09PSA0KSB7IC8vIERPTkVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhYSFIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQob25UaW1lT3V0VHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhYSFIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIkVycm9ycyBPY2N1cmVkIG9uIEh0dHAgUmVxdWVzdCAoc3RhdHVzIDogJ1wiICsgZS50YXJnZXQuc3RhdHVzVGV4dCArIFwiJyB8IHVybCA6ICdcIiArIGUudGFyZ2V0LnJlc3BvbnNlVVJMICsgXCInIHwgcmVzcG9uc2UgOiAnXCIgKyBlLnRhcmdldC5yZXNwb25zZSArIFwiJylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlLnRhcmdldC5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IHN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXN0aW9uIGR1IGNvbnRlbnQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE0eGhyID0gKG9wdGlvbnMuZGF0YSAmJiBjb3JwcykgPyBvcHRpb25zLmRhdGEgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSLnNlbmQoZGF0YTR4aHIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VkIGluIEludGVybmV0IEV4cGxvcmVyIDjigJMxMCBvbmx5ICFcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcIlhEb21haW5SZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoWEhSLm9wZW4ob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMudXJsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vdmVycmlkZU1pbWVUeXBlID0gb3B0aW9ucy5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aW1lT3V0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIudGltZW91dCA9IG9wdGlvbnMudGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJYSFIgLSBUaW1lT3V0IGFjdGlmICFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3Jwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlcnMsIGRhdGEsIGNvbnRlbnQgb2YgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2R2Y3MudzMub3JnL2hnL3hoci9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCNkb20teG1saHR0cHJlcXVlc3Qtc2V0cmVxdWVzdGhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBvcHRpb25zLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlZnVzZWQgdG8gc2V0IHVuc2FmZSBoZWFkZXIgY29udGVudC1sZW5ndGggamF2YXNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhYSFIuc2V0UmVxdWVzdEhlYWRlciAoXCJDb250ZW50LWxlbmd0aFwiLCBvcHRpb25zLmRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoWEhSLnNldFJlcXVlc3RIZWFkZXIgKFwiUmVmZXJlclwiLCBvcHRpb25zLmhlYWRlcnMucmVmZXJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9uZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRXJyb3JzIE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQG1ldGhvZCBvbnRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGhYSFIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJUaW1lT3V0IE9jY3VyZWQgb24gSHR0cCBSZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3QgIVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIE9uIExvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBAbWV0aG9kIG9ubG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoWEhSLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaFhIUi5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJFcnJvcnMgT2NjdXJlZCBvbiBIdHRwIFJlcXVlc3QgKHN0YXR1cyA6ICdcIiArIGUudGFyZ2V0LnN0YXR1c1RleHQgKyBcIicgfCB1cmwgOiAnXCIgKyBlLnRhcmdldC5yZXNwb25zZVVSTCArIFwiJylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IGUudGFyZ2V0LnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhNHhkciA9IChvcHRpb25zLmRhdGEgJiYgY29ycHMpID8gb3B0aW9ucy5kYXRhIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaFhIUi5zZW5kKGRhdGE0eGRyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNPUlMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZSBhdmVjIHBhcnNlciBKU09OXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIF9fY2FsbEpTT05cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHByb21pc2VcbiAgICAgKi9cbiAgICBfX2NhbGxKU09OIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jYWxsKG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbihKU09OLnBhcnNlKVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiX2NhbGxKU09OIGZhaWxlZCBvbiA6IFwiLCBvcHRpb25zLnVybCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIHBhcyBkJ2V4Y2VwdGlvbiwgbGFpc3NvbnMgbGUgZmlsIHNlIGRlcm91bGVyLi4uXG4gICAgICAgICAgICAgICAgLy8gdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVxdWV0ZSBhdmVjIHBhcnNlciBYTUxcbiAgICAgKlxuICAgICAqIEBtZXRob2QgX19jYWxsWE1MXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBwcm9taXNlXG4gICAgICovXG4gICAgX19jYWxsWE1MIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jYWxsKG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG1sRG9jO1xuXG4gICAgICAgICAgICAgICAgLy8gdGVzdCBvbiBlbnYuIG5vZGVqcyBvciBicm93c2VyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERPTVBhcnNlciA9IHJlcXVpcmUoXCJ4bWxkb21cIikuRE9NUGFyc2VyOyAvLyBfX3htbGRvbS5ET01QYXJzZXJcbiAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhyZXNwb25zZSwgXCJ0ZXh0L3htbFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LkRPTVBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlLCBcInRleHQveG1sXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBJRVxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sRG9jID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbERvYy5hc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgeG1sRG9jLmxvYWRYTUwocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJfX2NhbGxYTUwgZmFpbGVkIG9uIDogXCIsIG9wdGlvbnMudXJsLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgLy8gRklYTUUgcGFzIGQnZXhjZXB0aW9uLCBsYWlzc29ucyBsZSBmaWwgc2UgZGVyb3VsZXIuLi5cbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgWEhSO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Protocols/XHR.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Alti.js": +/*!***********************************!*\ + !*** ./src/Services/Alti/Alti.js ***! + \***********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/AltiRequestFactory */ \"./src/Services/Alti/Request/AltiRequestFactory.js\");\n/* harmony import */ var _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/AltiResponseFactory */ \"./src/Services/Alti/Response/AltiResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n *\n * Appel du service d'altimétrie du Géoportail\n *\n * @todo gestion du parma. output et callback\n * @todo outputFormat (REST) et format (WPS)\n * @todo La reponse JSON peut encapsuler un XML !\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Alti\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84)\n * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil).\n * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants.\n * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine).\n * Maximum 50 éléments.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'.\n * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST,\n * ou la valeur du paramètre 'format' dans le cas de la norme WPS.\n * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST,\n * pour connaître le format dans lequel sera fournie la réponse (pour son traitement).\n * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'.\n *\n * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000.\n * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité.\n * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique\n * le long duquel le profil doit être calculé.\n * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis,\n * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis).\n * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points).\n *\n * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS).\n * Par défaut, on utilise l'API REST.\n *\n * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'.\n * Vaut 'false' par défaut.\n *\n * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul.\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * positions : [{lon:, lat:}, {lon:, lat:}],\n * outputFormat : 'json' // json|xml\n * sampling : 3,\n * api : 'REST', // REST|WPS\n * zonly : false // false|true,\n * resource : \"resource-par-defaut\"\n * };\n *\n */\nfunction Alti(options) {\n if (!(this instanceof Alti)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Alti\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"Alti\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Alti\");\n this.logger.trace(\"[Constructeur Alti (options)]\");\n\n // #####################\n // analyse des options\n // #####################\n\n if (!options.positions) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"positions\"));\n }\n if (options.positions.length === 0) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"positions\"));\n }\n\n // ajout des options spécifiques au service\n this.options.positions = options.positions;\n\n // format de réponse du service : \"json\" ou \"xml\" (valeur par défaut), en minuscule !\n this.options.outputFormat = typeof options.outputFormat === \"string\" ? options.outputFormat.toLowerCase() : \"xml\";\n\n // ressource utilisée pour le calcul altimétrique\n this.options.resource = options.resource || \"rge_alti_corse2a_float32_zip_lamb93\";\n\n // sampling\n this.options.sampling = options.sampling || null;\n\n // type d'api utilisé pour requeter le service, en majuscule !\n this.options.api = typeof options.api === \"string\" ? options.api.toUpperCase() : \"REST\";\n\n // l'api ne peut être interrogée qu'en GET.\n if (this.options.api === \"REST\") {\n this.options.httpMethod = \"GET\";\n }\n\n // param. zonly\n this.options.zonly = options.zonly || false;\n\n // param. measures\n this.options.measures = options.measures || false;\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat)\n // ainsi que sur le type de service (profil ou elevation)\n if (!this.options.serverUrl) {\n // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti\n /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl();\n if (this.options.oldAltiService) {\n lstUrlByDefault = DefaultUrlService.Alti.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti\n var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Alti.url();\n var urlFound = null;\n switch (this.options.api) {\n case \"WPS\":\n urlFound = lstUrlByDefault.wps;\n break;\n case \"REST\":\n var key = (options.sampling ? \"profil\" : \"elevation\") + \"-\" + this.options.outputFormat;\n urlFound = lstUrlByDefault[key];\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"api\"));\n }\n if (!urlFound) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = urlFound;\n this.logger.trace(\"Server URL by default : \" + this.options.serverUrl);\n }\n\n // gestion du type de service\n // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat)\n var idx = this.options.serverUrl.lastIndexOf(\".\");\n if (idx !== -1) {\n var extension = this.options.serverUrl.substring(idx + 1);\n if (extension && extension.length < 5) {\n // FIXME extension de moins de 4 car. ...\n this.logger.trace(\"Server Extension URL : \" + extension);\n switch (extension.toLowerCase()) {\n case \"json\":\n case \"xml\":\n this.options.outputFormat = extension.toLowerCase();\n break;\n default:\n throw new Error(\"type of service : unknown or unsupported (json or xml) !\");\n }\n }\n }\n}\n\n/**\n * @lends module:Alti#\n */\nAlti.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/**\n * Constructeur (alias)\n */\nAlti.prototype.constructor = Alti;\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAlti.prototype.buildRequest = function (error, success) {\n // utilisation en mode callback\n var options = {\n httpMethod: this.options.httpMethod,\n // callback\n onSuccess: function onSuccess(result) {\n // sauvegarde de la requete !\n this.request = result;\n success.call(this, this.request);\n },\n onError: error,\n scope: this,\n // spécifique au service :\n resource: this.options.resource,\n positions: this.options.positions,\n outputFormat: this.options.outputFormat,\n sampling: this.options.sampling,\n api: this.options.api,\n zonly: this.options.zonly,\n measures: this.options.measures\n };\n _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n};\n\n/**\n * Analyse de la reponse (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAlti.prototype.analyzeResponse = function (error, success) {\n // INFO\n // Factory pour masquer la complexité du retour du service qui renvoie soit\n // - une 'string' qui contient du XML ou JSON natif en mode XHR\n // - un objet JSON qui est natif ou encapsulé\n\n if (this.response) {\n var options = {\n response: this.response,\n outputFormat: this.options.outputFormat,\n // utile pour parser la string en mode XHR : JSON ou XML !\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Alti);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL0FsdGkuanM/Y2ZiNiJdLCJuYW1lcyI6WyJBbHRpIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJwb3NpdGlvbnMiLCJFcnJvciIsImxlbmd0aCIsIm91dHB1dEZvcm1hdCIsInRvTG93ZXJDYXNlIiwicmVzb3VyY2UiLCJzYW1wbGluZyIsImFwaSIsInRvVXBwZXJDYXNlIiwiaHR0cE1ldGhvZCIsInpvbmx5IiwibWVhc3VyZXMiLCJzZXJ2ZXJVcmwiLCJsc3RVcmxCeURlZmF1bHQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInVybEZvdW5kIiwid3BzIiwia2V5IiwiaWR4IiwibGFzdEluZGV4T2YiLCJleHRlbnNpb24iLCJzdWJzdHJpbmciLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsIm9uU3VjY2VzcyIsInJlc3VsdCIsInJlcXVlc3QiLCJjYWxsIiwib25FcnJvciIsInNjb3BlIiwiQWx0aVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwiQWx0aVJlc3BvbnNlRmFjdG9yeSIsIkVycm9yU2VydmljZSJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFpRDtBQUNIO0FBQ1c7QUFDWjtBQUNRO0FBQ1M7QUFDRzs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RyxJQUFJLENBQUNsQixPQUFPLENBQUNrQixRQUFRO0lBQ2hDQyxHQUFHLEVBQUcsSUFBSSxDQUFDbkIsT0FBTyxDQUFDbUIsR0FBRztJQUN0QkcsS0FBSyxFQUFHLElBQUksQ0FBQ3RCLE9BQU8sQ0FBQ3NCLEtBQUs7SUFDMUJDLFFBQVEsRUFBRyxJQUFJLENBQUN2QixPQUFPLENBQUN1QjtFQUM1QixDQUFDO0VBRUR5QixtRUFBa0IsQ0FBQ0MsS0FBSyxDQUFDakQsT0FBTyxDQUFDO0FBQ3JDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FELElBQUksQ0FBQ29DLFNBQVMsQ0FBQ2UsZUFBZSxHQUFHLFVBQVVWLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQ3ZEO0VBQ0E7RUFDQTtFQUNBOztFQUVBLElBQUksSUFBSSxDQUFDVSxRQUFRLEVBQUU7SUFDZixJQUFJbkQsT0FBTyxHQUFHO01BQ1ZtRCxRQUFRLEVBQUcsSUFBSSxDQUFDQSxRQUFRO01BQ3hCcEMsWUFBWSxFQUFHLElBQUksQ0FBQ2YsT0FBTyxDQUFDZSxZQUFZO01BQUU7TUFDMUNxQyxXQUFXLEVBQUcsSUFBSSxDQUFDcEQsT0FBTyxDQUFDb0QsV0FBVztNQUN0Q04sT0FBTyxFQUFHTixLQUFLO01BQ2ZFLFNBQVMsRUFBR0QsT0FBTztNQUNuQk0sS0FBSyxFQUFHO0lBQ1osQ0FBQztJQUVETSxxRUFBbUIsQ0FBQ0osS0FBSyxDQUFDakQsT0FBTyxDQUFDO0VBQ3RDLENBQUMsTUFBTTtJQUNId0MsS0FBSyxDQUFDSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUlTLGdFQUFZLENBQUNwRCxnRUFBQyxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzlFO0FBQ0osQ0FBQztBQUVjSixtRUFBSSIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL0FsdGkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBBbHRpUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9BbHRpUmVxdWVzdEZhY3RvcnlcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogQXBwZWwgZHUgc2VydmljZSBkJ2FsdGltw6l0cmllIGR1IEfDqW9wb3J0YWlsXG4gKlxuICogQHRvZG8gZ2VzdGlvbiBkdSBwYXJtYS4gb3V0cHV0IGV0IGNhbGxiYWNrXG4gKiBAdG9kbyBvdXRwdXRGb3JtYXQgKFJFU1QpIGV0IGZvcm1hdCAoV1BTKVxuICogQHRvZG8gTGEgcmVwb25zZSBKU09OIHBldXQgZW5jYXBzdWxlciB1biBYTUwgIVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlICgrIGxlcyBvcHRpb25zIGhlcml0w6llcylcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBvcHRpb25zLnBvc2l0aW9ucyAtIFRhYmxlYXUgKHtsb246ZmxvYXQsbGF0OmZsb2F0fSkgY29udGVuYW50IGxlcyBjb29yZG9ubsOpZXMgZGVzIHBvaW50cyAoQ1JTOjg0KVxuICogICAgICBkb250IG9uIHZldXQgY29ubmHDrnRyZSBsZXMgYWx0aXR1ZGVzIChvdSDDoCBwYXJ0aXIgZGVzcXVlbGxlcyBvbiB2YSBjYWxjdWxlciBsZSBwcm9maWwpLlxuICogICAgICBDaGFxdWUgw6lsw6ltZW50IGR1IHRhYmxlYXUgZXN0IHVuIG9iamV0IEphdmFTY3JpcHQgYXZlYyBkZXV4IGF0dHJpYnV0cyA6IGxvbiBldCBsYXQsIHF1aSBzb250IGRlcyBmbG90dGFudHMuXG4gKiAgICAgIE1pbmltdW0gMiDDqWzDqW1lbnRzIHNpIG9uIHNvdWhhaXRlIGNhbGN1bGVyIHVuIHByb2ZpbCBhbHRpbcOpdHJpcXVlIChFbGV2YXRpb25MaW5lKS5cbiAqICAgICAgTWF4aW11bSA1MCDDqWzDqW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm91dHB1dEZvcm1hdCAtIExlIGZvcm1hdCBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIGFsdGkgOiAneG1sJyBvdSAnanNvbicuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZMOpdGVybWluZXJhIGwnZXh0ZW5zaW9uICcueG1sJyBvdSAnLmpzb24nIGR1IHNlcnZpY2UgZGFucyBsZSBjYXMgZGUgbCdBUEkgUkVTVCxcbiAqICAgICAgb3UgbGEgdmFsZXVyIGR1IHBhcmFtw6h0cmUgJ2Zvcm1hdCcgZGFucyBsZSBjYXMgZGUgbGEgbm9ybWUgV1BTLlxuICogICAgICBOw6ljZXNzYWlyZSBzaSBzZXJ2ZXJVcmwgZXN0IHJlbnNlaWduw6ksIGV0IHF1J29uIHNvdWhhaXRlIHBhc3NlciBwYXIgbCdBUEkgUkVTVCxcbiAqICAgICAgcG91ciBjb25uYcOudHJlIGxlIGZvcm1hdCBkYW5zIGxlcXVlbCBzZXJhIGZvdXJuaWUgbGEgcsOpcG9uc2UgKHBvdXIgc29uIHRyYWl0ZW1lbnQpLlxuICogICAgICBOb24gbsOpY2Vzc2FpcmUgcG91ciBsYSBub3JtZSBXUFMuIFBhciBkw6lmYXV0LCBjZSBwYXJhbcOodHJlIHZhdXQgJ2pzb24nLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zYW1wbGluZ10gLSBOb21icmUgZGUgcG9pbnRzIMOgIHV0aWxpc2VyIHBvdXIgZMOpdGVybWluZXIgbGUgdHJhY8OpIGQndW4gcHJvZmlsIGFsdGltw6l0cmlxdWUsIGNvbXByaXMgZW50cmUgMiBldCA1MDAwLlxuICogICAgICBBIHNww6ljaWZpZXIgbG9yc3F1J29uIHNvdWhhaXRlIGFjY8OpZGVyIMOgIGNldHRlIGZvbmN0aW9ubmFsaXTDqS5cbiAqICAgICAgRGFucyBjZSBjYXMsIGxlcyBwb2ludHMgZm91cm5pcyBlbiBlbnRyw6llIChhdSBtaW5pbXVtIGRlIGRldXgpIHNlcnZlbnQgw6AgZMOpdGVybWluZXIgbCdheGUgcGxhbmltw6l0cmlxdWVcbiAqICAgICAgbGUgbG9uZyBkdXF1ZWwgbGUgcHJvZmlsIGRvaXQgw6p0cmUgY2FsY3Vsw6kuXG4gKiAgICAgIFNpIGxlIHBhcmFtw6h0cmUgc2FtcGxpbmcgbidlc3QgcGFzIHNww6ljaWZpw6kgb3UgbW9pbnMgZGUgZGV1eCBwb2ludHMgc29udCBmb3VybmlzLFxuICogICAgICBjJ2VzdCBsZSBzZXJ2aWNlIEVsZXZhdGlvbiBxdWkgc2VyYSBpbnRlcnJvZ8OpIChhbHRpdHVkZXMgc2ltcGxlcyBjYWxjdWzDqWVzIHBvdXIgbGVzIHBvaW50cyBmb3VybmlzKS5cbiAqICAgICAgVW5lIHZhbGV1ciBkZSBzYW1wbGluZyBzdHJpY3RlbWVudCBpbmbDqXJpZXVyZSDDoCAyIGTDqWNsZW5jaGVyYSB1biDDqWNoYW50aWxsb25uYWdlIGF2ZWMgbGEgdmFsZXVyIHBhciBkw6lmYXV0IGR1IHNlcnZpY2UgKDMgcG9pbnRzKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYXBpXSAtIE1hbmnDqHJlIGQnYWNjw6lkZXIgYXUgc2VydmljZSA6ICdSRVNUJyAodmlhIGwnQVBJIFJFU1QpIG91ICdXUFMnICh2aWEgbGEgbm9ybWUgV1BTKS5cbiAqICAgICAgUGFyIGTDqWZhdXQsIG9uIHV0aWxpc2UgbCdBUEkgUkVTVC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnpvbmx5XSAtIFBlcm1ldCBkZSBuZSByw6ljdXDDqXJlciBxdWUgbGVzIGFsdGl0dWRlcyBlbiBzb3J0aWUgcydpbCB2YXV0ICd0cnVlJy5cbiAqICAgICAgVmF1dCAnZmFsc2UnIHBhciBkw6lmYXV0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5yZXNvdXJjZV0gLSBSZXNvdXJjZSB1dGlsaXPDqWUgcG91ciByw6lhbGlzZXIgbGUgY2FsY3VsLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICBhcGlLZXkgOiBudWxsLFxuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHByb3h5VVJMIDogbnVsbCxcbiAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb25zIDogW3tsb246LCBsYXQ6fSwge2xvbjosIGxhdDp9XSxcbiAqICAgICAgb3V0cHV0Rm9ybWF0IDogJ2pzb24nIC8vIGpzb258eG1sXG4gKiAgICAgIHNhbXBsaW5nIDogMyxcbiAqICAgICAgYXBpIDogJ1JFU1QnLCAvLyBSRVNUfFdQU1xuICogICAgICB6b25seSA6IGZhbHNlIC8vIGZhbHNlfHRydWUsXG4gKiAgICAgIHJlc291cmNlIDogXCJyZXNvdXJjZS1wYXItZGVmYXV0XCJcbiAqICAgfTtcbiAqXG4gKi9cbmZ1bmN0aW9uIEFsdGkgKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQWx0aSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIkFsdGlcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vbSBkZSBsYSBjbGFzc2UgKGhlcml0YWdlKVxuICAgICAqIEZJWE1FIGluc3RhbmNlIG91IGNsYXNzZSA/XG4gICAgICovXG4gICAgdGhpcy5DTEFTU05BTUUgPSBcIkFsdGlcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBDb21tb25TZXJ2aWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5BbHRpXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpIChvcHRpb25zKV1cIik7XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBhbmFseXNlIGRlcyBvcHRpb25zXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICBpZiAoIW9wdGlvbnMucG9zaXRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicG9zaXRpb25zXCIpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9FTVBUWVwiLCBcInBvc2l0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLy8gYWpvdXQgZGVzIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2VcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zID0gb3B0aW9ucy5wb3NpdGlvbnM7XG5cbiAgICAvLyBmb3JtYXQgZGUgcsOpcG9uc2UgZHUgc2VydmljZSA6IFwianNvblwiIG91IFwieG1sXCIgKHZhbGV1ciBwYXIgZMOpZmF1dCksIGVuIG1pbnVzY3VsZSAhXG4gICAgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCA9ICh0eXBlb2Ygb3B0aW9ucy5vdXRwdXRGb3JtYXQgPT09IFwic3RyaW5nXCIpID8gb3B0aW9ucy5vdXRwdXRGb3JtYXQudG9Mb3dlckNhc2UoKSA6IFwieG1sXCI7XG5cbiAgICAvLyByZXNzb3VyY2UgdXRpbGlzw6llIHBvdXIgbGUgY2FsY3VsIGFsdGltw6l0cmlxdWVcbiAgICB0aGlzLm9wdGlvbnMucmVzb3VyY2UgPSBvcHRpb25zLnJlc291cmNlIHx8IFwicmdlX2FsdGlfY29yc2UyYV9mbG9hdDMyX3ppcF9sYW1iOTNcIjtcblxuICAgIC8vIHNhbXBsaW5nXG4gICAgdGhpcy5vcHRpb25zLnNhbXBsaW5nID0gb3B0aW9ucy5zYW1wbGluZyB8fCBudWxsO1xuXG4gICAgLy8gdHlwZSBkJ2FwaSB1dGlsaXPDqSBwb3VyIHJlcXVldGVyIGxlIHNlcnZpY2UsIGVuIG1hanVzY3VsZSAhXG4gICAgdGhpcy5vcHRpb25zLmFwaSA9ICh0eXBlb2Ygb3B0aW9ucy5hcGkgPT09IFwic3RyaW5nXCIpID8gb3B0aW9ucy5hcGkudG9VcHBlckNhc2UoKSA6IFwiUkVTVFwiO1xuXG4gICAgLy8gbCdhcGkgbmUgcGV1dCDDqnRyZSBpbnRlcnJvZ8OpZSBxdSdlbiBHRVQuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcGkgPT09IFwiUkVTVFwiKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5odHRwTWV0aG9kID0gXCJHRVRcIjtcbiAgICB9XG5cbiAgICAvLyBwYXJhbS4gem9ubHlcbiAgICB0aGlzLm9wdGlvbnMuem9ubHkgPSBvcHRpb25zLnpvbmx5IHx8IGZhbHNlO1xuXG4gICAgLy8gcGFyYW0uIG1lYXN1cmVzXG4gICAgdGhpcy5vcHRpb25zLm1lYXN1cmVzID0gb3B0aW9ucy5tZWFzdXJlcyB8fCBmYWxzZTtcblxuICAgIC8vIGdlc3Rpb24gZGUgbCd1cmwgZHUgc2VydmljZSBwYXIgZGVmYXV0XG4gICAgLy8gc2kgbCd1cmwgbidlc3QgcGFzIHJlbnNlaWduw6llLCBpbCBmYXV0IHV0aWxpc2VyIGxlcyB1cmxzIHBhciBkZWZhdXRcbiAgICAvLyBlbiBmb25jdGlvbiBkdSB0eXBlIGQnYXBpLCBSRVNUIG91IFdQUywgZHUgZm9ybWF0IGRlIHJlcG9uc2UgZGVtYW5kw6kgKG91dHB1dEZvcm1hdClcbiAgICAvLyBhaW5zaSBxdWUgc3VyIGxlIHR5cGUgZGUgc2VydmljZSAocHJvZmlsIG91IGVsZXZhdGlvbilcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgLy8gQ29kZSBjb21tZW50w6kgcG91ciBSZWxlYXNlIGJldGEgc2VydmljZXMgRElGRlVTSU9OIHVuaXF1ZW1lbnQgOiBvbiB0YXBlIHN1ciBsJ2FudmNpZW4gc2VydmljZSBkJ2FsdGlcbiAgICAgICAgLyogdmFyIGxzdFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkubmV3VXJsKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2xkQWx0aVNlcnZpY2UpIHtcbiAgICAgICAgICAgIGxzdFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKCk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgLy8gUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdhbHRpXG4gICAgICAgIHZhciBsc3RVcmxCeURlZmF1bHQgPSBEZWZhdWx0VXJsU2VydmljZS5BbHRpLnVybCgpO1xuICAgICAgICB2YXIgdXJsRm91bmQgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5hcGkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJXUFNcIjpcbiAgICAgICAgICAgICAgICB1cmxGb3VuZCA9IGxzdFVybEJ5RGVmYXVsdC53cHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUkVTVFwiOlxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAob3B0aW9ucy5zYW1wbGluZyA/IFwicHJvZmlsXCIgOiBcImVsZXZhdGlvblwiKSArIFwiLVwiICsgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdDtcbiAgICAgICAgICAgICAgICB1cmxGb3VuZCA9IGxzdFVybEJ5RGVmYXVsdFtrZXldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVU5LTk9XTlwiLCBcImFwaVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVybEZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVcmwgYnkgZGVmYXVsdCBub3QgZm91bmQgIVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VydmVyVXJsID0gdXJsRm91bmQ7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmVyIFVSTCBieSBkZWZhdWx0IDogXCIgKyB0aGlzLm9wdGlvbnMuc2VydmVyVXJsKTtcbiAgICB9XG5cbiAgICAvLyBnZXN0aW9uIGR1IHR5cGUgZGUgc2VydmljZVxuICAgIC8vIHNpIGwnZXh0ZW5zaW9uIGRlIGwndXJsIGVzdCAuanNvbiBvdSAueG1sLCBvbiBzdXJjaGFyZ2UgbGUgZm9ybWF0IGRlIHNvcnRpZSAob3V0cHV0Rm9ybWF0KVxuICAgIHZhciBpZHggPSB0aGlzLm9wdGlvbnMuc2VydmVyVXJsLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gdGhpcy5vcHRpb25zLnNlcnZlclVybC5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uLmxlbmd0aCA8IDUpIHsgLy8gRklYTUUgZXh0ZW5zaW9uIGRlIG1vaW5zIGRlIDQgY2FyLiAuLi5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmVyIEV4dGVuc2lvbiBVUkwgOiBcIiArIGV4dGVuc2lvbik7XG4gICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwieG1sXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQgPSBleHRlbnNpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBvZiBzZXJ2aWNlIDogdW5rbm93biBvciB1bnN1cHBvcnRlZCAoanNvbiBvciB4bWwpICFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBbHRpI1xuICovXG5BbHRpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qKlxuICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAqL1xuQWx0aS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbHRpO1xuXG4vKipcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZSAob3ZlcndyaXRlKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cbkFsdGkucHJvdG90eXBlLmJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIC8vIHV0aWxpc2F0aW9uIGVuIG1vZGUgY2FsbGJhY2tcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgaHR0cE1ldGhvZCA6IHRoaXMub3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBzYXV2ZWdhcmRlIGRlIGxhIHJlcXVldGUgIVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVzdWx0O1xuICAgICAgICAgICAgc3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMucmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IgOiBlcnJvcixcbiAgICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlIDpcbiAgICAgICAgcmVzb3VyY2UgOiB0aGlzLm9wdGlvbnMucmVzb3VyY2UsXG4gICAgICAgIHBvc2l0aW9ucyA6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsXG4gICAgICAgIG91dHB1dEZvcm1hdCA6IHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQsXG4gICAgICAgIHNhbXBsaW5nIDogdGhpcy5vcHRpb25zLnNhbXBsaW5nLFxuICAgICAgICBhcGkgOiB0aGlzLm9wdGlvbnMuYXBpLFxuICAgICAgICB6b25seSA6IHRoaXMub3B0aW9ucy56b25seSxcbiAgICAgICAgbWVhc3VyZXMgOiB0aGlzLm9wdGlvbnMubWVhc3VyZXNcbiAgICB9O1xuXG4gICAgQWx0aVJlcXVlc3RGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBBbmFseXNlIGRlIGxhIHJlcG9uc2UgKG92ZXJ3cml0ZSlcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICovXG5BbHRpLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAvLyBJTkZPXG4gICAgLy8gRmFjdG9yeSBwb3VyIG1hc3F1ZXIgbGEgY29tcGxleGl0w6kgZHUgcmV0b3VyIGR1IHNlcnZpY2UgcXVpIHJlbnZvaWUgc29pdFxuICAgIC8vICAtIHVuZSAnc3RyaW5nJyBxdWkgY29udGllbnQgZHUgWE1MIG91IEpTT04gbmF0aWYgZW4gbW9kZSBYSFJcbiAgICAvLyAgLSB1biBvYmpldCBKU09OIHF1aSBlc3QgbmF0aWYgb3UgZW5jYXBzdWzDqVxuXG4gICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICByZXNwb25zZSA6IHRoaXMucmVzcG9uc2UsXG4gICAgICAgICAgICBvdXRwdXRGb3JtYXQgOiB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0LCAvLyB1dGlsZSBwb3VyIHBhcnNlciBsYSBzdHJpbmcgZW4gbW9kZSBYSFIgOiBKU09OIG91IFhNTCAhXG4gICAgICAgICAgICByYXdSZXNwb25zZSA6IHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgIG9uRXJyb3IgOiBlcnJvcixcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IHN1Y2Nlc3MsXG4gICAgICAgICAgICBzY29wZSA6IHRoaXNcbiAgICAgICAgfTtcblxuICAgICAgICBBbHRpUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yLmNhbGwodGhpcywgbmV3IEVycm9yU2VydmljZShfLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VNUFRZXCIpKSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Alti.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Formats/AltiResponseReader.js": +/*!*********************************************************!*\ + !*** ./src/Services/Alti/Formats/AltiResponseReader.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Response/model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Response/model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\n/* harmony import */ var _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Response/model/Measure */ \"./src/Services/Alti/Response/model/Measure.js\");\n/**\n * Fonction retournant un objet contenant des clés de lecture (readers)\n * qui permettent de parser des réponses XML du service Altimétrique du Géoportail\n * (calcul altimétrique simple ou profil altimétrique d'une courbe),\n * lorsque le paramètre output = xml,\n * afin de récupérer les élévations retournées.\n *\n * @module AltiResponseReader\n * @alias Gp.Services.Alti.Formats.AltiResponseReader\n * @private\n */\n\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\n\n/**\n *\n * Objet AltiResponseReader\n *\n * @member {Object} AltiResponseReader\n *\n * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées \"readers\"\n * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire\n * et la valeur associée est une fonction (node, data)\n * où node est un noeud du document DOM\n * et data est un objet où l'on stocke les informations lues dans le XML.\n *\n * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud \"elevations\" de la réponse XML\n * du service alti, correspondant logiquement à la racine du document\n * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)\n *\n * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud \"elevation\" de la réponse xml du service alti.\n * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc)\n *\n * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud \"lat\" de la réponse xml du service alti.\n * (contient une valeur de latitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud \"lon\" de la réponse xml du service alti.\n * (contient une valeur de longitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud \"z\" de la réponse xml du service alti.\n * (contient une valeur d'altitude, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud \"acc\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud \"measures\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud \"source_name\" de la réponse xml du service alti.\n * (pour remplir l'éventuel objet measure)\n *\n * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud \"source_mesure\" de la réponse xml du service alti.\n * (pour remplir l'éventuel objet measure)\n *\n * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud \"ExceptionReport\" de la réponse xml du service alti.\n *\n * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud \"Exception\" de la réponse xml du service alti.\n *\n * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,\n * à l'aide des readers de la classe.\n *\n */\nvar AltiResponseReader = {};\nAltiResponseReader.READERS = {\n /**\n * Lecture d'un noeud \"elevations\" de la réponse XML du service alti, correspondant logiquement à la racine du document\n * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée)\n *\n * @param {DOMElement} root - racine de la réponse XML\n * @static\n * @memberof AltiResponseReader\n * @returns {Object} Retourne un objet de type AltiResponse\n */\n elevations: function elevations(root) {\n // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir.\n var altiResponse = new _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n if (root.hasChildNodes()) {\n var children = root.childNodes;\n var child;\n var elevation;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (AltiResponseReader.READERS[child.nodeName]) {\n elevation = AltiResponseReader.READERS[child.nodeName](child);\n altiResponse.elevations.push(elevation);\n }\n }\n }\n return altiResponse;\n },\n /**\n * Lecture d'un noeud \"elevation\" de la réponse xml du service alti.\n * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures)\n *\n * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures])\n * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse\n * @static\n * @memberof AltiResponseReader\n */\n elevation: function elevation(node) {\n var elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (AltiResponseReader.READERS[child.nodeName]) {\n // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.\n AltiResponseReader.READERS[child.nodeName](child, elevation);\n }\n }\n }\n return elevation;\n },\n /**\n * Lecture d'un noeud \"lat\" de la réponse xml du service alti.\n * (contient une valeur de latitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la latitude\n * @param {Object} elevation - objet dans lequel stocker la latitude retournée\n * @static\n * @memberof AltiResponseReader\n */\n lat: function lat(node, elevation) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevation.lat = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : latitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"lon\" de la réponse xml du service alti.\n * (contient une valeur de longitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la longitude\n * @param {Object} elevation - objet dans lequel stocker la longitude retournée\n * @static\n * @memberof AltiResponseReader\n */\n lon: function lon(node, elevation) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevation.lon = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : longitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"z\" de la réponse xml du service alti.\n * (contient une valeur d'altitude, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'altitude\n * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure\n * @static\n * @memberof AltiResponseReader\n */\n z: function z(node, elevationObject) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n if (elevationObject) {\n elevationObject.z = parseFloat(textNode.nodeValue);\n } else {\n elevationObject = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n elevationObject.z = parseFloat(textNode.nodeValue);\n return elevationObject;\n }\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : altitude attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"acc\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure\n * @static\n * @memberof AltiResponseReader\n */\n acc: function acc(node, elevationObject) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n elevationObject.acc = parseFloat(textNode.nodeValue);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"source_name\" de la réponse xml du service alti.\n * (contient le nom de la source, qui est un string)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} measure - objet dans lequel stocker le nom de la source retourné\n * @static\n * @memberof AltiResponseReader\n */\n source_name: function source_name(node, measure) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n measure.source_name = textNode.nodeValue;\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : source_name attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"source_measure\" de la réponse xml du service alti.\n * (contient le nom de la mesure, qui est un string)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} measure - objet dans lequel stocker le nom de la source retourné\n * @static\n * @memberof AltiResponseReader\n */\n source_measure: function source_measure(node, measure) {\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n measure.source_measure = textNode.nodeValue;\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : source_measure attendue mais absente\");\n }\n },\n /**\n * Lecture d'un noeud \"measures\" et de ses enfants \"measure\" de la réponse xml du service alti.\n * (contient une valeur de précision, qui est un flottant)\n *\n * @param {DOMElement} node - noeud à lire pour récupérer la précision\n * @param {Object} elevation - objet dans lequel stocker la précision retournée\n * @static\n * @memberof AltiResponseReader\n */\n measures: function measures(node, elevation) {\n elevation.measures = [];\n var measure;\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var measureNode;\n var measureChildren;\n for (var i = 0; i < children.length; i++) {\n measure = new _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n measureNode = children[i];\n measureChildren = measureNode.childNodes;\n for (var j = 0; j < measureChildren.length; j++) {\n if (AltiResponseReader.READERS[measureChildren[j].nodeName]) {\n // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir.\n AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure);\n } else {\n throw new Error(\"Erreur dans la lecture de la réponse du service : measures attendues mais absentes\");\n }\n }\n elevation.measures.push(measure);\n }\n }\n },\n /**\n * Lecture d'un noeud \"ExceptionReport\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} exceptionReport - objet contenant l'exception\n * @static\n * @memberof AltiResponseReader\n */\n exceptionreport: function exceptionreport(node) {\n var response = {};\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.nodeName === \"Exception\") {\n response.exceptionReport = AltiResponseReader.READERS.exception(child);\n }\n }\n }\n return response;\n },\n /**\n * Lecture d'un noeud \"Exception\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs :\n * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception\n * {String} exceptionReport.exception - qui contient le message de l'exception\n * @static\n * @memberof AltiResponseReader\n */\n exception: function exception(node) {\n var exceptionReport = {};\n\n // get exception code\n var exceptionCode = node.getAttribute(\"exceptionCode\");\n if (exceptionCode) {\n exceptionReport.exceptionCode = exceptionCode;\n }\n\n // get exception message\n var textNode = node.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n exceptionReport.exception = textNode.nodeValue;\n }\n return exceptionReport;\n },\n /**\n * Lecture d'un noeud \"Error\" de la réponse xml du service alti.\n *\n * @param {DOMElement} node - noeud à lire pour récupérer l'exception\n * @return {Object} error - objet contenant l'exception\n * @static\n */\n error: function error(node) {\n var response = {\n error: {}\n };\n // get error code and description\n if (node.hasChildNodes()) {\n var children = node.childNodes;\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n var textNode;\n // get error code\n if (child.nodeType === 1 && child.nodeName === \"code\") {\n // 1 === node.ELEMENT_NODE\n textNode = child.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n response.error.code = textNode.nodeValue;\n }\n }\n // get error description\n if (child.nodeType === 1 && child.nodeName === \"description\") {\n // 1 === node.ELEMENT_NODE\n textNode = child.firstChild;\n if (textNode && textNode.nodeType === 3) {\n // 3 === node.TEXT_NODE\n response.error.description = textNode.nodeValue;\n }\n }\n }\n }\n return response;\n }\n};\n\n/**\n * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique,\n * à l'aide des readers de la classe.\n *\n * @method AltiResponseReader.read\n * @param {DOMElement} root - racine de la réponse XML à lire\n * @static\n * @memberof AltiResponseReader\n */\nAltiResponseReader.read = function (root) {\n if (root.nodeName === \"elevations\") {\n var altiResponse = AltiResponseReader.READERS.elevations(root);\n return altiResponse;\n } else if (root.nodeName === \"ExceptionReport\") {\n var exceptionReport = AltiResponseReader.READERS.exceptionreport(root);\n return exceptionReport;\n } else if (root.nodeName === \"error\") {\n var error = AltiResponseReader.READERS.error(root);\n return error;\n } else {\n throw new Error(\"Erreur lors de la lecture de la réponse : elle n'est pas au format attendu.\");\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponseReader);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyLmpzPzNlYTAiXSwibmFtZXMiOlsiQWx0aVJlc3BvbnNlUmVhZGVyIiwiUkVBREVSUyIsImVsZXZhdGlvbnMiLCJyb290IiwiYWx0aVJlc3BvbnNlIiwiQWx0aVJlc3BvbnNlIiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkcmVuIiwiY2hpbGROb2RlcyIsImNoaWxkIiwiZWxldmF0aW9uIiwiaSIsImxlbmd0aCIsIm5vZGVOYW1lIiwicHVzaCIsIm5vZGUiLCJFbGV2YXRpb24iLCJsYXQiLCJ0ZXh0Tm9kZSIsImZpcnN0Q2hpbGQiLCJub2RlVHlwZSIsInBhcnNlRmxvYXQiLCJub2RlVmFsdWUiLCJFcnJvciIsImxvbiIsInoiLCJlbGV2YXRpb25PYmplY3QiLCJhY2MiLCJzb3VyY2VfbmFtZSIsIm1lYXN1cmUiLCJzb3VyY2VfbWVhc3VyZSIsIm1lYXN1cmVzIiwibWVhc3VyZU5vZGUiLCJtZWFzdXJlQ2hpbGRyZW4iLCJNZWFzdXJlIiwiaiIsImV4Y2VwdGlvbnJlcG9ydCIsInJlc3BvbnNlIiwiZXhjZXB0aW9uUmVwb3J0IiwiZXhjZXB0aW9uIiwiZXhjZXB0aW9uQ29kZSIsImdldEF0dHJpYnV0ZSIsImVycm9yIiwiY29kZSIsImRlc2NyaXB0aW9uIiwicmVhZCJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQzBEO0FBQ047QUFDSjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QVk7RUFDdkIsQ0FBQyxNQUFNLElBQUlELElBQUksQ0FBQ1UsUUFBUSxLQUFLLGlCQUFpQixFQUFFO0lBQzVDLElBQUl5QixlQUFlLEdBQUd0QyxrQkFBa0IsQ0FBQ0MsT0FBTyxDQUFDbUMsZUFBZSxDQUFDakMsSUFBSSxDQUFDO0lBQ3RFLE9BQU9tQyxlQUFlO0VBQzFCLENBQUMsTUFBTSxJQUFJbkMsSUFBSSxDQUFDVSxRQUFRLEtBQUssT0FBTyxFQUFFO0lBQ2xDLElBQUk2QixLQUFLLEdBQUcxQyxrQkFBa0IsQ0FBQ0MsT0FBTyxDQUFDeUMsS0FBSyxDQUFDdkMsSUFBSSxDQUFDO0lBQ2xELE9BQU91QyxLQUFLO0VBQ2hCLENBQUMsTUFBTTtJQUNILE1BQU0sSUFBSW5CLEtBQUssQ0FBQyw2RUFBNkUsQ0FBQztFQUNsRztBQUNKLENBQUM7QUFFY3ZCLGlGQUFrQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEZvbmN0aW9uIHJldG91cm5hbnQgdW4gb2JqZXQgY29udGVuYW50IGRlcyBjbMOpcyBkZSBsZWN0dXJlIChyZWFkZXJzKVxuICogICAgICBxdWkgcGVybWV0dGVudCBkZSBwYXJzZXIgZGVzIHLDqXBvbnNlcyBYTUwgZHUgc2VydmljZSBBbHRpbcOpdHJpcXVlIGR1IEfDqW9wb3J0YWlsXG4gKiAgICAgIChjYWxjdWwgYWx0aW3DqXRyaXF1ZSBzaW1wbGUgb3UgcHJvZmlsIGFsdGltw6l0cmlxdWUgZCd1bmUgY291cmJlKSxcbiAqICAgICAgbG9yc3F1ZSBsZSBwYXJhbcOodHJlIG91dHB1dCA9IHhtbCxcbiAqICAgICAgYWZpbiBkZSByw6ljdXDDqXJlciBsZXMgw6lsw6l2YXRpb25zIHJldG91cm7DqWVzLlxuICpcbiAqIEBtb2R1bGUgQWx0aVJlc3BvbnNlUmVhZGVyXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5Gb3JtYXRzLkFsdGlSZXNwb25zZVJlYWRlclxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2UgZnJvbSBcIi4uL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi4vUmVzcG9uc2UvbW9kZWwvRWxldmF0aW9uXCI7XG5pbXBvcnQgTWVhc3VyZSBmcm9tIFwiLi4vUmVzcG9uc2UvbW9kZWwvTWVhc3VyZVwiO1xuXG4vKipcbiAqXG4gKiBPYmpldCBBbHRpUmVzcG9uc2VSZWFkZXJcbiAqXG4gKiBAbWVtYmVyIHtPYmplY3R9IEFsdGlSZXNwb25zZVJlYWRlclxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUyAtIE9iamV0IGNvbnRlbmFudCBkZXMgZm9uY3Rpb25zIGRlIGxlY3R1cmUsIGFwcGVsw6llcyBcInJlYWRlcnNcIlxuICogICAgICBkb250IGNoYXF1ZSBjbMOpIGNvcnJlc3BvbmQgYXUgbm9tIGQndW4gdGFnIGR1IFhNTCBxdWUgbCdvbiBzb3VoYWl0ZSBsaXJlXG4gKiAgICAgIGV0IGxhIHZhbGV1ciBhc3NvY2nDqWUgZXN0IHVuZSBmb25jdGlvbiAobm9kZSwgZGF0YSlcbiAqICAgICAgb8O5IG5vZGUgZXN0IHVuIG5vZXVkIGR1IGRvY3VtZW50IERPTVxuICogICAgICBldCBkYXRhIGVzdCB1biBvYmpldCBvw7kgbCdvbiBzdG9ja2UgbGVzIGluZm9ybWF0aW9ucyBsdWVzIGRhbnMgbGUgWE1MLlxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5lbGV2YXRpb25zIC0gIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvbnNcIiBkZSBsYSByw6lwb25zZSBYTUxcbiAqICAgICAgZHUgc2VydmljZSBhbHRpLCBjb3JyZXNwb25kYW50IGxvZ2lxdWVtZW50IMOgIGxhIHJhY2luZSBkdSBkb2N1bWVudFxuICogICAgICAoY29udGllbnQgdW4gb3UgcGx1c2lldXJzIGNoaWxkTm9kZXMgY29ycmVzcG9uZGFudCBjaGFjdW4gw6AgdW5lIMOpbMOpdmF0aW9uIHJldG91cm7DqWUpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmVsZXZhdGlvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChjb250aWVudCB1biBvdSA0IGNoaWxkTm9kZSAocykgY29ycmVzcG9uZGFudCDDoCBsJ2FsdGl0dWRlICh6KSBldCDDqXZlbnR1ZWxsZW1lbnQgbGF0LCBsb24sIGV0IGFjYylcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMubGF0IC0gTGVjdHVyZSBkJ3VuIG5vZXVkIFwibGF0XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgbGF0aXR1ZGUsIHF1aSBlc3QgdW4gZmxvdHRhbnQpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmxvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcImxvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGRlIGxvbmdpdHVkZSwgcXVpIGVzdCB1biBmbG90dGFudClcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMueiAtIExlY3R1cmUgZCd1biBub2V1ZCBcInpcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkJ2FsdGl0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5hY2MgLSBMZWN0dXJlIGQndW4gbm9ldWQgXCJhY2NcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkZSBwcsOpY2lzaW9uLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICpcbiAqIEBwcm9wZXJ0eSB7TWV0aG9kfSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5tZWFzdXJlcyAtIExlY3R1cmUgZCd1biBub2V1ZCBcIm1lYXN1cmVzXCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgcHLDqWNpc2lvbiwgcXVpIGVzdCB1biBmbG90dGFudClcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuc291cmNlX25hbWUgLSBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbmFtZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKiAgICAgIChwb3VyIHJlbXBsaXIgbCfDqXZlbnR1ZWwgb2JqZXQgbWVhc3VyZSlcbiAqXG4gKiBAcHJvcGVydHkge01ldGhvZH0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuc291cmNlX21lc3VyZSAtIExlY3R1cmUgZCd1biBub2V1ZCBcInNvdXJjZV9tZXN1cmVcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICogICAgICAocG91ciByZW1wbGlyIGwnw6l2ZW50dWVsIG9iamV0IG1lYXN1cmUpXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbnJlcG9ydCAtIExlY3R1cmUgZCd1biBub2V1ZCBcIkV4Y2VwdGlvblJlcG9ydFwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbiAtIExlY3R1cmUgZCd1biBub2V1ZCBcIkV4Y2VwdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gKlxuICogQHByb3BlcnR5IHtNZXRob2R9IEFsdGlSZXNwb25zZVJlYWRlci5yZWFkIC0gTcOpdGhvZGUgcGVybWV0dGFudCBkZSBsYW5jZXIgbGEgbGVjdHVyZSBkJ3VuZSByw6lwb25zZSBYTUwgZHUgc2VydmljZSBhbHRpbcOpdHJpcXVlLFxuICogICAgICDDoCBsJ2FpZGUgZGVzIHJlYWRlcnMgZGUgbGEgY2xhc3NlLlxuICpcbiAqL1xudmFyIEFsdGlSZXNwb25zZVJlYWRlciA9IHt9O1xuXG5BbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUyA9IHtcblxuICAgIC8qKlxuICAgICAqIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvbnNcIiBkZSBsYSByw6lwb25zZSBYTUwgZHUgc2VydmljZSBhbHRpLCBjb3JyZXNwb25kYW50IGxvZ2lxdWVtZW50IMOgIGxhIHJhY2luZSBkdSBkb2N1bWVudFxuICAgICAqICAgICAgKGNvbnRpZW50IHVuIG91IHBsdXNpZXVycyBjaGlsZE5vZGVzIGNvcnJlc3BvbmRhbnQgY2hhY3VuIMOgIHVuZSDDqWzDqXZhdGlvbiByZXRvdXJuw6llKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290IC0gcmFjaW5lIGRlIGxhIHLDqXBvbnNlIFhNTFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0b3VybmUgdW4gb2JqZXQgZGUgdHlwZSBBbHRpUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbGV2YXRpb25zIDogZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgICAgLy8gSU5GTyA6IG9uIHBhc3NlIGVuIHBhcmFtw6h0cmUgbCdvYmpldCBlbiBlbnRyw6llIGVsZXZhdGlvbnMsIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgIHZhciBhbHRpUmVzcG9uc2UgPSBuZXcgQWx0aVJlc3BvbnNlKCk7XG5cbiAgICAgICAgaWYgKHJvb3QuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSByb290LmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICB2YXIgZWxldmF0aW9uO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgICAgIGlmIChBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSU1tjaGlsZC5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uID0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlNbY2hpbGQubm9kZU5hbWVdKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMucHVzaChlbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbHRpUmVzcG9uc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExlY3R1cmUgZCd1biBub2V1ZCBcImVsZXZhdGlvblwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgdW4gb3UgNSBjaGlsZE5vZGUgKHMpIGNvcnJlc3BvbmRhbnQgw6AgbCdhbHRpdHVkZSAoeikgZXQgw6l2ZW50dWVsbGVtZW50IGxhdCwgbG9uLCBhY2MgZXQgbWVhc3VyZXMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCBlbGV2YXRpb24gw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgbCfDqWzDqXZhdGlvbiByZXRvdXJuw6llICh6IFssIGxvbiwgbGF0LCBhY2MsIG1lYXN1cmVzXSlcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gZWxldmF0aW9uUmVzcG9uc2UgLSBmb3JtYXQgZGUgbGEgcsOpcG9uc2UgZW4gc29ydGllLCBpbnN0YW5jZSBkZSBBbHRpUmVzcG9uc2VcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGVsZXZhdGlvbiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBlbGV2YXRpb24gPSBuZXcgRWxldmF0aW9uKCk7XG5cbiAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlNbY2hpbGQubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElORk8gOiBvbiBwYXNzZSBlbiBwYXJhbcOodHJlIGwnb2JqZXQgZW4gZW50csOpZSBlbGV2YXRpb24sIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgICAgICAgICAgICAgIEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTW2NoaWxkLm5vZGVOYW1lXShjaGlsZCwgZWxldmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXZhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGVjdHVyZSBkJ3VuIG5vZXVkIFwibGF0XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAgICAgKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGRlIGxhdGl0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIGxhdGl0dWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZXZhdGlvbiAtIG9iamV0IGRhbnMgbGVxdWVsIHN0b2NrZXIgbGEgbGF0aXR1ZGUgcmV0b3VybsOpZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgbGF0IDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbikge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgZWxldmF0aW9uLmxhdCA9IHBhcnNlRmxvYXQodGV4dE5vZGUubm9kZVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IGxhdGl0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJsb25cIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgbG9uZ2l0dWRlLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIGxvbmdpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGV2YXRpb24gLSBvYmpldCBkYW5zIGxlcXVlbCBzdG9ja2VyIGxhIGxvbmdpdHVkZSByZXRvdXJuw6llXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAgICAgKi9cbiAgICBsb24gOiBmdW5jdGlvbiAobm9kZSwgZWxldmF0aW9uKSB7XG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICBlbGV2YXRpb24ubG9uID0gcGFyc2VGbG9hdCh0ZXh0Tm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyZXVyIGRhbnMgbGEgbGVjdHVyZSBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIDogbG9uZ2l0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJ6XCIgZGUgbGEgcsOpcG9uc2UgeG1sIGR1IHNlcnZpY2UgYWx0aS5cbiAgICAgKiAgICAgIChjb250aWVudCB1bmUgdmFsZXVyIGQnYWx0aXR1ZGUsIHF1aSBlc3QgdW4gZmxvdHRhbnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbCdhbHRpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGV2YXRpb25PYmplY3QgLSBvYmpldCBkYW5zIGxlcXVlbCBzdG9ja2VyIGwnYWx0aXR1ZGUgcmV0b3VybsOpZSA6IGVsZXZhdGlvbiBvdSBtZWFzdXJlXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAgICAgKi9cbiAgICB6IDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbk9iamVjdCkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgaWYgKGVsZXZhdGlvbk9iamVjdCkge1xuICAgICAgICAgICAgICAgIGVsZXZhdGlvbk9iamVjdC56ID0gcGFyc2VGbG9hdCh0ZXh0Tm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGV2YXRpb25PYmplY3QgPSBuZXcgRWxldmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgZWxldmF0aW9uT2JqZWN0LnogPSBwYXJzZUZsb2F0KHRleHROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZXZhdGlvbk9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IGFsdGl0dWRlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJhY2NcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqICAgICAgKGNvbnRpZW50IHVuZSB2YWxldXIgZGUgcHLDqWNpc2lvbiwgcXVpIGVzdCB1biBmbG90dGFudClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZSAtIG5vZXVkIMOgIGxpcmUgcG91ciByw6ljdXDDqXJlciBsYSBwcsOpY2lzaW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZXZhdGlvbk9iamVjdCAtIG9iamV0IGRhbnMgbGVxdWVsIHN0b2NrZXIgbGEgcHLDqWNpc2lvbiByZXRvdXJuw6llIDogZWxldmF0aW9uIG91IG1lYXN1cmVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGFjYyA6IGZ1bmN0aW9uIChub2RlLCBlbGV2YXRpb25PYmplY3QpIHtcbiAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGV4dE5vZGUgJiYgdGV4dE5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gMyA9PT0gbm9kZS5URVhUX05PREVcbiAgICAgICAgICAgIGVsZXZhdGlvbk9iamVjdC5hY2MgPSBwYXJzZUZsb2F0KHRleHROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJldXIgZGFucyBsYSBsZWN0dXJlIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBwcsOpY2lzaW9uIChhY2MpIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbmFtZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgbGUgbm9tIGRlIGxhIHNvdXJjZSwgcXVpIGVzdCB1biBzdHJpbmcpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbGEgcHLDqWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZWFzdXJlIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsZSBub20gZGUgbGEgc291cmNlIHJldG91cm7DqVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgc291cmNlX25hbWUgOiBmdW5jdGlvbiAobm9kZSwgbWVhc3VyZSkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgbWVhc3VyZS5zb3VyY2VfbmFtZSA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IHNvdXJjZV9uYW1lIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJzb3VyY2VfbWVhc3VyZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgbGUgbm9tIGRlIGxhIG1lc3VyZSwgcXVpIGVzdCB1biBzdHJpbmcpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbGEgcHLDqWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZWFzdXJlIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsZSBub20gZGUgbGEgc291cmNlIHJldG91cm7DqVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyb2YgQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICovXG4gICAgc291cmNlX21lYXN1cmUgOiBmdW5jdGlvbiAobm9kZSwgbWVhc3VyZSkge1xuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMykgeyAvLyAzID09PSBub2RlLlRFWFRfTk9ERVxuICAgICAgICAgICAgbWVhc3VyZS5zb3VyY2VfbWVhc3VyZSA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBkYW5zIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSA6IHNvdXJjZV9tZWFzdXJlIGF0dGVuZHVlIG1haXMgYWJzZW50ZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJtZWFzdXJlc1wiIGV0IGRlIHNlcyBlbmZhbnRzIFwibWVhc3VyZVwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICogICAgICAoY29udGllbnQgdW5lIHZhbGV1ciBkZSBwcsOpY2lzaW9uLCBxdWkgZXN0IHVuIGZsb3R0YW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGxhIHByw6ljaXNpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxldmF0aW9uIC0gb2JqZXQgZGFucyBsZXF1ZWwgc3RvY2tlciBsYSBwcsOpY2lzaW9uIHJldG91cm7DqWVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIG1lYXN1cmVzIDogZnVuY3Rpb24gKG5vZGUsIGVsZXZhdGlvbikge1xuICAgICAgICBlbGV2YXRpb24ubWVhc3VyZXMgPSBbXTtcbiAgICAgICAgdmFyIG1lYXN1cmU7XG4gICAgICAgIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgdmFyIG1lYXN1cmVOb2RlO1xuICAgICAgICAgICAgdmFyIG1lYXN1cmVDaGlsZHJlbjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtZWFzdXJlID0gbmV3IE1lYXN1cmUoKTtcbiAgICAgICAgICAgICAgICBtZWFzdXJlTm9kZSA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIG1lYXN1cmVDaGlsZHJlbiA9IG1lYXN1cmVOb2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtZWFzdXJlQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTW21lYXN1cmVDaGlsZHJlbltqXS5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElORk8gOiBvbiBwYXNzZSBlbiBwYXJhbcOodHJlIGwnb2JqZXQgZW4gZW50csOpZSBlbGV2YXRpb24sIHZpZGUsIMOgIHJlbXBsaXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSU1ttZWFzdXJlQ2hpbGRyZW5bal0ubm9kZU5hbWVdKG1lYXN1cmVDaGlsZHJlbltqXSwgbWVhc3VyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJldXIgZGFucyBsYSBsZWN0dXJlIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBtZWFzdXJlcyBhdHRlbmR1ZXMgbWFpcyBhYnNlbnRlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGV2YXRpb24ubWVhc3VyZXMucHVzaChtZWFzdXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFeGNlcHRpb25SZXBvcnRcIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGwnZXhjZXB0aW9uXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBleGNlcHRpb25SZXBvcnQgLSBvYmpldCBjb250ZW5hbnQgbCdleGNlcHRpb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGV4Y2VwdGlvbnJlcG9ydCA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciByZXNwb25zZSA9IHt9O1xuXG4gICAgICAgIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgdmFyIGNoaWxkO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lID09PSBcIkV4Y2VwdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmV4Y2VwdGlvblJlcG9ydCA9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbihjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFeGNlcHRpb25cIiBkZSBsYSByw6lwb25zZSB4bWwgZHUgc2VydmljZSBhbHRpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIC0gbm9ldWQgw6AgbGlyZSBwb3VyIHLDqWN1cMOpcmVyIGwnZXhjZXB0aW9uXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBleGNlcHRpb25SZXBvcnQgLSBvYmpldCBjb250ZW5hbnQgbCdleGNlcHRpb24sIGF2ZWMgZGV1eCBhdHRyaWJ1dHMgOlxuICAgICAqICAgICAge1N0cmluZ30gZXhjZXB0aW9uUmVwb3J0LmV4Y2VwdGlvbkNvZGUgLSBxdWkgY29udGllbnQgbCdpZGVudGlmaWFudCBkdSBjb2RlIGRlIGwnZXhjZXB0aW9uXG4gICAgICogICAgICB7U3RyaW5nfSBleGNlcHRpb25SZXBvcnQuZXhjZXB0aW9uIC0gcXVpIGNvbnRpZW50IGxlIG1lc3NhZ2UgZGUgbCdleGNlcHRpb25cbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIEFsdGlSZXNwb25zZVJlYWRlclxuICAgICAqL1xuICAgIGV4Y2VwdGlvbiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBleGNlcHRpb25SZXBvcnQgPSB7fTtcblxuICAgICAgICAvLyBnZXQgZXhjZXB0aW9uIGNvZGVcbiAgICAgICAgdmFyIGV4Y2VwdGlvbkNvZGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImV4Y2VwdGlvbkNvZGVcIik7XG4gICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7XG4gICAgICAgICAgICBleGNlcHRpb25SZXBvcnQuZXhjZXB0aW9uQ29kZSA9IGV4Y2VwdGlvbkNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgZXhjZXB0aW9uIG1lc3NhZ2VcbiAgICAgICAgdmFyIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICBpZiAodGV4dE5vZGUgJiYgdGV4dE5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gMyA9PT0gbm9kZS5URVhUX05PREVcbiAgICAgICAgICAgIGV4Y2VwdGlvblJlcG9ydC5leGNlcHRpb24gPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhjZXB0aW9uUmVwb3J0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMZWN0dXJlIGQndW4gbm9ldWQgXCJFcnJvclwiIGRlIGxhIHLDqXBvbnNlIHhtbCBkdSBzZXJ2aWNlIGFsdGkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgLSBub2V1ZCDDoCBsaXJlIHBvdXIgcsOpY3Vww6lyZXIgbCdleGNlcHRpb25cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGVycm9yIC0gb2JqZXQgY29udGVuYW50IGwnZXhjZXB0aW9uXG4gICAgICogQHN0YXRpY1xuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgZXJyb3IgOiB7fVxuICAgICAgICB9O1xuICAgICAgICAvLyBnZXQgZXJyb3IgY29kZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICB2YXIgdGV4dE5vZGU7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGVycm9yIGNvZGVcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgY2hpbGQubm9kZU5hbWUgPT09IFwiY29kZVwiKSB7IC8vIDEgPT09IG5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gY2hpbGQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvci5jb2RlID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGdldCBlcnJvciBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiBjaGlsZC5ub2RlTmFtZSA9PT0gXCJkZXNjcmlwdGlvblwiKSB7IC8vIDEgPT09IG5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gY2hpbGQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHROb2RlICYmIHRleHROb2RlLm5vZGVUeXBlID09PSAzKSB7IC8vIDMgPT09IG5vZGUuVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvci5kZXNjcmlwdGlvbiA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgbGFuY2VyIGxhIGxlY3R1cmUgZCd1bmUgcsOpcG9uc2UgWE1MIGR1IHNlcnZpY2UgYWx0aW3DqXRyaXF1ZSxcbiAqICAgICAgw6AgbCdhaWRlIGRlcyByZWFkZXJzIGRlIGxhIGNsYXNzZS5cbiAqXG4gKiBAbWV0aG9kIEFsdGlSZXNwb25zZVJlYWRlci5yZWFkXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3QgLSByYWNpbmUgZGUgbGEgcsOpcG9uc2UgWE1MIMOgIGxpcmVcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBBbHRpUmVzcG9uc2VSZWFkZXJcbiAqL1xuQWx0aVJlc3BvbnNlUmVhZGVyLnJlYWQgPSBmdW5jdGlvbiAocm9vdCkge1xuICAgIGlmIChyb290Lm5vZGVOYW1lID09PSBcImVsZXZhdGlvbnNcIikge1xuICAgICAgICB2YXIgYWx0aVJlc3BvbnNlID0gQWx0aVJlc3BvbnNlUmVhZGVyLlJFQURFUlMuZWxldmF0aW9ucyhyb290KTtcbiAgICAgICAgcmV0dXJuIGFsdGlSZXNwb25zZTtcbiAgICB9IGVsc2UgaWYgKHJvb3Qubm9kZU5hbWUgPT09IFwiRXhjZXB0aW9uUmVwb3J0XCIpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvblJlcG9ydCA9IEFsdGlSZXNwb25zZVJlYWRlci5SRUFERVJTLmV4Y2VwdGlvbnJlcG9ydChyb290KTtcbiAgICAgICAgcmV0dXJuIGV4Y2VwdGlvblJlcG9ydDtcbiAgICB9IGVsc2UgaWYgKHJvb3Qubm9kZU5hbWUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICB2YXIgZXJyb3IgPSBBbHRpUmVzcG9uc2VSZWFkZXIuUkVBREVSUy5lcnJvcihyb290KTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIGxlY3R1cmUgZGUgbGEgcsOpcG9uc2UgOiBlbGxlIG4nZXN0IHBhcyBhdSBmb3JtYXQgYXR0ZW5kdS5cIik7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlc3BvbnNlUmVhZGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Alti/Formats/AltiResponseReader.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/AltiRequestFactory.js": +/*!*********************************************************!*\ + !*** ./src/Services/Alti/Request/AltiRequestFactory.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AltiRequestREST */ \"./src/Services/Alti/Request/AltiRequestREST.js\");\n/* harmony import */ var _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AltiRequestWPS */ \"./src/Services/Alti/Request/AltiRequestWPS.js\");\n/**\n * Creation d'une requête en REST ou WPS\n * (Factory)\n *\n * @module AltiRequestFactory\n * @alias Gp.Services.Alti.Request.AltiRequestFactory\n * @private\n */\n\n\n\n\nvar AltiRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * httpMethod : 'GET', // GET|POST\n * onSuccess : function (response) {},\n * onError : function (error) {},\n * scope : this,\n * positions : [{lon:, lat:}, {lon:, lat:}],\n * outputFormat : 'json' // json|xml\n * sampling : 3,\n * api : 'REST', // REST|WPS\n * zonly : false // false|true\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestFactory\");\n logger.trace([\"AltiRequestFactory::build()\"]);\n var request = null;\n\n // on factorise les options par groupe;\n // - global,\n // - param, les params pour les data inputs\n // - wps, les param du service\n // - callback\n\n var settings = {\n // ajout des valeurs par defaut spécifiques au service\n type: options.sampling ? \"Profil\" : \"Elevation\",\n method: options.httpMethod,\n param: {\n positions: null,\n delimiter: null,\n // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !?\n indent: null,\n // par defaut\n crs: null,\n // par defaut\n format: null,\n // (only to POST)\n sampling: null,\n // (only use by Profil)\n zonly: null,\n // (only use by Elevation)\n measures: null // (only use by Elevation)\n }\n };\n\n // surcharge des valeurs obligatoires\n settings.param.positions = options.positions;\n settings.param.format = options.outputFormat;\n settings.param.sampling = options.sampling;\n settings.param.zonly = options.zonly;\n settings.param.measures = options.measures;\n settings.param.resource = options.resource;\n\n // gestion des callback\n var bOnError = !!(options.onError !== null && typeof options.onError === \"function\"); // cast variable to boolean\n var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === \"function\");\n var message = null;\n switch (options.api) {\n case \"REST\":\n // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !\n var myReq = new _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n message = \"Error in process request (rest) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n request = myReq.requestString;\n break;\n case \"WPS\":\n // ajout des valeurs par defaut spécifiques au service WPS\n settings.wps = {\n service: null,\n // par defaut\n version: null,\n // par defaut\n identifier: null,\n // par defaut\n rawdataoutput: null,\n // par defaut\n request: null // par defaut\n };\n\n request = _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__[\"default\"].build(settings);\n if (!request) {\n message = \"Error in process request (wps) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n break;\n default:\n message = \"Type of API is not supported by service (REST or WPS) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n if (bOnSuccess) {\n options.onSuccess.call(options.scope, request);\n }\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RGYWN0b3J5LmpzP2Q0MDMiXSwibmFtZXMiOlsiQWx0aVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXF1ZXN0Iiwic2V0dGluZ3MiLCJ0eXBlIiwic2FtcGxpbmciLCJtZXRob2QiLCJodHRwTWV0aG9kIiwicGFyYW0iLCJwb3NpdGlvbnMiLCJkZWxpbWl0ZXIiLCJpbmRlbnQiLCJjcnMiLCJmb3JtYXQiLCJ6b25seSIsIm1lYXN1cmVzIiwib3V0cHV0Rm9ybWF0IiwicmVzb3VyY2UiLCJiT25FcnJvciIsIm9uRXJyb3IiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwibWVzc2FnZSIsImFwaSIsIm15UmVxIiwiQWx0aVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJFcnJvciIsInJlcXVlc3RTdHJpbmciLCJ3cHMiLCJzZXJ2aWNlIiwidmVyc2lvbiIsImlkZW50aWZpZXIiLCJyYXdkYXRhb3V0cHV0IiwiQWx0aVJlcXVlc3RXUFMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ29EO0FBQ1E7QUFDWjtBQUNGO0FBRTlDLElBQUlBLGtCQUFrQixHQUFHO0VBRXJCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsb0JB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TyxDQUFDUSxJQUFJLENBQUM5QixPQUFPLENBQUMrQixLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ1AsT0FBTyxDQUFDLENBQUM7WUFDOUQ7VUFDSjtVQUNBLE1BQU0sSUFBSVEsS0FBSyxDQUFDUixPQUFPLENBQUM7UUFDNUI7UUFDQTtNQUNKO1FBQ0lBLE9BQU8sR0FBRyx5REFBeUQ7UUFDbkUsSUFBSUosUUFBUSxFQUFFO1VBQ1ZyQixPQUFPLENBQUNzQixPQUFPLENBQUNRLElBQUksQ0FBQzlCLE9BQU8sQ0FBQytCLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDUCxPQUFPLENBQUMsQ0FBQztVQUM5RDtRQUNKO1FBQ0EsTUFBTSxJQUFJUSxLQUFLLENBQUNSLE9BQU8sQ0FBQztJQUNoQztJQUVBLElBQUlGLFVBQVUsRUFBRTtNQUNadkIsT0FBTyxDQUFDd0IsU0FBUyxDQUFDTSxJQUFJLENBQUM5QixPQUFPLENBQUMrQixLQUFLLEVBQUUxQixPQUFPLENBQUM7SUFDbEQ7SUFFQSxPQUFPQSxPQUFPO0VBQ2xCO0FBQ0osQ0FBQztBQUVjUCxpRkFBa0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L0FsdGlSZXF1ZXN0RmFjdG9yeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRpb24gZCd1bmUgcmVxdcOqdGUgZW4gUkVTVCBvdSBXUFNcbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgQWx0aVJlcXVlc3RGYWN0b3J5XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5SZXF1ZXN0LkFsdGlSZXF1ZXN0RmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IEFsdGlSZXF1ZXN0UkVTVCBmcm9tIFwiLi9BbHRpUmVxdWVzdFJFU1RcIjtcbmltcG9ydCBBbHRpUmVxdWVzdFdQUyBmcm9tIFwiLi9BbHRpUmVxdWVzdFdQU1wiO1xuXG52YXIgQWx0aVJlcXVlc3RGYWN0b3J5ID0ge1xuXG4gICAgLyoqXG4gICAgICogaW50ZXJmYWNlIHVuaXF1ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBidWlsZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZGVmaW5pZXMgZGFucyBsZSBjb21wb3NhbnQgQWx0aVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIHZhciBvcHRpb25zID0ge1xuICAgICAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICAgICAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAgICAgKiAgICAgIG9uRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICAgICAqICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAqICAgICAgcG9zaXRpb25zIDogW3tsb246LCBsYXQ6fSwge2xvbjosIGxhdDp9XSxcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6ICdqc29uJyAvLyBqc29ufHhtbFxuICAgICAqICAgICAgc2FtcGxpbmcgOiAzLFxuICAgICAqICAgICAgYXBpIDogJ1JFU1QnLCAvLyBSRVNUfFdQU1xuICAgICAqICAgICAgem9ubHkgOiBmYWxzZSAvLyBmYWxzZXx0cnVlXG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJBbHRpUmVxdWVzdEZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBbHRpUmVxdWVzdEZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciByZXF1ZXN0ID0gbnVsbDtcblxuICAgICAgICAvLyBvbiBmYWN0b3Jpc2UgbGVzIG9wdGlvbnMgcGFyIGdyb3VwZTtcbiAgICAgICAgLy8gLSBnbG9iYWwsXG4gICAgICAgIC8vIC0gcGFyYW0sIGxlcyBwYXJhbXMgcG91ciBsZXMgZGF0YSBpbnB1dHNcbiAgICAgICAgLy8gLSB3cHMsIGxlcyBwYXJhbSBkdSBzZXJ2aWNlXG4gICAgICAgIC8vIC0gY2FsbGJhY2tcblxuICAgICAgICB2YXIgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAvLyBham91dCBkZXMgdmFsZXVycyBwYXIgZGVmYXV0IHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlXG4gICAgICAgICAgICB0eXBlIDogb3B0aW9ucy5zYW1wbGluZyA/IFwiUHJvZmlsXCIgOiBcIkVsZXZhdGlvblwiLFxuICAgICAgICAgICAgbWV0aG9kIDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgcGFyYW0gOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgOiBudWxsLCAvLyBGSVhNRSBwYXIgZGVmYXV0LCBvbiBuZSBsZSBtZXQgcGFzIGVuIHBsYWNlIGNhciDDp2EgZmFpdCBwbGFudGVyIGxhIHJlcXXDqnRlICE/XG4gICAgICAgICAgICAgICAgaW5kZW50IDogbnVsbCwgLy8gcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgIGNycyA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICBmb3JtYXQgOiBudWxsLCAvLyAob25seSB0byBQT1NUKVxuICAgICAgICAgICAgICAgIHNhbXBsaW5nIDogbnVsbCwgLy8gKG9ubHkgdXNlIGJ5IFByb2ZpbClcbiAgICAgICAgICAgICAgICB6b25seSA6IG51bGwsIC8vIChvbmx5IHVzZSBieSBFbGV2YXRpb24pXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgOiBudWxsIC8vIChvbmx5IHVzZSBieSBFbGV2YXRpb24pXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc3VyY2hhcmdlIGRlcyB2YWxldXJzIG9ibGlnYXRvaXJlc1xuICAgICAgICBzZXR0aW5ncy5wYXJhbS5wb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9ucztcbiAgICAgICAgc2V0dGluZ3MucGFyYW0uZm9ybWF0ID0gb3B0aW9ucy5vdXRwdXRGb3JtYXQ7XG4gICAgICAgIHNldHRpbmdzLnBhcmFtLnNhbXBsaW5nID0gb3B0aW9ucy5zYW1wbGluZztcbiAgICAgICAgc2V0dGluZ3MucGFyYW0uem9ubHkgPSBvcHRpb25zLnpvbmx5O1xuICAgICAgICBzZXR0aW5ncy5wYXJhbS5tZWFzdXJlcyA9IG9wdGlvbnMubWVhc3VyZXM7XG4gICAgICAgIHNldHRpbmdzLnBhcmFtLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZTtcblxuICAgICAgICAvLyBnZXN0aW9uIGRlcyBjYWxsYmFja1xuICAgICAgICB2YXIgYk9uRXJyb3IgPSAhIShvcHRpb25zLm9uRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25FcnJvciA9PT0gXCJmdW5jdGlvblwiKTsgLy8gY2FzdCB2YXJpYWJsZSB0byBib29sZWFuXG4gICAgICAgIHZhciBiT25TdWNjZXNzID0gISEob3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuXG4gICAgICAgIHZhciBtZXNzYWdlID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmFwaSkge1xuICAgICAgICAgICAgY2FzZSBcIlJFU1RcIjpcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBsZXMgZXhjZXB0aW9ucyBuZSBzb250IHBhcyAnY2F0Y2jDqWVzJyBzdXIgbGUgY29uc3RydWN0ZXVyICFcbiAgICAgICAgICAgICAgICB2YXIgbXlSZXEgPSBuZXcgQWx0aVJlcXVlc3RSRVNUKHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBpZiAoIW15UmVxLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiRXJyb3IgaW4gcHJvY2VzcyByZXF1ZXN0IChyZXN0KSAhXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiT25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gbXlSZXEucmVxdWVzdFN0cmluZztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJXUFNcIjpcbiAgICAgICAgICAgICAgICAvLyBham91dCBkZXMgdmFsZXVycyBwYXIgZGVmYXV0IHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlIFdQU1xuICAgICAgICAgICAgICAgIHNldHRpbmdzLndwcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZSA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgcmF3ZGF0YW91dHB1dCA6IG51bGwsIC8vIHBhciBkZWZhdXRcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA6IG51bGwgLy8gcGFyIGRlZmF1dFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gQWx0aVJlcXVlc3RXUFMuYnVpbGQoc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJFcnJvciBpbiBwcm9jZXNzIHJlcXVlc3QgKHdwcykgIVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYk9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlR5cGUgb2YgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmljZSAoUkVTVCBvciBXUFMpICFcIjtcbiAgICAgICAgICAgICAgICBpZiAoYk9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJPblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgcmVxdWVzdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUmVxdWVzdEZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/AltiRequestREST.js": +/*!******************************************************!*\ + !*** ./src/Services/Alti/Request/AltiRequestREST.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/AltiElevationRequest */ \"./src/Services/Alti/Request/model/AltiElevationRequest.js\");\n/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AltiProfilRequest */ \"./src/Services/Alti/Request/model/AltiProfilRequest.js\");\n/* jshint multistr : true */\n\n\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service altimetrique.\n *\n * @todo Le service Alti n'implemente pas le POST !?\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiRequestREST\n * @param {Object} options - options\n * @param {Object} options.param.positions - tableau de coordonnées lon/lat\n * @param {String} options.param.delimiter - '|'\n * @param {Boolean} options.param.indent - false|true\n * @param {String} options.param.crs - 'CRS:84'\n * @param {String} options.param.sampling - 3\n * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93'\n * @param {Boolean} options.param.zonly - false|true\n * @param {Boolean} options.param.measures - false|true\n * @param {String} options.param.format - \"JSON|XML\"\n * @param {String} options.type - \"Profil|Elevation\"\n * @param {String} options.method - GET|POST\n *\n * @example\n * var options = {\n * type : 'Profil', // Elevation\n * method : 'GET', // par defaut\n * param : {\n * positions : [\n * {lon:'1.11', lat:'1.11'},\n * {lon:'1.10', lat:'1.10'},\n * {lon:'1.12', lat:'1.12'}\n * ],\n * delimiter : \";\", // par defaut\n * indent : true, // par defaut\n * crs : 'EPSG:4326', // par defaut\n * format : 'json', // par defaut (only to POST)\n * sampling : 3 , // par defaut (only use by Profil)\n * zonly : false // par defaut (only use by Elevation)\n * measures : false // par defaut (only use by Elevation)\n * }\n * };\n *\n * var result;\n * try {\n * var obj = new AltiRequestREST (options);\n * if (! obj.processRequestString ()) {\n * throw new Error(\"Request empty !?\")\n * }\n * result = obj.requestString;\n * } catch (e) {\n * // exceptions...\n * }\n * @private\n */\nfunction AltiRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestREST\");\n this.logger.trace(\"[Constructeur AltiRequestREST ()]\");\n if (!(this instanceof AltiRequestREST)) {\n throw new TypeError(\"AltiRequestREST constructor cannot be called as a function.\");\n }\n this.options = options || {};\n\n // existance des options\n if (!this.options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n // type de requete : Altitude ou Profil\n // (param. à determiner en fonction des parametres d'entrée)\n if (!this.options.type) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"type (Elevation or Profil)\"));\n }\n\n // construction du modele de requête\n // (test du type d'objet candidat)\n this.DataObject = null;\n switch (this.options.type) {\n case \"Elevation\":\n this.DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.options.param);\n break;\n case \"Profil\":\n this.DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this.options.param);\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"type (Elevation or Profil)\"));\n }\n\n /**\n * methode.\n * Par defaut, \"GET\".\n */\n this.method = this.options.method || \"GET\";\n}\nAltiRequestREST.prototype = {\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: AltiRequestREST,\n /**\n * Template de la requête.\n */\n template: {\n get: {\n // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__'\n value: \"lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__\",\n input: {\n point: \"&zonly=__ZONLY__\",\n profil: \"&sampling=__SAMPLING__\"\n }\n },\n post: {\n // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\\n\\\n value: \"lon=__LON__\\n\" + \"lat=__LAT__\\n\" + \"indent=__INDENT__\\n\" + \"crs='__CRS__'\\n\" + \"resource='__RESOURCE__'\\n\" + \"measures='__MEASURES__'\\n\",\n input: {\n point: \"zonly=__ZONLY__\\n\",\n profil: \"sampling=__SAMPLING__\"\n }\n }\n },\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84'\n * // POST out : Not yet supported method POST !\n * @returns {String}\n */\n processRequestString: function processRequestString() {\n this.logger.trace(\"AltiRequestREST::processRequestString ()\");\n var template = \"\";\n if (this.method === \"POST\") {\n template = this.template.post.value;\n } else if (this.method === \"GET\") {\n template = this.template.get.value;\n }\n template = template.replace(/__LON__/g, this.DataObject.getLon());\n template = template.replace(/__LAT__/g, this.DataObject.getLat());\n // FIXME on retire le param 'delimiter'\n // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter);\n template = template.replace(/__INDENT__/g, this.DataObject.indent);\n template = template.replace(/__CRS__/g, this.DataObject.crs);\n template = template.replace(/__RESOURCE__/g, this.DataObject.resource);\n template = template.replace(/__MEASURES__/g, this.DataObject.measures);\n\n // ajout +\n template = template + this.__addDataInputs();\n this.logger.trace(\"traduction tmpl\", template);\n\n // sauvegarde\n this.requestString = template;\n return this.requestString;\n },\n /**\n * Ajout de parametres spécifiques (ex. zonly)\n *\n * @returns {String}\n */\n __addDataInputs: function __addDataInputs() {\n this.logger.trace(\"AltiRequestREST::addDataInput ()\");\n var myTemplate;\n if (this.method === \"POST\") {\n myTemplate = this.template.post;\n } else if (this.method === \"GET\") {\n myTemplate = this.template.get;\n } else {\n throw new Error(\"No other HTTP method supported by the service !\");\n }\n var tmpl = null;\n if (this.DataObject.CLASSNAME === \"AltiElevationRequest\") {\n tmpl = myTemplate.input.point;\n return tmpl.replace(/__ZONLY__/g, this.DataObject.zonly.toString());\n } else if (this.DataObject.CLASSNAME === \"AltiProfilRequest\") {\n tmpl = myTemplate.input.profil;\n return tmpl.replace(/__SAMPLING__/g, this.DataObject.sampling);\n } else {\n throw new Error(\"No other object supported than elevation or profil !?\");\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RSRVNULmpzPzY2YjkiXSwibmFtZXMiOlsiQWx0aVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJEYXRhT2JqZWN0IiwiQWx0aUVsZXZhdGlvblJlcXVlc3QiLCJwYXJhbSIsIkFsdGlQcm9maWxSZXF1ZXN0IiwibWV0aG9kIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwidGVtcGxhdGUiLCJnZXQiLCJ2YWx1ZSIsImlucHV0IiwicG9pbnQiLCJwcm9maWwiLCJwb3N0IiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXBsYWNlIiwiZ2V0TG9uIiwiZ2V0TGF0IiwiaW5kZW50IiwiY3JzIiwicmVzb3VyY2UiLCJtZWFzdXJlcyIsIl9fYWRkRGF0YUlucHV0cyIsIm15VGVtcGxhdGUiLCJ0bXBsIiwiQ0xBU1NOQU1FIiwiem9ubHkiLCJ0b1N0cmluZyIsInNhbXBsaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRW9EO0FBQ0g7QUFDZTtBQUNOOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGVBQWVBLENBQUVD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LFFBQVEsQ0FBQ00sSUFBSTtJQUNuQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNWLE1BQU0sS0FBSyxLQUFLLEVBQUU7TUFDOUJvQixVQUFVLEdBQUcsSUFBSSxDQUFDaEIsUUFBUSxDQUFDQyxHQUFHO0lBQ2xDLENBQUMsTUFBTTtNQUNILE1BQU0sSUFBSWIsS0FBSyxDQUFDLGlEQUFpRCxDQUFDO0lBQ3RFO0lBRUEsSUFBSTZCLElBQUksR0FBRyxJQUFJO0lBQ2YsSUFBSSxJQUFJLENBQUN6QixVQUFVLENBQUMwQixTQUFTLEtBQUssc0JBQXNCLEVBQUU7TUFDdERELElBQUksR0FBR0QsVUFBVSxDQUFDYixLQUFLLENBQUNDLEtBQUs7TUFDN0IsT0FBT2EsSUFBSSxDQUFDVCxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQ2hCLFVBQVUsQ0FBQzJCLEtBQUssQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM1QixVQUFVLENBQUMwQixTQUFTLEtBQUssbUJBQW1CLEVBQUU7TUFDMURELElBQUksR0FBR0QsVUFBVSxDQUFDYixLQUFLLENBQUNFLE1BQU07TUFDOUIsT0FBT1ksSUFBSSxDQUFDVCxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQ2hCLFVBQVUsQ0FBQzZCLFFBQVEsQ0FBQztJQUNsRSxDQUFDLE1BQU07TUFDSCxNQUFNLElBQUlqQyxLQUFLLENBQUMsdURBQXVELENBQUM7SUFDNUU7RUFDSjtBQUNKLENBQUM7QUFFY1AsOEVBQWUiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L0FsdGlSZXF1ZXN0UkVTVC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGpzaGludCBtdWx0aXN0ciA6IHRydWUgKi9cblxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBBbHRpRWxldmF0aW9uUmVxdWVzdCBmcm9tIFwiLi9tb2RlbC9BbHRpRWxldmF0aW9uUmVxdWVzdFwiO1xuaW1wb3J0IEFsdGlQcm9maWxSZXF1ZXN0IGZyb20gXCIuL21vZGVsL0FsdGlQcm9maWxSZXF1ZXN0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICpcbiAqIEB0b2RvIExlIHNlcnZpY2UgQWx0aSBuJ2ltcGxlbWVudGUgcGFzIGxlIFBPU1QgIT9cbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuUmVxdWVzdC5BbHRpUmVxdWVzdFJFU1RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5wYXJhbS5wb3NpdGlvbnMgLSB0YWJsZWF1IGRlIGNvb3Jkb25uw6llcyBsb24vbGF0XG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmRlbGltaXRlciAtICd8J1xuICogQHBhcmFtIHtCb29sZWFufSAgb3B0aW9ucy5wYXJhbS5pbmRlbnQgLSBmYWxzZXx0cnVlXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmNycyAtICdDUlM6ODQnXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLnNhbXBsaW5nIC0gM1xuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5yZXNvdXJjZSAtICdyZ2VfYWx0aV9jb3JzZTJhX2Zsb2F0MzJfemlwX2xhbWI5MydcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gIG9wdGlvbnMucGFyYW0uem9ubHkgLSBmYWxzZXx0cnVlXG4gKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLm1lYXN1cmVzIC0gZmFsc2V8dHJ1ZVxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5mb3JtYXQgLSBcIkpTT058WE1MXCJcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMudHlwZSAtIFwiUHJvZmlsfEVsZXZhdGlvblwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLm1ldGhvZCAtIEdFVHxQT1NUXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgICAgICAgdHlwZSA6ICdQcm9maWwnLCAvLyBFbGV2YXRpb25cbiAqICAgICAgICAgICBtZXRob2QgOiAnR0VUJywgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICBwYXJhbSA6IHtcbiAqICAgICAgICAgICAgICAgcG9zaXRpb25zIDogW1xuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMScsIGxhdDonMS4xMSd9LFxuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMCcsIGxhdDonMS4xMCd9LFxuICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMicsIGxhdDonMS4xMid9XG4gKiAgICAgICAgICAgICAgIF0sXG4gKiAgICAgICAgICAgICAgIGRlbGltaXRlciA6IFwiO1wiLCAgICAgICAgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgaW5kZW50ICAgIDogdHJ1ZSwgICAgICAgIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgY3JzICAgICAgIDogJ0VQU0c6NDMyNicsIC8vIHBhciBkZWZhdXRcbiAqICAgICAgICAgICAgICAgZm9ybWF0ICAgIDogJ2pzb24nLCAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdG8gUE9TVClcbiAqICAgICAgICAgICAgICAgc2FtcGxpbmcgIDogMyAsICAgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IFByb2ZpbClcbiAqICAgICAgICAgICAgICAgem9ubHkgICAgIDogZmFsc2UgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAqICAgICAgICAgICAgICAgbWVhc3VyZXMgIDogZmFsc2UgICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAqICAgICAgICAgICB9XG4gKiAgICAgIH07XG4gKlxuICogICAgICB2YXIgcmVzdWx0O1xuICogICAgICB0cnkge1xuICogICAgICAgICAgdmFyIG9iaiA9IG5ldyBBbHRpUmVxdWVzdFJFU1QgKG9wdGlvbnMpO1xuICogICAgICAgICAgaWYgKCEgb2JqLnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpKSB7XG4gKiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdCBlbXB0eSAhP1wiKVxuICogICAgICAgICAgfVxuICogICAgICAgICAgcmVzdWx0ID0gb2JqLnJlcXVlc3RTdHJpbmc7XG4gKiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICAgICAgIC8vIGV4Y2VwdGlvbnMuLi5cbiAqICAgICAgfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQWx0aVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlcXVlc3RSRVNUXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpUmVxdWVzdFJFU1QgKCldXCIpO1xuXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFsdGlSZXF1ZXN0UkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fRU1QVFlcIiwgXCJvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlIGRlIHJlcXVldGUgOiBBbHRpdHVkZSBvdSBQcm9maWxcbiAgICAvLyAocGFyYW0uIMOgIGRldGVybWluZXIgZW4gZm9uY3Rpb24gZGVzIHBhcmFtZXRyZXMgZCdlbnRyw6llKVxuICAgIGlmICghdGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwidHlwZSAoRWxldmF0aW9uIG9yIFByb2ZpbClcIikpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdGlvbiBkdSBtb2RlbGUgZGUgcmVxdcOqdGVcbiAgICAvLyAodGVzdCBkdSB0eXBlIGQnb2JqZXQgY2FuZGlkYXQpXG4gICAgdGhpcy5EYXRhT2JqZWN0ID0gbnVsbDtcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJFbGV2YXRpb25cIjpcbiAgICAgICAgICAgIHRoaXMuRGF0YU9iamVjdCA9IG5ldyBBbHRpRWxldmF0aW9uUmVxdWVzdCh0aGlzLm9wdGlvbnMucGFyYW0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQcm9maWxcIjpcbiAgICAgICAgICAgIHRoaXMuRGF0YU9iamVjdCA9IG5ldyBBbHRpUHJvZmlsUmVxdWVzdCh0aGlzLm9wdGlvbnMucGFyYW0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcInR5cGUgKEVsZXZhdGlvbiBvciBQcm9maWwpXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBtZXRob2RlLlxuICAgICAqIFBhciBkZWZhdXQsIFwiR0VUXCIuXG4gICAgICovXG4gICAgdGhpcy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCI7XG59XG5cbkFsdGlSZXF1ZXN0UkVTVC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiByZXF1ZXN0XG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXF1ZXN0U3RyaW5nIDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBBbHRpUmVxdWVzdFJFU1QsXG5cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZSA6IHtcbiAgICAgICAgZ2V0IDoge1xuICAgICAgICAgICAgLy8gRklYTUUgb24gcmV0aXJlIGxlIHBhcmFtICdkZWxpbWl0ZXInIDogJmRlbGltaXRlcj0nX19ERUxJTUlURVJfXydcbiAgICAgICAgICAgIHZhbHVlIDogXCJsb249X19MT05fXyZsYXQ9X19MQVRfXyZpbmRlbnQ9X19JTkRFTlRfXyZjcnM9J19fQ1JTX18nJnJlc291cmNlPV9fUkVTT1VSQ0VfXyZtZWFzdXJlcz1fX01FQVNVUkVTX19cIixcbiAgICAgICAgICAgIGlucHV0IDoge1xuICAgICAgICAgICAgICAgIHBvaW50IDogXCImem9ubHk9X19aT05MWV9fXCIsXG4gICAgICAgICAgICAgICAgcHJvZmlsIDogXCImc2FtcGxpbmc9X19TQU1QTElOR19fXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcG9zdCA6IHtcbiAgICAgICAgICAgIC8vIEZJWE1FIG9uIHJldGlyZSBsZSBwYXJhbSAnZGVsaW1pdGVyJyA6IGRlbGltaXRlcj0nX19ERUxJTUlURVJfXydcXG5cXFxuICAgICAgICAgICAgdmFsdWUgOiBcImxvbj1fX0xPTl9fXFxuXCIgK1xuICAgICAgICAgICAgICAgIFwibGF0PV9fTEFUX19cXG5cIiArXG4gICAgICAgICAgICAgICAgXCJpbmRlbnQ9X19JTkRFTlRfX1xcblwiICtcbiAgICAgICAgICAgICAgICBcImNycz0nX19DUlNfXydcXG5cIiArXG4gICAgICAgICAgICAgICAgXCJyZXNvdXJjZT0nX19SRVNPVVJDRV9fJ1xcblwiICtcbiAgICAgICAgICAgICAgICBcIm1lYXN1cmVzPSdfX01FQVNVUkVTX18nXFxuXCIsXG4gICAgICAgICAgICBpbnB1dCA6IHtcbiAgICAgICAgICAgICAgICBwb2ludCA6IFwiem9ubHk9X19aT05MWV9fXFxuXCIsXG4gICAgICAgICAgICAgICAgcHJvZmlsIDogXCJzYW1wbGluZz1fX1NBTVBMSU5HX19cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR0VUICBvdXQgOiBsb249MC4yMzY3LDIuMTU3MCZsYXQ9NDguMDU1MSw0Ni42MDc3JmRlbGltaXRlcj0sJmluZGVudD10cnVlJnpvbmx5PXRydWUmY3JzPSdDUlM6ODQnXG4gICAgICogLy8gUE9TVCBvdXQgOiBOb3QgeWV0IHN1cHBvcnRlZCBtZXRob2QgUE9TVCAhXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVxdWVzdFN0cmluZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJBbHRpUmVxdWVzdFJFU1Q6OnByb2Nlc3NSZXF1ZXN0U3RyaW5nICgpXCIpO1xuXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5wb3N0LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUuZ2V0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX0xPTl9fL2csIHRoaXMuRGF0YU9iamVjdC5nZXRMb24oKSk7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19MQVRfXy9nLCB0aGlzLkRhdGFPYmplY3QuZ2V0TGF0KCkpO1xuICAgICAgICAvLyBGSVhNRSBvbiByZXRpcmUgbGUgcGFyYW0gJ2RlbGltaXRlcidcbiAgICAgICAgLy8gdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX0RFTElNSVRFUl9fL2csIHRoaXMuRGF0YU9iamVjdC5kZWxpbWl0ZXIpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL19fSU5ERU5UX18vZywgdGhpcy5EYXRhT2JqZWN0LmluZGVudCk7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvX19DUlNfXy9nLCB0aGlzLkRhdGFPYmplY3QuY3JzKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX1JFU09VUkNFX18vZywgdGhpcy5EYXRhT2JqZWN0LnJlc291cmNlKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC9fX01FQVNVUkVTX18vZywgdGhpcy5EYXRhT2JqZWN0Lm1lYXN1cmVzKTtcblxuICAgICAgICAvLyBham91dCArXG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUgKyB0aGlzLl9fYWRkRGF0YUlucHV0cygpO1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcInRyYWR1Y3Rpb24gdG1wbFwiLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgLy8gc2F1dmVnYXJkZVxuICAgICAgICB0aGlzLnJlcXVlc3RTdHJpbmcgPSB0ZW1wbGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0U3RyaW5nO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBam91dCBkZSBwYXJhbWV0cmVzIHNww6ljaWZpcXVlcyAoZXguIHpvbmx5KVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBfX2FkZERhdGFJbnB1dHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQWx0aVJlcXVlc3RSRVNUOjphZGREYXRhSW5wdXQgKClcIik7XG5cbiAgICAgICAgdmFyIG15VGVtcGxhdGU7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgICAgIG15VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnBvc3Q7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgIG15VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG90aGVyIEhUVFAgbWV0aG9kIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZSAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRtcGwgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5EYXRhT2JqZWN0LkNMQVNTTkFNRSA9PT0gXCJBbHRpRWxldmF0aW9uUmVxdWVzdFwiKSB7XG4gICAgICAgICAgICB0bXBsID0gbXlUZW1wbGF0ZS5pbnB1dC5wb2ludDtcbiAgICAgICAgICAgIHJldHVybiB0bXBsLnJlcGxhY2UoL19fWk9OTFlfXy9nLCB0aGlzLkRhdGFPYmplY3Quem9ubHkudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5EYXRhT2JqZWN0LkNMQVNTTkFNRSA9PT0gXCJBbHRpUHJvZmlsUmVxdWVzdFwiKSB7XG4gICAgICAgICAgICB0bXBsID0gbXlUZW1wbGF0ZS5pbnB1dC5wcm9maWw7XG4gICAgICAgICAgICByZXR1cm4gdG1wbC5yZXBsYWNlKC9fX1NBTVBMSU5HX18vZywgdGhpcy5EYXRhT2JqZWN0LnNhbXBsaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG90aGVyIG9iamVjdCBzdXBwb3J0ZWQgdGhhbiBlbGV2YXRpb24gb3IgcHJvZmlsICE/XCIpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestREST.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/AltiRequestWPS.js": +/*!*****************************************************!*\ + !*** ./src/Services/Alti/Request/AltiRequestWPS.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Formats/WPS */ \"./src/Formats/WPS.js\");\n/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AltiElevationRequest */ \"./src/Services/Alti/Request/model/AltiElevationRequest.js\");\n/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/AltiProfilRequest */ \"./src/Services/Alti/Request/model/AltiProfilRequest.js\");\n/**\n * Classe d'interface des requêtes de type WPS sur le service altimetrique.\n * (Factory)\n *\n * @module Gp.Services.Alti.Request.AltiRequestWPS\n * @alias Gp.Services.Alti.Request.AltiRequestWPS\n * @private\n */\n\n\n\n\n\nvar AltiRequestWPS = {\n /**\n * Interface unique de construction de la requête.\n *\n * @method build\n * @param {Object} options - options\n * @param {Object} options.param.positions - tableau de coordonnées lon/lat\n * @param {String} options.param.delimiter - '|'\n * @param {Boolean} options.param.indent - false|true\n * @param {String} options.param.crs - 'CRS:84'\n * @param {String} options.param.sampling - 3\n * @param {Boolean} options.param.zonly - false|true\n * @param {String} options.param.format - \"JSON|XML\" (only to POST)\n * @param {String} options.wps.service - \"WPS\"\n * @param {String} options.wps.version - \"1.0.0\"\n * @param {String} options.wps.identifier - \"gs:WPSElevation|gs:WPSLineElevation\"\n * @param {String} options.wps.rawdataoutput - \"result\"\n * @param {String} options.wps.request - \"Execute\"\n * @param {String} options.type - \"Profil|Elevation\"\n * @param {String} options.method - GET|POST\n * @example\n * var options = {\n * type : 'Profil', // Elevation\n * method : 'GET', // par defaut\n * param : {\n * positions : [\n * {lon:'1.11', lat:'1.11'},\n * {lon:'1.10', lat:'1.10'},\n * {lon:'1.12', lat:'1.12'}\n * ],\n * delimiter : \";\", // par defaut\n * indent : true, // par defaut\n * crs : 'EPSG:4326', // par defaut\n * format : 'json', // par defaut (only to POST)\n * sampling : 3 , // par defaut (only use by Profil)\n * zonly : false, // par defaut (only use by Elevation)\n * },\n * wps : {\n * service : 'WPS', // par defaut\n * version : '1.0.0', // par defaut\n * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation\n * rawdataoutput : 'result',// par defaut\n * request : 'Execute' // par defaut\n * }\n * };\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiRequestWPS\");\n logger.trace([\"AltiRequestWPS::build()\"]);\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n // type de requete : Altitude ou Profil\n // (param. à determiner en fonction des parametres d'entrée)\n if (!options.type) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"type (Elevation or Profil)\"));\n }\n\n // construction du modele de requête\n // (test du type d'objet candidat)\n var DataObject = null;\n switch (options.type) {\n case \"Elevation\":\n // surcharge\n options.wps.identifier = \"gs:WPSElevation\";\n DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__[\"default\"](options.param);\n break;\n case \"Profil\":\n // surcharge\n options.wps.identifier = \"gs:WPSLineElevation\";\n DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__[\"default\"](options.param);\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"type (Elevation or Profil)\"));\n }\n\n // construction de la requête WPS\n var settings = {\n data: DataObject,\n method: options.method,\n param: options.wps\n };\n var rqstWPS = new _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!rqstWPS.processRequestString()) {\n throw new Error(\"Enable to process request !\");\n }\n return rqstWPS.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequestWPS);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvQWx0aVJlcXVlc3RXUFMuanM/ZGU1MiJdLCJuYW1lcyI6WyJBbHRpUmVxdWVzdFdQUyIsImJ1aWxkIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJEYXRhT2JqZWN0Iiwid3BzIiwiaWRlbnRpZmllciIsIkFsdGlFbGV2YXRpb25SZXF1ZXN0IiwicGFyYW0iLCJBbHRpUHJvZmlsUmVxdWVzdCIsInNldHRpbmdzIiwiZGF0YSIsIm1ldGhvZCIsInJxc3RXUFMiLCJXUFMiLCJwcm9jZXNzUmVxdWVzdFN0cmluZyIsInJlcXVlc3RTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0Q7QUFDSDtBQUNWO0FBQ3lCO0FBQ047QUFFMUQsSUFBSUEsY0FBYyxHQUFHO0VBRWpCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDL0NGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQzs7SUFFekM7SUFDQSxJQUFJLENBQUNKLE9BQU8sRUFBRTtNQUNWLE1BQU0sSUFBSUssS0FBSyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNEOztJQUVBO0lBQ0E7SUFDQSxJQUFJLENBQUNQLE9BQU8sQ0FBQ1EsSUFBSSxFQUFFO01BQ2YsTUFBTSxJQUFJSCxLQUFLLENBQUNDLGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUM5RTs7SUFFQTtJQUNBO0lBQ0EsSUFBSUUsVUFBVSxHQUFHLElBQUk7SUFDckIsUUFBUVQsT0FBTyxDQUFDUSxJQUFJO01BQ2hCLEtBQUssV0FBVztRQUNaO1FBQ0FSLE9BQU8sQ0FBQ1UsR0FBRyxDQUFDQyxVQUFVLEdBQUcsaUJBQWlCO1FBQzFDRixVQUFVLEdBQUcsSUFBSUcsbUVBQW9CLENBQUNaLE9BQU8sQ0FBQ2EsS0FBSyxDQUFDO1FBQ3BEO01BQ0osS0FBSyxRQUFRO1FBQ1Q7UUFDQWIsT0FBTyxDQUFDVSxHQUFHLENBQUNDLFVBQVUsR0FBRyxxQkFBcUI7UUFDOUNGLFVBQVUsR0FBRyxJQUFJSyxnRUFBaUIsQ0FBQ2QsT0FBTyxDQUFDYSxLQUFLLENBQUM7UUFDakQ7TUFDSjtRQUNJLE1BQU0sSUFBSVIsS0FBSyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDakY7O0lBRUE7SUFDQSxJQUFJUSxRQUFRLEdBQUc7TUFDWEMsSUFBSSxFQUFHUCxVQUFVO01BQ2pCUSxNQUFNLEVBQUdqQixPQUFPLENBQUNpQixNQUFNO01BQ3ZCSixLQUFLLEVBQUdiLE9BQU8sQ0FBQ1U7SUFDcEIsQ0FBQztJQUVELElBQUlRLE9BQU8sR0FBRyxJQUFJQyxvREFBRyxDQUFDSixRQUFRLENBQUM7SUFFL0IsSUFBSSxDQUFDRyxPQUFPLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUNqQyxNQUFNLElBQUlmLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztJQUNsRDtJQUVBLE9BQU9hLE9BQU8sQ0FBQ0csYUFBYTtFQUNoQztBQUNKLENBQUM7QUFFY3ZCLDZFQUFjIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVxdWVzdC9BbHRpUmVxdWVzdFdQUy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3NlIGQnaW50ZXJmYWNlIGRlcyByZXF1w6p0ZXMgZGUgdHlwZSBXUFMgc3VyIGxlIHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICogKEZhY3RvcnkpXG4gKlxuICogQG1vZHVsZSBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVJlcXVlc3RXUFNcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVJlcXVlc3RXUFNcbiAqIEBwcml2YXRlXG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgV1BTIGZyb20gXCIuLi8uLi8uLi9Gb3JtYXRzL1dQU1wiO1xuaW1wb3J0IEFsdGlFbGV2YXRpb25SZXF1ZXN0IGZyb20gXCIuL21vZGVsL0FsdGlFbGV2YXRpb25SZXF1ZXN0XCI7XG5pbXBvcnQgQWx0aVByb2ZpbFJlcXVlc3QgZnJvbSBcIi4vbW9kZWwvQWx0aVByb2ZpbFJlcXVlc3RcIjtcblxudmFyIEFsdGlSZXF1ZXN0V1BTID0ge1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJmYWNlIHVuaXF1ZSBkZSBjb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9ICAgb3B0aW9ucy5wYXJhbS5wb3NpdGlvbnMgLSB0YWJsZWF1IGRlIGNvb3Jkb25uw6llcyBsb24vbGF0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5kZWxpbWl0ZXIgLSAnfCdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLmluZGVudCAtIGZhbHNlfHRydWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnBhcmFtLmNycyAtICdDUlM6ODQnXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5wYXJhbS5zYW1wbGluZyAtIDNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59ICBvcHRpb25zLnBhcmFtLnpvbmx5IC0gZmFsc2V8dHJ1ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMucGFyYW0uZm9ybWF0IC0gXCJKU09OfFhNTFwiIChvbmx5IHRvIFBPU1QpXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMuc2VydmljZSAtIFwiV1BTXCJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLndwcy52ZXJzaW9uIC0gXCIxLjAuMFwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMuaWRlbnRpZmllciAtIFwiZ3M6V1BTRWxldmF0aW9ufGdzOldQU0xpbmVFbGV2YXRpb25cIlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMud3BzLnJhd2RhdGFvdXRwdXQgLSBcInJlc3VsdFwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy53cHMucmVxdWVzdCAtIFwiRXhlY3V0ZVwiXG4gICAgICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy50eXBlIC0gXCJQcm9maWx8RWxldmF0aW9uXCJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLm1ldGhvZCAtIEdFVHxQT1NUXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAqICAgICAgICAgICB0eXBlIDogJ1Byb2ZpbCcsIC8vIEVsZXZhdGlvblxuICAgICAqICAgICAgICAgICBtZXRob2QgOiAnR0VUJywgIC8vIHBhciBkZWZhdXRcbiAgICAgKiAgICAgICAgICAgcGFyYW0gOiB7XG4gICAgICogICAgICAgICAgICAgICBwb3NpdGlvbnMgOiBbXG4gICAgICogICAgICAgICAgICAgICAgICAge2xvbjonMS4xMScsIGxhdDonMS4xMSd9LFxuICAgICAqICAgICAgICAgICAgICAgICAgIHtsb246JzEuMTAnLCBsYXQ6JzEuMTAnfSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICB7bG9uOicxLjEyJywgbGF0OicxLjEyJ31cbiAgICAgKiAgICAgICAgICAgICAgIF0sXG4gICAgICogICAgICAgICAgICAgICBkZWxpbWl0ZXIgOiBcIjtcIiwgICAgICAgICAvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgICAgICBpbmRlbnQgICAgOiB0cnVlLCAgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgY3JzICAgICAgIDogJ0VQU0c6NDMyNicsIC8vIHBhciBkZWZhdXRcbiAgICAgKiAgICAgICAgICAgICAgIGZvcm1hdCAgICA6ICdqc29uJywgICAgICAvLyBwYXIgZGVmYXV0IChvbmx5IHRvIFBPU1QpXG4gICAgICogICAgICAgICAgICAgICBzYW1wbGluZyAgOiAzICwgICAgICAgICAgLy8gcGFyIGRlZmF1dCAob25seSB1c2UgYnkgUHJvZmlsKVxuICAgICAqICAgICAgICAgICAgICAgem9ubHkgICAgIDogZmFsc2UsICAgICAgIC8vIHBhciBkZWZhdXQgKG9ubHkgdXNlIGJ5IEVsZXZhdGlvbilcbiAgICAgKiAgICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgICAgd3BzIDoge1xuICAgICAqICAgICAgICAgICAgICAgICBzZXJ2aWNlIDogJ1dQUycsICAgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgICB2ZXJzaW9uIDogJzEuMC4wJywgICAgICAgLy8gcGFyIGRlZmF1dFxuICAgICAqICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIDogJ2dzOldQUycsICAgLy8gcGFyIGRlZmF1dCwgRWxldmF0aW9uID0gZ3M6V1BTRWxldmF0aW9uLCBQcm9maWwgPSBnczpXUFNMaW5lRWxldmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgIHJhd2RhdGFvdXRwdXQgOiAncmVzdWx0JywvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgICAgICAgIHJlcXVlc3QgOiAnRXhlY3V0ZScgICAgICAvLyBwYXIgZGVmYXV0XG4gICAgICogICAgICAgICAgIH1cbiAgICAgKiAgICAgICB9O1xuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlcXVlc3RXUFNcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBbHRpUmVxdWVzdFdQUzo6YnVpbGQoKVwiXSk7XG5cbiAgICAgICAgLy8gZXhpc3RhbmNlIGRlcyBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0eXBlIGRlIHJlcXVldGUgOiBBbHRpdHVkZSBvdSBQcm9maWxcbiAgICAgICAgLy8gKHBhcmFtLiDDoCBkZXRlcm1pbmVyIGVuIGZvbmN0aW9uIGRlcyBwYXJhbWV0cmVzIGQnZW50csOpZSlcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9FTVBUWVwiLCBcInR5cGUgKEVsZXZhdGlvbiBvciBQcm9maWwpXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkdSBtb2RlbGUgZGUgcmVxdcOqdGVcbiAgICAgICAgLy8gKHRlc3QgZHUgdHlwZSBkJ29iamV0IGNhbmRpZGF0KVxuICAgICAgICB2YXIgRGF0YU9iamVjdCA9IG51bGw7XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiRWxldmF0aW9uXCI6XG4gICAgICAgICAgICAgICAgLy8gc3VyY2hhcmdlXG4gICAgICAgICAgICAgICAgb3B0aW9ucy53cHMuaWRlbnRpZmllciA9IFwiZ3M6V1BTRWxldmF0aW9uXCI7XG4gICAgICAgICAgICAgICAgRGF0YU9iamVjdCA9IG5ldyBBbHRpRWxldmF0aW9uUmVxdWVzdChvcHRpb25zLnBhcmFtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJQcm9maWxcIjpcbiAgICAgICAgICAgICAgICAvLyBzdXJjaGFyZ2VcbiAgICAgICAgICAgICAgICBvcHRpb25zLndwcy5pZGVudGlmaWVyID0gXCJnczpXUFNMaW5lRWxldmF0aW9uXCI7XG4gICAgICAgICAgICAgICAgRGF0YU9iamVjdCA9IG5ldyBBbHRpUHJvZmlsUmVxdWVzdChvcHRpb25zLnBhcmFtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1RZUEVcIiwgXCJ0eXBlIChFbGV2YXRpb24gb3IgUHJvZmlsKVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUgV1BTXG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGRhdGEgOiBEYXRhT2JqZWN0LFxuICAgICAgICAgICAgbWV0aG9kIDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgICAgICBwYXJhbSA6IG9wdGlvbnMud3BzXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHJxc3RXUFMgPSBuZXcgV1BTKHNldHRpbmdzKTtcblxuICAgICAgICBpZiAoIXJxc3RXUFMucHJvY2Vzc1JlcXVlc3RTdHJpbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5hYmxlIHRvIHByb2Nlc3MgcmVxdWVzdCAhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJxc3RXUFMucmVxdWVzdFN0cmluZztcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUmVxdWVzdFdQUztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/AltiRequestWPS.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/model/AltiElevationRequest.js": +/*!*****************************************************************!*\ + !*** ./src/Services/Alti/Request/model/AltiElevationRequest.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AltiRequest */ \"./src/Services/Alti/Request/model/AltiRequest.js\");\n\n\n\n/**\n * @classdesc\n *\n * Classe de gestion des param. des requêtes de type POINT du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiElevationRequest\n * @param {Object} options - options\n * @param {Boolean} options.zonly - false|true\n *\n * @private\n */\nfunction AltiElevationRequest(options) {\n if (!(this instanceof AltiElevationRequest)) {\n throw new TypeError(\"AltiElevationRequest constructor cannot be called as a function.\");\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"AltiElevationRequest\";\n\n // appel du constructeur par heritage\n _AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiElevationRequest ()]\");\n\n /**\n * Z uniquement.\n * true|false\n */\n this.zonly = this.options.zonly || false; // test des options héritées !\n}\n\n/**\n * @lends module:AltiElevationRequest#\n */\n\nAltiElevationRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].prototype, {\n /**\n * Setter/getter pour \"zonly\"\n */\n zonly: {\n /** getter */\n get: function get() {\n return this._zonly;\n },\n /** setter */\n set: function set(z) {\n this._zonly = z;\n }\n }\n});\n\n/**\n * Constructeur (alias)\n */\nAltiElevationRequest.prototype.constructor = AltiElevationRequest;\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array}\n */\nAltiElevationRequest.prototype.getData = function () {\n // par glop..., appel de AltiRequest::getData () !\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n // map.push({k : \"delimiter\", v : this.delimiter}); // FIXME on retire le param \"delimiter\"\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"zonly\",\n v: this.zonly\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n map.push({\n k: \"resource\",\n v: this.resource\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiElevationRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aUVsZXZhdGlvblJlcXVlc3QuanM/MTY1NCJdLCJuYW1lcyI6WyJBbHRpRWxldmF0aW9uUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJDTEFTU05BTUUiLCJBbHRpUmVxdWVzdCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJ6b25seSIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImdldCIsIl96b25seSIsInNldCIsInoiLCJjb25zdHJ1Y3RvciIsImdldERhdGEiLCJtYXAiLCJwdXNoIiwiayIsInYiLCJnZXRMb24iLCJnZXRMYXQiLCJpbmRlbnQiLCJjcnMiLCJmb3JtYXQiLCJyZXNvdXJjZSJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQXVEO0FBQ2Y7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLG9CQUFvQkEsQ0FBRUMsT0FBTyxFQUFFO0VBQ3BDLElBQUksRUFBRSxJQUFJLFlBQVlELG9CQUFvQixDQUFDLEVBQUU7SUFDekMsTUFBTSxJQUFJRSxTQUFTLENBQUMsa0VBQWtFLENBQUM7RUFDM0Y7O0VBRUE7QUFDSjtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxTQUFTLEdBQUcsc0JBQXNCOztFQUV2QztFQUNBQyxvREFBVyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQyxTQUFTLENBQUM7RUFFbEMsSUFBSSxDQUFDQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsd0NBQXdDLENBQUM7O0VBRTNEO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxLQUFLLEdBQUcsSUFBSSxDQUFDVixPQUFPLENBQUNVLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFYLG9CQUFvQixDQUFDWSxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDVixvREFBVyxDQUFDUSxTQUFTLEVBQUU7RUFFbEU7QUFDSjtBQUNBO0VBQ0lELEtBQUssRUFBRztJQUNKO0lBQ0FJLEdBQUcsRUFBRyxTQUFBQSxJQUFBLEVBQVk7TUFDZCxPQUFPLElBQUksQ0FBQ0MsTUFBTTtJQUN0QixDQUFDO0lBQ0Q7SUFDQUMsR0FBRyxFQUFHLFNBQUFBLElBQVVDLENBQUMsRUFBRTtNQUNmLElBQUksQ0FBQ0YsTUFBTSxHQUFHRSxDQUFDO0lBQ25CO0VBQ0o7QUFFSixDQUFDLENBQUM7O0FBRUY7QUFDQTtBQUNBO0FBQ0FsQixvQkFBb0IsQ0FBQ1ksU0FBUyxDQUFDTyxXQUFXLEdBQUduQixvQkFBb0I7O0FBRWpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsb0JBQW9CLENBQUNZLFNBQVMsQ0FBQ1EsT0FBTyxHQUFHLFlBQVk7RUFDakQ7RUFDQSxJQUFJQyxHQUFHLEdBQUcsRUFBRTtFQUNaQSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFDcEIsQ0FBQyxDQUFDO0VBQ0ZKLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO0lBQ0xDLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNFLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRjtFQUNBTCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDRztFQUNiLENBQUMsQ0FBQztFQUNGTixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDSTtFQUNiLENBQUMsQ0FBQztFQUNGUCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsT0FBTztJQUNYQyxDQUFDLEVBQUcsSUFBSSxDQUFDYjtFQUNiLENBQUMsQ0FBQztFQUNGVSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDSztFQUNiLENBQUMsQ0FBQztFQUNGUixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDTTtFQUNiLENBQUMsQ0FBQztFQUVGLE9BQU9ULEdBQUc7QUFDZCxDQUFDO0FBRWNyQixtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L21vZGVsL0FsdGlFbGV2YXRpb25SZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVxdWVzdCBmcm9tIFwiLi9BbHRpUmVxdWVzdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZGUgdHlwZSBQT0lOVCBkdSBzZXJ2aWNlIGFsdGltZXRyaXF1ZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aUVsZXZhdGlvblJlcXVlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSAgb3B0aW9ucy56b25seSAtIGZhbHNlfHRydWVcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBBbHRpRWxldmF0aW9uUmVxdWVzdCAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbHRpRWxldmF0aW9uUmVxdWVzdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFsdGlFbGV2YXRpb25SZXF1ZXN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICovXG4gICAgdGhpcy5DTEFTU05BTUUgPSBcIkFsdGlFbGV2YXRpb25SZXF1ZXN0XCI7XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQWx0aVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBBbHRpRWxldmF0aW9uUmVxdWVzdCAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBaIHVuaXF1ZW1lbnQuXG4gICAgICogdHJ1ZXxmYWxzZVxuICAgICAqL1xuICAgIHRoaXMuem9ubHkgPSB0aGlzLm9wdGlvbnMuem9ubHkgfHwgZmFsc2U7IC8vIHRlc3QgZGVzIG9wdGlvbnMgaMOpcml0w6llcyAhXG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBbHRpRWxldmF0aW9uUmVxdWVzdCNcbiAqL1xuXG5BbHRpRWxldmF0aW9uUmVxdWVzdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFsdGlSZXF1ZXN0LnByb3RvdHlwZSwge1xuXG4gICAgLyoqXG4gICAgICogU2V0dGVyL2dldHRlciBwb3VyIFwiem9ubHlcIlxuICAgICAqL1xuICAgIHpvbmx5IDoge1xuICAgICAgICAvKiogZ2V0dGVyICovXG4gICAgICAgIGdldCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25seTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIHNldHRlciAqL1xuICAgICAgICBzZXQgOiBmdW5jdGlvbiAoeikge1xuICAgICAgICAgICAgdGhpcy5fem9ubHkgPSB6O1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5BbHRpRWxldmF0aW9uUmVxdWVzdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbHRpRWxldmF0aW9uUmVxdWVzdDtcblxuLyoqXG4gKiBUYWJsZWF1IGRlIGNsZWZzL3ZhbGV1cnMgcG91ciBwYXJhbS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbkFsdGlFbGV2YXRpb25SZXF1ZXN0LnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIHBhciBnbG9wLi4uLCBhcHBlbCBkZSBBbHRpUmVxdWVzdDo6Z2V0RGF0YSAoKSAhXG4gICAgdmFyIG1hcCA9IFtdO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwibG9uXCIsXG4gICAgICAgIHYgOiB0aGlzLmdldExvbigpXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJsYXRcIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0TGF0KClcbiAgICB9KTtcbiAgICAvLyBtYXAucHVzaCh7ayA6IFwiZGVsaW1pdGVyXCIsIHYgOiB0aGlzLmRlbGltaXRlcn0pOyAvLyBGSVhNRSBvbiByZXRpcmUgbGUgcGFyYW0gXCJkZWxpbWl0ZXJcIlxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiaW5kZW50XCIsXG4gICAgICAgIHYgOiB0aGlzLmluZGVudFxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiY3JzXCIsXG4gICAgICAgIHYgOiB0aGlzLmNyc1xuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiem9ubHlcIixcbiAgICAgICAgdiA6IHRoaXMuem9ubHlcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImZvcm1hdFwiLFxuICAgICAgICB2IDogdGhpcy5mb3JtYXRcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcInJlc291cmNlXCIsXG4gICAgICAgIHYgOiB0aGlzLnJlc291cmNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aUVsZXZhdGlvblJlcXVlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiElevationRequest.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/model/AltiProfilRequest.js": +/*!**************************************************************!*\ + !*** ./src/Services/Alti/Request/model/AltiProfilRequest.js ***! + \**************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AltiRequest */ \"./src/Services/Alti/Request/model/AltiRequest.js\");\n\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiProfilRequest\n * @param {Object} options - options\n * @param {String} options.sampling - 3\n *\n * @private\n */\nfunction AltiProfilRequest(options) {\n if (!(this instanceof AltiProfilRequest)) {\n throw new TypeError(\"AltiProfilRequest constructor cannot be called as a function.\");\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"AltiProfilRequest\";\n\n // appel du constructeur par heritage\n _AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiProfilRequest ()]\");\n\n /**\n * Sampling\n * Par defaut, 3\n */\n this.sampling = this.options.sampling || 3; // test des options héritées !\n}\n\n/**\n * @lends module:AltiProfilRequest#\n */\n\nAltiProfilRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__[\"default\"].prototype, {\n /**\n * Setter/getter pour \"sampling\"\n */\n sampling: {\n /** getter */\n get: function get() {\n return this._sampling;\n },\n /** setter */\n set: function set(value) {\n this._sampling = value;\n }\n }\n});\n\n/**\n * Constructeur (alias)\n */\nAltiProfilRequest.prototype.constructor = AltiProfilRequest;\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]}\n */\nAltiProfilRequest.prototype.getData = function () {\n // par glop..., appel de AltiRequest::getData () !\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n // map.push({k : \"delimiter\", v : this.delimiter}); // FIXME on retire le param \"delimiter\"\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"sampling\",\n v: this.sampling\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n map.push({\n k: \"resource\",\n v: this.resource\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiProfilRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aVByb2ZpbFJlcXVlc3QuanM/ZjA5YyJdLCJuYW1lcyI6WyJBbHRpUHJvZmlsUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJDTEFTU05BTUUiLCJBbHRpUmVxdWVzdCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzYW1wbGluZyIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImdldCIsIl9zYW1wbGluZyIsInNldCIsInZhbHVlIiwiY29uc3RydWN0b3IiLCJnZXREYXRhIiwibWFwIiwicHVzaCIsImsiLCJ2IiwiZ2V0TG9uIiwiZ2V0TGF0IiwiaW5kZW50IiwiY3JzIiwiZm9ybWF0IiwicmVzb3VyY2UiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBQTtBQUF1RDtBQUNmOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsaUJBQWlCQSxDQUFFQyxPQUFPLEVBQUU7RUFDakMsSUFBSSxFQUFFLElBQUksWUFBWUQsaUJBQWlCLENBQUMsRUFBRTtJQUN0QyxNQUFNLElBQUlFLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztFQUN4Rjs7RUFFQTtBQUNKO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFNBQVMsR0FBRyxtQkFBbUI7O0VBRXBDO0VBQ0FDLG9EQUFXLENBQUNDLEtBQUssQ0FBQyxJQUFJLEVBQUVDLFNBQVMsQ0FBQztFQUVsQyxJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLENBQUM7RUFDaEMsSUFBSSxDQUFDRixNQUFNLENBQUNHLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQzs7RUFFeEQ7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJLENBQUNWLE9BQU8sQ0FBQ1UsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQVgsaUJBQWlCLENBQUNZLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUNWLG9EQUFXLENBQUNRLFNBQVMsRUFBRTtFQUUvRDtBQUNKO0FBQ0E7RUFDSUQsUUFBUSxFQUFHO0lBQ1A7SUFDQUksR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU8sSUFBSSxDQUFDQyxTQUFTO0lBQ3pCLENBQUM7SUFDRDtJQUNBQyxHQUFHLEVBQUcsU0FBQUEsSUFBVUMsS0FBSyxFQUFFO01BQ25CLElBQUksQ0FBQ0YsU0FBUyxHQUFHRSxLQUFLO0lBQzFCO0VBQ0o7QUFDSixDQUFDLENBQUM7O0FBRUY7QUFDQTtBQUNBO0FBQ0FsQixpQkFBaUIsQ0FBQ1ksU0FBUyxDQUFDTyxXQUFXLEdBQUduQixpQkFBaUI7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsaUJBQWlCLENBQUNZLFNBQVMsQ0FBQ1EsT0FBTyxHQUFHLFlBQVk7RUFDOUM7RUFDQSxJQUFJQyxHQUFHLEdBQUcsRUFBRTtFQUNaQSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFDcEIsQ0FBQyxDQUFDO0VBQ0ZKLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO0lBQ0xDLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNFLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRjtFQUNBTCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDRztFQUNiLENBQUMsQ0FBQztFQUNGTixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsS0FBSztJQUNUQyxDQUFDLEVBQUcsSUFBSSxDQUFDSTtFQUNiLENBQUMsQ0FBQztFQUNGUCxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDYjtFQUNiLENBQUMsQ0FBQztFQUNGVSxHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDSztFQUNiLENBQUMsQ0FBQztFQUNGUixHQUFHLENBQUNDLElBQUksQ0FBQztJQUNMQyxDQUFDLEVBQUcsVUFBVTtJQUNkQyxDQUFDLEVBQUcsSUFBSSxDQUFDTTtFQUNiLENBQUMsQ0FBQztFQUVGLE9BQU9ULEdBQUc7QUFDZCxDQUFDO0FBRWNyQixnRkFBaUIiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXF1ZXN0L21vZGVsL0FsdGlQcm9maWxSZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBBbHRpUmVxdWVzdCBmcm9tIFwiLi9BbHRpUmVxdWVzdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENsYXNzZSBkZSBnZXN0aW9uIGRlcyBwYXJhbS4gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFBST0ZJTCBkdSBzZXJ2aWNlIGFsdGltZXRyaXF1ZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BbHRpLlJlcXVlc3QuQWx0aVByb2ZpbFJlcXVlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLnNhbXBsaW5nIC0gM1xuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEFsdGlQcm9maWxSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlQcm9maWxSZXF1ZXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWx0aVByb2ZpbFJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiQWx0aVByb2ZpbFJlcXVlc3RcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBBbHRpUmVxdWVzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIEFsdGlQcm9maWxSZXF1ZXN0ICgpXVwiKTtcblxuICAgIC8qKlxuICAgICAqIFNhbXBsaW5nXG4gICAgICogUGFyIGRlZmF1dCwgM1xuICAgICAqL1xuICAgIHRoaXMuc2FtcGxpbmcgPSB0aGlzLm9wdGlvbnMuc2FtcGxpbmcgfHwgMzsgLy8gdGVzdCBkZXMgb3B0aW9ucyBow6lyaXTDqWVzICFcbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkFsdGlQcm9maWxSZXF1ZXN0I1xuICovXG5cbkFsdGlQcm9maWxSZXF1ZXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQWx0aVJlcXVlc3QucHJvdG90eXBlLCB7XG5cbiAgICAvKipcbiAgICAgKiBTZXR0ZXIvZ2V0dGVyIHBvdXIgXCJzYW1wbGluZ1wiXG4gICAgICovXG4gICAgc2FtcGxpbmcgOiB7XG4gICAgICAgIC8qKiBnZXR0ZXIgKi9cbiAgICAgICAgZ2V0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NhbXBsaW5nO1xuICAgICAgICB9LFxuICAgICAgICAvKiogc2V0dGVyICovXG4gICAgICAgIHNldCA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2FtcGxpbmcgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG4vKipcbiAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gKi9cbkFsdGlQcm9maWxSZXF1ZXN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFsdGlQcm9maWxSZXF1ZXN0O1xuXG4vKipcbiAqIFRhYmxlYXUgZGUgY2xlZnMvdmFsZXVycyBwb3VyIHBhcmFtLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3RbXX1cbiAqL1xuQWx0aVByb2ZpbFJlcXVlc3QucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gcGFyIGdsb3AuLi4sIGFwcGVsIGRlIEFsdGlSZXF1ZXN0OjpnZXREYXRhICgpICFcbiAgICB2YXIgbWFwID0gW107XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJsb25cIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0TG9uKClcbiAgICB9KTtcbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImxhdFwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMYXQoKVxuICAgIH0pO1xuICAgIC8vIG1hcC5wdXNoKHtrIDogXCJkZWxpbWl0ZXJcIiwgdiA6IHRoaXMuZGVsaW1pdGVyfSk7IC8vIEZJWE1FIG9uIHJldGlyZSBsZSBwYXJhbSBcImRlbGltaXRlclwiXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJpbmRlbnRcIixcbiAgICAgICAgdiA6IHRoaXMuaW5kZW50XG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgdiA6IHRoaXMuY3JzXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJzYW1wbGluZ1wiLFxuICAgICAgICB2IDogdGhpcy5zYW1wbGluZ1xuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiZm9ybWF0XCIsXG4gICAgICAgIHYgOiB0aGlzLmZvcm1hdFxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwicmVzb3VyY2VcIixcbiAgICAgICAgdiA6IHRoaXMucmVzb3VyY2VcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbHRpUHJvZmlsUmVxdWVzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiProfilRequest.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Request/model/AltiRequest.js": +/*!********************************************************!*\ + !*** ./src/Services/Alti/Request/model/AltiRequest.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service altimetrique.\n *\n * @constructor\n * @alias Gp.Services.Alti.Request.AltiRequest\n * @param {Object} options - options\n * @param {Object} options.positions - tableau de coordonnées lon/lat\n * @param {String} options.delimiter - \"|\"\n * @param {Boolean} options.indent - false|true\n * @param {String} options.crs - \"CRS:84\"\n * @param {String} options.format - \"JSON|XML\"\n *\n * @private\n */\nfunction AltiRequest(options) {\n if (!(this instanceof AltiRequest)) {\n throw new TypeError(\"AltiRequest constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur AltiRequest ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n /**\n * Liste des coordonnées.\n * @example\n * var c = [{lon : \"\", lat : \"\"}, {lon : \"\", lat : \"\"}];\n */\n this.positions = this.options.positions || [];\n\n /**\n * Caractère de séparation.\n * Par defaut, \"|\".\n */\n this.delimiter = this.options.delimiter || \"|\";\n\n /**\n * Indentation.\n * true|false\n */\n this.indent = this.options.indent || false;\n\n /**\n * Projection.\n * Par defaut, CRS:84.\n */\n this.crs = this.options.crs || \"CRS:84\";\n\n /**\n * format de sortie.\n * Par defaut, \"json\".\n */\n this.format = this.options.format || \"json\";\n\n /*\n * Ressource utilisée\n */\n this.resource = this.options.resource;\n\n /**\n * Réponse détaillée (source & accuracy)\n * true|false\n */\n this.measures = this.options.measures || false;\n}\n\n/**\n * CLASSNAME\n */\nAltiRequest.CLASSNAME = \"AltiRequest\";\nAltiRequest.prototype = {\n /**\n * @lends module:AltiRequest#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: AltiRequest,\n /**\n * Ajout d\"une liste de coordonnées.\n *\n * @param {Object[]} lstPosition - liste de positions\n * @example\n * obj.setPositions ([{lon : \"0.15\", lat : \"0.15\"}, {lon : \"1.15\", lat : \"1.15\"}]);\n */\n setPositions: function setPositions(lstPosition) {\n var positions = [];\n for (var i = 0; i < lstPosition.length; i++) {\n var o = lstPosition[i];\n if (o.lon && o.lat) {\n positions.push(o);\n }\n }\n this.positions = positions;\n },\n /**\n * Liste des coordonnées.\n *\n * @param {Int} pos - position\n * @returns {positions}\n * @example\n * obj.getPositions (); // [{lon : \"\", lat : \"\"}, {lon : \"\", lat : \"\"}]\n * obj.getPositions (0); // [{lon : \"\", lat : \"\"}]\n */\n getPositions: function getPositions(pos) {\n // FIXME test if not a number !?\n if (!pos) {\n return this.positions;\n }\n var index = this.positions.length - 1;\n if (pos > index || pos < index) {\n this.logger.warn(\"index out of range !\");\n return this.positions;\n }\n return this.positions[pos];\n },\n /**\n * Ajout d\"une liste de coordonnées.\n *\n * @param {Object[]} lstPosition - liste de positions\n * @example\n * obj.addPositions ([{lon : \"0.15\", lat : \"0.15\"}, {lon : \"1.15\", lat : \"1.15\"}]);\n */\n addPositions: function addPositions(lstPosition) {\n for (var i = 0; i < lstPosition.length; i++) {\n var o = lstPosition[i];\n if (o.lon && o.lat) {\n this.positions.push(lstPosition[i]);\n }\n }\n },\n /**\n * Retourne la liste des longitudes avec un caractère de séparation.\n *\n * @returns {String} - une liste de longitudes\n * @example\n * // out : 0.2367|2.1570|43.789|...\n */\n getLon: function getLon() {\n var lstLon = [];\n for (var i = 0; i < this.positions.length; i++) {\n lstLon.push(this.positions[i].lon);\n }\n this.logger.trace(lstLon);\n return lstLon.join(this.delimiter);\n },\n /**\n * Retourne la liste des lattitudes avec un caractère de séparation.\n *\n * @returns {String} - une liste de lattitudes\n * @example\n * // out : 0.2367|2.1570|43.789|...\n */\n getLat: function getLat() {\n var lstLat = [];\n for (var i = 0; i < this.positions.length; i++) {\n lstLat.push(this.positions[i].lat);\n }\n this.logger.trace(lstLat);\n return lstLat.join(this.delimiter);\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]}\n */\nAltiRequest.prototype.getData = function () {\n var map = [];\n map.push({\n k: \"lon\",\n v: this.getLon()\n });\n map.push({\n k: \"lat\",\n v: this.getLat()\n });\n map.push({\n k: \"delimiter\",\n v: this.delimiter\n });\n map.push({\n k: \"indent\",\n v: this.indent\n });\n map.push({\n k: \"crs\",\n v: this.crs\n });\n map.push({\n k: \"format\",\n v: this.format\n });\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1JlcXVlc3QvbW9kZWwvQWx0aVJlcXVlc3QuanM/MDgwZSJdLCJuYW1lcyI6WyJBbHRpUmVxdWVzdCIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsInBvc2l0aW9ucyIsImRlbGltaXRlciIsImluZGVudCIsImNycyIsImZvcm1hdCIsInJlc291cmNlIiwibWVhc3VyZXMiLCJDTEFTU05BTUUiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciIsInNldFBvc2l0aW9ucyIsImxzdFBvc2l0aW9uIiwiaSIsImxlbmd0aCIsIm8iLCJsb24iLCJsYXQiLCJwdXNoIiwiZ2V0UG9zaXRpb25zIiwicG9zIiwiaW5kZXgiLCJ3YXJuIiwiYWRkUG9zaXRpb25zIiwiZ2V0TG9uIiwibHN0TG9uIiwiam9pbiIsImdldExhdCIsImxzdExhdCIsImdldERhdGEiLCJtYXAiLCJrIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsV0FBV0EsQ0FBRUMsT0FBTyxFQUFFO0VBQzNCLElBQUksRUFBRSxJQUFJLFlBQVlELFdBQVcsQ0FBQyxFQUFFO0lBQ2hDLE1BQU0sSUFBSUUsU0FBUyxDQUFDLHlEQUF5RCxDQUFDO0VBQ2xGO0VBRUEsSUFBSSxDQUFDQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsK0JBQStCLENBQUM7O0VBRWxEO0FBQ0o7QUFDQTtFQUNJLElBQUksQ0FBQ0wsT0FBTyxHQUFHQSxPQUFPLElBQUksQ0FBQyxDQUFDOztFQUU1QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksSUFBSSxD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LEdBQUcsQ0FBQ1osSUFBSSxDQUFDO0lBQ0xhLENBQUMsRUFBRyxLQUFLO0lBQ1RDLENBQUMsRUFBRyxJQUFJLENBQUNSLE1BQU0sQ0FBQztFQUNwQixDQUFDLENBQUM7RUFDRk0sR0FBRyxDQUFDWixJQUFJLENBQUM7SUFDTGEsQ0FBQyxFQUFHLEtBQUs7SUFDVEMsQ0FBQyxFQUFHLElBQUksQ0FBQ0wsTUFBTSxDQUFDO0VBQ3BCLENBQUMsQ0FBQztFQUNGRyxHQUFHLENBQUNaLElBQUksQ0FBQztJQUNMYSxDQUFDLEVBQUcsV0FBVztJQUNmQyxDQUFDLEVBQUcsSUFBSSxDQUFDOUI7RUFDYixDQUFDLENBQUM7RUFDRjRCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO0lBQ0xhLENBQUMsRUFBRyxRQUFRO0lBQ1pDLENBQUMsRUFBRyxJQUFJLENBQUM3QjtFQUNiLENBQUMsQ0FBQztFQUNGMkIsR0FBRyxDQUFDWixJQUFJLENBQUM7SUFDTGEsQ0FBQyxFQUFHLEtBQUs7SUFDVEMsQ0FBQyxFQUFHLElBQUksQ0FBQzVCO0VBQ2IsQ0FBQyxDQUFDO0VBQ0YwQixHQUFHLENBQUNaLElBQUksQ0FBQztJQUNMYSxDQUFDLEVBQUcsUUFBUTtJQUNaQyxDQUFDLEVBQUcsSUFBSSxDQUFDM0I7RUFDYixDQUFDLENBQUM7RUFFRixPQUFPeUIsR0FBRztBQUNkLENBQUM7QUFFY3BDLDBFQUFXIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVxdWVzdC9tb2RlbC9BbHRpUmVxdWVzdC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHBhcmFtLiBkZXMgcmVxdcOqdGVzIGR1IHNlcnZpY2UgYWx0aW1ldHJpcXVlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuUmVxdWVzdC5BbHRpUmVxdWVzdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zLnBvc2l0aW9ucyAtIHRhYmxlYXUgZGUgY29vcmRvbm7DqWVzIGxvbi9sYXRcbiAqIEBwYXJhbSB7U3RyaW5nfSAgIG9wdGlvbnMuZGVsaW1pdGVyIC0gXCJ8XCJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gIG9wdGlvbnMuaW5kZW50IC0gZmFsc2V8dHJ1ZVxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3B0aW9ucy5jcnMgLSBcIkNSUzo4NFwiXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcHRpb25zLmZvcm1hdCAtIFwiSlNPTnxYTUxcIlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEFsdGlSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFsdGlSZXF1ZXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWx0aVJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQWx0aVJlcXVlc3QgKCldXCIpO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlIGRlcyBjb29yZG9ubsOpZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYyA9IFt7bG9uIDogXCJcIiwgbGF0IDogXCJcIn0sIHtsb24gOiBcIlwiLCBsYXQgOiBcIlwifV07XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ2FyYWN0w6hyZSBkZSBzw6lwYXJhdGlvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBcInxcIi5cbiAgICAgKi9cbiAgICB0aGlzLmRlbGltaXRlciA9IHRoaXMub3B0aW9ucy5kZWxpbWl0ZXIgfHwgXCJ8XCI7XG5cbiAgICAvKipcbiAgICAgKiBJbmRlbnRhdGlvbi5cbiAgICAgKiB0cnVlfGZhbHNlXG4gICAgICovXG4gICAgdGhpcy5pbmRlbnQgPSB0aGlzLm9wdGlvbnMuaW5kZW50IHx8IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdGlvbi5cbiAgICAgKiBQYXIgZGVmYXV0LCBDUlM6ODQuXG4gICAgICovXG4gICAgdGhpcy5jcnMgPSB0aGlzLm9wdGlvbnMuY3JzIHx8IFwiQ1JTOjg0XCI7XG5cbiAgICAvKipcbiAgICAgKiBmb3JtYXQgZGUgc29ydGllLlxuICAgICAqIFBhciBkZWZhdXQsIFwianNvblwiLlxuICAgICAqL1xuICAgIHRoaXMuZm9ybWF0ID0gdGhpcy5vcHRpb25zLmZvcm1hdCB8fCBcImpzb25cIjtcblxuICAgIC8qXG4gICAgICogUmVzc291cmNlIHV0aWxpc8OpZVxuICAgICovXG4gICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMub3B0aW9ucy5yZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFLDqXBvbnNlIGTDqXRhaWxsw6llIChzb3VyY2UgJiBhY2N1cmFjeSlcbiAgICAgKiB0cnVlfGZhbHNlXG4gICAgKi9cbiAgICB0aGlzLm1lYXN1cmVzID0gdGhpcy5vcHRpb25zLm1lYXN1cmVzIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIENMQVNTTkFNRVxuICovXG5BbHRpUmVxdWVzdC5DTEFTU05BTUUgPSBcIkFsdGlSZXF1ZXN0XCI7XG5cbkFsdGlSZXF1ZXN0LnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6QWx0aVJlcXVlc3QjXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogQWx0aVJlcXVlc3QsXG5cbiAgICAvKipcbiAgICAgKiBBam91dCBkXCJ1bmUgbGlzdGUgZGUgY29vcmRvbm7DqWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3RbXX0gbHN0UG9zaXRpb24gLSBsaXN0ZSBkZSBwb3NpdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG9iai5zZXRQb3NpdGlvbnMgKFt7bG9uIDogXCIwLjE1XCIsIGxhdCA6IFwiMC4xNVwifSwge2xvbiA6IFwiMS4xNVwiLCBsYXQgOiBcIjEuMTVcIn1dKTtcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbnMgOiBmdW5jdGlvbiAobHN0UG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxzdFBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGxzdFBvc2l0aW9uW2ldO1xuICAgICAgICAgICAgaWYgKG8ubG9uICYmIG8ubGF0KSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2gobyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGUgZGVzIGNvb3Jkb25uw6llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SW50fSBwb3MgLSBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIHtwb3NpdGlvbnN9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBvYmouZ2V0UG9zaXRpb25zICgpOyAgLy8gW3tsb24gOiBcIlwiLCBsYXQgOiBcIlwifSwge2xvbiA6IFwiXCIsIGxhdCA6IFwiXCJ9XVxuICAgICAqIG9iai5nZXRQb3NpdGlvbnMgKDApOyAvLyBbe2xvbiA6IFwiXCIsIGxhdCA6IFwiXCJ9XVxuICAgICAqL1xuICAgIGdldFBvc2l0aW9ucyA6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgLy8gRklYTUUgdGVzdCBpZiBub3QgYSBudW1iZXIgIT9cbiAgICAgICAgaWYgKCFwb3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucG9zaXRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChwb3MgPiBpbmRleCB8fCBwb3MgPCBpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImluZGV4IG91dCBvZiByYW5nZSAhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zW3Bvc107XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFqb3V0IGRcInVuZSBsaXN0ZSBkZSBjb29yZG9ubsOpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBsc3RQb3NpdGlvbiAtIGxpc3RlIGRlIHBvc2l0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogb2JqLmFkZFBvc2l0aW9ucyAoW3tsb24gOiBcIjAuMTVcIiwgbGF0IDogXCIwLjE1XCJ9LCB7bG9uIDogXCIxLjE1XCIsIGxhdCA6IFwiMS4xNVwifV0pO1xuICAgICAqL1xuICAgIGFkZFBvc2l0aW9ucyA6IGZ1bmN0aW9uIChsc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxzdFBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGxzdFBvc2l0aW9uW2ldO1xuICAgICAgICAgICAgaWYgKG8ubG9uICYmIG8ubGF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChsc3RQb3NpdGlvbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGEgbGlzdGUgZGVzIGxvbmdpdHVkZXMgYXZlYyB1biBjYXJhY3TDqHJlIGRlIHPDqXBhcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gLSB1bmUgbGlzdGUgZGUgbG9uZ2l0dWRlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gb3V0IDogMC4yMzY3fDIuMTU3MHw0My43ODl8Li4uXG4gICAgICovXG4gICAgZ2V0TG9uIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbHN0TG9uID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxzdExvbi5wdXNoKHRoaXMucG9zaXRpb25zW2ldLmxvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UobHN0TG9uKTtcbiAgICAgICAgcmV0dXJuIGxzdExvbi5qb2luKHRoaXMuZGVsaW1pdGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbGEgbGlzdGUgZGVzIGxhdHRpdHVkZXMgYXZlYyB1biBjYXJhY3TDqHJlIGRlIHPDqXBhcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gLSB1bmUgbGlzdGUgZGUgbGF0dGl0dWRlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gb3V0IDogMC4yMzY3fDIuMTU3MHw0My43ODl8Li4uXG4gICAgICovXG4gICAgZ2V0TGF0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbHN0TGF0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxzdExhdC5wdXNoKHRoaXMucG9zaXRpb25zW2ldLmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UobHN0TGF0KTtcbiAgICAgICAgcmV0dXJuIGxzdExhdC5qb2luKHRoaXMuZGVsaW1pdGVyKTtcbiAgICB9XG5cbn07XG5cbi8qKlxuICogVGFibGVhdSBkZSBjbGVmcy92YWxldXJzIHBvdXIgcGFyYW0uXG4gKlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5BbHRpUmVxdWVzdC5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gW107XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImxvblwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMb24oKVxuICAgIH0pO1xuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwibGF0XCIsXG4gICAgICAgIHYgOiB0aGlzLmdldExhdCgpXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJkZWxpbWl0ZXJcIixcbiAgICAgICAgdiA6IHRoaXMuZGVsaW1pdGVyXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJpbmRlbnRcIixcbiAgICAgICAgdiA6IHRoaXMuaW5kZW50XG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgdiA6IHRoaXMuY3JzXG4gICAgfSk7XG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJmb3JtYXRcIixcbiAgICAgICAgdiA6IHRoaXMuZm9ybWF0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlcXVlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Alti/Request/model/AltiRequest.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Response/AltiResponseFactory.js": +/*!***********************************************************!*\ + !*** ./src/Services/Alti/Response/AltiResponseFactory.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../Formats/XML */ \"./src/Formats/XML.js\");\n/* harmony import */ var _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Formats/AltiResponseReader */ \"./src/Services/Alti/Formats/AltiResponseReader.js\");\n/* harmony import */ var _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./model/AltiResponse */ \"./src/Services/Alti/Response/model/AltiResponse.js\");\n/* harmony import */ var _model_Elevation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./model/Elevation */ \"./src/Services/Alti/Response/model/Elevation.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module AltiResponseFactory\n * @private\n * @alias Gp.Services.Alti.Response.AltiResponseFactory\n */\n\n\n\n\n\n\n\nvar AltiResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AltiResponseFactory\");\n logger.trace([\"AltiResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n switch (options.outputFormat) {\n case \"xml\":\n logger.trace(\"analyze response : xml\");\n try {\n var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n reader: _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n if (typeof options.response === \"string\") {\n p.setXMLString(options.response);\n } else {\n p.setXMLDoc(options.response);\n }\n data = p.parse();\n if (!data) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION_2\"));\n }\n } catch (e) {\n var message = e.message;\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", message),\n status: 200,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n break;\n case \"json\":\n logger.trace(\"analyze response : json\");\n logger.trace(\"analyze response : \", _typeof(options.response));\n var JSONResponse = null;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // le service renvoie t il une erreur ?\n if (JSONResponse && JSONResponse.error) {\n // ex. {\"error\": {\"code\": \"BAD_PARAMETER\",\"description\": \"The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180).\"}}\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.error.description),\n status: 200,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n\n // analyse de la reponse\n if (JSONResponse) {\n var elevations = JSONResponse.elevations;\n var altiResponse = new _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n var elevation;\n if (Array.isArray(elevations) && elevations.length) {\n for (var i = 0; i < elevations.length; i++) {\n elevation = new _model_Elevation__WEBPACK_IMPORTED_MODULE_6__[\"default\"]();\n if (_typeof(elevations[i]) === \"object\") {\n // elevations[i] est un objet elevation\n if (elevations[i].lon) {\n elevation.lon = elevations[i].lon;\n }\n if (elevations[i].lat) {\n elevation.lat = elevations[i].lat;\n }\n if (elevations[i].z) {\n elevation.z = elevations[i].z;\n }\n if (elevations[i].acc) {\n elevation.acc = elevations[i].acc;\n }\n if (elevations[i].measures) {\n elevation.measures = elevations[i].measures;\n }\n } else if (typeof elevations[i] === \"number\") {\n // elevations[i] est un nombre, dans le cas de zonly=true notamment\n elevation.z = elevations[i];\n }\n if (Array.isArray(altiResponse.elevations)) {\n altiResponse.elevations.push(elevation);\n }\n }\n }\n data = altiResponse;\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n break;\n default:\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n } else if (data.error) {\n var errorMess = data.error.description;\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", errorMess),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnkuanM/NDc1MSJdLCJuYW1lcyI6WyJBbHRpUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIm91dHB1dEZvcm1hdCIsInAiLCJYTUwiLCJyZWFkZXIiLCJBbHRpUmVzcG9uc2VSZWFkZXIiLCJzZXRYTUxTdHJpbmciLCJzZXRYTUxEb2MiLCJwYXJzZSIsIkVycm9yIiwiTVJlcyIsImdldE1lc3NhZ2UiLCJlIiwibWVzc2FnZSIsIm9uRXJyb3IiLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJzdGF0dXMiLCJ0eXBlIiwiVFlQRV9TUlZFUlIiLCJfdHlwZW9mIiwiSlNPTlJlc3BvbnNlIiwiSlNPTiIsImVycm9yIiwiZGVzY3JpcHRpb24iLCJlbGV2YXRpb25zIiwiYWx0aVJlc3BvbnNlIiwiQWx0aVJlc3BvbnNlIiwiZWxldmF0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsIkVsZXZhdGlvbiIsImxvbiIsImxhdCIsInoiLCJhY2MiLCJtZWFzdXJlcyIsInB1c2giLCJUWVBFX1VOS0VSUiIsImV4Y2VwdGlvblJlcG9ydCIsImVycm9yTWVzcyIsIm9uU3VjY2VzcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNvRDtBQUNBO0FBQ1E7QUFDckI7QUFDd0I7QUFDZjtBQUNOO0FBRTFDLElBQUlBLG1CQUFtQixHQUFHO0VBRXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FB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WSxDQUFDO1lBQ2pESixPQUFPLEVBQUdILGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWIsSUFBSSxDQUFDNEMsZUFBZSxDQUFDO1lBQzdFdkIsSUFBSSxFQUFHRixnRUFBWSxDQUFDRyxXQUFXO1lBQy9CRixNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0osQ0FBQyxNQUFNLElBQUlwQixJQUFJLENBQUMwQixLQUFLLEVBQUU7VUFDbkIsSUFBSW1CLFNBQVMsR0FBRzdDLElBQUksQ0FBQzBCLEtBQUssQ0FBQ0MsV0FBVztVQUN0Q2hDLE9BQU8sQ0FBQ3FCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDdEIsT0FBTyxDQUFDdUIsS0FBSyxFQUFFLElBQUlDLGdFQUFZLENBQUM7WUFDakRKLE9BQU8sRUFBR0gsZ0VBQUksQ0FBQ0MsVUFBVSxDQUFDLDRCQUE0QixFQUFFZ0MsU0FBUyxDQUFDO1lBQ2xFeEIsSUFBSSxFQUFHRixnRUFBWSxDQUFDRyxXQUFXO1lBQy9CRixNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIekIsT0FBTyxDQUFDcUIsT0FBTyxDQUFDQyxJQUFJLENBQUN0QixPQUFPLENBQUN1QixLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ1AsZ0VBQUksQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztNQUNoRztJQUNKO0lBRUFsQixPQUFPLENBQUNtRCxTQUFTLENBQUM3QixJQUFJLENBQUN0QixPQUFPLENBQUN1QixLQUFLLEVBQUVsQixJQUFJLENBQUM7RUFDL0M7QUFDSixDQUFDO0FBRWNQLGtGQUFtQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL0FsdGlSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBYTUwgb3UgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEFsdGlSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5SZXNwb25zZS5BbHRpUmVzcG9uc2VGYWN0b3J5XG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IE1SZXMgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IFhNTCBmcm9tIFwiLi4vLi4vLi4vRm9ybWF0cy9YTUxcIjtcbmltcG9ydCBBbHRpUmVzcG9uc2VSZWFkZXIgZnJvbSBcIi4uL0Zvcm1hdHMvQWx0aVJlc3BvbnNlUmVhZGVyXCI7XG5pbXBvcnQgQWx0aVJlc3BvbnNlIGZyb20gXCIuL21vZGVsL0FsdGlSZXNwb25zZVwiO1xuaW1wb3J0IEVsZXZhdGlvbiBmcm9tIFwiLi9tb2RlbC9FbGV2YXRpb25cIjtcblxudmFyIEFsdGlSZXNwb25zZUZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBBbHRpXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICByZXNwb25zZSA6XG4gICAgICogICAgICBvdXRwdXRGb3JtYXQgOlxuICAgICAqICAgICAgcmF3UmVzcG9uc2UgOlxuICAgICAqICAgICAgc2NvcGUgOlxuICAgICAqICAgICAgb25TdWNjZXNzIDpcbiAgICAgKiAgICAgIG9uRXJyb3IgOlxuICAgICAqICAgfTtcbiAgICAgKlxuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiQWx0aVJlc3BvbnNlRmFjdG9yeVwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFtcIkFsdGlSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMub3V0cHV0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ4bWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiB4bWxcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgWE1MKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyIDogQWx0aVJlc3BvbnNlUmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRYTUxTdHJpbmcob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRYTUxEb2Mob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHAucGFyc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05fMlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05cIiwgbWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDoganNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiBcIiwgdHlwZW9mIG9wdGlvbnMucmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgSlNPTlJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IEpTT04ucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZSAmJiBKU09OUmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleC4ge1wiZXJyb3JcIjoge1wiY29kZVwiOiBcIkJBRF9QQVJBTUVURVJcIixcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHZhbHVlcyAoKSBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgdmFsaWQgbG9uZ2l0dWRlIChkb3VibGUgdmFsdWUgc3VjaCBhcyAtMTgwIDwgbGF0IDwgMTgwKS5cIn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBKU09OUmVzcG9uc2UuZXJyb3IuZGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxldmF0aW9ucyA9IEpTT05SZXNwb25zZS5lbGV2YXRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHRpUmVzcG9uc2UgPSBuZXcgQWx0aVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZXZhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGV2YXRpb25zKSAmJiBlbGV2YXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXZhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbiA9IG5ldyBFbGV2YXRpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGV2YXRpb25zW2ldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxldmF0aW9uc1tpXSBlc3QgdW4gb2JqZXQgZWxldmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5sb24gPSBlbGV2YXRpb25zW2ldLmxvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubGF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5sYXQgPSBlbGV2YXRpb25zW2ldLmxhdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ueikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb24ueiA9IGVsZXZhdGlvbnNbaV0uejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0uYWNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi5hY2MgPSBlbGV2YXRpb25zW2ldLmFjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZXZhdGlvbnNbaV0ubWVhc3VyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uLm1lYXN1cmVzID0gZWxldmF0aW9uc1tpXS5tZWFzdXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGV2YXRpb25zW2ldID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxldmF0aW9uc1tpXSBlc3QgdW4gbm9tYnJlLCBkYW5zIGxlIGNhcyBkZSB6b25seT10cnVlIG5vdGFtbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbi56ID0gZWxldmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0aVJlc3BvbnNlLmVsZXZhdGlvbnMucHVzaChlbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbHRpUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXzJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9VTktFUlIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfMlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfVU5LRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2kgbGEgcsOpcG9uc2UgY29udGVuYWl0IHVuZSBleGNlcHRpb24gcmVudm95w6llIHBhciBsZSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXhjZXB0aW9uUmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OXCIsIGRhdGEuZXhjZXB0aW9uUmVwb3J0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDBcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJvck1lc3MgPSBkYXRhLmVycm9yLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBlcnJvck1lc3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgZGF0YSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWx0aVJlc3BvbnNlRmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/AltiResponseFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Response/model/AltiResponse.js": +/*!**********************************************************!*\ + !*** ./src/Services/Alti/Response/model/AltiResponse.js ***! + \**********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} elevations - Elevations array.\n *\n * @namespace\n * @alias Gp.Services.AltiResponse\n */\nfunction AltiResponse() {\n if (!(this instanceof AltiResponse)) {\n throw new TypeError(\"AltiResponse constructor cannot be called as a function.\");\n }\n this.elevations = [];\n}\nAltiResponse.prototype = {\n constructor: AltiResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AltiResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0FsdGlSZXNwb25zZS5qcz8yYmM1Il0sIm5hbWVzIjpbIkFsdGlSZXNwb25zZSIsIlR5cGVFcnJvciIsImVsZXZhdGlvbnMiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsWUFBWUEsQ0FBQSxFQUFJO0VBQ3JCLElBQUksRUFBRSxJQUFJLFlBQVlBLFlBQVksQ0FBQyxFQUFFO0lBQ2pDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDBEQUEwRCxDQUFDO0VBQ25GO0VBRUEsSUFBSSxDQUFDQyxVQUFVLEdBQUcsRUFBRTtBQUN4QjtBQUVBRixZQUFZLENBQUNHLFNBQVMsR0FBRztFQUVyQkMsV0FBVyxFQUFHSjtBQUVsQixDQUFDO0FBRWNBLDJFQUFZIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVzcG9uc2UvbW9kZWwvQWx0aVJlc3BvbnNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIHtAbGluayBtb2R1bGU6U2VydmljZXN+Z2V0QWx0aXR1ZGUgR3AuU2VydmljZXMuZ2V0QWx0aXR1ZGUgKCl9IGludm9jYXRpb24gd2hlbiBzdWNjZXNzZnVsLiBSZWNlaXZlZCBhcyB0aGUgYXJndW1lbnQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEdwLlNlcnZpY2VzLkFsdGkuRWxldmF0aW9uPn0gZWxldmF0aW9ucyAtIEVsZXZhdGlvbnMgYXJyYXkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGlSZXNwb25zZVxuICovXG5mdW5jdGlvbiBBbHRpUmVzcG9uc2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbHRpUmVzcG9uc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBbHRpUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZXZhdGlvbnMgPSBbXTtcbn1cblxuQWx0aVJlc3BvbnNlLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogQWx0aVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFsdGlSZXNwb25zZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/AltiResponse.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Response/model/Elevation.js": +/*!*******************************************************!*\ + !*** ./src/Services/Alti/Response/model/Elevation.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if \"zonly\" parameter wasn't set to true.\n *\n * @property {Float} lat - Point latitude. (only if zonly=false)\n * @property {Float} lon - Point longitude. (only if zonly=false)\n * @property {Float} z - Point elevation.\n * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false)\n *\n * @namespace\n * @alias Gp.Services.Alti.Elevation\n */\nfunction Elevation() {\n if (!(this instanceof Elevation)) {\n throw new TypeError(\"Elevation constructor cannot be called as a function.\");\n }\n this.z = null;\n}\nElevation.prototype = {\n constructor: Elevation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Elevation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL0VsZXZhdGlvbi5qcz82NTZhIl0sIm5hbWVzIjpbIkVsZXZhdGlvbiIsIlR5cGVFcnJvciIsInoiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsU0FBU0EsQ0FBQSxFQUFJO0VBQ2xCLElBQUksRUFBRSxJQUFJLFlBQVlBLFNBQVMsQ0FBQyxFQUFFO0lBQzlCLE1BQU0sSUFBSUMsU0FBUyxDQUFDLHVEQUF1RCxDQUFDO0VBQ2hGO0VBRUEsSUFBSSxDQUFDQyxDQUFDLEdBQUcsSUFBSTtBQUNqQjtBQUVBRixTQUFTLENBQUNHLFNBQVMsR0FBRztFQUVsQkMsV0FBVyxFQUFHSjtBQUVsQixDQUFDO0FBRWNBLHdFQUFTIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0FsdGkvUmVzcG9uc2UvbW9kZWwvRWxldmF0aW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFNpbmdsZSBlbGV2YXRpb24gb2JqZWN0IHJldHVybmVkIGJ5IHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIENvbnRhaW5zIGF0IGxlYXN0LCBvbmUgZWxldmF0aW9uICh6KS4gTWF5IGFsc28gY29udGFpbiBwb2ludCBjb29yZGluYXRlcyBhbmQgZWxldmF0aW9uIGFjY3VyYWN5IGlmIFwiem9ubHlcIiBwYXJhbWV0ZXIgd2Fzbid0IHNldCB0byB0cnVlLlxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxhdCAtIFBvaW50IGxhdGl0dWRlLiAob25seSBpZiB6b25seT1mYWxzZSlcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxvbiAtIFBvaW50IGxvbmdpdHVkZS4gKG9ubHkgaWYgem9ubHk9ZmFsc2UpXG4gKiBAcHJvcGVydHkge0Zsb2F0fSB6IC0gUG9pbnQgZWxldmF0aW9uLlxuICogQHByb3BlcnR5IHtGbG9hdH0gYWNjIC0gQWNjdXJhY3kgb2YgZWxldmF0aW9uIGZvciB0aGlzIHBvaW50LiAob25seSBpZiB6b25seT1mYWxzZSlcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQWx0aS5FbGV2YXRpb25cbiAqL1xuZnVuY3Rpb24gRWxldmF0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRWxldmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRWxldmF0aW9uIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy56ID0gbnVsbDtcbn1cblxuRWxldmF0aW9uLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogRWxldmF0aW9uXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVsZXZhdGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/Elevation.js\n"); + +/***/ }), + +/***/ "./src/Services/Alti/Response/model/Measure.js": +/*!*****************************************************!*\ + !*** ./src/Services/Alti/Response/model/Measure.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single measure object returned by underlying web service if measures = true and zonly = false\n *\n * @property {String} source_name - Name of the source\n * @property {String} source_measure - Name of the measure\n * @property {Float} z - Point elevation.\n * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false)\n *\n * @namespace\n * @alias Gp.Services.Alti.Measure\n */\nfunction Measure() {\n if (!(this instanceof Measure)) {\n throw new TypeError(\"Measure constructor cannot be called as a function.\");\n }\n this.source_name = null;\n this.source_measure = null;\n this.z = null;\n this.acc = null;\n}\nMeasure.prototype = {\n constructor: Measure\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Measure);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BbHRpL1Jlc3BvbnNlL21vZGVsL01lYXN1cmUuanM/ZTNiMSJdLCJuYW1lcyI6WyJNZWFzdXJlIiwiVHlwZUVycm9yIiwic291cmNlX25hbWUiLCJzb3VyY2VfbWVhc3VyZSIsInoiLCJhY2MiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsT0FBT0EsQ0FBQSxFQUFJO0VBQ2hCLElBQUksRUFBRSxJQUFJLFlBQVlBLE9BQU8sQ0FBQyxFQUFFO0lBQzVCLE1BQU0sSUFBSUMsU0FBUyxDQUFDLHFEQUFxRCxDQUFDO0VBQzlFO0VBRUEsSUFBSSxDQUFDQyxXQUFXLEdBQUcsSUFBSTtFQUN2QixJQUFJLENBQUNDLGNBQWMsR0FBRyxJQUFJO0VBQzFCLElBQUksQ0FBQ0MsQ0FBQyxHQUFHLElBQUk7RUFDYixJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJO0FBQ25CO0FBRUFMLE9BQU8sQ0FBQ00sU0FBUyxHQUFHO0VBRWhCQyxXQUFXLEVBQUdQO0FBRWxCLENBQUM7QUFFY0Esc0VBQU8iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQWx0aS9SZXNwb25zZS9tb2RlbC9NZWFzdXJlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIFNpbmdsZSBtZWFzdXJlIG9iamVjdCByZXR1cm5lZCBieSB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGlmIG1lYXN1cmVzID0gdHJ1ZSBhbmQgem9ubHkgPSBmYWxzZVxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzb3VyY2VfbmFtZSAtIE5hbWUgb2YgdGhlIHNvdXJjZVxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNvdXJjZV9tZWFzdXJlIC0gTmFtZSBvZiB0aGUgbWVhc3VyZVxuICogQHByb3BlcnR5IHtGbG9hdH0geiAtIFBvaW50IGVsZXZhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGFjYyAtIEFjY3VyYWN5IG9mIGVsZXZhdGlvbiBmb3IgdGhpcyBwb2ludC4gKG9ubHkgaWYgem9ubHk9ZmFsc2UpXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkFsdGkuTWVhc3VyZVxuICovXG5mdW5jdGlvbiBNZWFzdXJlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWVhc3VyZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lYXN1cmUgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZV9uYW1lID0gbnVsbDtcbiAgICB0aGlzLnNvdXJjZV9tZWFzdXJlID0gbnVsbDtcbiAgICB0aGlzLnogPSBudWxsO1xuICAgIHRoaXMuYWNjID0gbnVsbDtcbn1cblxuTWVhc3VyZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IE1lYXN1cmVcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVhc3VyZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Alti/Response/model/Measure.js\n"); + +/***/ }), + +/***/ "./src/Services/AutoComplete/AutoComplete.js": +/*!***************************************************!*\ + !*** ./src/Services/AutoComplete/AutoComplete.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Response/AutoCompleteResponseFactory */ \"./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js\");\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'autocomplétion du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.AutoComplete\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.text - La chaîne de caractère à compléter.\n * Cette chaîne n'est pas \"URL encodée\".\n * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête.\n *\n * @param {Array.} [options.type = [\"StreetAddress\"]] - Type de l'objet recherché.\n * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, type = ['StreetAddress'].\n *\n * @param {String} [options.territory] - Limitation de la zone de recherche de localisants.\n * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE',\n * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31'\n * Pas de valeur par défaut.\n * La valeur par défaut est donc celle du service.\n * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié.\n *\n * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut.\n * La valeur par défaut sera donc celle du service : 10.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * text : \"\",\n * type : \"StreetAddress\",\n * territory : 'METROPOLE',\n * maximumResponses : 10\n * };\n */\nfunction AutoComplete(options_) {\n if (!(this instanceof AutoComplete)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"AutoComplete\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"AutoComplete\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getLogger(\"Gp.Services.AutoComplete\");\n this.logger.trace(\"[Constructeur AutoComplete (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].AutoComplete.newUrl();\n if (options.oldAutocompleteService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].AutoComplete.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].apply(this, arguments);\n if (!options.text) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"PARAM_MISSING\", \"text\"));\n }\n\n // ajout des options spécifiques au service\n this.options.text = options.text;\n\n // on definit des parametres par defaut\n if (!options.type) {\n options.type = [\"StreetAddress,PositionOfInterest\"];\n }\n this.options.type = options.type;\n this.options.territory = options.territory || \"\";\n this.options.maximumResponses = options.maximumResponses || 10;\n\n // INFO\n // le service ne repond pas en mode POST (405 Method Not Allowed)\n if (this.options.protocol === \"XHR\" && this.options.httpMethod === \"POST\") {\n this.logger.warn(\"Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !\");\n this.options.httpMethod = \"GET\"; // on surcharge !\n }\n\n // attributs d'instances\n\n /**\n * Format forcé de la réponse du service : \"json\"\n * sauf si l'on souhaite une reponse brute (options.rawResponse)\n */\n this.options.outputFormat = this.options.rawResponse ? \"\" : \"json\";\n}\n\n/**\n * @lends module:AutoComplete#\n */\n\nAutoComplete.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nAutoComplete.prototype.constructor = AutoComplete;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nAutoComplete.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (options.filterOptions.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.type) {\n options.type = options.filterOptions.type;\n }\n }\n if (options.filterOptions.territory) {\n this.logger.warn(\"The parameter 'filterOptions.territory' is deprecated\");\n if (!options.terr) {\n options.terr = options.filterOptions.territory;\n }\n }\n delete options.filterOptions;\n }\n return options;\n};\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nAutoComplete.prototype.buildRequest = function (error, success) {\n // ex.\n // http://wxs.ign.fr/CLEF/ols/apis/completion?\n // text=Brie-Comt&\n // type=StreetAddress,PositionOfInterest&\n // territory=METROPOLE&\n // maximumResponses=10\n\n // traitement des param KPV sous forme de tableau\n var territory = \"\";\n if (this.options.territory) {\n territory = this.options.territory;\n }\n var type = \"\";\n if (this.options.type) {\n type = this.options.type.join(\",\");\n }\n\n // normalisation de la requete avec param KPV\n this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__[\"default\"].normalyzeParameters({\n text: encodeURIComponent(this.options.text),\n type: type,\n terr: territory,\n maximumResponses: this.options.maximumResponses\n });\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback de succès de l'analyse de la réponse\n */\nAutoComplete.prototype.analyzeResponse = function (error, success) {\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onSuccess: success,\n onError: error,\n scope: this\n };\n _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoComplete);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvQXV0b0NvbXBsZXRlLmpzP2YyN2UiXSwibmFtZXMiOlsiQXV0b0NvbXBsZXRlIiwib3B0aW9uc18iLCJUeXBlRXJyb3IiLCJNUiIsImdldE1lc3NhZ2UiLCJDTEFTU05BTUUiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIm9wdGlvbnMiLCJwYXRjaE9wdGlvbkNvbnZlcnRvciIsInNlcnZlclVybCIsIkRlZmF1bHRVcmxTZXJ2aWNlIiwibmV3VXJsIiwib2xkQXV0b2NvbXBsZXRlU2VydmljZSIsInVybCIsIkNvbW1vblNlcnZpY2UiLCJhcHBseSIsImFyZ3VtZW50cyIsInRleHQiLCJFcnJvciIsInR5cGUiLCJ0ZXJyaXRvcnkiLCJtYXhpbXVtUmVzcG9uc2VzIiwicHJvdG9jb2wiLCJodHRwTWV0aG9kIiwid2FybiIsIm91dHB1dEZvcm1hdCIsInJhd1Jlc3BvbnNlIiwicHJvdG90eXBlIiwiT2JqZWN0IiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJmaWx0ZXJPcHRpb25zIiwidGVyciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImpvaW4iLCJyZXF1ZXN0IiwiSGVscGVyIiwibm9ybWFseXplUGFyYW1ldGVycyIsImVuY29kZVVSSUNvbXBvbmVudCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJzY29wZSIsIkF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeSIsImJ1aWxkIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDO0FBQ1E7QUFDNEI7QUFDaEM7QUFDRjtBQUNQO0FBQ2lCOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNuQlcsT0FBTyxFQUFHWixLQUFLO01BQ2ZhLEtBQUssRUFBRztJQUNaLENBQUM7SUFFREMsNkVBQTJCLENBQUNDLEtBQUssQ0FBQzFDLE9BQU8sQ0FBQztFQUM5QyxDQUFDLE1BQU07SUFDSDJCLEtBQUssQ0FBQ08sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJQyxnRUFBWSxDQUFDMUMsZ0VBQUUsQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztFQUMvRTtBQUNKLENBQUM7QUFFY0osMkVBQVkiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQXV0b0NvbXBsZXRlL0F1dG9Db21wbGV0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21tb25TZXJ2aWNlIGZyb20gXCIuLi9Db21tb25TZXJ2aWNlXCI7XG5pbXBvcnQgRGVmYXVsdFVybFNlcnZpY2UgZnJvbSBcIi4uL0RlZmF1bHRVcmxTZXJ2aWNlXCI7XG5pbXBvcnQgQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0F1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeVwiO1xuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgTVIgZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgSGVscGVyIGZyb20gXCIuLi8uLi9VdGlscy9IZWxwZXJcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQXBwZWwgZHUgc2VydmljZSBkJ2F1dG9jb21wbMOpdGlvbiBkdSBHw6lvcG9ydGFpbCA6XG4gKiBlbnZvaSBkZSBsYSByZXF1w6p0ZSBjb25zdHJ1aXRlIHNlbG9uIGxlcyBwYXJhbcOodHJlcyBlbiBvcHRpb25zLFxuICogw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiByZXRvdXIgZCd1bmUgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZSBkZSBsYSBmb25jdGlvbiBvblN1Y2Nlc3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBzcMOpY2lmaXF1ZXMgYXUgc2VydmljZSAoKyBsZXMgb3B0aW9ucyBoZXJpdMOpZXMpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGV4dCAtIExhIGNoYcOubmUgZGUgY2FyYWN0w6hyZSDDoCBjb21wbMOpdGVyLlxuICogICAgICBDZXR0ZSBjaGHDrm5lIG4nZXN0IHBhcyBcIlVSTCBlbmNvZMOpZVwiLlxuICogICAgICBDJ2VzdCBsJ0FQSSBxdWkgcydvY2N1cGUgZGUgbCdlbmNvZGVyIHBvdXIgbCdpbmNsdXJlIGRhbnMgbGEgcmVxdcOqdGUuXG4gKlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMudHlwZSA9IFtcIlN0cmVldEFkZHJlc3NcIl1dIC0gVHlwZSBkZSBsJ29iamV0IHJlY2hlcmNow6kuXG4gKiAgICAgIExlIHNlcnZpY2UgZCdhdXRvY29tcGzDqXRpb24gZHUgR8Opb3BvcnRhaWwgcGVybWV0IGRlIHJlY2hlcmNoZXIgZGVzIHRvcG9ueW1lcyAnUG9zaXRpb25PZkludGVyZXN0JyBldC9vdSBkZXMgYWRyZXNzZXMgcG9zdGFsZXMgJ1N0cmVldEFkZHJlc3MnLlxuICogICAgICBEJ2F1dHJlcyB0eXBlcyBwb3Vycm9udCDDqnRyZSByYWpvdXTDqXMgc2Vsb24gbCfDqXZvbHV0aW9uIGR1IHNlcnZpY2UuXG4gKiAgICAgIFBhciBkw6lmYXV0LCB0eXBlID0gWydTdHJlZXRBZGRyZXNzJ10uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRlcnJpdG9yeV0gLSBMaW1pdGF0aW9uIGRlIGxhIHpvbmUgZGUgcmVjaGVyY2hlIGRlIGxvY2FsaXNhbnRzLlxuICogICAgICBMZSBzZXJ2aWNlIGQnYXV0b2NvbXBsw6l0aW9uIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSBsaW1pdGVyIGxhIHJlY2hlcmNoZSDDoCBsYSBtw6l0cm9wb2xlIGV0IGxhIENvcnNlIDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnTUVUUk9QT0xFJyxcbiAqICAgICAgRE9NUyBUT01TIDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnRE9NVE9NJywgb3Ugw6AgdW4gZMOpcGFydGVtZW50IDogb3B0aW9ucy50ZXJyaXRvcnkgPSAnMzEnXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgcGFyIGTDqWZhdXQuXG4gKiAgICAgIExhIHZhbGV1ciBwYXIgZMOpZmF1dCBlc3QgZG9uYyBjZWxsZSBkdSBzZXJ2aWNlLlxuICogICAgICBMZSBzZXJ2aWNlIGQnYXV0b2NvbXBsw6l0aW9uIGR1IEfDqW9wb3J0YWlsIHJlbnZvaWUgdG91dGVzIGxlcyBpbmZvcm1hdGlvbnMgcXVhbmQgYXVjdW4gdGVycml0b2lyZSBuJ2VzdCBzcMOpY2lmacOpLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzID0gMTBdIC0gTm9tYnJlIGRlIHLDqXBvbnNlcyBtYXhpbWFsIHF1ZSBsJ29uIHNvdWhhaXRlIHJlY2V2b2lyLlxuICogICAgICBQYXMgZGUgdmFsZXVyIHBhciBkw6lmYXV0LlxuICogICAgICBMYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAxMC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgLy8gb3B0aW9ucyBjb21tdW5lcyBhdXggc2VydmljZXNcbiAqICAgICAgYXBpS2V5IDogbnVsbCxcbiAqICAgICAgc2VydmVyVXJsIDogJ2h0dHA6Ly9sb2NhbGhvc3Qvc2VydmljZS8nLFxuICogICAgICBwcm90b2NvbCA6ICdKU09OUCcsIC8vIEpTT05QfFhIUlxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgdGltZU91dCA6IDEwMDAwLCAvLyBtc1xuICogICAgICByYXdSZXNwb25zZSA6IGZhbHNlLCAvLyB0cnVlfGZhbHNlXG4gKiAgICAgIHNjb3BlIDogbnVsbCwgLy8gdGhpc1xuICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICogICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICogICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gKiAgICAgIHRleHQgOiBcIlwiLFxuICogICAgICB0eXBlIDogXCJTdHJlZXRBZGRyZXNzXCIsXG4gKiAgICAgIHRlcnJpdG9yeSA6ICdNRVRST1BPTEUnLFxuICogICAgICBtYXhpbXVtUmVzcG9uc2VzIDogMTBcbiAqICAgfTtcbiAqL1xuZnVuY3Rpb24gQXV0b0NvbXBsZXRlIChvcHRpb25zXykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoTVIuZ2V0TWVzc2FnZShcIkNMQVNTX0NPTlNUUlVDVE9SXCIsIFwiQXV0b0NvbXBsZXRlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKiBGSVhNRSBpbnN0YW5jZSBvdSBjbGFzc2UgP1xuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJBdXRvQ29tcGxldGVcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLlNlcnZpY2VzLkF1dG9Db21wbGV0ZVwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQXV0b0NvbXBsZXRlIChvcHRpb25zKV1cIik7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMucGF0Y2hPcHRpb25Db252ZXJ0b3Iob3B0aW9uc18pO1xuXG4gICAgaWYgKCFvcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICBvcHRpb25zLnNlcnZlclVybCA9IERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS5uZXdVcmwoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub2xkQXV0b2NvbXBsZXRlU2VydmljZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5BdXRvQ29tcGxldGUudXJsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQ29tbW9uU2VydmljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKCFvcHRpb25zLnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKE1SLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwidGV4dFwiKSk7XG4gICAgfVxuXG4gICAgLy8gYWpvdXQgZGVzIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2VcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dDtcblxuICAgIC8vIG9uIGRlZmluaXQgZGVzIHBhcmFtZXRyZXMgcGFyIGRlZmF1dFxuICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFtcIlN0cmVldEFkZHJlc3MsUG9zaXRpb25PZkludGVyZXN0XCJdO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgIHRoaXMub3B0aW9ucy50ZXJyaXRvcnkgPSBvcHRpb25zLnRlcnJpdG9yeSB8fCBcIlwiO1xuICAgIHRoaXMub3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzID0gb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzIHx8IDEwO1xuXG4gICAgLy8gSU5GT1xuICAgIC8vIGxlIHNlcnZpY2UgbmUgcmVwb25kIHBhcyBlbiBtb2RlIFBPU1QgKDQwNSBNZXRob2QgTm90IEFsbG93ZWQpXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm90b2NvbCA9PT0gXCJYSFJcIiAmJiB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkxlIHNlcnZpY2UgbmUgZ8OpcmUgcGFzIGxlIG1vZGUgZCdpbnRlcnJvZ2F0aW9uIGVuIFBPU1QsIG9uIGJhc2N1bGUgc3VyIGR1IEdFVCAhXCIpO1xuICAgICAgICB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9IFwiR0VUXCI7IC8vIG9uIHN1cmNoYXJnZSAhXG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRzIGQnaW5zdGFuY2VzXG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgZm9yY8OpIGRlIGxhIHLDqXBvbnNlIGR1IHNlcnZpY2UgOiBcImpzb25cIlxuICAgICAqIHNhdWYgc2kgbCdvbiBzb3VoYWl0ZSB1bmUgcmVwb25zZSBicnV0ZSAob3B0aW9ucy5yYXdSZXNwb25zZSlcbiAgICAgKi9cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gKHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSkgPyBcIlwiIDogXCJqc29uXCI7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpBdXRvQ29tcGxldGUjXG4gKi9cblxuQXV0b0NvbXBsZXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5BdXRvQ29tcGxldGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXV0b0NvbXBsZXRlO1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc18gLSBvcHRpb25zIGR1IHNlcnZpY2VcbiAqIEByZXR1cm4ge09iamVjdH0gLSBvcHRpb25zXG4gKi9cbkF1dG9Db21wbGV0ZS5wcm90b3R5cGUucGF0Y2hPcHRpb25Db252ZXJ0b3IgPSBmdW5jdGlvbiAob3B0aW9uc18pIHtcbiAgICBjb25zdCBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zJyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLnRlcnJpdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudGVycml0b3J5JyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnRlcnIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlcnIgPSBvcHRpb25zLmZpbHRlck9wdGlvbnMudGVycml0b3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cbkF1dG9Db21wbGV0ZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gZXguXG4gICAgLy8gaHR0cDovL3d4cy5pZ24uZnIvQ0xFRi9vbHMvYXBpcy9jb21wbGV0aW9uP1xuICAgIC8vIHRleHQ9QnJpZS1Db210JlxuICAgIC8vIHR5cGU9U3RyZWV0QWRkcmVzcyxQb3NpdGlvbk9mSW50ZXJlc3QmXG4gICAgLy8gdGVycml0b3J5PU1FVFJPUE9MRSZcbiAgICAvLyBtYXhpbXVtUmVzcG9uc2VzPTEwXG5cbiAgICAvLyB0cmFpdGVtZW50IGRlcyBwYXJhbSBLUFYgc291cyBmb3JtZSBkZSB0YWJsZWF1XG4gICAgdmFyIHRlcnJpdG9yeSA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50ZXJyaXRvcnkpIHtcbiAgICAgICAgdGVycml0b3J5ID0gdGhpcy5vcHRpb25zLnRlcnJpdG9yeTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgIHR5cGUgPSB0aGlzLm9wdGlvbnMudHlwZS5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2F0aW9uIGRlIGxhIHJlcXVldGUgYXZlYyBwYXJhbSBLUFZcbiAgICB0aGlzLnJlcXVlc3QgPSBIZWxwZXIubm9ybWFseXplUGFyYW1ldGVycyh7XG4gICAgICAgIHRleHQgOiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5vcHRpb25zLnRleHQpLFxuICAgICAgICB0eXBlIDogdHlwZSxcbiAgICAgICAgdGVyciA6IHRlcnJpdG9yeSxcbiAgICAgICAgbWF4aW11bVJlc3BvbnNlcyA6IHRoaXMub3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzXG4gICAgfSk7XG5cbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoTVIuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRFwiKSkpXG4gICAgICAgIDogc3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMucmVxdWVzdCk7XG59O1xuXG4vKipcbiAqIChvdmVyd3JpdGUpXG4gKiBBbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBkZSBzdWNjw6hzIGRlIGwnYW5hbHlzZSBkZSBsYSByw6lwb25zZVxuICovXG5BdXRvQ29tcGxldGUucHJvdG90eXBlLmFuYWx5emVSZXNwb25zZSA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgcmVzcG9uc2UgOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgICAgICAgcmF3UmVzcG9uc2UgOiB0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UsXG4gICAgICAgICAgICBvblN1Y2Nlc3MgOiBzdWNjZXNzLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzXG4gICAgICAgIH07XG5cbiAgICAgICAgQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yLmNhbGwodGhpcywgbmV3IEVycm9yU2VydmljZShNUi5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FTVBUWVwiKSkpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/AutoComplete.js\n"); + +/***/ }), + +/***/ "./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js": +/*!***************************************************************************!*\ + !*** ./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/AutoCompleteResponse */ \"./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\");\n/* harmony import */ var _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/SuggestedLocation */ \"./src/Services/AutoComplete/Response/model/SuggestedLocation.js\");\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module AutoCompleteResponseFactory\n * @private\n * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory\n */\n\n\n\n\n\nvar AutoCompleteResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Alti\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"AutoCompleteResponseFactory\");\n logger.trace([\"AutoCompleteResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n var JSONResponse = null;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // analyse de la réponse\n if (JSONResponse) {\n // le service renvoie t il une erreur ?\n if (JSONResponse.error) {\n // ex. ?\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.error.description),\n status: JSONResponse.error.code,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR\n }));\n return;\n }\n\n // création de l'objet réponse\n data = new _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n\n // boucle sur les résultats de l'autocomplétion\n if (JSONResponse.results && Array.isArray(JSONResponse.results)) {\n var suggestedLocation = null;\n for (var i = 0; i < JSONResponse.results.length; i++) {\n var result = JSONResponse.results[i];\n suggestedLocation = new _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n if (result) {\n if (result.country === \"StreetAddress\") {\n suggestedLocation.street = result.street;\n suggestedLocation.type = \"StreetAddress\";\n } else if (result.country === \"PositionOfInterest\") {\n suggestedLocation.poi = result.street;\n suggestedLocation.kind = result.kind;\n suggestedLocation.type = \"PositionOfInterest\";\n }\n if (suggestedLocation.position) {\n suggestedLocation.position.x = result.x;\n suggestedLocation.position.y = result.y;\n }\n suggestedLocation.commune = result.city;\n suggestedLocation.fullText = result.fulltext;\n suggestedLocation.postalCode = result.zipcode;\n suggestedLocation.classification = result.classification;\n }\n // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation\n data.suggestedLocations.push(suggestedLocation);\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_3\")));\n return;\n }\n if (!data.suggestedLocations.length) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_FORMAT_3\")));\n return;\n }\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE_2\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n // si la réponse (xmlString) est vide, on appelle le callback d'erreur\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n\n // si tout s'est bien passé, on appelle le callback de succès\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoCompleteResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5LmpzPzdhZTMiXSwibmFtZXMiOlsiQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsImVycm9yIiwib25FcnJvciIsImNhbGwiLCJzY29wZSIsIkVycm9yU2VydmljZSIsIm1lc3NhZ2UiLCJNUmVzIiwiZ2V0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwic3RhdHVzIiwiY29kZSIsInR5cGUiLCJUWVBFX1NSVkVSUiIsIkF1dG9Db21wbGV0ZVJlc3BvbnNlIiwicmVzdWx0cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3RlZExvY2F0aW9uIiwiaSIsImxlbmd0aCIsInJlc3VsdCIsIlN1Z2dlc3RlZExvY2F0aW9uIiwiY291bnRyeSIsInN0cmVldCIsInBvaSIsImtpbmQiLCJwb3NpdGlvbiIsIngiLCJ5IiwiY29tbXVuZSIsImNpdHkiLCJmdWxsVGV4dCIsImZ1bGx0ZXh0IiwicG9zdGFsQ29kZSIsInppcGNvZGUiLCJjbGFzc2lmaWNhdGlvbiIsInN1Z2dlc3RlZExvY2F0aW9ucyIsInB1c2giLCJUWVBFX1VOS0VSUiIsImV4Y2VwdGlvblJlcG9ydCIsIm9uU3VjY2VzcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNvRDtBQUNBO0FBQ1E7QUFDSTtBQUNOO0FBRTFELElBQUlBLDJCQUEyQixHQUFHO0VBRTlCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsNkJBQTZCLENBQUM7SUFDNURGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUV0RCxJQUFJQyxJQUFJLEdBQUcsSUFBSTtJQUVmLElBQUlMLE9BQU8sQ0FBQ00sUUFBUSxFQUFFO01BQ2xCLElBQUlOLE9BQU8sQ0FBQ08sV0FBVyxFQUFFO1FBQ3JCTixNQUFNLENBQUNHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztRQUN0Q0MsSUFBSSxHQUFHTCxPQUFPLENBQUNNLFFBQVE7TUFDM0IsQ0FBQyxNQUFNO1FBQ0gsSUFBSUUsWUFBWSxHQUFHLElBQUk7UUFDdkIsSUFBSSxPQUFPUixPQUFPLENBQUNNLFFBQVEsS0FBSyxRQUFRLEVBQUU7VUFDdENFLFlBQVksR0FBR0MsSUFBSSxDQUFDQyxLQUFLLENBQUNWLE9BQU8sQ0FBQ00sUUFBUSxDQUFDO1FBQy9DLENBQUMsTUFBTTtVQUNIRSxZQUFZLEdBQUdSLE9BQU8sQ0FBQ00sUUFBUTtRQUNuQzs7UUFFQTtRQUNBLElBQUlFLFlBQVksRUFBRTtVQUNkO1VBQ0EsSUFBSUEsWUFBWSxDQUFDRyxLQUFLLEVBQUU7WUFDcEI7WUFDQVgsT0FBTyxDQUFDWSxPQUFPLENBQUNDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQztjQUNqREMsT0FBTyxFQUFHQyxnRUFBSSxDQUFDQyxVQUFVLENBQUMsNEJBQTRCLEVBQUVWLFlBQVksQ0FBQ0csS0FBSyxDQUFDUSxXQUFXLENBQUM7Y0FDdkZDLE1BQU0sRUFBR1osWUFBWSxDQUFDRyxLQUFLLENBQUNVLElBQUk7Y0FDaENDLElBQUksRUFBR1AsZ0VBQVksQ0FBQ1E7WUFDeEIsQ0FBQyxDQUFDLENBQUM7WUFDSDtVQUNKOztVQUVBO1VBQ0FsQixJQUFJLEdBQUcsSUFBSW1CLG1FQUFvQixDQUFDLENBQUM7O1VBRWpDO1VBQ0EsSUFBSWhCLFlBQVksQ0FBQ2lCLE9BQU8sSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNuQixZQUFZLENBQUNpQixPQUFPLENBQUMsRUFBRTtZQUM3RCxJQUFJRyxpQkFBaUIsR0FBRyxJQUFJO1lBRTVCLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckIsWUFBWSxDQUFDaUIsT0FBTyxDQUFDSyxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO2NBQ2xELElBQUlFLE1BQU0sR0FBR3ZCLFlBQVksQ0FBQ2lCLE9BQU8sQ0FBQ0ksQ0FBQyxDQUFDO2NBQ3BDRCxpQkFBaUIsR0FBRyxJQUFJSSxnRUFBaUIsQ0FBQyxDQUFDO2NBRTNDLElBQUlELE1BQU0sRUFBRTtnQkFDUixJQUFJQSxNQUFNLENBQUNFLE9BQU8sS0FBSyxlQUFlLEVBQUU7a0JBQ3BDTCxpQkFBaUIsQ0FBQ00sTUFBTSxHQUFHSCxNQUFNLENBQUNHLE1BQU07a0JBQ3hDTixpQkFBaUIsQ0FBQ04sSUFBSSxHQUFHLGVBQWU7Z0JBQzVDLENBQUMsTUFBTSxJQUFJUyxNQUFNLENBQUNFLE9BQU8sS0FBSyxvQkFBb0IsRUFBRTtrQkFDaERMLGlCQUFpQixDQUFDTyxHQUFHLEdBQUdKLE1BQU0sQ0FBQ0csTUFBTTtrQkFDckNOLGlCQUFpQixDQUFDUSxJQUFJLEdBQUdMLE1BQU0sQ0FBQ0ssSUFBSTtrQkFDcENSLGlCQUFpQixDQUFDTixJQUFJLEdBQUcsb0JBQW9CO2dCQUNqRDtnQkFFQSxJQUFJTSxpQkFBaUIsQ0FBQ1MsUUFBUSxFQUFFO2tCQUM1QlQsaUJBQWlCLENBQUNTLFFBQVEsQ0FBQ0MsQ0FBQyxHQUFHUCxNQUFNLENBQUNPLENBQUM7a0JBQ3ZDVixpQkFBaUIsQ0FBQ1MsUUFBUSxDQUFDRSxDQUFDLEdBQUdSLE1BQU0sQ0FBQ1EsQ0FBQztnQkFDM0M7Z0JBRUFYLGlCQUFpQixDQUFDWSxPQUFPLEdBQUdULE1BQU0sQ0FBQ1UsSUFBSTtnQkFDdkNiLGlCQUFpQixDQUFDYyxRQUFRLEdBQUdYLE1BQU0sQ0FBQ1ksUUFBUTtnQkFDNUNmLGlCQUFpQixDQUFDZ0IsVUFBVSxHQUFHYixNQUFNLENBQUNjLE9BQU87Z0JBQzdDakIsaUJBQWlCLENBQUNrQixjQUFjLEdBQUdmLE1BQU0sQ0FBQ2UsY0FBYztjQUM1RDtjQUNBO2NBQ0F6QyxJQUFJLENBQUMwQyxrQkFBa0IsQ0FBQ0MsSUFBSSxDQUFDcEIsaUJBQWlCLENBQUM7WUFDbkQ7VUFDSixDQUFDLE1BQU07WUFDSDVCLE9BQU8sQ0FBQ1ksT0FBTyxDQUFDQyxJQUFJLENBQUNiLE9BQU8sQ0FBQ2MsS0FBSyxFQUFFLElBQUlDLGdFQUFZLENBQUNFLGdFQUFJLENBQUNDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7WUFDbkc7VUFDSjtVQUVBLElBQUksQ0FBQ2IsSUFBSSxDQUFDMEMsa0JBQWtCLENBQUNqQixNQUFNLEVBQUU7WUFDakM5QixPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDRSxnRUFBSSxDQUFDQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO1lBQ25HO1VBQ0o7UUFDSjtRQUVBLElBQUksQ0FBQ2IsSUFBSSxFQUFFO1VBQ1BMLE9BQU8sQ0FBQ1ksT0FBTyxDQUFDQyxJQUFJLENBQUNiLE9BQU8sQ0FBQ2MsS0FBSyxFQUFFLElBQUlDLGdFQUFZLENBQUM7WUFDakRDLE9BQU8sRUFBR0MsZ0VBQUksQ0FBQ0MsVUFBVSxDQUFDLDRCQUE0QixDQUFDO1lBQ3ZESSxJQUFJLEVBQUdQLGdFQUFZLENBQUNrQyxXQUFXO1lBQy9CN0IsTUFBTSxFQUFHLENBQUM7VUFDZCxDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0o7O1FBRUE7UUFDQSxJQUFJZixJQUFJLENBQUM2QyxlQUFlLEVBQUU7VUFDdEJsRCxPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDO1lBQ2pEQyxPQUFPLEVBQUdDLGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWIsSUFBSSxDQUFDNkMsZUFBZSxDQUFDO1lBQzdFNUIsSUFBSSxFQUFHUCxnRUFBWSxDQUFDUSxXQUFXO1lBQy9CSCxNQUFNLEVBQUc7VUFDYixDQUFDLENBQUMsQ0FBQztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIO01BQ0FwQixPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDRSxnRUFBSSxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO01BQ2hHO0lBQ0o7O0lBRUE7SUFDQWxCLE9BQU8sQ0FBQ21ELFNBQVMsQ0FBQ3RDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUVULElBQUksQ0FBQztFQUMvQztBQUNKLENBQUM7QUFFY1AsMEZBQTJCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9BdXRvQ29tcGxldGVSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBYTUwgb3UgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeVxuICogQHByaXZhdGVcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGUuUmVzcG9uc2UuQXV0b0NvbXBsZXRlUmVzcG9uc2VGYWN0b3J5XG4gKi9cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IE1SZXMgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IEF1dG9Db21wbGV0ZVJlc3BvbnNlIGZyb20gXCIuL21vZGVsL0F1dG9Db21wbGV0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgU3VnZ2VzdGVkTG9jYXRpb24gZnJvbSBcIi4vbW9kZWwvU3VnZ2VzdGVkTG9jYXRpb25cIjtcblxudmFyIEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeSA9IHtcblxuICAgIC8qKlxuICAgICAqIGludGVyZmFjZSB1bmlxdWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgYnVpbGRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IEFsdGlcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJBdXRvQ29tcGxldGVSZXNwb25zZUZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJBdXRvQ29tcGxldGVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgSlNPTlJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gSlNPTi5wYXJzZShvcHRpb25zLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBKU09OUmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFuYWx5c2UgZGUgbGEgcsOpcG9uc2VcbiAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleC4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OXCIsIEpTT05SZXNwb25zZS5lcnJvci5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogSlNPTlJlc3BvbnNlLmVycm9yLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY3LDqWF0aW9uIGRlIGwnb2JqZXQgcsOpcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBBdXRvQ29tcGxldGVSZXNwb25zZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGJvdWNsZSBzdXIgbGVzIHLDqXN1bHRhdHMgZGUgbCdhdXRvY29tcGzDqXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZS5yZXN1bHRzICYmIEFycmF5LmlzQXJyYXkoSlNPTlJlc3BvbnNlLnJlc3VsdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VnZ2VzdGVkTG9jYXRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEpTT05SZXNwb25zZS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEpTT05SZXNwb25zZS5yZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uID0gbmV3IFN1Z2dlc3RlZExvY2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY291bnRyeSA9PT0gXCJTdHJlZXRBZGRyZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uLnN0cmVldCA9IHJlc3VsdC5zdHJlZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi50eXBlID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNvdW50cnkgPT09IFwiUG9zaXRpb25PZkludGVyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZExvY2F0aW9uLnBvaSA9IHJlc3VsdC5zdHJlZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5raW5kID0gcmVzdWx0LmtpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi50eXBlID0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0ZWRMb2NhdGlvbi5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zaXRpb24ueCA9IHJlc3VsdC54O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zaXRpb24ueSA9IHJlc3VsdC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24uY29tbXVuZSA9IHJlc3VsdC5jaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5mdWxsVGV4dCA9IHJlc3VsdC5mdWxsdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkTG9jYXRpb24ucG9zdGFsQ29kZSA9IHJlc3VsdC56aXBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRMb2NhdGlvbi5jbGFzc2lmaWNhdGlvbiA9IHJlc3VsdC5jbGFzc2lmaWNhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWpvdXQgZHUgcsOpc3VsdGF0IGF1IHRhYmxlYXUgcmV2ZXJzZUdlb2NvZGVkTG9jYXRpb25zIGRlIGdlb2NvZGVkTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Z2dlc3RlZExvY2F0aW9ucy5wdXNoKHN1Z2dlc3RlZExvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfM1wiKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Z2dlc3RlZExvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfM1wiKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRV8yXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNpIGxhIHLDqXBvbnNlIGNvbnRlbmFpdCB1bmUgZXhjZXB0aW9uIHJlbnZvecOpZSBwYXIgbGUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmV4Y2VwdGlvblJlcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBkYXRhLmV4Y2VwdGlvblJlcG9ydCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogMjAwXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNpIGxhIHLDqXBvbnNlICh4bWxTdHJpbmcpIGVzdCB2aWRlLCBvbiBhcHBlbGxlIGxlIGNhbGxiYWNrIGQnZXJyZXVyXG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNpIHRvdXQgcydlc3QgYmllbiBwYXNzw6ksIG9uIGFwcGVsbGUgbGUgY2FsbGJhY2sgZGUgc3VjY8Ooc1xuICAgICAgICBvcHRpb25zLm9uU3VjY2Vzcy5jYWxsKG9wdGlvbnMuc2NvcGUsIGRhdGEpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZVJlc3BvbnNlRmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js": +/*!**************************************************************************!*\ + !*** ./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} suggestedLocations - SuggestedLocations array.\n *\n * @namespace\n * @alias Gp.Services.AutoCompleteResponse\n */\nfunction AutoCompleteResponse() {\n if (!(this instanceof AutoCompleteResponse)) {\n throw new TypeError(\"AutoCompleteResponse constructor cannot be called as a function.\");\n }\n this.suggestedLocations = [];\n}\nAutoCompleteResponse.prototype = {\n constructor: AutoCompleteResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (AutoCompleteResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvbW9kZWwvQXV0b0NvbXBsZXRlUmVzcG9uc2UuanM/NjViOSJdLCJuYW1lcyI6WyJBdXRvQ29tcGxldGVSZXNwb25zZSIsIlR5cGVFcnJvciIsInN1Z2dlc3RlZExvY2F0aW9ucyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxvQkFBb0JBLENBQUEsRUFBSTtFQUM3QixJQUFJLEVBQUUsSUFBSSxZQUFZQSxvQkFBb0IsQ0FBQyxFQUFFO0lBQ3pDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLGtFQUFrRSxDQUFDO0VBQzNGO0VBRUEsSUFBSSxDQUFDQyxrQkFBa0IsR0FBRyxFQUFFO0FBQ2hDO0FBRUFGLG9CQUFvQixDQUFDRyxTQUFTLEdBQUc7RUFFN0JDLFdBQVcsRUFBR0o7QUFFbEIsQ0FBQztBQUVjQSxtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQXV0b0NvbXBsZXRlL1Jlc3BvbnNlL21vZGVsL0F1dG9Db21wbGV0ZVJlc3BvbnNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIHtAbGluayBtb2R1bGU6U2VydmljZXN+YXV0b0NvbXBsZXRlIEdwLlNlcnZpY2VzLmF1dG9Db21wbGV0ZSAoKX0gaW52b2NhdGlvbiB3aGVuIHN1Y2Nlc3NmdWwuIFJlY2VpdmVkIGFzIHRoZSBhcmd1bWVudCBvZiBvblN1Y2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHByb3BlcnR5IHtBcnJheS48R3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uPn0gc3VnZ2VzdGVkTG9jYXRpb25zIC0gU3VnZ2VzdGVkTG9jYXRpb25zIGFycmF5LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5BdXRvQ29tcGxldGVSZXNwb25zZVxuICovXG5mdW5jdGlvbiBBdXRvQ29tcGxldGVSZXNwb25zZSAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVJlc3BvbnNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXV0b0NvbXBsZXRlUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1Z2dlc3RlZExvY2F0aW9ucyA9IFtdO1xufVxuXG5BdXRvQ29tcGxldGVSZXNwb25zZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IEF1dG9Db21wbGV0ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9Db21wbGV0ZVJlc3BvbnNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/model/AutoCompleteResponse.js\n"); + +/***/ }), + +/***/ "./src/Services/AutoComplete/Response/model/SuggestedLocation.js": +/*!***********************************************************************!*\ + !*** ./src/Services/AutoComplete/Response/model/SuggestedLocation.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single SuggestedLocation Object returned by underlying web service.\n * Each suggested location represents a street address (\"StreetAddress\") or a place name (\"PositionOfInterest\").\n *\n * @property {String} type - Suggested location type : \"StreetAddress\" ou \"PositionOfInterest\"\n * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system.\n * @property {String} commune - Suggested municipality\n * @property {String} fullText - Full text representation of the suggested location.\n * @property {String} postalCode - Suggested location postcode\n * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).\n * @property {String} street - Street name of the suggested location (\"StreetAddress\" only).\n * @property {String} kind - Nature of the suggested location : \"prefecture\", \"monument\", \"commune\", ... for instance (\"PositionOfInterest\" only).\n *\n * @namespace\n * @alias Gp.Services.AutoComplete.SuggestedLocation\n */\nfunction SuggestedLocation() {\n if (!(this instanceof SuggestedLocation)) {\n throw new TypeError(\"SuggestedLocation constructor cannot be called as a function.\");\n }\n\n /* REPONSE :\n {\n \"status\" : \"OK\",\n \"results\" : [\n {\n \"country\":\"PositionOfInterest\",\n \"x\":-1.559185,\n \"y\":47.952603,\n \"city\":\"Brie\",\n \"zipcode\":\"35150\",\n \"street\":\"corbe\",\n \"kind\":\"Lieu-dit habité\",\n \"fulltext\":\"corbe, 35150 Brie\",\n \"classification\":6\n },\n {\n \"country\":\"StreetAddress\",\n \"x\":1.538295,\n \"y\":43.19646,\n \"city\":\"Brie\",\n \"zipcode\":\"09700\",\n \"street\":\"courreste\",\n \"kind\":\"\",\n \"fulltext\":\"courreste, 09700 Brie\",\n \"classification\":7\n }\n ]\n }\n */\n\n /* REPONSE EN ERREUR\n {\n status : \"ERROR\",\n results : [ ]\n }\n */\n\n /**\n * Suggested location type : \"StreetAddress\" ou \"PositionOfInterest\"\n * @type {String}\n */\n this.type = null;\n\n /**\n * Position of the suggested location given in requested coordinates system.\n * @type {Gp.Point}\n */\n this.position = {\n x: null,\n y: null\n };\n\n /**\n * Suggested municipality\n * @type {String}\n */\n this.commune = null;\n\n /**\n * Full text representation of the suggested location.\n * @type {String}\n */\n this.fullText = null;\n\n /**\n * Suggested location postcode\n * @type {Number}\n */\n this.postalCode = null;\n\n /**\n * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important).\n * @type {Integer}\n */\n this.classification = null;\n\n /**\n * Street name of the suggested location (\"StreetAddress\" only).\n * @type {String}\n */\n this.street = null;\n\n /**\n * Place name of the suggested location (\"PositionOfInterest\" only).\n * @type {String}\n */\n this.poi = null;\n\n /**\n * Nature of the suggested location : \"prefecture\", \"monument\", \"commune\", ... for instance (\"PositionOfInterest\" only).\n * @type {String}\n */\n this.kind = null;\n}\nSuggestedLocation.prototype = {\n constructor: SuggestedLocation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SuggestedLocation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9BdXRvQ29tcGxldGUvUmVzcG9uc2UvbW9kZWwvU3VnZ2VzdGVkTG9jYXRpb24uanM/ODM1YyJdLCJuYW1lcyI6WyJTdWdnZXN0ZWRMb2NhdGlvbiIsIlR5cGVFcnJvciIsInR5cGUiLCJwb3NpdGlvbiIsIngiLCJ5IiwiY29tbXVuZSIsImZ1bGxUZXh0IiwicG9zdGFsQ29kZSIsImNsYXNzaWZpY2F0aW9uIiwic3RyZWV0IiwicG9pIiwia2luZCIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsaUJBQWlCQSxDQUFBLEVBQUk7RUFDMUIsSUFBSSxFQUFFLElBQUksWUFBWUEsaUJBQWlCLENBQUMsRUFBRTtJQUN0QyxNQUFNLElBQUlDLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztFQUN4Rjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFSTtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7O0VBRWhCO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxRQUFRLEdBQUc7SUFDWkMsQ0FBQyxFQUFHLElBQUk7SUFDUkMsQ0FBQyxFQUFHO0VBQ1IsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7O0VBRW5CO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTs7RUFFcEI7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLFVBQVUsR0FBRyxJQUFJOztFQUV0QjtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsY0FBYyxHQUFHLElBQUk7O0VBRTFCO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSTs7RUFFbEI7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJOztFQUVmO0FBQ0o7QUFDQTtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtBQUNwQjtBQUVBWixpQkFBaUIsQ0FBQ2EsU0FBUyxHQUFHO0VBRTFCQyxXQUFXLEVBQUdkO0FBQ2xCLENBQUM7QUFFY0EsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0F1dG9Db21wbGV0ZS9SZXNwb25zZS9tb2RlbC9TdWdnZXN0ZWRMb2NhdGlvbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBTaW5nbGUgU3VnZ2VzdGVkTG9jYXRpb24gT2JqZWN0IHJldHVybmVkIGJ5IHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuXG4gKiBFYWNoIHN1Z2dlc3RlZCBsb2NhdGlvbiByZXByZXNlbnRzIGEgc3RyZWV0IGFkZHJlc3MgKFwiU3RyZWV0QWRkcmVzc1wiKSBvciBhIHBsYWNlIG5hbWUgKFwiUG9zaXRpb25PZkludGVyZXN0XCIpLlxuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0eXBlIC0gU3VnZ2VzdGVkIGxvY2F0aW9uIHR5cGUgOiBcIlN0cmVldEFkZHJlc3NcIiBvdSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiXG4gKiBAcHJvcGVydHkge0dwLlBvaW50fSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZ2l2ZW4gaW4gcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb21tdW5lIC0gU3VnZ2VzdGVkIG11bmljaXBhbGl0eVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGZ1bGxUZXh0IC0gRnVsbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcG9zdGFsQ29kZSAtIFN1Z2dlc3RlZCBsb2NhdGlvbiBwb3N0Y29kZVxuICogQHByb3BlcnR5IHtJbnRlZ2VyfSBjbGFzc2lmaWNhdGlvbiAtIE51bWJlciB1c2VkIHRvIGNsYXNzaWZ5IHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBwbGFjZSB3aGVyZSBpcyB0aGUgc3VnZ2VzdGVkIGxvY2F0aW9uIGZyb20gMSAobW9zdCBpbXBvcnRhbnQpIHRvIDcgKGxlc3MgaW1wb3J0YW50KS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzdHJlZXQgLSBTdHJlZXQgbmFtZSBvZiB0aGUgc3VnZ2VzdGVkIGxvY2F0aW9uIChcIlN0cmVldEFkZHJlc3NcIiBvbmx5KS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBraW5kIC0gTmF0dXJlIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gOiBcInByZWZlY3R1cmVcIiwgXCJtb251bWVudFwiLCBcImNvbW11bmVcIiwgLi4uIGZvciBpbnN0YW5jZSAoXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiBvbmx5KS5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlLlN1Z2dlc3RlZExvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIFN1Z2dlc3RlZExvY2F0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3VnZ2VzdGVkTG9jYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdWdnZXN0ZWRMb2NhdGlvbiBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8qIFJFUE9OU0UgOlxuICAgICAgICB7XG4gICAgICAgICAgIFwic3RhdHVzXCIgOiBcIk9LXCIsXG4gICAgICAgICAgIFwicmVzdWx0c1wiIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIFwiY291bnRyeVwiOlwiUG9zaXRpb25PZkludGVyZXN0XCIsXG4gICAgICAgICAgICAgICAgIFwieFwiOi0xLjU1OTE4NSxcbiAgICAgICAgICAgICAgICAgXCJ5XCI6NDcuOTUyNjAzLFxuICAgICAgICAgICAgICAgICBcImNpdHlcIjpcIkJyaWVcIixcbiAgICAgICAgICAgICAgICAgXCJ6aXBjb2RlXCI6XCIzNTE1MFwiLFxuICAgICAgICAgICAgICAgICBcInN0cmVldFwiOlwiY29yYmVcIixcbiAgICAgICAgICAgICAgICAgXCJraW5kXCI6XCJMaWV1LWRpdCBoYWJpdMOpXCIsXG4gICAgICAgICAgICAgICAgIFwiZnVsbHRleHRcIjpcImNvcmJlLCAzNTE1MCBCcmllXCIsXG4gICAgICAgICAgICAgICAgIFwiY2xhc3NpZmljYXRpb25cIjo2XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgXCJjb3VudHJ5XCI6XCJTdHJlZXRBZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgIFwieFwiOjEuNTM4Mjk1LFxuICAgICAgICAgICAgICAgICBcInlcIjo0My4xOTY0NixcbiAgICAgICAgICAgICAgICAgXCJjaXR5XCI6XCJCcmllXCIsXG4gICAgICAgICAgICAgICAgIFwiemlwY29kZVwiOlwiMDk3MDBcIixcbiAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjpcImNvdXJyZXN0ZVwiLFxuICAgICAgICAgICAgICAgICBcImtpbmRcIjpcIlwiLFxuICAgICAgICAgICAgICAgICBcImZ1bGx0ZXh0XCI6XCJjb3VycmVzdGUsIDA5NzAwIEJyaWVcIixcbiAgICAgICAgICAgICAgICAgXCJjbGFzc2lmaWNhdGlvblwiOjdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAqL1xuXG4gICAgLyogUkVQT05TRSBFTiBFUlJFVVJcbiAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzIDogXCJFUlJPUlwiLFxuICAgICAgICAgICAgcmVzdWx0cyA6IFsgXVxuICAgICAgICB9XG4gICAgKi9cblxuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBsb2NhdGlvbiB0eXBlIDogXCJTdHJlZXRBZGRyZXNzXCIgb3UgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9uIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZ2l2ZW4gaW4gcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAgICAgKiBAdHlwZSB7R3AuUG9pbnR9XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgeCA6IG51bGwsXG4gICAgICAgIHkgOiBudWxsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBtdW5pY2lwYWxpdHlcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuY29tbXVuZSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBGdWxsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbi5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZnVsbFRleHQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIGxvY2F0aW9uIHBvc3Rjb2RlXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBvc3RhbENvZGUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIHVzZWQgdG8gY2xhc3NpZnkgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIHBsYWNlIHdoZXJlIGlzIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gZnJvbSAxIChtb3N0IGltcG9ydGFudCkgdG8gNyAobGVzcyBpbXBvcnRhbnQpLlxuICAgICAqIEB0eXBlIHtJbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMuY2xhc3NpZmljYXRpb24gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU3RyZWV0IG5hbWUgb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbiAoXCJTdHJlZXRBZGRyZXNzXCIgb25seSkuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnN0cmVldCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZSBuYW1lIG9mIHRoZSBzdWdnZXN0ZWQgbG9jYXRpb24gKFwiUG9zaXRpb25PZkludGVyZXN0XCIgb25seSkuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnBvaSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBOYXR1cmUgb2YgdGhlIHN1Z2dlc3RlZCBsb2NhdGlvbiA6IFwicHJlZmVjdHVyZVwiLCBcIm1vbnVtZW50XCIsIFwiY29tbXVuZVwiLCAuLi4gZm9yIGluc3RhbmNlIChcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiIG9ubHkpLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5raW5kID0gbnVsbDtcbn1cblxuU3VnZ2VzdGVkTG9jYXRpb24ucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBTdWdnZXN0ZWRMb2NhdGlvblxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VnZ2VzdGVkTG9jYXRpb247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/AutoComplete/Response/model/SuggestedLocation.js\n"); + +/***/ }), + +/***/ "./src/Services/CommonService.js": +/*!***************************************!*\ + !*** ./src/Services/CommonService.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Utils/Helper */ \"./src/Utils/Helper.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Protocols/Protocol */ \"./src/Protocols/Protocol.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../package.json */ \"./package.json\");\nvar _package_json__WEBPACK_IMPORTED_MODULE_5___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../package.json */ \"./package.json\", 1);\n\n\n\n\n\n// import DefaultUrlService from \"./DefaultUrlService\";\n// package.json (extract version)\n\n\n/**\n * @classdesc\n * Composant Service\n *\n * @constructor\n * @alias Gp.Services.CommonService\n * @param {Object} options - options communes à tous les services\n *\n * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut \"https://wxs.ign.fr/calcul/geoportail/SERVICE/\".\n * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès.\n * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré.\n *\n * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service :\n * peut valoir 'JSONP' ou 'XHR'.\n * Par défaut, c'est le protocole XHR qui sera utilisé.\n * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR).\n *\n * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https.\n * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS).\n * Sur un navigateur, le protocole est automatiquement extrait de l'url du site...\n * Par défaut, on utilise le protocole http (ssl=false).\n *\n * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR.\n * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP.\n *\n * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP.\n * Par défaut, la fonction de callback portera un nom du type \"callback\"+ID, où ID est soit un identifiant unique généré à chaque requête,\n * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix=\"_2\", la fonction sera \"callback_2 ()\".\n * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu\n * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'.\n *\n * @param {String} [options.httpMethod] - La méthode HTTP\n * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'.\n * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET.\n * Par défaut, c'est la méthode GET qui est utilisée.\n *\n * @param {String} [options.contentType] - Content-Type de la requete\n * à utiliser dans le cas d'une requête XHR en mode POST.\n * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET.\n * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type.\n *\n * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête).\n * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0).\n *\n * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée.\n * (Cf. paramètre « onSuccess » pour plus de détails).\n *\n * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête\n * (code HTTP 200, sans message d'erreur).\n * Cette fonction prend en paramètre la réponse du service,\n * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ;\n * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ».\n *\n * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement\n * (code HTTP de retour différent de 200 ou pas de réponse).\n *\n * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse\n * Permet de modifier la réponse avant parsing et la fonction doit retourner une String.\n * Cette fonction prend en paramètre la réponse telle que renvoyée par le service\n * (cad au format json ou xml).\n * Pour le JSONP, si le paramètre \"rawResponse\" a été précisé avec la valeur \"true\",\n * la fonction prend en paramètre un Object JavaScript contenant la réponse XML.\n *\n * @example\n * var options = {\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * ssl : false,\n * proxyURL : null,\n * callbackName : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * onBeforeParse : function (rawResponse) {}\n * };\n */\nfunction CommonService(options) {\n if (!(this instanceof CommonService)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\"));\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"CommonService\");\n this.logger.trace(\"[Constructeur CommonService (options)]\");\n\n // #####################\n // récupération des options par défaut pour les paramètres optionnels\n // #####################\n\n /**\n * Options du service\n * @type {Object}\n */\n this.options = {\n // protocol : \"JSONP\",\n protocol: \"XHR\",\n ssl: true,\n proxyURL: \"\",\n // callbackName : \"\",\n callbackSuffix: null,\n httpMethod: \"GET\",\n timeOut: 0,\n rawResponse: false,\n scope: this,\n /**\n * callback par defaut pour la reponse\n * @param {Object} response - response\n * @private\n */\n onSuccess: function onSuccess(response) {\n console.log(\"onSuccess - la reponse est la suivante : \", response);\n },\n /**\n * callback par defaut pour les erreurs\n * @param {Object} error - error\n * @private\n */\n onFailure: function onFailure(error) {\n if (error.status === 200 || !error.status) {\n console.log(\"onFailure : \", error.message);\n } else {\n console.log(\"onFailure - Erreur (\", error.status, \") : \", error.message);\n }\n }\n };\n\n // et on ajoute les options en paramètre aux options par défaut\n for (var opt in options) {\n if (options.hasOwnProperty(opt)) {\n this.options[opt] = options[opt];\n }\n }\n\n // #####################\n // analyse des options\n // #####################\n\n // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée\n if (this.options.rawResponse && !this.options.onSuccess) {\n /**\n * callback par defaut pour la reponse\n * @param {Object} response - response\n * @private\n */\n this.options.onSuccess = function (response) {\n console.log(\"onSuccess - la réponse brute du service est la suivante : \", response);\n };\n }\n\n // gestion du callback onSuccess\n var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === \"function\");\n if (!bOnSuccess) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_MISSING\", \"onSuccess()\"));\n }\n\n // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF\n // gestion de l'url du service par defaut\n /*\n if (!this.options.serverUrl) {\n // INFO\n // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut\n // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant\n // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n DefaultUrlService.ssl = this.options.ssl;\n var urlByDefault = DefaultUrlService[this.CLASSNAME].url(\"calcul\");\n if (typeof urlByDefault === \"string\") {\n this.options.serverUrl = urlByDefault;\n } else {\n this.logger.trace(\"URL par defaut à determiner au niveau du composant...\");\n }\n }\n */\n\n // FIXME nettoyage des KVP dans l'url du service\n // if (this.options.serverUrl) {\n // // INFO\n // // si l'url est renseignée, il faut la nettoyer de tous ses KVP\n // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait\n // // des opérations d'encapsulations des reponses légèrement farfelues ...\n // var urlsource = this.options.serverUrl;\n // var urlparts = urlsource.split(\"?\");\n // this.options.serverUrl = urlparts[0];\n // }\n\n // gestion de la methode HTTP\n this.options.httpMethod = typeof options.httpMethod === \"string\" ? options.httpMethod.toUpperCase() : \"GET\";\n switch (this.options.httpMethod) {\n case \"POST\":\n case \"GET\":\n break;\n case \"PUT\":\n case \"DELETE\":\n case \"HEAD\":\n case \"OPTIONS\":\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT\", \"httpMethod\"));\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"httpMethod\"));\n }\n\n // gestion du protocole\n // this.options.protocol = (typeof options.protocol === \"string\" ) ? options.protocol.toUpperCase() : \"JSONP\";\n this.options.protocol = typeof options.protocol === \"string\" ? options.protocol.toUpperCase() : \"XHR\";\n switch (this.options.protocol) {\n case \"JSONP\":\n case \"XHR\":\n break;\n default:\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_UNKNOWN\", \"protocol\"));\n }\n\n // on determine l'environnement d'execution : browser ou non ?\n // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS...\n if (typeof window === \"undefined\" && this.options.protocol === \"JSONP\") {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT_NODEJS\", \"protocol=JSONP (instead use XHR)\"));\n }\n\n // le protocole JSONP ne fonctionne qu'en GET.\n if (this.options.protocol === \"JSONP\") {\n this.options.httpMethod = \"GET\";\n }\n\n // gestion du cache\n this.options.nocache = options.nocache || false;\n\n // #####################\n // attributs d'instances\n // #####################\n\n /**\n * Format de réponse du service\n */\n this.options.outputFormat = null;\n /**\n * Requête envoyée au service\n */\n this.request = null;\n /**\n * Reponse du service\n */\n this.response = null;\n}\n\n/**\n * @lends module:CommonService\n */\nCommonService.prototype = {\n /*\n * Constructeur (alias)\n */\n constructor: CommonService,\n /**\n * Appel du service Géoportail\n */\n call: function call() {\n /* jshint validthis : true */\n this.logger.trace(\"CommonService::call ()\");\n var context = this;\n /** fonction d'execution */\n function run() {\n this.logger.trace(\"CommonService::run ()\");\n this.buildRequest.call(context, onError, onBuildRequest);\n }\n run.call(context);\n\n // callback de fin de construction de la requête\n function onBuildRequest(result) {\n this.logger.trace(\"CommonService::onBuildRequest : \", result);\n this.callService.call(context, onError, onCallService);\n }\n\n // callback de fin d'appel au service\n function onCallService(result) {\n this.logger.trace(\"CommonService::onCallService : \", result);\n this.analyzeResponse.call(context, onError, onAnalyzeResponse);\n }\n\n // callback de fin de lecture de la reponse\n function onAnalyzeResponse(result) {\n this.logger.trace(\"CommonService::onAnalyzeResponse : \", result);\n if (result) {\n this.options.onSuccess.call(this, result);\n } else {\n return onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"Analyse de la reponse en échec !?\"));\n }\n }\n\n // callback de gestion des erreurs : renvoit un objet de type ErrorService\n function onError(error) {\n this.logger.trace(\"CommonService::onError()\");\n // error : l'objet est du type ErrorService ou Error\n var e = error;\n if (!(e instanceof _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"])) {\n e = new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](error.message);\n }\n this.options.onFailure.call(this, e);\n }\n },\n /**\n * Création de la requête\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n buildRequest: function buildRequest(error, success) {\n // INFO\n this.logger.error(\"overwritten method !\");\n // retourne l'objet 'this.request'\n if (error) {\n error.call(this, \"This method must be overwritten !\");\n }\n success.call(this, \"This method must be overwritten !\");\n },\n /**\n * Appel du service\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n callService: function callService(error, success) {\n // INFO\n // retourne l'objet 'this.response'\n\n // NOTES\n // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document).\n // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes :\n // - natif\n // - XML encapsulé :\n // {http : {status:200, error:null},xml :'réponse du service'}\n // {http : {status:400, error:'reponse du service'},xml :null}\n // En XHR, la reponse est directement sauvegardée dans 'this.response'.\n // Par contre, en JSONP, on doit analyser la reponse (status ou non vide),\n // et ne renvoyer que le contenu (xml ou l'objet)\n\n // gestion de la proxification du service\n var strUrlProxified = null;\n var strData = this.request;\n\n // a t on mis en place un proxy ?\n // la proxyfication est valable uniquement en mode XHR !\n var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === \"XHR\");\n\n // rajout de l'option gpbibaccess\n // INFO : acces au numero de version de package.conf aprés compilation !\n if (this.CLASSNAME !== \"Geocode\" && this.CLASSNAME !== \"ReverseGeocode\" && this.CLASSNAME !== \"AutoComplete\") {\n this.options.serverUrl = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, {\n \"gp-access-lib\": _package_json__WEBPACK_IMPORTED_MODULE_5__.version,\n apiKey: this.options.apiKey || \"calcul\"\n }, false);\n }\n\n // si le proxy est renseigné, on proxifie l'url du service\n if (bUrlProxified) {\n if (this.options.httpMethod === \"GET\") {\n strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, this.request, true);\n strData = null;\n }\n if (this.options.httpMethod === \"POST\") {\n strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__[\"default\"].normalyzeUrl(this.options.serverUrl, null, true);\n strData = this.request;\n }\n }\n\n // contexte du composant spécifique !\n var self = this;\n var options = {\n url: strUrlProxified || this.options.serverUrl,\n method: this.options.httpMethod,\n protocol: this.options.protocol,\n timeOut: this.options.timeOut || 0,\n format: this.options.outputFormat,\n // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) !\n nocache: this.options.nocache || false,\n // ceci permet d'ajouter un timestamp dans la requête\n wrap: this.options.protocol !== \"XHR\",\n // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR !\n callbackSuffix: this.options.callbackSuffix,\n // callbackName : this.options.callbackName || null,\n data: strData,\n headers: null,\n // TODO...\n content: this.options.contentType || \"application/xml\",\n scope: this.options.scope || this,\n // callback de reponse\n onResponse: function onResponse(response) {\n self.logger.trace(\"callService::onResponse()\");\n\n // le contenu de la reponse à renvoyer !\n var content = null;\n\n // XHR : on renvoie toujours la reponse brute du service (json ou xml)\n // au parser du composant...\n if (self.options.protocol === \"XHR\") {\n self.logger.trace(\"Response XHR\", response);\n content = response; // par defaut, la reponse du service !\n }\n\n // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas)\n // avant de l'envoyer au parser du composant...\n if (self.options.protocol === \"JSONP\") {\n self.logger.trace(\"Response JSON\", response);\n if (response) {\n if (response.http) {\n // reponse encapsulée :\n // ex. reponse du service en xml\n // > {http : {status:200, error:null},xml :'réponse du service'}\n if (response.http.status !== 200) {\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n status: response.http.status,\n message: response.http.error,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].TYPE_SRVERR\n }));\n return;\n } else {\n content = response.xml; // par defaut !\n if (self.options.rawResponse) {\n content = response;\n }\n }\n } else {\n // reponse non encapsulée :\n // ex. reponse du service en json ou xml\n content = response;\n }\n } else {\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"Le contenu de la reponse est vide !?\"));\n return;\n }\n }\n\n // si on souhaite parser la reponse du service\n if (typeof self.options.onBeforeParse === \"function\") {\n var newResponse = self.options.onBeforeParse(content);\n if (typeof newResponse === \"string\") {\n // la reponse parsée par l'utilisateur est retournée sous\n // forme de string !\n content = newResponse;\n }\n }\n // sauvegarde de la reponse dans l'objet parent (CommonService)\n self.response = content;\n // on renvoie la reponse...\n success.call(self, content);\n },\n // callback des erreurs\n onFailure: function onFailure(e) {\n self.logger.trace(\"callService::onFailure()\");\n // on est forcement sur une erreur levée par un service !\n e.type = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].TYPE_SRVERR;\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](e));\n },\n // callback de timeOut\n onTimeOut: function onTimeOut() {\n self.logger.trace(\"callService::onTimeOut()\");\n error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__[\"default\"](\"TimeOut!\"));\n }\n };\n _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__[\"default\"].send(options);\n },\n /**\n * Analyse de la réponse\n * @param {Function} error - callback\n * @param {Function} success - callback\n */\n analyzeResponse: function analyzeResponse(error, success) {\n // INFO\n this.logger.error(\"overwritten method !\");\n // retourne l'objet spécifique au type de composant (json)\n if (error) {\n error.call(this, \"This method must be overwritten !\");\n }\n success.call(this, \"This method must be overwritten !\");\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (CommonService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db21tb25TZXJ2aWNlLmpzP2ZkNTciXSwibmFtZXMiOlsiQ29tbW9uU2VydmljZSIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwicHJvdG9jb2wiLCJzc2wiLCJwcm94eVVSTCIsImNhbGxiYWNrU3VmZml4IiwiaHR0cE1ldGhvZCIsInRpbWVPdXQiLCJyYXdSZXNwb25zZSIsInNjb3BlIiwib25TdWNjZXNzIiwicmVzcG9uc2UiLCJjb25zb2xlIiwibG9nIiwib25GYWlsdXJlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwib3B0IiwiaGFzT3duUHJvcGVydHkiLCJiT25TdWNjZXNzIiwiRXJyb3IiLCJ0b1VwcGVyQ2FzZSIsIndpbmRvdyIsIm5vY2FjaGUiLCJvdXRwdXRGb3JtYXQiLCJyZXF1ZXN0IiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJjYWxsIiwiY29udGV4dCIsInJ1biIsImJ1aWxkUmVxdWVzdCIsIm9uRXJyb3IiLCJvbkJ1aWxkUmVxdWVzdCIsInJlc3VsdCIsImNhbGxTZXJ2aWNlIiwib25DYWxsU2VydmljZSIsImFuYWx5emVSZXNwb25zZSIsIm9uQW5hbHl6ZVJlc3BvbnNlIiwiRXJyb3JTZXJ2aWNlIiwiZSIsInN1Y2Nlc3MiLCJzdHJVcmxQcm94aWZpZWQiLCJzdHJEYXRhIiwiYlVybFByb3hpZmllZCIsIkNMQVNTTkFNRSIsInNlcnZlclVybCIsIkhlbHBlciIsIm5vcm1hbHl6ZVVybCIsIlBrZyIsInZlcnNpb24iLCJhcGlLZXkiLCJzZWxmIiwidXJsIiwibWV0aG9kIiwiZm9ybWF0Iiwid3JhcCIsImRhdGEiLCJoZWFkZXJzIiwiY29udGVudCIsImNvbnRlbnRUeXBlIiwib25SZXNwb25zZSIsImh0dHAiLCJ0eXBlIiwiVFlQRV9TUlZFUlIiLCJ4bWwiLCJvbkJlZm9yZVBh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Q0FBQztJQUN6QztJQUNBLElBQUlBLEtBQUssRUFBRTtNQUNQQSxLQUFLLENBQUNjLElBQUksQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLENBQUM7SUFDekQ7SUFDQWEsT0FBTyxDQUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO0VBQzNEO0FBRUosQ0FBQztBQUVjcEMsNEVBQWEiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQ29tbW9uU2VydmljZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEhlbHBlciBmcm9tIFwiLi4vVXRpbHMvSGVscGVyXCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBQcm90b2NvbCBmcm9tIFwiLi4vUHJvdG9jb2xzL1Byb3RvY29sXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuLy8gaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuL0RlZmF1bHRVcmxTZXJ2aWNlXCI7XG4vLyBwYWNrYWdlLmpzb24gKGV4dHJhY3QgdmVyc2lvbilcbmltcG9ydCBQa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENvbXBvc2FudCBTZXJ2aWNlXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQ29tbW9uU2VydmljZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGNvbW11bmVzIMOgIHRvdXMgbGVzIHNlcnZpY2VzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybF0gLSBVUkwgZCdhY2PDqHMgYXUgc2VydmljZS4gUGFyIGTDqWZhdXQgXCJodHRwczovL3d4cy5pZ24uZnIvY2FsY3VsL2dlb3BvcnRhaWwvU0VSVklDRS9cIi5cbiAqICAgICAgUGVybWV0IGRlIGZvcmNlciBsJ3V0aWxpc2F0aW9uIGQndW4gc2VydmljZSDDqXF1aXZhbGVudCBkw6lwbG95w6kgZGVycmnDqHJlIHVuZSDDqXZlbnR1ZWxsZSBhdXRyZSBVUkwgZCdhY2PDqHMuXG4gKiAgICAgIFNpIGNlIHBhcmFtw6h0cmUgZXN0IHJlbnNlaWduw6kgYWxvcnMsIGxlIHBhcmFtw6h0cmUgcGFyIGTDqWZhdXQgZXN0IGlnbm9yw6kuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3RvY29sXSAtIExlIHByb3RvY29sZSDDoCB1dGlsaXNlciBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZHUgc2VydmljZSA6XG4gKiAgICAgIHBldXQgdmFsb2lyICdKU09OUCcgb3UgJ1hIUicuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBjJ2VzdCBsZSBwcm90b2NvbGUgWEhSIHF1aSBzZXJhIHV0aWxpc8OpLlxuICogICAgICBBdHRlbnRpb24sIGxlIHByb3RvY29sZSBKU09OUCBuJ2VzdCBwYXMgdmFsaWRlIGRhbnMgdW4gZW52aXJvbm5lbWVudCBOb2RlSlMgKFV0aWxpc2F0aW9uIGR1IG1vZGUgWEhSKS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbF0gLSBJbmRpcXVlIHNpIGwnb24gc291aGFpdGUgaW50w6lycm9nZXIgbGVzIHNlcnZpY2VzIGVuIGh0dHBzLlxuICogICAgICBDZSBwYXJhbcOodHJlIG5lIGZvbmN0aW9ubmUgcXVlIHBvdXIgdW5lIHV0aWxpc2F0aW9uIGhvcnMgbmF2aWdhdGV1ciAoZXguIE5vZGVKUykuXG4gKiAgICAgIFN1ciB1biBuYXZpZ2F0ZXVyLCBsZSBwcm90b2NvbGUgZXN0IGF1dG9tYXRpcXVlbWVudCBleHRyYWl0IGRlIGwndXJsIGR1IHNpdGUuLi5cbiAqICAgICAgUGFyIGTDqWZhdXQsIG9uIHV0aWxpc2UgbGUgcHJvdG9jb2xlIGh0dHAgKHNzbD1mYWxzZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIExlIHByb3h5IMOgIHV0aWxpc2VyIHBvdXIgcGFsbGllciBhdSBwcm9ibMOobWUgZGUgY3Jvc3MtZG9tYWluIGRhbnMgbGUgY2FzIGQndW5lIHJlcXXDqnRlIFhIUi5cbiAqICAgICAgVXRpbGUgc2kgbGUgcGFyYW3DqHRyZSAncHJvdG9jb2wnIHZhdXQgJ1hIUicsIGlsIG5lIHNlcmEgcGFzIHByaXMgZW4gY29tcHRlIHNpIHByb3RvY29sIHZhdXQgSlNPTlAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNhbGxiYWNrU3VmZml4XSAtIFN1ZmZpeGUgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgw6AgdXRpbGlzZXIsIGRhbnMgbGUgY2FzIGR1IHByb3RvY29sZSBKU09OUC5cbiAqICAgICAgUGFyIGTDqWZhdXQsIGxhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIHBvcnRlcmEgdW4gbm9tIGR1IHR5cGUgXCJjYWxsYmFja1wiK0lELCBvw7kgSUQgZXN0IHNvaXQgdW4gaWRlbnRpZmlhbnQgdW5pcXVlIGfDqW7DqXLDqSDDoCBjaGFxdWUgcmVxdcOqdGUsXG4gKiAgICAgIHNvaXQgbGUgcGFyYW3DqHRyZSBjYWxsYmFja1N1ZmZpeCBzJ2lsIGVzdCBzcMOpY2lmacOpLiBQYXIgZXhlbXBsZSwgc2kgY2FsbGJhY2tTdWZmaXg9XCJfMlwiLCBsYSBmb25jdGlvbiBzZXJhIFwiY2FsbGJhY2tfMiAoKVwiLlxuICogICAgICBVdGlsZSBwb3VyIHV0aWxpc2VyIHVuZSByw6lwb25zZSBkw6lqw6AgZW5jYXBzdWzDqWUgZGFucyB1bmUgZm9uY3Rpb24gZGUgY2FsbGJhY2ssIGRvbnQgbGUgbm9tIGVzdCBjb25udVxuICogICAgICBVdGlsZSBzZXVsZW1lbnQgc2kgbGUgcGFyYW3DqHRyZSAncHJvdG9jb2wnIHZhdXQgJ0pTT05QJywgaWwgbmUgc2VyYSBwYXMgcHJpcyBlbiBjb21wdGUgc2kgcHJvdG9jb2wgdmF1dCAnWEhSJy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZF0gLSBMYSBtw6l0aG9kZSBIVFRQXG4gKiAgICAgIMOgIHV0aWxpc2VyIGRhbnMgbGUgY2FzIGQndW5lIHJlcXXDqnRlIFhIUiA6IHBldXQgdmFsb2lyICdHRVQnIG91ICdQT1NUJy5cbiAqICAgICAgTm9uIHByaXMgZW4gY29tcHRlIHNpICdwcm90b2NvbCcgdmF1dCBKU09OUCBxdWkgZm9uY3Rpb25uZSBvYmxpZ2F0b2lyZW1lbnQgZW4gR0VULlxuICogICAgICBQYXIgZMOpZmF1dCwgYydlc3QgbGEgbcOpdGhvZGUgR0VUIHF1aSBlc3QgdXRpbGlzw6llLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jb250ZW50VHlwZV0gLSBDb250ZW50LVR5cGUgZGUgbGEgcmVxdWV0ZVxuICogICAgICDDoCB1dGlsaXNlciBkYW5zIGxlIGNhcyBkJ3VuZSByZXF1w6p0ZSBYSFIgZW4gbW9kZSBQT1NULlxuICogICAgICBOb24gcHJpcyBlbiBjb21wdGUgc2kgJ3Byb3RvY29sJyB2YXV0IEpTT05QIGV0L291IGxhIG3DqXRob2RlIEhUVFAgdmF1dCBHRVQuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBjJ2VzdCBsYSBtw6l0aG9kZSBHRVQgcXVpIGVzdCB1dGlsaXPDqWUgZG9uYyBvbiBuJ3V0aWxpc2UgcGFzIGRlIENvbnRlbnQtVHlwZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dF0gLSBEw6lsYWkgZCdhdHRlbnRlIG1heGltYWwgKGVuIG1zKSBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlICjDoCBwYXJ0aXIgZGUgbCdlbnZvaSBkZSBsYSByZXF1w6p0ZSkuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBhdWN1biB0aW1lT3V0IG4nZXN0IHByaXMgZW4gY29tcHRlICh0aW1lb3V0RGVsYXk9IDApLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2VdIC0gSW5kaXF1ZSBzaSBsJ29uIHNvdWhhaXRlIHF1ZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIG5lIHNvaXQgcGFzIHBhcnPDqWUgcGFyIGwnQVBJIGF2YW50IGQnw6p0cmUgcmVzdGl0dcOpZS5cbiAqICAgICAgKENmLiBwYXJhbcOodHJlIMKrIG9uU3VjY2VzcyDCuyBwb3VyIHBsdXMgZGUgZMOpdGFpbHMpLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3VjY2Vzc10gLSBGb25jdGlvbiBhcHBlbMOpZSBsb3JzcXVlIGxlIHNlcnZpY2UgcsOpcG9uZCBjb3JyZWN0ZW1lbnQgw6AgbGEgcmVxdcOqdGVcbiAqICAgICAgKGNvZGUgSFRUUCAyMDAsIHNhbnMgbWVzc2FnZSBkJ2VycmV1cikuXG4gKiAgICAgIENldHRlIGZvbmN0aW9uIHByZW5kIGVuIHBhcmFtw6h0cmUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSxcbiAqICAgICAgc29pdCBzb3VzIGxhIGZvcm1lIGQndW4gT2JqZWN0IEphdmFzY3JpcHQgZm9ybWF0w6kgcGFyIGxlIHBhcnNldXIgZMOpZGnDqSDDoCBsYSBzeW50YXhlIGR1IHNlcnZpY2UgKGNvbXBvcnRlbWVudCBwYXIgZMOpZmF1dCkgO1xuICogICAgICBzb2l0IGJydXRlIGF1IGZvcm1hdCBTdHJpbmcgbm9uIHByw6l0cmFpdMOpIHNpIGxlIHBhcmFtw6h0cmUgwqsgcmF3UmVzcG9uc2UgwrsgYSDDqXTDqSBwcsOpY2lzw6kgYXZlYyBsYSB2YWxldXIgwqsgdHJ1ZSDCuy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gRm9uY3Rpb24gYXBwZWzDqWUgbG9yc3F1ZSBsZSBzZXJ2aWNlIG5lIHLDqXBvbmQgcGFzIGNvcnJlY3RlbWVudFxuICogICAgICAoY29kZSBIVFRQIGRlIHJldG91ciBkaWZmw6lyZW50IGRlIDIwMCBvdSBwYXMgZGUgcsOpcG9uc2UpLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gRm9uY3Rpb24gYXBwZWzDqWUgYXZhbnQgbGUgcGFyc2luZyBkZSBsYSByw6lwb25zZVxuICogICAgICBQZXJtZXQgZGUgbW9kaWZpZXIgbGEgcsOpcG9uc2UgYXZhbnQgcGFyc2luZyBldCBsYSBmb25jdGlvbiBkb2l0IHJldG91cm5lciB1bmUgU3RyaW5nLlxuICogICAgICBDZXR0ZSBmb25jdGlvbiBwcmVuZCBlbiBwYXJhbcOodHJlIGxhIHLDqXBvbnNlIHRlbGxlIHF1ZSByZW52b3nDqWUgcGFyIGxlIHNlcnZpY2VcbiAqICAgICAgKGNhZCBhdSBmb3JtYXQganNvbiBvdSB4bWwpLlxuICogICAgICBQb3VyIGxlIEpTT05QLCBzaSBsZSBwYXJhbcOodHJlIFwicmF3UmVzcG9uc2VcIiBhIMOpdMOpIHByw6ljaXPDqSBhdmVjIGxhIHZhbGV1ciBcInRydWVcIixcbiAqICAgICAgbGEgZm9uY3Rpb24gcHJlbmQgZW4gcGFyYW3DqHRyZSB1biBPYmplY3QgSmF2YVNjcmlwdCBjb250ZW5hbnQgbGEgcsOpcG9uc2UgWE1MLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHNzbCA6IGZhbHNlLFxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIGNhbGxiYWNrTmFtZSA6IG51bGwsXG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgdGltZU91dCA6IDEwMDAwLCAvLyBtc1xuICogICAgICByYXdSZXNwb25zZSA6IGZhbHNlLCAvLyB0cnVlfGZhbHNlXG4gKiAgICAgIHNjb3BlIDogbnVsbCwgLy8gdGhpc1xuICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICogICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZXJyb3IpIHt9LFxuICogICAgICBvbkJlZm9yZVBhcnNlIDogZnVuY3Rpb24gKHJhd1Jlc3BvbnNlKSB7fVxuICogICB9O1xuICovXG5mdW5jdGlvbiBDb21tb25TZXJ2aWNlIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbW1vblNlcnZpY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIikpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkNvbW1vblNlcnZpY2VcIik7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIENvbW1vblNlcnZpY2UgKG9wdGlvbnMpXVwiKTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIHLDqWN1cMOpcmF0aW9uIGRlcyBvcHRpb25zIHBhciBkw6lmYXV0IHBvdXIgbGVzIHBhcmFtw6h0cmVzIG9wdGlvbm5lbHNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgZHUgc2VydmljZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAvLyBwcm90b2NvbCA6IFwiSlNPTlBcIixcbiAgICAgICAgcHJvdG9jb2wgOiBcIlhIUlwiLFxuICAgICAgICBzc2wgOiB0cnVlLFxuICAgICAgICBwcm94eVVSTCA6IFwiXCIsXG4gICAgICAgIC8vIGNhbGxiYWNrTmFtZSA6IFwiXCIsXG4gICAgICAgIGNhbGxiYWNrU3VmZml4IDogbnVsbCxcbiAgICAgICAgaHR0cE1ldGhvZCA6IFwiR0VUXCIsXG4gICAgICAgIHRpbWVPdXQgOiAwLFxuICAgICAgICByYXdSZXNwb25zZSA6IGZhbHNlLFxuICAgICAgICBzY29wZSA6IHRoaXMsXG4gICAgICAgIC8qKlxuICAgICAgICAqIGNhbGxiYWNrIHBhciBkZWZhdXQgcG91ciBsYSByZXBvbnNlXG4gICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gcmVzcG9uc2VcbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAqL1xuICAgICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TdWNjZXNzIC0gbGEgcmVwb25zZSBlc3QgbGEgc3VpdmFudGUgOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgKiBjYWxsYmFjayBwYXIgZGVmYXV0IHBvdXIgbGVzIGVycmV1cnNcbiAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3IgLSBlcnJvclxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICovXG4gICAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMjAwIHx8ICFlcnJvci5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uRmFpbHVyZSA6IFwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvbkZhaWx1cmUgLSBFcnJldXIgKFwiLCBlcnJvci5zdGF0dXMsIFwiKSA6IFwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBldCBvbiBham91dGUgbGVzIG9wdGlvbnMgZW4gcGFyYW3DqHRyZSBhdXggb3B0aW9ucyBwYXIgZMOpZmF1dFxuICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1tvcHRdID0gb3B0aW9uc1tvcHRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gYW5hbHlzZSBkZXMgb3B0aW9uc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLy8gbW9kaWZpY2F0aW9uIGRlIGxhIGZvbmN0aW9uIGRlIGNhbGxiYWNrIG9uU3VjY2VzcyBkYW5zIGxlIGNhcyBvw7kgbGEgcsOpcG9uc2UgYnJ1dGUgZXN0IGRlbWFuZMOpZVxuICAgIGlmICh0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UgJiYgIXRoaXMub3B0aW9ucy5vblN1Y2Nlc3MpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICogY2FsbGJhY2sgcGFyIGRlZmF1dCBwb3VyIGxhIHJlcG9uc2VcbiAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgLSByZXNwb25zZVxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMub3B0aW9ucy5vblN1Y2Nlc3MgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TdWNjZXNzIC0gbGEgcsOpcG9uc2UgYnJ1dGUgZHUgc2VydmljZSBlc3QgbGEgc3VpdmFudGUgOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGdlc3Rpb24gZHUgY2FsbGJhY2sgb25TdWNjZXNzXG4gICAgdmFyIGJPblN1Y2Nlc3MgPSAhISh0aGlzLm9wdGlvbnMub25TdWNjZXNzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIGlmICghYk9uU3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcIm9uU3VjY2VzcygpXCIpKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRSB0cmFpdGVtZW50IGF1IG5pdmVhdSBkZSBjaGFxdWUgY29tcG9zYW50IHBvdXIgdGVzdGVyIHNlcnZpY2UgV1hTIC8gR1BGXG4gICAgLy8gZ2VzdGlvbiBkZSBsJ3VybCBkdSBzZXJ2aWNlIHBhciBkZWZhdXRcbiAgICAvKlxuICAgIGlmICghdGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICAvLyBJTkZPXG4gICAgICAgIC8vIGdlc3Rpb24gZGUgbCd1cmwgZHUgc2VydmljZSBwYXIgZGVmYXV0IHBvdXIgbGVzIHNlcnZpY2VzIHF1aSBuZSBwb3Nzw6hkZW50IHF1J3VuZSBzZXVsIHVybCBwYXIgZGVmYXV0XG4gICAgICAgIC8vIGxlcyBjYXMgcGFydGljdWxpZXJzIGRlcyBzZXJ2aWNlcyBhdmVjIHBsdXNpZXVycyB1cmxzIChleC4gQWx0aSkgZGV2cm9udCDDqnRyZSB0cmFpdMOpIGRhbnMgbGEgY2xhc3NlIGR1IGNvbXBvc2FudFxuICAgICAgICAvLyBkb25jIHNpIGwndXJsIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgaWwgZmF1dCB1dGlsaXNlciBsZXMgdXJscyBwYXIgZGVmYXV0XG4gICAgICAgIERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9IHRoaXMub3B0aW9ucy5zc2w7XG4gICAgICAgIHZhciB1cmxCeURlZmF1bHQgPSBEZWZhdWx0VXJsU2VydmljZVt0aGlzLkNMQVNTTkFNRV0udXJsKFwiY2FsY3VsXCIpO1xuICAgICAgICBpZiAodHlwZW9mIHVybEJ5RGVmYXVsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybEJ5RGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiVVJMIHBhciBkZWZhdXQgw6AgZGV0ZXJtaW5lciBhdSBuaXZlYXUgZHUgY29tcG9zYW50Li4uXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICovXG5cbiAgICAvLyBGSVhNRSBuZXR0b3lhZ2UgZGVzIEtWUCBkYW5zIGwndXJsIGR1IHNlcnZpY2VcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgIC8vICAgICAvLyBJTkZPXG4gICAgLy8gICAgIC8vIHNpIGwndXJsIGVzdCByZW5zZWlnbsOpZSwgaWwgZmF1dCBsYSBuZXR0b3llciBkZSB0b3VzIHNlcyBLVlBcbiAgICAvLyAgICAgLy8gZXguIG9uIG5lIHZldXQgcGFzIGRlIHBhcmFtcy4gJ2NhbGxiYWNrJyBvdSAnb3V0cHV0JyBjYXIgY2VjaSBkZWNsZW5jaGVyYWl0XG4gICAgLy8gICAgIC8vIGRlcyBvcMOpcmF0aW9ucyBkJ2VuY2Fwc3VsYXRpb25zIGRlcyByZXBvbnNlcyBsw6lnw6hyZW1lbnQgZmFyZmVsdWVzIC4uLlxuICAgIC8vICAgICB2YXIgdXJsc291cmNlID0gdGhpcy5vcHRpb25zLnNlcnZlclVybDtcbiAgICAvLyAgICAgdmFyIHVybHBhcnRzID0gdXJsc291cmNlLnNwbGl0KFwiP1wiKTtcbiAgICAvLyAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybHBhcnRzWzBdO1xuICAgIC8vIH1cblxuICAgIC8vIGdlc3Rpb24gZGUgbGEgbWV0aG9kZSBIVFRQXG4gICAgdGhpcy5vcHRpb25zLmh0dHBNZXRob2QgPSAodHlwZW9mIG9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLmh0dHBNZXRob2QudG9VcHBlckNhc2UoKSA6IFwiR0VUXCI7XG5cbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5odHRwTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgXCJQT1NUXCI6XG4gICAgICAgIGNhc2UgXCJHRVRcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUFVUXCI6XG4gICAgICAgIGNhc2UgXCJERUxFVEVcIjpcbiAgICAgICAgY2FzZSBcIkhFQURcIjpcbiAgICAgICAgY2FzZSBcIk9QVElPTlNcIjpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9OT1RfU1VQUE9SVFwiLCBcImh0dHBNZXRob2RcIikpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1VOS05PV05cIiwgXCJodHRwTWV0aG9kXCIpKTtcbiAgICB9XG5cbiAgICAvLyBnZXN0aW9uIGR1IHByb3RvY29sZVxuICAgIC8vIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9ICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJzdHJpbmdcIiApID8gb3B0aW9ucy5wcm90b2NvbC50b1VwcGVyQ2FzZSgpIDogXCJKU09OUFwiO1xuICAgIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9ICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLnByb3RvY29sLnRvVXBwZXJDYXNlKCkgOiBcIlhIUlwiO1xuXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMucHJvdG9jb2wpIHtcbiAgICAgICAgY2FzZSBcIkpTT05QXCI6XG4gICAgICAgIGNhc2UgXCJYSFJcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX1VOS05PV05cIiwgXCJwcm90b2NvbFwiKSk7XG4gICAgfVxuXG4gICAgLy8gb24gZGV0ZXJtaW5lIGwnZW52aXJvbm5lbWVudCBkJ2V4ZWN1dGlvbiA6IGJyb3dzZXIgb3Ugbm9uID9cbiAgICAvLyBldCBvbiBsYW5jZSB1bmUgZXhjZXB0aW9uIHN1ciBsJ3V0aWxpc2F0aW9uIGR1IHByb3RvY29sZSBKU09OUCBwb3VyIG5vZGVKUy4uLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiICYmIHRoaXMub3B0aW9ucy5wcm90b2NvbCA9PT0gXCJKU09OUFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9OT1RfU1VQUE9SVF9OT0RFSlNcIiwgXCJwcm90b2NvbD1KU09OUCAoaW5zdGVhZCB1c2UgWEhSKVwiKSk7XG4gICAgfVxuXG4gICAgLy8gbGUgcHJvdG9jb2xlIEpTT05QIG5lIGZvbmN0aW9ubmUgcXUnZW4gR0VULlxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvdG9jb2wgPT09IFwiSlNPTlBcIikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9IFwiR0VUXCI7XG4gICAgfVxuXG4gICAgLy8gZ2VzdGlvbiBkdSBjYWNoZVxuICAgIHRoaXMub3B0aW9ucy5ub2NhY2hlID0gb3B0aW9ucy5ub2NhY2hlIHx8IGZhbHNlO1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gYXR0cmlidXRzIGQnaW5zdGFuY2VzXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgZGUgcsOpcG9uc2UgZHUgc2VydmljZVxuICAgICAqL1xuICAgIHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlcXXDqnRlIGVudm95w6llIGF1IHNlcnZpY2VcbiAgICAgKi9cbiAgICB0aGlzLnJlcXVlc3QgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlcG9uc2UgZHUgc2VydmljZVxuICAgICAqL1xuICAgIHRoaXMucmVzcG9uc2UgPSBudWxsO1xufVxuXG4vKipcbiAqIEBsZW5kcyBtb2R1bGU6Q29tbW9uU2VydmljZVxuICovXG5Db21tb25TZXJ2aWNlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IENvbW1vblNlcnZpY2UsXG5cbiAgICAvKipcbiAgICAgKiBBcHBlbCBkdSBzZXJ2aWNlIEfDqW9wb3J0YWlsXG4gICAgICovXG4gICAgY2FsbCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoganNoaW50IHZhbGlkdGhpcyA6IHRydWUgKi9cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpjYWxsICgpXCIpO1xuXG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgLyoqIGZvbmN0aW9uIGQnZXhlY3V0aW9uICovXG4gICAgICAgIGZ1bmN0aW9uIHJ1biAoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6OnJ1biAoKVwiKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRSZXF1ZXN0LmNhbGwoY29udGV4dCwgb25FcnJvciwgb25CdWlsZFJlcXVlc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVuLmNhbGwoY29udGV4dCk7XG5cbiAgICAgICAgLy8gY2FsbGJhY2sgZGUgZmluIGRlIGNvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZVxuICAgICAgICBmdW5jdGlvbiBvbkJ1aWxkUmVxdWVzdCAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6Om9uQnVpbGRSZXF1ZXN0IDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmNhbGxTZXJ2aWNlLmNhbGwoY29udGV4dCwgb25FcnJvciwgb25DYWxsU2VydmljZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsYmFjayBkZSBmaW4gZCdhcHBlbCBhdSBzZXJ2aWNlXG4gICAgICAgIGZ1bmN0aW9uIG9uQ2FsbFNlcnZpY2UgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpvbkNhbGxTZXJ2aWNlIDogXCIsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmFuYWx5emVSZXNwb25zZS5jYWxsKGNvbnRleHQsIG9uRXJyb3IsIG9uQW5hbHl6ZVJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrIGRlIGZpbiBkZSBsZWN0dXJlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgZnVuY3Rpb24gb25BbmFseXplUmVzcG9uc2UgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJDb21tb25TZXJ2aWNlOjpvbkFuYWx5emVSZXNwb25zZSA6IFwiLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vblN1Y2Nlc3MuY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXCJBbmFseXNlIGRlIGxhIHJlcG9uc2UgZW4gw6ljaGVjICE/XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrIGRlIGdlc3Rpb24gZGVzIGVycmV1cnMgOiByZW52b2l0IHVuIG9iamV0IGRlIHR5cGUgRXJyb3JTZXJ2aWNlXG4gICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkNvbW1vblNlcnZpY2U6Om9uRXJyb3IoKVwiKTtcbiAgICAgICAgICAgIC8vIGVycm9yIDogbCdvYmpldCBlc3QgZHUgdHlwZSBFcnJvclNlcnZpY2Ugb3UgRXJyb3JcbiAgICAgICAgICAgIHZhciBlID0gZXJyb3I7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3JTZXJ2aWNlKSkge1xuICAgICAgICAgICAgICAgIGUgPSBuZXcgRXJyb3JTZXJ2aWNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uRmFpbHVyZS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBidWlsZFJlcXVlc3QgOiBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIm92ZXJ3cml0dGVuIG1ldGhvZCAhXCIpO1xuICAgICAgICAvLyByZXRvdXJuZSBsJ29iamV0ICd0aGlzLnJlcXVlc3QnXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBcIlRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdWNjZXNzLmNhbGwodGhpcywgXCJUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJ3cml0dGVuICFcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGVsIGR1IHNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICovXG4gICAgY2FsbFNlcnZpY2UgOiBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gSU5GT1xuICAgICAgICAvLyByZXRvdXJuZSBsJ29iamV0ICd0aGlzLnJlc3BvbnNlJ1xuXG4gICAgICAgIC8vIE5PVEVTXG4gICAgICAgIC8vICBQb3VyIGxlIG1vZGUgWEhSLCBvbiByZWN1cMOocmUgdW5lIHJlcG9uc2Ugc291cyBmb3JtZSBkJ3VuIGpzb24gb3UgeG1sICgjZG9jdW1lbnQpLlxuICAgICAgICAvLyAgUG91ciBsZSBtb2RlIEpTT05QLCBvbiBhIHRvdWpvdXJzIHVuIG9iamV0IEpTT04gbWFpcyBzb3VzIDIgZm9ybWVzIDpcbiAgICAgICAgLy8gICAgICAtIG5hdGlmXG4gICAgICAgIC8vICAgICAgLSBYTUwgZW5jYXBzdWzDqSA6XG4gICAgICAgIC8vICAgICAgICAgIHtodHRwIDoge3N0YXR1czoyMDAsIGVycm9yOm51bGx9LHhtbCA6J3LDqXBvbnNlIGR1IHNlcnZpY2UnfVxuICAgICAgICAvLyAgICAgICAgICB7aHR0cCA6IHtzdGF0dXM6NDAwLCBlcnJvcjoncmVwb25zZSBkdSBzZXJ2aWNlJ30seG1sIDpudWxsfVxuICAgICAgICAvLyAgRW4gWEhSLCBsYSByZXBvbnNlIGVzdCBkaXJlY3RlbWVudCBzYXV2ZWdhcmTDqWUgZGFucyAndGhpcy5yZXNwb25zZScuXG4gICAgICAgIC8vICBQYXIgY29udHJlLCBlbiBKU09OUCwgb24gZG9pdCBhbmFseXNlciBsYSByZXBvbnNlIChzdGF0dXMgb3Ugbm9uIHZpZGUpLFxuICAgICAgICAvLyAgZXQgbmUgcmVudm95ZXIgcXVlIGxlIGNvbnRlbnUgKHhtbCBvdSBsJ29iamV0KVxuXG4gICAgICAgIC8vIGdlc3Rpb24gZGUgbGEgcHJveGlmaWNhdGlvbiBkdSBzZXJ2aWNlXG4gICAgICAgIHZhciBzdHJVcmxQcm94aWZpZWQgPSBudWxsO1xuICAgICAgICB2YXIgc3RyRGF0YSA9IHRoaXMucmVxdWVzdDtcblxuICAgICAgICAvLyBhIHQgb24gbWlzIGVuIHBsYWNlIHVuIHByb3h5ID9cbiAgICAgICAgLy8gbGEgcHJveHlmaWNhdGlvbiBlc3QgdmFsYWJsZSB1bmlxdWVtZW50IGVuIG1vZGUgWEhSICFcbiAgICAgICAgdmFyIGJVcmxQcm94aWZpZWQgPSAhISh0aGlzLm9wdGlvbnMucHJveHlVUkwgJiYgdGhpcy5vcHRpb25zLnByb3RvY29sID09PSBcIlhIUlwiKTtcblxuICAgICAgICAvLyByYWpvdXQgZGUgbCdvcHRpb24gZ3BiaWJhY2Nlc3NcbiAgICAgICAgLy8gSU5GTyA6IGFjY2VzIGF1IG51bWVybyBkZSB2ZXJzaW9uIGRlIHBhY2thZ2UuY29uZiBhcHLDqXMgY29tcGlsYXRpb24gIVxuICAgICAgICBpZiAodGhpcy5DTEFTU05BTUUgIT09IFwiR2VvY29kZVwiICYmIHRoaXMuQ0xBU1NOQU1FICE9PSBcIlJldmVyc2VHZW9jb2RlXCIgJiYgdGhpcy5DTEFTU05BTUUgIT09IFwiQXV0b0NvbXBsZXRlXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwgPSBIZWxwZXIubm9ybWFseXplVXJsKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwsIHtcbiAgICAgICAgICAgICAgICBcImdwLWFjY2Vzcy1saWJcIiA6IFBrZy52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFwaUtleSA6IHRoaXMub3B0aW9ucy5hcGlLZXkgfHwgXCJjYWxjdWxcIlxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2kgbGUgcHJveHkgZXN0IHJlbnNlaWduw6ksIG9uIHByb3hpZmllIGwndXJsIGR1IHNlcnZpY2VcbiAgICAgICAgaWYgKGJVcmxQcm94aWZpZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAgIHN0clVybFByb3hpZmllZCA9IHRoaXMub3B0aW9ucy5wcm94eVVSTCArIEhlbHBlci5ub3JtYWx5emVVcmwodGhpcy5vcHRpb25zLnNlcnZlclVybCwgdGhpcy5yZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzdHJEYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgICAgICAgICAgIHN0clVybFByb3hpZmllZCA9IHRoaXMub3B0aW9ucy5wcm94eVVSTCArIEhlbHBlci5ub3JtYWx5emVVcmwodGhpcy5vcHRpb25zLnNlcnZlclVybCwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3RyRGF0YSA9IHRoaXMucmVxdWVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnRleHRlIGR1IGNvbXBvc2FudCBzcMOpY2lmaXF1ZSAhXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHVybCA6IHN0clVybFByb3hpZmllZCB8fCB0aGlzLm9wdGlvbnMuc2VydmVyVXJsLFxuICAgICAgICAgICAgbWV0aG9kIDogdGhpcy5vcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBwcm90b2NvbCA6IHRoaXMub3B0aW9ucy5wcm90b2NvbCxcbiAgICAgICAgICAgIHRpbWVPdXQgOiB0aGlzLm9wdGlvbnMudGltZU91dCB8fCAwLFxuICAgICAgICAgICAgZm9ybWF0IDogdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCwgLy8gY2VjaSBkZWNsZW5jaGUgbGUgcGFyc2luZyBkZSBsYSByZXBvbnNlIGR1IHNlcnZpY2UsIG1haXMgb24gc291aGFpdGUgdG91am91cnMgdW5lIHJlcG9uc2UgYnJ1dGUgKHN0cmluZykgIVxuICAgICAgICAgICAgbm9jYWNoZSA6IHRoaXMub3B0aW9ucy5ub2NhY2hlIHx8IGZhbHNlLCAvLyBjZWNpIHBlcm1ldCBkJ2Fqb3V0ZXIgdW4gdGltZXN0YW1wIGRhbnMgbGEgcmVxdcOqdGVcbiAgICAgICAgICAgIHdyYXAgOiB0aGlzLm9wdGlvbnMucHJvdG9jb2wgIT09IFwiWEhSXCIsIC8vIGNlY2kgZGVjbGVuY2hlIGwnZW5jYXBzdWxhdGlvbiBkZSBsYSByZXBvbnNlIFhNTCBkdSBzZXJ2aWNlIGRhbnMgZHUgSlNPTiwgbWFpcyBwYXMgZW4gbW9kZSBYSFIgIVxuICAgICAgICAgICAgY2FsbGJhY2tTdWZmaXggOiB0aGlzLm9wdGlvbnMuY2FsbGJhY2tTdWZmaXgsXG4gICAgICAgICAgICAvLyBjYWxsYmFja05hbWUgOiB0aGlzLm9wdGlvbnMuY2FsbGJhY2tOYW1lIHx8IG51bGwsXG4gICAgICAgICAgICBkYXRhIDogc3RyRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnMgOiBudWxsLCAvLyBUT0RPLi4uXG4gICAgICAgICAgICBjb250ZW50IDogdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlIHx8IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgICAgICBzY29wZSA6IHRoaXMub3B0aW9ucy5zY29wZSB8fCB0aGlzLFxuICAgICAgICAgICAgLy8gY2FsbGJhY2sgZGUgcmVwb25zZVxuICAgICAgICAgICAgb25SZXNwb25zZSA6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiY2FsbFNlcnZpY2U6Om9uUmVzcG9uc2UoKVwiKTtcblxuICAgICAgICAgICAgICAgIC8vIGxlIGNvbnRlbnUgZGUgbGEgcmVwb25zZSDDoCByZW52b3llciAhXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gWEhSIDogb24gcmVudm9pZSB0b3Vqb3VycyBsYSByZXBvbnNlIGJydXRlIGR1IHNlcnZpY2UgKGpzb24gb3UgeG1sKVxuICAgICAgICAgICAgICAgIC8vIGF1IHBhcnNlciBkdSBjb21wb3NhbnQuLi5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnByb3RvY29sID09PSBcIlhIUlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiUmVzcG9uc2UgWEhSXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHJlc3BvbnNlOyAvLyBwYXIgZGVmYXV0LCBsYSByZXBvbnNlIGR1IHNlcnZpY2UgICFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBKU09OUCA6IG9uIHByZS1hbmFseXNlIGxhIHJlcG9uc2UgYnJ1dGUgZHUgc2VydmljZSAoZW5jYXBzdWxlciBvdSBwYXMpXG4gICAgICAgICAgICAgICAgLy8gYXZhbnQgZGUgbCdlbnZveWVyIGF1IHBhcnNlciBkdSBjb21wb3NhbnQuLi5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnByb3RvY29sID09PSBcIkpTT05QXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoXCJSZXNwb25zZSBKU09OXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaHR0cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9uc2UgZW5jYXBzdWzDqWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiByZXBvbnNlIGR1IHNlcnZpY2UgZW4geG1sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPiB7aHR0cCA6IHtzdGF0dXM6MjAwLCBlcnJvcjpudWxsfSx4bWwgOidyw6lwb25zZSBkdSBzZXJ2aWNlJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaHR0cC5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYWxsKHNlbGYsIG5ldyBFcnJvclNlcnZpY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogcmVzcG9uc2UuaHR0cC5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogcmVzcG9uc2UuaHR0cC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHJlc3BvbnNlLnhtbDsgLy8gcGFyIGRlZmF1dCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb25zZSBub24gZW5jYXBzdWzDqWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiByZXBvbnNlIGR1IHNlcnZpY2UgZW4ganNvbiBvdSB4bWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYWxsKHNlbGYsIG5ldyBFcnJvclNlcnZpY2UoXCJMZSBjb250ZW51IGRlIGxhIHJlcG9uc2UgZXN0IHZpZGUgIT9cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gc2kgb24gc291aGFpdGUgcGFyc2VyIGxhIHJlcG9uc2UgZHUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5vcHRpb25zLm9uQmVmb3JlUGFyc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UmVzcG9uc2UgPSBzZWxmLm9wdGlvbnMub25CZWZvcmVQYXJzZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdSZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGEgcmVwb25zZSBwYXJzw6llIHBhciBsJ3V0aWxpc2F0ZXVyIGVzdCByZXRvdXJuw6llIHNvdXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1lIGRlIHN0cmluZyAhXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbmV3UmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2F1dmVnYXJkZSBkZSBsYSByZXBvbnNlIGRhbnMgbCdvYmpldCBwYXJlbnQgKENvbW1vblNlcnZpY2UpXG4gICAgICAgICAgICAgICAgc2VsZi5yZXNwb25zZSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgLy8gb24gcmVudm9pZSBsYSByZXBvbnNlLi4uXG4gICAgICAgICAgICAgICAgc3VjY2Vzcy5jYWxsKHNlbGYsIGNvbnRlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gICAgICAgICAgICBvbkZhaWx1cmUgOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFwiY2FsbFNlcnZpY2U6Om9uRmFpbHVyZSgpXCIpO1xuICAgICAgICAgICAgICAgIC8vIG9uIGVzdCBmb3JjZW1lbnQgc3VyIHVuZSBlcnJldXIgbGV2w6llIHBhciB1biBzZXJ2aWNlICFcbiAgICAgICAgICAgICAgICBlLnR5cGUgPSBFcnJvclNlcnZpY2UuVFlQRV9TUlZFUlI7XG4gICAgICAgICAgICAgICAgZXJyb3IuY2FsbChzZWxmLCBuZXcgRXJyb3JTZXJ2aWNlKGUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBjYWxsYmFjayBkZSB0aW1lT3V0XG4gICAgICAgICAgICBvblRpbWVPdXQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoXCJjYWxsU2VydmljZTo6b25UaW1lT3V0KClcIik7XG4gICAgICAgICAgICAgICAgZXJyb3IuY2FsbChzZWxmLCBuZXcgRXJyb3JTZXJ2aWNlKFwiVGltZU91dCFcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFByb3RvY29sLnNlbmQob3B0aW9ucyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFuYWx5c2UgZGUgbGEgcsOpcG9uc2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gICAgICovXG4gICAgYW5hbHl6ZVJlc3BvbnNlIDogZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJvdmVyd3JpdHRlbiBtZXRob2QgIVwiKTtcbiAgICAgICAgLy8gcmV0b3VybmUgbCdvYmpldCBzcMOpY2lmaXF1ZSBhdSB0eXBlIGRlIGNvbXBvc2FudCAoanNvbilcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBlcnJvci5jYWxsKHRoaXMsIFwiVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVyd3JpdHRlbiAhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCBcIlRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gIVwiKTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1vblNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/CommonService.js\n"); + +/***/ }), + +/***/ "./src/Services/Config/Config.js": +/*!***************************************!*\ + !*** ./src/Services/Config/Config.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ConfigInterface */ \"./src/Services/Config/ConfigInterface.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n/**\n * @classdesc\n *\n * Recupération de la configuration de clés Géoportail sous forme de JSON\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Config\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule\n * @param {Boolean} [options.sync=false] - force le mode synchrone\n * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey.\n *\n * @example\n * var options = {\n * apiKey : \"cartes,ortho\",\n * sync : false,\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * };\n *\n */\nfunction Config(options) {\n if (!(this instanceof Config)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Config\"));\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"Config\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Config\");\n this.logger.trace(\"[Constructeur Config (options)]\");\n\n // #####################\n // analyse des options\n // #####################\n\n // gestion du callback onSuccess\n var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === \"function\");\n if (!bOnSuccess) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"onSuccess()\"));\n }\n if (!options.apiKey && !options.customConfigFile) {\n // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config\n options.apiKey = \"full\";\n }\n this.options = {};\n this.options.onSuccess = options.onSuccess;\n this.options.onFailure = options.onFailure;\n\n // mode sync\n this.options.sync = options.sync || false;\n\n // gestion d'un tableau d'url des fichiers de configuration\n this.options.listConfigUrls = options.customConfigFile ? [options.customConfigFile] : !Array.isArray(options.apiKey) ? _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Config.url(options.apiKey.split(\",\")) : _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Config.url(options.apiKey);\n}\n\n/**\n * @lends module:Config#\n */\nConfig.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/**\n * Constructeur (alias)\n */\nConfig.prototype.constructor = Config;\n\n/**\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.buildRequest = function (error, success) {\n // liste des urls des fichiers de configuration en JSON\n this.listConfigUrls = this.options.listConfigUrls;\n if (!this.listConfigUrls) {\n error.call(this, new Error(\"url by default not found !\"));\n return;\n }\n\n // INFO :\n // il n'y a pas de construction de requête,\n // on passe directement à l'appel des requêtes\n success.call(this, this.listConfigUrls);\n};\n\n/**\n * Récupération des configuration\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.callService = function (error, success) {\n if (this.options.sync) {\n __callServiceSync.call(this, error, success);\n } else {\n __callService.call(this, error, success);\n }\n};\n\n/**\n * Requêtes en mode asynchrone\n *\n * @param {*} error\n * @param {*} success\n * @private\n */\nvar __callService = function __callService(error, success) {\n var _this = this;\n // liste des resultats au format JSON\n this.listConfigResults = [];\n\n // test on env. nodejs or browser\n var Fetch = null;\n if (typeof window === \"undefined\") {\n var nodefetch = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n Fetch = nodefetch;\n } else {\n Fetch = window.fetch;\n }\n\n // the factory of fetch !\n var fetchFactory = function fetchFactory(url) {\n return Fetch(url, {\n credentials: \"same-origin\"\n }).then(function (response) {\n if (response.ok) {\n return response.json().then(function (json) {\n // TODO :\n // tester le contenu !\n return json;\n })[\"catch\"](function (error) {\n throw new Error(\"Exception Json : \" + error);\n });\n } else {\n throw new Error(\"Exception HTTP : \" + response.status + \" (status code) !\");\n }\n })[\"catch\"](function (error) {\n return new Promise(function (resolve, reject) {\n // eslint-disable-line no-unused-vars\n reject(error);\n });\n });\n };\n\n // construction des promises fetch\n var promises = [];\n for (var index = 0; index < this.listConfigUrls.length; index++) {\n var url = this.listConfigUrls[index];\n promises.push(fetchFactory(url));\n }\n Promise.all(promises).then(function (results) {\n if (!results) {\n throw new Error(\"results config empty !?\");\n }\n results.forEach(function (result) {\n // TODO :\n // verification des resultats\n _this.listConfigResults.push(result);\n });\n }).then(function () {\n success.call(_this, _this.listConfigResults);\n })[\"catch\"](function (e) {\n // TODO :\n // construction d'un message\n error.call(_this, e);\n });\n};\n\n/**\n * Requêtes en mode synchrone\n *\n * @param {*} error\n * @param {*} success\n * @private\n */\nvar __callServiceSync = function __callServiceSync(error, success) {\n // liste des resultats au format JSON\n this.listConfigResults = [];\n\n // FIXME :\n // boucle synchrone !\n for (var i = 0; i < this.listConfigUrls.length; i++) {\n var url = this.listConfigUrls[i];\n // TODO :\n // prévoir le CORS, headers, ...\n var request = new XMLHttpRequest();\n request.open(\"GET\", url, false);\n request.send(null);\n if (request.status === 200) {\n // TODO :\n // tester la reponse !\n var response = JSON.parse(request.responseText);\n this.listConfigResults.push(response);\n }\n }\n // callback\n if (this.listConfigResults.length !== 0) {\n success.call(this, this.listConfigResults);\n } else {\n error.call(this, new Error(\"...\"));\n }\n};\n\n/**\n * Analyse et mise en forme de la réponse en fusionnant les configurations\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n * @overload\n */\nConfig.prototype.analyzeResponse = function (error, success) {\n // fonction de merge des objects JSON\n var mergeConfig = function mergeConfig(objects) {\n // objet fusion des couches\n var allLayersConfig = {};\n // objet fusion des clés\n var allKeysConfig = {};\n // objet fusion des TMS\n var allTMSConfig = {};\n\n // on fusionne les résultat\n for (var i = 0; i < objects.length; i++) {\n if (!objects[i].generalOptions || !objects[i].layers) {\n return;\n }\n allKeysConfig = _objectSpread(_objectSpread({}, allKeysConfig), objects[i].generalOptions.apiKeys);\n allLayersConfig = _objectSpread(_objectSpread({}, allLayersConfig), objects[i].layers);\n allTMSConfig = _objectSpread(_objectSpread({}, allTMSConfig), objects[i].tileMatrixSets);\n }\n var mergedConfig = {\n generalOptions: {\n apiKeys: allKeysConfig\n },\n layers: allLayersConfig,\n tileMatrixSets: allTMSConfig\n };\n return mergedConfig;\n };\n\n // fusion des configurations JSON\n var ConfigJSON = mergeConfig(this.listConfigResults);\n if (!ConfigJSON) {\n error.call(this, new Error(\"configuration structure not conforme !\"));\n return;\n }\n\n // creation des interfaces\n var IConfig = new _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n // ajout des interfaces avec la configuration JSON\n Object.assign(IConfig, ConfigJSON);\n\n // définition de la variable globale Gp.Config\n var scope = typeof window !== \"undefined\" ? window : {};\n if (!scope.Gp) {\n scope.Gp = {};\n }\n\n // enregistrement\n if (scope.Gp.Config) {\n Object.assign(scope.Gp.Config, IConfig);\n // dans le doute..., ceinture et bretelles !\n for (var property in IConfig) {\n scope.Gp.Config[property] = IConfig[property];\n }\n } else {\n scope.Gp.Config = IConfig;\n }\n\n // INFO :\n // il n'y a pas d'analyse des résultats,\n // on passe directement à l'appel de la callback utilisateur\n success.call(this, scope.Gp.Config);\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Config);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db25maWcvQ29uZmlnLmpzP2FjMjIiXSwibmFtZXMiOlsiQ29uZmlnIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJiT25TdWNjZXNzIiwib25TdWNjZXNzIiwiRXJyb3IiLCJhcGlLZXkiLCJjdXN0b21Db25maWdGaWxlIiwib25GYWlsdXJlIiwic3luYyIsImxpc3RDb25maWdVcmxzIiwiQXJyYXkiLCJpc0FycmF5IiwiRGVmYXVsdFVybFNlcnZpY2UiLCJ1cmwiLCJzcGxpdCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIkNvbW1vblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImNhbGwiLCJjYWxsU2VydmljZSIsIl9fY2FsbFNlcnZpY2VTeW5jIiwiX19jYWxsU2VydmljZSIsIl90aGlzIiwibGlzdENvbmZpZ1Jlc3VsdHMiLCJGZXRjaCIsIndpbmRvdyIsIm5vZGVmZXRjaCIsInJlcXVpcmUiLCJmZXRjaCIsImZldGNoRmFjdG9yeSIsImNyZWRlbnRpYWxzIiwidGhlbiIsInJlc3BvbnNlIiwib2siLCJqc29uIiwic3RhdHVzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlcyIsImluZGV4IiwibGVuZ3RoIiwicHVzaCIsImFsbCIsInJlc3VsdHMiLCJmb3JFYWNoIiwicmVzdWx0IiwiZSIsImkiLCJyZXF1ZXN0IiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwic2VuZCIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsImFuYWx5emVSZXNwb25zZSIsIm1lcmdlQ29uZmlnIiwib2JqZWN0cyIsImFsbExheWVyc0NvbmZpZyIsImFsbEtleXNDb25maWciLCJhbGxUTVNDb25maWciLCJnZW5lcmFsT3B0aW9ucyIsImxheWVycyIsIl9vYmplY3RTcHJlYWQiLCJhcGlLZXlzIiwidGlsZU1hdHJpeFNldHMiLCJtZXJnZWRDb25maWciLCJDb25maWdKU09OIiwiSUNvbmZpZyIsIkNvbmZpZ0ludGVyZmFjZSIsImFzc2lnbiIsInNjb3BlIiwiR3AiLCJwcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQWlEO0FBQ0g7QUFDRDtBQUNRO0FBQ0w7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsTUFBTUEsQ0FBRUMsT0FBTyxFQUFFO0VBQ3RCLElBQUksRUFBRSxJQUFJLFlBQVlELE1BQU0sQ0FBQyxFQUFFO0lBQzNCLE1BQU0sSUFBSUUsU0FBUyxDQUFDQyxnRUFBQyxDQUFDQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7RUFDcEU7O0VBRUE7QUFDSjtBQUNBO0VBQ0ksSUFBSSxDQUFDQyxTQUFTLEdBQUcsUUFBUTtFQUV6QixJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUMzQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLGlDQUFpQyxDQUFDOztFQUVwRDtFQUNBO0VBQ0E7O0VBRUE7RUFDQSxJQUFJQyxVQUFVLEdBQUcsQ0FBQyxFQUFFVCxPQUFPLENBQUNVLFNBQVMsS0FBSyxJQUFJLElBQUksT0FBT1YsT0FBTyxDQUFDVSxTQUFTLEtBQUssVUFBVSxDQUFDO0VBQzFGLElBQUksQ0FBQ0QsVUFBVSxFQUFFO0lBQ2IsTUFBTSxJQUFJRSxLQUFLLENBQUNULGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7RUFDakU7RUFDQSxJQUFJLENBQUNILE9BQU8sQ0FBQ1ksTUFBTSxJQUFJLENB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QUNqQjs7RUFFQTtFQUNBLElBQUlELEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxFQUFFO0lBQ2pCd0IsTUFBTSxDQUFDNEQsTUFBTSxDQUFDQyxLQUFLLENBQUNDLEVBQUUsQ0FBQ3RGLE1BQU0sRUFBRWtGLE9BQU8sQ0FBQztJQUN2QztJQUNBLEtBQUssSUFBSUssUUFBUSxJQUFJTCxPQUFPLEVBQUU7TUFDMUJHLEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxDQUFDdUYsUUFBUSxDQUFDLEdBQUdMLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDO0lBQ2pEO0VBQ0osQ0FBQyxNQUFNO0lBQ0hGLEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxHQUFHa0YsT0FBTztFQUM3Qjs7RUFFQTtFQUNBO0VBQ0E7RUFDQXBELE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLElBQUksRUFBRXNELEtBQUssQ0FBQ0MsRUFBRSxDQUFDdEYsTUFBTSxDQUFDO0FBQ3ZDLENBQUM7QUFFY0EscUVBQU0iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvQ29uZmlnL0NvbmZpZy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IENvbmZpZ0ludGVyZmFjZSBmcm9tIFwiLi9Db25maWdJbnRlcmZhY2VcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKlxuICogUmVjdXDDqXJhdGlvbiBkZSBsYSBjb25maWd1cmF0aW9uIGRlIGNsw6lzIEfDqW9wb3J0YWlsIHNvdXMgZm9ybWUgZGUgSlNPTlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuQ29uZmlnXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICogQHBhcmFtIHtTdGluZ30gb3B0aW9ucy5hcGlLZXkgLSBjbMOpKHMpIGRvbnQgb24gdmV1dCBvYnRlbmlyIGxhIGNvbmZpZ3VyYXRpb24uIFNpIHBsdXNpZXVycyBjbMOpcywgc8OpcGFyZXIgY2hhY3VuZSBwYXIgdW5lIHZpcmd1bGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3luYz1mYWxzZV0gLSBmb3JjZSBsZSBtb2RlIHN5bmNocm9uZVxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuY3VzdG9tQ29uZmlnRmlsZSAtIGNoZW1pbiB2ZXJzIHVuIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBwZXJzb25uYWxpc8OpLiBTdXJjaGFyZ2UgbGUgcGFyYW3DqHRyZSBhcGlLZXkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGFwaUtleSA6IFwiY2FydGVzLG9ydGhvXCIsXG4gKiAgICAgIHN5bmMgOiBmYWxzZSxcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgfTtcbiAqXG4gKi9cbmZ1bmN0aW9uIENvbmZpZyAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb25maWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJDb25maWdcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vbSBkZSBsYSBjbGFzc2UgKGhlcml0YWdlKVxuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJDb25maWdcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLkNvbmZpZ1wiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgQ29uZmlnIChvcHRpb25zKV1cIik7XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBhbmFseXNlIGRlcyBvcHRpb25zXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvLyBnZXN0aW9uIGR1IGNhbGxiYWNrIG9uU3VjY2Vzc1xuICAgIHZhciBiT25TdWNjZXNzID0gISEob3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25TdWNjZXNzID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIGlmICghYk9uU3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcIm9uU3VjY2VzcygpXCIpKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFwaUtleSAmJiAhb3B0aW9ucy5jdXN0b21Db25maWdGaWxlKSB7XG4gICAgICAgIC8vIHNpIHBhcyBkZSB0aMOobWUgc3DDqWNpZmnDqSwgb24gcsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHJlc3NvdXJjZXMgcG9zc2libGVzIGRhbnMgbCdvYmpldCBDb25maWdcbiAgICAgICAgb3B0aW9ucy5hcGlLZXkgPSBcImZ1bGxcIjtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgdGhpcy5vcHRpb25zLm9uU3VjY2VzcyA9IG9wdGlvbnMub25TdWNjZXNzO1xuICAgIHRoaXMub3B0aW9ucy5vbkZhaWx1cmUgPSBvcHRpb25zLm9uRmFpbHVyZTtcblxuICAgIC8vIG1vZGUgc3luY1xuICAgIHRoaXMub3B0aW9ucy5zeW5jID0gb3B0aW9ucy5zeW5jIHx8IGZhbHNlO1xuXG4gICAgLy8gZ2VzdGlvbiBkJ3VuIHRhYmxlYXUgZCd1cmwgZGVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm9wdGlvbnMubGlzdENvbmZpZ1VybHMgPSAob3B0aW9ucy5jdXN0b21Db25maWdGaWxlKVxuICAgICAgICA/IFtvcHRpb25zLmN1c3RvbUNvbmZpZ0ZpbGVdXG4gICAgICAgIDogIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hcGlLZXkpXG4gICAgICAgICAgICA/IERlZmF1bHRVcmxTZXJ2aWNlLkNvbmZpZy51cmwob3B0aW9ucy5hcGlLZXkuc3BsaXQoXCIsXCIpKVxuICAgICAgICAgICAgOiBEZWZhdWx0VXJsU2VydmljZS5Db25maWcudXJsKG9wdGlvbnMuYXBpS2V5KTtcbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOkNvbmZpZyNcbiAqL1xuQ29uZmlnLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qKlxuICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAqL1xuQ29uZmlnLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmZpZztcblxuLyoqXG4gKiBDcsOpYXRpb24gZGUgbGEgcmVxdcOqdGVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gbGlzdGUgZGVzIHVybHMgZGVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24gZW4gSlNPTlxuICAgIHRoaXMubGlzdENvbmZpZ1VybHMgPSB0aGlzLm9wdGlvbnMubGlzdENvbmZpZ1VybHM7XG5cbiAgICBpZiAoIXRoaXMubGlzdENvbmZpZ1VybHMpIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3IoXCJ1cmwgYnkgZGVmYXVsdCBub3QgZm91bmQgIVwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJTkZPIDpcbiAgICAvLyBpbCBuJ3kgYSBwYXMgZGUgY29uc3RydWN0aW9uIGRlIHJlcXXDqnRlLFxuICAgIC8vIG9uIHBhc3NlIGRpcmVjdGVtZW50IMOgIGwnYXBwZWwgZGVzIHJlcXXDqnRlc1xuICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdVcmxzKTtcbn07XG5cbi8qKlxuICogUsOpY3Vww6lyYXRpb24gZGVzIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuY2FsbFNlcnZpY2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN5bmMpIHtcbiAgICAgICAgX19jYWxsU2VydmljZVN5bmMuY2FsbCh0aGlzLCBlcnJvciwgc3VjY2Vzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX19jYWxsU2VydmljZS5jYWxsKHRoaXMsIGVycm9yLCBzdWNjZXNzKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJlcXXDqnRlcyBlbiBtb2RlIGFzeW5jaHJvbmVcbiAqXG4gKiBAcGFyYW0geyp9IGVycm9yXG4gKiBAcGFyYW0geyp9IHN1Y2Nlc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBfX2NhbGxTZXJ2aWNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gbGlzdGUgZGVzIHJlc3VsdGF0cyBhdSBmb3JtYXQgSlNPTlxuICAgIHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMgPSBbXTtcblxuICAgIC8vIHRlc3Qgb24gZW52LiBub2RlanMgb3IgYnJvd3NlclxuICAgIGxldCBGZXRjaCA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmFyIG5vZGVmZXRjaCA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpO1xuICAgICAgICBGZXRjaCA9IG5vZGVmZXRjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBGZXRjaCA9IHdpbmRvdy5mZXRjaDtcbiAgICB9XG5cbiAgICAvLyB0aGUgZmFjdG9yeSBvZiBmZXRjaCAhXG4gICAgdmFyIGZldGNoRmFjdG9yeSA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIEZldGNoKHVybCwgeyBjcmVkZW50aWFscyA6IFwic2FtZS1vcmlnaW5cIiB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVzdGVyIGxlIGNvbnRlbnUgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gSnNvbiA6IFwiICsgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIEhUVFAgOiBcIiArIHJlc3BvbnNlLnN0YXR1cyArIFwiIChzdGF0dXMgY29kZSkgIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBjb25zdHJ1Y3Rpb24gZGVzIHByb21pc2VzIGZldGNoXG4gICAgdmFyIHByb21pc2VzID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMubGlzdENvbmZpZ1VybHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubGlzdENvbmZpZ1VybHNbaW5kZXhdO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZldGNoRmFjdG9yeSh1cmwpKTtcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3VsdHMgY29uZmlnIGVtcHR5ICE/XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDpcbiAgICAgICAgICAgICAgICAvLyB2ZXJpZmljYXRpb24gZGVzIHJlc3VsdGF0c1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdSZXN1bHRzKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPIDpcbiAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkJ3VuIG1lc3NhZ2VcbiAgICAgICAgICAgIGVycm9yLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH0pO1xufTtcblxuLyoqXG4gKiBSZXF1w6p0ZXMgZW4gbW9kZSBzeW5jaHJvbmVcbiAqXG4gKiBAcGFyYW0geyp9IGVycm9yXG4gKiBAcGFyYW0geyp9IHN1Y2Nlc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBfX2NhbGxTZXJ2aWNlU3luYyA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIC8vIGxpc3RlIGRlcyByZXN1bHRhdHMgYXUgZm9ybWF0IEpTT05cbiAgICB0aGlzLmxpc3RDb25maWdSZXN1bHRzID0gW107XG5cbiAgICAvLyBGSVhNRSA6XG4gICAgLy8gYm91Y2xlIHN5bmNocm9uZSAhXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpc3RDb25maWdVcmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubGlzdENvbmZpZ1VybHNbaV07XG4gICAgICAgIC8vIFRPRE8gOlxuICAgICAgICAvLyBwcsOpdm9pciBsZSBDT1JTLCBoZWFkZXJzLCAuLi5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsLCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Quc2VuZChudWxsKTtcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIC8vIFRPRE8gOlxuICAgICAgICAgICAgLy8gdGVzdGVyIGxhIHJlcG9uc2UgIVxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RDb25maWdSZXN1bHRzLnB1c2gocmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNhbGxiYWNrXG4gICAgaWYgKHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLmxpc3RDb25maWdSZXN1bHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvcihcIi4uLlwiKSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBbmFseXNlIGV0IG1pc2UgZW4gZm9ybWUgZGUgbGEgcsOpcG9uc2UgZW4gZnVzaW9ubmFudCBsZXMgY29uZmlndXJhdGlvbnNcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvciAgIC0gY2FsbGJhY2sgZGVzIGVycmV1cnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFja1xuICogQG92ZXJsb2FkXG4gKi9cbkNvbmZpZy5wcm90b3R5cGUuYW5hbHl6ZVJlc3BvbnNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLy8gZm9uY3Rpb24gZGUgbWVyZ2UgZGVzIG9iamVjdHMgSlNPTlxuICAgIHZhciBtZXJnZUNvbmZpZyA9IGZ1bmN0aW9uIChvYmplY3RzKSB7XG4gICAgICAgIC8vIG9iamV0IGZ1c2lvbiBkZXMgY291Y2hlc1xuICAgICAgICB2YXIgYWxsTGF5ZXJzQ29uZmlnID0ge307XG4gICAgICAgIC8vIG9iamV0IGZ1c2lvbiBkZXMgY2zDqXNcbiAgICAgICAgdmFyIGFsbEtleXNDb25maWcgPSB7fTtcbiAgICAgICAgLy8gb2JqZXQgZnVzaW9uIGRlcyBUTVNcbiAgICAgICAgdmFyIGFsbFRNU0NvbmZpZyA9IHt9O1xuXG4gICAgICAgIC8vIG9uIGZ1c2lvbm5lIGxlcyByw6lzdWx0YXRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIW9iamVjdHNbaV0uZ2VuZXJhbE9wdGlvbnMgfHwgIW9iamVjdHNbaV0ubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxsS2V5c0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxLZXlzQ29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLm9iamVjdHNbaV0uZ2VuZXJhbE9wdGlvbnMuYXBpS2V5c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFsbExheWVyc0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxMYXllcnNDb25maWcsXG4gICAgICAgICAgICAgICAgLi4ub2JqZWN0c1tpXS5sYXllcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhbGxUTVNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4uYWxsVE1TQ29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLm9iamVjdHNbaV0udGlsZU1hdHJpeFNldHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWVyZ2VkQ29uZmlnID0ge1xuICAgICAgICAgICAgZ2VuZXJhbE9wdGlvbnMgOiB7XG4gICAgICAgICAgICAgICAgYXBpS2V5cyA6IGFsbEtleXNDb25maWdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXllcnMgOiBhbGxMYXllcnNDb25maWcsXG4gICAgICAgICAgICB0aWxlTWF0cml4U2V0cyA6IGFsbFRNU0NvbmZpZ1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWVyZ2VkQ29uZmlnO1xuICAgIH07XG5cbiAgICAvLyBmdXNpb24gZGVzIGNvbmZpZ3VyYXRpb25zIEpTT05cbiAgICB2YXIgQ29uZmlnSlNPTiA9IG1lcmdlQ29uZmlnKHRoaXMubGlzdENvbmZpZ1Jlc3VsdHMpO1xuICAgIGlmICghQ29uZmlnSlNPTikge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvcihcImNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIG5vdCBjb25mb3JtZSAhXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNyZWF0aW9uIGRlcyBpbnRlcmZhY2VzXG4gICAgdmFyIElDb25maWcgPSBuZXcgQ29uZmlnSW50ZXJmYWNlKCk7XG4gICAgLy8gYWpvdXQgZGVzIGludGVyZmFjZXMgYXZlYyBsYSBjb25maWd1cmF0aW9uIEpTT05cbiAgICBPYmplY3QuYXNzaWduKElDb25maWcsIENvbmZpZ0pTT04pO1xuXG4gICAgLy8gZMOpZmluaXRpb24gZGUgbGEgdmFyaWFibGUgZ2xvYmFsZSBHcC5Db25maWdcbiAgICB2YXIgc2NvcGUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge307XG4gICAgaWYgKCFzY29wZS5HcCkge1xuICAgICAgICBzY29wZS5HcCA9IHt9O1xuICAgIH1cblxuICAgIC8vIGVucmVnaXN0cmVtZW50XG4gICAgaWYgKHNjb3BlLkdwLkNvbmZpZykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNjb3BlLkdwLkNvbmZpZywgSUNvbmZpZyk7XG4gICAgICAgIC8vIGRhbnMgbGUgZG91dGUuLi4sIGNlaW50dXJlIGV0IGJyZXRlbGxlcyAhXG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIElDb25maWcpIHtcbiAgICAgICAgICAgIHNjb3BlLkdwLkNvbmZpZ1twcm9wZXJ0eV0gPSBJQ29uZmlnW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHNjb3BlLkdwLkNvbmZpZyA9IElDb25maWc7XG4gICAgfVxuXG4gICAgLy8gSU5GTyA6XG4gICAgLy8gaWwgbid5IGEgcGFzIGQnYW5hbHlzZSBkZXMgcsOpc3VsdGF0cyxcbiAgICAvLyBvbiBwYXNzZSBkaXJlY3RlbWVudCDDoCBsJ2FwcGVsIGRlIGxhIGNhbGxiYWNrIHV0aWxpc2F0ZXVyXG4gICAgc3VjY2Vzcy5jYWxsKHRoaXMsIHNjb3BlLkdwLkNvbmZpZyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb25maWc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Config/Config.js\n"); + +/***/ }), + +/***/ "./src/Services/Config/ConfigInterface.js": +/*!************************************************!*\ + !*** ./src/Services/Config/ConfigInterface.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Object} generalOptions - General properties for default map configuration resources.\n * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key.\n * @property {String} generalOptions.title - Underlying web service Title.\n * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array.\n * @property {String} generalOptions.theme - default theme (FIXME : for what ?)\n * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel.\n * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}).\n * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}).\n *\n * @namespace\n * @alias Gp.Services.GetConfigInterface\n */\nfunction ConfigInterface() {\n if (!(this instanceof ConfigInterface)) {\n throw new TypeError(\"ConfigInterface constructor cannot be called as a function.\");\n }\n this.generalOptions = {\n apiKeys: {},\n title: null,\n defaultGMLGFIStyle: null,\n theme: null,\n wgs84Resolutions: []\n };\n this.layers = {};\n this.tileMatrixSets = {};\n}\nConfigInterface.prototype = {\n /*\n * Constructor (alias)\n */\n constructor: ConfigInterface,\n /**\n * Check if config is loaded for a given key\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise\n */\n isKeyConfLoaded: function isKeyConfLoaded(apiKey) {\n if (!apiKey) {\n return;\n }\n if (this.generalOptions.apiKeys[apiKey]) {\n return true;\n }\n return false;\n },\n /**\n * Returns an array of Geoportal layers identifiers, corresponding to an API contract key.\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Array} apiKeys - Array of geoportal layers identifiers\n */\n getLayersId: function getLayersId(apiKey) {\n return this.generalOptions.apiKeys[apiKey];\n },\n /**\n * Returns the id of a Geoportal layer with its name and its service.\n *\n * @param {String} layerName - name of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {String} service - name of the service (ex. \"WMS\" ou \"WMTS\")\n * @returns {String} Id of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS\")\n */\n getLayerId: function getLayerId(layerName, service) {\n if (!layerName || !service) {\n return;\n }\n var layerId = null;\n\n // layer\n // key : [layerName]$[contexte]:OGC:[service]\n // ex : \"ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS\"\n\n // service\n // key : [layerName]$[contexte];[service]\n // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode\n\n if (this.layers) {\n var layers = this.layers;\n for (var key in layers) {\n if (layers.hasOwnProperty(key)) {\n var parts = key.split(\"$\");\n if (layerName === parts[0]) {\n if (parts[1]) {\n var servicePartsLayer = parts[1].split(\":\");\n var servicePartsService = parts[1].split(\";\");\n if (servicePartsService[1] === service.toUpperCase()) {\n layerId = key;\n break;\n }\n if (servicePartsLayer[2] === service.toUpperCase()) {\n layerId = key;\n break;\n }\n }\n }\n }\n }\n }\n if (!layerId) {\n return;\n }\n return layerId;\n },\n /**\n * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key.\n * If no key is specified, all layers from configuration are returned.\n *\n * @param {String} apiKey - Access key to Geoportal platform\n * @returns {Object} layers - Object which properties are layers identifiers.\n */\n getLayersConf: function getLayersConf(apiKey) {\n var layers = {};\n var layersIdArray = this.getLayersId(apiKey);\n if (layersIdArray) {\n for (var i = 0; i < layersIdArray.length; i++) {\n var lyrId = layersIdArray[i];\n layers[lyrId] = this.layers[lyrId];\n }\n }\n return layers;\n },\n /**\n * Returns a geoportal layer configuration, given its identifier\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @return {Object} layer - Layer configuration\n */\n getLayerConf: function getLayerConf(layerId) {\n if (!this.layers) {\n return;\n }\n return this.layers[layerId];\n },\n /**\n * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key\n *\n * @param {String} layerName - name of the layer (ex. \"ORTHOIMAGERY.ORTHOPHOTOS\")\n * @param {String} service - name of the service (ex. \"WMS\" ou \"WMTS\")\n * @param {String} [apiKey] - Contract API key\n * @returns {Object} params - params of the service (WMS or WMTS) for the given layer\n * @returns {String} params.url - Url of the service to reach to display the layer\n * @returns {String} params.version - Version of the service\n * @returns {String} params.styles - Default style of the layer\n * @returns {String} params.format - Default format of the layer\n * @returns {String} params.projection - Default projection of the layer\n * @returns {Number} params.minScale - Min scale denominator of the layer\n * @returns {Number} params.maxScale - Max scale denominator of the layer\n * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer\n * @returns {Array} params.legends - Array of legends associated to the layer\n * @returns {Array} params.title - Name of the layer, readable by a human\n * @returns {Array} params.description - Description of the layer\n * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer\n * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer\n * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer\n * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer\n */\n getLayerParams: function getLayerParams(layerName, service) {\n var params = {};\n if ((service === \"WMS\" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) {\n // get the layerId of the layer\n var layerId = this.getLayerId(layerName, service);\n if (layerId) {\n // get the layer Conf Object\n var layerConf = this.getLayerConf(layerId);\n var keys = this.getLayerKey(layerId);\n if (keys.length === 0) {\n return;\n }\n\n // get services params\n for (var i = 0; i < keys.length; i++) {\n // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property\n if (layerConf.serviceParams.serverUrl[keys[i]]) {\n params.url = layerConf.serviceParams.serverUrl[keys[i]];\n }\n }\n var wmsTypeRegex = /\\/v\\//;\n // WMS vector style always empty (not in getCap)\n if (wmsTypeRegex.test(params.url)) {\n params.styles = \" \";\n } else {\n // WMS raster style is defined in getCap\n params.styles = layerConf.styles[0].name;\n }\n params.version = layerConf.serviceParams.version;\n params.format = layerConf.formats[0].name;\n params.projection = layerConf.defaultProjection;\n\n // get layer info and constraints\n params.minScale = layerConf.globalConstraint.minScaleDenominator;\n params.maxScale = layerConf.globalConstraint.maxScaleDenominator;\n params.extent = layerConf.globalConstraint.bbox;\n params.legends = layerConf.legends;\n params.title = layerConf.title;\n params.description = layerConf.description;\n if (service === \"WMS\") {\n params.metadata = layerConf.metadata;\n }\n\n // Informations non disponibles avec les getCap\n // params.metadata = layerConf.getMetadata();\n // params.originators = layerConf.getOriginators();\n // params.quicklookUrl = layerConf.getQuicklookUrl();\n\n // WMTS : get the tileMatrixSetLimits\n if (layerConf.wmtsOptions) {\n params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits;\n var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink;\n if (TMSLink) {\n params.TMSLink = TMSLink;\n var tmsConf = this.getTMSConf(TMSLink);\n // Get matrix origin : Gp.Point = Object{x:Float, y:Float}\n // params.matrixOrigin = tmsConf.getTopLeftCorner();\n params.matrixIds = Object.keys(tmsConf.tileMatrices);\n params.tileMatrices = tmsConf.tileMatrices;\n // by default, pseudo mercator resolutions\n params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf(\"PM\").nativeResolutions;\n }\n }\n }\n }\n return params;\n },\n /**\n * Get the contract key(s) associated to a given layer.\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @return {Array} layerKey - array of key(s) associated to the given layer\n */\n getLayerKey: function getLayerKey(layerId) {\n var layerKey = [];\n if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) {\n var resourcesByKey = this.generalOptions.apiKeys;\n for (var key in resourcesByKey) {\n var resourcesArray = resourcesByKey[key];\n resourcesArray.forEach(function (arrayLayerId) {\n if (arrayLayerId === layerId) {\n layerKey.push(key);\n }\n });\n }\n }\n return layerKey;\n },\n /**\n * Returns an associative array of Tile Matrix Sets configurations.\n *\n * @return {Object} tileMatrixSets - Object which properties are TMS identifiers\n *\n */\n getTileMatrixSets: function getTileMatrixSets() {\n return this.tileMatrixSets;\n },\n /**\n * Returns a Tile Matrix Sets configuration, given its identifier.\n *\n * @param {String} tmsID - Tile Matrix Set identifier (e.g. : \"PM\")\n * @return {Object} tileMatrixSet - Tile Matrix Set configuration\n */\n getTMSConf: function getTMSConf(tmsID) {\n if (!this.tileMatrixSets) {\n return;\n }\n return this.tileMatrixSets[tmsID];\n },\n /**\n * Get global constraints for a given Layer : extent, minScale, maxScale, projection\n *\n * @param {String} layerId - Geoportal layer identifier (e.g. \"GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS\")\n * @returns {Object} params - layer constraints\n * @returns {String} params.projection - default layer projection\n * @returns {Number} params.minScale - layer min scale denominator\n * @returns {Number} params.maxScale - layer max scale denominator\n * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection\n */\n getGlobalConstraints: function getGlobalConstraints(layerId) {\n var params = {};\n if (layerId) {\n // get layer configuration object\n var layerConf = this.getLayerConf(layerId);\n params.projection = layerConf.defaultProjection;\n params.minScale = layerConf.globalConstraint.minScaleDenominator;\n params.maxScale = layerConf.globalConstraint.maxScaleDenominator;\n params.extent = layerConf.globalConstraint.bbox;\n }\n return params;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ConfigInterface);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Db25maWcvQ29uZmlnSW50ZXJmYWNlLmpzPzQyYjQiXSwibmFtZXMiOlsiQ29uZmlnSW50ZXJmYWNlIiwiVHlwZUVycm9yIiwiZ2VuZXJhbE9wdGlvbnMiLCJhcGlLZXlzIiwidGl0bGUiLCJkZWZhdWx0R01MR0ZJU3R5bGUiLCJ0aGVtZSIsIndnczg0UmVzb2x1dGlvbnMiLCJsYXllcnMiLCJ0aWxlTWF0cml4U2V0cyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIiwiaXNLZXlDb25mTG9hZGVkIiwiYXBpS2V5IiwiZ2V0TGF5ZXJzSWQiLCJnZXRMYXllcklkIiwibGF5ZXJOYW1lIiwic2VydmljZSIsImxheWVySWQiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcnRzIiwic3BsaXQiLCJzZXJ2aWNlUGFydHNMYXllciIsInNlcnZpY2VQYXJ0c1NlcnZpY2UiLCJ0b1VwcGVyQ2FzZSIsImdldExheWVyc0NvbmYiLCJsYXllcnNJZEFycmF5IiwiaSIsImxlbmd0aCIsImx5cklkIiwiZ2V0TGF5ZXJDb25mIiwiZ2V0TGF5ZXJQYXJhbXMiLCJwYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwibGF5ZXJDb25mIiwiZ2V0TGF5ZXJLZXkiLCJzZXJ2aWNlUGFyYW1zIiwic2VydmVyVXJsIiwidXJsIiwid21zVHlwZVJlZ2V4IiwidGVzdCIsInN0eWxlcyIsIm5hbWUiLCJ2ZXJzaW9uIiwiZm9ybWF0IiwiZm9ybWF0cyIsInByb2plY3Rpb24iLCJkZWZhdWx0UHJvamVjdGlvbiIsIm1pblNjYWxlIiwiZ2xvYmFsQ29uc3RyYWludCIsIm1pblNjYWxlRGVub21pbmF0b3IiLCJtYXhTY2FsZSIsIm1heFNjYWxlRGVub21pbmF0b3IiLCJleHRlbnQiLCJiYm94IiwibGVnZW5kcyIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJ3bXRzT3B0aW9ucyIsInRpbGVNYXRyaXhTZXRMaW1pdHMiLCJUTVNMaW5rIiwidGlsZU1hdHJpeFNldExpbmsiLCJ0bXNDb25mIiwiZ2V0VE1TQ29uZiIsIm1hdHJpeElkcyIsInRpbGVNYXRyaWNlcyIsIm5hdGl2ZVJlc29sdXRpb25zIiwibGF5ZXJLZXkiLCJyZXNvdXJjZXNCeUtleSIsInJlc291cmNlc0FycmF5IiwiZm9yRWFjaCIsImFycmF5TGF5ZXJJZCIsInB1c2giLCJnZXRUaWxlTWF0cml4U2V0cyIsInRtc0lEIiwiZ2V0R2xvYmFsQ29uc3RyYWludHMiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZUFBZUEsQ0FBQSxFQUFJO0VBQ3hCLElBQUksRUFBRSxJQUFJLFlBQVlBLGVBQWUsQ0FBQyxFQUFFO0lBQ3BDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDZEQUE2RCxDQUFDO0VBQ3RGO0VBRUEsSUFBSSxDQUFDQyxjQUFjLEdBQUc7SUFDbEJDLE9BQU8sRUFBRyxDQUFDLENBQUM7SUFDWkMsS0FBSyxFQUFHLElBQUk7SUFDWkMsa0JBQWtCLEVBQUcsSUFBSTtJQUN6QkMsS0FBSyxFQUFHLElBQUk7SUFDWkMsZ0JBQWdCLEVBQUc7RUFDdkIsQ0FBQztFQUVELElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUVoQixJQUFJLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDNUI7QUFFQVQsZUFBZSxDQUFDVSxTQUFTLEdBQUc7RUFFeEI7QUFDSjtBQUNBO0VBQ0lDLFdBQVcsRUFBR1gsZUFBZTtFQUU3QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSVksZUFBZSxFQUFHLFNBQUFBLGdCQUFVQyxNQUFNLEVBQUU7SUFDaEMsSUFBSSxDQUFDQSxNQUFNLEVBQUU7TUFDVDtJQUNKO0lBQ0EsSUFBSSxJQUFJLENBQUNYLGNBQWMsQ0FBQ0MsT0FBTyxDQUFDVSxNQUFNLENBQUMsRUFBRTtNQUNyQyxPQUFPLElBQUk7SUFDZjtJQUNB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Q0FBQztNQUNOO0lBQ0o7SUFDQSxPQUFPa0QsUUFBUTtFQUNuQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lNLGlCQUFpQixFQUFHLFNBQUFBLGtCQUFBLEVBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUNsRSxjQUFjO0VBQzlCLENBQUM7RUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSXdELFVBQVUsRUFBRyxTQUFBQSxXQUFVVyxLQUFLLEVBQUU7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQ25FLGNBQWMsRUFBRTtNQUN0QjtJQUNKO0lBQ0EsT0FBTyxJQUFJLENBQUNBLGNBQWMsQ0FBQ21FLEtBQUssQ0FBQztFQUNyQyxDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsb0JBQW9CLEVBQUcsU0FBQUEscUJBQVUzRCxPQUFPLEVBQUU7SUFDdEMsSUFBSWUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLElBQUlmLE9BQU8sRUFBRTtNQUNUO01BQ0EsSUFBSWtCLFNBQVMsR0FBRyxJQUFJLENBQUNMLFlBQVksQ0FBQ2IsT0FBTyxDQUFDO01BQzFDZSxNQUFNLENBQUNlLFVBQVUsR0FBR1osU0FBUyxDQUFDYSxpQkFBaUI7TUFDL0NoQixNQUFNLENBQUNpQixRQUFRLEdBQUdkLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNDLG1CQUFtQjtNQUNoRW5CLE1BQU0sQ0FBQ29CLFFBQVEsR0FBR2pCLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNHLG1CQUFtQjtNQUNoRXJCLE1BQU0sQ0FBQ3NCLE1BQU0sR0FBR25CLFNBQVMsQ0FBQ2UsZ0JBQWdCLENBQUNLLElBQUk7SUFDbkQ7SUFFQSxPQUFPdkIsTUFBTTtFQUNqQjtBQUVKLENBQUM7QUFFY2pDLDhFQUFlIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0NvbmZpZy9Db25maWdJbnRlcmZhY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzfmdldENvbmZpZyBHcC5TZXJ2aWNlcy5nZXRDb25maWcgKCl9IGludm9jYXRpb24gd2hlbiBzdWNjZXNzZnVsLiBSZWNlaXZlZCBhcyB0aGUgYXJndW1lbnQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBnZW5lcmFsT3B0aW9ucyAtIEdlbmVyYWwgcHJvcGVydGllcyBmb3IgZGVmYXVsdCBtYXAgY29uZmlndXJhdGlvbiByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZ2VuZXJhbE9wdGlvbnMuYXBpS2V5cyAtIE9iamVjdCB0aGF0IGFzc29jaWF0ZXMgYXBpS2V5IChzKSB3aXRoIGFuIGFycmF5IG9mIHJlc291cmNlcyBJRHMgYXZhaWxhYmxlcyB3aXRoIHRoYXQga2V5LlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGdlbmVyYWxPcHRpb25zLnRpdGxlIC0gVW5kZXJseWluZyB3ZWIgc2VydmljZSBUaXRsZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBnZW5lcmFsT3B0aW9ucy5kZWZhdWx0R01MR0ZJU3R5bGUgLSBYU0wgVVJMIHVzZWQgYnkgZGVmYXVsdCB0byB0cmFuc2xhdGUgYW4gWE1MIEdldEZlYXR1cmVJbmZvIHJlc3BvbnNlIGludG8gYW4gSFRNTCBhcnJheS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBnZW5lcmFsT3B0aW9ucy50aGVtZSAtIGRlZmF1bHQgdGhlbWUgKEZJWE1FIDogZm9yIHdoYXQgPylcbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZsb2F0Pn0gZ2VuZXJhbE9wdGlvbnMud2dzODRSZXNvbHV0aW9ucyAtIGdlb2dyYXBoaWNhbCByZXNvbHV0aW9ucyBBcnJheSBmb3IgZWFjaCBbem9vbSBsZXZlbCBvZiB0aGUgR2VvcG9ydGFsIHBsYXRmb3JtXXtAbGluayBodHRwOi8vYXBpLmlnbi5mci90ZWNoLWRvY3MtanMvd2VibWFzdGVyL2xheWVycy5odG1sI0dlb3BvcnRhbF9yZXNvbHV0aW9uc30gZnJvbSAwIHRvIDIxLiBFeHByZXNzZWQgaW4gZGVncmVlcy9waXhlbC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsYXllcnMgLSBBc3NvY2lhdGl2ZSBhcnJheSBtYXBwaW5nIHJlc291cmNlcyBhdmFpbGFibGVzIElEcyAoa2V5cykgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICh2YWx1ZXMgZ2l2ZW4gYXMge0BsaW5rIEdwLlNlcnZpY2VzLkNvbmZpZy5MYXllcn0pLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbGVNYXRyaXhTZXRzIC0gQXNzb2NpYXRpdmUgQXJyYXkgbWFwcGluZyBUaWxlTWF0cml4U2V0cyBJRHMgKGtleXMpIGF2YWlsYWJsZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICh2YWx1ZXMgZ2l2ZW4gYXMge0BsaW5rIEdwLlNlcnZpY2VzLkNvbmZpZy5UaWxlTWF0cml4U2V0fSkuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdldENvbmZpZ0ludGVyZmFjZVxuICovXG5mdW5jdGlvbiBDb25maWdJbnRlcmZhY2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb25maWdJbnRlcmZhY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDb25maWdJbnRlcmZhY2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmdlbmVyYWxPcHRpb25zID0ge1xuICAgICAgICBhcGlLZXlzIDoge30sXG4gICAgICAgIHRpdGxlIDogbnVsbCxcbiAgICAgICAgZGVmYXVsdEdNTEdGSVN0eWxlIDogbnVsbCxcbiAgICAgICAgdGhlbWUgOiBudWxsLFxuICAgICAgICB3Z3M4NFJlc29sdXRpb25zIDogW11cbiAgICB9O1xuXG4gICAgdGhpcy5sYXllcnMgPSB7fTtcblxuICAgIHRoaXMudGlsZU1hdHJpeFNldHMgPSB7fTtcbn1cblxuQ29uZmlnSW50ZXJmYWNlLnByb3RvdHlwZSA9IHtcblxuICAgIC8qXG4gICAgICogQ29uc3RydWN0b3IgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogQ29uZmlnSW50ZXJmYWNlLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uZmlnIGlzIGxvYWRlZCBmb3IgYSBnaXZlbiBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybVxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBpc0tleUNvbmZMb2FkZWQgLSB0cnVlIGlmIGNvbmZpZyBvZiB0aGUga2V5IGlzIGFscmVhZHkgbG9hZGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBpc0tleUNvbmZMb2FkZWQgOiBmdW5jdGlvbiAoYXBpS2V5KSB7XG4gICAgICAgIGlmICghYXBpS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhbE9wdGlvbnMuYXBpS2V5c1thcGlLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgR2VvcG9ydGFsIGxheWVycyBpZGVudGlmaWVycywgY29ycmVzcG9uZGluZyB0byBhbiBBUEkgY29udHJhY3Qga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFwaUtleSAtIEFjY2VzcyBrZXkgdG8gR2VvcG9ydGFsIHBsYXRmb3JtXG4gICAgICogQHJldHVybnMge0FycmF5fSBhcGlLZXlzIC0gQXJyYXkgb2YgZ2VvcG9ydGFsIGxheWVycyBpZGVudGlmaWVyc1xuICAgICAqL1xuICAgIGdldExheWVyc0lkIDogZnVuY3Rpb24gKGFwaUtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmFsT3B0aW9ucy5hcGlLZXlzW2FwaUtleV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlkIG9mIGEgR2VvcG9ydGFsIGxheWVyIHdpdGggaXRzIG5hbWUgYW5kIGl0cyBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVyTmFtZSAtIG5hbWUgb2YgdGhlIGxheWVyIChleC4gXCJPUlRIT0lNQUdFUlkuT1JUSE9QSE9UT1NcIilcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZSAgIC0gbmFtZSBvZiB0aGUgc2VydmljZSAoZXguIFwiV01TXCIgb3UgXCJXTVRTXCIpXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSWQgb2YgdGhlIGxheWVyIChleC4gXCJPUlRIT0lNQUdFUlkuT1JUSE9QSE9UT1MkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqL1xuICAgIGdldExheWVySWQgOiBmdW5jdGlvbiAobGF5ZXJOYW1lLCBzZXJ2aWNlKSB7XG4gICAgICAgIGlmICghbGF5ZXJOYW1lIHx8ICFzZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxheWVySWQgPSBudWxsO1xuXG4gICAgICAgIC8vIGxheWVyXG4gICAgICAgIC8vIGtleSA6IFtsYXllck5hbWVdJFtjb250ZXh0ZV06T0dDOltzZXJ2aWNlXVxuICAgICAgICAvLyBleCA6IFwiT1JUSE9JTUFHRVJZLk9SVEhPUEhPVE9TJEdFT1BPUlRBSUw6T0dDOldNVFNcIlxuXG4gICAgICAgIC8vIHNlcnZpY2VcbiAgICAgICAgLy8ga2V5IDogW2xheWVyTmFtZV0kW2NvbnRleHRlXTtbc2VydmljZV1cbiAgICAgICAgLy8gZXggOiBQb3NpdGlvbk9mSW50ZXJlc3QkT0dDOk9QRU5MUztSZXZlcnNlR2VvY29kZVxuXG4gICAgICAgIGlmICh0aGlzLmxheWVycykge1xuICAgICAgICAgICAgdmFyIGxheWVycyA9IHRoaXMubGF5ZXJzO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgICAgIGlmIChsYXllcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoXCIkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJOYW1lID09PSBwYXJ0c1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXJ0c0xheWVyID0gcGFydHNbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlUGFydHNTZXJ2aWNlID0gcGFydHNbMV0uc3BsaXQoXCI7XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXJ0c1NlcnZpY2VbMV0gPT09IHNlcnZpY2UudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcklkID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXJ0c0xheWVyWzJdID09PSBzZXJ2aWNlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGF5ZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcklkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIEdlb3BvcnRhbCBsYXllcnMgY29uZmlndXJhdGlvbnMsIGNvcnJlc3BvbmRpbmcgdG8gYW4gQVBJIGNvbnRyYWN0IGtleS5cbiAgICAgKiBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCBhbGwgbGF5ZXJzIGZyb20gY29uZmlndXJhdGlvbiBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm1cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBsYXllcnMgLSBPYmplY3Qgd2hpY2ggcHJvcGVydGllcyBhcmUgbGF5ZXJzIGlkZW50aWZpZXJzLlxuICAgICAqL1xuICAgIGdldExheWVyc0NvbmYgOiBmdW5jdGlvbiAoYXBpS2V5KSB7XG4gICAgICAgIHZhciBsYXllcnMgPSB7fTtcbiAgICAgICAgdmFyIGxheWVyc0lkQXJyYXkgPSB0aGlzLmdldExheWVyc0lkKGFwaUtleSk7XG4gICAgICAgIGlmIChsYXllcnNJZEFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyc0lkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbHlySWQgPSBsYXllcnNJZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIGxheWVyc1tseXJJZF0gPSB0aGlzLmxheWVyc1tseXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGdlb3BvcnRhbCBsYXllciBjb25maWd1cmF0aW9uLCBnaXZlbiBpdHMgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gbGF5ZXIgLSBMYXllciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZ2V0TGF5ZXJDb25mIDogZnVuY3Rpb24gKGxheWVySWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheWVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tsYXllcklkXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBkaXNwbGF5IGEgV01TIG9yIFdNVFMgbGF5ZXIgZ2l2ZW4gaXRzIG5hbWUsIGl0cyBzZXJ2aWNlIGFuZCBpdHMga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbGF5ZXJOYW1lIC0gbmFtZSBvZiB0aGUgbGF5ZXIgKGV4LiBcIk9SVEhPSU1BR0VSWS5PUlRIT1BIT1RPU1wiKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlICAgLSBuYW1lIG9mIHRoZSBzZXJ2aWNlIChleC4gXCJXTVNcIiBvdSBcIldNVFNcIilcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FwaUtleV0gIC0gQ29udHJhY3QgQVBJIGtleVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBhcmFtcyAgLSBwYXJhbXMgb2YgdGhlIHNlcnZpY2UgKFdNUyBvciBXTVRTKSBmb3IgdGhlIGdpdmVuIGxheWVyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLnVybCAgICAgICAgLSBVcmwgb2YgdGhlIHNlcnZpY2UgdG8gcmVhY2ggdG8gZGlzcGxheSB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMudmVyc2lvbiAgICAtIFZlcnNpb24gb2YgdGhlIHNlcnZpY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMuc3R5bGVzICAgICAtIERlZmF1bHQgc3R5bGUgb2YgdGhlIGxheWVyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLmZvcm1hdCAgICAgLSBEZWZhdWx0IGZvcm1hdCBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBwYXJhbXMucHJvamVjdGlvbiAtIERlZmF1bHQgcHJvamVjdGlvbiBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWluU2NhbGUgICAtIE1pbiBzY2FsZSBkZW5vbWluYXRvciBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWF4U2NhbGUgICAtIE1heCBzY2FsZSBkZW5vbWluYXRvciBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7R3AuQkJveH0gcGFyYW1zLmV4dGVudCAgICAtIEV4dGVudCBvZiB0aGUgbGF5ZXIsIGluIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLmxlZ2VuZHMgICAgIC0gQXJyYXkgb2YgbGVnZW5kcyBhc3NvY2lhdGVkIHRvIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLnRpdGxlICAgICAgIC0gTmFtZSBvZiB0aGUgbGF5ZXIsIHJlYWRhYmxlIGJ5IGEgaHVtYW5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHBhcmFtcy5kZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIG9mIHRoZSBsYXllclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHBhcmFtcy5bVE1TTGlua10gICAgICAgICAgLSBJZCBvZiB0aGUgVGlsZSBNYXRyaXggU2V0IChUTVMpLCBpbiB0aGUgY2FzZSBvZiBXTVRTIGxheWVyXG4gICAgICogQHJldHVybnMge0dwLlBvaW50fSBwYXJhbXMuW21hdHJpeE9yaWdpbl0gICAtIE9yaWdpbm9mIHRoZSB0aWxlIG1hdHJpeCAodG9wIGxlZnQgY29ybmVyKSwgaW4gdGhlIGNhc2Ugb2YgV01UUyBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLltuYXRpdmVSZXNvbHV0aW9uc10gLSBBcnJheSB3aXRoIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggbGV2ZWwgb2YgdGhlIHRpbGUgbWF0cml4IHNldCwgaW4gdGhlIGNhc2Ugb2YgV01UUyBsYXllclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gcGFyYW1zLlttYXRyaXhJZHNdICAgICAgICAgLSBBcnJheSB3aXRoIHRoZSBJRCBvZiBlYWNoIGxldmVsIG9mIHRoZSB0aWxlIG1hdHJpeCBzZXQsIGluIHRoZSBjYXNlIG9mIFdNVFMgbGF5ZXJcbiAgICAgKi9cbiAgICBnZXRMYXllclBhcmFtcyA6IGZ1bmN0aW9uIChsYXllck5hbWUsIHNlcnZpY2UpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuXG4gICAgICAgIGlmICgoc2VydmljZSA9PT0gXCJXTVNcIiB8fCBPYmplY3Qua2V5cyh0aGlzLnRpbGVNYXRyaXhTZXRzKS5sZW5ndGggIT09IDApICYmIE9iamVjdC5rZXlzKHRoaXMubGF5ZXJzKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgbGF5ZXJJZCBvZiB0aGUgbGF5ZXJcbiAgICAgICAgICAgIHZhciBsYXllcklkID0gdGhpcy5nZXRMYXllcklkKGxheWVyTmFtZSwgc2VydmljZSk7XG5cbiAgICAgICAgICAgIGlmIChsYXllcklkKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXllciBDb25mIE9iamVjdFxuICAgICAgICAgICAgICAgIHZhciBsYXllckNvbmYgPSB0aGlzLmdldExheWVyQ29uZihsYXllcklkKTtcblxuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRMYXllcktleShsYXllcklkKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGdldCBzZXJ2aWNlcyBwYXJhbXNcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2VydmVyVXJsIGlzIHNhdmVkIGluIEdwLkNvbmZpZyA6IHdpdGggbXVsdGlLZXlzLCB3ZSBoYXZlIHRvIHJldHJpZXZlIHRoZSBrZXkgdXNlZCBpbiB0aGUgc2VydmVyVXJsIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckNvbmYuc2VydmljZVBhcmFtcy5zZXJ2ZXJVcmxba2V5c1tpXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51cmwgPSBsYXllckNvbmYuc2VydmljZVBhcmFtcy5zZXJ2ZXJVcmxba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3bXNUeXBlUmVnZXggPSAvXFwvdlxcLy87XG4gICAgICAgICAgICAgICAgLy8gV01TIHZlY3RvciBzdHlsZSBhbHdheXMgZW1wdHkgKG5vdCBpbiBnZXRDYXApXG4gICAgICAgICAgICAgICAgaWYgKHdtc1R5cGVSZWdleC50ZXN0KHBhcmFtcy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdHlsZXMgPSBcIiBcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXTVMgcmFzdGVyIHN0eWxlIGlzIGRlZmluZWQgaW4gZ2V0Q2FwXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdHlsZXMgPSBsYXllckNvbmYuc3R5bGVzWzBdLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyYW1zLnZlcnNpb24gPSBsYXllckNvbmYuc2VydmljZVBhcmFtcy52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5mb3JtYXQgPSBsYXllckNvbmYuZm9ybWF0c1swXS5uYW1lO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5wcm9qZWN0aW9uID0gbGF5ZXJDb25mLmRlZmF1bHRQcm9qZWN0aW9uO1xuXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGxheWVyIGluZm8gYW5kIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgcGFyYW1zLm1pblNjYWxlID0gbGF5ZXJDb25mLmdsb2JhbENvbnN0cmFpbnQubWluU2NhbGVEZW5vbWluYXRvcjtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWF4U2NhbGUgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5tYXhTY2FsZURlbm9taW5hdG9yO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5leHRlbnQgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5iYm94O1xuICAgICAgICAgICAgICAgIHBhcmFtcy5sZWdlbmRzID0gbGF5ZXJDb25mLmxlZ2VuZHM7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnRpdGxlID0gbGF5ZXJDb25mLnRpdGxlO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5kZXNjcmlwdGlvbiA9IGxheWVyQ29uZi5kZXNjcmlwdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09PSBcIldNU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5tZXRhZGF0YSA9IGxheWVyQ29uZi5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbnMgIG5vbiBkaXNwb25pYmxlcyBhdmVjIGxlcyBnZXRDYXBcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMubWV0YWRhdGEgPSBsYXllckNvbmYuZ2V0TWV0YWRhdGEoKTtcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMub3JpZ2luYXRvcnMgPSBsYXllckNvbmYuZ2V0T3JpZ2luYXRvcnMoKTtcbiAgICAgICAgICAgICAgICAvLyBwYXJhbXMucXVpY2tsb29rVXJsID0gbGF5ZXJDb25mLmdldFF1aWNrbG9va1VybCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gV01UUyA6IGdldCB0aGUgdGlsZU1hdHJpeFNldExpbWl0c1xuICAgICAgICAgICAgICAgIGlmIChsYXllckNvbmYud210c09wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRpbGVNYXRyaXhTZXRMaW1pdHMgPSBsYXllckNvbmYud210c09wdGlvbnMudGlsZU1hdHJpeFNldExpbWl0cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIFRNU0xpbmsgPSBsYXllckNvbmYud210c09wdGlvbnMudGlsZU1hdHJpeFNldExpbms7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUTVNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuVE1TTGluayA9IFRNU0xpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1zQ29uZiA9IHRoaXMuZ2V0VE1TQ29uZihUTVNMaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBtYXRyaXggb3JpZ2luIDogR3AuUG9pbnQgPSBPYmplY3R7eDpGbG9hdCwgeTpGbG9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtcy5tYXRyaXhPcmlnaW4gPSB0bXNDb25mLmdldFRvcExlZnRDb3JuZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5tYXRyaXhJZHMgPSBPYmplY3Qua2V5cyh0bXNDb25mLnRpbGVNYXRyaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGlsZU1hdHJpY2VzID0gdG1zQ29uZi50aWxlTWF0cmljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBwc2V1ZG8gbWVyY2F0b3IgcmVzb2x1dGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uYXRpdmVSZXNvbHV0aW9ucyA9IHRtc0NvbmYubmF0aXZlUmVzb2x1dGlvbnMgfHwgdGhpcy5nZXRUTVNDb25mKFwiUE1cIikubmF0aXZlUmVzb2x1dGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb250cmFjdCBrZXkocykgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm4ge0FycmF5fSBsYXllcktleSAtIGFycmF5IG9mIGtleShzKSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBsYXllclxuICAgICAqL1xuICAgIGdldExheWVyS2V5IDogZnVuY3Rpb24gKGxheWVySWQpIHtcbiAgICAgICAgdmFyIGxheWVyS2V5ID0gW107XG4gICAgICAgIGlmICh0aGlzLmdlbmVyYWxPcHRpb25zICYmIHRoaXMuZ2VuZXJhbE9wdGlvbnMuYXBpS2V5cyAmJiBPYmplY3Qua2V5cyh0aGlzLmdlbmVyYWxPcHRpb25zLmFwaUtleXMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIHJlc291cmNlc0J5S2V5ID0gdGhpcy5nZW5lcmFsT3B0aW9ucy5hcGlLZXlzO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHJlc291cmNlc0J5S2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlc0FycmF5ID0gcmVzb3VyY2VzQnlLZXlba2V5XTtcbiAgICAgICAgICAgICAgICByZXNvdXJjZXNBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUxheWVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5TGF5ZXJJZCA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJLZXkucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVyS2V5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIFRpbGUgTWF0cml4IFNldHMgY29uZmlndXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRpbGVNYXRyaXhTZXRzIC0gT2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgYXJlIFRNUyBpZGVudGlmaWVyc1xuICAgICAqXG4gICAgICovXG4gICAgZ2V0VGlsZU1hdHJpeFNldHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVNYXRyaXhTZXRzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVGlsZSBNYXRyaXggU2V0cyBjb25maWd1cmF0aW9uLCBnaXZlbiBpdHMgaWRlbnRpZmllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0bXNJRCAtIFRpbGUgTWF0cml4IFNldCBpZGVudGlmaWVyIChlLmcuIDogXCJQTVwiKVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGlsZU1hdHJpeFNldCAtIFRpbGUgTWF0cml4IFNldCBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZ2V0VE1TQ29uZiA6IGZ1bmN0aW9uICh0bXNJRCkge1xuICAgICAgICBpZiAoIXRoaXMudGlsZU1hdHJpeFNldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50aWxlTWF0cml4U2V0c1t0bXNJRF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBnbG9iYWwgY29uc3RyYWludHMgZm9yIGEgZ2l2ZW4gTGF5ZXIgOiBleHRlbnQsIG1pblNjYWxlLCBtYXhTY2FsZSwgcHJvamVjdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxheWVySWQgLSBHZW9wb3J0YWwgbGF5ZXIgaWRlbnRpZmllciAoZS5nLiBcIkdFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMkR0VPUE9SVEFJTDpPR0M6V01UU1wiKVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBhcmFtcyAtIGxheWVyIGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcGFyYW1zLnByb2plY3Rpb24gLSBkZWZhdWx0IGxheWVyIHByb2plY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBwYXJhbXMubWluU2NhbGUgICAtIGxheWVyIG1pbiBzY2FsZSBkZW5vbWluYXRvclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHBhcmFtcy5tYXhTY2FsZSAgIC0gbGF5ZXIgbWF4IHNjYWxlIGRlbm9taW5hdG9yXG4gICAgICogQHJldHVybnMge0dwLkJCb3h9IHBhcmFtcy5leHRlbnQgICAgLSBsYXllciBleHRlbnQgZXhwcmVzc2VkIGluIHRoZSBsYXllciBwcm9qZWN0aW9uXG4gICAgICovXG4gICAgZ2V0R2xvYmFsQ29uc3RyYWludHMgOiBmdW5jdGlvbiAobGF5ZXJJZCkge1xuICAgICAgICB2YXIgcGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKGxheWVySWQpIHtcbiAgICAgICAgICAgIC8vIGdldCBsYXllciBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgICAgdmFyIGxheWVyQ29uZiA9IHRoaXMuZ2V0TGF5ZXJDb25mKGxheWVySWQpO1xuICAgICAgICAgICAgcGFyYW1zLnByb2plY3Rpb24gPSBsYXllckNvbmYuZGVmYXVsdFByb2plY3Rpb247XG4gICAgICAgICAgICBwYXJhbXMubWluU2NhbGUgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5taW5TY2FsZURlbm9taW5hdG9yO1xuICAgICAgICAgICAgcGFyYW1zLm1heFNjYWxlID0gbGF5ZXJDb25mLmdsb2JhbENvbnN0cmFpbnQubWF4U2NhbGVEZW5vbWluYXRvcjtcbiAgICAgICAgICAgIHBhcmFtcy5leHRlbnQgPSBsYXllckNvbmYuZ2xvYmFsQ29uc3RyYWludC5iYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZ0ludGVyZmFjZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Config/ConfigInterface.js\n"); + +/***/ }), + +/***/ "./src/Services/DefaultUrlService.js": +/*!*******************************************!*\ + !*** ./src/Services/DefaultUrlService.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n// cette classe contient les URLs par defaut des services.\n// DefaultUrlService.Alti.url(key)[elevation-json]\n// DefaultUrlService.Alti.url(key)[elevation-xml]\n// DefaultUrlService.Alti.url(key)[profil-json]\n// DefaultUrlService.Alti.url(key)[profil-xml]\n// DefaultUrlService.ProcessIsoCurve.url(key)\n// DefaultUrlService.AutoComplete.url(key)\n// DefaultUrlService.ReverseGeocode.url(key)\n// DefaultUrlService.Geocode.url(key)\n// DefaultUrlService.Route.url(key)\n\n// Example :\n//\n// DefaultUrlService.Alti.url('alti')[elevation-json]\n// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json\n//\n// DefaultUrlService.Alti.url('calcul')\n// output {Object|String}\n// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json\n// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml\n// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json\n// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml\n//\n// ssl by default.\n//\n// Force to not do ssl :\n// DefaultUrlService.ssl = false;\n//\n// DefaultUrlService.AutoComplete.url('calcul')\n// output {Object|String}\n// -> https://wxs.ign.fr/calcul/ols/apis/completion\n\n// constantes internes\nvar HOSTNAME = \"wxs.ign.fr\";\n\n/**\n * Default Geoportal web services URLs access.\n *\n * @namespace\n * @alias Gp.Services.DefaultUrl\n */\nvar DefaultUrlService = {\n /** if set true, require the use of https protocol */\n ssl: true,\n /**\n * base url of services (ssl protocol management)\n * @param {String} path - path\n * @returns {String} url\n */\n url: function url(path) {\n // comportement par défaut => https\n // sinon, il est fixé par l'option 'ssl' (false => http)\n var _protocol;\n if (DefaultUrlService.ssl === false) {\n _protocol = \"http://\";\n } else {\n _protocol = \"https://\";\n }\n return _protocol + HOSTNAME + path;\n },\n /**\n * base new-url of services (ssl protocol management)\n * @param {String} path - path\n * @returns {String} url\n */\n newUrl: function newUrl(path, hostname) {\n // comportement par défaut => https\n // sinon, il est fixé par l'option 'ssl' (false => http)\n var _protocol;\n if (DefaultUrlService.ssl === false) {\n _protocol = \"http://\";\n } else {\n _protocol = \"https://\";\n }\n return _protocol + hostname + path;\n },\n /**\n * Elevation web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols (\"elevation-json\", \"elevation-xml\", \"profil-json\" or \"profil-xml\").\n */\n Alti: {\n new_key: {\n // rest\n \"elevation-json\": \"/altimetrie/1.0/calcul/alti/rest/elevation.json\",\n \"elevation-xml\": \"/altimetrie/1.0/calcul/alti/rest/elevation.xml\",\n \"profil-json\": \"/altimetrie/1.0/calcul/alti/rest/elevationLine.json\",\n \"profil-xml\": \"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml\"\n },\n _key: {\n // rest\n \"elevation-json\": \"/calcul/alti/rest/elevation.json\",\n \"elevation-xml\": \"/calcul/alti/rest/elevation.xml\",\n \"profil-json\": \"/calcul/alti/rest/elevationLine.json\",\n \"profil-xml\": \"/calcul/alti/rest/elevationLine.xml\",\n // other\n wps: \"/alti/wps\"\n },\n /**\n * newurl from geoplateforme service\n * @param {String} key - key\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return {\n // rest\n \"elevation-json\": DefaultUrlService.url(this._key[\"elevation-json\"]),\n \"elevation-xml\": DefaultUrlService.url(this._key[\"elevation-xml\"]),\n \"profil-json\": DefaultUrlService.url(this._key[\"profil-json\"]),\n \"profil-xml\": DefaultUrlService.url(this._key[\"profil-xml\"])\n };\n }\n },\n /**\n * IsoCurve web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols (\"iso-json\" or \"iso-xml\").\n */\n ProcessIsoCurve: {\n new_key: \"/itineraire/isochrone\",\n _key: \"/calcul/geoportail/isochrone/rest/1.0.0/isochrone\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Config web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter.\n */\n Config: {\n _key: \"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/\",\n /**\n * url\n * @param {String} key - key\n * @returns {String} url\n */\n url: function url(key) {\n // key must be an array of one or several keys\n if (!Array.isArray(key)) {\n key = key.split(\",\");\n }\n // not homogeneous with others geoportal services URLs\n var url = [];\n for (var i = 0; i < key.length; i++) {\n url[i] = this._key + key[i] + \"Config.json\";\n }\n return url;\n }\n },\n /**\n * Autocompletion web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n AutoComplete: {\n new_key: \"/geocodage/completion\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/completion\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_AUTOCOMPLETE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url(key) {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Reverse geocoding web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n ReverseGeocode: {\n new_key: \"/geocodage/reverse\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/reverse\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_REVERSE_GEOCODE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Geocoding web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String.\n */\n Geocode: {\n new_key: \"/geocodage/search\",\n _key: \"/calcul/geoportail/geocodage/rest/0.1/search\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {\n var NEW_GEOCODE_HOSTNAME = \"data.geopf.fr\";\n return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME);\n },\n /**\n * url\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n },\n /**\n * Routing web service access\n *\n * @member {Object}\n * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols.\n */\n Route: {\n new_key: \"/itineraire/route\",\n _key: \"/calcul/geoportail/itineraire/rest/1.0.0/route\",\n /**\n * url from geoplateforme service\n * @returns {String} url\n */\n newUrl: function newUrl() {},\n /**\n * url from wxs service\n * @returns {String} url\n */\n url: function url() {\n return DefaultUrlService.url(this._key);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (DefaultUrlService);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9EZWZhdWx0VXJsU2VydmljZS5qcz8zYTBkIl0sIm5hbWVzIjpbIkhPU1ROQU1FIiwiRGVmYXVsdFVybFNlcnZpY2UiLCJzc2wiLCJ1cmwiLCJwYXRoIiwiX3Byb3RvY29sIiwibmV3VXJsIiwiaG9zdG5hbWUiLCJBbHRpIiwibmV3X2tleSIsIl9rZXkiLCJ3cHMiLCJQcm9jZXNzSXNvQ3VydmUiLCJDb25maWciLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJBdXRvQ29tcGxldGUiLCJORVdfQVVUT0NPTVBMRVRFX0hPU1ROQU1FIiwiUmV2ZXJzZUdlb2NvZGUiLCJORVdfUkVWRVJTRV9HRU9DT0RFX0hPU1ROQU1FIiwiR2VvY29kZSIsIk5FV19HRU9DT0RFX0hPU1ROQU1FIiwiUm91dGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUlBLFFBQVEsR0FBRyxZQUFZOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQyxpQkFBaUIsR0FBRztFQUVwQjtFQUNBQyxHQUFHLEVBQUcsSUFBSTtFQUVWO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsR0FBRyxFQUFHLFNBQUFBLElBQVVDLElBQUksRUFBRTtJQUNsQjtJQUNBO0lBQ0EsSUFBSUMsU0FBUztJQUNiLElBQUlKLGlCQUFpQixDQUFDQyxHQUFHLEtBQUssS0FBSyxFQUFFO01BQ2pDRyxTQUFTLEdBQUcsU0FBUztJQUN6QixDQUFDLE1BQU07TUFDSEEsU0FBUyxHQUFHLFVBQVU7SUFDMUI7SUFFQSxPQUFPQSxT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ckQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUosTUFBTSxFQUFHLFNBQUFBLE9BQUEsRUFBWTtNQUNqQixJQUFJbUIsb0JBQW9CLEdBQUcsZUFBZTtNQUUxQyxPQUFPeEIsaUJBQWlCLENBQUNLLE1BQU0sQ0FBQyxJQUFJLENBQUNHLE9BQU8sRUFBRWdCLG9CQUFvQixDQUFDO0lBQ3ZFLENBQUM7SUFFRDtBQUNSO0FBQ0E7QUFDQTtJQUNRdEIsR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU9GLGlCQUFpQixDQUFDRSxHQUFHLENBQUMsSUFBSSxDQUFDTyxJQUFJLENBQUM7SUFDM0M7RUFDSixDQUFDO0VBQ0Q7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lnQixLQUFLLEVBQUc7SUFDSmpCLE9BQU8sRUFBRyxtQkFBbUI7SUFFN0JDLElBQUksRUFBRyxnREFBZ0Q7SUFFdkQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUosTUFBTSxFQUFHLFNBQUFBLE9BQUEsRUFBWSxDQUNyQixDQUFDO0lBRUQ7QUFDUjtBQUNBO0FBQ0E7SUFDUUgsR0FBRyxFQUFHLFNBQUFBLElBQUEsRUFBWTtNQUNkLE9BQU9GLGlCQUFpQixDQUFDRSxHQUFHLENBQUMsSUFBSSxDQUFDTyxJQUFJLENBQUM7SUFDM0M7RUFDSjtBQUNKLENBQUM7QUFFY1QsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0RlZmF1bHRVcmxTZXJ2aWNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2V0dGUgY2xhc3NlIGNvbnRpZW50IGxlcyBVUkxzIHBhciBkZWZhdXQgZGVzIHNlcnZpY2VzLlxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKGtleSlbZWxldmF0aW9uLWpzb25dXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuQWx0aS51cmwoa2V5KVtlbGV2YXRpb24teG1sXVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKGtleSlbcHJvZmlsLWpzb25dXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuQWx0aS51cmwoa2V5KVtwcm9maWwteG1sXVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlByb2Nlc3NJc29DdXJ2ZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlJldmVyc2VHZW9jb2RlLnVybChrZXkpXG4vLyAgRGVmYXVsdFVybFNlcnZpY2UuR2VvY29kZS51cmwoa2V5KVxuLy8gIERlZmF1bHRVcmxTZXJ2aWNlLlJvdXRlLnVybChrZXkpXG5cbi8vIEV4YW1wbGUgOlxuLy9cbi8vIERlZmF1bHRVcmxTZXJ2aWNlLkFsdGkudXJsKCdhbHRpJylbZWxldmF0aW9uLWpzb25dXG4vLyAgb3V0cHV0IHtTdHJpbmd9IC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLmpzb25cbi8vXG4vLyBEZWZhdWx0VXJsU2VydmljZS5BbHRpLnVybCgnY2FsY3VsJylcbi8vIG91dHB1dCB7T2JqZWN0fFN0cmluZ31cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLmpzb25cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFxuLy8gLT4gaHR0cDovL3d4cy5pZ24uZnIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cbi8vIC0+IGh0dHA6Ly93eHMuaWduLmZyL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uTGluZS54bWxcbi8vXG4vLyBzc2wgYnkgZGVmYXVsdC5cbi8vXG4vLyBGb3JjZSB0byBub3QgZG8gc3NsIDpcbi8vIERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9IGZhbHNlO1xuLy9cbi8vIERlZmF1bHRVcmxTZXJ2aWNlLkF1dG9Db21wbGV0ZS51cmwoJ2NhbGN1bCcpXG4vLyBvdXRwdXQge09iamVjdHxTdHJpbmd9XG4vLyAtPiBodHRwczovL3d4cy5pZ24uZnIvY2FsY3VsL29scy9hcGlzL2NvbXBsZXRpb25cblxuLy8gY29uc3RhbnRlcyBpbnRlcm5lc1xudmFyIEhPU1ROQU1FID0gXCJ3eHMuaWduLmZyXCI7XG5cbi8qKlxuICogRGVmYXVsdCBHZW9wb3J0YWwgd2ViIHNlcnZpY2VzIFVSTHMgYWNjZXNzLlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5EZWZhdWx0VXJsXG4gKi9cbnZhciBEZWZhdWx0VXJsU2VydmljZSA9IHtcblxuICAgIC8qKiBpZiBzZXQgdHJ1ZSwgcmVxdWlyZSB0aGUgdXNlIG9mIGh0dHBzIHByb3RvY29sICovXG4gICAgc3NsIDogdHJ1ZSxcblxuICAgIC8qKlxuICAgICogYmFzZSB1cmwgb2Ygc2VydmljZXMgKHNzbCBwcm90b2NvbCBtYW5hZ2VtZW50KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggLSBwYXRoXG4gICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAqL1xuICAgIHVybCA6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIC8vIGNvbXBvcnRlbWVudCBwYXIgZMOpZmF1dCA9PiBodHRwc1xuICAgICAgICAvLyBzaW5vbiwgaWwgZXN0IGZpeMOpIHBhciBsJ29wdGlvbiAnc3NsJyAoZmFsc2UgPT4gaHR0cClcbiAgICAgICAgdmFyIF9wcm90b2NvbDtcbiAgICAgICAgaWYgKERlZmF1bHRVcmxTZXJ2aWNlLnNzbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIF9wcm90b2NvbCA9IFwiaHR0cDovL1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3Byb3RvY29sID0gXCJodHRwczovL1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9wcm90b2NvbCArIEhPU1ROQU1FICsgcGF0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgKiBiYXNlIG5ldy11cmwgb2Ygc2VydmljZXMgKHNzbCBwcm90b2NvbCBtYW5hZ2VtZW50KVxuICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggLSBwYXRoXG4gICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAqL1xuICAgIG5ld1VybCA6IGZ1bmN0aW9uIChwYXRoLCBob3N0bmFtZSkge1xuICAgICAgICAvLyBjb21wb3J0ZW1lbnQgcGFyIGTDqWZhdXQgPT4gaHR0cHNcbiAgICAgICAgLy8gc2lub24sIGlsIGVzdCBmaXjDqSBwYXIgbCdvcHRpb24gJ3NzbCcgKGZhbHNlID0+IGh0dHApXG4gICAgICAgIHZhciBfcHJvdG9jb2w7XG4gICAgICAgIGlmIChEZWZhdWx0VXJsU2VydmljZS5zc2wgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBfcHJvdG9jb2wgPSBcImh0dHA6Ly9cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9wcm90b2NvbCA9IFwiaHR0cHM6Ly9cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcHJvdG9jb2wgKyBob3N0bmFtZSArIHBhdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVsZXZhdGlvbiB3ZWIgc2VydmljZSBhY2Nlc3NcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cmwgKGtleSkgLSBSZXR1cm5zIGVsZXZhdGlvbiBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBqYXZhc2NyaXB0IG9iamVjdCB3aXRoIGRpZmZlcmVudCB1cmxzIGdpdmVuIHVzZWQgcHJvdG9jb2xzIChcImVsZXZhdGlvbi1qc29uXCIsIFwiZWxldmF0aW9uLXhtbFwiLCBcInByb2ZpbC1qc29uXCIgb3IgXCJwcm9maWwteG1sXCIpLlxuICAgICAqL1xuICAgIEFsdGkgOiB7XG4gICAgICAgIG5ld19rZXkgOiB7XG4gICAgICAgICAgICAvLyByZXN0XG4gICAgICAgICAgICBcImVsZXZhdGlvbi1qc29uXCIgOiBcIi9hbHRpbWV0cmllLzEuMC9jYWxjdWwvYWx0aS9yZXN0L2VsZXZhdGlvbi5qc29uXCIsXG4gICAgICAgICAgICBcImVsZXZhdGlvbi14bWxcIiA6IFwiL2FsdGltZXRyaWUvMS4wL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFwiLFxuICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogXCIvYWx0aW1ldHJpZS8xLjAvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cIixcbiAgICAgICAgICAgIFwicHJvZmlsLXhtbFwiIDogXCIvYWx0aW1ldHJpZS8xLjAvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLnhtbFwiXG4gICAgICAgIH0sXG4gICAgICAgIF9rZXkgOiB7XG4gICAgICAgICAgICAvLyByZXN0XG4gICAgICAgICAgICBcImVsZXZhdGlvbi1qc29uXCIgOiBcIi9jYWxjdWwvYWx0aS9yZXN0L2VsZXZhdGlvbi5qc29uXCIsXG4gICAgICAgICAgICBcImVsZXZhdGlvbi14bWxcIiA6IFwiL2NhbGN1bC9hbHRpL3Jlc3QvZWxldmF0aW9uLnhtbFwiLFxuICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogXCIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLmpzb25cIixcbiAgICAgICAgICAgIFwicHJvZmlsLXhtbFwiIDogXCIvY2FsY3VsL2FsdGkvcmVzdC9lbGV2YXRpb25MaW5lLnhtbFwiLFxuICAgICAgICAgICAgLy8gb3RoZXJcbiAgICAgICAgICAgIHdwcyA6IFwiL2FsdGkvd3BzXCJcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICogbmV3dXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtIGtleVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIHd4cyBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLy8gcmVzdFxuICAgICAgICAgICAgICAgIFwiZWxldmF0aW9uLWpzb25cIiA6IERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXlbXCJlbGV2YXRpb24tanNvblwiXSksXG4gICAgICAgICAgICAgICAgXCJlbGV2YXRpb24teG1sXCIgOiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5W1wiZWxldmF0aW9uLXhtbFwiXSksXG4gICAgICAgICAgICAgICAgXCJwcm9maWwtanNvblwiIDogRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleVtcInByb2ZpbC1qc29uXCJdKSxcbiAgICAgICAgICAgICAgICBcInByb2ZpbC14bWxcIiA6IERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXlbXCJwcm9maWwteG1sXCJdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogSXNvQ3VydmUgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyBpc29jdXJ2ZSBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBqYXZhc2NyaXB0IG9iamVjdCB3aXRoIGRpZmZlcmVudCB1cmxzIGdpdmVuIHVzZWQgcHJvdG9jb2xzIChcImlzby1qc29uXCIgb3IgXCJpc28teG1sXCIpLlxuICAgICAqL1xuICAgIFByb2Nlc3NJc29DdXJ2ZSA6IHtcblxuICAgICAgICBuZXdfa2V5IDogXCIvaXRpbmVyYWlyZS9pc29jaHJvbmVcIixcblxuICAgICAgICBfa2V5IDogXCIvY2FsY3VsL2dlb3BvcnRhaWwvaXNvY2hyb25lL3Jlc3QvMS4wLjAvaXNvY2hyb25lXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIG5ld1VybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiB1cmwgZnJvbSB3eHMgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICB1cmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENvbmZpZyB3ZWIgc2VydmljZSBhY2Nlc3NcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cmwgKGtleSkgLSBSZXR1cm5zIGNvbmZpZyBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgQ29uZmlnIDoge1xuICAgICAgICBfa2V5IDogXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSUdORi9nZW9wb3J0YWwtY29uZmlndXJhdGlvbi9uZXctdXJsL2Rpc3QvXCIsXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybFxuICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLSBrZXlcbiAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAgICAgKi9cbiAgICAgICAgdXJsIDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8ga2V5IG11c3QgYmUgYW4gYXJyYXkgb2Ygb25lIG9yIHNldmVyYWwga2V5c1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm90IGhvbW9nZW5lb3VzIHdpdGggb3RoZXJzIGdlb3BvcnRhbCBzZXJ2aWNlcyBVUkxzXG4gICAgICAgICAgICB2YXIgdXJsID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHVybFtpXSA9IHRoaXMuX2tleSArIGtleVtpXSArIFwiQ29uZmlnLmpzb25cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEF1dG9jb21wbGV0aW9uIHdlYiBzZXJ2aWNlIGFjY2Vzc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVybCAoa2V5KSAtIFJldHVybnMgYXV0b2NvbXBsZXRlIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIFN0cmluZy5cbiAgICAgKi9cbiAgICBBdXRvQ29tcGxldGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9nZW9jb2RhZ2UvY29tcGxldGlvblwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvY29tcGxldGlvblwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgTkVXX0FVVE9DT01QTEVURV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX0FVVE9DT01QTEVURV9IT1NUTkFNRSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZSBnZW9jb2Rpbmcgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyByZXZlcnNlIGdlb2NvZGluZyBzZXJ2aWNlIGRlZmF1bHQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZ2VvcG9ydGFsIGFjY2VzcyBrZXkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuIFRoZSByZXN1bHQgaXMgYSBTdHJpbmcuXG4gICAgICovXG4gICAgUmV2ZXJzZUdlb2NvZGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9nZW9jb2RhZ2UvcmV2ZXJzZVwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvcmV2ZXJzZVwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgTkVXX1JFVkVSU0VfR0VPQ09ERV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX1JFVkVSU0VfR0VPQ09ERV9IT1NUTkFNRSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIHVybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0VXJsU2VydmljZS51cmwodGhpcy5fa2V5KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2VvY29kaW5nIHdlYiBzZXJ2aWNlIGFjY2Vzc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVybCAoa2V5KSAtIFJldHVybnMgZ2VvY29kaW5nIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIFN0cmluZy5cbiAgICAgKi9cbiAgICBHZW9jb2RlIDoge1xuICAgICAgICBuZXdfa2V5IDogXCIvZ2VvY29kYWdlL3NlYXJjaFwiLFxuXG4gICAgICAgIF9rZXkgOiBcIi9jYWxjdWwvZ2VvcG9ydGFpbC9nZW9jb2RhZ2UvcmVzdC8wLjEvc2VhcmNoXCIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gZ2VvcGxhdGVmb3JtZSBzZXJ2aWNlXG4gICAgICAgICogQHJldHVybnMge1N0cmluZ30gdXJsXG4gICAgICAgICovXG4gICAgICAgIG5ld1VybCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBORVdfR0VPQ09ERV9IT1NUTkFNRSA9IFwiZGF0YS5nZW9wZi5mclwiO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UubmV3VXJsKHRoaXMubmV3X2tleSwgTkVXX0dFT0NPREVfSE9TVE5BTUUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybFxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICB1cmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdFVybFNlcnZpY2UudXJsKHRoaXMuX2tleSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgd2ViIHNlcnZpY2UgYWNjZXNzXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXJsIChrZXkpIC0gUmV0dXJucyByb3V0aW5nIHNlcnZpY2UgZGVmYXVsdCB1cmxzIHdpdGggb3Igd2l0aG91dCBnZW9wb3J0YWwgYWNjZXNzIGtleSBnaXZlbiBhcyBhIHBhcmFtZXRlci4gVGhlIHJlc3VsdCBpcyBhIGphdmFzY3JpcHQgb2JqZWN0IHdpdGggZGlmZmVyZW50IHVybHMgZ2l2ZW4gdXNlZCBwcm90b2NvbHMuXG4gICAgICovXG4gICAgUm91dGUgOiB7XG4gICAgICAgIG5ld19rZXkgOiBcIi9pdGluZXJhaXJlL3JvdXRlXCIsXG5cbiAgICAgICAgX2tleSA6IFwiL2NhbGN1bC9nZW9wb3J0YWlsL2l0aW5lcmFpcmUvcmVzdC8xLjAuMC9yb3V0ZVwiLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIHVybCBmcm9tIGdlb3BsYXRlZm9ybWUgc2VydmljZVxuICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVybFxuICAgICAgICAqL1xuICAgICAgICBuZXdVcmwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogdXJsIGZyb20gd3hzIHNlcnZpY2VcbiAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1cmxcbiAgICAgICAgKi9cbiAgICAgICAgdXJsIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRVcmxTZXJ2aWNlLnVybCh0aGlzLl9rZXkpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRGVmYXVsdFVybFNlcnZpY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/DefaultUrlService.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Formats/GeocodeResponseParser.js": +/*!***************************************************************!*\ + !*** ./src/Services/Geocode/Formats/GeocodeResponseParser.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Response/model/GeocodeResponse */ \"./src/Services/Geocode/Response/model/GeocodeResponse.js\");\n/* harmony import */ var _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Response/model/GeocodedLocation */ \"./src/Services/Geocode/Response/model/GeocodedLocation.js\");\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\n\n\n/**\n * Fonction retournant un objet contenant des clés de lecture (readers)\n * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail\n * afin de récupérer les résultats retournés.\n * @module GeocodeResponseParser\n * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser\n * @private\n */\n\n/**\n * @classdesc\n *\n * Classe permettant de parser une réponse GeoJSON\n *\n * @constructor\n * @alias Gp.Formats.GeocodeResponseParser\n *\n * @private\n */\nfunction GeocodeResponseParser() {\n if (!(this instanceof GeocodeResponseParser)) {\n throw new TypeError(\"GeocodeResponseParser constructor cannot be called as a function.\");\n }\n}\nGeocodeResponseParser.prototype = {\n /**\n * @lends module:GeocodeResponseParser\n */\n\n /*\n * Constructeur (alias)\n */\n constructor: GeocodeResponseParser,\n /**\n * Méthode permettant de lancer la lecture d'une réponse GeoJSON,\n *\n * @param {String} json - réponse au format GeoJSON\n * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON,\n * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception.\n */\n parse: function parse(json) {\n var geocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n var obj = JSON.parse(json);\n if (obj.type === \"FeatureCollection\") {\n for (var i = 0; i < obj.features.length; ++i) {\n _parseFeature(obj.features[i], geocodeResponse);\n }\n } else if (obj.type === \"Feature\") {\n _parseFeature(obj, geocodeResponse);\n } else if (obj.type === \"SERVICE_ERROR\") {\n return _parseError(obj);\n } else {\n var mess = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", obj.type);\n throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"]({\n message: mess,\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"].TYPE_UNKERR,\n status: 200\n });\n }\n return geocodeResponse;\n }\n};\n\n/**\n * Méthode permettant de parser un feature\n *\n * @private\n *\n * @param {Object} feature\n * @param {Object} geocodeResponse\n *\n * @memberof GeocodeResponseParser\n * @return {Object} objet GeocodedLocation\n */\nfunction _parseFeature(feature, geocodeResponse) {\n var location = new _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n if (feature.geometry && feature.geometry.type === \"Point\") {\n location.position = {\n lon: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1]\n };\n }\n if (feature.properties) {\n for (var prop in feature.properties) {\n if (prop === \"_score\") {\n location.accuracy = feature.properties[prop];\n } else if (prop === \"_type\") {\n if (feature.properties[prop] === \"address\") {\n location.type = \"StreetAddress\";\n } else if (feature.properties[prop] === \"poi\") {\n location.type = \"PositionOfInterest\";\n } else if (feature.properties[prop] === \"parcel\") {\n location.type = \"CadastralParcel\";\n }\n } else {\n location.placeAttributes[prop] = feature.properties[prop];\n }\n }\n if (feature.properties._type === \"address\") {\n location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? \"street number\" : \"street\";\n }\n }\n geocodeResponse.locations.push(location);\n}\n\n/**\n * Méthode permettant de parser une erreur\n *\n * @private\n *\n * @param {Object} error\n *\n * @memberof GeocodeResponseParser\n * @return {Object}\n */\nfunction _parseError(error) {\n return {\n exceptionReport: error\n };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeResponseParser);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL0Zvcm1hdHMvR2VvY29kZVJlc3BvbnNlUGFyc2VyLmpzPzJlNDUiXSwibmFtZXMiOlsiR2VvY29kZVJlc3BvbnNlUGFyc2VyIiwiVHlwZUVycm9yIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJwYXJzZSIsImpzb24iLCJnZW9jb2RlUmVzcG9uc2UiLCJHZW9jb2RlUmVzcG9uc2UiLCJvYmoiLCJKU09OIiwidHlwZSIsImkiLCJmZWF0dXJlcyIsImxlbmd0aCIsIl9wYXJzZUZlYXR1cmUiLCJfcGFyc2VFcnJvciIsIm1lc3MiLCJNUiIsImdldE1lc3NhZ2UiLCJFcnJTcnYiLCJtZXNzYWdlIiwiVFlQRV9VTktFUlIiLCJzdGF0dXMiLCJmZWF0dXJlIiwibG9jYXRpb24iLCJHZW9jb2RlZExvY2F0aW9uIiwiZ2VvbWV0cnkiLCJwb3NpdGlvbiIsImxvbiIsImNvb3JkaW5hdGVzIiwibGF0IiwicHJvcGVydGllcyIsInByb3AiLCJhY2N1cmFjeSIsInBsYWNlQXR0cmlidXRlcyIsIl90eXBlIiwibWF0Y2hUeXBlIiwibnVtYmVyIiwidW5kZWZpbmVkIiwibG9jYXRpb25zIiwicHVzaCIsImVycm9yIiwiZXhjZXB0aW9uUmVwb3J0Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDa0Q7QUFDSTtBQUNVO0FBQ0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxxQkFBcUJBLENBQUEsRUFBSTtFQUM5QixJQUFJLEVBQUUsSUFBSSxZQUFZQSxxQkFBcUIsQ0FBQyxFQUFFO0lBQzFDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLG1FQUFtRSxDQUFDO0VBQzVGO0FBQ0o7QUFFQUQscUJBQXFCLENBQUNFLFNBQVMsR0FBRztFQUU5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LGVBQWUsQ0FBQ0YsSUFBSSxDQUFDLEdBQUdULE9BQU8sQ0FBQ1EsVUFBVSxDQUFDQyxJQUFJLENBQUM7TUFDN0Q7SUFDSjtJQUNBLElBQUlULE9BQU8sQ0FBQ1EsVUFBVSxDQUFDSSxLQUFLLEtBQUssU0FBUyxFQUFFO01BQ3hDWCxRQUFRLENBQUNZLFNBQVMsR0FBR2IsT0FBTyxDQUFDUSxVQUFVLENBQUNNLE1BQU0sS0FBS0MsU0FBUyxJQUFJZixPQUFPLENBQUNRLFVBQVUsQ0FBQ00sTUFBTSxLQUFLLElBQUksR0FBRyxlQUFlLEdBQUcsUUFBUTtJQUNuSTtFQUNKO0VBQ0EvQixlQUFlLENBQUNpQyxTQUFTLENBQUNDLElBQUksQ0FBQ2hCLFFBQVEsQ0FBQztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNULFdBQVdBLENBQUUwQixLQUFLLEVBQUU7RUFDekIsT0FBTztJQUNIQyxlQUFlLEVBQUdEO0VBQ3RCLENBQUM7QUFDTDtBQUVlekMsb0ZBQXFCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvRm9ybWF0cy9HZW9jb2RlUmVzcG9uc2VQYXJzZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBNUiBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJTcnYgZnJvbSBcIi4uLy4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgR2VvY29kZVJlc3BvbnNlIGZyb20gXCIuLi9SZXNwb25zZS9tb2RlbC9HZW9jb2RlUmVzcG9uc2VcIjtcbmltcG9ydCBHZW9jb2RlZExvY2F0aW9uIGZyb20gXCIuLi9SZXNwb25zZS9tb2RlbC9HZW9jb2RlZExvY2F0aW9uXCI7XG5cbi8qKlxuICogRm9uY3Rpb24gcmV0b3VybmFudCB1biBvYmpldCBjb250ZW5hbnQgZGVzIGNsw6lzIGRlIGxlY3R1cmUgKHJlYWRlcnMpXG4gKiAgICAgIHF1aSBwZXJtZXR0ZW50IGRlIHBhcnNlciBkZXMgcsOpcG9uc2VzIFhNTCBkdSBzZXJ2aWNlIGRlIGfDqW9jb2RhZ2UgZGlyZWN0IGR1IEfDqW9wb3J0YWlsXG4gKiAgICAgIGFmaW4gZGUgcsOpY3Vww6lyZXIgbGVzIHLDqXN1bHRhdHMgcmV0b3VybsOpcy5cbiAqIEBtb2R1bGUgR2VvY29kZVJlc3BvbnNlUGFyc2VyXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuR2VvY29kZS5Gb3JtYXRzLkdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgcGVybWV0dGFudCBkZSBwYXJzZXIgdW5lIHLDqXBvbnNlIEdlb0pTT05cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5Gb3JtYXRzLkdlb2NvZGVSZXNwb25zZVBhcnNlclxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEdlb2NvZGVSZXNwb25zZVBhcnNlciAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVSZXNwb25zZVBhcnNlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVSZXNwb25zZVBhcnNlciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cbn1cblxuR2VvY29kZVJlc3BvbnNlUGFyc2VyLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6R2VvY29kZVJlc3BvbnNlUGFyc2VyXG4gICAgICovXG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBHZW9jb2RlUmVzcG9uc2VQYXJzZXIsXG5cbiAgICAvKipcbiAgICAgKiBNw6l0aG9kZSBwZXJtZXR0YW50IGRlIGxhbmNlciBsYSBsZWN0dXJlIGQndW5lIHLDqXBvbnNlIEdlb0pTT04sXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ganNvbiAtIHLDqXBvbnNlIGF1IGZvcm1hdCBHZW9KU09OXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBnZW9jb2RlUmVzcG9uc2V8ZXhjZXB0aW9uUmVwb3J0IDogbCdvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkZSBsYSByw6lwb25zZSBHZW9KU09OLFxuICAgICAqICAgICAgc291cyBsYSBmb3JtZSBkJ3VuIG9iamV0IEdlb2NvZGVSZXNwb25zZSwgb3UgdW4gb2JqZXQgbGl0dMOpcmFsIGV4Y2VwdGlvblJlcG9ydCBzaSBsZSBzZXJ2aWNlIGEgcmVudm95w6kgdW5lIGV4Y2VwdGlvbi5cbiAgICAgKi9cbiAgICBwYXJzZSA6IGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICAgIHZhciBnZW9jb2RlUmVzcG9uc2UgPSBuZXcgR2VvY29kZVJlc3BvbnNlKCk7XG5cbiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShqc29uKTtcblxuICAgICAgICBpZiAob2JqLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmouZmVhdHVyZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBfcGFyc2VGZWF0dXJlKG9iai5mZWF0dXJlc1tpXSwgZ2VvY29kZVJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gXCJGZWF0dXJlXCIpIHtcbiAgICAgICAgICAgIF9wYXJzZUZlYXR1cmUob2JqLCBnZW9jb2RlUmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09PSBcIlNFUlZJQ0VfRVJST1JcIikge1xuICAgICAgICAgICAgcmV0dXJuIF9wYXJzZUVycm9yKG9iaik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWVzcyA9IE1SLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VcIiwgb2JqLnR5cGUpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVyclNydih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3MsXG4gICAgICAgICAgICAgICAgdHlwZSA6IEVyclNydi5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICBzdGF0dXMgOiAyMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdlb2NvZGVSZXNwb25zZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE3DqXRob2RlIHBlcm1ldHRhbnQgZGUgcGFyc2VyIHVuIGZlYXR1cmVcbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlXG4gKiBAcGFyYW0ge09iamVjdH0gZ2VvY29kZVJlc3BvbnNlXG4gKlxuICogQG1lbWJlcm9mIEdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHJldHVybiB7T2JqZWN0fSBvYmpldCBHZW9jb2RlZExvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGdlb2NvZGVSZXNwb25zZSkge1xuICAgIHZhciBsb2NhdGlvbiA9IG5ldyBHZW9jb2RlZExvY2F0aW9uKCk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgJiYgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgbG9jYXRpb24ucG9zaXRpb24gPSB7XG4gICAgICAgICAgICBsb24gOiBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAgICAgbGF0IDogZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfc2NvcmVcIikge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLmFjY3VyYWN5ID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wID09PSBcIl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BdID09PSBcImFkZHJlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi50eXBlID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF0gPT09IFwicG9pXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udHlwZSA9IFwiUG9zaXRpb25PZkludGVyZXN0XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF0gPT09IFwicGFyY2VsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udHlwZSA9IFwiQ2FkYXN0cmFsUGFyY2VsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5wbGFjZUF0dHJpYnV0ZXNbcHJvcF0gPSBmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcy5fdHlwZSA9PT0gXCJhZGRyZXNzXCIpIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLm1hdGNoVHlwZSA9IGZlYXR1cmUucHJvcGVydGllcy5udW1iZXIgIT09IHVuZGVmaW5lZCAmJiBmZWF0dXJlLnByb3BlcnRpZXMubnVtYmVyICE9PSBudWxsID8gXCJzdHJlZXQgbnVtYmVyXCIgOiBcInN0cmVldFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdlb2NvZGVSZXNwb25zZS5sb2NhdGlvbnMucHVzaChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogTcOpdGhvZGUgcGVybWV0dGFudCBkZSBwYXJzZXIgdW5lIGVycmV1clxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVycm9yXG4gKlxuICogQG1lbWJlcm9mIEdlb2NvZGVSZXNwb25zZVBhcnNlclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfcGFyc2VFcnJvciAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBleGNlcHRpb25SZXBvcnQgOiBlcnJvclxuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXNwb25zZVBhcnNlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Formats/GeocodeResponseParser.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Geocode.js": +/*!*****************************************!*\ + !*** ./src/Services/Geocode/Geocode.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/GeocodeRequestFactory */ \"./src/Services/Geocode/Request/GeocodeRequestFactory.js\");\n/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/GeocodeResponseFactory */ \"./src/Services/Geocode/Response/GeocodeResponseFactory.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service de géocodage direct du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n *\n *\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.Geocode\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée.\n *\n * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après.\n * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme\n * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête.\n * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"city\".\n * Il permet également de filtrer les toponymes avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"type\".\n * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés :\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n *\n * @param {String} [options.index = \"StreetAddress\"] - Type de l'objet recherché.\n * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress'\n * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales.\n * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, index = 'StreetAddress'.\n *\n * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs.\n * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité.\n * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité.\n *\n * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut.\n * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20.\n *\n * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés.\n * false par défaut.\n *\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * proxyURL : null,\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * position : {lon:, lat:},\n * index : 'StreetAddress',\n * query : '10 rue du pont Machin-ville'\n * (...)\n * };\n */\nfunction Geocode(options_) {\n if (!(this instanceof Geocode)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Geocode\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"Geocode\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Geocode\");\n this.logger.trace(\"[Constructeur Geocode (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Geocode.newUrl();\n if (options.oldGeocodeService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Geocode.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, [options]);\n if (!options.hasOwnProperty(\"query\")) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"query\"));\n }\n\n // ajout des options spécifiques au service\n this.options.query = options.query;\n\n // on definit l'index par defaut\n if (!options.index) {\n this.options.index = options.index = \"StreetAddress\";\n }\n if (options.filters) {\n var filter = Object.keys(options.filters);\n for (var i = 0; i < filter.length; i++) {\n var key = filter[i];\n // on supprime les filtres vides\n if (typeof options.filters[key] === \"undefined\" || _typeof(options.filters[key]) === \"object\" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === \"string\" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) {\n delete this.options.filters[key];\n }\n }\n }\n this.options.index = options.index || \"StreetAddress\";\n this.options.maximumResponses = options.maximumResponses || 20;\n}\n\n/**\n * @lends module:Geocode#\n */\nGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nGeocode.prototype.constructor = Geocode;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nGeocode.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.hasOwnProperty(\"location\")) {\n this.logger.warn(\"The parameter 'location' is deprecated\");\n if (!options.query) {\n options.query = options.location;\n }\n delete options.location;\n }\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (!options.filters) {\n options.filters = options.filterOptions;\n if (options.filters.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.index) {\n if (Array.isArray(options.filters.type) && options.filters.type.length > 0) {\n options.index = options.filters.type[0];\n } else {\n options.index = options.filters.type;\n }\n }\n delete options.filters.type;\n }\n if (options.filters.bbox) {\n this.logger.warn(\"The parameter 'filterOptions.bbox' is deprecated\");\n delete options.filters.bbox;\n }\n }\n delete options.filterOptions;\n }\n if (options.position) {\n if (options.position.x) {\n this.logger.warn(\"The parameter 'position.x' is deprecated\");\n if (!options.position.lon) {\n options.position.lon = options.position.x;\n }\n delete options.position.x;\n }\n if (options.position.y) {\n this.logger.warn(\"The parameter 'position.y' is deprecated\");\n if (!options.position.lat) {\n options.position.lat = options.position.y;\n }\n delete options.position.y;\n }\n }\n if (options.returnFreeForm) {\n this.logger.warn(\"The parameter 'returnFreeForm' is deprecated\");\n delete options.returnFreeForm;\n }\n if (options.srs) {\n this.logger.warn(\"The parameter 'srs' is deprecated\");\n delete options.srs;\n }\n return options;\n};\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nGeocode.prototype.buildRequest = function (error, success) {\n var options = {\n httpMethod: this.options.httpMethod,\n // options specifiques du service\n geocodeMethod: \"search\",\n query: this.options.query,\n index: this.options.index,\n returnTrueGeometry: this.options.returnTrueGeometry,\n position: this.options.position,\n maxResp: this.options.maximumResponses,\n filters: this.options.filters\n };\n this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * Analyse de la reponse (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nGeocode.prototype.analyzeResponse = function (error, success) {\n /* INFO :\n Etape 1 : Création de la requête (URL)\n -> stockage de la requête dans this.request\n Etape 2 : Envoi de la requête\n -> appel du protocol XHR, et envoi (par ex send ())\n -> récupération de la réponse JSON dans la fonction onSuccess () (this.response)\n -> si code HTTP 200 et pas de message d'erreur : etape 3\n -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur\n Etape 3 : Analyse de la réponse JSON (si rawResponse === false )\n -> appel du parser pour récupérer le document\n Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse :\n -> JSON (si rawResponse === true)\n -> ou geocodedLocations\n */\n\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Geocode);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL0dlb2NvZGUuanM/NGZjNyJdLCJuYW1lcyI6WyJHZW9jb2RlIiwib3B0aW9uc18iLCJUeXBlRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsIkNMQVNTTkFNRSIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwib3B0aW9ucyIsInBhdGNoT3B0aW9uQ29udmVydG9yIiwic2VydmVyVXJsIiwiRGVmYXVsdFVybFNlcnZpY2UiLCJuZXdVcmwiLCJvbGRHZW9jb2RlU2VydmljZSIsInVybCIsIkNvbW1vblNlcnZpY2UiLCJhcHBseSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJxdWVyeSIsImluZGV4IiwiZmlsdGVycyIsImZpbHRlciIsIk9iamVjdCIsImtleXMiLCJpIiwibGVuZ3RoIiwia2V5IiwiX3R5cGVvZiIsIkFycmF5IiwiaXNBcnJheSIsIm1heGltdW1SZXNwb25zZXMiLCJwcm90b3R5cGUiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndhcm4iLCJsb2NhdGlvbiIsImZpbHRlck9wdGlvbnMiLCJ0eXBlIiwiYmJveCIsInBvc2l0aW9uIiwieCIsImxvbiIsInkiLCJsYXQiLCJyZXR1cm5GcmVlRm9ybSIsInNycyIsImJ1aWxkUmVxdWVzdCIsImVycm9yIiwic3VjY2VzcyIsImh0dHBNZXRob2QiLCJnZW9jb2RlTWV0aG9kIiwicmV0dXJuVHJ1ZUdlb21ldHJ5IiwibWF4UmVzcCIsInJlcXVlc3QiLCJHZW9jb2RlUmVxdWVzdEZhY3RvcnkiLCJidWlsZCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwib25FcnJvciIsIm9uU3VjY2VzcyIsInNjb3BlIiwiR2VvY29kZVJlc3BvbnNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWlEO0FBQ0g7QUFDVztBQUNaO0FBQ1E7QUFDZTtB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QkMsV0FBVyxFQUFHLElBQUksQ0FBQ3JELE9BQU8sQ0FBQ3FELFdBQVc7TUFDdENDLE9BQU8sRUFBR2QsS0FBSztNQUNmZSxTQUFTLEVBQUdkLE9BQU87TUFDbkJlLEtBQUssRUFBRztJQUNaLENBQUM7SUFFREMsd0VBQXNCLENBQUNULEtBQUssQ0FBQ2hELE9BQU8sQ0FBQztFQUN6QyxDQUFDLE1BQU07SUFDSHdDLEtBQUssQ0FBQ1MsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJQyxnRUFBWSxDQUFDekQsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztFQUM5RTtBQUNKLENBQUM7QUFFY0osc0VBQU8iLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9HZW9jb2RlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IEdlb2NvZGVSZXF1ZXN0RmFjdG9yeSBmcm9tIFwiLi9SZXF1ZXN0L0dlb2NvZGVSZXF1ZXN0RmFjdG9yeVwiO1xuaW1wb3J0IEdlb2NvZGVSZXNwb25zZUZhY3RvcnkgZnJvbSBcIi4vUmVzcG9uc2UvR2VvY29kZVJlc3BvbnNlRmFjdG9yeVwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEFwcGVsIGR1IHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkaXJlY3QgZHUgR8Opb3BvcnRhaWwgOlxuICogICAgIGVudm9pIGRlIGxhIHJlcXXDqnRlIGNvbnN0cnVpdGUgc2Vsb24gbGVzIHBhcmFtw6h0cmVzIGVuIG9wdGlvbnMsXG4gKiAgICAgw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiAgICAgcmV0b3VyIGQndW5lIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUgZGUgbGEgZm9uY3Rpb24gb25TdWNjZXNzLlxuICpcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9ucy5xdWVyeSAtIE5vbSBkZSBsJ2FkcmVzc2UsIGR1IHRvcG9ueW1lLCBkZSBsJ3VuaXTDqSBhZG1pbmlzdHJhdGl2ZSBvdSBkZSBsYSBwYXJjZWxsZSBjYWRhc3RyYWxlIHJlY2hlcmNow6llLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWx0ZXJzXSAtIExlcyBwcm9wcmnDqXTDqXMgcG9zc2libGVzIGRlIGNldCBvYmpldCBzb250IGTDqWNyaXRlcyBjaS1hcHLDqHMuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZmlsdGVycy5bcHJvcF1dIC0gQ3JpdMOocmUgc3VwcGzDqW1lbnRhaXJlIHBvdXIgZmlsdHJlciBsYSByZWNoZXJjaGUgc291cyBsYSBmb3JtZVxuICogICAgICBkJ3VuIGNvdXBsZSBjbMOpL3ZhbGV1ciDDoCBkw6lmaW5pciBzZWxvbiBsZXMgcG9zc2liaWxpdMOpcyBkdSBzZXJ2ZXVyIGFqb3V0w6kgw6AgbGEgcmVxdcOqdGUuXG4gKiAgICAgIExlIHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkdSBHw6lvcG9ydGFpbCBwZXJtZXQgZGUgZmlsdHJlciBsZXMgYWRyZXNzZXMgcG9zdGFsZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiLCBcImNpdHlcIi5cbiAqICAgICAgSWwgcGVybWV0IMOpZ2FsZW1lbnQgZGUgZmlsdHJlciBsZXMgdG9wb255bWVzIGF2ZWMgbGVzIHByb3ByacOpdMOpcyA6XG4gKiAgICAgICAgICBcInBvc3RhbENvZGVcIiwgXCJpbnNlZUNvZGVcIiwgXCJ0eXBlXCIuXG4gKiAgICAgIEVuZmluLCBpbCBwZXJtZXQgZGUgZmlsdHJlciBsZXMgcGFyY2VsbGVzIGNhZGFzdHJhbGVzIGF2ZWMgbGVzIHByb3ByacOpdMOpcyA6XG4gKiAgICAgICAgICBcImNvZGVEZXBhcnRlbWVudFwiLCBcImNvZGVDb21tdW5lXCIsIFwibm9tQ29tbXVuZVwiLCBcImNvZGVDb21tdW5lQWJzXCIsIFwiY29kZUFycm9uZGlzc2VtZW50XCIsIFwic2VjdGlvblwiLCBcIm51bWVyb1wiLCBcImZldWlsbGVcIi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaW5kZXggPSBcIlN0cmVldEFkZHJlc3NcIl0gLSBUeXBlIGRlIGwnb2JqZXQgcmVjaGVyY2jDqS5cbiAqICAgICAgTGUgc2VydmljZSBkZSBnw6lvY29kYWdlIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSByZWNoZXJjaGVyIGRlcyAnUG9zaXRpb25PZkludGVyZXN0JyBwb3VyIGRlcyB0b3BvbnltZXMsIGRlcyAnU3RyZWV0QWRkcmVzcydcbiAqICAgICAgcG91ciBkZXMgYWRyZXNzZXMgcG9zdGFsZXMgb3UgZGVzICdDYWRhc3RyYWxQYXJjZWwnIHBvdXIgZGVzIHBhcmNlbGxlcyBjYWRhc3RyYWxlcy5cbiAqICAgICAgTCdpbmRleCAnbG9jYXRpb24nIHJlZ3JvdXBlIGxlcyBpbmRleGVzICdTdHJlZXRBZGRyZXNzJyBldCAnUG9zaXRpb25PZkludGVyZXN0Jy5cbiAqICAgICAgRCdhdXRyZXMgdHlwZXMgcG91cnJvbnQgw6p0cmUgcmFqb3V0w6lzIHNlbG9uIGwnw6l2b2x1dGlvbiBkdSBzZXJ2aWNlLlxuICogICAgICBQYXIgZMOpZmF1dCwgaW5kZXggPSAnU3RyZWV0QWRkcmVzcycuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMucG9zaXRpb24gLSBQb3NpdGlvbiBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpIGV4cHJpbcOpZSBkYW5zIGxlIHN5c3TDqG1lIGRlIHLDqWbDqXJlbmNlIHNww6ljaWZpw6kgcGFyIGxlIHNycy5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sb24gLSBMb25naXR1ZGUgZHUgcG9pbnQgZGUgcsOpZsOpcmVuY2UgcG91ciBsZSBjYWxjdWwgZGUgcHJveGltaXTDqS5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBMYXRpdHVkZSBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzXSAtIE5vbWJyZSBkZSByw6lwb25zZXMgbWF4aW1hbCBxdWUgbCdvbiBzb3VoYWl0ZSByZWNldm9pci5cbiAqICAgICAgUGFzIGRlIHZhbGV1ciBwYXIgZMOpZmF1dC5cbiAqICAgICAgU2kgbGUgc2VydmV1ciBjb25zdWx0w6kgZXN0IGNlbHVpIGR1IEfDqW9wb3J0YWlsLCBsYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAyMC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldHVyblRydWVHZW9tZXRyeSA9IGZhbHNlXSAtIEJvb2zDqWVuIGluZGlxdWFudCBzaSBsJ29uIHNvdWhhaXRlIHLDqWN1cMOpcmVyIGxhIGfDqW9tw6l0cmllIHZyYWllIGRlcyBvYmplY3RzIGfDqW9sb2NhbGlzw6lzLlxuICogICAgICBmYWxzZSBwYXIgZMOpZmF1dC5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGFwaUtleSA6IG51bGwsXG4gKiAgICAgIHNlcnZlclVybCA6ICdodHRwOi8vbG9jYWxob3N0L3NlcnZpY2UvJyxcbiAqICAgICAgcHJveHlVUkwgOiBudWxsLFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb24gOiB7bG9uOiwgbGF0On0sXG4gKiAgICAgIGluZGV4IDogJ1N0cmVldEFkZHJlc3MnLFxuICogICAgICBxdWVyeSA6ICcxMCBydWUgZHUgcG9udCBNYWNoaW4tdmlsbGUnXG4gKiAgICAgICguLi4pXG4gKiAgIH07XG4gKi9cbmZ1bmN0aW9uIEdlb2NvZGUgKG9wdGlvbnNfKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJHZW9jb2RlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKiBGSVhNRSBpbnN0YW5jZSBvdSBjbGFzc2UgP1xuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJHZW9jb2RlXCI7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5HZW9jb2RlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBHZW9jb2RlIChvcHRpb25zKV1cIik7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMucGF0Y2hPcHRpb25Db252ZXJ0b3Iob3B0aW9uc18pO1xuICAgIGlmICghb3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5HZW9jb2RlLm5ld1VybCgpO1xuICAgICAgICBpZiAob3B0aW9ucy5vbGRHZW9jb2RlU2VydmljZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZXJ2ZXJVcmwgPSBEZWZhdWx0VXJsU2VydmljZS5HZW9jb2RlLnVybCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwZWwgZHUgY29uc3RydWN0ZXVyIHBhciBoZXJpdGFnZVxuICAgIENvbW1vblNlcnZpY2UuYXBwbHkodGhpcywgW29wdGlvbnNdKTtcblxuICAgIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShcInF1ZXJ5XCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicXVlcnlcIikpO1xuICAgIH1cblxuICAgIC8vIGFqb3V0IGRlcyBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlXG4gICAgdGhpcy5vcHRpb25zLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeTtcblxuICAgIC8vIG9uIGRlZmluaXQgbCdpbmRleCBwYXIgZGVmYXV0XG4gICAgaWYgKCFvcHRpb25zLmluZGV4KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggPSBcIlN0cmVldEFkZHJlc3NcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJzKSB7XG4gICAgICAgIHZhciBmaWx0ZXIgPSBPYmplY3Qua2V5cyhvcHRpb25zLmZpbHRlcnMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGZpbHRlcltpXTtcbiAgICAgICAgICAgIC8vIG9uIHN1cHByaW1lIGxlcyBmaWx0cmVzIHZpZGVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyc1trZXldID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmZpbHRlcnNba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmZpbHRlcnNba2V5XSkubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXJzW2tleV0gPT09IFwic3RyaW5nXCIgJiYgb3B0aW9ucy5maWx0ZXJzW2tleV0ubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsdGVyc1trZXldKSAmJiBvcHRpb25zLmZpbHRlcnNba2V5XS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmZpbHRlcnNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMgPSBvcHRpb25zLm1heGltdW1SZXNwb25zZXMgfHwgMjA7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpHZW9jb2RlI1xuICovXG5HZW9jb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5HZW9jb2RlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlb2NvZGU7XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXyAtIG9wdGlvbnMgZHUgc2VydmljZVxuICogQHJldHVybiB7T2JqZWN0fSAtIG9wdGlvbnNcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUucGF0Y2hPcHRpb25Db252ZXJ0b3IgPSBmdW5jdGlvbiAob3B0aW9uc18pIHtcbiAgICBjb25zdCBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShcImxvY2F0aW9uXCIpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdsb2NhdGlvbicgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMucXVlcnkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucXVlcnkgPSBvcHRpb25zLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmxvY2F0aW9uO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMnIGlzIGRlcHJlY2F0ZWRcIik7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVycy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5maWx0ZXJzLnR5cGUpICYmIG9wdGlvbnMuZmlsdGVycy50eXBlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlcnMudHlwZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlcnMudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5maWx0ZXJzLnR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMuYmJveCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zLmJib3gnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVycy5iYm94O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLmZpbHRlck9wdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24ueCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ3Bvc2l0aW9uLngnIGlzIGRlcHJlY2F0ZWRcIik7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wb3NpdGlvbi5sb24pIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnBvc2l0aW9uLmxvbiA9IG9wdGlvbnMucG9zaXRpb24ueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnBvc2l0aW9uLng7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAncG9zaXRpb24ueScgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBvc2l0aW9uLmxhdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24ubGF0ID0gb3B0aW9ucy5wb3NpdGlvbi55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMucG9zaXRpb24ueTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJldHVybkZyZWVGb3JtKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdyZXR1cm5GcmVlRm9ybScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgZGVsZXRlIG9wdGlvbnMucmV0dXJuRnJlZUZvcm07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3JzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdzcnMnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnNycztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlIChvdmVyd3JpdGUpXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIGh0dHBNZXRob2QgOiB0aGlzLm9wdGlvbnMuaHR0cE1ldGhvZCxcbiAgICAgICAgLy8gb3B0aW9ucyBzcGVjaWZpcXVlcyBkdSBzZXJ2aWNlXG4gICAgICAgIGdlb2NvZGVNZXRob2QgOiBcInNlYXJjaFwiLFxuICAgICAgICBxdWVyeSA6IHRoaXMub3B0aW9ucy5xdWVyeSxcbiAgICAgICAgaW5kZXggOiB0aGlzLm9wdGlvbnMuaW5kZXgsXG4gICAgICAgIHJldHVyblRydWVHZW9tZXRyeSA6IHRoaXMub3B0aW9ucy5yZXR1cm5UcnVlR2VvbWV0cnksXG4gICAgICAgIHBvc2l0aW9uIDogdGhpcy5vcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICBtYXhSZXNwIDogdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMsXG4gICAgICAgIGZpbHRlcnMgOiB0aGlzLm9wdGlvbnMuZmlsdGVyc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG5cbiAgICAvLyBvbiB0ZXN0ZSBzaSBsYSByZXF1ZXRlIGEgYmllbiDDqXTDqSBjb25zdHJ1aXRlICFcbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVFVRVNUX0JVSUxEXCIpKSlcbiAgICAgICAgOiBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogQW5hbHlzZSBkZSBsYSByZXBvbnNlIChvdmVyd3JpdGUpXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuR2VvY29kZS5wcm90b3R5cGUuYW5hbHl6ZVJlc3BvbnNlID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgLyogSU5GTyA6XG4gICAgICAgICBFdGFwZSAxIDogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlIChVUkwpXG4gICAgICAgICAgICAtPiBzdG9ja2FnZSBkZSBsYSByZXF1w6p0ZSBkYW5zIHRoaXMucmVxdWVzdFxuICAgICAgICAgRXRhcGUgMiA6IEVudm9pIGRlIGxhIHJlcXXDqnRlXG4gICAgICAgICAgICAtPiBhcHBlbCBkdSBwcm90b2NvbCBYSFIsIGV0IGVudm9pIChwYXIgZXggc2VuZCAoKSlcbiAgICAgICAgICAgIC0+IHLDqWN1cMOpcmF0aW9uIGRlIGxhIHLDqXBvbnNlIEpTT04gZGFucyBsYSBmb25jdGlvbiBvblN1Y2Nlc3MgKCkgKHRoaXMucmVzcG9uc2UpXG4gICAgICAgICAgICAtPiBzaSBjb2RlIEhUVFAgMjAwIGV0IHBhcyBkZSBtZXNzYWdlIGQnZXJyZXVyIDogZXRhcGUgM1xuICAgICAgICAgICAgLT4gc2kgY29kZSBIVFRQICE9IDIwMCA6IGxhbmNlbWVudCBkZSBsYSBmb25jdGlvbiBkZSBjYWxsYmFjayBvbkZhaWx1cmUgYXZlYyBsZSBtZXNzYWdlIGQnZXJyZXVyXG4gICAgICAgICBFdGFwZSAzIDogQW5hbHlzZSBkZSBsYSByw6lwb25zZSBKU09OIChzaSByYXdSZXNwb25zZSA9PT0gZmFsc2UgKVxuICAgICAgICAgICAgLT4gYXBwZWwgZHUgcGFyc2VyIHBvdXIgcsOpY3Vww6lyZXIgbGUgZG9jdW1lbnRcbiAgICAgICAgIEV0YXBlIDQgOiBMYW5jZW1lbnQgZGUgbGEgZm9uY3Rpb24gZGUgY2FsbGJhY2sgb25TdWNjZXNzIGF2ZWMgbGEgcsOpcG9uc2UgOlxuICAgICAgICAgICAgLT4gSlNPTiAoc2kgcmF3UmVzcG9uc2UgPT09IHRydWUpXG4gICAgICAgICAgICAtPiBvdSBnZW9jb2RlZExvY2F0aW9uc1xuICAgICovXG5cbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIHJhd1Jlc3BvbnNlIDogdGhpcy5vcHRpb25zLnJhd1Jlc3BvbnNlLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgb25TdWNjZXNzIDogc3VjY2VzcyxcbiAgICAgICAgICAgIHNjb3BlIDogdGhpc1xuICAgICAgICB9O1xuXG4gICAgICAgIEdlb2NvZGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHZW9jb2RlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Geocode.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Request/GeocodeRequestFactory.js": +/*!***************************************************************!*\ + !*** ./src/Services/Geocode/Request/GeocodeRequestFactory.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GeocodeRequestREST */ \"./src/Services/Geocode/Request/GeocodeRequestREST.js\");\n\n\n\n/**\n * Creation d'une requête\n * (Factory)\n *\n * @module GeocodeRequestFactory\n * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory\n * @private\n */\nvar GeocodeRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Geocode\n *\n * @example\n * var options = {\n * // options specifiques du service\n * geocodeMethod:\n * query:\n * filters:\n * maximumResponses:\n * };\n * var result = GeocodeRequestFactory.build(options);\n * if (!result) {\n * // error...\n * }\n * @returns {String} request\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"GeocodeRequestFactory\");\n logger.trace([\"GeocodeRequestFactory::build()\"]);\n var settings = options || {};\n var myReq = new _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n throw new Error(\"Error process request (rest) !\");\n }\n var request = myReq.requestString;\n logger.trace(request);\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RGYWN0b3J5LmpzPzQ1MzgiXSwibmFtZXMiOlsiR2VvY29kZVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzZXR0aW5ncyIsIm15UmVxIiwiR2VvY29kZVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJFcnJvciIsInJlcXVlc3QiLCJyZXF1ZXN0U3RyaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDRTs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLHFCQUFxQixHQUFHO0VBRXhCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxLQUFLLEVBQUcsU0FBQUEsTUFBVUMsT0FBTyxFQUFFO0lBQ3ZCO0lBQ0EsSUFBSUMsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsdUJBQXVCLENBQUM7SUFDdERGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUVoRCxJQUFJQyxRQUFRLEdBQUdMLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFFNUIsSUFBSU0sS0FBSyxHQUFHLElBQUlDLDJEQUFrQixDQUFDRixRQUFRLENBQUM7SUFDNUMsSUFBSSxDQUFDQyxLQUFLLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUMvQixNQUFNLElBQUlDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztJQUNyRDtJQUNBLElBQUlDLE9BQU8sR0FBR0osS0FBSyxDQUFDSyxhQUFhO0lBRWpDVixNQUFNLENBQUNHLEtBQUssQ0FBQ00sT0FBTyxDQUFDO0lBRXJCLE9BQU9BLE9BQU87RUFDbEI7QUFDSixDQUFDO0FBRWNaLG9GQUFxQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgR2VvY29kZVJlcXVlc3RSRVNUIGZyb20gXCIuL0dlb2NvZGVSZXF1ZXN0UkVTVFwiO1xuXG4vKipcbiAqIENyZWF0aW9uIGQndW5lIHJlcXXDqnRlXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEdlb2NvZGVSZXF1ZXN0RmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuUmVxdWVzdC5HZW9jb2RlUmVxdWVzdEZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBHZW9jb2RlUmVxdWVzdEZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBHZW9jb2RlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICogICAgICAvLyBvcHRpb25zIHNwZWNpZmlxdWVzIGR1IHNlcnZpY2VcbiAgICAgKiAgICAgIGdlb2NvZGVNZXRob2Q6XG4gICAgICogICAgICBxdWVyeTpcbiAgICAgKiAgICAgIGZpbHRlcnM6XG4gICAgICogICAgICBtYXhpbXVtUmVzcG9uc2VzOlxuICAgICAqICAgfTtcbiAgICAgKiAgIHZhciByZXN1bHQgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgICogICBpZiAoIXJlc3VsdCkge1xuICAgICAqICAgICAgIC8vIGVycm9yLi4uXG4gICAgICogICB9XG4gICAgICogQHJldHVybnMge1N0cmluZ30gcmVxdWVzdFxuICAgICAqL1xuICAgIGJ1aWxkIDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbG9nZ2VyXG4gICAgICAgIHZhciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR2VvY29kZVJlcXVlc3RGYWN0b3J5XCIpO1xuICAgICAgICBsb2dnZXIudHJhY2UoW1wiR2VvY29kZVJlcXVlc3RGYWN0b3J5OjpidWlsZCgpXCJdKTtcblxuICAgICAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHZhciBteVJlcSA9IG5ldyBHZW9jb2RlUmVxdWVzdFJFU1Qoc2V0dGluZ3MpO1xuICAgICAgICBpZiAoIW15UmVxLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHByb2Nlc3MgcmVxdWVzdCAocmVzdCkgIVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVxdWVzdCA9IG15UmVxLnJlcXVlc3RTdHJpbmc7XG5cbiAgICAgICAgbG9nZ2VyLnRyYWNlKHJlcXVlc3QpO1xuXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXF1ZXN0RmFjdG9yeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/GeocodeRequestFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Request/GeocodeRequestREST.js": +/*!************************************************************!*\ + !*** ./src/Services/Geocode/Request/GeocodeRequestREST.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/GeocodeParamREST */ \"./src/Services/Geocode/Request/model/GeocodeParamREST.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire\n * (uniquement en GET)\n *\n * @constructor\n * @alias Gp.Services.Geocode.Request.GeocodeRequestREST\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * (...)\n * };\n *\n * @private\n */\nfunction GeocodeRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"GeocodeRequestREST\");\n this.logger.trace(\"[Constructeur GeocodeRequestREST ()]\");\n if (!(this instanceof GeocodeRequestREST)) {\n throw new TypeError(\"GeocodeRequestREST constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /** liste des options */\n this.settings = options;\n}\nGeocodeRequestREST.prototype = {\n /**\n * @lends module:GeocodeRequestREST#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: GeocodeRequestREST,\n /**\n * Construction de la requête.\n *\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n var request = \"\";\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n for (var i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n if (!this.settings.geocodeMethod || this.settings.geocodeMethod !== \"search\" && this.settings.geocodeMethod !== \"reverse\") {\n throw new Error(\"Error geocodeMethod not valid\");\n }\n this.requestString = \"?\" + request;\n this.logger.trace(this.requestString);\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvR2VvY29kZVJlcXVlc3RSRVNULmpzP2Q1ZTciXSwibmFtZXMiOlsiR2VvY29kZVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInNldHRpbmdzIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXF1ZXN0Iiwib1BhcmFtcyIsIkdlb2NvZGVQYXJhbVJFU1QiLCJwYXJhbXMiLCJnZXRQYXJhbXMiLCJpIiwibGVuZ3RoIiwibyIsImsiLCJ2IiwiZ2VvY29kZU1ldGhvZCJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDSDtBQUNPOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGtCQUFrQkEsQ0FBRUMsT0FBTyxFQUFFO0VBQ2xDLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsb0JBQW9CLENBQUM7RUFDcEQsSUFBSSxDQUFDRixNQUFNLENBQUNHLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQztFQUV6RCxJQUFJLEVBQUUsSUFBSSxZQUFZTCxrQkFBa0IsQ0FBQyxFQUFFO0lBQ3ZDLE1BQU0sSUFBSU0sU0FBUyxDQUFDLGdFQUFnRSxDQUFDO0VBQ3pGOztFQUVBO0VBQ0EsSUFBSSxDQUFDTCxPQUFPLEVBQUU7SUFDVixNQUFNLElBQUlNLEtBQUssQ0FBQ0MsZ0VBQUMsQ0FBQ0MsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztFQUMzRDs7RUFFQTtFQUNBLElBQUksQ0FBQ0MsUUFBUSxHQUFHVCxPQUFPO0FBQzNCO0FBRUFELGtCQUFrQixDQUFDVyxTQUFTLEdBQUc7RUFFM0I7QUFDSjtBQUNBOztFQUVJO0FBQ0o7QUFDQTtBQUNBO0VBQ0lDLGFBQWEsRUFBRyxJQUFJO0VBRXBCO0FBQ0o7QUFDQTtFQUNJQyxXQUFXLEVBQUdiLGtCQUFrQjtFQUVoQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0ljLG9CQUFvQixFQUFHLFNBQUFBLHFCQUFBLEVBQVk7SUFDL0IsSUFBSUMsT0FBTyxHQUFHLEVBQUU7O0lBRWhCO0lBQ0EsSUFBTUMsT0FBTyxHQUFHLElBQUlDLCtEQUFnQixDQUFDLElBQUksQ0FBQ1AsUUFBUSxDQUFDO0lBRW5ELElBQU1RLE1BQU0sR0FBR0YsT0FBTyxDQUFDRyxTQUFTLENBQUMsQ0FBQztJQUNsQyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0YsTUFBTSxDQUFDRyxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUlFLENBQUMsR0FBR0osTUFBTSxDQUFDRSxDQUFDLENBQUM7TUFDakIsSUFBSUwsT0FBTyxFQUFFO1FBQ1RBLE9BQU8sSUFBSSxHQUFHO01BQ2xCO01BQ0FBLE9BQU8sSUFBSU8sQ0FBQyxDQUFDQyxDQUFDLEdBQUcsR0FBRyxHQUFHRCxDQUFDLENBQUNFLENBQUM7SUFDOUI7SUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDZCxRQUFRLENBQUNlLGFBQWEsSUFBSyxJQUFJLENBQUNmLFFBQVEsQ0FBQ2UsYUFBYSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUNmLFFBQVEsQ0FBQ2UsYUFBYSxLQUFLLFNBQVUsRUFBRTtNQUN6SCxNQUFNLElBQUlsQixLQUFLLENBQUMsK0JBQStCLENBQUM7SUFDcEQ7SUFFQSxJQUFJLENBQUNLLGFBQWEsR0FBRyxHQUFHLEdBQUdHLE9BQU87SUFDbEMsSUFBSSxDQUFDYixNQUFNLENBQUNHLEtBQUssQ0FBQyxJQUFJLENBQUNPLGFBQWEsQ0FBQztJQUVyQyxPQUFPLElBQUksQ0FBQ0EsYUFBYTtFQUM3QjtBQUNKLENBQUM7QUFFY1osaUZBQWtCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvUmVxdWVzdC9HZW9jb2RlUmVxdWVzdFJFU1QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgR2VvY29kZVBhcmFtUkVTVCBmcm9tIFwiLi9tb2RlbC9HZW9jb2RlUGFyYW1SRVNUXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgZGUgY2FsY3VsIGQnaXRpbmVyYWlyZVxuICogKHVuaXF1ZW1lbnQgZW4gR0VUKVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuUmVxdWVzdC5HZW9jb2RlUmVxdWVzdFJFU1RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBSb3V0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgKC4uLilcbiAqIH07XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gR2VvY29kZVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR2VvY29kZVJlcXVlc3RSRVNUXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBHZW9jb2RlUmVxdWVzdFJFU1QgKCldXCIpO1xuXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVSZXF1ZXN0UkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8vIGV4aXN0YW5jZSBkZXMgb3B0aW9uc1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fRU1QVFlcIiwgXCJvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgICAvKiogbGlzdGUgZGVzIG9wdGlvbnMgKi9cbiAgICB0aGlzLnNldHRpbmdzID0gb3B0aW9ucztcbn1cblxuR2VvY29kZVJlcXVlc3RSRVNULnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBsZW5kcyBtb2R1bGU6R2VvY29kZVJlcXVlc3RSRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogcmVxdWVzdFxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmVxdWVzdFN0cmluZyA6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogR2VvY29kZVJlcXVlc3RSRVNULFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0aW9uIGRlIGxhIHJlcXXDqnRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NSZXF1ZXN0U3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IFwiXCI7XG5cbiAgICAgICAgLy8gTWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGxlIHNlcnZpY2UgZGUgbCdBUEkgUkVTVFxuICAgICAgICBjb25zdCBvUGFyYW1zID0gbmV3IEdlb2NvZGVQYXJhbVJFU1QodGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gb1BhcmFtcy5nZXRQYXJhbXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvID0gcGFyYW1zW2ldO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ICs9IFwiJlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5nZW9jb2RlTWV0aG9kIHx8ICh0aGlzLnNldHRpbmdzLmdlb2NvZGVNZXRob2QgIT09IFwic2VhcmNoXCIgJiYgdGhpcy5zZXR0aW5ncy5nZW9jb2RlTWV0aG9kICE9PSBcInJldmVyc2VcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGdlb2NvZGVNZXRob2Qgbm90IHZhbGlkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0U3RyaW5nID0gXCI/XCIgKyByZXF1ZXN0O1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnJlcXVlc3RTdHJpbmcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RTdHJpbmc7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvY29kZVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/GeocodeRequestREST.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Request/model/GeocodeParamREST.js": +/*!****************************************************************!*\ + !*** ./src/Services/Geocode/Request/model/GeocodeParamREST.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST).\n * Permet le mapping avec les options du service.\n * @constructor\n * @alias Gp.Services.Route.Request.RouteParamREST\n * @param {Object} options - options\n *\n * @private\n */\nfunction GeocodeParamREST(options) {\n if (!(this instanceof GeocodeParamREST)) {\n throw new TypeError(\"GeocodeParamREST constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur GeocodeParamREST ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // methode de geocodage\n if (!this.options.geocodeMethod || this.options.geocodeMethod !== \"search\" && this.options.geocodeMethod !== \"reverse\") {\n throw new Error(\"Error geocodeMethod not valid\");\n }\n this.geocodeMethod = this.options.geocodeMethod;\n\n // mapping des options avec l'API REST\n this.query = typeof this.options !== \"undefined\" ? this.options.query : null;\n this.searchGeometry = this.options.searchGeometry || null;\n this.index = this.options.index || null;\n this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null;\n this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null;\n this.maxResp = this.options.maxResp || null;\n this.returnTrueGeometry = this.options.returnTrueGeometry || null;\n this.filters = this.options.filters || {};\n}\n\n/**\n * CLASSNAME\n */\nGeocodeParamREST.CLASSNAME = \"GeocodeParamREST\";\nGeocodeParamREST.prototype = {\n /**\n * @lends module:GeocodeParamREST#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: GeocodeParamREST,\n /**\n * Retourne les filtres\n * @returns {String} les filtres\n */\n getFilters: function getFilters() {\n var filters = {};\n for (var prop in this.filters) {\n if (this.filters.hasOwnProperty(prop)) {\n filters[prop] = this.filters[prop];\n }\n }\n return filters;\n },\n /**\n * Retourne l'index\n * @returns {String} l'index\n */\n getIndex: function getIndex() {\n if (this.index === undefined) {\n return null;\n }\n if (this.index === \"StreetAddress\") {\n return \"address\";\n } else if (this.index === \"CadastralParcel\") {\n return \"parcel\";\n } else if (this.index === \"PositionOfInterest\") {\n return \"poi\";\n } else if (this.index === \"location\") {\n return \"location\";\n }\n return this.index;\n },\n /**\n * Retourne la géométrie de recherche\n * @returns {String} la géométrie de recherche au format json\n */\n getSearchGeometry: function getSearchGeometry() {\n return JSON.stringify(this.searchGeometry);\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array} liste de paramêtres\n */\nGeocodeParamREST.prototype.getParams = function () {\n var map = [];\n if (this.geocodeMethod === \"search\") {\n map.push({\n k: \"q\",\n v: this.query\n });\n }\n if (this.index) {\n map.push({\n k: \"index\",\n v: this.getIndex()\n });\n }\n if (this.geocodeMethod === \"reverse\" && this.searchGeometry) {\n map.push({\n k: \"searchgeom\",\n v: this.getSearchGeometry()\n });\n }\n if (this.lon && this.lat) {\n map.push({\n k: \"lon\",\n v: this.lon\n });\n map.push({\n k: \"lat\",\n v: this.lat\n });\n }\n if (this.maxResp) {\n map.push({\n k: \"limit\",\n v: this.maxResp\n });\n }\n if (this.returnTrueGeometry) {\n map.push({\n k: \"returntruegeometry\",\n v: this.returnTrueGeometry\n });\n }\n var filters = this.getFilters();\n for (var key in filters) {\n map.push({\n k: key,\n v: filters[key]\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeParamREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JlcXVlc3QvbW9kZWwvR2VvY29kZVBhcmFtUkVTVC5qcz83NDNiIl0sIm5hbWVzIjpbIkdlb2NvZGVQYXJhbVJFU1QiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJnZW9jb2RlTWV0aG9kIiwiRXJyb3IiLCJxdWVyeSIsInNlYXJjaEdlb21ldHJ5IiwiaW5kZXgiLCJsb24iLCJwb3NpdGlvbiIsImxhdCIsIm1heFJlc3AiLCJyZXR1cm5UcnVlR2VvbWV0cnkiLCJmaWx0ZXJzIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRGaWx0ZXJzIiwicHJvcCIsImhhc093blByb3BlcnR5IiwiZ2V0SW5kZXgiLCJ1bmRlZmluZWQiLCJnZXRTZWFyY2hHZW9tZXRyeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRQYXJhbXMiLCJtYXAiLCJwdXNoIiwiayIsInYiLCJrZXkiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZ0JBQWdCQSxDQUFFQyxPQUFPLEVBQUU7RUFDaEMsSUFBSSxFQUFFLElBQUksWUFBWUQsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlFLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2RjtFQUVBLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLG9DQUFvQyxDQUFDOztFQUV2RDtBQUNKO0FBQ0E7RUFDSSxJQUFJLENBQUNMLE9BQU8sR0FBR0EsT0FBTyxJQUFJLENBQUMsQ0FBQzs7RUFFNUI7RUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDQSxPQUFPLENB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O0lBQ2IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ0MsT0FBTyxFQUFFO0lBQ2RlLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO01BQ0xDLENBQUMsRUFBRyxPQUFPO01BQ1hDLENBQUMsRUFBRyxJQUFJLENBQUNsQjtJQUNiLENBQUMsQ0FBQztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUNDLGtCQUFrQixFQUFFO0lBQ3pCYyxHQUFHLENBQUNDLElBQUksQ0FBQztNQUNMQyxDQUFDLEVBQUcsb0JBQW9CO01BQ3hCQyxDQUFDLEVBQUcsSUFBSSxDQUFDakI7SUFDYixDQUFDLENBQUM7RUFDTjtFQUVBLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNJLFVBQVUsQ0FBQyxDQUFDO0VBQ2pDLEtBQUssSUFBSWEsR0FBRyxJQUFJakIsT0FBTyxFQUFFO0lBQ3JCYSxHQUFHLENBQUNDLElBQUksQ0FBQztNQUNMQyxDQUFDLEVBQUdFLEdBQUc7TUFDUEQsQ0FBQyxFQUFHaEIsT0FBTyxDQUFDaUIsR0FBRztJQUNuQixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9KLEdBQUc7QUFDZCxDQUFDO0FBRWM5QiwrRUFBZ0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXF1ZXN0L21vZGVsL0dlb2NvZGVQYXJhbVJFU1QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIENsYXNzZSBkZSBnZXN0aW9uIGRlcyBwYXJhbS4gZGVzIHJlcXXDqnRlcyBkdSBzZXJ2aWNlIGRlIGNhbGN1bCBkJ2l0aW5lcmFpcmUgKFJFU1QpLlxuICogICAgICBQZXJtZXQgbGUgbWFwcGluZyBhdmVjIGxlcyBvcHRpb25zIGR1IHNlcnZpY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZS5SZXF1ZXN0LlJvdXRlUGFyYW1SRVNUXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBHZW9jb2RlUGFyYW1SRVNUIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdlb2NvZGVQYXJhbVJFU1QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW9jb2RlUGFyYW1SRVNUIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoXCJbQ29uc3RydWN0ZXVyIEdlb2NvZGVQYXJhbVJFU1QgKCldXCIpO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIG1ldGhvZGUgZGUgZ2VvY29kYWdlXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZ2VvY29kZU1ldGhvZCB8fCAodGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2QgIT09IFwic2VhcmNoXCIgJiYgdGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2QgIT09IFwicmV2ZXJzZVwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBnZW9jb2RlTWV0aG9kIG5vdCB2YWxpZFwiKTtcbiAgICB9XG4gICAgdGhpcy5nZW9jb2RlTWV0aG9kID0gdGhpcy5vcHRpb25zLmdlb2NvZGVNZXRob2Q7XG5cbiAgICAvLyBtYXBwaW5nIGRlcyBvcHRpb25zIGF2ZWMgbCdBUEkgUkVTVFxuICAgIHRoaXMucXVlcnkgPSAodHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gXCJ1bmRlZmluZWRcIikgPyB0aGlzLm9wdGlvbnMucXVlcnkgOiBudWxsO1xuXG4gICAgdGhpcy5zZWFyY2hHZW9tZXRyeSA9IHRoaXMub3B0aW9ucy5zZWFyY2hHZW9tZXRyeSB8fCBudWxsO1xuXG4gICAgdGhpcy5pbmRleCA9IHRoaXMub3B0aW9ucy5pbmRleCB8fCBudWxsO1xuXG4gICAgdGhpcy5sb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxvbiA/IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sb24gOiBudWxsO1xuXG4gICAgdGhpcy5sYXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCA/IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgOiBudWxsO1xuXG4gICAgdGhpcy5tYXhSZXNwID0gdGhpcy5vcHRpb25zLm1heFJlc3AgfHwgbnVsbDtcblxuICAgIHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5ID0gdGhpcy5vcHRpb25zLnJldHVyblRydWVHZW9tZXRyeSB8fCBudWxsO1xuXG4gICAgdGhpcy5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcnMgfHwge307XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cbkdlb2NvZGVQYXJhbVJFU1QuQ0xBU1NOQU1FID0gXCJHZW9jb2RlUGFyYW1SRVNUXCI7XG5cbkdlb2NvZGVQYXJhbVJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpHZW9jb2RlUGFyYW1SRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IEdlb2NvZGVQYXJhbVJFU1QsXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsZXMgZmlsdHJlc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxlcyBmaWx0cmVzXG4gICAgICovXG4gICAgZ2V0RmlsdGVycyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpbHRlcnMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzW3Byb3BdID0gdGhpcy5maWx0ZXJzW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsJ2luZGV4XG4gICAgICogQHJldHVybnMge1N0cmluZ30gbCdpbmRleFxuICAgICAqL1xuICAgIGdldEluZGV4IDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gXCJTdHJlZXRBZGRyZXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImFkZHJlc3NcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcIkNhZGFzdHJhbFBhcmNlbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwYXJjZWxcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJwb2lcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID09PSBcImxvY2F0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImxvY2F0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGfDqW9tw6l0cmllIGRlIHJlY2hlcmNoZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGxhIGfDqW9tw6l0cmllIGRlIHJlY2hlcmNoZSBhdSBmb3JtYXQganNvblxuICAgICAqL1xuICAgIGdldFNlYXJjaEdlb21ldHJ5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5zZWFyY2hHZW9tZXRyeSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUYWJsZWF1IGRlIGNsZWZzL3ZhbGV1cnMgcG91ciBwYXJhbS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9IGxpc3RlIGRlIHBhcmFtw6p0cmVzXG4gKi9cbkdlb2NvZGVQYXJhbVJFU1QucHJvdG90eXBlLmdldFBhcmFtcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gW107XG5cbiAgICBpZiAodGhpcy5nZW9jb2RlTWV0aG9kID09PSBcInNlYXJjaFwiKSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcInFcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLnF1ZXJ5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluZGV4KSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImluZGV4XCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXRJbmRleCgpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdlb2NvZGVNZXRob2QgPT09IFwicmV2ZXJzZVwiICYmIHRoaXMuc2VhcmNoR2VvbWV0cnkpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwic2VhcmNoZ2VvbVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0U2VhcmNoR2VvbWV0cnkoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb24gJiYgdGhpcy5sYXQpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwibG9uXCIsXG4gICAgICAgICAgICB2IDogdGhpcy5sb25cbiAgICAgICAgfSk7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImxhdFwiLFxuICAgICAgICAgICAgdiA6IHRoaXMubGF0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heFJlc3ApIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwibGltaXRcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLm1heFJlc3BcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5KSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcInJldHVybnRydWVnZW9tZXRyeVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMucmV0dXJuVHJ1ZUdlb21ldHJ5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnMoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmlsdGVycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDoga2V5LFxuICAgICAgICAgICAgdiA6IGZpbHRlcnNba2V5XVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvY29kZVBhcmFtUkVTVDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Request/model/GeocodeParamREST.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Response/GeocodeResponseFactory.js": +/*!*****************************************************************!*\ + !*** ./src/Services/Geocode/Response/GeocodeResponseFactory.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Formats/GeocodeResponseParser */ \"./src/Services/Geocode/Formats/GeocodeResponseParser.js\");\n/**\n * Factory pour générer une reponse JSON à partir d'un XML\n * (Factory)\n *\n * @module GeocodeResponseFactory\n * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory\n * @private\n */\n// import Logger from \"../../../Utils/LoggerByDefault\";\n\n\n\nvar GeocodeReponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Geocode\n *\n * @example\n * var options = {\n * response :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // data de type GeocodeResponse\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n data = options.response;\n } else {\n try {\n var parser = new _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n data = parser.parse(options.response);\n if (!data) {\n throw new Error(\"L'analyse de la réponse du service !?\");\n }\n } catch (e) {\n var message = e.message;\n if (typeof options.response === \"string\") {\n message += \"('\" + options.response + \"')\";\n } else {\n message += \"('\" + options.response.documentElement.innerHTML + \"')\";\n }\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", message),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_UNKERR,\n status: -1\n }));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_SRVERR,\n status: 200 // FIXME : 200 ?\n }));\n\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\"),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__[\"default\"].TYPE_SRVERR,\n status: -1 // FIXME : status response\n }));\n\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeReponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL0dlb2NvZGVSZXNwb25zZUZhY3RvcnkuanM/MDJjOCJdLCJuYW1lcyI6WyJHZW9jb2RlUmVwb25zZUZhY3RvcnkiLCJidWlsZCIsIm9wdGlvbnMiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsInBhcnNlciIsIkdlb2NvZGVSZXNwb25zZVBhcnNlciIsInBhcnNlIiwiRXJyb3IiLCJlIiwibWVzc2FnZSIsImRvY3VtZW50RWxlbWVudCIsImlubmVySFRNTCIsIm9uRXJyb3IiLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJNUmVzIiwiZ2V0TWVzc2FnZSIsInR5cGUiLCJUWVBFX1VOS0VSUiIsInN0YXR1cyIsImV4Y2VwdGlvblJlcG9ydCIsIlRZUEVfU1JWRVJSIiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM0RDtBQUNSO0FBQ2lCO0FBRXJFLElBQUlBLHFCQUFxQixHQUFHO0VBRXhCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsS0FBSyxFQUFHLFNBQUFBLE1BQVVDLE9BQU8sRUFBRTtJQUN2QjtJQUNBLElBQUlDLElBQUksR0FBRyxJQUFJO0lBRWYsSUFBSUQsT0FBTyxDQUFDRSxRQUFRLEVBQUU7TUFDbEIsSUFBSUYsT0FBTyxDQUFDRyxXQUFXLEVBQUU7UUFDckJGLElBQUksR0FBR0QsT0FBTyxDQUFDRSxRQUFRO01BQzNCLENBQUMsTUFBTTtRQUNILElBQUk7VUFDQSxJQUFNRSxNQUFNLEdBQUcsSUFBSUMsc0VBQXFCLENBQUMsQ0FBQztVQUMxQ0osSUFBSSxHQUFHRyxNQUFNLENBQUNFLEtBQUssQ0FBQ04sT0FBTyxDQUFDRSxRQUFRLENBQUM7VUFFckMsSUFBSSxDQUFDRCxJQUFJLEVBQUU7WUFDUCxNQUFNLElBQUlNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQztVQUM1RDtRQUNKLENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7VUFDUixJQUFJQyxPQUFPLEdBQUdELENBQUMsQ0FBQ0MsT0FBTztVQUN2QixJQUFJLE9BQU9ULE9BQU8sQ0FBQ0UsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUN0Q08sT0FBTyxJQUFJLElBQUksR0FBR1QsT0FBTyxDQUFDRSxRQUFRLEdBQUcsSUFBSTtVQUM3QyxDQUFDLE1BQU07WUFDSE8sT0FBTyxJQUFJLElBQUksR0FBR1QsT0FBTyxDQUFDRSxRQUFRLENBQUNRLGVBQWUsQ0FBQ0MsU0FBUyxHQUFHLElBQUk7VUFDdkU7VUFDQVgsT0FBTyxDQUFDWSxPQUFPLENBQUNDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQztZQUNqRE4sT0FBTyxFQUFHTyxnRUFBSSxDQUFDQyxVQUFVLENBQUMsMEJBQTBCLEVBQUVSLE9BQU8sQ0FBQztZQUM5RFMsSUFBSSxFQUFHSCxnRUFBWSxDQUFDSSxXQUFXO1lBQy9CQyxNQUFNLEVBQUcsQ0FBQztVQUNkLENBQUMsQ0FBQyxDQUFDO1VBQ0g7UUFDSjs7UUFFQTtRQUNBLElBQUluQixJQUFJLENBQUNvQixlQUFlLEVBQUU7VUFDdEJyQixPQUFPLENBQUNZLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRSxJQUFJQyxnRUFBWSxDQUFDO1lBQ2pETixPQUFPLEVBQUdPLGdFQUFJLENBQUNDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRWhCLElBQUksQ0FBQ29CLGVBQWUsQ0FBQztZQUM3RUgsSUFBSSxFQUFHSCxnRUFBWSxDQUFDTyxXQUFXO1lBQy9CRixNQUFNLEVBQUcsR0FBRyxDQUFDO1VBQ2pCLENBQUMsQ0FBQyxDQUFDOztVQUNIO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTTtNQUNIcEIsT0FBTyxDQUFDWSxPQUFPLENBQUNDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQztRQUNqRE4sT0FBTyxFQUFHTyxnRUFBSSxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7UUFDbkRDLElBQUksRUFBR0gsZ0VBQVksQ0FBQ08sV0FBVztRQUMvQkYsTUFBTSxFQUFHLENBQUMsQ0FBQyxDQUFDO01BQ2hCLENBQUMsQ0FBQyxDQUFDOztNQUNIO0lBQ0o7SUFFQXBCLE9BQU8sQ0FBQ3VCLFNBQVMsQ0FBQ1YsSUFBSSxDQUFDYixPQUFPLENBQUNjLEtBQUssRUFBRWIsSUFBSSxDQUFDO0VBQy9DO0FBQ0osQ0FBQztBQUVjSCxvRkFBcUIiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXNwb25zZS9HZW9jb2RlUmVzcG9uc2VGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGYWN0b3J5IHBvdXIgZ8OpbsOpcmVyIHVuZSByZXBvbnNlIEpTT04gw6AgcGFydGlyIGQndW4gWE1MXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIEdlb2NvZGVSZXNwb25zZUZhY3RvcnlcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5HZW9jb2RlLlJlc3BvbnNlLkdlb2NvZGVSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbi8vIGltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBNUmVzIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IEdlb2NvZGVSZXNwb25zZVBhcnNlciBmcm9tIFwiLi4vRm9ybWF0cy9HZW9jb2RlUmVzcG9uc2VQYXJzZXJcIjtcblxudmFyIEdlb2NvZGVSZXBvbnNlRmFjdG9yeSA9IHtcblxuICAgIC8qKlxuICAgICAqIGludGVyZmFjZSB1bmlxdWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgYnVpbGRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IEdlb2NvZGVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIHJhd1Jlc3BvbnNlIDpcbiAgICAgKiAgICAgIHNjb3BlIDpcbiAgICAgKiAgICAgIG9uU3VjY2VzcyA6XG4gICAgICogICAgICBvbkVycm9yIDpcbiAgICAgKiAgIH07XG4gICAgICpcbiAgICAgKi9cbiAgICBidWlsZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGRhdGEgZGUgdHlwZSBHZW9jb2RlUmVzcG9uc2VcbiAgICAgICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgR2VvY29kZVJlc3BvbnNlUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZXIucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMJ2FuYWx5c2UgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSAhP1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXNwb25zZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIignXCIgKyBvcHRpb25zLnJlc3BvbnNlICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIignXCIgKyBvcHRpb25zLnJlc3BvbnNlLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXCIsIG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1VOS0VSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IC0xXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNpIGxhIHLDqXBvbnNlIGNvbnRlbmFpdCB1bmUgZXhjZXB0aW9uIHJlbnZvecOpZSBwYXIgbGUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmV4Y2VwdGlvblJlcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiBNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBkYXRhLmV4Y2VwdGlvblJlcG9ydCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogRXJyb3JTZXJ2aWNlLlRZUEVfU1JWRVJSLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDogMjAwIC8vIEZJWE1FIDogMjAwID9cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6IE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIiksXG4gICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICBzdGF0dXMgOiAtMSAvLyBGSVhNRSA6IHN0YXR1cyByZXNwb25zZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5vblN1Y2Nlc3MuY2FsbChvcHRpb25zLnNjb3BlLCBkYXRhKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBHZW9jb2RlUmVwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/GeocodeResponseFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Response/model/GeocodeResponse.js": +/*!****************************************************************!*\ + !*** ./src/Services/Geocode/Response/model/GeocodeResponse.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Array.} locations - locations array.\n *\n * @namespace\n * @alias Gp.Services.GeocodeResponse\n */\nfunction GeocodeResponse() {\n if (!(this instanceof GeocodeResponse)) {\n throw new TypeError(\"GeocodeResponse constructor cannot be called as a function.\");\n }\n this.locations = [];\n}\nGeocodeResponse.prototype = {\n constructor: GeocodeResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodeResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL21vZGVsL0dlb2NvZGVSZXNwb25zZS5qcz81OTdkIl0sIm5hbWVzIjpbIkdlb2NvZGVSZXNwb25zZSIsIlR5cGVFcnJvciIsImxvY2F0aW9ucyIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxlQUFlQSxDQUFBLEVBQUk7RUFDeEIsSUFBSSxFQUFFLElBQUksWUFBWUEsZUFBZSxDQUFDLEVBQUU7SUFDcEMsTUFBTSxJQUFJQyxTQUFTLENBQUMsNkRBQTZELENBQUM7RUFDdEY7RUFFQSxJQUFJLENBQUNDLFNBQVMsR0FBRyxFQUFFO0FBQ3ZCO0FBRUFGLGVBQWUsQ0FBQ0csU0FBUyxHQUFHO0VBRXhCQyxXQUFXLEVBQUdKO0FBRWxCLENBQUM7QUFFY0EsOEVBQWUiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXNwb25zZS9tb2RlbC9HZW9jb2RlUmVzcG9uc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2Vzfmdlb2NvZGUgR3AuU2VydmljZXMuZ2VvY29kZSAoKX0gb3Ige0BsaW5rIG1vZHVsZTpTZXJ2aWNlc35yZXZlcnNlR2VvY29kZSBHcC5TZXJ2aWNlcy5yZXZlcnNlR2VvY29kZSAoKX0gaW52b2NhdGlvbiB3aGVuIHN1Y2Nlc3NmdWwuIFJlY2VpdmVkIGFzIHRoZSBhcmd1bWVudCBvZiBvblN1Y2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHByb3BlcnR5IHtBcnJheS48R3AuU2VydmljZXMuR2VvY29kZS5HZW9jb2RlZExvY2F0aW9uPn0gbG9jYXRpb25zIC0gbG9jYXRpb25zIGFycmF5LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5HZW9jb2RlUmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gR2VvY29kZVJlc3BvbnNlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2VvY29kZVJlc3BvbnNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VvY29kZVJlc3BvbnNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBbXTtcbn1cblxuR2VvY29kZVJlc3BvbnNlLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yIDogR2VvY29kZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVSZXNwb25zZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/model/GeocodeResponse.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/Response/model/GeocodedLocation.js": +/*!*****************************************************************!*\ + !*** ./src/Services/Geocode/Response/model/GeocodedLocation.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single location object returned by the underlying geocoding web service.\n *\n * @property {Gp.Point} position - Position of the location given in the requested coordinates system.\n * @property {String} type - location type \"StreetAddress\" (for an address), \"PositionOfInterest\" (for a place name) or \"CadastralParcel\" (for cadastral parcel).\n * @property {String} matchType - how geocoding is performed : \"street number\" (exact address), \"street enhanced\" (street number calculated by interpolation), \"street\" (only the street), \"city\" (only the city).\n * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match).\n * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service :\n *\n * *Common attributes : *\n *\n * - **trueGeometry** - the 'real life' geometry if different from 'Point' type.\n *\n * *if type === \"StreetAddress\" :*\n *\n * - **number** - Street number.\n * - **postalCode** - PostCode\n * - **street** - Street name\n * - **city** - City\n * - **houseNumberInfos** - additional street number information\n * - **inseeCode** - INSEE Code\n *\n *\n * *if type === \"PositionOfInterest\" :*\n *\n * - **type** - Place name type\n * - **postalCode** - PostCode\n * - **toponyme** - Toponyme\n * - **extraFields** - additional place name properties\n * - **inseeCode** - INSEE Code\n *\n *\n * *si type = \"CadastralParcel\" :*\n *\n * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. \"000\" otherwise.\n * - **codeArrondissement** - arrondissement\n * - **identifiant** - cadastral parcel code\n * - **feuille** - Parcel Sheet (eg. \"1\").\n * - **numero** - Parcel Number (eg. \"0041\")\n * - **section** - Parcel Section (eg. \"0D\").\n * - **nomCommune** - Parcel municipality name.\n * - **codeCommune** - Parcel municipality.\n * - **codeDepartement** - Parcel Department.\n *\n * @namespace\n * @alias Gp.Services.Geocode.GeocodedLocation\n */\nfunction GeocodedLocation() {\n if (!(this instanceof GeocodedLocation)) {\n throw new TypeError(\"GeocodedLocation constructor cannot be called as a function.\");\n }\n this.position = null;\n this.matchType = null;\n this.placeAttributes = {};\n this.type = null;\n this.accuracy = null;\n\n /**\n * Nom de la classe : \"GeocodedLocation\"\n * @type {String}\n */\n this.CLASSNAME = \"GeocodedLocation\";\n}\nGeocodedLocation.prototype = {\n constructor: GeocodedLocation\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GeocodedLocation);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1Jlc3BvbnNlL21vZGVsL0dlb2NvZGVkTG9jYXRpb24uanM/ZThjNCJdLCJuYW1lcyI6WyJHZW9jb2RlZExvY2F0aW9uIiwiVHlwZUVycm9yIiwicG9zaXRpb24iLCJtYXRjaFR5cGUiLCJwbGFjZUF0dHJpYnV0ZXMiLCJ0eXBlIiwiYWNjdXJhY3kiLCJDTEFTU05BTUUiLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsZ0JBQWdCQSxDQUFBLEVBQUk7RUFDekIsSUFBSSxFQUFFLElBQUksWUFBWUEsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlDLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2RjtFQUVBLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFFcEIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSTtFQUVyQixJQUFJLENBQUNDLGVBQWUsR0FBRyxDQUFDLENBQUM7RUFFekIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUVoQixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJOztFQUVwQjtBQUNKO0FBQ0E7QUFDQTtFQUNJLElBQUksQ0FBQ0MsU0FBUyxHQUFHLGtCQUFrQjtBQUN2QztBQUVBUCxnQkFBZ0IsQ0FBQ1EsU0FBUyxHQUFHO0VBRXpCQyxXQUFXLEVBQUdUO0FBRWxCLENBQUM7QUFFY0EsK0VBQWdCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL0dlb2NvZGUvUmVzcG9uc2UvbW9kZWwvR2VvY29kZWRMb2NhdGlvbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBTaW5nbGUgbG9jYXRpb24gb2JqZWN0IHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlb2NvZGluZyB3ZWIgc2VydmljZS5cbiAqXG4gKiBAcHJvcGVydHkge0dwLlBvaW50fSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbiBnaXZlbiBpbiB0aGUgcmVxdWVzdGVkIGNvb3JkaW5hdGVzIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0eXBlIC0gbG9jYXRpb24gdHlwZSBcIlN0cmVldEFkZHJlc3NcIiAoZm9yIGFuIGFkZHJlc3MpLCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiIChmb3IgYSBwbGFjZSBuYW1lKSBvciBcIkNhZGFzdHJhbFBhcmNlbFwiIChmb3IgY2FkYXN0cmFsIHBhcmNlbCkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWF0Y2hUeXBlIC0gaG93IGdlb2NvZGluZyBpcyBwZXJmb3JtZWQgOiBcInN0cmVldCBudW1iZXJcIiAoZXhhY3QgYWRkcmVzcyksIFwic3RyZWV0IGVuaGFuY2VkXCIgKHN0cmVldCBudW1iZXIgY2FsY3VsYXRlZCBieSBpbnRlcnBvbGF0aW9uKSwgXCJzdHJlZXRcIiAob25seSB0aGUgc3RyZWV0KSwgXCJjaXR5XCIgKG9ubHkgdGhlIGNpdHkpLlxuICogQHByb3BlcnR5IHtGbG9hdH0gYWNjdXJhY3kgLSBBY2N1cmFjeSBvZiB0aGUgcmVzcG9uc2UgdG93YXJkcyB0aGUgcmVxdWVzdGVkIGxvY2F0aW9uIGJldHdlZW4gMCAodW5hY2N1cmF0ZSkgYW5kIDEgKGV4YWN0IG1hdGNoKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwbGFjZUF0dHJpYnV0ZXMgLSBBc3NvY2lhdGl2ZSBhcnJheSBtYXRjaGluZyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgd2l0aCB0aGVpciB2YWx1ZXMgZ2l2ZW4gYnkgdGhlIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgOlxuICpcbiAqICpDb21tb24gYXR0cmlidXRlcyA6ICpcbiAqXG4gKiAtICoqdHJ1ZUdlb21ldHJ5KiogLSB0aGUgJ3JlYWwgbGlmZScgZ2VvbWV0cnkgaWYgZGlmZmVyZW50IGZyb20gJ1BvaW50JyB0eXBlLlxuICpcbiAqICppZiB0eXBlID09PSBcIlN0cmVldEFkZHJlc3NcIiA6KlxuICpcbiAqIC0gKipudW1iZXIqKiAtIFN0cmVldCBudW1iZXIuXG4gKiAtICoqcG9zdGFsQ29kZSoqIC0gUG9zdENvZGVcbiAqIC0gKipzdHJlZXQqKiAtIFN0cmVldCBuYW1lXG4gKiAtICoqY2l0eSoqIC0gQ2l0eVxuICogLSAqKmhvdXNlTnVtYmVySW5mb3MqKiAtIGFkZGl0aW9uYWwgc3RyZWV0IG51bWJlciBpbmZvcm1hdGlvblxuICogLSAqKmluc2VlQ29kZSoqIC0gSU5TRUUgQ29kZVxuICpcbiAqXG4gKiAqaWYgdHlwZSA9PT0gXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiA6KlxuICpcbiAqIC0gKip0eXBlKiogLSBQbGFjZSBuYW1lIHR5cGVcbiAqIC0gKipwb3N0YWxDb2RlKiogLSBQb3N0Q29kZVxuICogLSAqKnRvcG9ueW1lKiogLSBUb3BvbnltZVxuICogLSAqKmV4dHJhRmllbGRzKiogLSBhZGRpdGlvbmFsIHBsYWNlIG5hbWUgcHJvcGVydGllc1xuICogLSAqKmluc2VlQ29kZSoqIC0gSU5TRUUgQ29kZVxuICpcbiAqXG4gKiAqc2kgdHlwZSA9IFwiQ2FkYXN0cmFsUGFyY2VsXCIgOipcbiAqXG4gKiAtICoqY29kZUNvbW11bmVBYnMqKiAtIHdoZW4gYSBwYXJjZWwgY29tZXMgZnJvbSBhIGNpdHkgdGhhdCB3YXMgYWJzb3JiZWQgYnkgYW5vdGhlciwgY29kZSBvZiB0aGF0IG9sZCBjaXR5LiBcIjAwMFwiIG90aGVyd2lzZS5cbiAqIC0gKipjb2RlQXJyb25kaXNzZW1lbnQqKiAtIGFycm9uZGlzc2VtZW50XG4gKiAtICoqaWRlbnRpZmlhbnQqKiAtIGNhZGFzdHJhbCBwYXJjZWwgY29kZVxuICogLSAqKmZldWlsbGUqKiAtIFBhcmNlbCBTaGVldCAoZWcuIFwiMVwiKS5cbiAqIC0gKipudW1lcm8qKiAtIFBhcmNlbCBOdW1iZXIgKGVnLiBcIjAwNDFcIilcbiAqIC0gKipzZWN0aW9uKiogLSBQYXJjZWwgU2VjdGlvbiAoZWcuIFwiMERcIikuXG4gKiAtICoqbm9tQ29tbXVuZSoqIC0gUGFyY2VsIG11bmljaXBhbGl0eSBuYW1lLlxuICogLSAqKmNvZGVDb21tdW5lKiogLSBQYXJjZWwgbXVuaWNpcGFsaXR5LlxuICogLSAqKmNvZGVEZXBhcnRlbWVudCoqIC0gUGFyY2VsIERlcGFydG1lbnQuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLkdlb2NvZGUuR2VvY29kZWRMb2NhdGlvblxuICovXG5mdW5jdGlvbiBHZW9jb2RlZExvY2F0aW9uICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2VvY29kZWRMb2NhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlb2NvZGVkTG9jYXRpb24gY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcblxuICAgIHRoaXMubWF0Y2hUeXBlID0gbnVsbDtcblxuICAgIHRoaXMucGxhY2VBdHRyaWJ1dGVzID0ge307XG5cbiAgICB0aGlzLnR5cGUgPSBudWxsO1xuXG4gICAgdGhpcy5hY2N1cmFjeSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIDogXCJHZW9jb2RlZExvY2F0aW9uXCJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuQ0xBU1NOQU1FID0gXCJHZW9jb2RlZExvY2F0aW9uXCI7XG59XG5cbkdlb2NvZGVkTG9jYXRpb24ucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBHZW9jb2RlZExvY2F0aW9uXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2NvZGVkTG9jYXRpb247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/Response/model/GeocodedLocation.js\n"); + +/***/ }), + +/***/ "./src/Services/Geocode/ReverseGeocode.js": +/*!************************************************!*\ + !*** ./src/Services/Geocode/ReverseGeocode.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/GeocodeRequestFactory */ \"./src/Services/Geocode/Request/GeocodeRequestFactory.js\");\n/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/GeocodeResponseFactory */ \"./src/Services/Geocode/Response/GeocodeResponseFactory.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service de géocodage inverse du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.ReverseGeocode\n *\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs.\n * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité.\n * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité.\n *\n * @param {Object} [options.filters] - Les propriétés possibles de cet objet.\n * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme\n * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête.\n * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"city\".\n * Il permet également de filtrer les toponymes avec les propriétés :\n * \"postalCode\", \"inseeCode\", \"type\".\n * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés :\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n *\n * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche.\n * Les propriétés possibles de cet objet sont décrites ci-après.\n * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon)\n * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie.\n * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'.\n *\n * @param {String} [options.index = \"StreetAddress\"] - Type de l'objet recherché.\n * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress'\n * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche\n * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'.\n * D'autres types pourront être rajoutés selon l'évolution du service.\n * Par défaut, index = 'StreetAddress'.\n *\n * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir.\n * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s.\n *\n * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés.\n * false par défaut.\n *\n * @example\n * var options = {\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * proxyURL : null,\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * index : 'StreetAddress',\n * searchGeometry : {\n * type : Circle,\n * coordinates : [48, 2],\n * radius : 100\n * },\n * position : {lon:2 , lat:48.5},\n * maximumResponses : 25,\n * };\n *\n */\nfunction ReverseGeocode(options_) {\n if (!(this instanceof ReverseGeocode)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"ReverseGeocode\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"ReverseGeocode\";\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.ReverseGeocode\");\n this.logger.trace(\"[Constructeur ReverseGeocode (options)]\");\n var options = this.patchOptionConvertor(options_);\n if (!options.serverUrl) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ReverseGeocode.newUrl();\n if (options.oldReverseService) {\n options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ReverseGeocode.url();\n }\n }\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, [options]);\n if (!options.searchGeometry) {\n if (!options.position) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"searchGeometry\"));\n }\n } else {\n this.options.searchGeometry = options.searchGeometry;\n }\n\n // on definit l'index par defaut\n if (!options.index) {\n this.options.index = options.index = \"StreetAddress\";\n }\n if (options.filters) {\n var filter = Object.keys(options.filters);\n for (var i = 0; i < filter.length; i++) {\n var key = filter[i];\n // on supprime les filtres vides\n if (typeof options.filters[key] === \"undefined\" || _typeof(options.filters[key]) === \"object\" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === \"string\" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) {\n delete this.options.filters[key];\n }\n }\n }\n this.options.position = options.position;\n this.options.index = options.index || \"StreetAddress\";\n this.options.maximumResponses = options.maximumResponses || 20;\n}\n\n/**\n * @lends module:ReverseGeocode#\n */\nReverseGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nReverseGeocode.prototype.constructor = ReverseGeocode;\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} options_ - options du service\n * @return {Object} - options\n */\nReverseGeocode.prototype.patchOptionConvertor = function (options_) {\n var options = options_;\n if (options.filterOptions) {\n this.logger.warn(\"The parameter 'filterOptions' is deprecated\");\n if (options.filterOptions.type) {\n this.logger.warn(\"The parameter 'filterOptions.type' is deprecated\");\n if (!options.index) {\n if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) {\n options.index = options.filterOptions.type[0];\n } else {\n options.index = options.filterOptions.type;\n }\n }\n delete options.filterOptions.type;\n }\n if (options.filterOptions.bbox) {\n this.logger.warn(\"The parameter 'filterOptions.bbox' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.bbox2Json(options.filterOptions.bbox);\n }\n delete options.filterOptions.bbox;\n }\n if (options.filterOptions.circle) {\n this.logger.warn(\"The parameter 'filterOptions.circle' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.circle2Json(options.filterOptions.circle);\n }\n delete options.filterOptions.circle;\n }\n if (options.filterOptions.polygon) {\n this.logger.warn(\"The parameter 'filterOptions.polygon' is deprecated\");\n if (!options.searchGeometry) {\n // convertir la geometrie\n options.searchGeometry = this.polygon2Json(options.filterOptions.polygon);\n }\n delete options.filterOptions.polygon;\n }\n if (!options.filters && Object.keys(options.filterOptions).length > 0) {\n options.filters = options.filterOptions;\n }\n delete options.filterOptions;\n }\n if (options.position) {\n if (options.position.x) {\n this.logger.warn(\"The parameter 'position.x' is deprecated\");\n if (!options.position.lon) {\n options.position.lon = options.position.x;\n }\n delete options.position.x;\n }\n if (options.position.y) {\n this.logger.warn(\"The parameter 'position.y' is deprecated\");\n if (!options.position.lat) {\n options.position.lat = options.position.y;\n }\n delete options.position.y;\n }\n }\n if (options.srs) {\n this.logger.warn(\"The parameter 'srs' is deprecated\");\n delete options.srs;\n }\n return options;\n};\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nReverseGeocode.prototype.buildRequest = function (error, success) {\n var options = {\n httpMethod: this.options.httpMethod,\n // options specifiques du service\n geocodeMethod: \"reverse\",\n searchGeometry: this.options.searchGeometry,\n index: this.options.index,\n position: this.options.position,\n returnTrueGeometry: this.options.returnTrueGeometry,\n maxResp: this.options.maximumResponses,\n filters: this.options.filters\n };\n this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"))) : success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nReverseGeocode.prototype.analyzeResponse = function (error, success) {\n if (this.response) {\n var options = {\n response: this.response,\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this\n };\n _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Array} bbox - bbox\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.bbox2Json = function (bbox) {\n return {\n type: \"Polygon\",\n coordinates: [[[bbox.left, bbox.top], [bbox.right, bbox.top], [bbox.right, bbox.bottom], [bbox.left, bbox.bottom], [bbox.left, bbox.top]]]\n };\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Object} circle - circle\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.circle2Json = function (circle) {\n return {\n type: \"Circle\",\n radius: circle.radius,\n coordinates: [circle.x, circle.y]\n };\n};\n\n/**\n * Patch pour la convertion des options vers le nouveau formalisme.\n *\n * @param {Array} polygon - polygon\n * @return {Object} - geometrie au format json\n */\nReverseGeocode.prototype.polygon2Json = function (polygon) {\n var jsonGeom = {\n type: \"Polygon\",\n coordinates: [[]]\n };\n for (var i = 0; i < polygon.length; ++i) {\n jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]);\n }\n return jsonGeom;\n};\n\n/**\n * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées.\n */\nReverseGeocode.geoEPSG = [\"EPSG:4326\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (ReverseGeocode);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9HZW9jb2RlL1JldmVyc2VHZW9jb2RlLmpzP2JiYjQiXSwibmFtZXMiOlsiUmV2ZXJzZUdlb2NvZGUiLCJvcHRpb25zXyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJvcHRpb25zIiwicGF0Y2hPcHRpb25Db252ZXJ0b3IiLCJzZXJ2ZXJVcmwiLCJEZWZhdWx0VXJsU2VydmljZSIsIm5ld1VybCIsIm9sZFJldmVyc2VTZXJ2aWNlIiwidXJsIiwiQ29tbW9uU2VydmljZSIsImFwcGx5Iiwic2VhcmNoR2VvbWV0cnkiLCJwb3NpdGlvbiIsIkVycm9yIiwiaW5kZXgiLCJmaWx0ZXJzIiwiZmlsdGVyIiwiT2JqZWN0Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJrZXkiLCJfdHlwZW9mIiwiQXJyYXkiLCJpc0FycmF5IiwibWF4aW11bVJlc3BvbnNlcyIsInByb3RvdHlwZSIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiZmlsdGVyT3B0aW9ucyIsIndhcm4iLCJ0eXBlIiwiYmJveCIsImJib3gySnNvbiIsImNpcmNsZSIsImNpcmNsZTJKc29uIiwicG9seWdvbiIsInBvbHlnb24ySnNvbiIsIngiLCJsb24iLCJ5IiwibGF0Iiwic3JzIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwiaHR0cE1ldGhvZCIsImdlb2NvZGVNZXRob2QiLCJyZXR1cm5UcnVlR2VvbWV0cnkiLCJtYXhSZXNwIiwicmVxdWVzdCIsIkdlb2NvZGVSZXF1ZXN0RmFjdG9yeSIsImJ1aWxkIiwiY2FsbCIsIkVycm9yU2VydmljZSIsImFuYWx5emVSZXNwb25zZSIsInJlc3BvbnNlIiwicmF3UmVzcG9uc2UiLCJvbkVycm9yIiwib25TdWNjZXNzIiwic2NvcGUiLCJHZW9jb2RlUmVzcG9uc2VGYWN0b3J5IiwiY29vcmRpbmF0ZXMiLCJs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QixPQUFPLENBQUNoQixNQUFNLEVBQUUsRUFBRUQsQ0FBQyxFQUFFO0lBQ3JDaUQsUUFBUSxDQUFDTixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUNPLElBQUksQ0FBQyxDQUFDakMsT0FBTyxDQUFDakIsQ0FBQyxDQUFDLENBQUNtQixDQUFDLEVBQUVGLE9BQU8sQ0FBQ2pCLENBQUMsQ0FBQyxDQUFDcUIsQ0FBQyxDQUFDLENBQUM7RUFDOUQ7RUFFQSxPQUFPNEIsUUFBUTtBQUNuQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBNUUsY0FBYyxDQUFDOEUsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDO0FBRXZCOUUsNkVBQWMiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvR2VvY29kZS9SZXZlcnNlR2VvY29kZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBHZW9jb2RlUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9HZW9jb2RlUmVxdWVzdEZhY3RvcnlcIjtcbmltcG9ydCBHZW9jb2RlUmVzcG9uc2VGYWN0b3J5IGZyb20gXCIuL1Jlc3BvbnNlL0dlb2NvZGVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGRlIGfDqW9jb2RhZ2UgaW52ZXJzZSBkdSBHw6lvcG9ydGFpbCA6XG4gKiAgICAgZW52b2kgZGUgbGEgcmVxdcOqdGUgY29uc3RydWl0ZSBzZWxvbiBsZXMgcGFyYW3DqHRyZXMgZW4gb3B0aW9ucyxcbiAqICAgICDDqXZlbnR1ZWxsZW1lbnQgcGFyc2luZyBldCBhbmFseXNlICBkZSBsYSByw6lwb25zZSxcbiAqICAgICByZXRvdXIgZCd1bmUgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZSBkZSBsYSBmb25jdGlvbiBvblN1Y2Nlc3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtHcC5TZXJ2aWNlcy5Db21tb25TZXJ2aWNlfVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJldmVyc2VHZW9jb2RlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHNww6ljaWZpcXVlcyBhdSBzZXJ2aWNlICgrIGxlcyBvcHRpb25zIGhlcml0w6llcylcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wb3NpdGlvbiAtIFBvc2l0aW9uIGR1IHBvaW50IGRlIHLDqWbDqXJlbmNlIHBvdXIgbGUgY2FsY3VsIGRlIHByb3hpbWl0w6kgZXhwcmltw6llIGRhbnMgbGUgc3lzdMOobWUgZGUgcsOpZsOpcmVuY2Ugc3DDqWNpZmnDqSBwYXIgbGUgc3JzLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxvbiAtIExvbmdpdHVkZSBkdSBwb2ludCBkZSByw6lmw6lyZW5jZSBwb3VyIGxlIGNhbGN1bCBkZSBwcm94aW1pdMOpLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxhdCAtIExhdGl0dWRlIGR1IHBvaW50IGRlIHLDqWbDqXJlbmNlIHBvdXIgbGUgY2FsY3VsIGRlIHByb3hpbWl0w6kuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpbHRlcnNdIC0gTGVzIHByb3ByacOpdMOpcyBwb3NzaWJsZXMgZGUgY2V0IG9iamV0LlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmZpbHRlcnMuW3Byb3ByaWV0ZXMgZHUgZmlsdHJlXV0gLSBDcml0w6hyZSBzdXBwbMOpbWVudGFpcmUgcG91ciBmaWx0cmVyIGxhIHJlY2hlcmNoZSBzb3VzIGxhIGZvcm1lXG4gKiAgICAgIGQndW4gY291cGxlIGNsw6kvdmFsZXVyIMOgIGTDqWZpbmlyIHNlbG9uIGxlcyBwb3NzaWJpbGl0w6lzIGR1IHNlcnZldXIgYWpvdXTDqSDDoCBsYSByZXF1w6p0ZS5cbiAqICAgICAgTGUgc2VydmljZSBkZSBnw6lvY29kYWdlIGR1IEfDqW9wb3J0YWlsIHBlcm1ldCBkZSBmaWx0cmVyIGxlcyBhZHJlc3NlcyBwb3N0YWxlcyBhdmVjIGxlcyBwcm9wcmnDqXTDqXMgOlxuICogICAgICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIsIFwiY2l0eVwiLlxuICogICAgICBJbCBwZXJtZXQgw6lnYWxlbWVudCBkZSBmaWx0cmVyIGxlcyB0b3BvbnltZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiLCBcInR5cGVcIi5cbiAqICAgICAgRW5maW4sIGlsIHBlcm1ldCBkZSBmaWx0cmVyIGxlcyBwYXJjZWxsZXMgY2FkYXN0cmFsZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIDpcbiAqICAgICAgICAgIFwiY29kZURlcGFydGVtZW50XCIsIFwiY29kZUNvbW11bmVcIiwgXCJub21Db21tdW5lXCIsIFwiY29kZUNvbW11bmVBYnNcIiwgXCJjb2RlQXJyb25kaXNzZW1lbnRcIiwgXCJzZWN0aW9uXCIsIFwibnVtZXJvXCIsIFwiZmV1aWxsZVwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zZWFyY2hHZW9tZXRyeV0gLSBFbXByaXNlIGRhbnMgbGFxdWVsbGUgb24gc291aGFpdGUgZWZmZWN0dWVyIGxhIHJlY2hlcmNoZS5cbiAqICAgICAgTGVzIHByb3ByacOpdMOpcyBwb3NzaWJsZXMgZGUgY2V0IG9iamV0IHNvbnQgZMOpY3JpdGVzIGNpLWFwcsOocy5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkudHlwZSAgIC0gVHlwZSBkZSBnw6lvbWV0cmllIChQb2ludHxDaXJjbGV8TGluZXN0cmluZ3xQb2x5Z29uKVxuICogICAgICBAcGFyYW0ge0FycmF5LjxGbG9hdD58QXJyYXkuQXJyYXkuPEZsb2F0Pn0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5jb29yZGluYXRlcyAtIENvb3Jkb25uw6llcyBkZXMgcG9pbnRzIGNvbnN0aXR1YW50IGxhIGfDqW9tw6l0cmllLlxuICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnNlYXJjaEdlb21ldHJ5LnJhZGl1cyAgICAtIFJheW9uLiBQYXJhbcOodHJlIGFwcGxpY2FibGUgdW5pcXVlbWVudCBwb3VyIGxlIHR5cGUgJ0NpcmNsZScuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmluZGV4ID0gXCJTdHJlZXRBZGRyZXNzXCJdIC0gVHlwZSBkZSBsJ29iamV0IHJlY2hlcmNow6kuXG4gKiAgICAgIExlIHNlcnZpY2UgZGUgZ8Opb2NvZGFnZSBkdSBHw6lvcG9ydGFpbCBwZXJtZXQgZGUgcmVjaGVyY2hlciBkZXMgJ1Bvc2l0aW9uT2ZJbnRlcmVzdCcgcG91ciBkZXMgdG9wb255bWVzLCBkZXMgJ1N0cmVldEFkZHJlc3MnXG4gKiAgICAgIHBvdXIgZGVzIGFkcmVzc2VzIHBvc3RhbGVzIG91IGRlcyAnQ2FkYXN0cmFsUGFyY2VsJyBwb3VyIGRlcyBwYXJjZWxsZXMgY2FkYXN0cmFsZXMuIEwnaW5kZXggJ2xvY2F0aW9uJyBwZXJtZXQgdW5lIHJlY2hlcmNoZVxuICogICAgICBtdWx0aS1pbmRleGVzIGVuIHJlZ3JvdXBhbnQgbGVzIGluZGV4ZXMgJ1Bvc2l0aW9uT2ZJbnRlcmVzdCcgZXQgJ1N0cmVldEFkZHJlc3MnLlxuICogICAgICBEJ2F1dHJlcyB0eXBlcyBwb3Vycm9udCDDqnRyZSByYWpvdXTDqXMgc2Vsb24gbCfDqXZvbHV0aW9uIGR1IHNlcnZpY2UuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBpbmRleCA9ICdTdHJlZXRBZGRyZXNzJy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4aW11bVJlc3BvbnNlc10gLSBOb21icmUgZGUgcsOpcG9uc2VzIG1heGltYWwgcXVlIGwnb24gc291aGFpdGUgcmVjZXZvaXIuXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgcGFyIGTDqWZhdXQuIFNpIGxlIHNlcnZldXIgY29uc3VsdMOpIGVzdCBjZWx1aSBkdSBHw6lvcG9ydGFpbCwgbGEgdmFsZXVyIHBhciBkw6lmYXV0IHNlcmEgZG9uYyBjZWxsZSBkdSBzZXJ2aWNlIDogMjBzLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV0dXJuVHJ1ZUdlb21ldHJ5XSAtIEJvb2zDqWVuIGluZGlxdWFudCBzaSBsJ29uIHNvdWhhaXRlIHLDqWN1cMOpcmVyIGxhIGfDqW9tw6l0cmllIHZyYWllIGRlcyBvYmplY3RzIGfDqW9sb2NhbGlzw6lzLlxuICogICAgICBmYWxzZSBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgb3B0aW9ucyA9IHtcbiAqICAgICAgYXBpS2V5IDogbnVsbCxcbiAqICAgICAgc2VydmVyVXJsIDogJ2h0dHA6Ly9sb2NhbGhvc3Qvc2VydmljZS8nLFxuICogICAgICBwcm94eVVSTCA6IG51bGwsXG4gKiAgICAgIHRpbWVPdXQgOiAxMDAwMCwgLy8gbXNcbiAqICAgICAgcmF3UmVzcG9uc2UgOiBmYWxzZSwgLy8gdHJ1ZXxmYWxzZVxuICogICAgICBzY29wZSA6IG51bGwsIC8vIHRoaXNcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICBpbmRleCA6ICdTdHJlZXRBZGRyZXNzJyxcbiAqICAgICAgc2VhcmNoR2VvbWV0cnkgOiB7XG4gKiAgICAgICAgICB0eXBlIDogQ2lyY2xlLFxuICogICAgICAgICAgY29vcmRpbmF0ZXMgOiBbNDgsIDJdLFxuICogICAgICAgICAgcmFkaXVzIDogMTAwXG4gKiAgICAgIH0sXG4gKiAgICAgIHBvc2l0aW9uIDoge2xvbjoyICwgbGF0OjQ4LjV9LFxuICogICAgICBtYXhpbXVtUmVzcG9uc2VzIDogMjUsXG4gKiAgIH07XG4gKlxuICovXG5mdW5jdGlvbiBSZXZlcnNlR2VvY29kZSAob3B0aW9uc18pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmV2ZXJzZUdlb2NvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXy5nZXRNZXNzYWdlKFwiQ0xBU1NfQ09OU1RSVUNUT1JcIiwgXCJSZXZlcnNlR2VvY29kZVwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICogRklYTUUgaW5zdGFuY2Ugb3UgY2xhc3NlID9cbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUmV2ZXJzZUdlb2NvZGVcIjtcblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIkdwLlNlcnZpY2VzLlJldmVyc2VHZW9jb2RlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBSZXZlcnNlR2VvY29kZSAob3B0aW9ucyldXCIpO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLnBhdGNoT3B0aW9uQ29udmVydG9yKG9wdGlvbnNfKTtcbiAgICBpZiAoIW9wdGlvbnMuc2VydmVyVXJsKSB7XG4gICAgICAgIG9wdGlvbnMuc2VydmVyVXJsID0gRGVmYXVsdFVybFNlcnZpY2UuUmV2ZXJzZUdlb2NvZGUubmV3VXJsKCk7XG4gICAgICAgIGlmIChvcHRpb25zLm9sZFJldmVyc2VTZXJ2aWNlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnNlcnZlclVybCA9IERlZmF1bHRVcmxTZXJ2aWNlLlJldmVyc2VHZW9jb2RlLnVybCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwZWwgZHUgY29uc3RydWN0ZXVyIHBhciBoZXJpdGFnZVxuICAgIENvbW1vblNlcnZpY2UuYXBwbHkodGhpcywgW29wdGlvbnNdKTtcblxuICAgIGlmICghb3B0aW9ucy5zZWFyY2hHZW9tZXRyeSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwic2VhcmNoR2VvbWV0cnlcIikpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEdlb21ldHJ5ID0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeTtcbiAgICB9XG5cbiAgICAvLyBvbiBkZWZpbml0IGwnaW5kZXggcGFyIGRlZmF1dFxuICAgIGlmICghb3B0aW9ucy5pbmRleCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmluZGV4ID0gXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmlsdGVycykge1xuICAgICAgICB2YXIgZmlsdGVyID0gT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWx0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBmaWx0ZXJbaV07XG4gICAgICAgICAgICAvLyBvbiBzdXBwcmltZSBsZXMgZmlsdHJlcyB2aWRlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlcnNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXJzW2tleV0gPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzW2tleV0pLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuZmlsdGVyc1trZXldID09PSBcInN0cmluZ1wiICYmIG9wdGlvbnMuZmlsdGVyc1trZXldLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbHRlcnNba2V5XSkgJiYgb3B0aW9ucy5maWx0ZXJzW2tleV0ubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5maWx0ZXJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgIHRoaXMub3B0aW9ucy5pbmRleCA9IG9wdGlvbnMuaW5kZXggfHwgXCJTdHJlZXRBZGRyZXNzXCI7XG4gICAgdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMgPSBvcHRpb25zLm1heGltdW1SZXNwb25zZXMgfHwgMjA7XG59XG5cbi8qKlxuICogQGxlbmRzIG1vZHVsZTpSZXZlcnNlR2VvY29kZSNcbiAqL1xuUmV2ZXJzZUdlb2NvZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21tb25TZXJ2aWNlLnByb3RvdHlwZSwge1xuICAgIC8vIHRvZG9cbiAgICAvLyBnZXR0ZXIvc2V0dGVyXG59KTtcblxuLypcbiAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJldmVyc2VHZW9jb2RlO1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc18gLSBvcHRpb25zIGR1IHNlcnZpY2VcbiAqIEByZXR1cm4ge09iamVjdH0gLSBvcHRpb25zXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5wYXRjaE9wdGlvbkNvbnZlcnRvciA9IGZ1bmN0aW9uIChvcHRpb25zXykge1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uc187XG5cbiAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zJyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMudHlwZScgaXMgZGVwcmVjYXRlZFwiKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsdGVyT3B0aW9ucy50eXBlKSAmJiBvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluZGV4ID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zLnR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucy50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5iYm94KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAnZmlsdGVyT3B0aW9ucy5iYm94JyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNlYXJjaEdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gY29udmVydGlyIGxhIGdlb21ldHJpZVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkgPSB0aGlzLmJib3gySnNvbihvcHRpb25zLmZpbHRlck9wdGlvbnMuYmJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5maWx0ZXJPcHRpb25zLmJib3g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLmNpcmNsZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRoZSBwYXJhbWV0ZXIgJ2ZpbHRlck9wdGlvbnMuY2lyY2xlJyBpcyBkZXByZWNhdGVkXCIpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNlYXJjaEdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gY29udmVydGlyIGxhIGdlb21ldHJpZVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkgPSB0aGlzLmNpcmNsZTJKc29uKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5jaXJjbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5jaXJjbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJPcHRpb25zLnBvbHlnb24pIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdmaWx0ZXJPcHRpb25zLnBvbHlnb24nIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2VhcmNoR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0aXIgbGEgZ2VvbWV0cmllXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hHZW9tZXRyeSA9IHRoaXMucG9seWdvbjJKc29uKG9wdGlvbnMuZmlsdGVyT3B0aW9ucy5wb2x5Z29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmZpbHRlck9wdGlvbnMucG9seWdvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKG9wdGlvbnMuZmlsdGVyT3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXJzID0gb3B0aW9ucy5maWx0ZXJPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi54KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiVGhlIHBhcmFtZXRlciAncG9zaXRpb24ueCcgaXMgZGVwcmVjYXRlZFwiKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBvc2l0aW9uLmxvbikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24ubG9uID0gb3B0aW9ucy5wb3NpdGlvbi54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMucG9zaXRpb24ueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdwb3NpdGlvbi55JyBpcyBkZXByZWNhdGVkXCIpO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucG9zaXRpb24ubGF0KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wb3NpdGlvbi5sYXQgPSBvcHRpb25zLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5wb3NpdGlvbi55O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3JzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUaGUgcGFyYW1ldGVyICdzcnMnIGlzIGRlcHJlY2F0ZWRcIik7XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnNycztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5idWlsZFJlcXVlc3QgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgaHR0cE1ldGhvZCA6IHRoaXMub3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAvLyBvcHRpb25zIHNwZWNpZmlxdWVzIGR1IHNlcnZpY2VcbiAgICAgICAgZ2VvY29kZU1ldGhvZCA6IFwicmV2ZXJzZVwiLFxuICAgICAgICBzZWFyY2hHZW9tZXRyeSA6IHRoaXMub3B0aW9ucy5zZWFyY2hHZW9tZXRyeSxcbiAgICAgICAgaW5kZXggOiB0aGlzLm9wdGlvbnMuaW5kZXgsXG4gICAgICAgIHBvc2l0aW9uIDogdGhpcy5vcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICByZXR1cm5UcnVlR2VvbWV0cnkgOiB0aGlzLm9wdGlvbnMucmV0dXJuVHJ1ZUdlb21ldHJ5LFxuICAgICAgICBtYXhSZXNwIDogdGhpcy5vcHRpb25zLm1heGltdW1SZXNwb25zZXMsXG4gICAgICAgIGZpbHRlcnMgOiB0aGlzLm9wdGlvbnMuZmlsdGVyc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBHZW9jb2RlUmVxdWVzdEZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG5cbiAgICAvLyBvbiB0ZXN0ZSBzaSBsYSByZXF1ZXRlIGEgYmllbiDDqXTDqSBjb25zdHJ1aXRlICFcbiAgICAoIXRoaXMucmVxdWVzdClcbiAgICAgICAgPyBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoXy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVFVRVNUX0JVSUxEXCIpKSlcbiAgICAgICAgOiBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIHJhd1Jlc3BvbnNlIDogdGhpcy5vcHRpb25zLnJhd1Jlc3BvbnNlLFxuICAgICAgICAgICAgb25FcnJvciA6IGVycm9yLFxuICAgICAgICAgICAgb25TdWNjZXNzIDogc3VjY2VzcyxcbiAgICAgICAgICAgIHNjb3BlIDogdGhpc1xuICAgICAgICB9O1xuXG4gICAgICAgIEdlb2NvZGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFBhdGNoIHBvdXIgbGEgY29udmVydGlvbiBkZXMgb3B0aW9ucyB2ZXJzIGxlIG5vdXZlYXUgZm9ybWFsaXNtZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBiYm94IC0gYmJveFxuICogQHJldHVybiB7T2JqZWN0fSAtIGdlb21ldHJpZSBhdSBmb3JtYXQganNvblxuICovXG5SZXZlcnNlR2VvY29kZS5wcm90b3R5cGUuYmJveDJKc29uID0gZnVuY3Rpb24gKGJib3gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlIDogXCJQb2x5Z29uXCIsXG4gICAgICAgIGNvb3JkaW5hdGVzIDogW1tcbiAgICAgICAgICAgIFtiYm94LmxlZnQsIGJib3gudG9wXSxcbiAgICAgICAgICAgIFtiYm94LnJpZ2h0LCBiYm94LnRvcF0sXG4gICAgICAgICAgICBbYmJveC5yaWdodCwgYmJveC5ib3R0b21dLFxuICAgICAgICAgICAgW2Jib3gubGVmdCwgYmJveC5ib3R0b21dLFxuICAgICAgICAgICAgW2Jib3gubGVmdCwgYmJveC50b3BdXG4gICAgICAgIF1dXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaXJjbGUgLSBjaXJjbGVcbiAqIEByZXR1cm4ge09iamVjdH0gLSBnZW9tZXRyaWUgYXUgZm9ybWF0IGpzb25cbiAqL1xuUmV2ZXJzZUdlb2NvZGUucHJvdG90eXBlLmNpcmNsZTJKc29uID0gZnVuY3Rpb24gKGNpcmNsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUgOiBcIkNpcmNsZVwiLFxuICAgICAgICByYWRpdXMgOiBjaXJjbGUucmFkaXVzLFxuICAgICAgICBjb29yZGluYXRlcyA6IFtjaXJjbGUueCwgY2lyY2xlLnldXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGF0Y2ggcG91ciBsYSBjb252ZXJ0aW9uIGRlcyBvcHRpb25zIHZlcnMgbGUgbm91dmVhdSBmb3JtYWxpc21lLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBvbHlnb24gLSBwb2x5Z29uXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gZ2VvbWV0cmllIGF1IGZvcm1hdCBqc29uXG4gKi9cblJldmVyc2VHZW9jb2RlLnByb3RvdHlwZS5wb2x5Z29uMkpzb24gPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHZhciBqc29uR2VvbSA9IHtcbiAgICAgICAgdHlwZSA6IFwiUG9seWdvblwiLFxuICAgICAgICBjb29yZGluYXRlcyA6IFtbXV1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGpzb25HZW9tLmNvb3JkaW5hdGVzWzBdLnB1c2goW3BvbHlnb25baV0ueCwgcG9seWdvbltpXS55XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb25HZW9tO1xufTtcblxuLyoqXG4gKiBDb2RlcyBFUFNHIGfDqW9ncmFwaGlxdWVzIChsYXQvbG9uKS4gVXRpbGVzIGNhciBsZXMgY29vcmRvbm7DqWVzIGRvaXZlbnQgw6p0cmUgaW52ZXJzw6llcy5cbiAqL1xuUmV2ZXJzZUdlb2NvZGUuZ2VvRVBTRyA9IFtcIkVQU0c6NDMyNlwiXTtcblxuZXhwb3J0IGRlZmF1bHQgUmV2ZXJzZUdlb2NvZGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Geocode/ReverseGeocode.js\n"); + +/***/ }), + +/***/ "./src/Services/ProcessIsoCurve/ProcessIsoCurve.js": +/*!*********************************************************!*\ + !*** ./src/Services/ProcessIsoCurve/ProcessIsoCurve.js ***! + \*********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/ProcessIsoCurveRequest */ \"./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js\");\n/* harmony import */ var _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/ProcessIsoCurveResponseFactory */ \"./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'isochrone/distance du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @alias Gp.Services.ProcessIsoCurve\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut.\n *\n * @param {Object} options.position - Point de départ du calcul.\n * Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance.\n * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance.\n *\n * @param {String} options.srs - Projection.\n * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et\n * dans lequel la géométrie de la courbe résultante sera exprimée.\n * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ».\n *\n * @param {String} [options.graph = \"voiture\"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »).\n * La valeur par défaut est : «voiture»\n *\n * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints.\n * Critères d'exclusions à appliquer pour le calcul.\n * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte\n * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).\n *\n * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement \"banned\".\n * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement \"wayType\".\n * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement \"=\".\n * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement \"autoroute\".\n *\n * @param {String} [options.method = \"time\"] - Méthode utilisée pour le calcul de la courbe iso.\n * Les valeurs possible sont \"time\" pour un calcul d'isochrone, \"distance\" pour un calcul d'isodistance.\n * Pas de valeur spécifié équivaut à un calcul d'isochrone.\n *\n * @param {String} [options.distanceUnit = \"m\"] - Indique si la distance doit être exprimée en km ou m dans la réponse (\"m\" or \"km\").\n *\n * @param {String} [options.timeUnit = \"second\"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse (\"standard\", \"second\", \"minute\", \"hour\"). Il peut-être formatté hh:mm::ss avec la valeur standard.\n *\n * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ».\n * Ce paramètre doit être renseigné si l'option \"méthod\" a la valeur \"time\".\n * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné.\n *\n * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ».\n * Ce paramètre doit être renseigné si l'option \"méthod\" a la valeur \"DISTANCE\".\n * Si l'option \"method\" n'est pas renseignée, ce paramètre sera ignoré.\n *\n * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.\n * Par défaut, la valeur « false » est appliquée.\n *\n * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier.\n * Par défaut, la valeur « false » est appliquée.\n *\n * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »).\n * Par défaut, la valeur « false » est appliquée.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'JSONP', // JSONP|XHR\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * position : {\n * x : 2.3242664298058053,\n * y : 48.86118017324745\n * },\n * distance : 200,\n * [time : ]\n * method : \"distance\",\n * graph : \"voiture\",\n * reverse : false\n * };\n */\n\nfunction ProcessIsoCurve(options) {\n if (!(this instanceof ProcessIsoCurve)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"ProcessIsoCurve\"));\n }\n\n /**\n * Nom de la classe (heritage)\n * FIXME instance ou classe ?\n */\n this.CLASSNAME = \"ProcessIsoCurve\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.ProcessIsoCurve\");\n this.logger.trace(\"[Constructeur ProcessIsoCurve (options)]\");\n if (!options.position) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.position.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position.x\"));\n }\n if (options.position.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"position.y\"));\n }\n if (!options.time && !options.distance) {\n throw new Error(\"Parameter (s) 'distance' missing. Parameter time to calculate an isochrone, parameter distance for an isodistance\");\n }\n\n // si on a que le paramètre \"distance\" en entrée, on calcule une isodistance.\n // Le paramètre \"méthode\" doit pour avoir une réponse du service, être passé à \"distance\"\n if (!options.time && options.distance) {\n this.options.method = \"distance\";\n // on supprime l'éventuel attribut time, résidu d'un appel antérieur\n if (this.options.time) {\n delete this.options.time;\n }\n }\n\n // si on a que le paramètre \"time\" en entrée, on calcule une isochrone.\n // Le paramètre \"méthode\" doit pour avoir une réponse du service, être passé à \"time\"\n if (options.time && !options.distance) {\n this.options.method = \"time\";\n // on supprime l'éventuel attribut time, résidu d'un appel antérieur\n if (this.options.distance) {\n delete this.options.distance;\n }\n }\n\n // au cas où on a ni l'un, ni l'autre...\n this.options.method = this.options.method || \"time\";\n\n // options par defaut du service\n // TODO: modifier la ressource lors de la mise en production du service\n this.options.resource = options.resource || \"bdtopo-iso\";\n this.options.exclusions = options.exclusions || [];\n this.options.reverse = options.reverse || false;\n this.options.srs = options.srs || \"EPSG:4326\";\n this.options.distanceUnit = options.distanceUnit || \"m\";\n this.options.timeUnit = options.timeUnit || \"second\";\n\n // options depreciees\n if (options.smoothing) {\n this.logger.warn(\"options.smoothing is DEPRECATED\");\n }\n this.options.smoothing = false;\n if (options.holes) {\n this.logger.warn(\"options.holes is DEPRECATED\");\n }\n this.options.holes = false;\n\n // Gestion du graphe\n if (options.graph) {\n if (options.graph === \"Voiture\") {\n this.options.graph = \"car\";\n }\n if (options.graph === \"Pieton\") {\n this.options.graph = \"pedestrian\";\n }\n } else {\n this.options.graph = \"car\";\n }\n\n // Gestions des contraintes\n this.options.constraints = [];\n if (options.constraints) {\n if (Array.isArray(options.constraints)) {\n for (var k = 0; k < options.constraints.length; k++) {\n this.options.constraints.push(options.constraints[k]);\n }\n } else {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"constraints\"));\n }\n }\n\n // Gestion de l'ancien paramètre exclusions\n var constraintTunnel = {};\n var constraintPont = {};\n var constraintAutoroute = {};\n if (options.exclusions) {\n if (options.exclusions.length !== 0) {\n this.logger.warn(\"options.exclusions is DEPRECATED !!\");\n for (var c = 0; c < options.exclusions.length; c++) {\n if (typeof options.exclusions[c] === \"string\") {\n options.exclusions[c] = options.exclusions[c].toLowerCase();\n } else {\n // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions\n continue;\n }\n if (options.exclusions[c] === \"toll\") {\n constraintAutoroute.constraintType = \"banned\";\n constraintAutoroute.key = \"wayType\";\n constraintAutoroute.operator = \"=\";\n constraintAutoroute.value = \"autoroute\";\n this.options.constraints.push(constraintAutoroute);\n }\n if (options.exclusions[c] === \"tunnel\") {\n constraintTunnel.constraintType = \"banned\";\n constraintTunnel.key = \"wayType\";\n constraintTunnel.operator = \"=\";\n constraintTunnel.value = \"tunnel\";\n this.options.constraints.push(constraintTunnel);\n }\n if (options.exclusions[c] === \"bridge\") {\n constraintPont.constraintType = \"banned\";\n constraintPont.key = \"wayType\";\n constraintPont.operator = \"=\";\n constraintPont.value = \"pont\";\n this.options.constraints.push(constraintPont);\n }\n }\n }\n }\n\n // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.\n this.options.outputFormat = typeof options.outputFormat === \"string\" ? options.outputFormat.toLowerCase() : \"json\";\n if (options.outputFormat && options.outputFormat !== \"json\") {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_NOT_SUPPORT\", \"outputFormat\"));\n }\n this.options.outputFormat = \"json\";\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n if (!this.options.serverUrl) {\n // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone\n /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl();\n if (this.options.oldIsoService) {\n urlFound = DefaultUrlService.ProcessIsoCurve.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone\n var urlFound = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].ProcessIsoCurve.url();\n if (!urlFound) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = urlFound;\n this.logger.trace(\"Serveur URL par defaut : \" + this.options.serverUrl);\n }\n}\n\n/**\n * @lends module:ProcessIsoCurve#\n */\nProcessIsoCurve.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nProcessIsoCurve.prototype.constructor = ProcessIsoCurve;\n\n/**\n * Création de la requête (overwrite)\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nProcessIsoCurve.prototype.buildRequest = function (error, success) {\n try {\n var oIsoCurve = new _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__[\"default\"](this.options);\n if (!oIsoCurve.processRequestString()) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\"));\n }\n this.request = oIsoCurve.requestString;\n } catch (e) {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](e.message));\n return;\n }\n success.call(this, this.request);\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} onError - callback des erreurs\n * @param {Function} onSuccess - callback de succès de l'analyse de la réponse\n */\nProcessIsoCurve.prototype.analyzeResponse = function (onError, onSuccess) {\n if (this.response) {\n var options = {\n response: this.response,\n outputFormat: this.options.outputFormat,\n rawResponse: this.options.rawResponse,\n onSuccess: onSuccess,\n onError: onError,\n scope: this\n };\n _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurve);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUHJvY2Vzc0lzb0N1cnZlLmpzP2M1MDEiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJwb3NpdGlvbiIsIkVycm9yIiwieCIsInkiLCJ0aW1lIiwiZGlzdGFuY2UiLCJtZXRob2QiLCJyZXNvdXJjZSIsImV4Y2x1c2lvbnMiLCJyZXZlcnNlIiwic3JzIiwiZGlzdGFuY2VVbml0IiwidGltZVVuaXQiLCJzbW9vdGhpbmciLCJ3YXJuIiwiaG9sZXMiLCJncmFwaCIsImNvbnN0cmFpbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiayIsImxlbmd0aCIsInB1c2giLCJjb25zdHJhaW50VHVubmVsIiwiY29uc3RyYWludFBvbnQiLCJjb25zdHJhaW50QXV0b3JvdXRlIiwiYyIsInRvTG93ZXJDYXNlIiwiY29uc3RyYWludFR5cGUiLCJrZXkiLCJvcGVyYXRvciIsInZhbHVlIiwib3V0cHV0Rm9ybWF0Iiwic2VydmVyVXJsIiwidXJsRm91bmQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwib0lzb0N1cnZlIiwiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCIsInByb2Nlc3NSZXF1ZXN0U3RyaW5nIiwicmVxdWVzdCIsInJlcXVlc3RTdHJpbmciLCJlIiwiY2FsbCIsIkVycm9yU2VydmljZSIsIm1lc3NhZ2UiLCJhbmFseXplUmVzcG9uc2UiLCJvbkVycm9yIiwib25TdWNjZXNzIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIs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QyxPQUFPLEVBQUVDLFNBQVMsRUFBRTtFQUN0RSxJQUFJLElBQUksQ0FBQ0MsUUFBUSxFQUFFO0lBQ2YsSUFBSXBFLE9BQU8sR0FBRztNQUNWb0UsUUFBUSxFQUFHLElBQUksQ0FBQ0EsUUFBUTtNQUN4QnhCLFlBQVksRUFBRyxJQUFJLENBQUM1QyxPQUFPLENBQUM0QyxZQUFZO01BQ3hDeUIsV0FBVyxFQUFHLElBQUksQ0FBQ3JFLE9BQU8sQ0FBQ3FFLFdBQVc7TUFDdENGLFNBQVMsRUFBR0EsU0FBUztNQUNyQkQsT0FBTyxFQUFHQSxPQUFPO01BQ2pCSSxLQUFLLEVBQUc7SUFDWixDQUFDO0lBRURDLGdGQUE4QixDQUFDQyxLQUFLLENBQUN4RSxPQUFPLENBQUM7RUFDakQsQ0FBQyxNQUFNO0lBQ0hrRSxPQUFPLENBQUNKLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQzdELGdFQUFDLENBQUNDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7RUFDaEY7QUFDSixDQUFDO0FBRWNKLDhFQUFlIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1Byb2Nlc3NJc29DdXJ2ZS9Qcm9jZXNzSXNvQ3VydmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IF8gZnJvbSBcIi4uLy4uL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzXCI7XG5pbXBvcnQgRXJyb3JTZXJ2aWNlIGZyb20gXCIuLi8uLi9FeGNlcHRpb25zL0Vycm9yU2VydmljZVwiO1xuaW1wb3J0IENvbW1vblNlcnZpY2UgZnJvbSBcIi4uL0NvbW1vblNlcnZpY2VcIjtcbmltcG9ydCBEZWZhdWx0VXJsU2VydmljZSBmcm9tIFwiLi4vRGVmYXVsdFVybFNlcnZpY2VcIjtcbmltcG9ydCBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0IGZyb20gXCIuL1JlcXVlc3QvUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdFwiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlRmFjdG9yeSBmcm9tIFwiLi9SZXNwb25zZS9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGQnaXNvY2hyb25lL2Rpc3RhbmNlIGR1IEfDqW9wb3J0YWlsIDpcbiAqICAgICBlbnZvaSBkZSBsYSByZXF1w6p0ZSBjb25zdHJ1aXRlIHNlbG9uIGxlcyBwYXJhbcOodHJlcyBlbiBvcHRpb25zLFxuICogICAgIMOpdmVudHVlbGxlbWVudCBwYXJzaW5nIGV0IGFuYWx5c2UgIGRlIGxhIHLDqXBvbnNlLFxuICogICAgIHJldG91ciBkJ3VuZSByw6lwb25zZSBlbiBwYXJhbcOodHJlIGRlIGxhIGZvbmN0aW9uIG9uU3VjY2Vzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0dwLlNlcnZpY2VzLkNvbW1vblNlcnZpY2V9XG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUHJvY2Vzc0lzb0N1cnZlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgc3DDqWNpZmlxdWVzIGF1IHNlcnZpY2UgKCsgbGVzIG9wdGlvbnMgaGVyaXTDqWVzKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnJlc291cmNlIC0gTGEgcmVzc291cmNlIHV0aWxpc8OpZSBwb3VyIGxlIGNhbGN1bC4gQ2UgcGFyYW3DqHRyZSBkZXZyYWl0IMOqdHJlIG9ibGlnYXRvaXJlIGNhciBpbCBsJ2VzdCBkYW5zIGwnYXBwZWwgYXUgc2VydmljZS4gTWFpcyBpbCBuZSBsJ2VzdCBwYXMgcG91ciBkZXMgcmFpc29ucyBkZSByw6l0cm9jb21wYXRpYmlsaXTDqS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5vdXRwdXRGb3JtYXQgLSBMZSBmb3JtYXQgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZSBpc28gOiAnanNvbicgdW5pcXVlbWVudCBldCBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5wb3NpdGlvbiAtIFBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsLlxuICogICAgICBDb29yZG9ubsOpZXMgZXhwcmltw6llcyBlbiBsb25naXR1ZGVzLCBsYXRpdHVkZXMgKEVQU0c6NDMyNilcbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi54IC0gQWJjaXNzZSBkdSBwb2ludCBkZSBkw6lwYXJ0IGR1IGNhbGN1bCBkJ2lzb2Nocm9uZS9kaXN0YW5jZS5cbiAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi55IC0gT3Jkb25uw6llIGR1IHBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsIGQnaXNvY2hyb25lL2Rpc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnNycyAtIFByb2plY3Rpb24uXG4gKiAgICAgIFN5c3TDqG1lIGRlIGNvb3Jkb25uw6llcyBkYW5zIGxlcXVlbCBsZXMgY29vcmRvbm7DqWVzIGR1IHBvaW50IMKrIGxvY2F0aW9uIMK7IHNvbnQgZXhwcmltw6llcyBldFxuICogICAgICBkYW5zIGxlcXVlbCBsYSBnw6lvbcOpdHJpZSBkZSBsYSBjb3VyYmUgcsOpc3VsdGFudGUgc2VyYSBleHByaW3DqWUuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBsZSBzeXN0w6htZSBkZSBjb29yZG9ubsOpZXMgdXRpbGlzw6kgc2VyYSDCqyBFUFNHOjQzMjYgwrsuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJ2b2l0dXJlXCJdIC0gTm9tIGR1IGdyYXBoZSDDoCB1dGlsaXNlciBwb3VyIGxlIGNhbGN1bCAowqsgUGlldG9uIMK7IG91IMKrIFZvaXR1cmUgwrspLlxuICogICAgICBMYSB2YWxldXIgcGFyIGTDqWZhdXQgZXN0IDogwqt2b2l0dXJlwrtcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBbb3B0aW9ucy5leGNsdXNpb25zXSAtIERFUFJFQ0FURUQ6IENlIHBhcmFtw6h0cmUgZXN0IGNvbnNlcnbDqSBwb3VyIHVuZSByw6l0cm9jb21wYXRpYmlsaXTDqSBkZSBsJ2FwaS4gTGUgbm91dmVhdSBwYXJhbcOodHJlIMOgIHV0aWxpc2VyIGVzdCBvcHRpb25zLmNvbnN0cmFpbnRzLlxuICogICAgICBDcml0w6hyZXMgZCdleGNsdXNpb25zIMOgIGFwcGxpcXVlciBwb3VyIGxlIGNhbGN1bC5cbiAqICAgICAgT24gcHLDqWNpc2UgaWNpIGxlIHR5cGUgZGUgdHJvbsOnb25zIHF1ZSBsJ29uIG5lIHZldXQgcGFzIHF1ZSBsJ2lzb2Nocm9uZS9kaXN0YW5jZSBlbXBydW50ZVxuICogICAgICAodmFsZXVycyBwb3NzaWJsZXMgOiDCqyB0b2xsIMK7ICjDqXZpdGVyIGxlcyBww6lhZ2VzKSwgwqsgYnJpZGdlIMK7LCDCqyB0dW5uZWwgwrspLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmNvbnN0cmFpbnRzXSAtIENyaXTDqHJlcyBkZSBjb250cmFpbnRlcyDDoCBhcHBsaXF1ZXIgc3VyIHVuIGl0aW7DqXJhaXJlLiBMZXMgdmFsZXVycyBkaXNwb25pYmxlcyBkw6lwZW5kZW50IGRlIGxhIHJlc3NvdXJjZSB1dGlsaXPDqWUuIElsIGVzdCBkb25jIHV0aWxlIGRlIHJlZ2FyZGVyIGxlIGdldENhcGFiaWxpdGllcy5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmNvbnN0cmFpbnRUeXBlXSAtIFR5cGUgZGUgbGEgY29udHJhaW50ZS4gR8OpbsOpcmFsZW1lbnQgXCJiYW5uZWRcIi5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmtleV0gLSBDbMOpIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwid2F5VHlwZVwiLlxuICogICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMub3BlcmF0b3JdIC0gT3DDqXJhdGV1ciBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcIj1cIi5cbiAqICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLnZhbHVlXSAtIFZhbGV1ciBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcImF1dG9yb3V0ZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXRob2QgPSBcInRpbWVcIl0gLSBNw6l0aG9kZSB1dGlsaXPDqWUgcG91ciBsZSBjYWxjdWwgZGUgbGEgY291cmJlIGlzby5cbiAqICAgICAgTGVzIHZhbGV1cnMgcG9zc2libGUgc29udCBcInRpbWVcIiBwb3VyIHVuIGNhbGN1bCBkJ2lzb2Nocm9uZSwgXCJkaXN0YW5jZVwiIHBvdXIgdW4gY2FsY3VsIGQnaXNvZGlzdGFuY2UuXG4gKiAgICAgIFBhcyBkZSB2YWxldXIgc3DDqWNpZmnDqSDDqXF1aXZhdXQgw6AgdW4gY2FsY3VsIGQnaXNvY2hyb25lLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kaXN0YW5jZVVuaXQgPSBcIm1cIl0gLSBJbmRpcXVlIHNpIGxhIGRpc3RhbmNlIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIGttIG91IG0gZGFucyBsYSByw6lwb25zZSAoXCJtXCIgb3IgXCJrbVwiKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGltZVVuaXQgPSBcInNlY29uZFwiXSAtIEluZGlxdWUgc2kgbGEgZHVyw6llIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIHNlY29uZGUsIG1pbnV0ZSBvdSBoZXVyZSBkYW5zIGxhIHLDqXBvbnNlIChcInN0YW5kYXJkXCIsIFwic2Vjb25kXCIsIFwibWludXRlXCIsIFwiaG91clwiKS4gSWwgcGV1dC3DqnRyZSBmb3JtYXR0w6kgaGg6bW06OnNzIGF2ZWMgbGEgdmFsZXVyIHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7RmxvYXR9IG9wdGlvbnMudGltZSAtIER1csOpZSBtYXhpbXVtIChleHByaW3DqWUgZW4gc2Vjb25kZXMpIMOgIHV0aWxpc2VyIHBvdXIgbGUgY2FsY3VsIGRlIGxhIGNvdXJiZSDDoCBwYXJ0aXIgZHUgb3UganVzcXUnYXUgcG9pbnQgwqsgbG9jYXRpb24gwrsuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZG9pdCDDqnRyZSByZW5zZWlnbsOpIHNpIGwnb3B0aW9uIFwibcOpdGhvZFwiIGEgbGEgdmFsZXVyIFwidGltZVwiLlxuICogICAgICBTaSBsJ29wdGlvbiBtZXRob2Qgbidlc3QgcGFzIHJlbnNlaWduw6llLCBjZSBwYXJhbcOodHJlIGRvaXQgw6p0cmUgcmVuc2VpZ27DqS5cbiAqXG4gKiBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLmRpc3RhbmNlIC0gRGlzdGFuY2UgbWF4aW11bSAoZXhwcmltw6llIGVuIG1ldHJlcykgw6AgdXRpbGlzZXIgcG91ciBsZSBjYWxjdWwgZGUgbGEgY291cmJlIMOgIHBhcnRpciBkdSBvdSBqJ3VzcXUnYXUgcG9pbnQgwqsgbG9jYXRpb24gwrsuXG4gKiAgICAgIENlIHBhcmFtw6h0cmUgZG9pdCDDqnRyZSByZW5zZWlnbsOpIHNpIGwnb3B0aW9uIFwibcOpdGhvZFwiIGEgbGEgdmFsZXVyIFwiRElTVEFOQ0VcIi5cbiAqICAgICAgU2kgbCdvcHRpb24gXCJtZXRob2RcIiBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUsIGNlIHBhcmFtw6h0cmUgc2VyYSBpZ25vcsOpLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV2ZXJzZSA9IGZhbHNlXSAtIEluZGlxdWUgc2kgbGEgZ8Opb23DqXRyaWUgcsOpc3VsdGFudGUgZG9pdCDDqnRyZSBsaXNzw6llICjCqyB0cnVlIMK7KSBwb3VyIG5lIHBhcyBhdm9pciBkJ2VmZmV0IGQnZXNjYWxpZXIuXG4gKiAgICAgIFBhciBkw6lmYXV0LCBsYSB2YWxldXIgwqsgZmFsc2UgwrsgZXN0IGFwcGxpcXXDqWUuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zbW9vdGhpbmcgPSBmYWxzZV0gLSBJbmRpcXVlIHNpIGxhIGfDqW9tw6l0cmllIHLDqXN1bHRhbnRlIGRvaXQgw6p0cmUgbGlzc8OpZSAowqsgdHJ1ZSDCuykgcG91ciBuZSBwYXMgYXZvaXIgZCdlZmZldCBkJ2VzY2FsaWVyLlxuICogICAgICBQYXIgZMOpZmF1dCwgbGEgdmFsZXVyIMKrIGZhbHNlIMK7IGVzdCBhcHBsaXF1w6llLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZXMgPSBmYWxzZV0gLSBJbmRpcXVlIHNpIGxhIGfDqW9tw6l0cmllIHLDqXN1bHRhbnRlIChzdXJmYWNlKSBkb2l0IMOqdHJlIHJldG91cm7DqWUgYXZlYyBkZXMgdHJvdXMgKMKrIHRydWUgwrspLlxuICogICAgICBQYXIgZMOpZmF1dCwgbGEgdmFsZXVyIMKrIGZhbHNlIMK7IGVzdCBhcHBsaXF1w6llLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBvcHRpb25zID0ge1xuICogICAgICAvLyBvcHRpb25zIGNvbW11bmVzIGF1eCBzZXJ2aWNlc1xuICogICAgICBhcGlLZXkgOiBudWxsLFxuICogICAgICBzZXJ2ZXJVcmwgOiAnaHR0cDovL2xvY2FsaG9zdC9zZXJ2aWNlLycsXG4gKiAgICAgIHByb3RvY29sIDogJ0pTT05QJywgLy8gSlNPTlB8WEhSXG4gKiAgICAgIHByb3h5VVJMIDogbnVsbCxcbiAqICAgICAgaHR0cE1ldGhvZCA6ICdHRVQnLCAvLyBHRVR8UE9TVFxuICogICAgICB0aW1lT3V0IDogMTAwMDAsIC8vIG1zXG4gKiAgICAgIHJhd1Jlc3BvbnNlIDogZmFsc2UsIC8vIHRydWV8ZmFsc2VcbiAqICAgICAgc2NvcGUgOiBudWxsLCAvLyB0aGlzXG4gKiAgICAgIG9uU3VjY2VzcyA6IGZ1bmN0aW9uIChyZXNwb25zZSkge30sXG4gKiAgICAgIG9uRmFpbHVyZSA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gKiAgICAgIC8vIHNww6ljaWZpcXVlIGF1IHNlcnZpY2VcbiAqICAgICAgcG9zaXRpb24gOiB7XG4gKiAgICAgICAgICAgeCA6IDIuMzI0MjY2NDI5ODA1ODA1MyxcbiAqICAgICAgICAgICB5IDogNDguODYxMTgwMTczMjQ3NDVcbiAqICAgICAgfSxcbiAqICAgICAgZGlzdGFuY2UgOiAyMDAsXG4gKiAgICAgIFt0aW1lIDogXVxuICogICAgICBtZXRob2QgOiBcImRpc3RhbmNlXCIsXG4gKiAgICAgIGdyYXBoIDogXCJ2b2l0dXJlXCIsXG4gKiAgICAgIHJldmVyc2UgOiBmYWxzZVxuICogIH07XG4gKi9cblxuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlIChvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb2Nlc3NJc29DdXJ2ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIlByb2Nlc3NJc29DdXJ2ZVwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9tIGRlIGxhIGNsYXNzZSAoaGVyaXRhZ2UpXG4gICAgICogRklYTUUgaW5zdGFuY2Ugb3UgY2xhc3NlID9cbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUHJvY2Vzc0lzb0N1cnZlXCI7XG5cbiAgICAvLyBhcHBlbCBkdSBjb25zdHJ1Y3RldXIgcGFyIGhlcml0YWdlXG4gICAgQ29tbW9uU2VydmljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiR3AuU2VydmljZXMuUHJvY2Vzc0lzb0N1cnZlXCIpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBQcm9jZXNzSXNvQ3VydmUgKG9wdGlvbnMpXVwiKTtcblxuICAgIGlmICghb3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcInBvc2l0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvLyBvbiBsYW5jZSB1bmUgZXhjZXB0aW9uIGFmaW4gZCdldml0ZXIgYXUgc2VydmljZSBkZSBsZSBmYWlyZS4uLlxuICAgIGlmIChvcHRpb25zLnBvc2l0aW9uLnggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJwb3NpdGlvbi54XCIpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3NpdGlvbi55ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwicG9zaXRpb24ueVwiKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnRpbWUgJiYgIW9wdGlvbnMuZGlzdGFuY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIChzKSAnZGlzdGFuY2UnIG1pc3NpbmcuIFBhcmFtZXRlciB0aW1lIHRvIGNhbGN1bGF0ZSBhbiBpc29jaHJvbmUsIHBhcmFtZXRlciBkaXN0YW5jZSBmb3IgYW4gaXNvZGlzdGFuY2VcIik7XG4gICAgfVxuXG4gICAgLy8gc2kgb24gYSBxdWUgbGUgcGFyYW3DqHRyZSBcImRpc3RhbmNlXCIgZW4gZW50csOpZSwgb24gY2FsY3VsZSB1bmUgaXNvZGlzdGFuY2UuXG4gICAgLy8gTGUgcGFyYW3DqHRyZSBcIm3DqXRob2RlXCIgZG9pdCBwb3VyIGF2b2lyIHVuZSByw6lwb25zZSBkdSBzZXJ2aWNlLCDDqnRyZSBwYXNzw6kgw6AgXCJkaXN0YW5jZVwiXG4gICAgaWYgKCFvcHRpb25zLnRpbWUgJiYgb3B0aW9ucy5kaXN0YW5jZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0aG9kID0gXCJkaXN0YW5jZVwiO1xuICAgICAgICAvLyBvbiBzdXBwcmltZSBsJ8OpdmVudHVlbCBhdHRyaWJ1dCB0aW1lLCByw6lzaWR1IGQndW4gYXBwZWwgYW50w6lyaWV1clxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRpbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNpIG9uIGEgcXVlIGxlIHBhcmFtw6h0cmUgXCJ0aW1lXCIgZW4gZW50csOpZSwgb24gY2FsY3VsZSB1bmUgaXNvY2hyb25lLlxuICAgIC8vIExlIHBhcmFtw6h0cmUgXCJtw6l0aG9kZVwiIGRvaXQgcG91ciBhdm9pciB1bmUgcsOpcG9uc2UgZHUgc2VydmljZSwgw6p0cmUgcGFzc8OpIMOgIFwidGltZVwiXG4gICAgaWYgKG9wdGlvbnMudGltZSAmJiAhb3B0aW9ucy5kaXN0YW5jZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0aG9kID0gXCJ0aW1lXCI7XG4gICAgICAgIC8vIG9uIHN1cHByaW1lIGwnw6l2ZW50dWVsIGF0dHJpYnV0IHRpbWUsIHLDqXNpZHUgZCd1biBhcHBlbCBhbnTDqXJpZXVyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuZGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhdSBjYXMgb8O5IG9uIGEgbmkgbCd1biwgbmkgbCdhdXRyZS4uLlxuICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kIHx8IFwidGltZVwiO1xuXG4gICAgLy8gb3B0aW9ucyBwYXIgZGVmYXV0IGR1IHNlcnZpY2VcbiAgICAvLyBUT0RPOiBtb2RpZmllciBsYSByZXNzb3VyY2UgbG9ycyBkZSBsYSBtaXNlIGVuIHByb2R1Y3Rpb24gZHUgc2VydmljZVxuICAgIHRoaXMub3B0aW9ucy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2UgfHwgXCJiZHRvcG8taXNvXCI7XG4gICAgdGhpcy5vcHRpb25zLmV4Y2x1c2lvbnMgPSBvcHRpb25zLmV4Y2x1c2lvbnMgfHwgW107XG4gICAgdGhpcy5vcHRpb25zLnJldmVyc2UgPSBvcHRpb25zLnJldmVyc2UgfHwgZmFsc2U7XG4gICAgdGhpcy5vcHRpb25zLnNycyA9IG9wdGlvbnMuc3JzIHx8IFwiRVBTRzo0MzI2XCI7XG4gICAgdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCA9IG9wdGlvbnMuZGlzdGFuY2VVbml0IHx8IFwibVwiO1xuICAgIHRoaXMub3B0aW9ucy50aW1lVW5pdCA9IG9wdGlvbnMudGltZVVuaXQgfHwgXCJzZWNvbmRcIjtcblxuICAgIC8vIG9wdGlvbnMgZGVwcmVjaWVlc1xuICAgIGlmIChvcHRpb25zLnNtb290aGluZykge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwib3B0aW9ucy5zbW9vdGhpbmcgaXMgREVQUkVDQVRFRFwiKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnNtb290aGluZyA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmhvbGVzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmhvbGVzIGlzIERFUFJFQ0FURURcIik7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5ob2xlcyA9IGZhbHNlO1xuXG4gICAgLy8gR2VzdGlvbiBkdSBncmFwaGVcbiAgICBpZiAob3B0aW9ucy5ncmFwaCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ncmFwaCA9PT0gXCJWb2l0dXJlXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ncmFwaCA9IFwiY2FyXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3JhcGggPT09IFwiUGlldG9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ncmFwaCA9IFwicGVkZXN0cmlhblwiO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJjYXJcIjtcbiAgICB9XG5cbiAgICAvLyBHZXN0aW9ucyBkZXMgY29udHJhaW50ZXNcbiAgICB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5jb25zdHJhaW50cykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBvcHRpb25zLmNvbnN0cmFpbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2gob3B0aW9ucy5jb25zdHJhaW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcImNvbnN0cmFpbnRzXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlc3Rpb24gZGUgbCdhbmNpZW4gcGFyYW3DqHRyZSBleGNsdXNpb25zXG4gICAgdmFyIGNvbnN0cmFpbnRUdW5uZWwgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludFBvbnQgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludEF1dG9yb3V0ZSA9IHt9O1xuICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmV4Y2x1c2lvbnMgaXMgREVQUkVDQVRFRCAhIVwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0aW9ucy5leGNsdXNpb25zLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGNsdXNpb25zW2NdID0gb3B0aW9ucy5leGNsdXNpb25zW2NdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbmUgY3LDqWUgcGFzIHVuZSBlcnJldXIgcG91ciByw6l0cm8tY29tcGF0aWJpbGl0w6kgYXZlYyBsZXMgYW5jaWVubmVzIHZlcnNpb25zXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcInRvbGxcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5rZXkgPSBcIndheVR5cGVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5vcGVyYXRvciA9IFwiPVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLnZhbHVlID0gXCJhdXRvcm91dGVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludEF1dG9yb3V0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwidHVubmVsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC5jb25zdHJhaW50VHlwZSA9IFwiYmFubmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwub3BlcmF0b3IgPSBcIj1cIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC52YWx1ZSA9IFwidHVubmVsXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRUdW5uZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcImJyaWRnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFBvbnQua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250Lm9wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LnZhbHVlID0gXCJwb250XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRQb250KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbiBwYXNzZSBsJ29wdGlvbiBvdXRwdXRGb3JtYXQgZW4gbWludXNjdWxlcyBhZmluIGQnw6l2aXRlciBkZXMgZXhjZXB0aW9ucy5cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLm91dHB1dEZvcm1hdCA9PT0gXCJzdHJpbmdcIikgPyBvcHRpb25zLm91dHB1dEZvcm1hdC50b0xvd2VyQ2FzZSgpIDogXCJqc29uXCI7XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0Rm9ybWF0ICYmIG9wdGlvbnMub3V0cHV0Rm9ybWF0ICE9PSBcImpzb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTk9UX1NVUFBPUlRcIiwgXCJvdXRwdXRGb3JtYXRcIikpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMub3V0cHV0Rm9ybWF0ID0gXCJqc29uXCI7XG5cbiAgICAvLyBnZXN0aW9uIGRlIGwndXJsIGR1IHNlcnZpY2UgcGFyIGRlZmF1dFxuICAgIC8vIHNpIGwndXJsIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgaWwgZmF1dCB1dGlsaXNlciBsZXMgdXJscyBwYXIgZGVmYXV0XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VydmVyVXJsKSB7XG4gICAgICAgIC8vIENvZGUgY29tbWVudMOpIDogUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdpc29jaHJvbmVcbiAgICAgICAgLyogdmFyIHVybEZvdW5kID0gRGVmYXVsdFVybFNlcnZpY2UuUHJvY2Vzc0lzb0N1cnZlLm5ld1VybCgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9sZElzb1NlcnZpY2UpIHtcbiAgICAgICAgICAgIHVybEZvdW5kID0gRGVmYXVsdFVybFNlcnZpY2UuUHJvY2Vzc0lzb0N1cnZlLnVybCgpO1xuICAgICAgICB9ICovXG4gICAgICAgIC8vIFJlbGVhc2UgYmV0YSBzZXJ2aWNlcyBESUZGVVNJT04gdW5pcXVlbWVudCA6IG9uIHRhcGUgc3VyIGwnYW52Y2llbiBzZXJ2aWNlIGQnaXNvY2hyb25lXG4gICAgICAgIHZhciB1cmxGb3VuZCA9IERlZmF1bHRVcmxTZXJ2aWNlLlByb2Nlc3NJc29DdXJ2ZS51cmwoKTtcbiAgICAgICAgaWYgKCF1cmxGb3VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXJsIGJ5IGRlZmF1bHQgbm90IGZvdW5kICFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnNlcnZlclVybCA9IHVybEZvdW5kO1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlNlcnZldXIgVVJMIHBhciBkZWZhdXQgOiBcIiArIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGVuZHMgbW9kdWxlOlByb2Nlc3NJc29DdXJ2ZSNcbiAqL1xuUHJvY2Vzc0lzb0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5Qcm9jZXNzSXNvQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHJvY2Vzc0lzb0N1cnZlO1xuXG4vKipcbiAqIENyw6lhdGlvbiBkZSBsYSByZXF1w6p0ZSAob3ZlcndyaXRlKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblByb2Nlc3NJc29DdXJ2ZS5wcm90b3R5cGUuYnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yLCBzdWNjZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9Jc29DdXJ2ZSA9IG5ldyBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0KHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmICghb0lzb0N1cnZlLnByb2Nlc3NSZXF1ZXN0U3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFUVVFU1RfQlVJTERcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gb0lzb0N1cnZlLnJlcXVlc3RTdHJpbmc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvci5jYWxsKHRoaXMsIG5ldyBFcnJvclNlcnZpY2UoZS5tZXNzYWdlKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzLmNhbGwodGhpcywgdGhpcy5yZXF1ZXN0KTtcbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3MgLSBjYWxsYmFjayBkZSBzdWNjw6hzIGRlIGwnYW5hbHlzZSBkZSBsYSByw6lwb25zZVxuICovXG5Qcm9jZXNzSXNvQ3VydmUucHJvdG90eXBlLmFuYWx5emVSZXNwb25zZSA9IGZ1bmN0aW9uIChvbkVycm9yLCBvblN1Y2Nlc3MpIHtcbiAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlIDogdGhpcy5yZXNwb25zZSxcbiAgICAgICAgICAgIG91dHB1dEZvcm1hdCA6IHRoaXMub3B0aW9ucy5vdXRwdXRGb3JtYXQsXG4gICAgICAgICAgICByYXdSZXNwb25zZSA6IHRoaXMub3B0aW9ucy5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgIG9uU3VjY2VzcyA6IG9uU3VjY2VzcyxcbiAgICAgICAgICAgIG9uRXJyb3IgOiBvbkVycm9yLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzXG4gICAgICAgIH07XG5cbiAgICAgICAgUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzSXNvQ3VydmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/ProcessIsoCurve.js\n"); + +/***/ }), + +/***/ "./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js": +/*!************************************************************************!*\ + !*** ./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/ProcessIsoCurveParam */ \"./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance.\n * Les requêtes peuvent être en mode GET ou POST,\n * et le format de sorti est en JSON.\n *\n * @constructor\n * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest\n * @param {Object} options - options\n *\n * @example\n * var options = {\n * httpMethod : 'GET', // GET|POST\n * // spécifique au service\n * position : {\n * x : 2.3242664298058053,\n * y : 48.86118017324745\n * },\n * graph : \"car\",\n * method : 'time',\n * time : 1000, //distance : 200\n * reverse : false,\n * srs : 'EPSG:4326'\n * };\n *\n * try {\n *\n * var oIsoCurve = new ProcessIsoCurveRequest (options);\n * if (!oIsoCurve.processRequestString ()) {\n * // error\n * }\n *\n * var request = oIsoCurve.requestString;\n *\n * } catch (e) {\n * // error\n * }\n * @private\n */\nfunction ProcessIsoCurveRequest(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"ProcessIsoCurveRequest\");\n this.logger.trace(\"[Constructeur ProcessIsoCurveRequest ()]\");\n if (!(this instanceof ProcessIsoCurveRequest)) {\n throw new TypeError(\"ProcessIsoCurveRequest constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /**\n * Liste des options\n */\n this.settings = options;\n\n /**\n * Mode HTPP.\n * Par defaut, \"GET\".\n * @type {String}\n */\n this.mode = this.settings.httpMethod || \"GET\";\n}\nProcessIsoCurveRequest.prototype = {\n /**\n * @lends module:ProcessIsoCurveRequest#\n */\n\n /**\n * Requête\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: ProcessIsoCurveRequest,\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out :\n * // (http://wxs.ign.fr/KEY/isochrone?)\n * // resource=&\n * // point=&\n * // costValue=&\n * // costType=&\n * // profile=&\n * // constraints=&\n * // direction=&\n * // crs=\n *\n * // POST out :\n * {\n * resource: \"bduni-idf-pgr\",\n * point: \"2.337306,48.849319\",\n * costValue: 100,\n * costType: \"time\",\n * profile: \"car\",\n * constraints: [{\n * constraintType: \"banned\",\n * key: \"ways_type\",\n * operator: \"=\",\n * value: \"autoroute\"\n * }]\n * }\n *\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n var request = \"\";\n var i = 0;\n switch (this.mode) {\n case \"GET\":\n this.logger.trace(\"Process GET Request\");\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n for (i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n break;\n case \"POST\":\n this.logger.trace(\"Process POST Request\");\n // creation du JSON\n var postRequest = {};\n postRequest.resource = this.settings.resource;\n postRequest.point = this.settings.position.x + \",\" + this.settings.position.y;\n if (this.settings.method === \"distance\") {\n postRequest.costType = \"distance\";\n postRequest.costValue = this.settings.distance;\n } else {\n postRequest.costType = \"time\";\n postRequest.costValue = this.settings.time;\n }\n postRequest.profile = this.settings.graph;\n if (this.settings.reverse) {\n postRequest.direction = \"arrival\";\n } else {\n postRequest.direction = \"departure\";\n }\n postRequest.constraints = this.settings.constraints;\n postRequest.distanceUnit = this.settings.distanceUnit;\n postRequest.timeUnit = this.settings.timeUnit;\n postRequest.crs = this.settings.srs;\n\n // conversion en chaîne de caractères\n request = JSON.stringify(postRequest);\n break;\n default:\n this.logger.error(\"No other HTTP method supported by the service !\");\n }\n this.logger.trace(request);\n this.requestString = request;\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveRequest);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0LmpzPzcwMzQiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCIsIm9wdGlvbnMiLCJsb2dnZXIiLCJMb2dnZXIiLCJnZXRMb2dnZXIiLCJ0cmFjZSIsIlR5cGVFcnJvciIsIkVycm9yIiwiXyIsImdldE1lc3NhZ2UiLCJzZXR0aW5ncyIsIm1vZGUiLCJodHRwTWV0aG9kIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJyZXF1ZXN0IiwiaSIsIm9QYXJhbXMiLCJQcm9jZXNzSXNvQ3VydmVQYXJhbSIsInBhcmFtcyIsImdldFBhcmFtcyIsImxlbmd0aCIsIm8iLCJrIiwidiIsInBvc3RSZXF1ZXN0IiwicmVzb3VyY2UiLCJwb2ludCIsInBvc2l0aW9uIiwieCIsInkiLCJtZXRob2QiLCJjb3N0VHlwZSIsImNvc3RWYWx1ZSIsImRpc3RhbmNlIiwidGltZSIsInByb2ZpbGUiLCJncmFwaCIsInJldmVyc2UiLCJkaXJlY3Rpb24iLCJjb25zdHJhaW50cyIsImRpc3RhbmNlVW5pdCIsInRpbWVVbml0IiwiY3JzIiwic3JzIiwiSlNPTiIsInN0cmluZ2lmeSIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFvRDtBQUNIO0FBQ2U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLHNCQUFzQkEs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LFNBQVMsR0FBRyxJQUFJLENBQUN6QixRQUFRLENBQUMyQixJQUFJO1FBQzlDO1FBRUFWLFdBQVcsQ0FBQ1csT0FBTyxHQUFHLElBQUksQ0FBQzVCLFFBQVEsQ0FBQzZCLEtBQUs7UUFFekMsSUFBSSxJQUFJLENBQUM3QixRQUFRLENBQUM4QixPQUFPLEVBQUU7VUFDdkJiLFdBQVcsQ0FBQ2MsU0FBUyxHQUFHLFNBQVM7UUFDckMsQ0FBQyxNQUFNO1VBQ0hkLFdBQVcsQ0FBQ2MsU0FBUyxHQUFHLFdBQVc7UUFDdkM7UUFFQWQsV0FBVyxDQUFDZSxXQUFXLEdBQUcsSUFBSSxDQUFDaEMsUUFBUSxDQUFDZ0MsV0FBVztRQUVuRGYsV0FBVyxDQUFDZ0IsWUFBWSxHQUFHLElBQUksQ0FBQ2pDLFFBQVEsQ0FBQ2lDLFlBQVk7UUFFckRoQixXQUFXLENBQUNpQixRQUFRLEdBQUcsSUFBSSxDQUFDbEMsUUFBUSxDQUFDa0MsUUFBUTtRQUU3Q2pCLFdBQVcsQ0FBQ2tCLEdBQUcsR0FBRyxJQUFJLENBQUNuQyxRQUFRLENBQUNvQyxHQUFHOztRQUVuQztRQUNBN0IsT0FBTyxHQUFHOEIsSUFBSSxDQUFDQyxTQUFTLENBQUNyQixXQUFXLENBQUM7UUFDckM7TUFFSjtRQUNJLElBQUksQ0FBQ3pCLE1BQU0sQ0FBQytDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztJQUM1RTtJQUVBLElBQUksQ0FBQy9DLE1BQU0sQ0FBQ0csS0FBSyxDQUFDWSxPQUFPLENBQUM7SUFDMUIsSUFBSSxDQUFDSCxhQUFhLEdBQUdHLE9BQU87SUFFNUIsT0FBTyxJQUFJLENBQUNILGFBQWE7RUFDN0I7QUFDSixDQUFDO0FBRWNkLHFGQUFzQiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBfIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZVBhcmFtIGZyb20gXCIuL21vZGVsL1Byb2Nlc3NJc29DdXJ2ZVBhcmFtXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBzdXIgbGUgc2VydmljZSBkZSBjYWxjdWwgZCdpc29zY2hyb25lL2lzb2Rpc3RhbmNlLlxuICogIExlcyByZXF1w6p0ZXMgcGV1dmVudCDDqnRyZSBlbiBtb2RlIEdFVCBvdSBQT1NULFxuICogIGV0IGxlIGZvcm1hdCBkZSBzb3J0aSBlc3QgZW4gSlNPTi5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Qcm9jZXNzSXNvQ3VydmUuUmVxdWVzdC5Qcm9jZXNzSXNvQ3VydmVSZXF1ZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIGh0dHBNZXRob2QgOiAnR0VUJywgLy8gR0VUfFBPU1RcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICBwb3NpdGlvbiA6IHtcbiAqICAgICAgICAgIHggOiAyLjMyNDI2NjQyOTgwNTgwNTMsXG4gKiAgICAgICAgICB5IDogNDguODYxMTgwMTczMjQ3NDVcbiAqICAgICAgfSxcbiAqICAgICAgZ3JhcGggOiBcImNhclwiLFxuICogICAgICBtZXRob2QgOiAndGltZScsXG4gKiAgICAgIHRpbWUgOiAxMDAwLCAvL2Rpc3RhbmNlIDogMjAwXG4gKiAgICAgIHJldmVyc2UgOiBmYWxzZSxcbiAqICAgICAgc3JzIDogJ0VQU0c6NDMyNidcbiAqICB9O1xuICpcbiAqIHRyeSB7XG4gKlxuICogICAgICB2YXIgb0lzb0N1cnZlID0gbmV3IFByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QgKG9wdGlvbnMpO1xuICogICAgICBpZiAoIW9Jc29DdXJ2ZS5wcm9jZXNzUmVxdWVzdFN0cmluZyAoKSkge1xuICogICAgICAgICAgLy8gZXJyb3JcbiAqICAgICAgfVxuICpcbiAqICAgICAgdmFyIHJlcXVlc3QgPSBvSXNvQ3VydmUucmVxdWVzdFN0cmluZztcbiAqXG4gKiB9IGNhdGNoIChlKSB7XG4gKiAgICAgIC8vIGVycm9yXG4gKiB9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0IChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdFwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCAoKV1cIik7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGUgZGVzIG9wdGlvbnNcbiAgICAgKi9cbiAgICB0aGlzLnNldHRpbmdzID0gb3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIE1vZGUgSFRQUC5cbiAgICAgKiBQYXIgZGVmYXV0LCBcIkdFVFwiLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5odHRwTWV0aG9kIHx8IFwiR0VUXCI7XG59XG5cblByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpQcm9jZXNzSXNvQ3VydmVSZXF1ZXN0I1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmVxdcOqdGVcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIHJlcXVlc3RTdHJpbmcgOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0ZXVyIChhbGlhcylcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciA6IFByb2Nlc3NJc29DdXJ2ZVJlcXVlc3QsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rpb24gZGUgbGEgcmVxdcOqdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEdFVCAgb3V0IDpcbiAgICAgKiAgIC8vICAoaHR0cDovL3d4cy5pZ24uZnIvS0VZL2lzb2Nocm9uZT8pXG4gICAgICogICAvLyAgcmVzb3VyY2U9JlxuICAgICAqICAgLy8gIHBvaW50PSZcbiAgICAgKiAgIC8vICBjb3N0VmFsdWU9JlxuICAgICAqICAgLy8gIGNvc3RUeXBlPSZcbiAgICAgKiAgIC8vICBwcm9maWxlPSZcbiAgICAgKiAgIC8vICBjb25zdHJhaW50cz0mXG4gICAgICogICAvLyAgZGlyZWN0aW9uPSZcbiAgICAgKiAgIC8vICBjcnM9XG4gICAgICpcbiAgICAgKiAvLyBQT1NUIG91dCA6XG4gICAgICoge1xuICAgICAqICByZXNvdXJjZTogXCJiZHVuaS1pZGYtcGdyXCIsXG4gICAgICogIHBvaW50OiBcIjIuMzM3MzA2LDQ4Ljg0OTMxOVwiLFxuICAgICAqICBjb3N0VmFsdWU6IDEwMCxcbiAgICAgKiAgY29zdFR5cGU6IFwidGltZVwiLFxuICAgICAqICBwcm9maWxlOiBcImNhclwiLFxuICAgICAqICBjb25zdHJhaW50czogW3tcbiAgICAgKiAgICAgIGNvbnN0cmFpbnRUeXBlOiBcImJhbm5lZFwiLFxuICAgICAqICAgICAga2V5OiBcIndheXNfdHlwZVwiLFxuICAgICAqICAgICAgb3BlcmF0b3I6IFwiPVwiLFxuICAgICAqICAgICAgdmFsdWU6IFwiYXV0b3JvdXRlXCJcbiAgICAgKiAgfV1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXF1ZXN0ID0gXCJcIjtcbiAgICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwiR0VUXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJQcm9jZXNzIEdFVCBSZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgLy8gTWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGxlIHNlcnZpY2UgZGUgbCdBUEkgUkVTVFxuICAgICAgICAgICAgICAgIHZhciBvUGFyYW1zID0gbmV3IFByb2Nlc3NJc29DdXJ2ZVBhcmFtKHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBvUGFyYW1zLmdldFBhcmFtcygpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHBhcmFtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgKz0gXCImXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIlBPU1RcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlByb2Nlc3MgUE9TVCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgIC8vIGNyZWF0aW9uIGR1IEpTT05cbiAgICAgICAgICAgICAgICB2YXIgcG9zdFJlcXVlc3QgPSB7fTtcblxuICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LnJlc291cmNlID0gdGhpcy5zZXR0aW5ncy5yZXNvdXJjZTtcblxuICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LnBvaW50ID0gdGhpcy5zZXR0aW5ncy5wb3NpdGlvbi54ICsgXCIsXCIgKyB0aGlzLnNldHRpbmdzLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tZXRob2QgPT09IFwiZGlzdGFuY2VcIikge1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VHlwZSA9IFwiZGlzdGFuY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuY29zdFZhbHVlID0gdGhpcy5zZXR0aW5ncy5kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VHlwZSA9IFwidGltZVwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jb3N0VmFsdWUgPSB0aGlzLnNldHRpbmdzLnRpbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QucHJvZmlsZSA9IHRoaXMuc2V0dGluZ3MuZ3JhcGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5yZXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LmRpcmVjdGlvbiA9IFwiYXJyaXZhbFwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0LmRpcmVjdGlvbiA9IFwiZGVwYXJ0dXJlXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuY29uc3RyYWludHMgPSB0aGlzLnNldHRpbmdzLmNvbnN0cmFpbnRzO1xuXG4gICAgICAgICAgICAgICAgcG9zdFJlcXVlc3QuZGlzdGFuY2VVbml0ID0gdGhpcy5zZXR0aW5ncy5kaXN0YW5jZVVuaXQ7XG5cbiAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC50aW1lVW5pdCA9IHRoaXMuc2V0dGluZ3MudGltZVVuaXQ7XG5cbiAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdC5jcnMgPSB0aGlzLnNldHRpbmdzLnNycztcblxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gZW4gY2hhw65uZSBkZSBjYXJhY3TDqHJlc1xuICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeShwb3N0UmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJObyBvdGhlciBIVFRQIG1ldGhvZCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2UgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLnJlcXVlc3RTdHJpbmcgPSByZXF1ZXN0O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RTdHJpbmc7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc0lzb0N1cnZlUmVxdWVzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js\n"); + +/***/ }), + +/***/ "./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js": +/*!****************************************************************************!*\ + !*** ./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n *\n * Classe de gestion des param. des requêtes du service de calcul des iso.\n * Permet le mapping avec les options du service.\n *\n * @constructor\n * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam\n * @param {Object} options - options\n * @private\n *\n */\nfunction ProcessIsoCurveParam(options) {\n if (!(this instanceof ProcessIsoCurveParam)) {\n throw new TypeError(\"ProcessIsoCurveParam constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur ProcessIsoCurveParam ()]\");\n\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // mapping des options avec l'API REST\n\n /** Identifiant de l’isochrone */\n this.id = this.options.id;\n\n /** Resource */\n this.resource = this.options.resource;\n\n /** Coordonnées de départ (ou arrivée si le reverse est à true). */\n this.point = this.options.position;\n\n /** projection (code EPSG comme epsg:4326 ou wgs84) */\n this.crs = this.options.srs;\n\n /**\n * Profil de véhicule à utiliser pour le calcul.\n * Voiture ou Pieton\n */\n this.profile = this.options.graph;\n\n /** Liste des règles de restrictions à utiliser */\n this.constraints = this.options.constraints;\n this.reverse = this.options.reverse;\n this.timeUnit = this.options.timeUnit;\n this.distanceUnit = this.options.distanceUnit;\n\n /**\n * \"time\" pour isochrone ou \"distance\" for isodistance.\n * Par defaut, time...\n */\n if (this.options.method === \"distance\") {\n this.costType = \"distance\";\n this.costValue = this.options.distance;\n } else {\n this.costType = \"time\";\n this.costValue = this.options.time;\n }\n}\n\n/**\n * CLASSNAME\n */\nProcessIsoCurveParam.CLASSNAME = \"ProcessIsoCurveParam\";\nProcessIsoCurveParam.prototype = {\n /**\n * @lends module:ProcessIsoCurveParam#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: ProcessIsoCurveParam,\n /**\n * Retourne le point\n * @returns {String} x,y\n */\n getLocation: function getLocation() {\n return this.point.x + \",\" + this.point.y;\n },\n /**\n * Retourne l'unité de la distance\n * @returns {String}\n */\n getDistanceUnit: function getDistanceUnit() {\n if (this.distanceUnit === \"m\") {\n return \"meter\";\n }\n if (this.distanceUnit === \"km\") {\n return \"kilometer\";\n }\n return \"\";\n },\n /**\n * Retourne la liste des contraintes\n * @returns {String}\n */\n getConstraints: function getConstraints() {\n var constraintArray = [];\n if (this.constraints.length !== 0) {\n for (var k = 0; k < this.constraints.length; k++) {\n constraintArray.push(JSON.stringify(this.constraints[k]));\n }\n }\n return constraintArray.join(\"|\");\n },\n /**\n * Retourne la direction\n * @returns {String}\n */\n getDirection: function getDirection() {\n if (this.reverse) {\n return \"arrival\";\n } else {\n return \"departure\";\n }\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Object[]} KVP\n */\nProcessIsoCurveParam.prototype.getParams = function () {\n var map = [];\n map.push({\n k: \"resource\",\n v: this.resource\n });\n map.push({\n k: \"point\",\n v: this.getLocation()\n });\n map.push({\n k: \"direction\",\n v: this.getDirection()\n });\n map.push({\n k: \"costType\",\n v: this.costType\n });\n map.push({\n k: \"costValue\",\n v: this.costValue\n });\n map.push({\n k: \"profile\",\n v: this.profile\n });\n map.push({\n k: \"timeUnit\",\n v: this.timeUnit\n });\n map.push({\n k: \"distanceUnit\",\n v: this.getDistanceUnit()\n });\n if (this.crs) {\n map.push({\n k: \"crs\",\n v: this.crs\n });\n }\n if (this.constraints) {\n map.push({\n k: \"constraints\",\n v: this.getConstraints()\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveParam);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVxdWVzdC9tb2RlbC9Qcm9jZXNzSXNvQ3VydmVQYXJhbS5qcz85NzI1Il0sIm5hbWVzIjpbIlByb2Nlc3NJc29DdXJ2ZVBhcmFtIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiaWQiLCJyZXNvdXJjZSIsInBvaW50IiwicG9zaXRpb24iLCJjcnMiLCJzcnMiLCJwcm9maWxlIiwiZ3JhcGgiLCJjb25zdHJhaW50cyIsInJldmVyc2UiLCJ0aW1lVW5pdCIsImRpc3RhbmNlVW5pdCIsIm1ldGhvZCIsImNvc3RUeXBlIiwiY29zdFZhbHVlIiwiZGlzdGFuY2UiLCJ0aW1lIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRMb2NhdGlvbiIsIngiLCJ5IiwiZ2V0RGlzdGFuY2VVbml0IiwiZ2V0Q29uc3RyYWludHMiLCJjb25zdHJhaW50QXJyYXkiLCJsZW5ndGgiLCJrIiwicHVzaCIsIkpTT04iLCJzdHJpbmdpZnkiLCJqb2luIiwiZ2V0RGlyZWN0aW9uIiwiZ2V0UGFyYW1zIiwibWFwIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Esb0JBQW9CQSxDQUFFQyxPQUFPLEVBQUU7RUFDcEMsSUFBSSxFQUFFLElBQUksWUFBWUQsb0JBQW9CLENBQUMsRUFBRTtJQUN6QyxNQUFNLElBQUlFLFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQztFQUMzRjtFQUVBLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyw4REFBTSxDQUFDQyxTQUFTLENBQUMsQ0FBQztFQUNoQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLHdDQUF3QyxDQUFDOztFQUUzRDtBQUNKO0FB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QUM7SUFDTEQsQ0FBQyxFQUFHLGNBQWM7SUFDbEJRLENBQUMsRUFBRyxJQUFJLENBQUNaLGVBQWUsQ0FBQztFQUM3QixDQUFDLENBQUM7RUFFRixJQUFJLElBQUksQ0FBQ25CLEdBQUcsRUFBRTtJQUNWOEIsR0FBRyxDQUFDTixJQUFJLENBQUM7TUFDTEQsQ0FBQyxFQUFHLEtBQUs7TUFDVFEsQ0FBQyxFQUFHLElBQUksQ0FBQy9CO0lBQ2IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ0ksV0FBVyxFQUFFO0lBQ2xCMEIsR0FBRyxDQUFDTixJQUFJLENBQUM7TUFDTEQsQ0FBQyxFQUFHLGFBQWE7TUFDakJRLENBQUMsRUFBRyxJQUFJLENBQUNYLGNBQWMsQ0FBQztJQUM1QixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9VLEdBQUc7QUFDZCxDQUFDO0FBRWN6QyxtRkFBb0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUHJvY2Vzc0lzb0N1cnZlL1JlcXVlc3QvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUGFyYW0uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZHUgc2VydmljZSBkZSBjYWxjdWwgZGVzIGlzby5cbiAqIFBlcm1ldCBsZSBtYXBwaW5nIGF2ZWMgbGVzIG9wdGlvbnMgZHUgc2VydmljZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Qcm9jZXNzSXNvQ3VydmUuUmVxdWVzdC5Qcm9jZXNzSXNvQ3VydmVQYXJhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlUGFyYW0gKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvY2Vzc0lzb0N1cnZlUGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9jZXNzSXNvQ3VydmVQYXJhbSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBQcm9jZXNzSXNvQ3VydmVQYXJhbSAoKV1cIik7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25zIGVuIHBhcmFtw6p0cmVzIGR1IGNvbnN0cnVjdGV1ci5cbiAgICAgKi9cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gbWFwcGluZyBkZXMgb3B0aW9ucyBhdmVjIGwnQVBJIFJFU1RcblxuICAgIC8qKiBJZGVudGlmaWFudCBkZSBs4oCZaXNvY2hyb25lICovXG4gICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZDtcblxuICAgIC8qKiBSZXNvdXJjZSAqL1xuICAgIHRoaXMucmVzb3VyY2UgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2U7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGRlIGTDqXBhcnQgKG91IGFycml2w6llIHNpIGxlIHJldmVyc2UgZXN0IMOgIHRydWUpLiAqL1xuICAgIHRoaXMucG9pbnQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cbiAgICAvKiogcHJvamVjdGlvbiAoY29kZSBFUFNHIGNvbW1lIGVwc2c6NDMyNiBvdSB3Z3M4NCkgKi9cbiAgICB0aGlzLmNycyA9IHRoaXMub3B0aW9ucy5zcnM7XG5cbiAgICAvKipcbiAgICAgKiBQcm9maWwgZGUgdsOpaGljdWxlIMOgIHV0aWxpc2VyIHBvdXIgbGUgY2FsY3VsLlxuICAgICAqIFZvaXR1cmUgb3UgUGlldG9uXG4gICAgICovXG4gICAgdGhpcy5wcm9maWxlID0gdGhpcy5vcHRpb25zLmdyYXBoO1xuXG4gICAgLyoqIExpc3RlIGRlcyByw6hnbGVzIGRlIHJlc3RyaWN0aW9ucyDDoCB1dGlsaXNlciAqL1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLm9wdGlvbnMuY29uc3RyYWludHM7XG5cbiAgICB0aGlzLnJldmVyc2UgPSB0aGlzLm9wdGlvbnMucmV2ZXJzZTtcblxuICAgIHRoaXMudGltZVVuaXQgPSB0aGlzLm9wdGlvbnMudGltZVVuaXQ7XG5cbiAgICB0aGlzLmRpc3RhbmNlVW5pdCA9IHRoaXMub3B0aW9ucy5kaXN0YW5jZVVuaXQ7XG5cbiAgICAvKipcbiAgICAgKiBcInRpbWVcIiBwb3VyIGlzb2Nocm9uZSBvdSBcImRpc3RhbmNlXCIgZm9yIGlzb2Rpc3RhbmNlLlxuICAgICAqIFBhciBkZWZhdXQsIHRpbWUuLi5cbiAgICAgKi9cbiAgICBpZiAodGhpcy5vcHRpb25zLm1ldGhvZCA9PT0gXCJkaXN0YW5jZVwiKSB7XG4gICAgICAgIHRoaXMuY29zdFR5cGUgPSBcImRpc3RhbmNlXCI7XG4gICAgICAgIHRoaXMuY29zdFZhbHVlID0gdGhpcy5vcHRpb25zLmRpc3RhbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29zdFR5cGUgPSBcInRpbWVcIjtcbiAgICAgICAgdGhpcy5jb3N0VmFsdWUgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cblByb2Nlc3NJc29DdXJ2ZVBhcmFtLkNMQVNTTkFNRSA9IFwiUHJvY2Vzc0lzb0N1cnZlUGFyYW1cIjtcblxuUHJvY2Vzc0lzb0N1cnZlUGFyYW0ucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpQcm9jZXNzSXNvQ3VydmVQYXJhbSNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBQcm9jZXNzSXNvQ3VydmVQYXJhbSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxlIHBvaW50XG4gICAgICogQHJldHVybnMge1N0cmluZ30geCx5XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb24gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50LnggKyBcIixcIiArIHRoaXMucG9pbnQueTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgbCd1bml0w6kgZGUgbGEgZGlzdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpc3RhbmNlVW5pdCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzdGFuY2VVbml0ID09PSBcIm1cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwibWV0ZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXN0YW5jZVVuaXQgPT09IFwia21cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwia2lsb21ldGVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGxpc3RlIGRlcyBjb250cmFpbnRlc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q29uc3RyYWludHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25zdHJhaW50QXJyYXkgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRBcnJheS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3RyYWludHNba10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RyYWludEFycmF5LmpvaW4oXCJ8XCIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSBsYSBkaXJlY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpcmVjdGlvbiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV2ZXJzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYXJyaXZhbFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiZGVwYXJ0dXJlXCI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqIFRhYmxlYXUgZGUgY2xlZnMvdmFsZXVycyBwb3VyIHBhcmFtLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3RbXX0gS1ZQXG4gKi9cblByb2Nlc3NJc29DdXJ2ZVBhcmFtLnByb3RvdHlwZS5nZXRQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hcCA9IFtdO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJyZXNvdXJjZVwiLFxuICAgICAgICB2IDogdGhpcy5yZXNvdXJjZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJwb2ludFwiLFxuICAgICAgICB2IDogdGhpcy5nZXRMb2NhdGlvbigpXG4gICAgfSk7XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcImRpcmVjdGlvblwiLFxuICAgICAgICB2IDogdGhpcy5nZXREaXJlY3Rpb24oKVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjb3N0VHlwZVwiLFxuICAgICAgICB2IDogdGhpcy5jb3N0VHlwZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJjb3N0VmFsdWVcIixcbiAgICAgICAgdiA6IHRoaXMuY29zdFZhbHVlXG4gICAgfSk7XG5cbiAgICBtYXAucHVzaCh7XG4gICAgICAgIGsgOiBcInByb2ZpbGVcIixcbiAgICAgICAgdiA6IHRoaXMucHJvZmlsZVxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJ0aW1lVW5pdFwiLFxuICAgICAgICB2IDogdGhpcy50aW1lVW5pdFxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJkaXN0YW5jZVVuaXRcIixcbiAgICAgICAgdiA6IHRoaXMuZ2V0RGlzdGFuY2VVbml0KClcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmNyc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjb25zdHJhaW50c1wiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0Q29uc3RyYWludHMoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc0lzb0N1cnZlUGFyYW07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js\n"); + +/***/ }), + +/***/ "./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js": +/*!*********************************************************************************!*\ + !*** ./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/ProcessIsoCurveResponse */ \"./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\");\n\n\n\n\n\n/**\n * Factory pour générer une reponse JSON à partir d'un JSON\n * (Factory)\n *\n * @module ProcessIsoCurveResponseFactory\n * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory\n * @private\n */\nvar ProcessIsoCurveResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant ProcessIsoCurve\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"ProcessIsoCurveResponseFactory\");\n logger.trace([\"ProcessIsoCurveResponseFactory::build()\"]);\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n logger.trace(\"analyze response : json\");\n var JSONResponse;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // analyse de la reponse\n // création de l'objet de réponse\n data = new _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n\n // remplissage de l'objet créé avec les attribtuts de la réponse du service\n if (JSONResponse) {\n if (JSONResponse.costType === \"distance\") {\n data.time = \"\";\n data.distance = JSONResponse.costValue;\n } else {\n data.time = JSONResponse.costValue;\n data.distance = \"\";\n }\n data.message = \"\";\n data.id = \"\";\n data.srs = JSONResponse.crs;\n data.geometry = JSONResponse.geometry;\n var coords = JSONResponse.point.split(\",\");\n if (data.location) {\n data.location.x = coords[0];\n data.location.y = coords[1];\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", options.response)));\n return;\n }\n\n // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !!\n // ex. Key does not exist or has expired\n // mais le statut est 403, l'erreur est donc remontée plus tôt.\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", data.exceptionReport),\n type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"].TYPE_SRVERR,\n status: 200\n }));\n return;\n }\n }\n } else {\n // si la réponse est vide, on appelle le callback d'erreur\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n\n // si tout s'est bien passé, on appelle le callback de succès\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5LmpzP2RkNTAiXSwibmFtZXMiOlsiUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsIlByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlIiwiY29zdFR5cGUiLCJ0aW1lIiwiZGlzdGFuY2UiLCJjb3N0VmFsdWUiLCJtZXNzYWdlIiwiaWQiLCJzcnMiLCJjcnMiLCJnZW9tZXRyeSIsImNvb3JkcyIsInBvaW50Iiwic3BsaXQiLCJsb2NhdGlvbiIsIngiLCJ5Iiwib25FcnJvciIsImNhbGwiLCJzY29wZSIsIkVycm9yU2VydmljZSIsIk1SZXMiLCJnZXRNZXNzYWdlIiwiZXhjZXB0aW9uUmVwb3J0IiwidHlwZSIsIlRZUEVfU1JWRVJSIiwic3RhdHVzIiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ0E7QUFDUTtBQUNVOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsOEJBQThCLEdBQUc7RUFFakM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLEtBQUssRUFBRyxTQUFBQSxNQUFVQyxPQUFPLEVBQUU7SUFDdkI7SUFDQSxJQUFJQyxNQUFNLEdBQUdDLDhEQUFNLENBQUNDLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUMvREYsTUFBTSxDQUFDRyxLQUFLLENBQUMsQ0FBQyx5Q0FB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QztFQUMvQztBQUNKLENBQUM7QUFFY1AsNkZBQThCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1Byb2Nlc3NJc29DdXJ2ZS9SZXNwb25zZS9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBNUmVzIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSBmcm9tIFwiLi9tb2RlbC9Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZVwiO1xuXG4vKipcbiAqIEZhY3RvcnkgcG91ciBnw6luw6lyZXIgdW5lIHJlcG9uc2UgSlNPTiDDoCBwYXJ0aXIgZCd1biBKU09OXG4gKiAoRmFjdG9yeSlcbiAqXG4gKiBAbW9kdWxlIFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlRmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlByb2Nlc3NJc29DdXJ2ZS5SZXNwb25zZS5Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBQcm9jZXNzSXNvQ3VydmVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIl0pO1xuXG4gICAgICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDogcmF3XCIpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJhbmFseXplIHJlc3BvbnNlIDoganNvblwiKTtcblxuICAgICAgICAgICAgICAgIHZhciBKU09OUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlc3BvbnNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIEpTT05SZXNwb25zZSA9IEpTT04ucGFyc2Uob3B0aW9ucy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbmFseXNlIGRlIGxhIHJlcG9uc2VcbiAgICAgICAgICAgICAgICAvLyBjcsOpYXRpb24gZGUgbCdvYmpldCBkZSByw6lwb25zZVxuICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UoKTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbXBsaXNzYWdlIGRlIGwnb2JqZXQgY3LDqcOpIGF2ZWMgbGVzIGF0dHJpYnR1dHMgZGUgbGEgcsOpcG9uc2UgZHUgc2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChKU09OUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05SZXNwb25zZS5jb3N0VHlwZSA9PT0gXCJkaXN0YW5jZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kaXN0YW5jZSA9IEpTT05SZXNwb25zZS5jb3N0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSBKU09OUmVzcG9uc2UuY29zdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kaXN0YW5jZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmlkID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zcnMgPSBKU09OUmVzcG9uc2UuY3JzO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmdlb21ldHJ5ID0gSlNPTlJlc3BvbnNlLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29vcmRzID0gSlNPTlJlc3BvbnNlLnBvaW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYXRpb24ueCA9IGNvb3Jkc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYXRpb24ueSA9IGNvb3Jkc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UoTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9BTkFMWVNFXCIsIG9wdGlvbnMucmVzcG9uc2UpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpbmZvIDogZW4gY2FzIGRlIHByb2Jsw6htZXMgZGUgZHJvaXRzIChjbMOpIGludmFsaWRlIG91IGF1dHJlKSwgbGEgcsOpcG9uc2UgZXN0IGF1IGZvcm1hdCBYTUwgISFcbiAgICAgICAgICAgICAgICAvLyBleC4gPEV4Y2VwdGlvblJlcG9ydD48RXhjZXB0aW9uIGV4Y2VwdGlvbkNvZGU9XCJNaXNzaW5nUGFyYW1ldGVyXCI+S2V5IGRvZXMgbm90IGV4aXN0IG9yIGhhcyBleHBpcmVkPC9FeGNlcHRpb24+PC9FeGNlcHRpb25SZXBvcnQ+XG4gICAgICAgICAgICAgICAgLy8gbWFpcyBsZSBzdGF0dXQgZXN0IDQwMywgbCdlcnJldXIgZXN0IGRvbmMgcmVtb250w6llIHBsdXMgdMO0dC5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5leGNlcHRpb25SZXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogTVJlcy5nZXRNZXNzYWdlKFwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05cIiwgZGF0YS5leGNlcHRpb25SZXBvcnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IEVycm9yU2VydmljZS5UWVBFX1NSVkVSUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IDIwMFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzaSBsYSByw6lwb25zZSBlc3QgdmlkZSwgb24gYXBwZWxsZSBsZSBjYWxsYmFjayBkJ2VycmV1clxuICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VNUFRZXCIpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaSB0b3V0IHMnZXN0IGJpZW4gcGFzc8OpLCBvbiBhcHBlbGxlIGxlIGNhbGxiYWNrIGRlIHN1Y2PDqHNcbiAgICAgICAgb3B0aW9ucy5vblN1Y2Nlc3MuY2FsbChvcHRpb25zLnNjb3BlLCBkYXRhKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js": +/*!********************************************************************************!*\ + !*** ./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Float} distance - distance (expressed in meters) used for the request.\n * @property {Float} time - time (expressed in seconds) used for the request.\n * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve.\n * @property {String} id - request id (used by underlying webservice).\n * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in \"srs\" coordinates system).\n * @property {String} message - message\n * @property {String} srs - Identifier of the coordinates system used for the isocurve.\n *\n * @namespace\n * @alias Gp.Services.IsoCurveResponse\n *\n */\nfunction ProcessIsoCurveResponse() {\n if (!(this instanceof ProcessIsoCurveResponse)) {\n throw new TypeError(\"ProcessIsoCurveResponse constructor cannot be called as a function.\");\n }\n this.message = null;\n this.id = null;\n this.location = {};\n this.location.x = null;\n this.location.y = null;\n this.srs = null;\n this.geometry = null;\n this.time = null;\n this.distance = null;\n}\nProcessIsoCurveResponse.prototype = {\n constructor: ProcessIsoCurveResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (ProcessIsoCurveResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UuanM/OTMyNCJdLCJuYW1lcyI6WyJQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSIsIlR5cGVFcnJvciIsIm1lc3NhZ2UiLCJpZCIsImxvY2F0aW9uIiwieCIsInkiLCJzcnMiLCJnZW9tZXRyeSIsInRpbWUiLCJkaXN0YW5jZSIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLHVCQUF1QkEsQ0FBQSxFQUFJO0VBQ2hDLElBQUksRUFBRSxJQUFJLFlBQVlBLHVCQUF1QixDQUFDLEVBQUU7SUFDNUMsTUFBTSxJQUFJQyxTQUFTLENBQUMscUVBQXFFLENBQUM7RUFDOUY7RUFFQSxJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJO0VBRW5CLElBQUksQ0FBQ0MsRUFBRSxHQUFHLElBQUk7RUFFZCxJQUFJLENBQUNDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDQSxRQUFRLENBQUNDLENBQUMsR0FBRyxJQUFJO0VBQ3RCLElBQUksQ0FBQ0QsUUFBUSxDQUFDRSxDQUFDLEdBQUcsSUFBSTtFQUV0QixJQUFJLENBQUNDLEdBQUcsR0FBRyxJQUFJO0VBRWYsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtFQUVwQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBRWhCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7QUFDeEI7QUFFQVYsdUJBQXVCLENBQUNXLFNBQVMsR0FBRztFQUVoQ0MsV0FBVyxFQUFHWjtBQUVsQixDQUFDO0FBRWNBLHNGQUF1QiIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Qcm9jZXNzSXNvQ3VydmUvUmVzcG9uc2UvbW9kZWwvUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2Vzfmlzb0N1cnZlIEdwLlNlcnZpY2VzLmlzb0N1cnZlICgpfSBpbnZvY2F0aW9uIHdoZW4gc3VjY2Vzc2Z1bC4gUmVjZWl2ZWQgYXMgdGhlIGFyZ3VtZW50IG9mIG9uU3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0Zsb2F0fSBkaXN0YW5jZSAtIGRpc3RhbmNlIChleHByZXNzZWQgaW4gbWV0ZXJzKSB1c2VkIGZvciB0aGUgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHRpbWUgLSB0aW1lIChleHByZXNzZWQgaW4gc2Vjb25kcykgdXNlZCBmb3IgdGhlIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZ2VvbWV0cnkgLSBHZW9tZXRyeSAoZXhwcmVzc2VkIGluIFtHZW9KU09OXXtAbGluayBodHRwOi8vZ2VvanNvbi5vcmcvfSkgb2YgdGhlIGlzb2N1cnZlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGlkIC0gcmVxdWVzdCBpZCAodXNlZCBieSB1bmRlcmx5aW5nIHdlYnNlcnZpY2UpLlxuICogQHByb3BlcnR5IHtHcC5Qb2ludH0gbG9jYXRpb24gLSBQb3NpdGlvbiBvZiB0aGUgc3RhcnQgb3IgZW5kIHBvaW50IHVzZWQgZm9yIHRoZSByZXF1ZXN0IChleHByZXNzZWQgaW4gXCJzcnNcIiBjb29yZGluYXRlcyBzeXN0ZW0pLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc3JzIC0gSWRlbnRpZmllciBvZiB0aGUgY29vcmRpbmF0ZXMgc3lzdGVtIHVzZWQgZm9yIHRoZSBpc29jdXJ2ZS5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZVxuICpcbiAqL1xuZnVuY3Rpb24gUHJvY2Vzc0lzb0N1cnZlUmVzcG9uc2UgKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQcm9jZXNzSXNvQ3VydmVSZXNwb25zZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcblxuICAgIHRoaXMuaWQgPSBudWxsO1xuXG4gICAgdGhpcy5sb2NhdGlvbiA9IHt9O1xuICAgIHRoaXMubG9jYXRpb24ueCA9IG51bGw7XG4gICAgdGhpcy5sb2NhdGlvbi55ID0gbnVsbDtcblxuICAgIHRoaXMuc3JzID0gbnVsbDtcblxuICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsO1xuXG4gICAgdGhpcy50aW1lID0gbnVsbDtcblxuICAgIHRoaXMuZGlzdGFuY2UgPSBudWxsO1xufVxuXG5Qcm9jZXNzSXNvQ3VydmVSZXNwb25zZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb2Nlc3NJc29DdXJ2ZVJlc3BvbnNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Request/RouteRequestFactory.js": +/*!***********************************************************!*\ + !*** ./src/Services/Route/Request/RouteRequestFactory.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RouteRequestREST */ \"./src/Services/Route/Request/RouteRequestREST.js\");\n\n\n\n\n/**\n * Creation d'une requête REST en mode POST ou GET\n * (Factory)\n *\n * @module RouteRequestFactory\n * @alias Gp.Services.Route.Request.RouteRequestFactory\n * @private\n */\nvar RouteRequestFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * // utilisation avec les callback\n * var options = {\n * (...)\n * onSuccess : function (response) {},\n * onError : function (error) {},\n * // spécifique au service\n * startPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * endPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * provideBbox : false,\n * exclusions : [\"bridge\", \"tunnel\", \"toll\"],\n * distanceUnit : \"km\",\n * graph : \"Voiture\",\n * geometryInInstructions : false,\n * routePreference : \"fastest\"\n * };\n * RouteRequestFactory.build(options);\n *\n * // utilisation sans callback\n * var options = {...};\n * try {\n * var result = RouteRequestFactory.build(options);\n * if (! result) { throw new Error(\"...\"):}\n * } catch (e) {\n * // todo\n * }\n * @returns {String} request\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteRequestFactory\");\n logger.trace([\"RouteRequestFactory::build()\"]);\n var request = null;\n var settings = options || {};\n\n // gestion des callback\n var bOnError = !!(options.onError !== null && typeof options.onError === \"function\");\n var message = null;\n\n // FIXME les exceptions ne sont pas 'catchées' sur le constructeur !\n var myReq = new _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](settings);\n if (!myReq.processRequestString()) {\n message = \"Error process request (rest) !\";\n if (bOnError) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__[\"default\"](message));\n return;\n }\n throw new Error(message);\n }\n request = myReq.requestString;\n return request;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteRequestFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L1JvdXRlUmVxdWVzdEZhY3RvcnkuanM/MWQzMCJdLCJuYW1lcyI6WyJSb3V0ZVJlcXVlc3RGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXF1ZXN0Iiwic2V0dGluZ3MiLCJiT25FcnJvciIsIm9uRXJyb3IiLCJtZXNzYWdlIiwibXlSZXEiLCJSb3V0ZVJlcXVlc3RSRVNUIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJjYWxsIiwic2NvcGUiLCJFcnJvclNlcnZpY2UiLCJFcnJvciIsInJlcXVlc3RTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ1E7QUFDVjs7QUFFbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLG1CQUFtQixHQUFHO0VBRXRCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsS0FBSyxFQUFHLFNBQUFBLE1BQVVDLE9BQU8sRUFBRTtJQUN2QjtJQUNBLElBQUlDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLHFCQUFxQixDQUFDO0lBQ3BERixNQUFNLENBQUNHLEtBQUssQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFOUMsSUFBSUMsT0FBTyxHQUFHLElBQUk7SUFFbEIsSUFBSUMsUUFBUSxHQUFHTixPQUFPLElBQUksQ0FBQyxDQUFDOztJQUU1QjtJQUNBLElBQUlPLFFBQVEsR0FBRyxDQUFDLEVBQUVQLE9BQU8sQ0FBQ1EsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPUixPQUFPLENBQUNRLE9BQU8sS0FBSyxVQUFVLENBQUM7SUFFcEYsSUFBSUMsT0FBTyxHQUFHLElBQUk7O0lBRWxCO0lBQ0EsSUFBSUMsS0FBSyxHQUFHLElBQUlDLHlEQUFnQixDQUFDTCxRQUFRLENBQUM7SUFDMUMsSUFBSSxDQUFDSSxLQUFLLENBQUNFLG9CQUFvQixDQUFDLENBQUMsRUFBRTtNQUMvQkgsT0FBTyxHQUFHLGdDQUFnQztNQUMxQyxJQUFJRixRQUFRLEVBQUU7UUFDVlAsT0FBTyxDQUFDUSxPQUFPLENBQUNLLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUUsSUFBSUMsZ0VBQVksQ0FBQ04sT0FBTyxDQUFDLENBQUM7UUFDOUQ7TUFDSjtNQUNBLE1BQU0sSUFBSU8sS0FBSyxDQUFDUCxPQUFPLENBQUM7SUFDNUI7SUFDQUosT0FBTyxHQUFHSyxLQUFLLENBQUNPLGFBQWE7SUFFN0IsT0FBT1osT0FBTztFQUNsQjtBQUNKLENBQUM7QUFFY1Asa0ZBQW1CIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1JlcXVlc3QvUm91dGVSZXF1ZXN0RmFjdG9yeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL1V0aWxzL0xvZ2dlckJ5RGVmYXVsdFwiO1xuaW1wb3J0IEVycm9yU2VydmljZSBmcm9tIFwiLi4vLi4vLi4vRXhjZXB0aW9ucy9FcnJvclNlcnZpY2VcIjtcbmltcG9ydCBSb3V0ZVJlcXVlc3RSRVNUIGZyb20gXCIuL1JvdXRlUmVxdWVzdFJFU1RcIjtcblxuLyoqXG4gKiBDcmVhdGlvbiBkJ3VuZSByZXF1w6p0ZSBSRVNUIGVuIG1vZGUgUE9TVCBvdSBHRVRcbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgUm91dGVSZXF1ZXN0RmFjdG9yeVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJlcXVlc3QuUm91dGVSZXF1ZXN0RmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xudmFyIFJvdXRlUmVxdWVzdEZhY3RvcnkgPSB7XG5cbiAgICAvKipcbiAgICAgKiBpbnRlcmZhY2UgdW5pcXVlXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBkZWZpbmllcyBkYW5zIGxlIGNvbXBvc2FudCBSb3V0ZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIC8vIHV0aWxpc2F0aW9uIGF2ZWMgbGVzIGNhbGxiYWNrXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICguLi4pXG4gICAgICogICAgICBvblN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHt9LFxuICAgICAqICAgICAgb25FcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge30sXG4gICAgICogICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gICAgICogICAgICBzdGFydFBvaW50IDoge1xuICAgICAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICAgICAqICAgICAgICAgIHkgOiAxLjU1NTdcbiAgICAgKiAgICAgIH0sXG4gICAgICogICAgICBlbmRQb2ludCA6IHtcbiAgICAgKiAgICAgICAgICB4IDogNDIuMTEyMSxcbiAgICAgKiAgICAgICAgICB5IDogMS41NTU3XG4gICAgICogICAgICB9LFxuICAgICAqICAgICAgcHJvdmlkZUJib3ggOiBmYWxzZSxcbiAgICAgKiAgICAgIGV4Y2x1c2lvbnMgOiBbXCJicmlkZ2VcIiwgXCJ0dW5uZWxcIiwgXCJ0b2xsXCJdLFxuICAgICAqICAgICAgZGlzdGFuY2VVbml0IDogXCJrbVwiLFxuICAgICAqICAgICAgZ3JhcGggOiBcIlZvaXR1cmVcIixcbiAgICAgKiAgICAgIGdlb21ldHJ5SW5JbnN0cnVjdGlvbnMgOiBmYWxzZSxcbiAgICAgKiAgICAgIHJvdXRlUHJlZmVyZW5jZSA6IFwiZmFzdGVzdFwiXG4gICAgICogICB9O1xuICAgICAqICAgUm91dGVSZXF1ZXN0RmFjdG9yeS5idWlsZChvcHRpb25zKTtcbiAgICAgKlxuICAgICAqICAgLy8gdXRpbGlzYXRpb24gc2FucyBjYWxsYmFja1xuICAgICAqICAgdmFyIG9wdGlvbnMgPSB7Li4ufTtcbiAgICAgKiAgIHRyeSB7XG4gICAgICogICAgICB2YXIgcmVzdWx0ID0gUm91dGVSZXF1ZXN0RmFjdG9yeS5idWlsZChvcHRpb25zKTtcbiAgICAgKiAgICAgIGlmICghIHJlc3VsdCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIuLi5cIik6fVxuICAgICAqICAgfSBjYXRjaCAoZSkge1xuICAgICAqICAgICAgLy8gdG9kb1xuICAgICAqICAgfVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBidWlsZCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIGxvZ2dlclxuICAgICAgICB2YXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihcIlJvdXRlUmVxdWVzdEZhY3RvcnlcIik7XG4gICAgICAgIGxvZ2dlci50cmFjZShbXCJSb3V0ZVJlcXVlc3RGYWN0b3J5OjpidWlsZCgpXCJdKTtcblxuICAgICAgICB2YXIgcmVxdWVzdCA9IG51bGw7XG5cbiAgICAgICAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICAvLyBnZXN0aW9uIGRlcyBjYWxsYmFja1xuICAgICAgICB2YXIgYk9uRXJyb3IgPSAhIShvcHRpb25zLm9uRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMub25FcnJvciA9PT0gXCJmdW5jdGlvblwiKTtcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRklYTUUgbGVzIGV4Y2VwdGlvbnMgbmUgc29udCBwYXMgJ2NhdGNow6llcycgc3VyIGxlIGNvbnN0cnVjdGV1ciAhXG4gICAgICAgIHZhciBteVJlcSA9IG5ldyBSb3V0ZVJlcXVlc3RSRVNUKHNldHRpbmdzKTtcbiAgICAgICAgaWYgKCFteVJlcS5wcm9jZXNzUmVxdWVzdFN0cmluZygpKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJFcnJvciBwcm9jZXNzIHJlcXVlc3QgKHJlc3QpICFcIjtcbiAgICAgICAgICAgIGlmIChiT25FcnJvcikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25FcnJvci5jYWxsKG9wdGlvbnMuc2NvcGUsIG5ldyBFcnJvclNlcnZpY2UobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0ID0gbXlSZXEucmVxdWVzdFN0cmluZztcblxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZVJlcXVlc3RGYWN0b3J5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/RouteRequestFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Request/RouteRequestREST.js": +/*!********************************************************!*\ + !*** ./src/Services/Route/Request/RouteRequestREST.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./model/RouteParamREST */ \"./src/Services/Route/Request/model/RouteParamREST.js\");\n\n\n\n\n/**\n * @classdesc\n * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire\n * (uniquement en GET)\n *\n * @constructor\n * @alias Gp.Services.Route.Request.RouteRequestREST\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * (...)\n * };\n *\n * @private\n */\nfunction RouteRequestREST(options) {\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteRequestREST\");\n this.logger.trace(\"[Constructeur RouteRequestREST ()]\");\n if (!(this instanceof RouteRequestREST)) {\n throw new TypeError(\"RouteRequestREST constructor cannot be called as a function.\");\n }\n\n // existance des options\n if (!options) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_EMPTY\", \"options\"));\n }\n\n /** liste des options */\n this.settings = options;\n}\nRouteRequestREST.prototype = {\n /**\n * @lends module:RouteRequestREST#\n */\n\n /**\n * request\n * @type {String}\n */\n requestString: null,\n /**\n * Constructeur (alias)\n */\n constructor: RouteRequestREST,\n /**\n * Construction de la requête.\n *\n * @example\n * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838\n * // POST out : Not yet supported method POST !\n * @returns {String} request\n */\n processRequestString: function processRequestString() {\n // INFO\n // construction simple sans template...,\n // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE !\n this.logger.warn(\" PROTOTYPE !\");\n\n // Mapping des options avec le service de l'API REST\n var oParams = new _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.settings);\n var params = oParams.getParams();\n var request = \"\";\n for (var i = 0; i < params.length; i++) {\n var o = params[i];\n if (request) {\n request += \"&\";\n }\n request += o.k + \"=\" + o.v;\n }\n\n // Exemple :\n // http://wxs.ign.fr/KEY/itineraire/rest/route.json?\n // origin=&\n // destination=&\n // waypoints=&\n // method=DISTANCE&\n // graph=Pieton&\n // graphName=Pieton&\n // exclusions=&\n // tolerance=10&\n // srs=\n\n this.logger.trace(request);\n this.requestString = request;\n return this.requestString;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteRequestREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L1JvdXRlUmVxdWVzdFJFU1QuanM/MjBlZCJdLCJuYW1lcyI6WyJSb3V0ZVJlcXVlc3RSRVNUIiwib3B0aW9ucyIsImxvZ2dlciIsIkxvZ2dlciIsImdldExvZ2dlciIsInRyYWNlIiwiVHlwZUVycm9yIiwiRXJyb3IiLCJfIiwiZ2V0TWVzc2FnZSIsInNldHRpbmdzIiwicHJvdG90eXBlIiwicmVxdWVzdFN0cmluZyIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc1JlcXVlc3RTdHJpbmciLCJ3YXJuIiwib1BhcmFtcyIsIlJvdXRlUGFyYW1SRVNUIiwicGFyYW1zIiwiZ2V0UGFyYW1zIiwicmVxdWVzdCIsImkiLCJsZW5ndGgiLCJvIiwiayIsInYiXSwibWFwcGluZ3MiOiJBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQW9EO0FBQ0g7QUFDRzs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxnQkFBZ0JBLENBQUVDLE9BQU8sRUFBRTtFQUNoQyxJQUFJLENBQUNDLE1BQU0sR0FBR0MsOERBQU0sQ0FBQ0MsU0FBUyxDQUFDLGtCQUFrQixDQUFDO0VBQ2xELElBQUksQ0FBQ0YsTUFBTSxDQUFDRyxLQUFLLENBQUMsb0NBQW9DLENBQUM7RUFFdkQsSUFBSSxFQUFFLElBQUksWUFBWUwsZ0JBQWdCLENBQUMsRUFBRTtJQUNyQyxNQUFNLElBQUlNLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQztFQUN2Rjs7RUFFQTtFQUNBLElBQUksQ0FBQ0wsT0FBTyxFQUFFO0lBQ1YsTUFBTSxJQUFJTSxLQUFLLENBQUNDLGdFQUFDLENBQUNDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7RUFDM0Q7O0VBRUE7RUFDQSxJQUFJLENBQUNDLFFBQVEsR0FBR1QsT0FBTztBQUMzQjtBQUVBRCxnQkFBZ0IsQ0FBQ1csU0FBUyxHQUFHO0VBRXpCO0FBQ0o7QUFDQTs7RUFFSTtBQUNKO0FBQ0E7QUFDQTtFQUNJQyxhQUFhLEVBQUcsSUFBSTtFQUVwQjtBQUNKO0FBQ0E7RUFDSUMsV0FBVyxFQUFHYixnQkFBZ0I7RUFFOUI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJYyxvQkFBb0IsRUFBRyxTQUFBQSxxQkFBQSxFQUFZO0lBQy9CO0lBQ0E7SUFDQTtJQUNBLElBQUksQ0FBQ1osTUFBTSxDQUFDYSxJQUFJLENBQUMsY0FBYyxDQUFDOztJQUVoQztJQUNBLElBQUlDLE9BQU8sR0FBRyxJQUFJQyw2REFBYyxDQUFDLElBQUksQ0FBQ1AsUUFBUSxDQUFDO0lBQy9DLElBQUlRLE1BQU0sR0FBR0YsT0FBTyxDQUFDRyxTQUFTLENBQUMsQ0FBQztJQUVoQyxJQUFJQyxPQUFPLEdBQUcsRUFBRTtJQUNoQixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0gsTUFBTSxDQUFDSSxNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUlFLENBQUMsR0FBR0wsTUFBTSxDQUFDRyxDQUFDLENBQUM7TUFDakIsSUFBSUQsT0FBTyxFQUFFO1FBQ1RBLE9BQU8sSUFBSSxHQUFHO01BQ2xCO01BQ0FBLE9BQU8sSUFBSUcsQ0FBQyxDQUFDQyxDQUFDLEdBQUcsR0FBRyxHQUFHRCxDQUFDLENBQUNFLENBQUM7SUFDOUI7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQSxJQUFJLENBQUN2QixNQUFNLENBQUNHLEtBQUssQ0FBQ2UsT0FBTyxDQUFDO0lBQzFCLElBQUksQ0FBQ1IsYUFBYSxHQUFHUSxPQUFPO0lBRTVCLE9BQU8sSUFBSSxDQUFDUixhQUFhO0VBQzdCO0FBQ0osQ0FBQztBQUVjWiwrRUFBZ0IiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUm91dGUvUmVxdWVzdC9Sb3V0ZVJlcXVlc3RSRVNULmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcbmltcG9ydCBfIGZyb20gXCIuLi8uLi8uLi9VdGlscy9NZXNzYWdlc1Jlc291cmNlc1wiO1xuaW1wb3J0IFJvdXRlUGFyYW1SRVNUIGZyb20gXCIuL21vZGVsL1JvdXRlUGFyYW1SRVNUXCI7XG5cbi8qKlxuICogQGNsYXNzZGVzY1xuICogQ2xhc3NlIGRlIGdlc3Rpb24gZGVzIHJlcXXDqnRlcyBkZSB0eXBlIFJFU1Qgc3VyIGxlIHNlcnZpY2UgZGUgY2FsY3VsIGQnaXRpbmVyYWlyZVxuICogKHVuaXF1ZW1lbnQgZW4gR0VUKVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJlcXVlc3QuUm91dGVSZXF1ZXN0UkVTVFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGRlZmluaWVzIGRhbnMgbGUgY29tcG9zYW50IFJvdXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBvcHRpb25zID0ge1xuICogICAgICAoLi4uKVxuICogfTtcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBSb3V0ZVJlcXVlc3RSRVNUIChvcHRpb25zKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFwiUm91dGVSZXF1ZXN0UkVTVFwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUm91dGVSZXF1ZXN0UkVTVCAoKV1cIik7XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVSZXF1ZXN0UkVTVCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJvdXRlUmVxdWVzdFJFU1QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICAvLyBleGlzdGFuY2UgZGVzIG9wdGlvbnNcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX0VNUFRZXCIsIFwib3B0aW9uc1wiKSk7XG4gICAgfVxuXG4gICAgLyoqIGxpc3RlIGRlcyBvcHRpb25zICovXG4gICAgdGhpcy5zZXR0aW5ncyA9IG9wdGlvbnM7XG59XG5cblJvdXRlUmVxdWVzdFJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpSb3V0ZVJlcXVlc3RSRVNUI1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogcmVxdWVzdFxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmVxdWVzdFN0cmluZyA6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIDogUm91dGVSZXF1ZXN0UkVTVCxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGlvbiBkZSBsYSByZXF1w6p0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gR0VUICBvdXQgOiBvcmlnaW49Mi40MTY5MDczNTM4MDk1MTMsNDguODQ2NTc3MjE0MjI5NyZkZXN0aW5hdGlvbj0yLjQyNDgwMzc3NzE0OTM2NzMsNDguODQ1OTEzNTMxNjE4MzhcbiAgICAgKiAvLyBQT1NUIG91dCA6IE5vdCB5ZXQgc3VwcG9ydGVkIG1ldGhvZCBQT1NUICFcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RTdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElORk9cbiAgICAgICAgLy8gY29uc3RydWN0aW9uIHNpbXBsZSBzYW5zIHRlbXBsYXRlLi4uLFxuICAgICAgICAvLyBtYWlzIGVuIGF0dGVuZGFudCBxdWUgbGVzIHNlcnZpY2VzIHNvaWVudCBmaXjDqXMsIG9uIHRhZ2d1ZSBjZSBjb21wb3NhbnQgZW4gbW9kZSBQUk9UT1RZUEUgIVxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiIFBST1RPVFlQRSAhXCIpO1xuXG4gICAgICAgIC8vIE1hcHBpbmcgZGVzIG9wdGlvbnMgYXZlYyBsZSBzZXJ2aWNlIGRlIGwnQVBJIFJFU1RcbiAgICAgICAgdmFyIG9QYXJhbXMgPSBuZXcgUm91dGVQYXJhbVJFU1QodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHZhciBwYXJhbXMgPSBvUGFyYW1zLmdldFBhcmFtcygpO1xuXG4gICAgICAgIHZhciByZXF1ZXN0ID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvID0gcGFyYW1zW2ldO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ICs9IFwiJlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdCArPSBvLmsgKyBcIj1cIiArIG8udjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4ZW1wbGUgOlxuICAgICAgICAvLyAgaHR0cDovL3d4cy5pZ24uZnIvS0VZL2l0aW5lcmFpcmUvcmVzdC9yb3V0ZS5qc29uP1xuICAgICAgICAvLyAgb3JpZ2luPSZcbiAgICAgICAgLy8gIGRlc3RpbmF0aW9uPSZcbiAgICAgICAgLy8gIHdheXBvaW50cz0mXG4gICAgICAgIC8vICBtZXRob2Q9RElTVEFOQ0UmXG4gICAgICAgIC8vICBncmFwaD1QaWV0b24mXG4gICAgICAgIC8vICBncmFwaE5hbWU9UGlldG9uJlxuICAgICAgICAvLyAgZXhjbHVzaW9ucz0mXG4gICAgICAgIC8vICB0b2xlcmFuY2U9MTAmXG4gICAgICAgIC8vICBzcnM9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UocmVxdWVzdCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFN0cmluZyA9IHJlcXVlc3Q7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdFN0cmluZztcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZVJlcXVlc3RSRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/RouteRequestREST.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Request/model/RouteParamREST.js": +/*!************************************************************!*\ + !*** ./src/Services/Route/Request/model/RouteParamREST.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n\n\n/**\n * @classdesc\n * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST).\n * Permet le mapping avec les options du service.\n * @constructor\n * @alias Gp.Services.Route.Request.RouteParamREST\n * @param {Object} options - options\n *\n * @private\n */\nfunction RouteParamREST(options) {\n if (!(this instanceof RouteParamREST)) {\n throw new TypeError(\"RouteParamREST constructor cannot be called as a function.\");\n }\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger();\n this.logger.trace(\"[Constructeur RouteParamREST ()]\");\n /**\n * Options en paramêtres du constructeur.\n */\n this.options = options || {};\n\n // mapping des options avec l'API REST\n\n /** Ressource utilisée */\n this.resource = this.options.resource;\n\n /** Coordonnées du point de départ. */\n this.start = this.options.startPoint.x + \",\" + this.options.startPoint.y;\n\n /** Coordonnées du point d’arrivée. */\n this.end = this.options.endPoint.x + \",\" + this.options.endPoint.y;\n\n /** Coordonnées des étapes point de départ. */\n this.intermediates = this.options.viaPoints;\n\n /** Nom du profile à utiliser */\n this.profile = this.options.graph;\n\n /** projection (code EPSG comme epsg:4326 ou wgs84) */\n this.crs = this.options.srs;\n\n /** Liste des contraintes */\n this.constraints = this.options.constraints;\n\n /** Nom de l'optimisation à utiliser */\n this.optimization = this.options.routePreference;\n\n /** Format de sortie (résumé de l’itinéraire) */\n this.getSteps = this.options.geometryInInstructions ? \"true\" : \"false\";\n\n /** Unité des distances */\n this.distanceUnit = this.options.distanceUnit;\n\n /** Unité des durées */\n this.timeUnit = this.options.timeUnit;\n\n /** Attributs des voies */\n this.waysAttributes = this.options.waysAttributes;\n}\n\n/**\n * CLASSNAME\n */\nRouteParamREST.CLASSNAME = \"RouteParamREST\";\nRouteParamREST.prototype = {\n /**\n * @lends module:RouteParamREST#\n */\n\n /**\n * Constructeur (alias)\n */\n constructor: RouteParamREST,\n /**\n * Retourne une liste de points\n * @returns {String} une liste de points (sep '|')\n */\n getIntermediates: function getIntermediates() {\n var array = [];\n if (this.intermediates.length !== 0) {\n for (var i = 0; i < this.intermediates.length; i++) {\n var obj = this.intermediates[i];\n array.push(obj.x + \",\" + obj.y);\n }\n }\n return array.join(\"|\");\n },\n /**\n * Retourne une liste d'attributs\n * @returns {String} une liste d'attributs (sep '|')\n */\n getWaysAttributes: function getWaysAttributes() {\n return this.waysAttributes.join(\"|\");\n },\n /**\n * Retourne un profile\n * @returns {String} profile\n */\n getProfile: function getProfile() {\n return this.profile;\n },\n /**\n * Retourne un distanceUnit\n * @returns {String} distanceUnit\n */\n getDistanceUnit: function getDistanceUnit() {\n if (this.distanceUnit === \"m\") {\n return \"meter\";\n }\n if (this.distanceUnit === \"km\") {\n return \"kilometer\";\n }\n return \"\";\n },\n /**\n * Retourne une optimisation\n * @returns {String} optimization\n */\n getOptimization: function getOptimization() {\n if (this.optimization) {\n return this.optimization;\n } else {\n return \"\";\n }\n },\n /**\n * Retourne la liste des constraints\n * @returns {String} une liste des constraints (sep '|')\n */\n getConstraints: function getConstraints() {\n var constraintArray = [];\n if (this.constraints.length !== 0) {\n for (var k = 0; k < this.constraints.length; k++) {\n constraintArray.push(JSON.stringify(this.constraints[k]));\n }\n }\n return constraintArray.join(\"|\");\n }\n};\n\n/**\n * Tableau de clefs/valeurs pour param.\n *\n * @returns {Array} liste de paramêtres\n */\nRouteParamREST.prototype.getParams = function () {\n var map = [];\n map.push({\n k: \"resource\",\n v: this.resource\n });\n map.push({\n k: \"start\",\n v: this.start\n });\n map.push({\n k: \"end\",\n v: this.end\n });\n map.push({\n k: \"geometryFormat\",\n v: \"geojson\"\n });\n if (this.optimization) {\n map.push({\n k: \"optimization\",\n v: this.getOptimization()\n });\n }\n if (this.intermediates) {\n map.push({\n k: \"intermediates\",\n v: this.getIntermediates()\n });\n }\n if (this.profile) {\n map.push({\n k: \"profile\",\n v: this.getProfile()\n });\n }\n if (this.constraints) {\n map.push({\n k: \"constraints\",\n v: this.getConstraints()\n });\n }\n if (this.crs) {\n map.push({\n k: \"crs\",\n v: this.crs\n });\n }\n if (this.distanceUnit) {\n map.push({\n k: \"distanceUnit\",\n v: this.getDistanceUnit()\n });\n }\n if (this.timeUnit) {\n map.push({\n k: \"timeUnit\",\n v: this.timeUnit\n });\n }\n if (this.waysAttributes) {\n map.push({\n k: \"waysAttributes\",\n v: this.getWaysAttributes()\n });\n }\n return map;\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteParamREST);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L21vZGVsL1JvdXRlUGFyYW1SRVNULmpzPzczODMiXSwibmFtZXMiOlsiUm91dGVQYXJhbVJFU1QiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJyZXNvdXJjZSIsInN0YXJ0Iiwic3RhcnRQb2ludCIsIngiLCJ5IiwiZW5kIiwiZW5kUG9pbnQiLCJpbnRlcm1lZGlhdGVzIiwidmlhUG9pbnRzIiwicHJvZmlsZSIsImdyYXBoIiwiY3JzIiwic3JzIiwiY29uc3RyYWludHMiLCJvcHRpbWl6YXRpb24iLCJyb3V0ZVByZWZlcmVuY2UiLCJnZXRTdGVwcyIsImdlb21ldHJ5SW5JbnN0cnVjdGlvbnMiLCJkaXN0YW5jZVVuaXQiLCJ0aW1lVW5pdCIsIndheXNBdHRyaWJ1dGVzIiwiQ0xBU1NOQU1FIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJnZXRJbnRlcm1lZGlhdGVzIiwiYXJyYXkiLCJsZW5ndGgiLCJpIiwib2JqIiwicHVzaCIsImpvaW4iLCJnZXRXYXlzQXR0cmlidXRlcyIsImdldFByb2ZpbGUiLCJnZXREaXN0YW5jZVVuaXQiLCJnZXRPcHRpbWl6YXRpb24iLCJnZXRDb25zdHJhaW50cyIsImNvbnN0cmFpbnRBcnJheSIsImsiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0UGFyYW1zIiwibWFwIiwidiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxjQUFjQSxDQUFFQyxPQUFPLEVBQUU7RUFDOUIsSUFBSSxFQUFFLElBQUksWUFBWUQsY0FBYyxDQUFDLEVBQUU7SUFDbkMsTUFBTSxJQUFJRSxTQUFTLENBQUMsNERBQTRELENBQUM7RUFDckY7RUFFQSxJQUFJLENBQUNDLE1BQU0sR0FBR0Ms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QztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUN4QixHQUFHLEVBQUU7SUFDVjhCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO01BQ0xRLENBQUMsRUFBRyxLQUFLO01BQ1RLLENBQUMsRUFBRyxJQUFJLENBQUMvQjtJQUNiLENBQUMsQ0FBQztFQUNOO0VBRUEsSUFBSSxJQUFJLENBQUNPLFlBQVksRUFBRTtJQUNuQnVCLEdBQUcsQ0FBQ1osSUFBSSxDQUFDO01BQ0xRLENBQUMsRUFBRyxjQUFjO01BQ2xCSyxDQUFDLEVBQUcsSUFBSSxDQUFDVCxlQUFlLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJLElBQUksQ0FBQ2QsUUFBUSxFQUFFO0lBQ2ZzQixHQUFHLENBQUNaLElBQUksQ0FBQztNQUNMUSxDQUFDLEVBQUcsVUFBVTtNQUNkSyxDQUFDLEVBQUcsSUFBSSxDQUFDdkI7SUFDYixDQUFDLENBQUM7RUFDTjtFQUVBLElBQUksSUFBSSxDQUFDQyxjQUFjLEVBQUU7SUFDckJxQixHQUFHLENBQUNaLElBQUksQ0FBQztNQUNMUSxDQUFDLEVBQUcsZ0JBQWdCO01BQ3BCSyxDQUFDLEVBQUcsSUFBSSxDQUFDWCxpQkFBaUIsQ0FBQztJQUMvQixDQUFDLENBQUM7RUFDTjtFQUVBLE9BQU9VLEdBQUc7QUFDZCxDQUFDO0FBRWNoRCw2RUFBYyIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXF1ZXN0L21vZGVsL1JvdXRlUGFyYW1SRVNULmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi8uLi9VdGlscy9Mb2dnZXJCeURlZmF1bHRcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgcGFyYW0uIGRlcyByZXF1w6p0ZXMgZHUgc2VydmljZSBkZSBjYWxjdWwgZCdpdGluZXJhaXJlIChSRVNUKS5cbiAqICAgICAgUGVybWV0IGxlIG1hcHBpbmcgYXZlYyBsZXMgb3B0aW9ucyBkdSBzZXJ2aWNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUm91dGUuUmVxdWVzdC5Sb3V0ZVBhcmFtUkVTVFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gUm91dGVQYXJhbVJFU1QgKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVQYXJhbVJFU1QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSb3V0ZVBhcmFtUkVTVCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiW0NvbnN0cnVjdGV1ciBSb3V0ZVBhcmFtUkVTVCAoKV1cIik7XG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBlbiBwYXJhbcOqdHJlcyBkdSBjb25zdHJ1Y3RldXIuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIG1hcHBpbmcgZGVzIG9wdGlvbnMgYXZlYyBsJ0FQSSBSRVNUXG5cbiAgICAvKiogUmVzc291cmNlIHV0aWxpc8OpZSAqL1xuICAgIHRoaXMucmVzb3VyY2UgPSB0aGlzLm9wdGlvbnMucmVzb3VyY2U7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGR1IHBvaW50IGRlIGTDqXBhcnQuICovXG4gICAgdGhpcy5zdGFydCA9IHRoaXMub3B0aW9ucy5zdGFydFBvaW50LnggKyBcIixcIiArIHRoaXMub3B0aW9ucy5zdGFydFBvaW50Lnk7XG5cbiAgICAvKiogQ29vcmRvbm7DqWVzIGR1IHBvaW50IGTigJlhcnJpdsOpZS4gKi9cbiAgICB0aGlzLmVuZCA9IHRoaXMub3B0aW9ucy5lbmRQb2ludC54ICsgXCIsXCIgKyB0aGlzLm9wdGlvbnMuZW5kUG9pbnQueTtcblxuICAgIC8qKiBDb29yZG9ubsOpZXMgZGVzIMOpdGFwZXMgcG9pbnQgZGUgZMOpcGFydC4gKi9cbiAgICB0aGlzLmludGVybWVkaWF0ZXMgPSB0aGlzLm9wdGlvbnMudmlhUG9pbnRzO1xuXG4gICAgLyoqIE5vbSBkdSBwcm9maWxlIMOgIHV0aWxpc2VyICovXG4gICAgdGhpcy5wcm9maWxlID0gdGhpcy5vcHRpb25zLmdyYXBoO1xuXG4gICAgLyoqIHByb2plY3Rpb24gKGNvZGUgRVBTRyBjb21tZSBlcHNnOjQzMjYgb3Ugd2dzODQpICovXG4gICAgdGhpcy5jcnMgPSB0aGlzLm9wdGlvbnMuc3JzO1xuXG4gICAgLyoqIExpc3RlIGRlcyBjb250cmFpbnRlcyAqL1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLm9wdGlvbnMuY29uc3RyYWludHM7XG5cbiAgICAvKiogTm9tIGRlIGwnb3B0aW1pc2F0aW9uIMOgIHV0aWxpc2VyICovXG4gICAgdGhpcy5vcHRpbWl6YXRpb24gPSB0aGlzLm9wdGlvbnMucm91dGVQcmVmZXJlbmNlO1xuXG4gICAgLyoqIEZvcm1hdCBkZSBzb3J0aWUgKHLDqXN1bcOpIGRlIGzigJlpdGluw6lyYWlyZSkgKi9cbiAgICB0aGlzLmdldFN0ZXBzID0gKHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuXG4gICAgLyoqIFVuaXTDqSBkZXMgZGlzdGFuY2VzICovXG4gICAgdGhpcy5kaXN0YW5jZVVuaXQgPSB0aGlzLm9wdGlvbnMuZGlzdGFuY2VVbml0O1xuXG4gICAgLyoqIFVuaXTDqSBkZXMgZHVyw6llcyAqL1xuICAgIHRoaXMudGltZVVuaXQgPSB0aGlzLm9wdGlvbnMudGltZVVuaXQ7XG5cbiAgICAvKiogQXR0cmlidXRzIGRlcyB2b2llcyAqL1xuICAgIHRoaXMud2F5c0F0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMud2F5c0F0dHJpYnV0ZXM7XG59XG5cbi8qKlxuICogQ0xBU1NOQU1FXG4gKi9cblJvdXRlUGFyYW1SRVNULkNMQVNTTkFNRSA9IFwiUm91dGVQYXJhbVJFU1RcIjtcblxuUm91dGVQYXJhbVJFU1QucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQGxlbmRzIG1vZHVsZTpSb3V0ZVBhcmFtUkVTVCNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGV1ciAoYWxpYXMpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgOiBSb3V0ZVBhcmFtUkVTVCxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIHVuZSBsaXN0ZSBkZSBwb2ludHNcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB1bmUgbGlzdGUgZGUgcG9pbnRzIChzZXAgJ3wnKVxuICAgICAqL1xuICAgIGdldEludGVybWVkaWF0ZXMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5pbnRlcm1lZGlhdGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmludGVybWVkaWF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5pbnRlcm1lZGlhdGVzW2ldO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gob2JqLnggKyBcIixcIiArIG9iai55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheS5qb2luKFwifFwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgdW5lIGxpc3RlIGQnYXR0cmlidXRzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdW5lIGxpc3RlIGQnYXR0cmlidXRzIChzZXAgJ3wnKVxuICAgICAqL1xuICAgIGdldFdheXNBdHRyaWJ1dGVzIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53YXlzQXR0cmlidXRlcy5qb2luKFwifFwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0b3VybmUgdW4gcHJvZmlsZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHByb2ZpbGVcbiAgICAgKi9cbiAgICBnZXRQcm9maWxlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSB1biBkaXN0YW5jZVVuaXRcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBkaXN0YW5jZVVuaXRcbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZVVuaXQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3RhbmNlVW5pdCA9PT0gXCJtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm1ldGVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlzdGFuY2VVbml0ID09PSBcImttXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImtpbG9tZXRlclwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXRvdXJuZSB1bmUgb3B0aW1pc2F0aW9uXG4gICAgICogQHJldHVybnMge1N0cmluZ30gb3B0aW1pemF0aW9uXG4gICAgICovXG4gICAgZ2V0T3B0aW1pemF0aW9uIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpbWl6YXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGltaXphdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldG91cm5lIGxhIGxpc3RlIGRlcyBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHVuZSBsaXN0ZSBkZXMgY29uc3RyYWludHMgKHNlcCAnfCcpXG4gICAgICovXG4gICAgZ2V0Q29uc3RyYWludHMgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25zdHJhaW50QXJyYXkgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRBcnJheS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3RyYWludHNba10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RyYWludEFycmF5LmpvaW4oXCJ8XCIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGFibGVhdSBkZSBjbGVmcy92YWxldXJzIHBvdXIgcGFyYW0uXG4gKlxuICogQHJldHVybnMge0FycmF5fSBsaXN0ZSBkZSBwYXJhbcOqdHJlc1xuICovXG5Sb3V0ZVBhcmFtUkVTVC5wcm90b3R5cGUuZ2V0UGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSBbXTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwicmVzb3VyY2VcIixcbiAgICAgICAgdiA6IHRoaXMucmVzb3VyY2VcbiAgICB9KTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwic3RhcnRcIixcbiAgICAgICAgdiA6IHRoaXMuc3RhcnRcbiAgICB9KTtcblxuICAgIG1hcC5wdXNoKHtcbiAgICAgICAgayA6IFwiZW5kXCIsXG4gICAgICAgIHYgOiB0aGlzLmVuZFxuICAgIH0pO1xuXG4gICAgbWFwLnB1c2goe1xuICAgICAgICBrIDogXCJnZW9tZXRyeUZvcm1hdFwiLFxuICAgICAgICB2IDogXCJnZW9qc29uXCJcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGltaXphdGlvbikge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJvcHRpbWl6YXRpb25cIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmdldE9wdGltaXphdGlvbigpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmludGVybWVkaWF0ZXMpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwiaW50ZXJtZWRpYXRlc1wiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0SW50ZXJtZWRpYXRlcygpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2ZpbGUpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwicHJvZmlsZVwiLFxuICAgICAgICAgICAgdiA6IHRoaXMuZ2V0UHJvZmlsZSgpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzKSB7XG4gICAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgICAgIGsgOiBcImNvbnN0cmFpbnRzXCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXRDb25zdHJhaW50cygpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNycykge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJjcnNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmNyc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXN0YW5jZVVuaXQpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwiZGlzdGFuY2VVbml0XCIsXG4gICAgICAgICAgICB2IDogdGhpcy5nZXREaXN0YW5jZVVuaXQoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aW1lVW5pdCkge1xuICAgICAgICBtYXAucHVzaCh7XG4gICAgICAgICAgICBrIDogXCJ0aW1lVW5pdFwiLFxuICAgICAgICAgICAgdiA6IHRoaXMudGltZVVuaXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2F5c0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgbWFwLnB1c2goe1xuICAgICAgICAgICAgayA6IFwid2F5c0F0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIHYgOiB0aGlzLmdldFdheXNBdHRyaWJ1dGVzKClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlUGFyYW1SRVNUO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Services/Route/Request/model/RouteParamREST.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Response/RouteResponseFactory.js": +/*!*************************************************************!*\ + !*** ./src/Services/Route/Response/RouteResponseFactory.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./model/RouteResponse */ \"./src/Services/Route/Response/model/RouteResponse.js\");\n/* harmony import */ var _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model/RouteInstruction */ \"./src/Services/Route/Response/model/RouteInstruction.js\");\n\n\n\n\n\n\n/**\n * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON\n * (Factory)\n *\n * @module RouteResponseFactory\n * @alias Gp.Services.Route.Response.RouteResponseFactory\n * @private\n */\nvar RouteResponseFactory = {\n /**\n * interface unique\n *\n * @method build\n * @static\n * @param {Object} options - options definies dans le composant Route\n *\n * @example\n * var options = {\n * response :\n * outputFormat :\n * rawResponse :\n * scope :\n * onSuccess :\n * onError :\n * };\n *\n */\n build: function build(options) {\n // logger\n var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"RouteResponseFactory\");\n logger.trace(\"RouteResponseFactory::build()\");\n var data = null;\n if (options.response) {\n if (options.rawResponse) {\n logger.trace(\"analyze response : raw\");\n data = options.response;\n } else {\n logger.trace(\"analyze response : json\");\n var JSONResponse;\n if (typeof options.response === \"string\") {\n JSONResponse = JSON.parse(options.response);\n } else {\n JSONResponse = options.response;\n }\n\n // construction de l'objet réponse JSON\n if (JSONResponse) {\n // le service renvoie t il une erreur ?\n if (JSONResponse.message) {\n // ex. {\"message\":\"message not null\", \"status\":\"ERROR\"}\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION\", JSONResponse.message)));\n return;\n }\n var legs = [];\n var legSteps = [];\n var steps = [];\n data = new _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]();\n if (data.hasOwnProperty(\"totalTime\")) {\n data.totalTime = parseFloat(JSONResponse.duration);\n }\n if (data.hasOwnProperty(\"totalDistance\")) {\n data.totalDistance = parseFloat(JSONResponse.distance);\n }\n if (data.hasOwnProperty(\"bbox\")) {\n data.bbox.left = parseFloat(JSONResponse.bbox[0]);\n data.bbox.bottom = parseFloat(JSONResponse.bbox[1]);\n data.bbox.right = parseFloat(JSONResponse.bbox[2]);\n data.bbox.top = parseFloat(JSONResponse.bbox[3]);\n }\n if (data.hasOwnProperty(\"routeGeometry\") && !options.geometryInInstructions) {\n data.routeGeometry = JSONResponse.geometry;\n }\n if (data.hasOwnProperty(\"routeInstructions\") && options.geometryInInstructions) {\n var legList = JSONResponse.portions;\n var i;\n if (Array.isArray(legList) && legList.length) {\n for (i = 0; i < legList.length; i++) {\n legs.push(legList[i]);\n }\n }\n if (legs.length) {\n for (i = 0; i < legs.length; i++) {\n legSteps.push(legs[i].steps);\n }\n }\n if (legSteps.length) {\n for (i = 0; i < legSteps.length; i++) {\n steps = steps.concat(legSteps[i]);\n }\n }\n steps.forEach(function (step) {\n data.routeInstructions.push(new _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__[\"default\"]());\n data.routeInstructions[data.routeInstructions.length - 1].duration = step.duration;\n data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance;\n data.routeInstructions[data.routeInstructions.length - 1].code = \"\";\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"\";\n data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry;\n\n // on ne souhaite pas de ce type de valeur...\n if (step.name === \"Valeur non renseignée\") {\n step.name = \"\";\n }\n switch (step.instruction.type) {\n case \"turn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Tourner\";\n break;\n case \"new name\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Continuer tout droit\";\n break;\n case \"depart\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Départ\";\n break;\n case \"arrive\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Arrivée\";\n break;\n case \"merge\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Rejoindre\";\n break;\n case \"ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la bretelle\";\n break;\n case \"on ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la bretelle\";\n break;\n case \"off ramp\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Prendre la sortie\";\n break;\n case \"fork\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Sur la bifurcation, prendre\";\n break;\n case \"end of road\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"À la fin de la route, prendre\";\n break;\n case \"use lane\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Utiliser la file\";\n break;\n case \"continue\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Continuer\";\n break;\n case \"roundabout\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond-point\";\n break;\n case \"rotary\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond-point\";\n break;\n case \"roundabout turn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"Au rond point, tourner\";\n break;\n case \"notification\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"\";\n break;\n default:\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"?\" + step.instruction.type + \"?\";\n break;\n }\n if (step.instruction.modifier) {\n switch (step.instruction.modifier) {\n case \"uturn\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"Faire demi-tour\";\n break;\n case \"sharp right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" complètement à droite\";\n break;\n case \"right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" à droite\";\n break;\n case \"slight right\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" légèrement à droite\";\n break;\n case \"straight\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction = \"Continuer tout droit\";\n break;\n case \"slight left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" lègèrement à gauche\";\n break;\n case \"left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" à gauche\";\n break;\n case \"sharp left\":\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" complètement à gauche\";\n break;\n default:\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" ?\" + step.instruction.modifier + \"?\";\n break;\n }\n }\n if (step.instruction.exit) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \"\".concat(step.instruction.exit, \"e sortie\");\n }\n if (step.attributes.name) {\n if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" sur\";\n }\n if (step.attributes.name.nom_1_droite) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" \".concat(step.attributes.name.nom_1_droite);\n }\n if (step.attributes.name.toponyme) {\n data.routeInstructions[data.routeInstructions.length - 1].instruction += \" \".concat(step.attributes.name.toponyme);\n }\n }\n });\n }\n }\n if (!data) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_ANALYSE\", \"json\")));\n return;\n }\n\n // Si la réponse contenait une exception renvoyée par le service\n if (data.exceptionReport) {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EXCEPTION_2\")));\n return;\n }\n }\n } else {\n options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n return;\n }\n options.onSuccess.call(options.scope, data);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteResponseFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9Sb3V0ZVJlc3BvbnNlRmFjdG9yeS5qcz8zMTg2Il0sIm5hbWVzIjpbIlJvdXRlUmVzcG9uc2VGYWN0b3J5IiwiYnVpbGQiLCJvcHRpb25zIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJkYXRhIiwicmVzcG9uc2UiLCJyYXdSZXNwb25zZSIsIkpTT05SZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsIm1lc3NhZ2UiLCJvbkVycm9yIiwiY2FsbCIsInNjb3BlIiwiRXJyb3JTZXJ2aWNlIiwiTVJlcyIsImdldE1lc3NhZ2UiLCJsZWdzIiwibGVnU3RlcHMiLCJzdGVwcyIsIlJvdXRlUmVzcG9uc2UiLCJoYXNPd25Qcm9wZXJ0eSIsInRvdGFsVGltZSIsInBhcnNlRmxvYXQiLCJkdXJhdGlvbiIsInRvdGFsRGlzdGFuY2UiLCJkaXN0YW5jZSIsImJib3giLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJ0b3AiLCJnZW9tZXRyeUluSW5zdHJ1Y3Rpb25zIiwicm91dGVHZW9tZXRyeSIsImdlb21ldHJ5IiwibGVnTGlzdCIsInBvcnRpb25zIiwiaSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInB1c2giLCJjb25jYXQiLCJmb3JFYWNoIiwic3RlcCIsInJvdXRlSW5zdHJ1Y3Rpb25zIiwiUm91dGVJbnN0cnVjdGlvbiIsImNvZGUiLCJpbnN0cnVjdGlvbiIsIm5hbWUiLCJ0eXBlIiwibW9kaWZpZXIiLCJleGl0IiwiYXR0cmlidXRlcyIsIm5vbV8xX2Ryb2l0ZSIsInRvcG9ueW1lIiwiZXhjZXB0aW9uUmVwb3J0Iiwib25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0Q7QUFDQTtBQUNRO0FBQ1Y7QUFDTTs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLG9C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Q2hHO0lBQ0o7SUFFQWpCLE9BQU8sQ0FBQzBELFNBQVMsQ0FBQzdDLElBQUksQ0FBQ2IsT0FBTyxDQUFDYyxLQUFLLEVBQUVULElBQUksQ0FBQztFQUMvQztBQUNKLENBQUM7QUFFY1AsbUZBQW9CIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1Jlc3BvbnNlL1JvdXRlUmVzcG9uc2VGYWN0b3J5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgTVJlcyBmcm9tIFwiLi4vLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZSBmcm9tIFwiLi9tb2RlbC9Sb3V0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgUm91dGVJbnN0cnVjdGlvbiBmcm9tIFwiLi9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uXCI7XG5cbi8qKlxuICogRmFjdG9yeSBwb3VyIGfDqW7DqXJlciB1bmUgcmVwb25zZSBKU09OIMOgIHBhcnRpciBkJ3VuIFhNTCBvdSBkJ3VuIEpTT05cbiAqIChGYWN0b3J5KVxuICpcbiAqIEBtb2R1bGUgUm91dGVSZXNwb25zZUZhY3RvcnlcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZS5SZXNwb25zZS5Sb3V0ZVJlc3BvbnNlRmFjdG9yeVxuICogQHByaXZhdGVcbiAqL1xudmFyIFJvdXRlUmVzcG9uc2VGYWN0b3J5ID0ge1xuXG4gICAgLyoqXG4gICAgICogaW50ZXJmYWNlIHVuaXF1ZVxuICAgICAqXG4gICAgICogQG1ldGhvZCBidWlsZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgZGVmaW5pZXMgZGFucyBsZSBjb21wb3NhbnQgUm91dGVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgIHJlc3BvbnNlIDpcbiAgICAgKiAgICAgIG91dHB1dEZvcm1hdCA6XG4gICAgICogICAgICByYXdSZXNwb25zZSA6XG4gICAgICogICAgICBzY29wZSA6XG4gICAgICogICAgICBvblN1Y2Nlc3MgOlxuICAgICAqICAgICAgb25FcnJvciA6XG4gICAgICogICB9O1xuICAgICAqXG4gICAgICovXG4gICAgYnVpbGQgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBsb2dnZXJcbiAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJSb3V0ZVJlc3BvbnNlRmFjdG9yeVwiKTtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiUm91dGVSZXNwb25zZUZhY3Rvcnk6OmJ1aWxkKClcIik7XG5cbiAgICAgICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiByYXdcIik7XG4gICAgICAgICAgICAgICAgZGF0YSA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImFuYWx5emUgcmVzcG9uc2UgOiBqc29uXCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIEpTT05SZXNwb25zZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgSlNPTlJlc3BvbnNlID0gSlNPTi5wYXJzZShvcHRpb25zLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBKU09OUmVzcG9uc2UgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbiBkZSBsJ29iamV0IHLDqXBvbnNlIEpTT05cbiAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxlIHNlcnZpY2UgcmVudm9pZSB0IGlsIHVuZSBlcnJldXIgP1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTlJlc3BvbnNlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4LiB7XCJtZXNzYWdlXCI6XCJtZXNzYWdlIG5vdCBudWxsXCIsIFwic3RhdHVzXCI6XCJFUlJPUlwifVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTlwiLCBKU09OUmVzcG9uc2UubWVzc2FnZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVnU3RlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBSb3V0ZVJlc3BvbnNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJ0b3RhbFRpbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudG90YWxUaW1lID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwidG90YWxEaXN0YW5jZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50b3RhbERpc3RhbmNlID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJiYm94XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJib3gubGVmdCA9IHBhcnNlRmxvYXQoSlNPTlJlc3BvbnNlLmJib3hbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iYm94LmJvdHRvbSA9IHBhcnNlRmxvYXQoSlNPTlJlc3BvbnNlLmJib3hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iYm94LnJpZ2h0ID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuYmJveFsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJib3gudG9wID0gcGFyc2VGbG9hdChKU09OUmVzcG9uc2UuYmJveFszXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInJvdXRlR2VvbWV0cnlcIikgJiYgIW9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUdlb21ldHJ5ID0gSlNPTlJlc3BvbnNlLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJyb3V0ZUluc3RydWN0aW9uc1wiKSAmJiBvcHRpb25zLmdlb21ldHJ5SW5JbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZWdMaXN0ID0gSlNPTlJlc3BvbnNlLnBvcnRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZWdMaXN0KSAmJiBsZWdMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZWdMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ3MucHVzaChsZWdMaXN0W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdTdGVwcy5wdXNoKGxlZ3NbaV0uc3RlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdTdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVnU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcy5jb25jYXQobGVnU3RlcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnMucHVzaChuZXcgUm91dGVJbnN0cnVjdGlvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZHVyYXRpb24gPSBzdGVwLmR1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kaXN0YW5jZSA9IHN0ZXAuZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmNvZGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmdlb21ldHJ5ID0gc3RlcC5nZW9tZXRyeTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG5lIHNvdWhhaXRlIHBhcyBkZSBjZSB0eXBlIGRlIHZhbGV1ci4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLm5hbWUgPT09IFwiVmFsZXVyIG5vbiByZW5zZWlnbsOpZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGVwLmluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInR1cm5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIlRvdXJuZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibmV3IG5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkNvbnRpbnVlciB0b3V0IGRyb2l0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRlcGFydFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiRMOpcGFydFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJpdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkFycml2w6llXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lcmdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJSZWpvaW5kcmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmFtcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiUHJlbmRyZSBsYSBicmV0ZWxsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJvbiByYW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJQcmVuZHJlIGxhIGJyZXRlbGxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZiByYW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJQcmVuZHJlIGxhIHNvcnRpZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb3JrXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJTdXIgbGEgYmlmdXJjYXRpb24sIHByZW5kcmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kIG9mIHJvYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIsOAIGxhIGZpbiBkZSBsYSByb3V0ZSwgcHJlbmRyZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1c2UgbGFuZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiVXRpbGlzZXIgbGEgZmlsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjb250aW51ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiQ29udGludWVyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJvdW5kYWJvdXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIkF1IHJvbmQtcG9pbnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicm90YXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCJBdSByb25kLXBvaW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJvdW5kYWJvdXQgdHVyblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiQXUgcm9uZCBwb2ludCwgdG91cm5lclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3RpZmljYXRpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCI/XCIgKyBzdGVwLmluc3RydWN0aW9uLnR5cGUgKyBcIj9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmluc3RydWN0aW9uLm1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RlcC5pbnN0cnVjdGlvbi5tb2RpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInV0dXJuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uID0gXCJGYWlyZSBkZW1pLXRvdXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaGFycCByaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBjb21wbMOodGVtZW50IMOgIGRyb2l0ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiIMOgIGRyb2l0ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNsaWdodCByaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBsw6lnw6hyZW1lbnQgw6AgZHJvaXRlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyYWlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gPSBcIkNvbnRpbnVlciB0b3V0IGRyb2l0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2xpZ2h0IGxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgbMOoZ8OocmVtZW50IMOgIGdhdWNoZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgw6AgZ2F1Y2hlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2hhcnAgbGVmdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucm91dGVJbnN0cnVjdGlvbnNbZGF0YS5yb3V0ZUluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5pbnN0cnVjdGlvbiArPSBcIiBjb21wbMOodGVtZW50IMOgIGdhdWNoZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gXCIgP1wiICsgc3RlcC5pbnN0cnVjdGlvbi5tb2RpZmllciArIFwiP1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuaW5zdHJ1Y3Rpb24uZXhpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zW2RhdGEucm91dGVJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uaW5zdHJ1Y3Rpb24gKz0gYCR7c3RlcC5pbnN0cnVjdGlvbi5leGl0fWUgc29ydGllYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC5hdHRyaWJ1dGVzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuYXR0cmlidXRlcy5uYW1lLm5vbV8xX2Ryb2l0ZSB8fCBzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IFwiIHN1clwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuYXR0cmlidXRlcy5uYW1lLm5vbV8xX2Ryb2l0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IGAgJHtzdGVwLmF0dHJpYnV0ZXMubmFtZS5ub21fMV9kcm9pdGV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yb3V0ZUluc3RydWN0aW9uc1tkYXRhLnJvdXRlSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmluc3RydWN0aW9uICs9IGAgJHtzdGVwLmF0dHJpYnV0ZXMubmFtZS50b3BvbnltZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VcIiwgXCJqc29uXCIpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaSBsYSByw6lwb25zZSBjb250ZW5haXQgdW5lIGV4Y2VwdGlvbiByZW52b3nDqWUgcGFyIGxlIHNlcnZpY2VcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5leGNlcHRpb25SZXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVycm9yLmNhbGwob3B0aW9ucy5zY29wZSwgbmV3IEVycm9yU2VydmljZShNUmVzLmdldE1lc3NhZ2UoXCJTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTl8yXCIpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uRXJyb3IuY2FsbChvcHRpb25zLnNjb3BlLCBuZXcgRXJyb3JTZXJ2aWNlKE1SZXMuZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMub25TdWNjZXNzLmNhbGwob3B0aW9ucy5zY29wZSwgZGF0YSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUm91dGVSZXNwb25zZUZhY3Rvcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/RouteResponseFactory.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Response/model/RouteInstruction.js": +/*!***************************************************************!*\ + !*** ./src/Services/Route/Response/model/RouteInstruction.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Single Route Instruction object.\n *\n * @property {String} code - Instruction code :\n *\n * - \"F\" : Straight forward\n * - \"B\" : U-turn\n * - \"L\" : turn left\n * - \"R\" : turn right\n * - \"BL\" : turn left strongly\n * - \"BR\" : turn right strongly\n * - \"FL\" : turn lightly to the left\n * - \"FR\" : turn lightly to the right\n * - \"round_about_entry\" : round about entry\n * - \"round_about_exit\" : round about exit\n *\n * @property {String} instruction - Instruction text : translated code + street name\n * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street.\n * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter.\n * @property {Float} duration - Instruction duration in seconds.\n *\n * @namespace\n * @alias Gp.Services.Route.RouteInstruction\n */\nfunction RouteInstruction() {\n if (!(this instanceof RouteInstruction)) {\n throw new TypeError(\"RouteInstruction constructor cannot be called as a function.\");\n }\n this.duration = null;\n this.distance = null;\n this.code = null;\n this.instruction = null;\n this.geometry = null; // FIXME can be null if option 'geometryInInstructions' is false !\n}\n\nRouteInstruction.prototype = {\n constructor: RouteInstruction\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteInstruction);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZUluc3RydWN0aW9uLmpzPzFlOTciXSwibmFtZXMiOlsiUm91dGVJbnN0cnVjdGlvbiIsIlR5cGVFcnJvciIsImR1cmF0aW9uIiwiZGlzdGFuY2UiLCJjb2RlIiwiaW5zdHJ1Y3Rpb24iLCJnZW9tZXRyeSIsInByb3RvdHlwZSIsImNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLGdCQUFnQkEsQ0FBQSxFQUFJO0VBQ3pCLElBQUksRUFBRSxJQUFJLFlBQVlBLGdCQUFnQixDQUFDLEVBQUU7SUFDckMsTUFBTSxJQUFJQyxTQUFTLENBQUMsOERBQThELENBQUM7RUFDdkY7RUFFQSxJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBRXBCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUk7RUFFcEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUVoQixJQUFJLENBQUNDLFdBQVcsR0FBRyxJQUFJO0VBRXZCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFCOztBQUVBTixnQkFBZ0IsQ0FBQ08sU0FBUyxHQUFHO0VBRXpCQyxXQUFXLEVBQUdSO0FBRWxCLENBQUM7QUFFY0EsK0VBQWdCIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1JvdXRlL1Jlc3BvbnNlL21vZGVsL1JvdXRlSW5zdHJ1Y3Rpb24uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogU2luZ2xlIFJvdXRlIEluc3RydWN0aW9uIG9iamVjdC5cbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY29kZSAtIEluc3RydWN0aW9uIGNvZGUgOlxuICpcbiAqIC0gXCJGXCIgOiBTdHJhaWdodCBmb3J3YXJkXG4gKiAtIFwiQlwiIDogVS10dXJuXG4gKiAtIFwiTFwiIDogdHVybiBsZWZ0XG4gKiAtIFwiUlwiIDogdHVybiByaWdodFxuICogLSBcIkJMXCIgOiB0dXJuIGxlZnQgc3Ryb25nbHlcbiAqIC0gXCJCUlwiIDogdHVybiByaWdodCBzdHJvbmdseVxuICogLSBcIkZMXCIgOiB0dXJuIGxpZ2h0bHkgdG8gdGhlIGxlZnRcbiAqIC0gXCJGUlwiIDogdHVybiBsaWdodGx5IHRvIHRoZSByaWdodFxuICogLSBcInJvdW5kX2Fib3V0X2VudHJ5XCIgOiByb3VuZCBhYm91dCBlbnRyeVxuICogLSBcInJvdW5kX2Fib3V0X2V4aXRcIiA6IHJvdW5kIGFib3V0IGV4aXRcbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaW5zdHJ1Y3Rpb24gLSBJbnN0cnVjdGlvbiB0ZXh0IDogdHJhbnNsYXRlZCBjb2RlICsgc3RyZWV0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBnZW9tZXRyeSAtIEdlb21ldHJ5IChleHByZXNzZWQgaW4gW0dlb0pTT05de0BsaW5rIGh0dHA6Ly9nZW9qc29uLm9yZy99KSBvZiB0aGUgc3RyZWV0LlxuICogQHByb3BlcnR5IHtGbG9hdH0gZGlzdGFuY2UgLSBMZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLiBFeHByZXNzZWQgaW4ga20gb3IgbSwgZGVwZW5kaW5nIG9uIGRpc3RhbmNlVW5pdCBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge0Zsb2F0fSBkdXJhdGlvbiAtIEluc3RydWN0aW9uIGR1cmF0aW9uIGluIHNlY29uZHMuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLlNlcnZpY2VzLlJvdXRlLlJvdXRlSW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gUm91dGVJbnN0cnVjdGlvbiAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJvdXRlSW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJSb3V0ZUluc3RydWN0aW9uIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG5cbiAgICB0aGlzLmRpc3RhbmNlID0gbnVsbDtcblxuICAgIHRoaXMuY29kZSA9IG51bGw7XG5cbiAgICB0aGlzLmluc3RydWN0aW9uID0gbnVsbDtcblxuICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsOyAvLyBGSVhNRSBjYW4gYmUgbnVsbCBpZiBvcHRpb24gJ2dlb21ldHJ5SW5JbnN0cnVjdGlvbnMnIGlzIGZhbHNlICFcbn1cblxuUm91dGVJbnN0cnVjdGlvbi5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvciA6IFJvdXRlSW5zdHJ1Y3Rpb25cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgUm91dGVJbnN0cnVjdGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/model/RouteInstruction.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Response/model/RouteResponse.js": +/*!************************************************************!*\ + !*** ./src/Services/Route/Response/model/RouteResponse.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function.\n *\n * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call.\n * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route.\n * @property {Array.} routeInstructions - Instructions of the route.\n * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to \"km\" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by \" Km\" (e.g. : \"19.6 Km\"). If distanceUnit parameter was set to \"m\", totalDistance is a string containing the total distance expressed in meters (e.g. : \"19599.14\").\n * @property {Float} totalTime - Route duration in seconds.\n *\n * @namespace\n * @alias Gp.Services.RouteResponse\n */\nfunction RouteResponse() {\n if (!(this instanceof RouteResponse)) {\n throw new TypeError(\"RouteResponse constructor cannot be called as a function.\");\n }\n this.totalTime = null;\n this.totalDistance = null;\n this.bbox = {\n left: null,\n right: null,\n top: null,\n bottom: null\n };\n this.routeGeometry = null; // FIXME can be null if option 'geometryInInstructions' is true !\n\n this.routeInstructions = [];\n}\nRouteResponse.prototype = {\n constructor: RouteResponse\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (RouteResponse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9SZXNwb25zZS9tb2RlbC9Sb3V0ZVJlc3BvbnNlLmpzPzg5ZTciXSwibmFtZXMiOlsiUm91dGVSZXNwb25zZSIsIlR5cGVFcnJvciIsInRvdGFsVGltZSIsInRvdGFsRGlzdGFuY2UiLCJiYm94IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwicm91dGVHZW9tZXRyeSIsInJvdXRlSW5zdHJ1Y3Rpb25zIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsYUFBYUEsQ0FBQSxFQUFJO0VBQ3RCLElBQUksRUFBRSxJQUFJLFlBQVlBLGFBQWEsQ0FBQyxFQUFFO0lBQ2xDLE1BQU0sSUFBSUMsU0FBUyxDQUFDLDJEQUEyRCxDQUFDO0VBQ3BGO0VBRUEsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSTtFQUVyQixJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJO0VBRXpCLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ1JDLElBQUksRUFBRyxJQUFJO0lBQ1hDLEtBQUssRUFBRyxJQUFJO0lBQ1pDLEdBQUcsRUFBRyxJQUFJO0lBQ1ZDLE1BQU0sRUFBRztFQUNiLENBQUM7RUFFRCxJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQzs7RUFFM0IsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxFQUFFO0FBQy9CO0FBRUFWLGFBQWEsQ0FBQ1csU0FBUyxHQUFHO0VBRXRCQyxXQUFXLEVBQUdaO0FBRWxCLENBQUM7QUFFY0EsNEVBQWEiLCJmaWxlIjoiLi9zcmMvU2VydmljZXMvUm91dGUvUmVzcG9uc2UvbW9kZWwvUm91dGVSZXNwb25zZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciB7QGxpbmsgbW9kdWxlOlNlcnZpY2VzfnJvdXRlIEdwLlNlcnZpY2VzLnJvdXRlICgpfSBpbnZvY2F0aW9uIHdoZW4gc3VjY2Vzc2Z1bC4gUmVjZWl2ZWQgYXMgdGhlIGFyZ3VtZW50IG9mIG9uU3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0dwLkJCb3h9IGJib3ggLSBCb3VuZGluZyBCb3ggb2YgdGhlIHJvdXRlLiBHaXZlbiB3aGVuIHByb3ZpZGVCQm94IHBhcmFtZXRlciBpcyB1c2VkIGluIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcHJvcGVydHkge09iamVjdH0gcm91dGVHZW9tZXRyeSAtIEdlb21ldHJ5IChleHByZXNzZWQgaW4gW0dlb0pTT05de0BsaW5rIGh0dHA6Ly9nZW9qc29uLm9yZy99KSBvZiB0aGUgcm91dGUuXG4gKiBAcHJvcGVydHkge0FycmF5LjxHcC5TZXJ2aWNlcy5Sb3V0ZS5Sb3V0ZUluc3RydWN0aW9uPn0gcm91dGVJbnN0cnVjdGlvbnMgLSBJbnN0cnVjdGlvbnMgb2YgdGhlIHJvdXRlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRvdGFsRGlzdGFuY2UgLSBMZW5ndGggb2YgdGhlIHJvdXRlLiBJZiBkaXN0YW5jZVVuaXQgcGFyYW1ldGVyIHdhcyBzZXQgdG8gXCJrbVwiIChkZWZhdWx0KSwgdG90YWxEaXN0YW5jZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0b3RhbCBkaXN0YW5jZSBleHByZXNzZWQgaW4ga2lsb21ldGVycywgZm9sbG93ZWQgYnkgXCIgS21cIiAoZS5nLiA6IFwiMTkuNiBLbVwiKS4gSWYgZGlzdGFuY2VVbml0IHBhcmFtZXRlciB3YXMgc2V0IHRvIFwibVwiLCB0b3RhbERpc3RhbmNlIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRvdGFsIGRpc3RhbmNlIGV4cHJlc3NlZCBpbiBtZXRlcnMgKGUuZy4gOiBcIjE5NTk5LjE0XCIpLlxuICogQHByb3BlcnR5IHtGbG9hdH0gdG90YWxUaW1lIC0gUm91dGUgZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuU2VydmljZXMuUm91dGVSZXNwb25zZVxuICovXG5mdW5jdGlvbiBSb3V0ZVJlc3BvbnNlICgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUm91dGVSZXNwb25zZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJvdXRlUmVzcG9uc2UgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdGFsVGltZSA9IG51bGw7XG5cbiAgICB0aGlzLnRvdGFsRGlzdGFuY2UgPSBudWxsO1xuXG4gICAgdGhpcy5iYm94ID0ge1xuICAgICAgICBsZWZ0IDogbnVsbCxcbiAgICAgICAgcmlnaHQgOiBudWxsLFxuICAgICAgICB0b3AgOiBudWxsLFxuICAgICAgICBib3R0b20gOiBudWxsXG4gICAgfTtcblxuICAgIHRoaXMucm91dGVHZW9tZXRyeSA9IG51bGw7IC8vIEZJWE1FIGNhbiBiZSBudWxsIGlmIG9wdGlvbiAnZ2VvbWV0cnlJbkluc3RydWN0aW9ucycgaXMgdHJ1ZSAhXG5cbiAgICB0aGlzLnJvdXRlSW5zdHJ1Y3Rpb25zID0gW107XG59XG5cblJvdXRlUmVzcG9uc2UucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBSb3V0ZVJlc3BvbnNlXG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlUmVzcG9uc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Route/Response/model/RouteResponse.js\n"); + +/***/ }), + +/***/ "./src/Services/Route/Route.js": +/*!*************************************!*\ + !*** ./src/Services/Route/Route.js ***! + \*************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Utils/LoggerByDefault */ \"./src/Utils/LoggerByDefault.js\");\n/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Utils/MessagesResources */ \"./src/Utils/MessagesResources.js\");\n/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../Exceptions/ErrorService */ \"./src/Exceptions/ErrorService.js\");\n/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../CommonService */ \"./src/Services/CommonService.js\");\n/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../DefaultUrlService */ \"./src/Services/DefaultUrlService.js\");\n/* harmony import */ var _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Request/RouteRequestFactory */ \"./src/Services/Route/Request/RouteRequestFactory.js\");\n/* harmony import */ var _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Response/RouteResponseFactory */ \"./src/Services/Route/Response/RouteResponseFactory.js\");\n\n\n\n\n\n\n\n\n/**\n * @classdesc\n * Appel du service d'itinéraire du Géoportail :\n * envoi de la requête construite selon les paramètres en options,\n * éventuellement parsing et analyse de la réponse,\n * retour d'une réponse en paramètre de la fonction onSuccess.\n *\n * @alias Gp.Services.Route\n * @constructor\n * @extends {Gp.Services.CommonService}\n * @param {Object} options - options spécifiques au service (+ les options heritées)\n *\n * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité.\n *\n * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut.\n *\n * @param {String} [options.routePreference = \"fastest\"] - Mode de calcul à utiliser :\n * - le plus rapide « fastest »\n * - le plus court « shortest »\n * Par défaut : « fastest ».\n *\n * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire.\n * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire.\n *\n * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326)\n * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire.\n * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire.\n *\n * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau.\n * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float}\n *\n * @param {String} [options.graph = \"voiture\"] - Type de graphe utilisé : \"Voiture\" ou \"Pieton\".\n * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non.\n * Par défaut, c'est la valeur \"Voiture\" qui sera utilisée.\n *\n * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre \"avoidFeature\" d'OpenLS)\n * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte\n * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »).\n * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints\n *\n * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement \"banned\".\n * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement \"wayType\".\n * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement \"=\".\n * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement \"autoroute\".\n *\n * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions.\n * (correspond au paramètre \"provideGeometry\" d'OpenLS) Par défaut : false.\n *\n * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse.\n * Par défaut : true.\n *\n * @param {String} [options.distanceUnit = \"m\"] - Indique si la distance doit être exprimée en km ou m dans la réponse.\n * Par défaut : m.\n * @param {String} [options.timeUnit = \"second\"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard.\n * Les valeurs possibles sont \"standard\", \"second\", \"minute\" ou \"hour\".\n * Par défaut : \"standard\".\n *\n * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés.\n * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'.\n *\n * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities.\n *\n * @example\n * var options = {\n * // options communes aux services\n * apiKey : null,\n * serverUrl : 'http://localhost/service/',\n * protocol : 'XHR',\n * proxyURL : null,\n * httpMethod : 'GET', // GET|POST\n * timeOut : 10000, // ms\n * rawResponse : false, // true|false\n * scope : null, // this\n * onSuccess : function (response) {},\n * onFailure : function (error) {},\n * // spécifique au service\n * resource : 'bdtopo'\n * outputFormat : 'json',\n * startPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * endPoint : {\n * x : 42.1121,\n * y : 1.5557\n * },\n * provideBbox : true,\n * exclusions : [\"Bridge\", \"Tunnel\", \"Toll\"],\n * distanceUnit : \"km\",\n * graph : \"Voiture\",\n * geometryInInstructions : true,\n * routePreference : \"fastest\"\n * };\n *\n */\nfunction Route(options) {\n if (!(this instanceof Route)) {\n throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"CLASS_CONSTRUCTOR\", \"Route\"));\n }\n\n /**\n * Nom de la classe (heritage)\n */\n this.CLASSNAME = \"Route\";\n\n // appel du constructeur par heritage\n _CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].apply(this, arguments);\n this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getLogger(\"Gp.Services.Route\");\n this.logger.trace(\"[Constructeur Route (options)]\");\n if (!options.startPoint) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.startPoint.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint.x\"));\n }\n if (options.startPoint.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"startPoint.y\"));\n }\n if (!options.endPoint) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint\"));\n }\n\n // on lance une exception afin d'eviter au service de le faire...\n if (options.endPoint.x === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint.x\"));\n }\n if (options.endPoint.y === null) {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_MISSING\", \"endPoint.y\"));\n }\n\n // options par defaut\n\n // on passe l'option outputFormat en minuscules afin d'éviter des exceptions.\n if (options.outputFormat && options.outputFormat !== \"json\") {\n this.logger.warn(\"options.outputFormat could only be json\");\n }\n this.options.outputFormat = \"json\";\n this.options.resource = options.resource || \"bdtopo-osrm\";\n this.options.startPoint = options.startPoint;\n this.options.endPoint = options.endPoint;\n this.options.viaPoints = options.viaPoints || [];\n this.options.routePreference = options.routePreference || \"fastest\";\n /** Gestion des anciennes valeurs de graph */\n if (options.graph) {\n if (options.graph === \"Voiture\") {\n this.options.graph = \"car\";\n }\n if (options.graph === \"Pieton\") {\n this.options.graph = \"pedestrian\";\n }\n } else {\n this.options.graph = \"car\";\n }\n this.options.constraints = [];\n if (options.constraints) {\n if (Array.isArray(options.constraints)) {\n for (var k = 0; k < options.constraints.length; k++) {\n this.options.constraints.push(options.constraints[k]);\n }\n } else {\n throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"PARAM_TYPE\", \"constraints\"));\n }\n }\n\n /** Gestion de l'ancien paramètre exclusion */\n var constraintTunnel = {};\n var constraintPont = {};\n var constraintAutoroute = {};\n if (options.exclusions) {\n if (options.exclusions.length !== 0) {\n this.logger.warn(\"options.exclusions is DEPRECATED !!\");\n for (var c = 0; c < options.exclusions.length; c++) {\n if (typeof options.exclusions[c] === \"string\") {\n options.exclusions[c] = options.exclusions[c].toLowerCase();\n } else {\n // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions\n continue;\n }\n if (options.exclusions[c] === \"toll\") {\n constraintAutoroute.constraintType = \"banned\";\n constraintAutoroute.key = \"wayType\";\n constraintAutoroute.operator = \"=\";\n constraintAutoroute.value = \"autoroute\";\n this.options.constraints.push(constraintAutoroute);\n }\n if (options.exclusions[c] === \"tunnel\") {\n constraintTunnel.constraintType = \"banned\";\n constraintTunnel.key = \"wayType\";\n constraintTunnel.operator = \"=\";\n constraintTunnel.value = \"tunnel\";\n this.options.constraints.push(constraintTunnel);\n }\n if (options.exclusions[c] === \"bridge\") {\n constraintPont.constraintType = \"banned\";\n constraintPont.key = \"wayType\";\n constraintPont.operator = \"=\";\n constraintPont.value = \"pont\";\n this.options.constraints.push(constraintPont);\n }\n }\n }\n }\n this.options.geometryInInstructions = options.geometryInInstructions || false;\n this.options.provideBbox = options.provideBbox || true;\n this.options.distanceUnit = options.distanceUnit || \"m\";\n this.options.timeUnit = options.timeUnit || \"second\";\n this.options.expectedStartTime = null; // FIXME not yet implemented !\n this.options.srs = options.srs || \"EPSG:4326\";\n this.options.waysAttributes = options.waysAttributes || [];\n\n // gestion de l'url du service par defaut\n // si l'url n'est pas renseignée, il faut utiliser les urls par defaut\n if (!this.options.serverUrl) {\n // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire\n /* var UrlByDefault = DefaultUrlService.Route.newUrl();\n if (this.options.oldRouteService) {\n UrlByDefault = DefaultUrlService.Route.url();\n } */\n // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire\n var UrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Route.url();\n if (!UrlByDefault) {\n throw new Error(\"Url by default not found !\");\n }\n this.options.serverUrl = UrlByDefault;\n this.logger.trace(\"Serveur URL par defaut : \" + this.options.serverUrl);\n }\n}\n\n/**\n * @lends module:Route#\n */\nRoute.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype, {\n // todo\n // getter/setter\n});\n\n/*\n * Constructeur (alias)\n */\nRoute.prototype.constructor = Route;\n\n/**\n * (overwrite)\n * Création de la requête\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nRoute.prototype.buildRequest = function (error, success) {\n var options = {\n // spécifique au service\n resource: this.options.resource,\n startPoint: this.options.startPoint,\n endPoint: this.options.endPoint,\n viaPoints: this.options.viaPoints,\n provideBbox: this.options.provideBbox,\n constraints: this.options.constraints,\n distanceUnit: this.options.distanceUnit,\n timeUnit: this.options.timeUnit,\n graph: this.options.graph,\n geometryInInstructions: this.options.geometryInInstructions,\n routePreference: this.options.routePreference,\n srs: this.options.srs,\n waysAttributes: this.options.waysAttributes\n };\n this.request = _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__[\"default\"].build(options);\n\n // on teste si la requete a bien été construite !\n if (!this.request) {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_REQUEST_BUILD\")));\n } else {\n success.call(this, this.request);\n }\n};\n\n/**\n * (overwrite)\n * Analyse de la reponse\n *\n * @param {Function} error - callback des erreurs\n * @param {Function} success - callback\n */\nRoute.prototype.analyzeResponse = function (error, success) {\n // INFO\n // Factory pour masquer la complexité du retour du service\n\n if (this.response) {\n var options = {\n distanceUnit: this.options.distanceUnit,\n timeUnit: this.options.timeUnit,\n response: this.response,\n outputFormat: this.options.outputFormat,\n // utile pour parser la string en mode XHR : JSON ou XML !\n rawResponse: this.options.rawResponse,\n onError: error,\n onSuccess: success,\n scope: this,\n geometryInInstructions: this.options.geometryInInstructions\n };\n _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"].build(options);\n } else {\n error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getMessage(\"SERVICE_RESPONSE_EMPTY\")));\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Route);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9Sb3V0ZS5qcz9lYjIwIl0sIm5hbWVzIjpbIlJvdXRlIiwib3B0aW9ucyIsIlR5cGVFcnJvciIsIl8iLCJnZXRNZXNzYWdlIiwiQ0xBU1NOQU1FIiwiQ29tbW9uU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9nZ2VyIiwiTG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidHJhY2UiLCJzdGFydFBvaW50IiwiRXJyb3IiLCJ4IiwieSIsImVuZFBvaW50Iiwib3V0cHV0Rm9ybWF0Iiwid2FybiIsInJlc291cmNlIiwidmlhUG9pbnRzIiwicm91dGVQcmVmZXJlbmNlIiwiZ3JhcGgiLCJjb25zdHJhaW50cyIsIkFycmF5IiwiaXNBcnJheSIsImsiLCJsZW5ndGgiLCJwdXNoIiwiY29uc3RyYWludFR1bm5lbCIsImNvbnN0cmFpbnRQb250IiwiY29uc3RyYWludEF1dG9yb3V0ZSIsImV4Y2x1c2lvbnMiLCJjIiwidG9Mb3dlckNhc2UiLCJjb25zdHJhaW50VHlwZSIsImtleSIsIm9wZXJhdG9yIiwidmFsdWUiLCJnZW9tZXRyeUluSW5zdHJ1Y3Rpb25zIiwicHJvdmlkZUJib3giLCJkaXN0YW5jZVVuaXQiLCJ0aW1lVW5pdCIsImV4cGVjdGVkU3RhcnRUaW1lIiwic3JzIiwid2F5c0F0dHJpYnV0ZXMiLCJzZXJ2ZXJVcmwiLCJVcmxCeURlZmF1bHQiLCJEZWZhdWx0VXJsU2VydmljZSIsInVybCIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwiYnVpbGRSZXF1ZXN0IiwiZXJyb3IiLCJzdWNjZXNzIiwicmVxdWVzdCIsIlJvdXRlUmVxdWVzdEZhY3RvcnkiLCJidWlsZCIsImNhbGwiLCJFcnJvclNlcnZpY2UiLCJhbmFseXplUmVzcG9uc2UiLCJyZXNwb25zZSIsInJhd1Jlc3BvbnNlIiwib25FcnJvciIsIm9uU3VjY2VzcyIsInNjb3BlIiwiUm91dGVSZXNwb25zZUZh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QUMsQ0FBQztFQUM3RSxDQUFDLE1BQU07SUFDSHFELE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUNILE9BQU8sQ0FBQztFQUNwQztBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTFELEtBQUssQ0FBQ21ELFNBQVMsQ0FBQ1ksZUFBZSxHQUFHLFVBQVVQLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQ3hEO0VBQ0E7O0VBRUEsSUFBSSxJQUFJLENBQUNPLFFBQVEsRUFBRTtJQUNmLElBQUkvRCxPQUFPLEdBQUc7TUFDVnlDLFlBQVksRUFBRyxJQUFJLENBQUN6QyxPQUFPLENBQUN5QyxZQUFZO01BQ3hDQyxRQUFRLEVBQUcsSUFBSSxDQUFDMUMsT0FBTyxDQUFDMEMsUUFBUTtNQUNoQ3FCLFFBQVEsRUFBRyxJQUFJLENBQUNBLFFBQVE7TUFDeEI5QyxZQUFZLEVBQUcsSUFBSSxDQUFDakIsT0FBTyxDQUFDaUIsWUFBWTtNQUFFO01BQzFDK0MsV0FBVyxFQUFHLElBQUksQ0FBQ2hFLE9BQU8sQ0FBQ2dFLFdBQVc7TUFDdENDLE9BQU8sRUFBR1YsS0FBSztNQUNmVyxTQUFTLEVBQUdWLE9BQU87TUFDbkJXLEtBQUssRUFBRyxJQUFJO01BQ1o1QixzQkFBc0IsRUFBRyxJQUFJLENBQUN2QyxPQUFPLENBQUN1QztJQUMxQyxDQUFDO0lBRUQ2QixzRUFBb0IsQ0FBQ1QsS0FBSyxDQUFDM0QsT0FBTyxDQUFDO0VBQ3ZDLENBQUMsTUFBTTtJQUNIdUQsS0FBSyxDQUFDSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUlDLGdFQUFZLENBQUMzRCxnRUFBQyxDQUFDQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzlFO0FBQ0osQ0FBQztBQUVjSixvRUFBSyIsImZpbGUiOiIuL3NyYy9TZXJ2aWNlcy9Sb3V0ZS9Sb3V0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vVXRpbHMvTG9nZ2VyQnlEZWZhdWx0XCI7XG5pbXBvcnQgXyBmcm9tIFwiLi4vLi4vVXRpbHMvTWVzc2FnZXNSZXNvdXJjZXNcIjtcbmltcG9ydCBFcnJvclNlcnZpY2UgZnJvbSBcIi4uLy4uL0V4Y2VwdGlvbnMvRXJyb3JTZXJ2aWNlXCI7XG5pbXBvcnQgQ29tbW9uU2VydmljZSBmcm9tIFwiLi4vQ29tbW9uU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRVcmxTZXJ2aWNlIGZyb20gXCIuLi9EZWZhdWx0VXJsU2VydmljZVwiO1xuaW1wb3J0IFJvdXRlUmVxdWVzdEZhY3RvcnkgZnJvbSBcIi4vUmVxdWVzdC9Sb3V0ZVJlcXVlc3RGYWN0b3J5XCI7XG5pbXBvcnQgUm91dGVSZXNwb25zZUZhY3RvcnkgZnJvbSBcIi4vUmVzcG9uc2UvUm91dGVSZXNwb25zZUZhY3RvcnlcIjtcblxuLyoqXG4gKiBAY2xhc3NkZXNjXG4gKiBBcHBlbCBkdSBzZXJ2aWNlIGQnaXRpbsOpcmFpcmUgZHUgR8Opb3BvcnRhaWwgOlxuICogICAgIGVudm9pIGRlIGxhIHJlcXXDqnRlIGNvbnN0cnVpdGUgc2Vsb24gbGVzIHBhcmFtw6h0cmVzIGVuIG9wdGlvbnMsXG4gKiAgICAgw6l2ZW50dWVsbGVtZW50IHBhcnNpbmcgZXQgYW5hbHlzZSAgZGUgbGEgcsOpcG9uc2UsXG4gKiAgICAgcmV0b3VyIGQndW5lIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUgZGUgbGEgZm9uY3Rpb24gb25TdWNjZXNzLlxuICpcbiAqIEBhbGlhcyBHcC5TZXJ2aWNlcy5Sb3V0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyB7R3AuU2VydmljZXMuQ29tbW9uU2VydmljZX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBzcMOpY2lmaXF1ZXMgYXUgc2VydmljZSAoKyBsZXMgb3B0aW9ucyBoZXJpdMOpZXMpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucmVzb3VyY2UgLSBMYSByZXNzb3VyY2UgdXRpbGlzw6llIHBvdXIgbGUgY2FsY3VsLiBDZSBwYXJhbcOodHJlIGRldnJhaXQgw6p0cmUgb2JsaWdhdG9pcmUgY2FyIGlsIGwnZXN0IGRhbnMgbCdhcHBlbCBhdSBzZXJ2aWNlLiBNYWlzIGlsIG5lIGwnZXN0IHBhcyBwb3VyIGRlcyByYWlzb25zIGRlIHLDqXRyb2NvbXBhdGliaWxpdMOpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLm91dHB1dEZvcm1hdCAtIExlIGZvcm1hdCBkZSBsYSByw6lwb25zZSBkdSBzZXJ2aWNlIGl0aW5lcmFpcmUgOiAnanNvbicgdW5pcXVlbWVudCBldCBwYXIgZMOpZmF1dC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucm91dGVQcmVmZXJlbmNlID0gXCJmYXN0ZXN0XCJdIC0gTW9kZSBkZSBjYWxjdWwgw6AgdXRpbGlzZXIgOlxuICogLSBsZSBwbHVzIHJhcGlkZSDCqyBmYXN0ZXN0IMK7XG4gKiAtIGxlIHBsdXMgY291cnQgwqsgc2hvcnRlc3QgwrtcbiAqIFBhciBkw6lmYXV0IDogwqsgZmFzdGVzdCDCuy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5zdGFydFBvaW50IC0gUG9pbnQgZGUgZMOpcGFydCBkdSBjYWxjdWwuIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KVxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5zdGFydFBvaW50LnggLSBBYmNpc3NlIGR1IHBvaW50IGRlIGTDqXBhcnQgZHUgY2FsY3VsIGQnaXRpbsOpcmFpcmUuXG4gKiBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnN0YXJ0UG9pbnQueSAtIE9yZG9ubsOpZSBkdSBwb2ludCBkZSBkw6lwYXJ0IGR1IGNhbGN1bCBkJ2l0aW7DqXJhaXJlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmVuZFBvaW50IC0gUG9pbnQgZCdhcnJpdsOpZSBkdSBjYWxjdWwuIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KVxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5lbmRQb2ludC54IC0gQWJjaXNzZSBkdSBwb2ludCBkJ2Fycml2w6llIGR1IGNhbGN1bCBkJ2l0aW7DqXJhaXJlLlxuICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5lbmRQb2ludC55IC0gT3Jkb25uw6llIGR1IHBvaW50IGQnYXJyaXbDqWUgZHUgY2FsY3VsIGQnaXRpbsOpcmFpcmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbXX0gW29wdGlvbnMudmlhUG9pbnRzXSAtIExpc3RlIGRlIHBvaW50ICh7eDpGbG9hdCx5OkZsb2F0fSkgaW50ZXJtw6lkYWlyZXMgcXVlIGwnaXRpbsOpcmFpcmUgZG9pdCBlbXBydW50ZXIgZGFucyBsJ29yZHJlIGR1IHRhYmxlYXUuXG4gKiAgICAgIENvb3Jkb25uw6llcyBleHByaW3DqWVzIGVuIGxvbmdpdHVkZXMsIGxhdGl0dWRlcyAoRVBTRzo0MzI2KSA6e3g6ZmxvYXQsIHk6ZmxvYXR9XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJ2b2l0dXJlXCJdIC0gVHlwZSBkZSBncmFwaGUgdXRpbGlzw6kgOiBcIlZvaXR1cmVcIiBvdSBcIlBpZXRvblwiLlxuICogICAgICBEw6l0ZXJtaW5lIGxlIHByb2ZpbCBkZSB2aXRlc3NlcyB1dGlsaXPDqSBwb3VyIGxlIGNhbGN1bCBhaW5zaSBxdWUgbGVzIHRyb27Dp29ucyBhdXRvcmlzw6lzIG91IG5vbi5cbiAqICAgICAgUGFyIGTDqWZhdXQsIGMnZXN0IGxhIHZhbGV1ciBcIlZvaXR1cmVcIiBxdWkgc2VyYSB1dGlsaXPDqWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmdbXX0gW29wdGlvbnMuZXhjbHVzaW9uc10gLSBERVBSRUNBVEVEOiBDcml0w6hyZXMgZCdleGNsdXNpb25zIMOgIGFwcGxpcXVlciBwb3VyIGxlIGNhbGN1bC4gKGNvcnJlc3BvbmQgYXUgcGFyYW3DqHRyZSBcImF2b2lkRmVhdHVyZVwiIGQnT3BlbkxTKVxuICogICAgICBPbiBwcsOpY2lzZSBpY2kgbGUgdHlwZSBkZSB0cm9uw6dvbnMgcXVlIGwnb24gbmUgdmV1dCBwYXMgcXVlIGwnaXRpbsOpcmFpcmUgZW1wcnVudGVcbiAqICAgICAgKHZhbGV1cnMgcG9zc2libGVzIDogwqsgdG9sbCDCuyAow6l2aXRlciBsZXMgcMOpYWdlcyksIMKrIGJyaWRnZSDCuywgwqsgdHVubmVsIMK7KS5cbiAqICAgICAgQ2UgcGFyYW3DqHRyZSBlc3QgY29uc2VydsOpIHBvdXIgdW5lIHLDqXRyb2NvbXBhdGliaWxpdMOpIGRlIGwnYXBpLiBMZSBub3V2ZWF1IHBhcmFtw6h0cmUgw6AgdXRpbGlzZXIgZXN0IG9wdGlvbnMuY29uc3RyYWludHNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5jb25zdHJhaW50c10gLSBDcml0w6hyZXMgZGUgY29udHJhaW50ZXMgw6AgYXBwbGlxdWVyIHN1ciB1biBpdGluw6lyYWlyZS4gTGVzIHZhbGV1cnMgZGlzcG9uaWJsZXMgZMOpcGVuZGVudCBkZSBsYSByZXNzb3VyY2UgdXRpbGlzw6llLiBJbCBlc3QgZG9uYyB1dGlsZSBkZSByZWdhcmRlciBsZSBnZXRDYXBhYmlsaXRpZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMuY29uc3RyYWludFR5cGVdIC0gVHlwZSBkZSBsYSBjb250cmFpbnRlLiBHw6luw6lyYWxlbWVudCBcImJhbm5lZFwiLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLmtleV0gLSBDbMOpIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwid2F5VHlwZVwiLlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnN0cmFpbnRzLm9wZXJhdG9yXSAtIE9ww6lyYXRldXIgZGUgbGEgY29udHJhaW50ZS4gR8OpbsOpcmFsZW1lbnQgXCI9XCIuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29uc3RyYWludHMudmFsdWVdIC0gVmFsZXVyIGRlIGxhIGNvbnRyYWludGUuIEfDqW7DqXJhbGVtZW50IFwiYXV0b3JvdXRlXCIuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zID0gZmFsc2VdIC0gSW5kaXF1ZSBzaSBsYSBnw6lvbcOpdHJpZSBkZSBsJ2l0aW7DqXJhaXJlIGRvaXQgw6p0cmUgcmVwcmlzZSBtb3JjZWF1IHBhciBtb3JjZWF1IGRhbnMgbGVzIGluc3RydWN0aW9ucy5cbiAqICAgICAgKGNvcnJlc3BvbmQgYXUgcGFyYW3DqHRyZSBcInByb3ZpZGVHZW9tZXRyeVwiIGQnT3BlbkxTKSBQYXIgZMOpZmF1dCA6IGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHJvdmlkZUJib3ggPSB0cnVlXSAtIEluZGlxdWUgc2kgbGVzIGluc3RydWN0aW9ucyBkb2l2ZW50IMOqdHJlIGxvY2FsaXPDqWVzIHBhciB1bmUgYmJveCBkYW5zIGxhIHLDqXBvbnNlLlxuICogICAgICBQYXIgZMOpZmF1dCA6IHRydWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRpc3RhbmNlVW5pdCA9IFwibVwiXSAtIEluZGlxdWUgc2kgbGEgZGlzdGFuY2UgZG9pdCDDqnRyZSBleHByaW3DqWUgZW4ga20gb3UgbSBkYW5zIGxhIHLDqXBvbnNlLlxuICogICAgICBQYXIgZMOpZmF1dCA6IG0uXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGltZVVuaXQgPSBcInNlY29uZFwiXSAtIEluZGlxdWUgc2kgbGEgZHVyw6llIGRvaXQgw6p0cmUgZXhwcmltw6llIGVuIHNlY29uZGUsIG1pbnV0ZSBvdSBoZXVyZSBkYW5zIGxhIHLDqXBvbnNlLiBJbCBwZXV0LcOqdHJlIGZvcm1hdHTDqSBoaDptbTo6c3MgYXZlYyBsYSB2YWxldXIgc3RhbmRhcmQuXG4gKiAgICAgIExlcyB2YWxldXJzIHBvc3NpYmxlcyBzb250IFwic3RhbmRhcmRcIiwgXCJzZWNvbmRcIiwgXCJtaW51dGVcIiBvdSBcImhvdXJcIi5cbiAqICAgICAgUGFyIGTDqWZhdXQgOiBcInN0YW5kYXJkXCIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNyc10gLSBTeXN0w6htZSBkZSBjb29yZG9ubsOpZXMgZGFucyBsZXF1ZWwgbGVzIHBhcmFtw6h0cmVzIGfDqW9ncmFwaGlxdWVzIGVuIGVudHLDqWUgZXQgbGEgcsOpcG9uc2UgZHUgc2VydmljZSBzb250IGV4cHJpbcOpcy5cbiAqICAgICAgUGFzIGRlIHZhbGV1ciBwYXIgZMOpZmF1dC4gU2kgbGUgc2VydmV1ciBjb25zdWx0w6kgZXN0IGNlbHVpIGR1IEfDqW9wb3J0YWlsLCBsYSB2YWxldXIgcGFyIGTDqWZhdXQgc2VyYSBkb25jIGNlbGxlIGR1IHNlcnZpY2UgOiAnRVBTRzo0MzI2Jy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBbb3B0aW9ucy53YXlzQXR0cmlidXRlc10gLSBOb20gZGVzIGF0dHJpYnV0cyBkZXMgdm9pZXMuIExlcyB2YWxldXJzIGRpc3BvbmlibGVzIGTDqXBlbmRlbnQgZGUgbGEgcmVzc291cmNlIHV0aWxpc8OpZS4gSWwgZXN0IGRvbmMgdXRpbGUgZGUgcmVnYXJkZXIgbGUgZ2V0Q2FwYWJpbGl0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgdmFyIG9wdGlvbnMgPSB7XG4gKiAgICAgIC8vIG9wdGlvbnMgY29tbXVuZXMgYXV4IHNlcnZpY2VzXG4gKiAgICAgIGFwaUtleSA6IG51bGwsXG4gKiAgICAgIHNlcnZlclVybCA6ICdodHRwOi8vbG9jYWxob3N0L3NlcnZpY2UvJyxcbiAqICAgICAgcHJvdG9jb2wgOiAnWEhSJyxcbiAqICAgICAgcHJveHlVUkwgOiBudWxsLFxuICogICAgICBodHRwTWV0aG9kIDogJ0dFVCcsIC8vIEdFVHxQT1NUXG4gKiAgICAgIHRpbWVPdXQgOiAxMDAwMCwgLy8gbXNcbiAqICAgICAgcmF3UmVzcG9uc2UgOiBmYWxzZSwgLy8gdHJ1ZXxmYWxzZVxuICogICAgICBzY29wZSA6IG51bGwsIC8vIHRoaXNcbiAqICAgICAgb25TdWNjZXNzIDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7fSxcbiAqICAgICAgb25GYWlsdXJlIDogZnVuY3Rpb24gKGVycm9yKSB7fSxcbiAqICAgICAgLy8gc3DDqWNpZmlxdWUgYXUgc2VydmljZVxuICogICAgICByZXNvdXJjZSA6ICdiZHRvcG8nXG4gKiAgICAgIG91dHB1dEZvcm1hdCA6ICdqc29uJyxcbiAqICAgICAgc3RhcnRQb2ludCA6IHtcbiAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICogICAgICAgICAgeSA6IDEuNTU1N1xuICogICAgICB9LFxuICogICAgICBlbmRQb2ludCA6IHtcbiAqICAgICAgICAgIHggOiA0Mi4xMTIxLFxuICogICAgICAgICAgeSA6IDEuNTU1N1xuICogICAgICB9LFxuICogICAgICBwcm92aWRlQmJveCA6IHRydWUsXG4gKiAgICAgIGV4Y2x1c2lvbnMgOiBbXCJCcmlkZ2VcIiwgXCJUdW5uZWxcIiwgXCJUb2xsXCJdLFxuICogICAgICBkaXN0YW5jZVVuaXQgOiBcImttXCIsXG4gKiAgICAgIGdyYXBoIDogXCJWb2l0dXJlXCIsXG4gKiAgICAgIGdlb21ldHJ5SW5JbnN0cnVjdGlvbnMgOiB0cnVlLFxuICogICAgICByb3V0ZVByZWZlcmVuY2UgOiBcImZhc3Rlc3RcIlxuICogIH07XG4gKlxuICovXG5mdW5jdGlvbiBSb3V0ZSAob3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfLmdldE1lc3NhZ2UoXCJDTEFTU19DT05TVFJVQ1RPUlwiLCBcIlJvdXRlXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb20gZGUgbGEgY2xhc3NlIChoZXJpdGFnZSlcbiAgICAgKi9cbiAgICB0aGlzLkNMQVNTTkFNRSA9IFwiUm91dGVcIjtcblxuICAgIC8vIGFwcGVsIGR1IGNvbnN0cnVjdGV1ciBwYXIgaGVyaXRhZ2VcbiAgICBDb21tb25TZXJ2aWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoXCJHcC5TZXJ2aWNlcy5Sb3V0ZVwiKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcIltDb25zdHJ1Y3RldXIgUm91dGUgKG9wdGlvbnMpXVwiKTtcblxuICAgIGlmICghb3B0aW9ucy5zdGFydFBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwic3RhcnRQb2ludFwiKSk7XG4gICAgfVxuXG4gICAgLy8gb24gbGFuY2UgdW5lIGV4Y2VwdGlvbiBhZmluIGQnZXZpdGVyIGF1IHNlcnZpY2UgZGUgbGUgZmFpcmUuLi5cbiAgICBpZiAob3B0aW9ucy5zdGFydFBvaW50LnggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJzdGFydFBvaW50LnhcIikpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0YXJ0UG9pbnQueSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcInN0YXJ0UG9pbnQueVwiKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmVuZFBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihfLmdldE1lc3NhZ2UoXCJQQVJBTV9NSVNTSU5HXCIsIFwiZW5kUG9pbnRcIikpO1xuICAgIH1cblxuICAgIC8vIG9uIGxhbmNlIHVuZSBleGNlcHRpb24gYWZpbiBkJ2V2aXRlciBhdSBzZXJ2aWNlIGRlIGxlIGZhaXJlLi4uXG4gICAgaWYgKG9wdGlvbnMuZW5kUG9pbnQueCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fTUlTU0lOR1wiLCBcImVuZFBvaW50LnhcIikpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmVuZFBvaW50LnkgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKF8uZ2V0TWVzc2FnZShcIlBBUkFNX01JU1NJTkdcIiwgXCJlbmRQb2ludC55XCIpKTtcbiAgICB9XG5cbiAgICAvLyBvcHRpb25zIHBhciBkZWZhdXRcblxuICAgIC8vIG9uIHBhc3NlIGwnb3B0aW9uIG91dHB1dEZvcm1hdCBlbiBtaW51c2N1bGVzIGFmaW4gZCfDqXZpdGVyIGRlcyBleGNlcHRpb25zLlxuICAgIGlmIChvcHRpb25zLm91dHB1dEZvcm1hdCAmJiBvcHRpb25zLm91dHB1dEZvcm1hdCAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIm9wdGlvbnMub3V0cHV0Rm9ybWF0IGNvdWxkIG9ubHkgYmUganNvblwiKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCA9IFwianNvblwiO1xuXG4gICAgdGhpcy5vcHRpb25zLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZSB8fCBcImJkdG9wby1vc3JtXCI7XG4gICAgdGhpcy5vcHRpb25zLnN0YXJ0UG9pbnQgPSBvcHRpb25zLnN0YXJ0UG9pbnQ7XG4gICAgdGhpcy5vcHRpb25zLmVuZFBvaW50ID0gb3B0aW9ucy5lbmRQb2ludDtcbiAgICB0aGlzLm9wdGlvbnMudmlhUG9pbnRzID0gb3B0aW9ucy52aWFQb2ludHMgfHwgW107XG4gICAgdGhpcy5vcHRpb25zLnJvdXRlUHJlZmVyZW5jZSA9IG9wdGlvbnMucm91dGVQcmVmZXJlbmNlIHx8IFwiZmFzdGVzdFwiO1xuICAgIC8qKiBHZXN0aW9uIGRlcyBhbmNpZW5uZXMgdmFsZXVycyBkZSBncmFwaCAqL1xuICAgIGlmIChvcHRpb25zLmdyYXBoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmdyYXBoID09PSBcIlZvaXR1cmVcIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJjYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5ncmFwaCA9PT0gXCJQaWV0b25cIikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyYXBoID0gXCJwZWRlc3RyaWFuXCI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ3JhcGggPSBcImNhclwiO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5jb25zdHJhaW50cykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBvcHRpb25zLmNvbnN0cmFpbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2gob3B0aW9ucy5jb25zdHJhaW50c1trXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXy5nZXRNZXNzYWdlKFwiUEFSQU1fVFlQRVwiLCBcImNvbnN0cmFpbnRzXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBHZXN0aW9uIGRlIGwnYW5jaWVuIHBhcmFtw6h0cmUgZXhjbHVzaW9uICovXG4gICAgdmFyIGNvbnN0cmFpbnRUdW5uZWwgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludFBvbnQgPSB7fTtcbiAgICB2YXIgY29uc3RyYWludEF1dG9yb3V0ZSA9IHt9O1xuICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJvcHRpb25zLmV4Y2x1c2lvbnMgaXMgREVQUkVDQVRFRCAhIVwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0aW9ucy5leGNsdXNpb25zLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGNsdXNpb25zW2NdID0gb3B0aW9ucy5leGNsdXNpb25zW2NdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbmUgY3LDqWUgcGFzIHVuZSBlcnJldXIgcG91ciByw6l0cm8tY29tcGF0aWJpbGl0w6kgYXZlYyBsZXMgYW5jaWVubmVzIHZlcnNpb25zXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcInRvbGxcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5rZXkgPSBcIndheVR5cGVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludEF1dG9yb3V0ZS5vcGVyYXRvciA9IFwiPVwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50QXV0b3JvdXRlLnZhbHVlID0gXCJhdXRvcm91dGVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludEF1dG9yb3V0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1c2lvbnNbY10gPT09IFwidHVubmVsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC5jb25zdHJhaW50VHlwZSA9IFwiYmFubmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUdW5uZWwub3BlcmF0b3IgPSBcIj1cIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFR1bm5lbC52YWx1ZSA9IFwidHVubmVsXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRUdW5uZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zW2NdID09PSBcImJyaWRnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LmNvbnN0cmFpbnRUeXBlID0gXCJiYW5uZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFBvbnQua2V5ID0gXCJ3YXlUeXBlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250Lm9wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRQb250LnZhbHVlID0gXCJwb250XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnRQb250KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA9IG9wdGlvbnMuZ2VvbWV0cnlJbkluc3RydWN0aW9ucyB8fCBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMucHJvdmlkZUJib3ggPSBvcHRpb25zLnByb3ZpZGVCYm94IHx8IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCA9IG9wdGlvbnMuZGlzdGFuY2VVbml0IHx8IFwibVwiO1xuICAgIHRoaXMub3B0aW9ucy50aW1lVW5pdCA9IG9wdGlvbnMudGltZVVuaXQgfHwgXCJzZWNvbmRcIjtcbiAgICB0aGlzLm9wdGlvbnMuZXhwZWN0ZWRTdGFydFRpbWUgPSBudWxsOyAvLyBGSVhNRSBub3QgeWV0IGltcGxlbWVudGVkICFcbiAgICB0aGlzLm9wdGlvbnMuc3JzID0gb3B0aW9ucy5zcnMgfHwgXCJFUFNHOjQzMjZcIjtcbiAgICB0aGlzLm9wdGlvbnMud2F5c0F0dHJpYnV0ZXMgPSBvcHRpb25zLndheXNBdHRyaWJ1dGVzIHx8IFtdO1xuXG4gICAgLy8gZ2VzdGlvbiBkZSBsJ3VybCBkdSBzZXJ2aWNlIHBhciBkZWZhdXRcbiAgICAvLyBzaSBsJ3VybCBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUsIGlsIGZhdXQgdXRpbGlzZXIgbGVzIHVybHMgcGFyIGRlZmF1dFxuICAgIGlmICghdGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgICAvLyBDb2RlIGNvbW1lbnTDqSA6IFJlbGVhc2UgYmV0YSBzZXJ2aWNlcyBESUZGVVNJT04gdW5pcXVlbWVudCA6IG9uIHRhcGUgc3VyIGwnYW52Y2llbiBzZXJ2aWNlIGQnaXRpbsOpcmFpcmVcbiAgICAgICAgLyogdmFyIFVybEJ5RGVmYXVsdCA9IERlZmF1bHRVcmxTZXJ2aWNlLlJvdXRlLm5ld1VybCgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9sZFJvdXRlU2VydmljZSkge1xuICAgICAgICAgICAgVXJsQnlEZWZhdWx0ID0gRGVmYXVsdFVybFNlcnZpY2UuUm91dGUudXJsKCk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgLy8gUmVsZWFzZSBiZXRhIHNlcnZpY2VzIERJRkZVU0lPTiB1bmlxdWVtZW50IDogb24gdGFwZSBzdXIgbCdhbnZjaWVuIHNlcnZpY2UgZCdpdGluw6lyYWlyZVxuICAgICAgICB2YXIgVXJsQnlEZWZhdWx0ID0gRGVmYXVsdFVybFNlcnZpY2UuUm91dGUudXJsKCk7XG5cbiAgICAgICAgaWYgKCFVcmxCeURlZmF1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVybCBieSBkZWZhdWx0IG5vdCBmb3VuZCAhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwgPSBVcmxCeURlZmF1bHQ7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiU2VydmV1ciBVUkwgcGFyIGRlZmF1dCA6IFwiICsgdGhpcy5vcHRpb25zLnNlcnZlclVybCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsZW5kcyBtb2R1bGU6Um91dGUjXG4gKi9cblJvdXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tbW9uU2VydmljZS5wcm90b3R5cGUsIHtcbiAgICAvLyB0b2RvXG4gICAgLy8gZ2V0dGVyL3NldHRlclxufSk7XG5cbi8qXG4gKiBDb25zdHJ1Y3RldXIgKGFsaWFzKVxuICovXG5Sb3V0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSb3V0ZTtcblxuLyoqXG4gKiAob3ZlcndyaXRlKVxuICogQ3LDqWF0aW9uIGRlIGxhIHJlcXXDqnRlXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgICAtIGNhbGxiYWNrIGRlcyBlcnJldXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2tcbiAqL1xuUm91dGUucHJvdG90eXBlLmJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlcnJvciwgc3VjY2Vzcykge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAvLyBzcMOpY2lmaXF1ZSBhdSBzZXJ2aWNlXG4gICAgICAgIHJlc291cmNlIDogdGhpcy5vcHRpb25zLnJlc291cmNlLFxuICAgICAgICBzdGFydFBvaW50IDogdGhpcy5vcHRpb25zLnN0YXJ0UG9pbnQsXG4gICAgICAgIGVuZFBvaW50IDogdGhpcy5vcHRpb25zLmVuZFBvaW50LFxuICAgICAgICB2aWFQb2ludHMgOiB0aGlzLm9wdGlvbnMudmlhUG9pbnRzLFxuICAgICAgICBwcm92aWRlQmJveCA6IHRoaXMub3B0aW9ucy5wcm92aWRlQmJveCxcbiAgICAgICAgY29uc3RyYWludHMgOiB0aGlzLm9wdGlvbnMuY29uc3RyYWludHMsXG4gICAgICAgIGRpc3RhbmNlVW5pdCA6IHRoaXMub3B0aW9ucy5kaXN0YW5jZVVuaXQsXG4gICAgICAgIHRpbWVVbml0IDogdGhpcy5vcHRpb25zLnRpbWVVbml0LFxuICAgICAgICBncmFwaCA6IHRoaXMub3B0aW9ucy5ncmFwaCxcbiAgICAgICAgZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA6IHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zLFxuICAgICAgICByb3V0ZVByZWZlcmVuY2UgOiB0aGlzLm9wdGlvbnMucm91dGVQcmVmZXJlbmNlLFxuICAgICAgICBzcnMgOiB0aGlzLm9wdGlvbnMuc3JzLFxuICAgICAgICB3YXlzQXR0cmlidXRlcyA6IHRoaXMub3B0aW9ucy53YXlzQXR0cmlidXRlc1xuICAgIH07XG5cbiAgICB0aGlzLnJlcXVlc3QgPSBSb3V0ZVJlcXVlc3RGYWN0b3J5LmJ1aWxkKG9wdGlvbnMpO1xuXG4gICAgLy8gb24gdGVzdGUgc2kgbGEgcmVxdWV0ZSBhIGJpZW4gw6l0w6kgY29uc3RydWl0ZSAhXG4gICAgaWYgKCF0aGlzLnJlcXVlc3QpIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRFwiKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLnJlcXVlc3QpO1xuICAgIH1cbn07XG5cbi8qKlxuICogKG92ZXJ3cml0ZSlcbiAqIEFuYWx5c2UgZGUgbGEgcmVwb25zZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yICAgLSBjYWxsYmFjayBkZXMgZXJyZXVyc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrXG4gKi9cblJvdXRlLnByb3RvdHlwZS5hbmFseXplUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IsIHN1Y2Nlc3MpIHtcbiAgICAvLyBJTkZPXG4gICAgLy8gRmFjdG9yeSBwb3VyIG1hc3F1ZXIgbGEgY29tcGxleGl0w6kgZHUgcmV0b3VyIGR1IHNlcnZpY2VcblxuICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGlzdGFuY2VVbml0IDogdGhpcy5vcHRpb25zLmRpc3RhbmNlVW5pdCxcbiAgICAgICAgICAgIHRpbWVVbml0IDogdGhpcy5vcHRpb25zLnRpbWVVbml0LFxuICAgICAgICAgICAgcmVzcG9uc2UgOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0IDogdGhpcy5vcHRpb25zLm91dHB1dEZvcm1hdCwgLy8gdXRpbGUgcG91ciBwYXJzZXIgbGEgc3RyaW5nIGVuIG1vZGUgWEhSIDogSlNPTiBvdSBYTUwgIVxuICAgICAgICAgICAgcmF3UmVzcG9uc2UgOiB0aGlzLm9wdGlvbnMucmF3UmVzcG9uc2UsXG4gICAgICAgICAgICBvbkVycm9yIDogZXJyb3IsXG4gICAgICAgICAgICBvblN1Y2Nlc3MgOiBzdWNjZXNzLFxuICAgICAgICAgICAgc2NvcGUgOiB0aGlzLFxuICAgICAgICAgICAgZ2VvbWV0cnlJbkluc3RydWN0aW9ucyA6IHRoaXMub3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zXG4gICAgICAgIH07XG5cbiAgICAgICAgUm91dGVSZXNwb25zZUZhY3RvcnkuYnVpbGQob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IuY2FsbCh0aGlzLCBuZXcgRXJyb3JTZXJ2aWNlKF8uZ2V0TWVzc2FnZShcIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlcIikpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Services/Route/Route.js\n"); + +/***/ }), + +/***/ "./src/Services/Services.js": +/*!**********************************!*\ + !*** ./src/Services/Services.js ***! + \**********************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Config_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Config/Config */ \"./src/Services/Config/Config.js\");\n/* harmony import */ var _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Alti/Alti */ \"./src/Services/Alti/Alti.js\");\n/* harmony import */ var _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Geocode/Geocode */ \"./src/Services/Geocode/Geocode.js\");\n/* harmony import */ var _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Geocode/ReverseGeocode */ \"./src/Services/Geocode/ReverseGeocode.js\");\n/* harmony import */ var _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AutoComplete/AutoComplete */ \"./src/Services/AutoComplete/AutoComplete.js\");\n/* harmony import */ var _Route_Route__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Route/Route */ \"./src/Services/Route/Route.js\");\n/* harmony import */ var _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ProcessIsoCurve/ProcessIsoCurve */ \"./src/Services/ProcessIsoCurve/ProcessIsoCurve.js\");\n/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"point|circle|bbox\" }] */\n\n/**\n* Geoportal web services invocation namespace.\n*\n* @module Services\n* @alias Gp.Services\n*/\n\n\n\n\n\n\n\nvar Services = {\n /**\n * Access to Geoportal resources metadata availables with one ore several keys\n *\n * @method getConfig\n * @param {Object} options - Options for function call.\n * @param {String} [options.apiKey] - Access key(s) (\",\" as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}\n * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if \"rawResponse\" parameter is set to true : a String will be returned.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n */\n getConfig: function getConfig(options) {\n var configService = new _Config_Config__WEBPACK_IMPORTED_MODULE_0__[\"default\"](options);\n configService.call();\n },\n /**\n * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
\n * Two use cases are availables :
\n * 1. getting elevations of the given points : don't use the options.sampling parameter ;
\n * 2. getting a regular set of elevations along the given points : use the options.sampling parameter.\n *\n * @method getAltitude\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter.\n * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
\n * If not used, only elevations of these positions will be returned.\n * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing.\n * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing.\n */\n getAltitude: function getAltitude(options) {\n var altiService = new _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__[\"default\"](options);\n altiService.call();\n },\n /**\n * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}.\n *\n * @example\n * Gp.Services.geocode ({\n * apiKey : \"carte\",\n * location : \"73 avenue de Paris, Saint-Mandé\",\n * // traitement des resultats\n * onSuccess : function (result) {\n * console.log(\"found (x:\"+result.position.x+\", y:\"+result.position.y+\")\") ;\n * }\n * }) ;\n *\n *\n * @method geocode\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.index=\"StreetAddress\"] - Geographical identifier type to search. Values currently availables are : \"PositionOfInterest\" for place names, \"StreetAddress\" for address search, \"CadastralParcel\" for Cadastral parcels search, \"location\" for a multi-index search on \"StreetAddress\" and \"PositionOfInterest\". Default is \"StreetAddress\".\n * @param {String} options.query - Geographic identifier to locate.\n * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given.\n * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be \"String\".\n *

\n * Properties availables for address search :
\n * \"postalCode\", \"inseeCode\" and \"city\".\n *

\n * Properties availables for place names search :
\n * \"postalCode\", \"inseeCode\" and \"type\".\n *

\n * Properties availables for cadastral parcels search :
\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided.\n * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n geocode: function geocode(options) {\n var geocodeService = new _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__[\"default\"](options);\n geocodeService.call();\n },\n /**\n * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}.\n *\n * @method reverseGeocode\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.index=\"StreetAddress\"] - Geographical identifier type to search. Values currently availables are : \"PositionOfInterest\" for place names, \"StreetAddress\" for address search, \"CadastralParcel\" for Cadastral parcels search, \"location\" for a multi-index search on \"StreetAddress\" and \"PositionOfInterest\". Default is \"StreetAddress\".\n * @param {Object} options.position - Reference position where to search geographical identifiers.\n * @param {Float} options.position.lon - Longitude\n * @param {Float} options.position.lat - Latitude\n * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given.\n * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be \"String\".\n *

\n * Properties availables for address search :
\n * \"postalCode\", \"inseeCode\" and \"city\".\n *

\n * Properties availables for place names search :
\n * \"postalCode\", \"inseeCode\" and \"type\".\n *

\n * Properties availables for cadastral parcels search :
\n * \"codeDepartement\", \"codeCommune\", \"nomCommune\", \"codeCommuneAbs\", \"codeArrondissement\", \"section\", \"numero\", \"feuille\".\n * @param {Object} [options.searchGeometry] - Location where to perform the search.\n * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon)\n * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates\n * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle')\n * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n reverseGeocode: function reverseGeocode(options) {\n var reverseGeocodeService = new _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__[\"default\"](options);\n reverseGeocodeService.call();\n },\n /**\n * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html}\n *\n * @method autoComplete\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} options.text - Text input to complete.\n * @param {Array.} [options.filterOptions.type = \"StreetAddress\"] - Suggestion types to provide : address (\"StreetAddress\") and/or place name (\"PositionOfInterest\").\n * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : \"METROPOLE\" (Corsica and metropolitan France), \"DOMTOM\" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31']\n * @param {Number} [options.maximumResponses = 10] - Maximum number of responses.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n autoComplete: function autoComplete(options) {\n var autoCompleteService = new _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__[\"default\"](options);\n autoCompleteService.call();\n },\n /**\n * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}.\n *\n * @method route\n * @param {Object} options - Options for function call.\n * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} [options.routePreference = \"fastest\"] - Indicates the way to compute the route : \"fastest\" (time optimisation) or \"shortest\" (distance optimisation). Available values are in the GetCapabilities.\n * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities.\n * @param {String} [options.graph = \"Voiture\"] - User profile to use to compute the route : \"Voiture\" (using a vehicule) or \"Pieton\" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities.\n * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features (\"toll\", \"bridge\" or \"tunnel\").\n * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions.\n * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response.\n * @param {String} [options.distanceUnit = \"m\"] - The unit used to provide distances in the response (\"meter\" or \"kilometer\").\n * @param {String} [options.timeUnit = \"second\"] - The unit used to provide duration in the response (\"standard\", \"second\", \"minute\", \"hour\").\n * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities.\n * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.outputFormat='json'] - Output format (\"json\" or \"xml\") to use for underlying webService. Only use if you know what you are doing.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n route: function route(options) {\n var routeService = new _Route_Route__WEBPACK_IMPORTED_MODULE_5__[\"default\"](options);\n routeService.call();\n },\n /**\n * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}.\n *\n * @method isoCurve\n * @param {Object} options - Options for function call.\n * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}.\n * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities.\n * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude).\n * @param {String} [options.graph = \"Voiture\"] - User profile to use to compute the isoCurve : \"Voiture\" (using a vehicule) or \"Pieton\" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities.\n * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features (\"toll\", \"bridge\" or \"tunnel\").\n * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities.\n * @param {String} [options.method = \"time\"] - Computing method to use : \"time\" (using a duration as a constraint) or \"distance\" (using a distance as a constraint). Available values are in the GetCapabilities.\n * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to \"time\".\n * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to \"distance\".\n * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing.\n * @param {String} [options.distanceUnit = \"km\"] - The unit used to provide distances in the response (\"m\" or \"km\").\n * @param {String} [options.timeUnit = \"second\"] - The unit used to provide duration in the response (\"standard\", \"second\", \"minute\", \"hour\").\n * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed.\n * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent.\n * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if \"rawResponse\" is set to true.\n * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter.\n * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled.\n * @param {String} [options.outputFormat='json'] - Output format (\"json\") to use for underlying webService. Only use if you know what you are doing.\n * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing.\n * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true).\n * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing.\n * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing.\n * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing.\n * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {String} [options.contentType=\"application/xml\"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing.\n * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing.\n * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing.\n */\n isoCurve: function isoCurve(options) {\n var processIsoCurveService = new _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__[\"default\"](options);\n processIsoCurveService.call();\n }\n};\n\n/**\n * Point object.\n *\n * @namespace\n * @alias Gp.Point\n *\n * @property {Float} x - Point abscissa\n * @property {Float} y - Point ordinate\n */\nvar point = {};\n\n/**\n * Circle object.\n *\n * @namespace\n * @alias Gp.Circle\n *\n * @property {Float} x - Circle center abscissa.\n * @property {Float} y - Circle center ordinate.\n * @property {Float} radius - Circle radius.\n */\nvar circle = {};\n\n/**\n * Bounding box object, expressed with four coordinates.\n *\n * @namespace\n * @alias Gp.BBox\n *\n * @property {Float} left - minimum abscissa\n * @property {Float} right - maximum abscissa\n * @property {Float} bottom - minimum ordinate\n * @property {Float} top - maximum ordinate\n */\nvar bbox = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Services);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9TZXJ2aWNlcy9TZXJ2aWNlcy5qcz83NjZmIl0sIm5hbWVzIjpbIlNlcnZpY2VzIiwiZ2V0Q29uZmlnIiwib3B0aW9ucyIsImNvbmZpZ1NlcnZpY2UiLCJDb25maWciLCJjYWxsIiwiZ2V0QWx0aXR1ZGUiLCJhbHRpU2VydmljZSIsIkFsdGkiLCJnZW9jb2RlIiwiZ2VvY29kZVNlcnZpY2UiLCJHZW9jb2RlIiwicmV2ZXJzZUdlb2NvZGUiLCJyZXZlcnNlR2VvY29kZVNlcnZpY2UiLCJSZXZlcnNlR2VvY29kZSIsImF1dG9Db21wbGV0ZSIsImF1dG9Db21wbGV0ZVNlcnZpY2UiLCJBdXRvQ29tcGxldGUiLCJyb3V0ZSIsInJvdXRlU2VydmljZSIsIlJvdXRlIiwiaXNvQ3VydmUiLCJwcm9jZXNzSXNvQ3VydmVTZXJ2aWNlIiwiUHJvY2Vzc0lzb0N1cnZlIiwicG9pbnQiLCJjaXJjbGUiLCJiYm94Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ047QUFDUztBQUNjO0FBQ0M7QUFDckI7QUFDOEI7QUFFaEUsSUFBSUEsUUFBUSxHQUFHO0VBQ1g7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxTQUFTLEVBQUcsU0FBQUEsVUFBVUMsT0FBTyxFQUFFO0lBQzNCLElBQUlDLGFBQWEsR0FBRyxJQUFJQyxzREFBTSxDQUFDRixPQUFPLENBQUM7SUFDdkNDLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLENBQUM7RUFDeEIsQ0FBQztFQUNEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LElBQUlDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlDLElBQUksR0FBRyxDQUFDLENBQUM7QUFFRTFCLHVFQUFRIiwiZmlsZSI6Ii4vc3JjL1NlcnZpY2VzL1NlcnZpY2VzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJwb2ludHxjaXJjbGV8YmJveFwiIH1dICovXG5cbi8qKlxuKiBHZW9wb3J0YWwgd2ViIHNlcnZpY2VzIGludm9jYXRpb24gbmFtZXNwYWNlLlxuKlxuKiBAbW9kdWxlIFNlcnZpY2VzXG4qIEBhbGlhcyBHcC5TZXJ2aWNlc1xuKi9cbmltcG9ydCBDb25maWcgZnJvbSBcIi4vQ29uZmlnL0NvbmZpZ1wiO1xuaW1wb3J0IEFsdGkgZnJvbSBcIi4vQWx0aS9BbHRpXCI7XG5pbXBvcnQgR2VvY29kZSBmcm9tIFwiLi9HZW9jb2RlL0dlb2NvZGVcIjtcbmltcG9ydCBSZXZlcnNlR2VvY29kZSBmcm9tIFwiLi9HZW9jb2RlL1JldmVyc2VHZW9jb2RlXCI7XG5pbXBvcnQgQXV0b0NvbXBsZXRlIGZyb20gXCIuL0F1dG9Db21wbGV0ZS9BdXRvQ29tcGxldGVcIjtcbmltcG9ydCBSb3V0ZSBmcm9tIFwiLi9Sb3V0ZS9Sb3V0ZVwiO1xuaW1wb3J0IFByb2Nlc3NJc29DdXJ2ZSBmcm9tIFwiLi9Qcm9jZXNzSXNvQ3VydmUvUHJvY2Vzc0lzb0N1cnZlXCI7XG5cbnZhciBTZXJ2aWNlcyA9IHtcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG8gR2VvcG9ydGFsIHJlc291cmNlcyBtZXRhZGF0YSBhdmFpbGFibGVzIHdpdGggb25lIG9yZSBzZXZlcmFsIGtleXNcbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0Q29uZmlnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hcGlLZXldIC0gQWNjZXNzIGtleShzKSAoXCIsXCIgYXMgc2VwYXJhdG9yLCBubyBzcGFjZXMpIHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY3VzdG9tQ29uZmlnRmlsZV0gLSBwYXRoIHRvIGEgbG9jYWwgY29uZmlnIGZpbGUuIE92ZXJsb2FkIHRoZSBhcGlLZXkgcGFyYW1ldGVyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN1Y2Nlc3MgLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZ2V0dGluZyBzdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2UuIFRha2VzIGEge0BsaW5rIEdwLlNlcnZpY2VzLkdldENvbmZpZ1Jlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUgOiBhIFN0cmluZyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqL1xuICAgIGdldENvbmZpZyA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBjb25maWdTZXJ2aWNlID0gbmV3IENvbmZpZyhvcHRpb25zKTtcbiAgICAgICAgY29uZmlnU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIGVsZXZhdGlvbnMgaW4gb3IgYWxvbmcgb2Ygb25lIG9yIHNldmVyYWwgcG9pbnRzIG9uIGZyZW5jaCB0ZXJyaXRvcmllcyB1c2luZyB0aGUgW2VsZXZhdGlvbiBzZXJ2aWNlcyBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2FsdGkuaHRtbH0uPGJyLz5cbiAgICAgKiBUd28gdXNlIGNhc2VzIGFyZSBhdmFpbGFibGVzIDo8YnIvPlxuICAgICAqIDEuIGdldHRpbmcgZWxldmF0aW9ucyBvZiB0aGUgZ2l2ZW4gcG9pbnRzIDogZG9uJ3QgdXNlIHRoZSBvcHRpb25zLnNhbXBsaW5nIHBhcmFtZXRlciA7PGJyLz5cbiAgICAgKiAyLiBnZXR0aW5nIGEgcmVndWxhciBzZXQgb2YgZWxldmF0aW9ucyBhbG9uZyB0aGUgZ2l2ZW4gcG9pbnRzIDogdXNlIHRoZSBvcHRpb25zLnNhbXBsaW5nIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0QWx0aXR1ZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIC0gQXJyYXkgb2YgcG9zaXRpb25zICh7bG9uOmZsb2F0LCBsYXQ6ZmxvYXR9KSBleHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSwgd2hlcmUgdG8gZ2V0IGVsZXZhdGlvbnMuIDUwIHBvc2l0aW9ucyBtYXhpbXVtIG1heSBiZSBnaXZlbi4gMiBwb3NpdGlvbnMgbWluaW11bSBhcmUgcmVxdWlyZWQgaWYgeW91IHVzZSB0aGUgb3B0aW9ucy5zYW1wbGluZyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNhbXBsaW5nXSAtIE51bWJlciBvZiBwb2ludHMgdG8gdXNlIChiZXR3ZWVuIDIgYW5kIDUwMDApIGluIG9yZGVyIHRvIGNvbXB1dGUgYW4gZWxldmF0aW9uIHBhdGguIFRoZSBwb2ludHMgZ2l2ZW4gd2l0aCB0aGUgb3B0aW9ucy5wb3NpdGlvbnMgcGFyYW1ldGVyIGFyZSB1c2VkIHRvIGZpeCB0aGUgcGxhbmltZXRyaWMgcGF0aCBhbG9uZyB3aGljaCB0aGUgZWxldmF0aW9ucyB3aWxsIGJlIGNvbXB1dGVkLjxici8+XG4gICAgICogSWYgbm90IHVzZWQsIG9ubHkgZWxldmF0aW9ucyBvZiB0aGVzZSBwb3NpdGlvbnMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnpvbmx5PWZhbHNlXSAtIFNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGF2ZSBlbGV2YXRpb25zIHJldHVybmVkIHdpdGhvdXQgY29ycmVzcG9uZGluZyBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuQWx0aVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIsIGV4Y2VwdCBpZiBcInJhd1Jlc3BvbnNlXCIgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GYWlsdXJlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyB1bnN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZXMgKHRpbWVPdXQsIG1pc3NpbmcgcmlnaHRzLCAuLi4pLiBUYWtlcyBhIHtAbGluayBHcC5FcnJvcn0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dD0wXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYWJvdmUgd2hpY2ggYSB0aW1lT3V0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBvbkZhaWx1cmUgY2FsbGJhY2sgKHNlZSBhYm92ZSkuIERlZmF1bHQgdmFsdWUgaXMgMCB3aGljaCBtZWFucyB0aW1lT3V0IHdpbGwgbm90IGJlIGhhbmRsZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2FsdGkvcmVzdC9lbGV2YXRpb24uanNvbl0gLSBXZWIgc2VydmljZSBVUkwuIElmIHVzZWQsIG9wdGlvbnMuYXBpS2V5IHBhcmFtZXRlciBpcyBpZ25vcmVkLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbCA9IHRydWVdIC0gVXNlIG9mIEhUVFBTIG9yIEhUVFAgcHJvdG9jb2wgdG8gcmVxdWVzdCB0aGUgc2VydmljZXMuIEhUVFBTIGJ5IGRlZmF1bHQgKHNzbD10cnVlKS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJvdG9jb2w9WEhSXSAtIFByb3RvY29sIHVzZWQgdG8gaGFuZGxlIGRpYWxvZyB3aXRoIHdlYiBzZXJ2aWNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdKU09OUCcgKHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUH0pIGFuZCAnWEhSJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hNTEh0dHBSZXF1ZXN0fSkuIE9ubHkgWEhSIHByb3RvY29sIGlzIHN1cHBvcnRlZCBpbiBhIE5vZGVKUyBlbnZpcm9ubWVudC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZD1HRVRdIC0gSFRUUCBtZXRob2QgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdHRVQnIGFuZCAnUE9TVCcuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veG1sXCJdIC0gQ29udGVudC1UeXBlIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZSBpbiBjYXNlIG9mIGEgWEhSIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSBhbmQgaWYgbWV0aG9kIEhUVFAgaXMgUE9TVC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFwaT0nUkVTVCddIC0gV2hhdCBBUEkgdG8gdXNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgOiAnUkVTVCcuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3V0cHV0Rm9ybWF0PSd4bWwnXSAtIE91dHB1dCBmb3JtYXQgZm9yIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgcmVzcG9uc2UgOiAneG1sJyBvciAnanNvbicuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICBnZXRBbHRpdHVkZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBhbHRpU2VydmljZSA9IG5ldyBBbHRpKG9wdGlvbnMpO1xuICAgICAgICBhbHRpU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXR0aW5nIHBvc2l0b24gb2YgYSBnZW9ncmFwaGljIGlkZW50aWZpZXIgKHBsYWNlcyBuYW1lcywgYWRkcmVzcywgY2FkYXN0cmFsIHBhcmNlbCwgb3RoZXIuLi4pIHVzaW5nIHRoZSBbZ2VvY29kaW5nIHdlYiBzZXJ2aWNlIG9mIHRoZSBHZW9wb3J0YWwgUGxhdGZvcm1de0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL2RvY3VtZW50YXRpb24vZ2Vvc2VydmljZXMvZ2VvY29kYWdlLmh0bWx9LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBHcC5TZXJ2aWNlcy5nZW9jb2RlICh7XG4gICAgICogICAgIGFwaUtleSA6IFwiY2FydGVcIixcbiAgICAgKiAgICAgbG9jYXRpb24gOiBcIjczIGF2ZW51ZSBkZSBQYXJpcywgU2FpbnQtTWFuZMOpXCIsXG4gICAgICogICAgIC8vIHRyYWl0ZW1lbnQgZGVzIHJlc3VsdGF0c1xuICAgICAqICAgICBvblN1Y2Nlc3MgIDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coXCJmb3VuZCAoeDpcIityZXN1bHQucG9zaXRpb24ueCtcIiwgeTpcIityZXN1bHQucG9zaXRpb24ueStcIilcIikgO1xuICAgICAqICAgICB9XG4gICAgICogfSkgO1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGdlb2NvZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pbmRleD1cIlN0cmVldEFkZHJlc3NcIl0gLSBHZW9ncmFwaGljYWwgaWRlbnRpZmllciB0eXBlIHRvIHNlYXJjaC4gVmFsdWVzIGN1cnJlbnRseSBhdmFpbGFibGVzIGFyZSA6IFwiUG9zaXRpb25PZkludGVyZXN0XCIgZm9yIHBsYWNlIG5hbWVzLCBcIlN0cmVldEFkZHJlc3NcIiBmb3IgYWRkcmVzcyBzZWFyY2gsIFwiQ2FkYXN0cmFsUGFyY2VsXCIgZm9yIENhZGFzdHJhbCBwYXJjZWxzIHNlYXJjaCwgXCJsb2NhdGlvblwiIGZvciBhIG11bHRpLWluZGV4IHNlYXJjaCBvbiBcIlN0cmVldEFkZHJlc3NcIiBhbmQgXCJQb3NpdGlvbk9mSW50ZXJlc3RcIi4gRGVmYXVsdCBpcyBcIlN0cmVldEFkZHJlc3NcIi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5xdWVyeSAtIEdlb2dyYXBoaWMgaWRlbnRpZmllciB0byBsb2NhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpbHRlcnNdIC0gQWRkaXRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHRvIHNlYXJjaC4gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZSBnaXZlbi5cbiAgICAgKiAgICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5maWx0ZXJzLltwcm9wXV0gLSBBZGRpdGlvbm5hbCBwcm9wZXJ0aWVzIHRvIGZpbHRlciBzZWFyY2guIFByb3BlcnRpZXMgZGVwZW5kcyBvbiBvcHRpb25zLmluZGV4LCBhbmQgdmFsdWVzIHR5cGUgc2hvdWxkIGJlIFwiU3RyaW5nXCIuXG4gICAgICogICAgICA8YnIvPjxici8+XG4gICAgICogICAgICBQcm9wZXJ0aWVzIGF2YWlsYWJsZXMgZm9yIGFkZHJlc3Mgc2VhcmNoIDo8YnIvPlxuICAgICAqICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIgYW5kIFwiY2l0eVwiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBwbGFjZSBuYW1lcyBzZWFyY2ggOjxici8+XG4gICAgICogICAgICBcInBvc3RhbENvZGVcIiwgXCJpbnNlZUNvZGVcIiBhbmQgXCJ0eXBlXCIuXG4gICAgICogICAgICA8YnIvPjxici8+XG4gICAgICogICAgICBQcm9wZXJ0aWVzIGF2YWlsYWJsZXMgZm9yIGNhZGFzdHJhbCBwYXJjZWxzIHNlYXJjaCA6PGJyLz5cbiAgICAgKiAgICAgIFwiY29kZURlcGFydGVtZW50XCIsIFwiY29kZUNvbW11bmVcIiwgXCJub21Db21tdW5lXCIsIFwiY29kZUNvbW11bmVBYnNcIiwgXCJjb2RlQXJyb25kaXNzZW1lbnRcIiwgXCJzZWN0aW9uXCIsIFwibnVtZXJvXCIsIFwiZmV1aWxsZVwiLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzPTIwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy4gRGVmYXVsdCB1bmRlcmx5aW5nIHNlcnZpY2UgdmFsdWUgYXBwbGllcyAoMjApIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldHVyblRydWVHZW9tZXRyeT1mYWxzZV0gLSBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2lzaCB0byBoYXZlIHRoZSB0cnVlIGdlb21ldHJpZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHVuc3VjY2Vzc2Z1bCBzZXJ2aWNlIHJlc3BvbnNlcyAodGltZU91dCwgbWlzc2luZyByaWdodHMsIC4uLikuIFRha2VzIGEge0BsaW5rIEdwLkVycm9yfSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lT3V0PTBdIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhYm92ZSB3aGljaCBhIHRpbWVPdXQgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9uRmFpbHVyZSBjYWxsYmFjayAoc2VlIGFib3ZlKS4gRGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRpbWVPdXQgd2lsbCBub3QgYmUgaGFuZGxlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2VydmVyVXJsPWh0dHAgKHMpOi8vd3hzLmlnbi5mci9BUElLRVkvZ2VvcG9ydGFpbC9vbHNdIC0gV2ViIHNlcnZpY2UgVVJMLiBJZiB1c2VkLCBvcHRpb25zLmFwaUtleSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zc2wgPSB0cnVlXSAtIFVzZSBvZiBIVFRQUyBvciBIVFRQIHByb3RvY29sIHRvIHJlcXVlc3QgdGhlIHNlcnZpY2VzLiBIVFRQUyBieSBkZWZhdWx0IChzc2w9dHJ1ZSkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgZ2VvY29kZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBnZW9jb2RlU2VydmljZSA9IG5ldyBHZW9jb2RlKG9wdGlvbnMpO1xuICAgICAgICBnZW9jb2RlU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2aW5nIGdlb2dyYXBoaWNhbCBpZGVudGlmaWVycyAocGxhY2UgbmFtZXMsIGFkZHJlc3MsIGNhZGFzdHJhbCBwYXJjZWxzLCAuLi4pIG5lYXIgYSBnaXZlbiBwb3NpdGlvbiwgdXNpbmcgdGhlIFtyZXZlcnNlIGdlb2NvZGluZyB3ZWIgc2VydmljZSBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2dlb2NvZGFnZS1pbnZlcnNlLmh0bWx9LlxuICAgICAqXG4gICAgICogQG1ldGhvZCByZXZlcnNlR2VvY29kZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5hcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmluZGV4PVwiU3RyZWV0QWRkcmVzc1wiXSAtIEdlb2dyYXBoaWNhbCBpZGVudGlmaWVyIHR5cGUgdG8gc2VhcmNoLiBWYWx1ZXMgY3VycmVudGx5IGF2YWlsYWJsZXMgYXJlIDogXCJQb3NpdGlvbk9mSW50ZXJlc3RcIiBmb3IgcGxhY2UgbmFtZXMsIFwiU3RyZWV0QWRkcmVzc1wiIGZvciBhZGRyZXNzIHNlYXJjaCwgXCJDYWRhc3RyYWxQYXJjZWxcIiBmb3IgQ2FkYXN0cmFsIHBhcmNlbHMgc2VhcmNoLCBcImxvY2F0aW9uXCIgZm9yIGEgbXVsdGktaW5kZXggc2VhcmNoIG9uIFwiU3RyZWV0QWRkcmVzc1wiIGFuZCBcIlBvc2l0aW9uT2ZJbnRlcmVzdFwiLiBEZWZhdWx0IGlzIFwiU3RyZWV0QWRkcmVzc1wiLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnBvc2l0aW9uIC0gUmVmZXJlbmNlIHBvc2l0aW9uIHdoZXJlIHRvIHNlYXJjaCBnZW9ncmFwaGljYWwgaWRlbnRpZmllcnMuXG4gICAgICogICAgICBAcGFyYW0ge0Zsb2F0fSBvcHRpb25zLnBvc2l0aW9uLmxvbiAtIExvbmdpdHVkZVxuICAgICAqICAgICAgQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBMYXRpdHVkZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWx0ZXJzXSAtIEFkZGl0aW9uYWwgZmlsdGVycyB0byBhcHBseSB0byBzZWFyY2guIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUgZ2l2ZW4uXG4gICAgICogICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZmlsdGVycy5bcHJvcF1dIC0gQWRkaXRpb25uYWwgcHJvcGVydGllcyB0byBmaWx0ZXIgc2VhcmNoLiBQcm9wZXJ0aWVzIGRlcGVuZHMgb24gb3B0aW9ucy5pbmRleCwgYW5kIHZhbHVlcyB0eXBlIHNob3VsZCBiZSBcIlN0cmluZ1wiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBhZGRyZXNzIHNlYXJjaCA6PGJyLz5cbiAgICAgKiAgICAgIFwicG9zdGFsQ29kZVwiLCBcImluc2VlQ29kZVwiIGFuZCBcImNpdHlcIi5cbiAgICAgKiAgICAgIDxici8+PGJyLz5cbiAgICAgKiAgICAgIFByb3BlcnRpZXMgYXZhaWxhYmxlcyBmb3IgcGxhY2UgbmFtZXMgc2VhcmNoIDo8YnIvPlxuICAgICAqICAgICAgXCJwb3N0YWxDb2RlXCIsIFwiaW5zZWVDb2RlXCIgYW5kIFwidHlwZVwiLlxuICAgICAqICAgICAgPGJyLz48YnIvPlxuICAgICAqICAgICAgUHJvcGVydGllcyBhdmFpbGFibGVzIGZvciBjYWRhc3RyYWwgcGFyY2VscyBzZWFyY2ggOjxici8+XG4gICAgICogICAgICBcImNvZGVEZXBhcnRlbWVudFwiLCBcImNvZGVDb21tdW5lXCIsIFwibm9tQ29tbXVuZVwiLCBcImNvZGVDb21tdW5lQWJzXCIsIFwiY29kZUFycm9uZGlzc2VtZW50XCIsIFwic2VjdGlvblwiLCBcIm51bWVyb1wiLCBcImZldWlsbGVcIi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2VhcmNoR2VvbWV0cnldIC0gTG9jYXRpb24gd2hlcmUgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAqICAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuc2VhcmNoR2VvbWV0cnkudHlwZSAtIEdlb21ldHJ5IHR5cGUgKFBvaW50fENpcmNsZXxMaW5lc3RyaW5nfFBvbHlnb24pXG4gICAgICogICAgICBAcGFyYW0ge0FycmF5LjxGbG9hdD58QXJyYXkuQXJyYXkuPEZsb2F0Pn0gb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5jb29yZGluYXRlcyAtIENvb3JkaW5hdGVzXG4gICAgICogICAgICBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5zZWFyY2hHZW9tZXRyeS5yYWRpdXNdIC0gUmFkaXVzIChvbmx5IGZvciB0eXBlICdDaXJjbGUnKVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtUmVzcG9uc2VzPTIwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy4gRGVmYXVsdCB1bmRlcmx5aW5nIHNlcnZpY2UgdmFsdWUgYXBwbGllcyAoMjApIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuR2VvY29kZVJlc3BvbnNlfSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgZXhjZXB0IGlmIFwicmF3UmVzcG9uc2VcIiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkZhaWx1cmVdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHVuc3VjY2Vzc2Z1bCBzZXJ2aWNlIHJlc3BvbnNlcyAodGltZU91dCwgbWlzc2luZyByaWdodHMsIC4uLikuIFRha2VzIGEge0BsaW5rIEdwLkVycm9yfSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lT3V0PTBdIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhYm92ZSB3aGljaCBhIHRpbWVPdXQgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9uRmFpbHVyZSBjYWxsYmFjayAoc2VlIGFib3ZlKS4gRGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRpbWVPdXQgd2lsbCBub3QgYmUgaGFuZGxlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2VydmVyVXJsPWh0dHAgKHMpOi8vd3hzLmlnbi5mci9BUElLRVkvZ2VvcG9ydGFpbC9vbHNdIC0gV2ViIHNlcnZpY2UgVVJMLiBJZiB1c2VkLCBvcHRpb25zLmFwaUtleSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zc2wgPSB0cnVlXSAtIFVzZSBvZiBIVFRQUyBvciBIVFRQIHByb3RvY29sIHRvIHJlcXVlc3QgdGhlIHNlcnZpY2VzLiBIVFRQUyBieSBkZWZhdWx0IChzc2w9dHJ1ZSkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgcmV2ZXJzZUdlb2NvZGUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgcmV2ZXJzZUdlb2NvZGVTZXJ2aWNlID0gbmV3IFJldmVyc2VHZW9jb2RlKG9wdGlvbnMpO1xuICAgICAgICByZXZlcnNlR2VvY29kZVNlcnZpY2UuY2FsbCgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0dGluZyBzdWdnZXN0aW9ucyBvZiBwcm9iYWJsZSBwbGFjZXMgbmFtZXMgb3IgYWRkcmVzcyBiYXNlZCBvbiB1bmNvbXBsZXRlIHRleHRzLCB1c2luZyB0aGUgW2F1dG9jb21wbGV0aW9uIHNlcnZpY2Ugb2YgdGhlIEdlb3BvcnRhbCBQbGF0Zm9ybV17QGxpbmsgaHR0cHM6Ly9nZW9zZXJ2aWNlcy5pZ24uZnIvZG9jdW1lbnRhdGlvbi9nZW9zZXJ2aWNlcy9hdXRvY29tcGxldGlvbi5odG1sfVxuICAgICAqXG4gICAgICogQG1ldGhvZCBhdXRvQ29tcGxldGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGwuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYXBpS2V5IC0gQWNjZXNzIGtleSB0byBHZW9wb3J0YWwgcGxhdGZvcm0sIG9idGFpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9zZXJ2aWNlcy13ZWJ9LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRleHQgLSBUZXh0IGlucHV0IHRvIGNvbXBsZXRlLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IFtvcHRpb25zLmZpbHRlck9wdGlvbnMudHlwZSA9IFwiU3RyZWV0QWRkcmVzc1wiXSAtIFN1Z2dlc3Rpb24gdHlwZXMgdG8gcHJvdmlkZSA6IGFkZHJlc3MgKFwiU3RyZWV0QWRkcmVzc1wiKSBhbmQvb3IgcGxhY2UgbmFtZSAoXCJQb3NpdGlvbk9mSW50ZXJlc3RcIikuXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMuZmlsdGVyT3B0aW9ucy50ZXJyaXRvcnldIC0gUGxhY2VzIHdoZXJlIHRvIGxpbWl0IHRoZSBzZWFyY2ggb2Ygc3VnZ2VzdGlvbnMgOiBcIk1FVFJPUE9MRVwiIChDb3JzaWNhIGFuZCBtZXRyb3BvbGl0YW4gRnJhbmNlKSwgXCJET01UT01cIiAoRnJlbmNoIG92ZXJzZWFzIGRlcGFydG1lbnRzIGFuZCB0ZXJyaXRvcmllcyksIG9yIGFuIElOU0VFIGNvZGUgb2YgYSBkZXBhcnRtZW50LiBObyBsaW1pdGF0aW9uIGJ5IGRlZmF1bHQuIEZvciBpbnN0YW5jZSA6IFsnTUVUUk9QT0xFJywgJzMxJ11cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4aW11bVJlc3BvbnNlcyA9IDEwXSAtIE1heGltdW0gbnVtYmVyIG9mIHJlc3BvbnNlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuQXV0b0NvbXBsZXRlUmVzcG9uc2V9IG9iamVjdCBhcyBhIHBhcmFtZXRlciBleGNlcHQgaWYgXCJyYXdSZXNwb25zZVwiIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zZXJ2ZXJVcmw9aHR0cCAocyk6Ly93eHMuaWduLmZyL0FQSUtFWS9vbHMvYXBpcy9jb21wbGV0aW9uXSAtIFdlYiBzZXJ2aWNlIFVSTC4gSWYgdXNlZCwgb3B0aW9ucy5hcGlLZXkgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3NsID0gdHJ1ZV0gLSBVc2Ugb2YgSFRUUFMgb3IgSFRUUCBwcm90b2NvbCB0byByZXF1ZXN0IHRoZSBzZXJ2aWNlcy4gSFRUUFMgYnkgZGVmYXVsdCAoc3NsPXRydWUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm90b2NvbD1YSFJdIC0gUHJvdG9jb2wgdXNlZCB0byBoYW5kbGUgZGlhbG9nIHdpdGggd2ViIHNlcnZpY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0pTT05QJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QfSkgYW5kICdYSFInICh7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MSHR0cFJlcXVlc3R9KS4gT25seSBYSFIgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGluIGEgTm9kZUpTIGVudmlyb25tZW50LiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJveHlVUkxdIC0gUHJveHkgVVJMIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZS4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeF0gLSBDYWxsYmFjayBmdW5jdGlvbiBuYW1lIHN1ZmZpeCB0byB1c2UgaW4gY2FzZSBvZiBhIEpTT05QIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSwgdG8gc2V0IHlvdXIgb3duIHN1ZmZpeCBpbnN0ZWFkIG9mIGF1dG8taW5jcmVtZW50LiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ1hIUicgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5odHRwTWV0aG9kPUdFVF0gLSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgaW4gY2FzZSBvZiBhIFhIUiBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0dFVCcgYW5kICdQT1NUJy4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94bWxcIl0gLSBDb250ZW50LVR5cGUgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpIGFuZCBpZiBtZXRob2QgSFRUUCBpcyBQT1NULiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ0pTT05QJyB2YWx1ZS4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2U9ZmFsc2VdIC0gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGltcGxpZXMgeW91IHdhbnQgdG8gaGFuZGxlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGJ5IHlvdXJzZWxmIDogaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhbiB1bnBhcnNlZCBTdHJpbmcgaW4gb25TdWNjZXNzIGNhbGxiYWNrIHBhcmFtZXRlci4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHNlcnZpY2UgcmVzcG9uc2UgYmVmb3JlIHBhcnNpbmcgKGFzIGFuIHVucGFyc2VkIFN0cmluZykuIFRha2VzIGEgU3RyaW5nIGFzIGEgcGFyYW1ldGVyICh0aGUgcmF3IHNlcnZpY2UgcmVzcG9uc2UpLiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJzZWQgYXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICBhdXRvQ29tcGxldGUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgYXV0b0NvbXBsZXRlU2VydmljZSA9IG5ldyBBdXRvQ29tcGxldGUob3B0aW9ucyk7XG4gICAgICAgIGF1dG9Db21wbGV0ZVNlcnZpY2UuY2FsbCgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0dGluZyBhIHJvdXRlIGZyb20gb25lIHBvaW50IHRvIGFub3RoZXIgdXNpbmcgdGhlIFtyb3V0ZSBzZXJ2aWNlIG9mIHRoZSBHZW9wb3J0YWwgUGxhdGZvcm1de0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL2RvY3VtZW50YXRpb24vZ2Vvc2VydmljZXMvaXRpbmVyYWlyZXMuaHRtbH0uXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHJvdXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnJlc291cmNlIC0gUmVzb3VyY2UgdXNlZCB0byBjb21wdXRlIHRoZSByb3V0ZS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5hcGlLZXkgLSBBY2Nlc3Mga2V5IHRvIEdlb3BvcnRhbCBwbGF0Zm9ybSwgb2J0YWluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZ2Vvc2VydmljZXMuaWduLmZyL3NlcnZpY2VzLXdlYn0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnJvdXRlUHJlZmVyZW5jZSA9IFwiZmFzdGVzdFwiXSAtIEluZGljYXRlcyB0aGUgd2F5IHRvIGNvbXB1dGUgdGhlIHJvdXRlIDogXCJmYXN0ZXN0XCIgKHRpbWUgb3B0aW1pc2F0aW9uKSBvciBcInNob3J0ZXN0XCIgKGRpc3RhbmNlIG9wdGltaXNhdGlvbikuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5zdGFydFBvaW50IC0gU3RhcnQgcG9pbnQgb2YgdGhlIHJvdXRlLiBFeHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSAoc3RhcnRQb2ludC54IGNvcnJlc3BvbmRzIHRvIGxvbmdpdHVkZSwgc3RhcnRQb2ludC55IGNvcnJlc3BvbmRzIHRvIGxhdGl0dWRlKS4gQXZhaWxhYmxlIGJib3ggYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5lbmRQb2ludCAtIEVuZCBwb2ludCBvZiB0aGUgcm91dGUuIEV4cHJlc3NlZCBpbiBDUlM6ODQgY29vcmRpbmF0ZXMgc3lzdGVtIChlbmRQb2ludC54IGNvcnJlc3BvbmRzIHRvIGxvbmdpdHVkZSwgZW5kUG9pbnQueSBjb3JyZXNwb25kcyB0byBsYXRpdHVkZSkuIEF2YWlsYWJsZSBiYm94IGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPEdwLlBvaW50Pn0gW29wdGlvbnMudmlhUG9pbnRzXSAtIE9yZGVyZWQgdmlhIFBvaW50cyBvZiB0aGUgcm91dGUuIEV4cHJlc3NlZCBpbiBDUlM6ODQgY29vcmRpbmF0ZXMgc3lzdGVtICh2aWFQb2ludHNbaV0ueCBjb3JyZXNwb25kcyB0byBsb25naXR1ZGUsIHZpYVBvaW50c1tpXS55IGNvcnJlc3BvbmRzIHRvIGxhdGl0dWRlKS4gQXZhaWxhYmxlIGJib3ggYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmdyYXBoID0gXCJWb2l0dXJlXCJdIC0gVXNlciBwcm9maWxlIHRvIHVzZSB0byBjb21wdXRlIHRoZSByb3V0ZSA6IFwiVm9pdHVyZVwiICh1c2luZyBhIHZlaGljdWxlKSBvciBcIlBpZXRvblwiIChwZWRlc3RyaWFuKS4gSGFzIGFuIGluZmx1ZW5jZSBvbiB0aGUga2luZCBvZiByb2FkcyB0aGUgcm91dGUgbWF5IHVzZSBhbmQgdGhlIGF2ZXJhZ2Ugc3BlZWQuIEF2YWlsYWJsZSBiYm94IGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IFtvcHRpb25zLmV4Y2x1c2lvbnNdIC0gREVQUkVDQVRFRDogdXNlIG9wdGlvbnMuY29uc3RyYWludHMuIEluZGljYXRlcyBpZiByb3V0ZSBoYXMgdG8gYXZvaWQgc29tZSBmZWF0dXJlcyAoXCJ0b2xsXCIsIFwiYnJpZGdlXCIgb3IgXCJ0dW5uZWxcIikuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5nZW9tZXRyeUluSW5zdHJ1Y3Rpb25zID0gZmFsc2VdIC0gSW5kaWNhdGVzIGlmIHJvdXRlIGdlb21ldHJ5IGhhcyB0byBiZSBhbHNvIHJldHVybmVkIHdpdGggcm91dGUgaW5zdHJ1Y3Rpb25zLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHJvdmlkZUJvdW5kaW5nQm94ID0gdHJ1ZV0gLSBJbmRpY2F0ZXMgaWYgcm91dGUgaW5zdHJ1Y3Rpb25zIGhhcyB0byBiZSBsb2NhbGlzZWQgd2l0aCBhIEJCT1ggaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kaXN0YW5jZVVuaXQgPSBcIm1cIl0gLSBUaGUgdW5pdCB1c2VkIHRvIHByb3ZpZGUgZGlzdGFuY2VzIGluIHRoZSByZXNwb25zZSAoXCJtZXRlclwiIG9yIFwia2lsb21ldGVyXCIpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1lVW5pdCA9IFwic2Vjb25kXCJdIC0gVGhlIHVuaXQgdXNlZCB0byBwcm92aWRlIGR1cmF0aW9uIGluIHRoZSByZXNwb25zZSAoXCJzdGFuZGFyZFwiLCBcInNlY29uZFwiLCBcIm1pbnV0ZVwiLCBcImhvdXJcIikuXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMud2F5c0F0dHJpYnV0ZXNdIC0gV2F5IEF0dHJpYnV0ZXMgdG8gYWRkIGluIHRoZSByZXNwb25zZS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBbb3B0aW9ucy5jb25zdHJhaW50c10gLSBDb25zdHJhaW50cyB1c2VkICh7J2NvbnN0cmFpbnRUeXBlJzonYmFubmVkJywna2V5Jzond2F5c190eXBlJywnb3BlcmF0b3InOic9JywndmFsdWUnOidhdXRvcm91dGUnfSkuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN1Y2Nlc3MgLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZ2V0dGluZyBzdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2UuIFRha2VzIGEge0BsaW5rIEdwLlNlcnZpY2VzLlJvdXRlUmVzcG9uc2V9IG9iamVjdCBhcyBhIHBhcmFtZXRlciBleGNlcHQgaWYgXCJyYXdSZXNwb25zZVwiIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uRmFpbHVyZV0gLSBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdW5zdWNjZXNzZnVsIHNlcnZpY2UgcmVzcG9uc2VzICh0aW1lT3V0LCBtaXNzaW5nIHJpZ2h0cywgLi4uKS4gVGFrZXMgYSB7QGxpbmsgR3AuRXJyb3J9IG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVPdXQ9MF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFib3ZlIHdoaWNoIGEgdGltZU91dCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIHdpdGggb25GYWlsdXJlIGNhbGxiYWNrIChzZWUgYWJvdmUpLiBEZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGltZU91dCB3aWxsIG5vdCBiZSBoYW5kbGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5vdXRwdXRGb3JtYXQ9J2pzb24nXSAtIE91dHB1dCBmb3JtYXQgKFwianNvblwiIG9yIFwieG1sXCIpIHRvIHVzZSBmb3IgdW5kZXJseWluZyB3ZWJTZXJ2aWNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2l0aW5lcmFpcmUvcmVzdC9yb3V0ZS5qc29uXSAtIFdlYiBzZXJ2aWNlIFVSTC4gSWYgdXNlZCwgb3B0aW9ucy5hcGlLZXkgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3NsID0gdHJ1ZV0gLSBVc2Ugb2YgSFRUUFMgb3IgSFRUUCBwcm90b2NvbCB0byByZXF1ZXN0IHRoZSBzZXJ2aWNlcy4gSFRUUFMgYnkgZGVmYXVsdCAoc3NsPXRydWUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm90b2NvbD1YSFJdIC0gUHJvdG9jb2wgdXNlZCB0byBoYW5kbGUgZGlhbG9nIHdpdGggd2ViIHNlcnZpY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0pTT05QJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QfSkgYW5kICdYSFInICh7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MSHR0cFJlcXVlc3R9KS4gT25seSBYSFIgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGluIGEgTm9kZUpTIGVudmlyb25tZW50LiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJveHlVUkxdIC0gUHJveHkgVVJMIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZS4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jYWxsYmFja1N1ZmZpeF0gLSBDYWxsYmFjayBmdW5jdGlvbiBuYW1lIHN1ZmZpeCB0byB1c2UgaW4gY2FzZSBvZiBhIEpTT05QIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSwgdG8gc2V0IHlvdXIgb3duIHN1ZmZpeCBpbnN0ZWFkIG9mIGF1dG8taW5jcmVtZW50LiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ1hIUicgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5odHRwTWV0aG9kPUdFVF0gLSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UgaW4gY2FzZSBvZiBhIFhIUiBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ0dFVCcgYW5kICdQT1NUJy4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94bWxcIl0gLSBDb250ZW50LVR5cGUgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpIGFuZCBpZiBtZXRob2QgSFRUUCBpcyBQT1NULiBJZ25vcmVkIHdoZW4gb3B0aW9ucy5wcm90b2NvbCBpcyBzZXQgdG8gJ0pTT05QJyB2YWx1ZS4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmF3UmVzcG9uc2U9ZmFsc2VdIC0gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGltcGxpZXMgeW91IHdhbnQgdG8gaGFuZGxlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGJ5IHlvdXJzZWxmIDogaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhbiB1bnBhcnNlZCBTdHJpbmcgaW4gb25TdWNjZXNzIGNhbGxiYWNrIHBhcmFtZXRlci4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uQmVmb3JlUGFyc2VdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHNlcnZpY2UgcmVzcG9uc2UgYmVmb3JlIHBhcnNpbmcgKGFzIGFuIHVucGFyc2VkIFN0cmluZykuIFRha2VzIGEgU3RyaW5nIGFzIGEgcGFyYW1ldGVyICh0aGUgcmF3IHNlcnZpY2UgcmVzcG9uc2UpLiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJzZWQgYXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKi9cbiAgICByb3V0ZSA6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciByb3V0ZVNlcnZpY2UgPSBuZXcgUm91dGUob3B0aW9ucyk7XG4gICAgICAgIHJvdXRlU2VydmljZS5jYWxsKCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDb21wdXRpbmcgYSBzZXQgb2YgcGxhY2VzIChjdXJ2ZSkgcmVhY2hhYmxlIGZyb20gYSBnaXZlbiBwb2ludCAob3IgZnJvbSB3aGVyZSB0byBzdGFydCB0byByZWFjaCBhIGdpdmVuIHBvaW50KSB3aXRoaW4gYSB0aW1lIG9yIGRpc3RhbmNlIGNvbnN0cmFpbnQgdXNpbmcgdGhlIFtpc29jaHJvbmUgc2VydmljZSBvZiB0aGUgR2VvcG9ydGFsIFBsYXRmb3JtXXtAbGluayBodHRwczovL2dlb3NlcnZpY2VzLmlnbi5mci9kb2N1bWVudGF0aW9uL2dlb3NlcnZpY2VzL2lzb2Nocm9uZXMuaHRtbH0uXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGlzb0N1cnZlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBmdW5jdGlvbiBjYWxsLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmFwaUtleSAtIEFjY2VzcyBrZXkgdG8gR2VvcG9ydGFsIHBsYXRmb3JtLCBvYnRhaW5lZCBbaGVyZV17QGxpbmsgaHR0cHM6Ly9nZW9zZXJ2aWNlcy5pZ24uZnIvc2VydmljZXMtd2VifS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5yZXNvdXJjZSAtIFJlc291cmNlIHVzZWQgdG8gY29tcHV0ZSB0aGUgcm91dGUuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGluIHRoZSBHZXRDYXBhYmlsaXRpZXMuXG4gICAgICogQHBhcmFtIHtHcC5Qb2ludH0gb3B0aW9ucy5wb3NpdGlvbiAtIFN0YXJ0IG9yIEFycml2YWwgKG9wdGlvbnMucmV2ZXJzZT09PXRydWUpIFBvaW50IGZvciB0aGUgY29tcHV0aW5nLiBFeHByZXNzZWQgaW4gQ1JTOjg0IGNvb3JkaW5hdGVzIHN5c3RlbSAocG9zaXRpb24ueCBjb3JyZXNwb25kcyB0byBsb25naXR1ZGUsIHBvc2l0aW9uLnkgY29ycmVzcG9uZHMgdG8gbGF0aXR1ZGUpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ncmFwaCA9IFwiVm9pdHVyZVwiXSAtIFVzZXIgcHJvZmlsZSB0byB1c2UgdG8gY29tcHV0ZSB0aGUgaXNvQ3VydmUgOiBcIlZvaXR1cmVcIiAodXNpbmcgYSB2ZWhpY3VsZSkgb3IgXCJQaWV0b25cIiAocGVkZXN0cmlhbikuIEhhcyBhbiBpbmZsdWVuY2Ugb24gdGhlIGtpbmQgb2Ygcm9hZHMgdG8gdXNlIGFuZCB0aGUgYXZlcmFnZSBzcGVlZC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBbb3B0aW9ucy5leGNsdXNpb25zXSAtIERFUFJFQ0FURUQ6IHVzZSBvcHRpb25zLmNvbnN0cmFpbnRzLiBJbmRpY2F0ZXMgaWYgcm91dGUgaGFzIHRvIGF2b2lkIHNvbWUgZmVhdHVyZXMgKFwidG9sbFwiLCBcImJyaWRnZVwiIG9yIFwidHVubmVsXCIpLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IFtvcHRpb25zLmNvbnN0cmFpbnRzXSAtIENvbnN0cmFpbnRzIHVzZWQgKHsnY29uc3RyYWludFR5cGUnOidiYW5uZWQnLCdrZXknOid3YXlzX3R5cGUnLCdvcGVyYXRvcic6Jz0nLCd2YWx1ZSc6J2F1dG9yb3V0ZSd9KS4gQXZhaWxhYmxlIHZhbHVlcyBhcmUgaW4gdGhlIEdldENhcGFiaWxpdGllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWV0aG9kID0gXCJ0aW1lXCJdIC0gQ29tcHV0aW5nIG1ldGhvZCB0byB1c2UgOiBcInRpbWVcIiAodXNpbmcgYSBkdXJhdGlvbiBhcyBhIGNvbnN0cmFpbnQpIG9yIFwiZGlzdGFuY2VcIiAodXNpbmcgYSBkaXN0YW5jZSBhcyBhIGNvbnN0cmFpbnQpLiBBdmFpbGFibGUgdmFsdWVzIGFyZSBpbiB0aGUgR2V0Q2FwYWJpbGl0aWVzLlxuICAgICAqIEBwYXJhbSB7RmxvYXR9IG9wdGlvbnMudGltZSAtIE1heGltdW0gZHVyYXRpb24gKGV4cHJlc3NlZCBpbiBzZWNvbmRzKSB0byB1c2Ugd2hlbiBvcHRpb25zLm1ldGhvZCBpcyBzZXQgdG8gXCJ0aW1lXCIuXG4gICAgICogQHBhcmFtIHtGbG9hdH0gb3B0aW9ucy5kaXN0YW5jZSAtIE1heGltdW0gZGlzdGFuY2UgKGV4cHJlc3NlZCBpbiBtZXRlcnMpIHRvIHVzZSB3aGVuIG9wdGlvbnMubWV0aG9kIGlzIHNldCB0byBcImRpc3RhbmNlXCIuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXZlcnNlID0gZmFsc2VdIC0gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgaWYgeW91IHdhbnQgb3B0aW9ucy5wb3NpdGlvbiB0byBiZSB0aGUgZGVzdGluYXRpb24gKGluc3RlYWQgb2YgZGVwYXJ0dXJlKSBmb3IgdGhlIGNvbXB1dGluZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGlzdGFuY2VVbml0ID0gXCJrbVwiXSAtIFRoZSB1bml0IHVzZWQgdG8gcHJvdmlkZSBkaXN0YW5jZXMgaW4gdGhlIHJlc3BvbnNlIChcIm1cIiBvciBcImttXCIpLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1lVW5pdCA9IFwic2Vjb25kXCJdIC0gVGhlIHVuaXQgdXNlZCB0byBwcm92aWRlIGR1cmF0aW9uIGluIHRoZSByZXNwb25zZSAoXCJzdGFuZGFyZFwiLCBcInNlY29uZFwiLCBcIm1pbnV0ZVwiLCBcImhvdXJcIikuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zbW9vdGhpbmcgPSBmYWxzZV0gLSBERVBSRUNBVEVEOiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgcmVzdWx0aW5nIGdlb21ldHJ5IHRvIGJlIHNtb290aGVkLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZXMgPSBmYWxzZV0gLSBERVBSRUNBVEVEOiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgcmVzdWx0aW5nIGdlb21ldHJ5IChwb2x5Z29uKSB0byBoYXZlIGhvbGVzIGlmIHBlcnRpbmVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3VjY2VzcyAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZS4gVGFrZXMgYSB7QGxpbmsgR3AuU2VydmljZXMuSXNvQ3VydmVSZXNwb25zZX0gb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGV4Y2VwdCBpZiBcInJhd1Jlc3BvbnNlXCIgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GYWlsdXJlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyB1bnN1Y2Nlc3NmdWwgc2VydmljZSByZXNwb25zZXMgKHRpbWVPdXQsIG1pc3NpbmcgcmlnaHRzLCAuLi4pLiBUYWtlcyBhIHtAbGluayBHcC5FcnJvcn0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZU91dD0wXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYWJvdmUgd2hpY2ggYSB0aW1lT3V0IHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBvbkZhaWx1cmUgY2FsbGJhY2sgKHNlZSBhYm92ZSkuIERlZmF1bHQgdmFsdWUgaXMgMCB3aGljaCBtZWFucyB0aW1lT3V0IHdpbGwgbm90IGJlIGhhbmRsZWQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm91dHB1dEZvcm1hdD0nanNvbiddIC0gT3V0cHV0IGZvcm1hdCAoXCJqc29uXCIpIHRvIHVzZSBmb3IgdW5kZXJseWluZyB3ZWJTZXJ2aWNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybD1odHRwIChzKTovL3d4cy5pZ24uZnIvQVBJS0VZL2lzb2Nocm9uZS9pc29jaHJvbmUuanNvbl0gLSBXZWIgc2VydmljZSBVUkwuIElmIHVzZWQsIG9wdGlvbnMuYXBpS2V5IHBhcmFtZXRlciBpcyBpZ25vcmVkLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNzbCA9IHRydWVdIC0gVXNlIG9mIEhUVFBTIG9yIEhUVFAgcHJvdG9jb2wgdG8gcmVxdWVzdCB0aGUgc2VydmljZXMuIEhUVFBTIGJ5IGRlZmF1bHQgKHNzbD10cnVlKS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJvdG9jb2w9WEhSXSAtIFByb3RvY29sIHVzZWQgdG8gaGFuZGxlIGRpYWxvZyB3aXRoIHdlYiBzZXJ2aWNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdKU09OUCcgKHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUH0pIGFuZCAnWEhSJyAoe0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hNTEh0dHBSZXF1ZXN0fSkuIE9ubHkgWEhSIHByb3RvY29sIGlzIHN1cHBvcnRlZCBpbiBhIE5vZGVKUyBlbnZpcm9ubWVudC4gT25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3h5VVJMXSAtIFByb3h5IFVSTCB0byB1c2Ugd2hlbiByZXF1ZXN0aW5nIHVuZGVybHlpbmcgd2ViIHNlcnZpY2UuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2FsbGJhY2tTdWZmaXhdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBzdWZmaXggdG8gdXNlIGluIGNhc2Ugb2YgYSBKU09OUCBwcm90b2NvbCB1c2UgKHNlZSBhYm92ZSksIHRvIHNldCB5b3VyIG93biBzdWZmaXggaW5zdGVhZCBvZiBhdXRvLWluY3JlbWVudC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdYSFInIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaHR0cE1ldGhvZD1HRVRdIC0gSFRUUCBtZXRob2QgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB1bmRlcmx5aW5nIHdlYiBzZXJ2aWNlIGluIGNhc2Ugb2YgYSBYSFIgcHJvdG9jb2wgdXNlIChzZWUgYWJvdmUpLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdHRVQnIGFuZCAnUE9TVCcuIElnbm9yZWQgd2hlbiBvcHRpb25zLnByb3RvY29sIGlzIHNldCB0byAnSlNPTlAnIHZhbHVlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veG1sXCJdIC0gQ29udGVudC1UeXBlIHRvIHVzZSB3aGVuIHJlcXVlc3RpbmcgdW5kZXJseWluZyB3ZWIgc2VydmljZSBpbiBjYXNlIG9mIGEgWEhSIHByb3RvY29sIHVzZSAoc2VlIGFib3ZlKSBhbmQgaWYgbWV0aG9kIEhUVFAgaXMgUE9TVC4gSWdub3JlZCB3aGVuIG9wdGlvbnMucHJvdG9jb2wgaXMgc2V0IHRvICdKU09OUCcgdmFsdWUuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJhd1Jlc3BvbnNlPWZhbHNlXSAtIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbXBsaWVzIHlvdSB3YW50IHRvIGhhbmRsZSB0aGUgc2VydmljZSByZXNwb25zZSBieSB5b3Vyc2VsZiA6IGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gdW5wYXJzZWQgU3RyaW5nIGluIG9uU3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIuIE9ubHkgdXNlIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkJlZm9yZVBhcnNlXSAtIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzZXJ2aWNlIHJlc3BvbnNlIGJlZm9yZSBwYXJzaW5nIChhcyBhbiB1bnBhcnNlZCBTdHJpbmcpLiBUYWtlcyBhIFN0cmluZyBhcyBhIHBhcmFtZXRlciAodGhlIHJhdyBzZXJ2aWNlIHJlc3BvbnNlKS4gUmV0dXJucyBhIFN0cmluZyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAgICovXG4gICAgaXNvQ3VydmUgOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgcHJvY2Vzc0lzb0N1cnZlU2VydmljZSA9IG5ldyBQcm9jZXNzSXNvQ3VydmUob3B0aW9ucyk7XG4gICAgICAgIHByb2Nlc3NJc29DdXJ2ZVNlcnZpY2UuY2FsbCgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogUG9pbnQgb2JqZWN0LlxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBHcC5Qb2ludFxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHggLSBQb2ludCBhYnNjaXNzYVxuICogQHByb3BlcnR5IHtGbG9hdH0geSAtIFBvaW50IG9yZGluYXRlXG4gKi9cbnZhciBwb2ludCA9IHt9O1xuXG4vKipcbiAqIENpcmNsZSBvYmplY3QuXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIEdwLkNpcmNsZVxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHggLSBDaXJjbGUgY2VudGVyIGFic2Npc3NhLlxuICogQHByb3BlcnR5IHtGbG9hdH0geSAtIENpcmNsZSBjZW50ZXIgb3JkaW5hdGUuXG4gKiBAcHJvcGVydHkge0Zsb2F0fSByYWRpdXMgLSBDaXJjbGUgcmFkaXVzLlxuICovXG52YXIgY2lyY2xlID0ge307XG5cbi8qKlxuICogQm91bmRpbmcgYm94IG9iamVjdCwgZXhwcmVzc2VkIHdpdGggZm91ciBjb29yZGluYXRlcy5cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgR3AuQkJveFxuICpcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGxlZnQgLSBtaW5pbXVtIGFic2Npc3NhXG4gKiBAcHJvcGVydHkge0Zsb2F0fSByaWdodCAtIG1heGltdW0gYWJzY2lzc2FcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IGJvdHRvbSAtIG1pbmltdW0gb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7RmxvYXR9IHRvcCAtIG1heGltdW0gb3JkaW5hdGVcbiAqL1xudmFyIGJib3ggPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgU2VydmljZXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Services/Services.js\n"); + +/***/ }), + +/***/ "./src/Utils/Helper.js": +/*!*****************************!*\ + !*** ./src/Utils/Helper.js ***! + \*****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Classe utilitaire\n *\n * @module Helper\n * @alias Gp.Helper\n */\nvar Helper = {\n /**\n * concatenation des parametres key/value dans les urls\n *\n * @method normalyzeParameters\n * @static\n * @param {Object} params - tableau de clef/valeur\n *\n * @example\n * Gp.Utils.Helper.normalyzeParameters ({\n * key1:value1,\n * key2:value2,\n * key3:value3\n * });\n * // out : \"key1=value1&key2=value2&key3=value3\"\n *\n * @returns {String} retourne les paramètres concaténés\n */\n normalyzeParameters: function normalyzeParameters(params) {\n var myParams = null;\n if (params) {\n var tabParams = [];\n for (var key in params) {\n if (params.hasOwnProperty(key)) {\n var value = params[key];\n if (!value) {\n value = \"\";\n }\n tabParams.push(key + \"=\" + value);\n }\n }\n myParams = tabParams.join(\"&\");\n }\n return myParams;\n },\n /**\n * Concaténation et encodage des urls.\n *\n * @method normalyzeUrl\n * @static\n * @param {String} url - url\n * @param {Object|String} params - tableau de clef/valeur ou string\n * @param {Boolean} encode - true|false, false par defaut\n *\n * @example\n * Gp.Utils.Helper.normalyzeUrl (url, {\n * key1:value1,\n * key2=:value2,\n * key3:value3\n * });\n * // out : \"url?key1=value1&key2=value2&key3=value3\"\n *\n * @returns {String} retourne une url normalisée\n */\n normalyzeUrl: function normalyzeUrl(url, params, encode) {\n var myUrl = url;\n if (url) {\n var k = url.indexOf(\"?\");\n if (k === -1) {\n // pas de ? et KVP\n myUrl += \"?\";\n }\n if (k !== -1 && k !== url.length - 1) {\n // KVP\n myUrl += \"&\";\n }\n }\n if (params) {\n if (typeof params === \"string\") {\n myUrl += params;\n } else {\n myUrl += this.normalyzeParameters(params);\n }\n }\n if (encode) {\n // FIXME bonne idée ?\n myUrl = encodeURIComponent(myUrl);\n }\n return myUrl;\n },\n /**\n * Indentation d'une chaine\n *\n * @method indent\n * @static\n * @param {Number} n - nombre de tabulation\n * @param {String} msg - chaine\n *\n * @example\n * Gp.Utils.Helper.indent (2, \"message à indenter\")\n * // out\n * // ........message à indenter\n *\n * @returns {String} retourne une chaine indentée\n */\n indent: function indent(n, msg) {\n var num = n || 0;\n return new Array(num + 1).join(\"\\t\") + msg;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Helper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9IZWxwZXIuanM/ODAzNSJdLCJuYW1lcyI6WyJIZWxwZXIiLCJub3JtYWx5emVQYXJhbWV0ZXJzIiwicGFyYW1zIiwibXlQYXJhbXMiLCJ0YWJQYXJhbXMiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInZhbHVlIiwicHVzaCIsImpvaW4iLCJub3JtYWx5emVVcmwiLCJ1cmwiLCJlbmNvZGUiLCJteVVybCIsImsiLCJpbmRleE9mIiwibGVuZ3RoIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaW5kZW50IiwibiIsIm1zZyIsIm51bSIsIkFycmF5Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLE1BQU0sR0FBRztFQUVUO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsbUJBQW1CLEVBQUcsU0FBQUEsb0JBQVVDLE1BQU0sRUFBRTtJQUNwQyxJQUFJQyxRQUFRLEdBQUcsSUFBSTtJQUVuQixJQUFJRCxNQUFNLEVBQUU7TUFDUixJQUFJRSxTQUFTLEdBQUcsRUFBRTtNQUNsQixLQUFLLElBQUlDLEdBQUcsSUFBSUgsTUFBTSxFQUFFO1FBQ3BCLElBQUlBLE1BQU0sQ0FBQ0ksY0FBYyxDQUFDRCxHQUFHLENBQUMsRUFBRTtVQUM1QixJQUFJRSxLQUFLLEdBQUdMLE1BQU0sQ0FBQ0csR0FBRyxDQUFDO1VBQ3ZCLElBQUksQ0FBQ0UsS0FBSyxFQUFFO1lBQ1JBLEtBQUssR0FBRyxFQUFFO1VBQ2Q7VUFDQUgsU0FBUyxDQUFDSSxJQUFJLENBQUNILEdBQUcsR0FBRyxHQUFHLEdBQUdFLEtBQUssQ0FBQztRQUNyQztNQUNKO01BRUFKLFFBQVEsR0FBR0MsU0FBUyxDQUFDSyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDO0lBRUEsT0FBT04sUUFBUTtFQUNuQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSU8sWUFBWSxFQUFHLFNBQUFBLGFBQVVDLEdBQUcsRUFBRVQsTUFBTSxFQUFFVSxNQUFNLEVBQUU7SUFDMUMsSUFBSUMsS0FBSyxHQUFHRixHQUFHO0lBRWYsSUFBSUEsR0FBRyxFQUFFO01BQ0wsSUFBSUcsQ0FBQyxHQUFHSCxHQUFHLENBQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUM7TUFDeEIsSUFBSUQsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQUU7UUFDWkQsS0FBSyxJQUFJLEdBQUc7TUFDaEI7TUFFQSxJQUFJQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUlBLENBQUMsS0FBS0gsR0FBRyxDQUFDSyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQUU7UUFDcENILEtBQUssSUFBSSxHQUFHO01BQ2hCO0lBQ0o7SUFFQSxJQUFJWCxNQUFNLEVBQUU7TUFDUixJQUFJLE9BQU9BLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUJXLEtBQUssSUFBSVgsTUFBTTtNQUNuQixDQUFDLE1BQU07UUFDSFcsS0FBSyxJQUFJLElBQUksQ0FBQ1osbUJBQW1CLENBQUNDLE1BQU0sQ0FBQztNQUM3QztJQUNKO0lBRUEsSUFBSVUsTUFBTSxFQUFFO01BQ1I7TUFDQUMsS0FBSyxHQUFHSSxrQkFBa0IsQ0FBQ0osS0FBSyxDQUFDO0lBQ3JDO0lBRUEsT0FBT0EsS0FBSztFQUNoQixDQUFDO0VBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lLLE1BQU0sRUFBRyxTQUFBQSxPQUFVQyxDQUFDLEVBQUVDLEdBQUcsRUFBRTtJQUN2QixJQUFJQyxHQUFHLEdBQUdGLENBQUMsSUFBSSxDQUFDO0lBQ2hCLE9BQU8sSUFBSUcsS0FBSyxDQUFDRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBR1csR0FBRztFQUM5QztBQUNKLENBQUM7QUFFY3BCLHFFQUFNIiwiZmlsZSI6Ii4vc3JjL1V0aWxzL0hlbHBlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3NlIHV0aWxpdGFpcmVcbiAqXG4gKiBAbW9kdWxlIEhlbHBlclxuICogQGFsaWFzIEdwLkhlbHBlclxuICovXG52YXIgSGVscGVyID0ge1xuXG4gICAgLyoqXG4gICAgICogY29uY2F0ZW5hdGlvbiBkZXMgcGFyYW1ldHJlcyBrZXkvdmFsdWUgZGFucyBsZXMgdXJsc1xuICAgICAqXG4gICAgICogQG1ldGhvZCBub3JtYWx5emVQYXJhbWV0ZXJzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSB0YWJsZWF1IGRlIGNsZWYvdmFsZXVyXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBHcC5VdGlscy5IZWxwZXIubm9ybWFseXplUGFyYW1ldGVycyAoe1xuICAgICAqICAgICAgICAga2V5MTp2YWx1ZTEsXG4gICAgICogICAgICAgICBrZXkyOnZhbHVlMixcbiAgICAgKiAgICAgICAgIGtleTM6dmFsdWUzXG4gICAgICogIH0pO1xuICAgICAqICAvLyBvdXQgOiBcImtleTE9dmFsdWUxJmtleTI9dmFsdWUyJmtleTM9dmFsdWUzXCJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIGxlcyBwYXJhbcOodHJlcyBjb25jYXTDqW7DqXNcbiAgICAgKi9cbiAgICBub3JtYWx5emVQYXJhbWV0ZXJzIDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgbXlQYXJhbXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciB0YWJQYXJhbXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWJQYXJhbXMucHVzaChrZXkgKyBcIj1cIiArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG15UGFyYW1zID0gdGFiUGFyYW1zLmpvaW4oXCImXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG15UGFyYW1zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25jYXTDqW5hdGlvbiBldCBlbmNvZGFnZSBkZXMgdXJscy5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgbm9ybWFseXplVXJsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSB1cmxcbiAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHBhcmFtcyAtIHRhYmxlYXUgZGUgY2xlZi92YWxldXIgb3Ugc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNvZGUgLSB0cnVlfGZhbHNlLCBmYWxzZSBwYXIgZGVmYXV0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBHcC5VdGlscy5IZWxwZXIubm9ybWFseXplVXJsICh1cmwsIHtcbiAgICAgKiAgICAgICAgIGtleTE6dmFsdWUxLFxuICAgICAqICAgICAgICAga2V5Mj06dmFsdWUyLFxuICAgICAqICAgICAgICAga2V5Mzp2YWx1ZTNcbiAgICAgKiAgfSk7XG4gICAgICogIC8vIG91dCA6IFwidXJsP2tleTE9dmFsdWUxJmtleTI9dmFsdWUyJmtleTM9dmFsdWUzXCJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIHVuZSB1cmwgbm9ybWFsaXPDqWVcbiAgICAgKi9cbiAgICBub3JtYWx5emVVcmwgOiBmdW5jdGlvbiAodXJsLCBwYXJhbXMsIGVuY29kZSkge1xuICAgICAgICB2YXIgbXlVcmwgPSB1cmw7XG5cbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgdmFyIGsgPSB1cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgICAgICBpZiAoayA9PT0gLTEpIHsgLy8gcGFzIGRlID8gZXQgS1ZQXG4gICAgICAgICAgICAgICAgbXlVcmwgKz0gXCI/XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrICE9PSAtMSAmJiBrICE9PSB1cmwubGVuZ3RoIC0gMSkgeyAvLyBLVlBcbiAgICAgICAgICAgICAgICBteVVybCArPSBcIiZcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgbXlVcmwgKz0gcGFyYW1zO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBteVVybCArPSB0aGlzLm5vcm1hbHl6ZVBhcmFtZXRlcnMocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmNvZGUpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIGJvbm5lIGlkw6llID9cbiAgICAgICAgICAgIG15VXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KG15VXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBteVVybDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5kZW50YXRpb24gZCd1bmUgY2hhaW5lXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIGluZGVudFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbiAtIG5vbWJyZSBkZSB0YWJ1bGF0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIGNoYWluZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBHcC5VdGlscy5IZWxwZXIuaW5kZW50ICgyLCBcIm1lc3NhZ2Ugw6AgaW5kZW50ZXJcIilcbiAgICAgKiAvLyBvdXRcbiAgICAgKiAvLyAuLi4uLi4uLm1lc3NhZ2Ugw6AgaW5kZW50ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHJldG91cm5lIHVuZSBjaGFpbmUgaW5kZW50w6llXG4gICAgICovXG4gICAgaW5kZW50IDogZnVuY3Rpb24gKG4sIG1zZykge1xuICAgICAgICB2YXIgbnVtID0gbiB8fCAwO1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KG51bSArIDEpLmpvaW4oXCJcXHRcIikgKyBtc2c7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgSGVscGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Utils/Helper.js\n"); + +/***/ }), + +/***/ "./src/Utils/LoggerByDefault.js": +/*!**************************************!*\ + !*** ./src/Utils/LoggerByDefault.js ***! + \**************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! loglevel */ \"./node_modules/loglevel/lib/loglevel.js\");\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\n\nvar LoggerByDefault = {\n /**\n * logger statique\n *\n * @static\n * @param {String} name - nom du logger\n * @returns {Object} retourne un logger\n */\n getLogger: function getLogger(name) {\n // Substitute global constants configured at compile time\n // cf. webpack.config.js\n // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ?\n \"false\".match(/true/) ? loglevel__WEBPACK_IMPORTED_MODULE_0__[\"disableAll\"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__[\"enableAll\"]();\n var logname = name || \"default\";\n return loglevel__WEBPACK_IMPORTED_MODULE_0__[\"getLogger\"](logname);\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (LoggerByDefault);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9Mb2dnZXJCeURlZmF1bHQuanM/ODFmMyJdLCJuYW1lcyI6WyJMb2dnZXJCeURlZmF1bHQiLCJnZXRMb2dnZXIiLCJuYW1lIiwibWF0Y2giLCJMb2ciLCJsb2duYW1lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBZ0M7QUFFaEMsSUFBSUEsZUFBZSxHQUFHO0VBQ2xCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLFNBQVMsRUFBRyxTQUFBQSxVQUFVQyxJQUFJLEVBQUU7SUFDeEI7SUFDQTtJQUNBO0lBQ0MsZ0JBQWdCLENBQUNDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBSUMsbURBQWMsQ0FBQyxDQUFDLEdBQUdBLGtEQUFhLENBQUMsQ0FBQztJQUNyRSxJQUFJQyxPQUFPLEdBQUdILElBQUksSUFBSSxTQUFTO0lBQy9CLE9BQU9FLGtEQUFhLENBQUNDLE9BQU8sQ0FBQztFQUNqQztBQUNKLENBQUM7QUFFY0wsOEVBQWUiLCJmaWxlIjoiLi9zcmMvVXRpbHMvTG9nZ2VyQnlEZWZhdWx0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgTG9nIGZyb20gXCJsb2dsZXZlbFwiO1xuXG52YXIgTG9nZ2VyQnlEZWZhdWx0ID0ge1xuICAgIC8qKlxuICAgICAqIGxvZ2dlciBzdGF0aXF1ZVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gbm9tIGR1IGxvZ2dlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHJldG91cm5lIHVuIGxvZ2dlclxuICAgICAqL1xuICAgIGdldExvZ2dlciA6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIFN1YnN0aXR1dGUgZ2xvYmFsIGNvbnN0YW50cyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZVxuICAgICAgICAvLyBjZi4gd2VicGFjay5jb25maWcuanNcbiAgICAgICAgLy8gRklYTUUgaG93dG9kbyAhPyBEZWZpbmVXZWJwYWNrUGx1Z2luID8gRW52aXJvbm1lbnRXZWJwYWNrUGx1Z2luID9cbiAgICAgICAgKFwiX19QUk9EVUNUSU9OX19cIi5tYXRjaCgvdHJ1ZS8pKSA/IExvZy5kaXNhYmxlQWxsKCkgOiBMb2cuZW5hYmxlQWxsKCk7XG4gICAgICAgIHZhciBsb2duYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAgICAgcmV0dXJuIExvZy5nZXRMb2dnZXIobG9nbmFtZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nZ2VyQnlEZWZhdWx0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Utils/LoggerByDefault.js\n"); + +/***/ }), + +/***/ "./src/Utils/MessagesResources.js": +/*!****************************************!*\ + !*** ./src/Utils/MessagesResources.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée.\n *\n * @example\n * MessagesResources.getMessage(\"ERROR_PARAM_MISSING\", \"x\", \"y\", \"z\")));\n * // --> output : Parameter(s) 'x - y - z' missing\n *\n * @module MessagesResources\n * @alias Gp.Utils.MessagesResources\n * @private\n */\nvar MessagesResources = {\n // Paramètres\n PARAM_MISSING: \"Parameter(s) '%var%' missing\",\n PARAM_EMPTY: \"Parameter(s) '%var%' empty\",\n PARAM_TYPE: \"Wrong type(s) for parameter(s) '%var%'\",\n PARAM_FORMAT: \"Parameter(s) '%var%' not correctly formatted\",\n PARAM_NOT_SUPPORT: \"Value(s) for parameter(s) '%var%' not supported\",\n PARAM_NOT_SUPPORT_NODEJS: \"Value(s) for parameter(s) '%var%' not supported to NodeJS\",\n PARAM_UNKNOWN: \"Value(s) for parameter(s) '%var%' unknown\",\n // Services\n // Requête\n SERVICE_REQUEST_BUILD: \"An error occurred during the request building of the service\",\n SERVICE_REQUEST_EMPTY: \"The request sent to the service is empty\",\n // Réponse\n SERVICE_RESPONSE_EXCEPTION: \"The service returned an exception : '%var%'\",\n SERVICE_RESPONSE_EXCEPTION_2: \"The service returned an exception\",\n SERVICE_RESPONSE_ANALYSE: \"An error occurred while parsing the response '%var%' of the service\",\n SERVICE_RESPONSE_ANALYSE_2: \"An unknown error occurred while parsing the response\",\n SERVICE_RESPONSE_EMPTY: \"The response of the service is empty\",\n SERVICE_RESPONSE_EMPTY_2: \"The response from the service could not be analyzed or is empty\",\n SERVICE_RESPONSE_FORMAT: \"The format of the service response is not supported (handled format(s) : '%var%')\",\n SERVICE_RESPONSE_FORMAT_2: \"The format of the service response is not supported\",\n SERVICE_RESPONSE_FORMAT_3: \"No suggestion matching the search\",\n // Classes\n CLASS_CONSTRUCTOR: \"'%var%' constructor cannot be called as a function.\",\n /**\n * Fonction qui va retourner le message d'erreur associé à la clé donnée\n *\n * @method getMessage\n * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM)\n * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée\n * @return {String} message - String contenant le message de l'exception\n */\n getMessage: function getMessage(clef, parametres) {\n // param de la fonction uniquement pour la documentation...\n\n if (Object.keys(arguments).length === 0) {\n return \"Message indefined !\";\n }\n var params = Array.prototype.slice.call(arguments);\n var key = params.shift();\n var args = params;\n var message = this[key];\n try {\n if (Array.isArray(args) && args.length > 0) {\n message = message.replace(\"%var%\", args.join(\" - \"));\n } else {\n message = message.replace(\"%var%\", \"%var% (not specified)\");\n }\n } catch (e) {\n // error de string.replace()\n }\n return message;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (MessagesResources);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC8uL3NyYy9VdGlscy9NZXNzYWdlc1Jlc291cmNlcy5qcz9lYWY1Il0sIm5hbWVzIjpbIk1lc3NhZ2VzUmVzb3VyY2VzIiwiUEFSQU1fTUlTU0lORyIsIlBBUkFNX0VNUFRZIiwiUEFSQU1fVFlQRSIsIlBBUkFNX0ZPUk1BVCIsIlBBUkFNX05PVF9TVVBQT1JUIiwiUEFSQU1fTk9UX1NVUFBPUlRfTk9ERUpTIiwiUEFSQU1fVU5LTk9XTiIsIlNFUlZJQ0VfUkVRVUVTVF9CVUlMRCIsIlNFUlZJQ0VfUkVRVUVTVF9FTVBUWSIsIlNFUlZJQ0VfUkVTUE9OU0VfRVhDRVBUSU9OIiwiU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT05fMiIsIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRSIsIlNFUlZJQ0VfUkVTUE9OU0VfQU5BTFlTRV8yIiwiU0VSVklDRV9SRVNQT05TRV9FTVBUWSIsIlNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlfMiIsIlNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUIiwiU0VSVklDRV9SRVNQT05TRV9GT1JNQVRfMiIsIlNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzMiLCJDTEFTU19DT05TVFJVQ1RPUiIsImdldE1lc3NhZ2UiLCJjbGVmIiwicGFyYW1ldHJlcyIsIk9iamVjdCIsImtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJwYXJhbXMiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImtleSIsInNoaWZ0IiwiYXJncyIsIm1lc3NhZ2UiLCJpc0FycmF5IiwicmVwbGFjZSIsImpvaW4iLCJlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxpQkFBaUIsR0FBRztFQUVwQjtFQUNBQyxhQUFhLEVBQUcsOEJBQThCO0VBQzlDQyxXQUFXLEVBQUcsNEJBQTRCO0VBQzFDQyxVQUFVLEVBQUcsd0NBQXdDO0VBQ3JEQyxZQUFZLEVBQUcsOENBQThDO0VBQzdEQyxpQkFBaUIsRUFBRyxpREFBaUQ7RUFDckVDLHdCQUF3QixFQUFHLDJEQUEyRDtFQUN0RkMsYUFBYSxFQUFHLDJDQUEyQztFQUUzRDtFQUNBO0VBQ0FDLHFCQUFxQixFQUFHLDhEQUE4RDtFQUN0RkMscUJBQXFCLEVBQUcsMENBQTBDO0VBRWxFO0VBQ0FDLDBCQUEwQixFQUFHLDZDQUE2QztFQUMxRUMsNEJBQTRCLEVBQUcsbUNBQW1DO0VBQ2xFQyx3QkFBd0IsRUFBRyxxRUFBcUU7RUFDaEdDLDBCQUEwQixFQUFHLHNEQUFzRDtFQUNuRkMsc0JBQXNCLEVBQUcsc0NBQXNDO0VBQy9EQyx3QkFBd0IsRUFBRyxpRUFBaUU7RUFDNUZDLHVCQUF1QixFQUFHLG1GQUFtRjtFQUM3R0MseUJBQXlCLEVBQUcscURBQXFEO0VBQ2pGQyx5QkFBeUIsRUFBRyxtQ0FBbUM7RUFFL0Q7RUFDQUMsaUJBQWlCLEVBQUcscURBQXFEO0VBRXpFO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUMsVUFBVSxFQUFHLFNBQUFBLFdBQVVDLElBQUksRUFBRUMsVUFBVSxFQUFFO0lBQ3JDOztJQUVBLElBQUlDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNyQyxPQUFPLHFCQUFxQjtJQUNoQztJQUVBLElBQUlDLE1BQU0sR0FBR0MsS0FBSyxDQUFDQyxTQUFTLENBQUNDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTixTQUFTLENBQUM7SUFDbEQsSUFBSU8sR0FBRyxHQUFHTCxNQUFNLENBQUNNLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLElBQUlDLElBQUksR0FBR1AsTUFBTTtJQUVqQixJQUFJUSxPQUFPLEdBQUcsSUFBSSxDQUFDSCxHQUFHLENBQUM7SUFFdkIsSUFBSTtNQUNBLElBQUlKLEtBQUssQ0FBQ1EsT0FBTyxDQUFDRixJQUFJLENBQUMsSUFBSUEsSUFBSSxDQUFDUixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3hDUyxPQUFPLEdBQUdBLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sRUFBRUgsSUFBSSxDQUFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7TUFDeEQsQ0FBQyxNQUFNO1FBQ0hILE9BQU8sR0FBR0EsT0FBTyxDQUFDRSxPQUFPLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDO01BQy9EO0lBQ0osQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtNQUNSO0lBQUE7SUFJSixPQUFPSixPQUFPO0VBQ2xCO0FBQ0osQ0FBQztBQUVjbkMsZ0ZBQWlCIiwiZmlsZSI6Ii4vc3JjL1V0aWxzL01lc3NhZ2VzUmVzb3VyY2VzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGFzc2UgZGUgZ2VzdGlvbiBkZXMgZXJyZXVycyBxdWkgcGVybWVyIGQnYXNzb2NpZXIgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBsJ2V4Y2VwdGlvbiBsYW5jw6llLlxuICpcbiAqIEBleGFtcGxlXG4gKiBNZXNzYWdlc1Jlc291cmNlcy5nZXRNZXNzYWdlKFwiRVJST1JfUEFSQU1fTUlTU0lOR1wiLCBcInhcIiwgXCJ5XCIsIFwielwiKSkpO1xuICogLy8gLS0+IG91dHB1dCA6IFBhcmFtZXRlcihzKSAneCAtIHkgLSB6JyBtaXNzaW5nXG4gKlxuICogQG1vZHVsZSBNZXNzYWdlc1Jlc291cmNlc1xuICogQGFsaWFzIEdwLlV0aWxzLk1lc3NhZ2VzUmVzb3VyY2VzXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgTWVzc2FnZXNSZXNvdXJjZXMgPSB7XG5cbiAgICAvLyBQYXJhbcOodHJlc1xuICAgIFBBUkFNX01JU1NJTkcgOiBcIlBhcmFtZXRlcihzKSAnJXZhciUnIG1pc3NpbmdcIixcbiAgICBQQVJBTV9FTVBUWSA6IFwiUGFyYW1ldGVyKHMpICcldmFyJScgZW1wdHlcIixcbiAgICBQQVJBTV9UWVBFIDogXCJXcm9uZyB0eXBlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJ1wiLFxuICAgIFBBUkFNX0ZPUk1BVCA6IFwiUGFyYW1ldGVyKHMpICcldmFyJScgbm90IGNvcnJlY3RseSBmb3JtYXR0ZWRcIixcbiAgICBQQVJBTV9OT1RfU1VQUE9SVCA6IFwiVmFsdWUocykgZm9yIHBhcmFtZXRlcihzKSAnJXZhciUnIG5vdCBzdXBwb3J0ZWRcIixcbiAgICBQQVJBTV9OT1RfU1VQUE9SVF9OT0RFSlMgOiBcIlZhbHVlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJyBub3Qgc3VwcG9ydGVkIHRvIE5vZGVKU1wiLFxuICAgIFBBUkFNX1VOS05PV04gOiBcIlZhbHVlKHMpIGZvciBwYXJhbWV0ZXIocykgJyV2YXIlJyB1bmtub3duXCIsXG5cbiAgICAvLyBTZXJ2aWNlc1xuICAgIC8vIFJlcXXDqnRlXG4gICAgU0VSVklDRV9SRVFVRVNUX0JVSUxEIDogXCJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHJlcXVlc3QgYnVpbGRpbmcgb2YgdGhlIHNlcnZpY2VcIixcbiAgICBTRVJWSUNFX1JFUVVFU1RfRU1QVFkgOiBcIlRoZSByZXF1ZXN0IHNlbnQgdG8gdGhlIHNlcnZpY2UgaXMgZW1wdHlcIixcblxuICAgIC8vIFLDqXBvbnNlXG4gICAgU0VSVklDRV9SRVNQT05TRV9FWENFUFRJT04gOiBcIlRoZSBzZXJ2aWNlIHJldHVybmVkIGFuIGV4Y2VwdGlvbiA6ICcldmFyJSdcIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0VYQ0VQVElPTl8yIDogXCJUaGUgc2VydmljZSByZXR1cm5lZCBhbiBleGNlcHRpb25cIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0UgOiBcIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgdGhlIHJlc3BvbnNlICcldmFyJScgb2YgdGhlIHNlcnZpY2VcIixcbiAgICBTRVJWSUNFX1JFU1BPTlNFX0FOQUxZU0VfMiA6IFwiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSByZXNwb25zZVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRU1QVFkgOiBcIlRoZSByZXNwb25zZSBvZiB0aGUgc2VydmljZSBpcyBlbXB0eVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRU1QVFlfMiA6IFwiVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UgY291bGQgbm90IGJlIGFuYWx5emVkIG9yIGlzIGVtcHR5XCIsXG4gICAgU0VSVklDRV9SRVNQT05TRV9GT1JNQVQgOiBcIlRoZSBmb3JtYXQgb2YgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgbm90IHN1cHBvcnRlZCAoaGFuZGxlZCBmb3JtYXQocykgOiAnJXZhciUnKVwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzIgOiBcIlRoZSBmb3JtYXQgb2YgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgbm90IHN1cHBvcnRlZFwiLFxuICAgIFNFUlZJQ0VfUkVTUE9OU0VfRk9STUFUXzMgOiBcIk5vIHN1Z2dlc3Rpb24gbWF0Y2hpbmcgdGhlIHNlYXJjaFwiLFxuXG4gICAgLy8gQ2xhc3Nlc1xuICAgIENMQVNTX0NPTlNUUlVDVE9SIDogXCInJXZhciUnIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIixcblxuICAgIC8qKlxuICAgICAqIEZvbmN0aW9uIHF1aSB2YSByZXRvdXJuZXIgbGUgbWVzc2FnZSBkJ2VycmV1ciBhc3NvY2nDqSDDoCBsYSBjbMOpIGRvbm7DqWVcbiAgICAgKlxuICAgICAqIEBtZXRob2QgZ2V0TWVzc2FnZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGVmIC0gQ2xlZiBkZSBsJ2VycmV1ciAoZXggOiBFUlJPUl9QQVJBTSlcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXJhbWV0cmVzIC0gUGFyYW3DqHRyZXMvdmFyaWFibGVzIGNvbmNlcm7DqXMgcGFyIGxlIG1lc3NhZ2UgZCdlcnJldXIgYXNzb2Npw6kgw6AgbGEgY2xlZiBkb25uw6llXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBtZXNzYWdlIC0gU3RyaW5nIGNvbnRlbmFudCBsZSBtZXNzYWdlIGRlIGwnZXhjZXB0aW9uXG4gICAgICovXG4gICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChjbGVmLCBwYXJhbWV0cmVzKSB7XG4gICAgICAgIC8vIHBhcmFtIGRlIGxhIGZvbmN0aW9uIHVuaXF1ZW1lbnQgcG91ciBsYSBkb2N1bWVudGF0aW9uLi4uXG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFyZ3VtZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJNZXNzYWdlIGluZGVmaW5lZCAhXCI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIGtleSA9IHBhcmFtcy5zaGlmdCgpO1xuICAgICAgICB2YXIgYXJncyA9IHBhcmFtcztcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXNba2V5XTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShcIiV2YXIlXCIsIGFyZ3Muam9pbihcIiAtIFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoXCIldmFyJVwiLCBcIiV2YXIlIChub3Qgc3BlY2lmaWVkKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gZXJyb3IgZGUgc3RyaW5nLnJlcGxhY2UoKVxuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlc1Jlc291cmNlcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Utils/MessagesResources.js\n"); + +/***/ }), + +/***/ 0: +/*!**********************!*\ + !*** multi ./src/Gp ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! /var/www/geoportail/geoportal-access-lib/src/Gp */"./src/Gp.js"); + + +/***/ }), + +/***/ "node-fetch": +/*!***********************************************************************************!*\ + !*** external {"commonjs2":"node-fetch","commonjs":"node-fetch","amd":"require"} ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = __WEBPACK_EXTERNAL_MODULE_node_fetch__;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcIm5vZGUtZmV0Y2hcIixcImNvbW1vbmpzXCI6XCJub2RlLWZldGNoXCIsXCJhbWRcIjpcInJlcXVpcmVcIn0/YWJiZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJub2RlLWZldGNoLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX25vZGVfZmV0Y2hfXzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///node-fetch\n"); + +/***/ }), + +/***/ "xmldom": +/*!***************************************************************************!*\ + !*** external {"commonjs2":"xmldom","commonjs":"xmldom","amd":"require"} ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = __WEBPACK_EXTERNAL_MODULE_xmldom__;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcC9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInhtbGRvbVwiLFwiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiYW1kXCI6XCJyZXF1aXJlXCJ9P2E2YmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoieG1sZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3htbGRvbV9fOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///xmldom\n"); + +/***/ }) + +/******/ })["default"]; +}); \ No newline at end of file diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js new file mode 100644 index 00000000..e9e8bd81 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices-src.js @@ -0,0 +1,10814 @@ +/*! + * @brief Geoportal resources access library + * + * 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 3.4.0-beta2 + * @date 27/10/2023 + * + */ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.4 + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("node-fetch"), require("xmldom")); + else if(typeof define === 'function' && define.amd) + define("Gp", ["require", "require"], factory); + else if(typeof exports === 'object') + exports["Gp"] = factory(require("node-fetch"), require("xmldom")); + else + root["Gp"] = factory(root[undefined], root[undefined]); +})(this, function(__WEBPACK_EXTERNAL_MODULE__14__, __WEBPACK_EXTERNAL_MODULE__15__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(1); + + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesVersion", function() { return servicesVersion; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "servicesDate", function() { return servicesDate; }); +/* harmony import */ var _Services_Services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); +/* harmony import */ var _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(32); +/* harmony import */ var _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33); +/* harmony import */ var _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(46); +/* harmony import */ var _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(47); +/* harmony import */ var _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(59); +/* harmony import */ var _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(53); +/* harmony import */ var _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(54); +/* harmony import */ var _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(3); +/* harmony import */ var _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(10); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(17); +/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(8); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(18); +var _package_json__WEBPACK_IMPORTED_MODULE_13___namespace = /*#__PURE__*/__webpack_require__.t(18, 1); +/** +* Global variable Gp. +* +* @module Gp +* @alias Gp +* @description +* +* This is the global variable that is exposed in the browser environment. +* Content is composed of constructor, functions and properties... +* +* > {@link Gp.Error Error()} +* - .TYPE_SRVERR : "SERVICE_ERROR" +* - .TYPE_UNKERR : "UNKNOWN_ERROR" +* - .TYPE_USEERR : "USAGE_ERROR" +* +* > {@link module:Helper Helper} +* - .indent() +* - .normalyzeParameters() +* - .normalyzeUrl() +* +* > {@link module:XHR Protocols.XHR} +* - .call() +* +* > {@link module:Services Services (objects)} +* - .Alti +* - {@link Gp.Services.Alti.Elevation .Elevation()} +* - {@link Gp.Services.AltiResponse .AltiResponse()} +* - .AutoComplete +* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()} +* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()} +* - {@link Gp.Services.Config .Config()} +* - {@link Gp.Services.DefaultUrl .DefaultUrl()} +* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()} +* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()} +* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()} +* - .Route +* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()} +* - {@link Gp.Services.RouteResponse .RouteResponse()} +* +* > Services (factory) +* - {@link module:Services~autoComplete .autoComplete()} +* - {@link module:Services~geocode .geocode()} +* - {@link module:Services~getAltitude .getAltitude()} +* - {@link module:Services~getConfig .getConfig()} +* - {@link module:Services~isoCurve .isoCurve()} +* - {@link module:Services~reverseGeocode .reverseGeocode()} +* - {@link module:Services~route .route()} +* +* > servicesDate : "YYYY-MM-DD" +* +* > servicesVersion : "X.X.X" +* +*/ + + + + + + + + + + + + + + + + +/** Version */ +var servicesVersion = _package_json__WEBPACK_IMPORTED_MODULE_13__.version; +/** Publication date */ +var servicesDate = _package_json__WEBPACK_IMPORTED_MODULE_13__.date; + +// on declare les ns dans root global +var Gp = {}; +Gp.servicesVersion = servicesVersion; +Gp.servicesDate = servicesDate; + +// Export Protocols +Gp.Protocols = {}; +Gp.Protocols.XHR = _Protocols_XHR__WEBPACK_IMPORTED_MODULE_10__["default"]; +// Export services +Gp.Services = _Services_Services__WEBPACK_IMPORTED_MODULE_0__["default"]; +// Export DefaultUrls +Gp.Services.DefaultUrl = _Services_DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"]; +// Export Alti +Gp.Services.AltiResponse = _Services_Alti_Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_2__["default"]; +Gp.Services.Alti = {}; +Gp.Services.Alti.Elevation = _Services_Alti_Response_model_Elevation__WEBPACK_IMPORTED_MODULE_3__["default"]; +// Export Autocomplete +Gp.Services.AutoCompleteResponse = _Services_AutoComplete_Response_model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_4__["default"]; +Gp.Services.AutoComplete = {}; +Gp.Services.AutoComplete.SuggestedLocation = _Services_AutoComplete_Response_model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_5__["default"]; +// Export Config +Gp.Services.Config = _Services_Config_Config__WEBPACK_IMPORTED_MODULE_9__["default"]; +// Export IsoCurve +Gp.Services.IsoCurveResponse = _Services_ProcessIsoCurve_Response_model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_6__["default"]; +// Export Route +Gp.Services.RouteResponse = _Services_Route_Response_model_RouteResponse__WEBPACK_IMPORTED_MODULE_7__["default"]; +Gp.Services.Route = {}; +Gp.Services.Route.RouteInstruction = _Services_Route_Response_model_RouteInstruction__WEBPACK_IMPORTED_MODULE_8__["default"]; +// Export Erreurs et Outils +Gp.Error = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_11__["default"]; +Gp.Helper = _Utils_Helper__WEBPACK_IMPORTED_MODULE_12__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Gp); + +/***/ }), +/* 2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Config_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21); +/* harmony import */ var _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(35); +/* harmony import */ var _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); +/* harmony import */ var _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(44); +/* harmony import */ var _Route_Route__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(48); +/* harmony import */ var _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55); +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "point|circle|bbox" }] */ + +/** +* Geoportal web services invocation namespace. +* +* @module Services +* @alias Gp.Services +*/ + + + + + + + +var Services = { + /** + * Access to Geoportal resources metadata availables with one ore several keys + * + * @method getConfig + * @param {Object} options - Options for function call. + * @param {String} [options.apiKey] - Access key(s) ("," as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web} + * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if "rawResponse" parameter is set to true : a String will be returned. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + */ + getConfig: function getConfig(options) { + var configService = new _Config_Config__WEBPACK_IMPORTED_MODULE_0__["default"](options); + configService.call(); + }, + /** + * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
+ * Two use cases are availables :
+ * 1. getting elevations of the given points : don't use the options.sampling parameter ;
+ * 2. getting a regular set of elevations along the given points : use the options.sampling parameter. + * + * @method getAltitude + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter. + * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
+ * If not used, only elevations of these positions will be returned. + * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing. + * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing. + */ + getAltitude: function getAltitude(options) { + var altiService = new _Alti_Alti__WEBPACK_IMPORTED_MODULE_1__["default"](options); + altiService.call(); + }, + /** + * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}. + * + * @example + * Gp.Services.geocode ({ + * apiKey : "carte", + * location : "73 avenue de Paris, Saint-Mandé", + * // traitement des resultats + * onSuccess : function (result) { + * console.log("found (x:"+result.position.x+", y:"+result.position.y+")") ; + * } + * }) ; + * + * + * @method geocode + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". + * @param {String} options.query - Geographic identifier to locate. + * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. + * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". + *

+ * Properties availables for address search :
+ * "postalCode", "inseeCode" and "city". + *

+ * Properties availables for place names search :
+ * "postalCode", "inseeCode" and "type". + *

+ * Properties availables for cadastral parcels search :
+ * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. + * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + geocode: function geocode(options) { + var geocodeService = new _Geocode_Geocode__WEBPACK_IMPORTED_MODULE_2__["default"](options); + geocodeService.call(); + }, + /** + * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}. + * + * @method reverseGeocode + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". + * @param {Object} options.position - Reference position where to search geographical identifiers. + * @param {Float} options.position.lon - Longitude + * @param {Float} options.position.lat - Latitude + * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. + * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". + *

+ * Properties availables for address search :
+ * "postalCode", "inseeCode" and "city". + *

+ * Properties availables for place names search :
+ * "postalCode", "inseeCode" and "type". + *

+ * Properties availables for cadastral parcels search :
+ * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * @param {Object} [options.searchGeometry] - Location where to perform the search. + * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon) + * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates + * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle') + * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + reverseGeocode: function reverseGeocode(options) { + var reverseGeocodeService = new _Geocode_ReverseGeocode__WEBPACK_IMPORTED_MODULE_3__["default"](options); + reverseGeocodeService.call(); + }, + /** + * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html} + * + * @method autoComplete + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} options.text - Text input to complete. + * @param {Array.} [options.filterOptions.type = "StreetAddress"] - Suggestion types to provide : address ("StreetAddress") and/or place name ("PositionOfInterest"). + * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : "METROPOLE" (Corsica and metropolitan France), "DOMTOM" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31'] + * @param {Number} [options.maximumResponses = 10] - Maximum number of responses. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + autoComplete: function autoComplete(options) { + var autoCompleteService = new _AutoComplete_AutoComplete__WEBPACK_IMPORTED_MODULE_4__["default"](options); + autoCompleteService.call(); + }, + /** + * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}. + * + * @method route + * @param {Object} options - Options for function call. + * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.routePreference = "fastest"] - Indicates the way to compute the route : "fastest" (time optimisation) or "shortest" (distance optimisation). Available values are in the GetCapabilities. + * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {String} [options.graph = "Voiture"] - User profile to use to compute the route : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities. + * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). + * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions. + * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response. + * @param {String} [options.distanceUnit = "m"] - The unit used to provide distances in the response ("meter" or "kilometer"). + * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). + * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities. + * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + route: function route(options) { + var routeService = new _Route_Route__WEBPACK_IMPORTED_MODULE_5__["default"](options); + routeService.call(); + }, + /** + * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}. + * + * @method isoCurve + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. + * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude). + * @param {String} [options.graph = "Voiture"] - User profile to use to compute the isoCurve : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities. + * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). + * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. + * @param {String} [options.method = "time"] - Computing method to use : "time" (using a duration as a constraint) or "distance" (using a distance as a constraint). Available values are in the GetCapabilities. + * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to "time". + * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to "distance". + * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing. + * @param {String} [options.distanceUnit = "km"] - The unit used to provide distances in the response ("m" or "km"). + * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). + * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed. + * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.outputFormat='json'] - Output format ("json") to use for underlying webService. Only use if you know what you are doing. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + isoCurve: function isoCurve(options) { + var processIsoCurveService = new _ProcessIsoCurve_ProcessIsoCurve__WEBPACK_IMPORTED_MODULE_6__["default"](options); + processIsoCurveService.call(); + } +}; + +/** + * Point object. + * + * @namespace + * @alias Gp.Point + * + * @property {Float} x - Point abscissa + * @property {Float} y - Point ordinate + */ +var point = {}; + +/** + * Circle object. + * + * @namespace + * @alias Gp.Circle + * + * @property {Float} x - Circle center abscissa. + * @property {Float} y - Circle center ordinate. + * @property {Float} radius - Circle radius. + */ +var circle = {}; + +/** + * Bounding box object, expressed with four coordinates. + * + * @namespace + * @alias Gp.BBox + * + * @property {Float} left - minimum abscissa + * @property {Float} right - maximum abscissa + * @property {Float} bottom - minimum ordinate + * @property {Float} top - maximum ordinate + */ +var bbox = {}; +/* harmony default export */ __webpack_exports__["default"] = (Services); + +/***/ }), +/* 3 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19); +/* harmony import */ var _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + + + + + + +/** + * @classdesc + * + * Recupération de la configuration de clés Géoportail sous forme de JSON + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Config + * @param {Object} options - options spécifiques au service (+ les options heritées) + * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule + * @param {Boolean} [options.sync=false] - force le mode synchrone + * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey. + * + * @example + * var options = { + * apiKey : "cartes,ortho", + * sync : false, + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * }; + * + */ +function Config(options) { + if (!(this instanceof Config)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Config")); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "Config"; + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Config"); + this.logger.trace("[Constructeur Config (options)]"); + + // ##################### + // analyse des options + // ##################### + + // gestion du callback onSuccess + var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); + if (!bOnSuccess) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "onSuccess()")); + } + if (!options.apiKey && !options.customConfigFile) { + // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config + options.apiKey = "full"; + } + this.options = {}; + this.options.onSuccess = options.onSuccess; + this.options.onFailure = options.onFailure; + + // mode sync + this.options.sync = options.sync || false; + + // gestion d'un tableau d'url des fichiers de configuration + this.options.listConfigUrls = options.customConfigFile ? [options.customConfigFile] : !Array.isArray(options.apiKey) ? _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__["default"].Config.url(options.apiKey.split(",")) : _DefaultUrlService__WEBPACK_IMPORTED_MODULE_3__["default"].Config.url(options.apiKey); +} + +/** + * @lends module:Config# + */ +Config.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_2__["default"].prototype, { + // todo + // getter/setter +}); + +/** + * Constructeur (alias) + */ +Config.prototype.constructor = Config; + +/** + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.buildRequest = function (error, success) { + // liste des urls des fichiers de configuration en JSON + this.listConfigUrls = this.options.listConfigUrls; + if (!this.listConfigUrls) { + error.call(this, new Error("url by default not found !")); + return; + } + + // INFO : + // il n'y a pas de construction de requête, + // on passe directement à l'appel des requêtes + success.call(this, this.listConfigUrls); +}; + +/** + * Récupération des configuration + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.callService = function (error, success) { + if (this.options.sync) { + __callServiceSync.call(this, error, success); + } else { + __callService.call(this, error, success); + } +}; + +/** + * Requêtes en mode asynchrone + * + * @param {*} error + * @param {*} success + * @private + */ +var __callService = function __callService(error, success) { + var _this = this; + // liste des resultats au format JSON + this.listConfigResults = []; + + // test on env. nodejs or browser + var Fetch = null; + if (typeof window === "undefined") { + var nodefetch = __webpack_require__(14); + Fetch = nodefetch; + } else { + Fetch = window.fetch; + } + + // the factory of fetch ! + var fetchFactory = function fetchFactory(url) { + return Fetch(url, { + credentials: "same-origin" + }).then(function (response) { + if (response.ok) { + return response.json().then(function (json) { + // TODO : + // tester le contenu ! + return json; + })["catch"](function (error) { + throw new Error("Exception Json : " + error); + }); + } else { + throw new Error("Exception HTTP : " + response.status + " (status code) !"); + } + })["catch"](function (error) { + return new Promise(function (resolve, reject) { + // eslint-disable-line no-unused-vars + reject(error); + }); + }); + }; + + // construction des promises fetch + var promises = []; + for (var index = 0; index < this.listConfigUrls.length; index++) { + var url = this.listConfigUrls[index]; + promises.push(fetchFactory(url)); + } + Promise.all(promises).then(function (results) { + if (!results) { + throw new Error("results config empty !?"); + } + results.forEach(function (result) { + // TODO : + // verification des resultats + _this.listConfigResults.push(result); + }); + }).then(function () { + success.call(_this, _this.listConfigResults); + })["catch"](function (e) { + // TODO : + // construction d'un message + error.call(_this, e); + }); +}; + +/** + * Requêtes en mode synchrone + * + * @param {*} error + * @param {*} success + * @private + */ +var __callServiceSync = function __callServiceSync(error, success) { + // liste des resultats au format JSON + this.listConfigResults = []; + + // FIXME : + // boucle synchrone ! + for (var i = 0; i < this.listConfigUrls.length; i++) { + var url = this.listConfigUrls[i]; + // TODO : + // prévoir le CORS, headers, ... + var request = new XMLHttpRequest(); + request.open("GET", url, false); + request.send(null); + if (request.status === 200) { + // TODO : + // tester la reponse ! + var response = JSON.parse(request.responseText); + this.listConfigResults.push(response); + } + } + // callback + if (this.listConfigResults.length !== 0) { + success.call(this, this.listConfigResults); + } else { + error.call(this, new Error("...")); + } +}; + +/** + * Analyse et mise en forme de la réponse en fusionnant les configurations + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.analyzeResponse = function (error, success) { + // fonction de merge des objects JSON + var mergeConfig = function mergeConfig(objects) { + // objet fusion des couches + var allLayersConfig = {}; + // objet fusion des clés + var allKeysConfig = {}; + // objet fusion des TMS + var allTMSConfig = {}; + + // on fusionne les résultat + for (var i = 0; i < objects.length; i++) { + if (!objects[i].generalOptions || !objects[i].layers) { + return; + } + allKeysConfig = _objectSpread(_objectSpread({}, allKeysConfig), objects[i].generalOptions.apiKeys); + allLayersConfig = _objectSpread(_objectSpread({}, allLayersConfig), objects[i].layers); + allTMSConfig = _objectSpread(_objectSpread({}, allTMSConfig), objects[i].tileMatrixSets); + } + var mergedConfig = { + generalOptions: { + apiKeys: allKeysConfig + }, + layers: allLayersConfig, + tileMatrixSets: allTMSConfig + }; + return mergedConfig; + }; + + // fusion des configurations JSON + var ConfigJSON = mergeConfig(this.listConfigResults); + if (!ConfigJSON) { + error.call(this, new Error("configuration structure not conforme !")); + return; + } + + // creation des interfaces + var IConfig = new _ConfigInterface__WEBPACK_IMPORTED_MODULE_4__["default"](); + // ajout des interfaces avec la configuration JSON + Object.assign(IConfig, ConfigJSON); + + // définition de la variable globale Gp.Config + var scope = typeof window !== "undefined" ? window : {}; + if (!scope.Gp) { + scope.Gp = {}; + } + + // enregistrement + if (scope.Gp.Config) { + Object.assign(scope.Gp.Config, IConfig); + // dans le doute..., ceinture et bretelles ! + for (var property in IConfig) { + scope.Gp.Config[property] = IConfig[property]; + } + } else { + scope.Gp.Config = IConfig; + } + + // INFO : + // il n'y a pas d'analyse des résultats, + // on passe directement à l'appel de la callback utilisateur + success.call(this, scope.Gp.Config); +}; +/* harmony default export */ __webpack_exports__["default"] = (Config); + +/***/ }), +/* 4 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); +/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__); + +var LoggerByDefault = { + /** + * logger statique + * + * @static + * @param {String} name - nom du logger + * @returns {Object} retourne un logger + */ + getLogger: function getLogger(name) { + // Substitute global constants configured at compile time + // cf. webpack.config.js + // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ? + "false".match(/true/) ? loglevel__WEBPACK_IMPORTED_MODULE_0__["disableAll"]() : loglevel__WEBPACK_IMPORTED_MODULE_0__["enableAll"](); + var logname = name || "default"; + return loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](logname); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (LoggerByDefault); + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* +* loglevel - https://github.com/pimterry/loglevel +* +* Copyright (c) 2013 Tim Perry +* Licensed under the MIT license. +*/ +(function (root, definition) { + "use strict"; + if (true) { + !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : + __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} +}(this, function () { + "use strict"; + + // Slightly dubious tricks to cut down minimized file size + var noop = function() {}; + var undefinedType = "undefined"; + var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && ( + /Trident\/|MSIE /.test(window.navigator.userAgent) + ); + + var logMethods = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + + // Cross-browser bind equivalent that works at least back to IE6 + function bindMethod(obj, methodName) { + var method = obj[methodName]; + if (typeof method.bind === 'function') { + return method.bind(obj); + } else { + try { + return Function.prototype.bind.call(method, obj); + } catch (e) { + // Missing bind shim or IE8 + Modernizr, fallback to wrapping + return function() { + return Function.prototype.apply.apply(method, [obj, arguments]); + }; + } + } + } + + // Trace() doesn't print the message in IE, so for that case we need to wrap it + function traceForIE() { + if (console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + // In old IE, native console methods themselves don't have apply(). + Function.prototype.apply.apply(console.log, [console, arguments]); + } + } + if (console.trace) console.trace(); + } + + // Build the best logging method possible for this env + // Wherever possible we want to bind, not wrap, to preserve stack traces + function realMethod(methodName) { + if (methodName === 'debug') { + methodName = 'log'; + } + + if (typeof console === undefinedType) { + return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives + } else if (methodName === 'trace' && isIE) { + return traceForIE; + } else if (console[methodName] !== undefined) { + return bindMethod(console, methodName); + } else if (console.log !== undefined) { + return bindMethod(console, 'log'); + } else { + return noop; + } + } + + // These private functions always need `this` to be set properly + + function replaceLoggingMethods(level, loggerName) { + /*jshint validthis:true */ + for (var i = 0; i < logMethods.length; i++) { + var methodName = logMethods[i]; + this[methodName] = (i < level) ? + noop : + this.methodFactory(methodName, level, loggerName); + } + + // Define log.log as an alias for log.debug + this.log = this.debug; + } + + // In old IE versions, the console isn't present until you first open it. + // We build realMethod() replacements here that regenerate logging methods + function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { + return function () { + if (typeof console !== undefinedType) { + replaceLoggingMethods.call(this, level, loggerName); + this[methodName].apply(this, arguments); + } + }; + } + + // By default, we use closely bound real methods wherever possible, and + // otherwise we wait for a console to appear, and then try again. + function defaultMethodFactory(methodName, level, loggerName) { + /*jshint validthis:true */ + return realMethod(methodName) || + enableLoggingWhenConsoleArrives.apply(this, arguments); + } + + function Logger(name, defaultLevel, factory) { + var self = this; + var currentLevel; + defaultLevel = defaultLevel == null ? "WARN" : defaultLevel; + + var storageKey = "loglevel"; + if (typeof name === "string") { + storageKey += ":" + name; + } else if (typeof name === "symbol") { + storageKey = undefined; + } + + function persistLevelIfPossible(levelNum) { + var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); + + if (typeof window === undefinedType || !storageKey) return; + + // Use localStorage if available + try { + window.localStorage[storageKey] = levelName; + return; + } catch (ignore) {} + + // Use session cookie as fallback + try { + window.document.cookie = + encodeURIComponent(storageKey) + "=" + levelName + ";"; + } catch (ignore) {} + } + + function getPersistedLevel() { + var storedLevel; + + if (typeof window === undefinedType || !storageKey) return; + + try { + storedLevel = window.localStorage[storageKey]; + } catch (ignore) {} + + // Fallback to cookies if local storage gives us nothing + if (typeof storedLevel === undefinedType) { + try { + var cookie = window.document.cookie; + var location = cookie.indexOf( + encodeURIComponent(storageKey) + "="); + if (location !== -1) { + storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; + } + } catch (ignore) {} + } + + // If the stored level is not valid, treat it as if nothing was stored. + if (self.levels[storedLevel] === undefined) { + storedLevel = undefined; + } + + return storedLevel; + } + + function clearPersistedLevel() { + if (typeof window === undefinedType || !storageKey) return; + + // Use localStorage if available + try { + window.localStorage.removeItem(storageKey); + return; + } catch (ignore) {} + + // Use session cookie as fallback + try { + window.document.cookie = + encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } catch (ignore) {} + } + + /* + * + * Public logger API - see https://github.com/pimterry/loglevel for details + * + */ + + self.name = name; + + self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, + "ERROR": 4, "SILENT": 5}; + + self.methodFactory = factory || defaultMethodFactory; + + self.getLevel = function () { + return currentLevel; + }; + + self.setLevel = function (level, persist) { + if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { + level = self.levels[level.toUpperCase()]; + } + if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { + currentLevel = level; + if (persist !== false) { // defaults to true + persistLevelIfPossible(level); + } + replaceLoggingMethods.call(self, level, name); + if (typeof console === undefinedType && level < self.levels.SILENT) { + return "No console available for logging"; + } + } else { + throw "log.setLevel() called with invalid level: " + level; + } + }; + + self.setDefaultLevel = function (level) { + defaultLevel = level; + if (!getPersistedLevel()) { + self.setLevel(level, false); + } + }; + + self.resetLevel = function () { + self.setLevel(defaultLevel, false); + clearPersistedLevel(); + }; + + self.enableAll = function(persist) { + self.setLevel(self.levels.TRACE, persist); + }; + + self.disableAll = function(persist) { + self.setLevel(self.levels.SILENT, persist); + }; + + // Initialize with the right level + var initialLevel = getPersistedLevel(); + if (initialLevel == null) { + initialLevel = defaultLevel; + } + self.setLevel(initialLevel, false); + } + + /* + * + * Top-level API + * + */ + + var defaultLogger = new Logger(); + + var _loggersByName = {}; + defaultLogger.getLogger = function getLogger(name) { + if ((typeof name !== "symbol" && typeof name !== "string") || name === "") { + throw new TypeError("You must supply a name when creating a logger."); + } + + var logger = _loggersByName[name]; + if (!logger) { + logger = _loggersByName[name] = new Logger( + name, defaultLogger.getLevel(), defaultLogger.methodFactory); + } + return logger; + }; + + // Grab the current global log variable in case of overwrite + var _log = (typeof window !== undefinedType) ? window.log : undefined; + defaultLogger.noConflict = function() { + if (typeof window !== undefinedType && + window.log === defaultLogger) { + window.log = _log; + } + + return defaultLogger; + }; + + defaultLogger.getLoggers = function getLoggers() { + return _loggersByName; + }; + + // ES6 default export, for compatibility + defaultLogger['default'] = defaultLogger; + + return defaultLogger; +})); + + +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée. + * + * @example + * MessagesResources.getMessage("ERROR_PARAM_MISSING", "x", "y", "z"))); + * // --> output : Parameter(s) 'x - y - z' missing + * + * @module MessagesResources + * @alias Gp.Utils.MessagesResources + * @private + */ +var MessagesResources = { + // Paramètres + 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_NOT_SUPPORT_NODEJS: "Value(s) for parameter(s) '%var%' not supported to NodeJS", + PARAM_UNKNOWN: "Value(s) for parameter(s) '%var%' unknown", + // Services + // Requête + SERVICE_REQUEST_BUILD: "An error occurred during the request building of the service", + SERVICE_REQUEST_EMPTY: "The request sent to the service is empty", + // Réponse + 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", + // Classes + CLASS_CONSTRUCTOR: "'%var%' constructor cannot be called as a function.", + /** + * Fonction qui va retourner le message d'erreur associé à la clé donnée + * + * @method getMessage + * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM) + * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée + * @return {String} message - String contenant le message de l'exception + */ + getMessage: function getMessage(clef, parametres) { + // param de la fonction uniquement pour la documentation... + + if (Object.keys(arguments).length === 0) { + 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) { + // error de string.replace() + } + return message; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (MessagesResources); + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6); +/* harmony import */ var _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(18); +var _package_json__WEBPACK_IMPORTED_MODULE_5___namespace = /*#__PURE__*/__webpack_require__.t(18, 1); + + + + + +// import DefaultUrlService from "./DefaultUrlService"; +// package.json (extract version) + + +/** + * @classdesc + * Composant Service + * + * @constructor + * @alias Gp.Services.CommonService + * @param {Object} options - options communes à tous les services + * + * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut "https://wxs.ign.fr/calcul/geoportail/SERVICE/". + * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès. + * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré. + * + * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service : + * peut valoir 'JSONP' ou 'XHR'. + * Par défaut, c'est le protocole XHR qui sera utilisé. + * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR). + * + * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https. + * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS). + * Sur un navigateur, le protocole est automatiquement extrait de l'url du site... + * Par défaut, on utilise le protocole http (ssl=false). + * + * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR. + * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP. + * + * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP. + * Par défaut, la fonction de callback portera un nom du type "callback"+ID, où ID est soit un identifiant unique généré à chaque requête, + * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix="_2", la fonction sera "callback_2 ()". + * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu + * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'. + * + * @param {String} [options.httpMethod] - La méthode HTTP + * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'. + * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET. + * Par défaut, c'est la méthode GET qui est utilisée. + * + * @param {String} [options.contentType] - Content-Type de la requete + * à utiliser dans le cas d'une requête XHR en mode POST. + * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET. + * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type. + * + * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête). + * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0). + * + * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée. + * (Cf. paramètre « onSuccess » pour plus de détails). + * + * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête + * (code HTTP 200, sans message d'erreur). + * Cette fonction prend en paramètre la réponse du service, + * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ; + * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ». + * + * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement + * (code HTTP de retour différent de 200 ou pas de réponse). + * + * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse + * Permet de modifier la réponse avant parsing et la fonction doit retourner une String. + * Cette fonction prend en paramètre la réponse telle que renvoyée par le service + * (cad au format json ou xml). + * Pour le JSONP, si le paramètre "rawResponse" a été précisé avec la valeur "true", + * la fonction prend en paramètre un Object JavaScript contenant la réponse XML. + * + * @example + * var options = { + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * ssl : false, + * proxyURL : null, + * callbackName : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * onBeforeParse : function (rawResponse) {} + * }; + */ +function CommonService(options) { + if (!(this instanceof CommonService)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("CLASS_CONSTRUCTOR")); + } + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("CommonService"); + this.logger.trace("[Constructeur CommonService (options)]"); + + // ##################### + // récupération des options par défaut pour les paramètres optionnels + // ##################### + + /** + * Options du service + * @type {Object} + */ + this.options = { + // protocol : "JSONP", + protocol: "XHR", + ssl: true, + proxyURL: "", + // callbackName : "", + callbackSuffix: null, + httpMethod: "GET", + timeOut: 0, + rawResponse: false, + scope: this, + /** + * callback par defaut pour la reponse + * @param {Object} response - response + * @private + */ + onSuccess: function onSuccess(response) { + console.log("onSuccess - la reponse est la suivante : ", response); + }, + /** + * callback par defaut pour les erreurs + * @param {Object} error - error + * @private + */ + onFailure: function onFailure(error) { + if (error.status === 200 || !error.status) { + console.log("onFailure : ", error.message); + } else { + console.log("onFailure - Erreur (", error.status, ") : ", error.message); + } + } + }; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + + // ##################### + // analyse des options + // ##################### + + // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée + if (this.options.rawResponse && !this.options.onSuccess) { + /** + * callback par defaut pour la reponse + * @param {Object} response - response + * @private + */ + this.options.onSuccess = function (response) { + console.log("onSuccess - la réponse brute du service est la suivante : ", response); + }; + } + + // gestion du callback onSuccess + var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === "function"); + if (!bOnSuccess) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_MISSING", "onSuccess()")); + } + + // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF + // gestion de l'url du service par defaut + /* + if (!this.options.serverUrl) { + // INFO + // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut + // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant + // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut + DefaultUrlService.ssl = this.options.ssl; + var urlByDefault = DefaultUrlService[this.CLASSNAME].url("calcul"); + if (typeof urlByDefault === "string") { + this.options.serverUrl = urlByDefault; + } else { + this.logger.trace("URL par defaut à determiner au niveau du composant..."); + } + } + */ + + // FIXME nettoyage des KVP dans l'url du service + // if (this.options.serverUrl) { + // // INFO + // // si l'url est renseignée, il faut la nettoyer de tous ses KVP + // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait + // // des opérations d'encapsulations des reponses légèrement farfelues ... + // var urlsource = this.options.serverUrl; + // var urlparts = urlsource.split("?"); + // this.options.serverUrl = urlparts[0]; + // } + + // gestion de la methode HTTP + 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(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT", "httpMethod")); + default: + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "httpMethod")); + } + + // gestion du protocole + // this.options.protocol = (typeof options.protocol === "string" ) ? options.protocol.toUpperCase() : "JSONP"; + this.options.protocol = typeof options.protocol === "string" ? options.protocol.toUpperCase() : "XHR"; + switch (this.options.protocol) { + case "JSONP": + case "XHR": + break; + default: + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_UNKNOWN", "protocol")); + } + + // on determine l'environnement d'execution : browser ou non ? + // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS... + if (typeof window === "undefined" && this.options.protocol === "JSONP") { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_2__["default"].getMessage("PARAM_NOT_SUPPORT_NODEJS", "protocol=JSONP (instead use XHR)")); + } + + // le protocole JSONP ne fonctionne qu'en GET. + if (this.options.protocol === "JSONP") { + this.options.httpMethod = "GET"; + } + + // gestion du cache + this.options.nocache = options.nocache || false; + + // ##################### + // attributs d'instances + // ##################### + + /** + * Format de réponse du service + */ + this.options.outputFormat = null; + /** + * Requête envoyée au service + */ + this.request = null; + /** + * Reponse du service + */ + this.response = null; +} + +/** + * @lends module:CommonService + */ +CommonService.prototype = { + /* + * Constructeur (alias) + */ + constructor: CommonService, + /** + * Appel du service Géoportail + */ + call: function call() { + /* jshint validthis : true */ + this.logger.trace("CommonService::call ()"); + var context = this; + /** fonction d'execution */ + function run() { + this.logger.trace("CommonService::run ()"); + this.buildRequest.call(context, onError, onBuildRequest); + } + run.call(context); + + // callback de fin de construction de la requête + function onBuildRequest(result) { + this.logger.trace("CommonService::onBuildRequest : ", result); + this.callService.call(context, onError, onCallService); + } + + // callback de fin d'appel au service + function onCallService(result) { + this.logger.trace("CommonService::onCallService : ", result); + this.analyzeResponse.call(context, onError, onAnalyzeResponse); + } + + // callback de fin de lecture de la reponse + function onAnalyzeResponse(result) { + this.logger.trace("CommonService::onAnalyzeResponse : ", result); + if (result) { + this.options.onSuccess.call(this, result); + } else { + return onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Analyse de la reponse en échec !?")); + } + } + + // callback de gestion des erreurs : renvoit un objet de type ErrorService + function onError(error) { + this.logger.trace("CommonService::onError()"); + // error : l'objet est du type ErrorService ou Error + var e = error; + if (!(e instanceof _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"])) { + e = new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](error.message); + } + this.options.onFailure.call(this, e); + } + }, + /** + * Création de la requête + * @param {Function} error - callback + * @param {Function} success - callback + */ + buildRequest: function buildRequest(error, success) { + // INFO + this.logger.error("overwritten method !"); + // retourne l'objet 'this.request' + if (error) { + error.call(this, "This method must be overwritten !"); + } + success.call(this, "This method must be overwritten !"); + }, + /** + * Appel du service + * @param {Function} error - callback + * @param {Function} success - callback + */ + callService: function callService(error, success) { + // INFO + // retourne l'objet 'this.response' + + // NOTES + // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document). + // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes : + // - natif + // - XML encapsulé : + // {http : {status:200, error:null},xml :'réponse du service'} + // {http : {status:400, error:'reponse du service'},xml :null} + // En XHR, la reponse est directement sauvegardée dans 'this.response'. + // Par contre, en JSONP, on doit analyser la reponse (status ou non vide), + // et ne renvoyer que le contenu (xml ou l'objet) + + // gestion de la proxification du service + var strUrlProxified = null; + var strData = this.request; + + // a t on mis en place un proxy ? + // la proxyfication est valable uniquement en mode XHR ! + var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === "XHR"); + + // rajout de l'option gpbibaccess + // INFO : acces au numero de version de package.conf aprés compilation ! + if (this.CLASSNAME !== "Geocode" && this.CLASSNAME !== "ReverseGeocode" && this.CLASSNAME !== "AutoComplete") { + this.options.serverUrl = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, { + "gp-access-lib": _package_json__WEBPACK_IMPORTED_MODULE_5__.version, + apiKey: this.options.apiKey || "calcul" + }, false); + } + + // si le proxy est renseigné, on proxifie l'url du service + if (bUrlProxified) { + if (this.options.httpMethod === "GET") { + strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, this.request, true); + strData = null; + } + if (this.options.httpMethod === "POST") { + strUrlProxified = this.options.proxyURL + _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(this.options.serverUrl, null, true); + strData = this.request; + } + } + + // contexte du composant spécifique ! + 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, + // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) ! + nocache: this.options.nocache || false, + // ceci permet d'ajouter un timestamp dans la requête + wrap: this.options.protocol !== "XHR", + // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR ! + callbackSuffix: this.options.callbackSuffix, + // callbackName : this.options.callbackName || null, + data: strData, + headers: null, + // TODO... + content: this.options.contentType || "application/xml", + scope: this.options.scope || this, + // callback de reponse + onResponse: function onResponse(response) { + self.logger.trace("callService::onResponse()"); + + // le contenu de la reponse à renvoyer ! + var content = null; + + // XHR : on renvoie toujours la reponse brute du service (json ou xml) + // au parser du composant... + if (self.options.protocol === "XHR") { + self.logger.trace("Response XHR", response); + content = response; // par defaut, la reponse du service ! + } + + // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas) + // avant de l'envoyer au parser du composant... + if (self.options.protocol === "JSONP") { + self.logger.trace("Response JSON", response); + if (response) { + if (response.http) { + // reponse encapsulée : + // ex. reponse du service en xml + // > {http : {status:200, error:null},xml :'réponse du service'} + if (response.http.status !== 200) { + error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]({ + status: response.http.status, + message: response.http.error, + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR + })); + return; + } else { + content = response.xml; // par defaut ! + if (self.options.rawResponse) { + content = response; + } + } + } else { + // reponse non encapsulée : + // ex. reponse du service en json ou xml + content = response; + } + } else { + error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("Le contenu de la reponse est vide !?")); + return; + } + } + + // si on souhaite parser la reponse du service + if (typeof self.options.onBeforeParse === "function") { + var newResponse = self.options.onBeforeParse(content); + if (typeof newResponse === "string") { + // la reponse parsée par l'utilisateur est retournée sous + // forme de string ! + content = newResponse; + } + } + // sauvegarde de la reponse dans l'objet parent (CommonService) + self.response = content; + // on renvoie la reponse... + success.call(self, content); + }, + // callback des erreurs + onFailure: function onFailure(e) { + self.logger.trace("callService::onFailure()"); + // on est forcement sur une erreur levée par un service ! + e.type = _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"].TYPE_SRVERR; + error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"](e)); + }, + // callback de timeOut + onTimeOut: function onTimeOut() { + self.logger.trace("callService::onTimeOut()"); + error.call(self, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_4__["default"]("TimeOut!")); + } + }; + _Protocols_Protocol__WEBPACK_IMPORTED_MODULE_3__["default"].send(options); + }, + /** + * Analyse de la réponse + * @param {Function} error - callback + * @param {Function} success - callback + */ + analyzeResponse: function analyzeResponse(error, success) { + // INFO + this.logger.error("overwritten method !"); + // retourne l'objet spécifique au type de composant (json) + if (error) { + error.call(this, "This method must be overwritten !"); + } + success.call(this, "This method must be overwritten !"); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (CommonService); + +/***/ }), +/* 8 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Classe utilitaire + * + * @module Helper + * @alias Gp.Helper + */ +var Helper = { + /** + * concatenation des parametres key/value dans les urls + * + * @method normalyzeParameters + * @static + * @param {Object} params - tableau de clef/valeur + * + * @example + * Gp.Utils.Helper.normalyzeParameters ({ + * key1:value1, + * key2:value2, + * key3:value3 + * }); + * // out : "key1=value1&key2=value2&key3=value3" + * + * @returns {String} retourne les paramètres concaténés + */ + normalyzeParameters: function normalyzeParameters(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; + }, + /** + * Concaténation et encodage des urls. + * + * @method normalyzeUrl + * @static + * @param {String} url - url + * @param {Object|String} params - tableau de clef/valeur ou string + * @param {Boolean} encode - true|false, false par defaut + * + * @example + * Gp.Utils.Helper.normalyzeUrl (url, { + * key1:value1, + * key2=:value2, + * key3:value3 + * }); + * // out : "url?key1=value1&key2=value2&key3=value3" + * + * @returns {String} retourne une url normalisée + */ + normalyzeUrl: function normalyzeUrl(url, params, encode) { + var myUrl = url; + if (url) { + var k = url.indexOf("?"); + if (k === -1) { + // pas de ? et KVP + myUrl += "?"; + } + if (k !== -1 && k !== url.length - 1) { + // KVP + myUrl += "&"; + } + } + if (params) { + if (typeof params === "string") { + myUrl += params; + } else { + myUrl += this.normalyzeParameters(params); + } + } + if (encode) { + // FIXME bonne idée ? + myUrl = encodeURIComponent(myUrl); + } + return myUrl; + }, + /** + * Indentation d'une chaine + * + * @method indent + * @static + * @param {Number} n - nombre de tabulation + * @param {String} msg - chaine + * + * @example + * Gp.Utils.Helper.indent (2, "message à indenter") + * // out + * // ........message à indenter + * + * @returns {String} retourne une chaine indentée + */ + indent: function indent(n, msg) { + var num = n || 0; + return new Array(num + 1).join("\t") + msg; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Helper); + +/***/ }), +/* 9 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); +/* harmony import */ var _XHR__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); +/* harmony import */ var _JSONP__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); +/** + * Interface de dialogue avec les webservices + * + * @module Protocols + * @private + * @alias Gp.Protocols + */ + + + +var Protocol = { + /** + * Interface unique d"envoi d"une requête. + * + * @method send + * @static + * @param {Object} options - options generales + * @param {String} options.url - url du service + * @param {String} options.method - GET, POST, PUT, DELETE + * @param {String} options.protocol - XHR | JSONP + * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)... + * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP) + * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix="", la fonction s'appellera "callback") + * @param {String} options.timeOut - 0 ms + * @param {Boolean} options.nocache - true|false + * @param {Object|String} options.data - content (post) ou param (get) + * @param {Object|String} options.headers - (post) ex. referer + * @param {Object|String} options.content - (post) ex. "application/json" + * @param {String} options.scope - this (TODO) + * @param {Function} options.onResponse - callback + * @param {Function} options.onFailure - callback + * @param {Function} options.onTimeOut - callback + * @param {String} options.proxyUrl - (TODO) + */ + send: function send(options) { + // INFO + // "output" - param est interne à la classe "Protocol" (parametrable via "wrap"), et à ajouter à l"url + // ce param est independant du service car il est géré par le filtre LUA : + // ex. json|xml (json par defaut). + // Ce param. permet d"encapsuler du XML dans du JSON : + // {http : {status:200, error:null},xml :"réponse du service"} + // Utile pour les services qui ne repondent que du XML (ex. Geocodage) + // + // |-------------------------------------------------| + // | \service | | | | + // | output\ format| json | xml | remarques | + // |--------\------|------|-----|--------------------| + // | json | json | json| json/xml encapsulé | + // | xml | json | xml | param inactif | + // |-------------------------------------------------| + // ex. le service demande une reponse native au "format" json et avec un "output" json. + // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas ! + // dans ce cas on ne renseigne pas output=json + + // INFO + // "wrap" - choix d"encapsuler ou non les reponses dans du JSON. + // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) ! + + // INFO + // "callback" - param est interne à la classe "Protocol" (non parametrable), et à ajouter à l"url + // ce param est independant du service car il est géré aussi par le filtre LUA : + // ex. callback|null + // Ce param. permet de renvoyer une reponse javascript : + // callback ({http : {status:200, error:null},xml :"réponse du service"}) + // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le + // le protocol JSONP, et ce dernier implemente déjà le callback ! + + // settings par defaut + var settings = options || { + method: "GET", + // protocol : "JSONP", + protocol: "XHR", + timeOut: 0, + format: null, + wrap: true, + nocache: true, + output: "json", + callback: null, + callbackSuffix: null + }; + + // on determine l'environnement d'execution : browser ou non ? + // et on stoppe pour nodeJS... sur un protocole JSONP ! + if (typeof window === "undefined" && options.protocol === "JSONP") { + console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS"); + return; + } + if (options.protocol === "XHR" || options.format === "json") { + settings.wrap = false; + } else if (options.protocol === "JSONP" && options.format === "xml") { + settings.wrap = true; + } + settings.callback = null; // FIXME non géré !? + settings.output = settings.wrap ? "json" : null; + + // on encapsule les reponses dans un objet JSON + if (settings.wrap) { + var params = {}; + params.output = settings.output; + params.callback = settings.callback; + delete params.callback; // FIXME non géré !? + settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(options.url, params); + } + + // choix de l"implementation : + // XHR ou JSONP + switch (settings.protocol) { + case "XHR": + // on normalise l'url (gestion du cache) + if (options.method === "GET" && options.nocache) { + settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, { + t: new Date().getTime() + }); + } + // appel du service en XHR + _XHR__WEBPACK_IMPORTED_MODULE_1__["default"].call(settings); + break; + case "JSONP": + // on normalise l'url si les params. sont renseignés dans la string|object "data" + if (settings.data) { + settings.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_0__["default"].normalyzeUrl(settings.url, settings.data); + } + + // appel du service en JSONP + _JSONP__WEBPACK_IMPORTED_MODULE_2__["default"].call(settings); + break; + default: + throw new Error("protocol not supported (XHR|JSONP) !"); + } + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Protocol); + +/***/ }), +/* 10 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); +/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); +/* harmony import */ var es6_promise__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(es6_promise__WEBPACK_IMPORTED_MODULE_2__); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +/* global Promise, require, XDomainRequest */ + + + + +// import __request from "request"; +// import __xmldom from "xmldom"; + +/** + * Ajax Request (use of Promises) + * + * @module XHR + * @alias Gp.Protocols.XHR + * @see dependance 'es6-promise' + */ + +// cf. https://xhr.spec.whatwg.org/ +// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest + +var XHR = { + /** + * Interface unique d'envoi d'une requête. + * + * @method call + * @static + * @param {Object} settings - options generales + * @param {String} settings.url - url du service + * @param {String} settings.method - GET, POST, PUT, DELETE + * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute) + * @param {String} settings.data - content (post) ou param (get) + * @param {String} settings.proxy - proxy url + * @param {Object|String} settings.headers - (post) ex. referer + * @param {Object|String} settings.content - (post) ex. 'application/json' + * @param {String} settings.timeOut - timeout = 0 par defaut + * @param {String} settings.scope - this + * @param {Function} settings.onResponse - callback + * @param {Function} settings.onFailure - callback + */ + call: function call(settings) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR"); + logger.trace("[XHR::call()]"); + + // FIXME + // To polyfill the global environment + es6_promise__WEBPACK_IMPORTED_MODULE_2___default.a.polyfill(); + + // test sur les settings obligatoires + 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"; // reponse brute ! + } + + 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; + options.proxy = settings.proxy || null; + options.content = settings.content || null; + options.headers = settings.headers || { + referer: "http://localhost" + }; + + // test sur les valeurs de 'settings.method' + switch (settings.method) { + case "DELETE": + case "GET": + break; + case "PUT": + case "POST": + // on force sur ces params spécifiques au mode POST + options.content = settings.content ? settings.content : "application/x-www-form-urlencoded"; // FIXME en attente des services : bascule en "application/xml" ou "application/json" + options.headers = settings.headers ? settings.headers : { + referer: "http://localhost" + }; // FIXME parametrable... + break; + case "HEAD": + case "OPTIONS": + throw new Error("HTTP method not yet supported !"); + default: + throw new Error("HTTP method unknown !"); + } + + // test sur les valeurs de 'settings.format' + switch (settings.format) { + case "text": + this.__call(options).then(function (response) { + logger.trace(response); + settings.onResponse.call(this, response); + })["catch"](function (error) { + settings.onFailure.call(this, error); + }); + break; + case "json": + this.__callJSON(options).then(function (response) { + logger.trace(response); + settings.onResponse.call(this, response); + })["catch"](function (error) { + settings.onFailure.call(this, error); + }); + break; + case "xml": + this.__callXML(options).then(function (response) { + logger.trace(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 !"); + } + }, + /** + * Requete + * + * @method __call + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __call: function __call(options) { + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("XHR"); + logger.trace("[XHR::__call()]"); + var promise = new Promise(function (resolve, reject) { + // traitement du corps de la requête + var corps = options.method === "POST" || options.method === "PUT" ? 1 : 0; + + // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères) + if (options.data && (_typeof(options.data) === "object" && Object.keys(options.data).length || typeof options.data === "string" && options.data.length) && !corps) { + if (options.scope.CLASSNAME === "Geocode" || options.scope.CLASSNAME === "ReverseGeocode") { + options.url = options.url + options.data; + } else { + options.url = _Utils_Helper__WEBPACK_IMPORTED_MODULE_1__["default"].normalyzeUrl(options.url, options.data); + } + } + logger.trace("URL = ", options.url); + var hXHR = null; + + // test on env. nodejs or browser + if (typeof window === "undefined") { + var nodefetch = __webpack_require__(14); + var opts = { + headers: { + Referer: "https://localhost" + } + }; + if (options.data && typeof options.data === "string" && corps) { + opts = { + method: options.method, + body: options.data, + headers: { + "Content-Type": options.content, + Referer: "https://localhost" + } + }; + } + return nodefetch(options.url, opts).then(function (response) { + if (response.ok) { + // res.status >= 200 && res.status < 300 + resolve(response.text()); + } else { + var message = "Errors Occured on Http Request (status : '" + response.statusText + "' | url : '" + response.url + "')"; + var status = response.status; + reject({ + message: message, + status: status + }); + } + })["catch"](function (e) { + reject({ + message: e, + status: -1 + }); + }); + } else { + if (window.XMLHttpRequest) { + logger.trace("XMLHttpRequest"); + hXHR = new XMLHttpRequest(); + hXHR.open(options.method, options.url, true); // async + hXHR.overrideMimeType = options.content; + + // gestion du timeout + var onTimeOutTrigger = null; + if (options.timeOut > 0) { + // FIXME le timeout interne ne me permet pas de declencher le bon message... + // hXHR.timeout = options.timeOut; + logger.trace("XHR - TimeOut actif !"); + /** + * Description + * + * @method onTimeOutTrigger + * @private + */ + onTimeOutTrigger = window.setTimeout(function () { + var message = "TimeOut Occured on Http Request with XMLHttpRequest !"; + reject({ + message: message, + status: -1 + }); + }, options.timeOut); + } + if (corps) { + // headers, data, content of data + // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader + logger.trace("data = ", options.data); + hXHR.setRequestHeader("Content-type", options.content); + // FIXME refused to set unsafe header content-length javascript + // hXHR.setRequestHeader ("Content-length", options.data.length); + // hXHR.setRequestHeader ("Referer", options.headers.referer); + } + + /** + * On Error + * FIXME ne se declenche pas !? + * + * @param {Object} e - Event + * @method onerror + * @private + */ + hXHR.onerror = function (e) { + console.log(e); + reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * On Timeout + * FIXME ne se declenche pas !? + * + * @param {Object} e - Event + * @method ontimeout + * @private + */ + hXHR.ontimeout = function (e) { + console.log(e); + reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * Description + * + * @method onreadystatechange + * @private + */ + hXHR.onreadystatechange = function (e) { + if (hXHR.readyState === 4) { + // DONE + if (hXHR.status === 200) { + window.clearTimeout(onTimeOutTrigger); + resolve(hXHR.response); + } else { + var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "' | response : '" + e.target.response + "')"; + var status = e.target.status; + reject({ + message: message, + status: status + }); + } + } + }; + + // gestion du content data + var data4xhr = options.data && corps ? options.data : null; + hXHR.send(data4xhr); + } else if (window.XDomainRequest) { + // worked in Internet Explorer 8–10 only ! + logger.trace("XDomainRequest"); + hXHR = new XDomainRequest(); + hXHR.open(options.method, options.url); + hXHR.overrideMimeType = options.content; + if (options.timeOut > 0) { + hXHR.timeout = options.timeout; + logger.trace("XHR - TimeOut actif !"); + } + if (corps) { + // headers, data, content of data + // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader + hXHR.setRequestHeader("Content-type", options.content); + // FIXME refused to set unsafe header content-length javascript + // hXHR.setRequestHeader ("Content-length", options.data.length); + // hXHR.setRequestHeader ("Referer", options.headers.referer); + } + + /** + * Description + * + * @method onerror + * @private + */ + hXHR.onerror = function () { + reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * Description + * + * @method ontimeout + * @private + */ + hXHR.ontimeout = function () { + reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * On Load + * + * @method onload + * @private + */ + hXHR.onload = function (e) { + if (hXHR.status === 200) { + resolve(hXHR.responseText); + } else { + var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')"; + var status = e.target.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; + }, + /** + * Requete avec parser JSON + * + * @method __callJSON + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __callJSON: function __callJSON(options) { + return this.__call(options).then(JSON.parse)["catch"](function (error) { + console.log("_callJSON failed on : ", options.url, error); + // FIXME pas d'exception, laissons le fil se derouler... + // throw error; + }); + }, + + /** + * Requete avec parser XML + * + * @method __callXML + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __callXML: function __callXML(options) { + return this.__call(options).then(function (response) { + var xmlDoc; + + // test on env. nodejs or browser + if (typeof window === "undefined") { + var DOMParser = __webpack_require__(15).DOMParser; // __xmldom.DOMParser + xmlDoc = new DOMParser().parseFromString(response, "text/xml"); + } else { + if (window.DOMParser) { + var parser = new window.DOMParser(); + xmlDoc = parser.parseFromString(response, "text/xml"); + } else { + // IE + 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); + // FIXME pas d'exception, laissons le fil se derouler... + // throw error; + }); + } +}; + +/* harmony default export */ __webpack_exports__["default"] = (XHR); + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(process, global) {/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */ + +(function (global, factory) { + true ? module.exports = factory() : + undefined; +}(this, (function () { 'use strict'; + +function objectOrFunction(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +} + +function isFunction(x) { + return typeof x === 'function'; +} + + + +var _isArray = void 0; +if (Array.isArray) { + _isArray = Array.isArray; +} else { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; +} + +var isArray = _isArray; + +var len = 0; +var vertxNext = void 0; +var customSchedulerFn = void 0; + +var asap = function asap(callback, arg) { + queue[len] = callback; + queue[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (customSchedulerFn) { + customSchedulerFn(flush); + } else { + scheduleFlush(); + } + } +}; + +function setScheduler(scheduleFn) { + customSchedulerFn = scheduleFn; +} + +function setAsap(asapFn) { + asap = asapFn; +} + +var browserWindow = typeof window !== 'undefined' ? window : undefined; +var browserGlobal = browserWindow || {}; +var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; +var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + +// test for web worker but not in IE10 +var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + +// node +function useNextTick() { + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // see https://github.com/cujojs/when/issues/410 for details + return function () { + return process.nextTick(flush); + }; +} + +// vertx +function useVertxTimer() { + if (typeof vertxNext !== 'undefined') { + return function () { + vertxNext(flush); + }; + } + + return useSetTimeout(); +} + +function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function () { + node.data = iterations = ++iterations % 2; + }; +} + +// web worker +function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; +} + +function useSetTimeout() { + // Store setTimeout reference so es6-promise will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var globalSetTimeout = setTimeout; + return function () { + return globalSetTimeout(flush, 1); + }; +} + +var queue = new Array(1000); +function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue[i]; + var arg = queue[i + 1]; + + callback(arg); + + queue[i] = undefined; + queue[i + 1] = undefined; + } + + len = 0; +} + +function attemptVertx() { + try { + var vertx = Function('return this')().require('vertx'); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } catch (e) { + return useSetTimeout(); + } +} + +var scheduleFlush = void 0; +// Decide what async method to use to triggering processing of queued callbacks: +if (isNode) { + scheduleFlush = useNextTick(); +} else if (BrowserMutationObserver) { + scheduleFlush = useMutationObserver(); +} else if (isWorker) { + scheduleFlush = useMessageChannel(); +} else if (browserWindow === undefined && "function" === 'function') { + scheduleFlush = attemptVertx(); +} else { + scheduleFlush = useSetTimeout(); +} + +function then(onFulfillment, onRejection) { + var parent = this; + + var child = new this.constructor(noop); + + if (child[PROMISE_ID] === undefined) { + makePromise(child); + } + + var _state = parent._state; + + + if (_state) { + var callback = arguments[_state - 1]; + asap(function () { + return invokeCallback(_state, child, callback, parent._result); + }); + } else { + subscribe(parent, child, onFulfillment, onRejection); + } + + return child; +} + +/** + `Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {Any} value value that the returned promise will be resolved with + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` +*/ +function resolve$1(object) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop); + resolve(promise, object); + return promise; +} + +var PROMISE_ID = Math.random().toString(36).substring(2); + +function noop() {} + +var PENDING = void 0; +var FULFILLED = 1; +var REJECTED = 2; + +function selfFulfillment() { + return new TypeError("You cannot resolve a promise with itself"); +} + +function cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); +} + +function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { + try { + then$$1.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } +} + +function handleForeignThenable(promise, thenable, then$$1) { + asap(function (promise) { + var sealed = false; + var error = tryThen(then$$1, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value); + } else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); +} + +function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } else if (thenable._state === REJECTED) { + reject(promise, thenable._result); + } else { + subscribe(thenable, undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } +} + +function handleMaybeThenable(promise, maybeThenable, then$$1) { + if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } else { + if (then$$1 === undefined) { + fulfill(promise, maybeThenable); + } else if (isFunction(then$$1)) { + handleForeignThenable(promise, maybeThenable, then$$1); + } else { + fulfill(promise, maybeThenable); + } + } +} + +function resolve(promise, value) { + if (promise === value) { + reject(promise, selfFulfillment()); + } else if (objectOrFunction(value)) { + var then$$1 = void 0; + try { + then$$1 = value.then; + } catch (error) { + reject(promise, error); + return; + } + handleMaybeThenable(promise, value, then$$1); + } else { + fulfill(promise, value); + } +} + +function publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + + publish(promise); +} + +function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + + promise._result = value; + promise._state = FULFILLED; + + if (promise._subscribers.length !== 0) { + asap(publish, promise); + } +} + +function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + + asap(publishRejection, promise); +} + +function subscribe(parent, child, onFulfillment, onRejection) { + var _subscribers = parent._subscribers; + var length = _subscribers.length; + + + parent._onerror = null; + + _subscribers[length] = child; + _subscribers[length + FULFILLED] = onFulfillment; + _subscribers[length + REJECTED] = onRejection; + + if (length === 0 && parent._state) { + asap(publish, parent); + } +} + +function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (subscribers.length === 0) { + return; + } + + var child = void 0, + callback = void 0, + detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; +} + +function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), + value = void 0, + error = void 0, + succeeded = true; + + if (hasCallback) { + try { + value = callback(detail); + } catch (e) { + succeeded = false; + error = e; + } + + if (promise === value) { + reject(promise, cannotReturnOwn()); + return; + } + } else { + value = detail; + } + + if (promise._state !== PENDING) { + // noop + } else if (hasCallback && succeeded) { + resolve(promise, value); + } else if (succeeded === false) { + reject(promise, error); + } else if (settled === FULFILLED) { + fulfill(promise, value); + } else if (settled === REJECTED) { + reject(promise, value); + } +} + +function initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + resolve(promise, value); + }, function rejectPromise(reason) { + reject(promise, reason); + }); + } catch (e) { + reject(promise, e); + } +} + +var id = 0; +function nextId() { + return id++; +} + +function makePromise(promise) { + promise[PROMISE_ID] = id++; + promise._state = undefined; + promise._result = undefined; + promise._subscribers = []; +} + +function validationError() { + return new Error('Array Methods must be provided an Array'); +} + +var Enumerator = function () { + function Enumerator(Constructor, input) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop); + + if (!this.promise[PROMISE_ID]) { + makePromise(this.promise); + } + + if (isArray(input)) { + this.length = input.length; + this._remaining = input.length; + + this._result = new Array(this.length); + + if (this.length === 0) { + fulfill(this.promise, this._result); + } else { + this.length = this.length || 0; + this._enumerate(input); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } else { + reject(this.promise, validationError()); + } + } + + Enumerator.prototype._enumerate = function _enumerate(input) { + for (var i = 0; this._state === PENDING && i < input.length; i++) { + this._eachEntry(input[i], i); + } + }; + + Enumerator.prototype._eachEntry = function _eachEntry(entry, i) { + var c = this._instanceConstructor; + var resolve$$1 = c.resolve; + + + if (resolve$$1 === resolve$1) { + var _then = void 0; + var error = void 0; + var didError = false; + try { + _then = entry.then; + } catch (e) { + didError = true; + error = e; + } + + if (_then === then && entry._state !== PENDING) { + this._settledAt(entry._state, i, entry._result); + } else if (typeof _then !== 'function') { + this._remaining--; + this._result[i] = entry; + } else if (c === Promise$1) { + var promise = new c(noop); + if (didError) { + reject(promise, error); + } else { + handleMaybeThenable(promise, entry, _then); + } + this._willSettleAt(promise, i); + } else { + this._willSettleAt(new c(function (resolve$$1) { + return resolve$$1(entry); + }), i); + } + } else { + this._willSettleAt(resolve$$1(entry), i); + } + }; + + Enumerator.prototype._settledAt = function _settledAt(state, i, value) { + var promise = this.promise; + + + if (promise._state === PENDING) { + this._remaining--; + + if (state === REJECTED) { + reject(promise, value); + } else { + this._result[i] = value; + } + } + + if (this._remaining === 0) { + fulfill(promise, this._result); + } + }; + + Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) { + var enumerator = this; + + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); + }; + + return Enumerator; +}(); + +/** + `Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = resolve(2); + let promise3 = resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = reject(new Error("2")); + let promise3 = reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static +*/ +function all(entries) { + return new Enumerator(this, entries).promise; +} + +/** + `Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} promises array of promises to observe + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. +*/ +function race(entries) { + /*jshint validthis:true */ + var Constructor = this; + + if (!isArray(entries)) { + return new Constructor(function (_, reject) { + return reject(new TypeError('You must pass an array to race.')); + }); + } else { + return new Constructor(function (resolve, reject) { + var length = entries.length; + for (var i = 0; i < length; i++) { + Constructor.resolve(entries[i]).then(resolve, reject); + } + }); + } +} + +/** + `Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {Any} reason value that the returned promise will be rejected with. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. +*/ +function reject$1(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop); + reject(promise, reason); + return promise; +} + +function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); +} + +function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); +} + +/** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise's eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {Function} resolver + Useful for tooling. + @constructor +*/ + +var Promise$1 = function () { + function Promise(resolver) { + this[PROMISE_ID] = nextId(); + this._result = this._state = undefined; + this._subscribers = []; + + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise ? initializePromise(this, resolver) : needsNew(); + } + } + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + Chaining + -------- + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + Assimilation + ------------ + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + If the assimliated promise rejects, then the downstream promise will also reject. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + Simple Example + -------------- + Synchronous Example + ```javascript + let result; + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + Promise Example; + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + Advanced Example + -------------- + Synchronous Example + ```javascript + let author, books; + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + function foundBooks(books) { + } + function failure(reason) { + } + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + Promise Example; + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + + + Promise.prototype.catch = function _catch(onRejection) { + return this.then(null, onRejection); + }; + + /** + `finally` will be invoked regardless of the promise's fate just as native + try/catch/finally behaves + + Synchronous example: + + ```js + findAuthor() { + if (Math.random() > 0.5) { + throw new Error(); + } + return new Author(); + } + + try { + return findAuthor(); // succeed or fail + } catch(error) { + return findOtherAuther(); + } finally { + // always runs + // doesn't affect the return value + } + ``` + + Asynchronous example: + + ```js + findAuthor().catch(function(reason){ + return findOtherAuther(); + }).finally(function(){ + // author was either found, or not + }); + ``` + + @method finally + @param {Function} callback + @return {Promise} + */ + + + Promise.prototype.finally = function _finally(callback) { + var promise = this; + var constructor = promise.constructor; + + if (isFunction(callback)) { + return promise.then(function (value) { + return constructor.resolve(callback()).then(function () { + return value; + }); + }, function (reason) { + return constructor.resolve(callback()).then(function () { + throw reason; + }); + }); + } + + return promise.then(callback, callback); + }; + + return Promise; +}(); + +Promise$1.prototype.then = then; +Promise$1.all = all; +Promise$1.race = race; +Promise$1.resolve = resolve$1; +Promise$1.reject = reject$1; +Promise$1._setScheduler = setScheduler; +Promise$1._setAsap = setAsap; +Promise$1._asap = asap; + +/*global self*/ +function polyfill() { + var local = void 0; + + 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) { + var promiseToString = null; + try { + promiseToString = Object.prototype.toString.call(P.resolve()); + } catch (e) { + // silently ignored + } + + if (promiseToString === '[object Promise]' && !P.cast) { + return; + } + } + + local.Promise = Promise$1; +} + +// Strange compat.. +Promise$1.polyfill = polyfill; +Promise$1.Promise = Promise$1; + +return Promise$1; + +}))); + + + +//# sourceMappingURL=es6-promise.map + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(12), __webpack_require__(13))) + +/***/ }), +/* 12 */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__14__; + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__15__; + +/***/ }), +/* 16 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/** + * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail + * + * @module JSONP + * @private + * @alias Gp.Protocols.JSONP + */ + + +// cf. https://github.com/sobstel/jsonp.js +var JSONP = { + /** + * Construction d'un identifiant statique basé sur le timestamp, + * et qui s'incremente de +1 à chaque appel + */ + uuid: function () { + var id = Math.floor(Date.now()); + return function () { + return id++; + }; + }(), + /** + * Cette fonction réalise l'appel du service fourni via le paramètre "options.url" + * en mettant en œuvre le protocole JSONP. + * + * @method call + * @static + * @param {Object} options - parametres d'invocation du service en JSONP + * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP). + * Cette URL contient déjà les paramètres du service. + * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ; + * sa valeur est déterminée en fonction du paramètre callbackName. + * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu. + * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut. + * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL. + * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: "callback1458574396582 ()" + * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL. + * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte. + * La fonction de callback est créée dynamiquement par la fonction JSONP ; + * elle a deux fonctions : + * elle annule la condition de timeOut + * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse. + * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service. + * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback. + * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre. + * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service. + * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut. + * @example + * var options = { + * url : 'http://localhost/some/test.json&callback=myResults', + * timeOut : 100, + * callbackName : 'myResults', + * callbackSuffix : "", + * onResponse : function (response) { + * console.log('results : ', response); + * }, + * + * }; + * JSONP.call(options); + */ + call: function call(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("JSONP"); + logger.trace("[JSONP::call ()]"); + + // analyse parametres + + if (!options) { + logger.error("missing parameter : options !"); + throw new Error("missing parameter : options !"); + } + if (!options.url) { + logger.error("missing parameter : options.url !"); + throw new Error("missing parameter : options.url !"); + } + if (!options.timeOut) { + logger.info("setting 'options.timeOut' default value"); + options.timeOut = 0; + } + + // FIXME si un callback coté client a été mis en place, + // cette condition sur cette methode n'a pas de sens !? + if (!options.onResponse) { + logger.error("missing parameter : options.onResponse !"); + throw new Error("missing parameter : options.onResponse !"); + // FIXME doit on definir un callback interne par defaut !? + // options.onResponse = function (data) { + // console.log("response callback (inner) : ", data); + // }; + } + + // ID du callback à utiliser : null ou string. + // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = "") + // sinon, on utilise un timestamp : this.uuid () + var callbackId = typeof options.callbackSuffix === "string" ? options.callbackSuffix : this.uuid(); + + // on recherche le parametre callback et son nom de fonction dans l'url + var urlHasCallbackKey = false; + var urlHasCallbackName = false; + var idx = options.url.indexOf("callback="); + if (idx !== -1) { + urlHasCallbackKey = true; + // extraction callbackName de l'url : entre "callback=" et "&" ou fin de ligne + var j = options.url.indexOf("&", idx); + if (j === -1) { + j = options.url.length; + } + + // on ecrase le parametre options.callbackName s'il avait été défini + var callbackName = options.url.substring(idx + 9, j); + if (callbackName) { + urlHasCallbackName = true; + options.callbackName = callbackName; + logger.info("setting 'options.callbackName' value (" + options.callbackName + ") from 'options.url' parameter"); + } + } + + // on ajoute le parametre callback dans l'URL s'il n'existe pas + if (!urlHasCallbackKey) { + // gestion des autres param. et "?" + var k = options.url.indexOf("?"); + if (k === -1) { + // aucun param., ni de '?' + options.url = options.url + "?" + "callback="; + } else if (k === options.url.length) { + // uniquement le '?' + options.url = options.url + "callback="; + } else { + // le '?' et les param. existent + options.url = options.url + "&" + "callback="; + } + logger.info("setting callback default key in 'options.url' : " + options.url); + } + + // utilisation de la fonction callback coté client ? + var HasCallbackName = options.callbackName ? true : urlHasCallbackName; + + // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas + if (!urlHasCallbackName) { + // fonction callback par defaut + if (!options.callbackName) { + logger.info("setting 'options.callbackName' default value"); + options.callbackName = "callback"; // ou "gp.protocol.jsonp" ? + // info : si on ne veut pas gerer d'ID dans le callback, + // options.callbackSuffix = "" + if (callbackId || callbackId === "") { + options.callbackName += callbackId; + } + } + options.url = options.url.replace("callback=", "callback=" + options.callbackName); + logger.info("setting callback function name in 'options.url' : " + options.url); + } + + // timeOut par defaut + if (!options.onTimeOut) { + logger.info("setting 'options.onTimeOut' default value"); + /** callback timeout par defaut */ + options.onTimeOut = function /* error */ + () { + console.log("TimeOut while invoking url : " + options.url); + }; + } + if (!HasCallbackName) { + var self = this; + + // event du timeout + var onTimeOutTrigger = null; + + // declenche le timeout si > à 0 ! + if (options.timeOut > 0) { + onTimeOutTrigger = window.setTimeout(function () { + /** fonction de reponse du service */ + window[options.callbackName] = function () {}; + options.onTimeOut(); + self._deleteScript(callbackId); + }, options.timeOut); + } + + // FIXME le nom de la fonction n'accepte pas de namespace ! + // ex. Gp.Function.callback + /** + * fonction de reponse du service + * @param {Object} data - data + * @private + */ + window[options.callbackName] = function (data) { + window.clearTimeout(onTimeOutTrigger); + options.onResponse(data); + self._deleteScript(callbackId); + }; + } + this._createScript(callbackId, options.url); + }, + /** + * create Script + * @param {String} callbackId - callback Id + * @param {String} url - url + * @private + */ + _createScript: function _createScript(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"); // FIXME async ? + // head ou body ou autres ? + var node = document.documentElement || document.getElementsByTagName("head")[0]; + if (scripto === null) { + node.appendChild(scriptu); + } else { + // s'il existe déjà, on le remplace ! + node.replaceChild(scriptu, scripto); + } + }, + /** + * delete Script + * @param {String} callbackId - callback Id + * @private + */ + _deleteScript: function _deleteScript(callbackId) { + var script = document.getElementById("results" + callbackId); + if (script) { + var node = script.parentNode || document.documentElement; + if (!node) { + return; + } + node.removeChild(script); + } + } +}; +/* harmony default export */ __webpack_exports__["default"] = (JSONP); + +/***/ }), +/* 17 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Errors raised by API for one among three reasons : wrong API usage, underlying service error or unknown reason. + * + * @property {String} message - Error message + * @property {Number} status - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} ; -1 otherwise. + * @property {String} type - Error type ({@link Gp.Error.TYPE_SRVERR}, {@link Gp.Error.TYPE_USEERR} or {@link Gp.Error.TYPE_UNKERR}). + * + * @namespace + * @alias Gp.Error + * @param {Object|String} error - Options for creating error object. Can be a String (message) or an Object. + * @param {String} error.message - Error message to return to user. + * @param {enum} [error.type=TYPE_UNKERR] - Error type + * @param {status} [error.status=-1] - Error status : when {@link Gp.Error.TYPE_SRVERR}, gives the [HTTP status of the underlying web service response]{@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}. + * + */ +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; +} + +/** + * Error raised when underlying geoportal service answers on error. + * + * @type {String} + * @constant + * @static + */ +ErrorService.TYPE_SRVERR = "SERVICE_ERROR"; +/** + * Error raised when funcion use is inappropriate + * + * @type {String} + * @constant + * @static + */ +ErrorService.TYPE_USEERR = "USAGE_ERROR"; +/** + * Error raised when API can't perform the job for a reason other than the two other ones. + * + * @type {String} + * @constant + * @static + */ +ErrorService.TYPE_UNKERR = "UNKNOWN_ERROR"; + +/** + * @lends module:ErrorService + */ +ErrorService.prototype = Object.create(Error.prototype, { + constructor: { + value: ErrorService, + writable: true, + configurable: true + } +}); +/* harmony default export */ __webpack_exports__["default"] = (ErrorService); + +/***/ }), +/* 18 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"name\":\"geoportal-access-lib\",\"version\":\"3.4.0-beta2\",\"date\":\"27/10/2023\",\"description\":\"French Geoportal resources access library\",\"module\":\"src/Gp.js\",\"main\":\"dist/GpServices-src.js\",\"homepage\":\"https://github.com/IGNF/geoportal-access-lib#readme\",\"scripts\":{\"clean\":\"echo \\\"Warning: no yet implemented!\\\" && exit 0\",\"setup\":\"npm install\",\"cover\":\"nyc --reporter=lcov --reporter=text npm run test\",\"eslint\":\"eslint src/\",\"build\":\"webpack --mode=none\",\"build:prod\":\"webpack --mode=production\",\"build:dev\":\"webpack --mode=development\",\"test\":\"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\\"test_*.js\\\" test/spec/\",\"test:serve\":\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js\",\"test:serve:docker\":\"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js\",\"test:end-to-end:serve\":\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js\",\"test:end-to-end:serve:docker\":\"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js\",\"sample\":\"npm run sample:serve\",\"sample:serve\":\"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path '/dist/' --port 9001 --open\",\"sample:serve:prod\":\"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path '/dist/' --port 9001 --open\",\"sample:serve:dev\":\"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path '/dist/' --port 9001 --open\",\"doc\":\"npm run doc:serve\",\"doc:serve\":\"webpack-dev-server --content-base jsdoc --port 9001 --open\"},\"nyc\":{\"include\":[\"src/**/*.js\"],\"instrument\":false,\"sourceMap\":false},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/IGNF/geoportal-access-lib.git\"},\"keywords\":[\"geoportail\",\"webservice\",\"javascript\",\"es6\"],\"author\":\"IGNF\",\"license\":\"CECILL-B\",\"dependencies\":{\"es6-promise\":\"^4.2.4\",\"node-fetch\":\"^2.6.1\",\"xmldom\":\"^0.1.27\"},\"devDependencies\":{\"@babel/core\":\"^7.12.10\",\"@babel/plugin-transform-template-literals\":\"^7.12.1\",\"@babel/preset-env\":\"^7.12.11\",\"babel-loader\":\"^8.2.2\",\"chai\":\"^4.1.2\",\"clean-webpack-plugin\":\"^3.0.0\",\"copy-webpack-plugin\":\"^5.1.2\",\"eslint\":\"^7.18.0\",\"eslint-config-standard\":\"^16.0.2\",\"eslint-loader\":\"^4.0.2\",\"eslint-plugin-import\":\"^2.22.1\",\"eslint-plugin-node\":\"^11.1.0\",\"eslint-plugin-promise\":\"^4.2.1\",\"eslint-plugin-standard\":\"^5.0.0\",\"glob\":\"^7.1.2\",\"handlebars-layouts\":\"^3.1.4\",\"handlebars-webpack-plugin\":\"^1.4.1\",\"html-webpack-plugin\":\"^4.5.1\",\"istanbul-instrumenter-loader\":\"^3.0.1\",\"jsdoc-webpack-plugin\":\"^0.3.0\",\"loglevel\":\"^1.6.1\",\"mocha\":\"^7.2.0\",\"mocha-loader\":\"^5.1.5\",\"mocha-webpack\":\"^2.0.0-beta.0\",\"mochawesome\":\"^6.2.1\",\"nyc\":\"^15.1.0\",\"path\":\"^0.12.7\",\"replace-bundle-webpack-plugin\":\"^1.0.0\",\"sinon\":\"^9.2.4\",\"sinon-es6\":\"0.0.3\",\"speed-measure-webpack-plugin\":\"^1.4.2\",\"string-template\":\"^1.0.0\",\"terser-webpack-plugin\":\"^2.3.8\",\"webpack\":\"^4.46.0\",\"webpack-cli\":\"^3.3.12\",\"webpack-dev-server\":\"^3.11.2\",\"webpack-node-externals\":\"^2.5.2\",\"webpack-shell-plugin\":\"^0.5.0\"},\"bundledDependencies\":[],\"peerDependencies\":{},\"optionalDependencies\":{}}"); + +/***/ }), +/* 19 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// cette classe contient les URLs par defaut des services. +// DefaultUrlService.Alti.url(key)[elevation-json] +// DefaultUrlService.Alti.url(key)[elevation-xml] +// DefaultUrlService.Alti.url(key)[profil-json] +// DefaultUrlService.Alti.url(key)[profil-xml] +// DefaultUrlService.ProcessIsoCurve.url(key) +// DefaultUrlService.AutoComplete.url(key) +// DefaultUrlService.ReverseGeocode.url(key) +// DefaultUrlService.Geocode.url(key) +// DefaultUrlService.Route.url(key) + +// Example : +// +// DefaultUrlService.Alti.url('alti')[elevation-json] +// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json +// +// DefaultUrlService.Alti.url('calcul') +// output {Object|String} +// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json +// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml +// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json +// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml +// +// ssl by default. +// +// Force to not do ssl : +// DefaultUrlService.ssl = false; +// +// DefaultUrlService.AutoComplete.url('calcul') +// output {Object|String} +// -> https://wxs.ign.fr/calcul/ols/apis/completion + +// constantes internes +var HOSTNAME = "wxs.ign.fr"; + +/** + * Default Geoportal web services URLs access. + * + * @namespace + * @alias Gp.Services.DefaultUrl + */ +var DefaultUrlService = { + /** if set true, require the use of https protocol */ + ssl: true, + /** + * base url of services (ssl protocol management) + * @param {String} path - path + * @returns {String} url + */ + url: function url(path) { + // comportement par défaut => https + // sinon, il est fixé par l'option 'ssl' (false => http) + var _protocol; + if (DefaultUrlService.ssl === false) { + _protocol = "http://"; + } else { + _protocol = "https://"; + } + return _protocol + HOSTNAME + path; + }, + /** + * base new-url of services (ssl protocol management) + * @param {String} path - path + * @returns {String} url + */ + newUrl: function newUrl(path, hostname) { + // comportement par défaut => https + // sinon, il est fixé par l'option 'ssl' (false => http) + var _protocol; + if (DefaultUrlService.ssl === false) { + _protocol = "http://"; + } else { + _protocol = "https://"; + } + return _protocol + hostname + path; + }, + /** + * Elevation web service access + * + * @member {Object} + * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("elevation-json", "elevation-xml", "profil-json" or "profil-xml"). + */ + Alti: { + new_key: { + // rest + "elevation-json": "/altimetrie/1.0/calcul/alti/rest/elevation.json", + "elevation-xml": "/altimetrie/1.0/calcul/alti/rest/elevation.xml", + "profil-json": "/altimetrie/1.0/calcul/alti/rest/elevationLine.json", + "profil-xml": "/altimetrie/1.0/calcul/alti/rest/elevationLine.xml" + }, + _key: { + // rest + "elevation-json": "/calcul/alti/rest/elevation.json", + "elevation-xml": "/calcul/alti/rest/elevation.xml", + "profil-json": "/calcul/alti/rest/elevationLine.json", + "profil-xml": "/calcul/alti/rest/elevationLine.xml", + // other + wps: "/alti/wps" + }, + /** + * newurl from geoplateforme service + * @param {String} key - key + * @returns {String} url + */ + newUrl: function newUrl() {}, + /** + * url from wxs service + * @returns {String} url + */ + url: function url() { + return { + // rest + "elevation-json": DefaultUrlService.url(this._key["elevation-json"]), + "elevation-xml": DefaultUrlService.url(this._key["elevation-xml"]), + "profil-json": DefaultUrlService.url(this._key["profil-json"]), + "profil-xml": DefaultUrlService.url(this._key["profil-xml"]) + }; + } + }, + /** + * IsoCurve web service access + * + * @member {Object} + * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("iso-json" or "iso-xml"). + */ + ProcessIsoCurve: { + new_key: "/itineraire/isochrone", + _key: "/calcul/geoportail/isochrone/rest/1.0.0/isochrone", + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl: function newUrl() {}, + /** + * url from wxs service + * @returns {String} url + */ + url: function url() { + return DefaultUrlService.url(this._key); + } + }, + /** + * Config web service access + * + * @member {Object} + * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter. + */ + Config: { + _key: "https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/", + /** + * url + * @param {String} key - key + * @returns {String} url + */ + url: function url(key) { + // key must be an array of one or several keys + if (!Array.isArray(key)) { + key = key.split(","); + } + // not homogeneous with others geoportal services URLs + var url = []; + for (var i = 0; i < key.length; i++) { + url[i] = this._key + key[i] + "Config.json"; + } + return url; + } + }, + /** + * Autocompletion web service access + * + * @member {Object} + * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + AutoComplete: { + new_key: "/geocodage/completion", + _key: "/calcul/geoportail/geocodage/rest/0.1/completion", + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl: function newUrl() { + var NEW_AUTOCOMPLETE_HOSTNAME = "data.geopf.fr"; + return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME); + }, + /** + * url + * @returns {String} url + */ + url: function url(key) { + return DefaultUrlService.url(this._key); + } + }, + /** + * Reverse geocoding web service access + * + * @member {Object} + * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + ReverseGeocode: { + new_key: "/geocodage/reverse", + _key: "/calcul/geoportail/geocodage/rest/0.1/reverse", + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl: function newUrl() { + var NEW_REVERSE_GEOCODE_HOSTNAME = "data.geopf.fr"; + return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME); + }, + /** + * url + * @returns {String} url + */ + url: function url() { + return DefaultUrlService.url(this._key); + } + }, + /** + * Geocoding web service access + * + * @member {Object} + * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + Geocode: { + new_key: "/geocodage/search", + _key: "/calcul/geoportail/geocodage/rest/0.1/search", + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl: function newUrl() { + var NEW_GEOCODE_HOSTNAME = "data.geopf.fr"; + return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME); + }, + /** + * url + * @returns {String} url + */ + url: function url() { + return DefaultUrlService.url(this._key); + } + }, + /** + * Routing web service access + * + * @member {Object} + * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols. + */ + Route: { + new_key: "/itineraire/route", + _key: "/calcul/geoportail/itineraire/rest/1.0.0/route", + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl: function newUrl() {}, + /** + * url from wxs service + * @returns {String} url + */ + url: function url() { + return DefaultUrlService.url(this._key); + } + } +}; +/* harmony default export */ __webpack_exports__["default"] = (DefaultUrlService); + +/***/ }), +/* 20 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Object} generalOptions - General properties for default map configuration resources. + * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key. + * @property {String} generalOptions.title - Underlying web service Title. + * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array. + * @property {String} generalOptions.theme - default theme (FIXME : for what ?) + * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel. + * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}). + * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}). + * + * @namespace + * @alias Gp.Services.GetConfigInterface + */ +function ConfigInterface() { + if (!(this instanceof ConfigInterface)) { + throw new TypeError("ConfigInterface constructor cannot be called as a function."); + } + this.generalOptions = { + apiKeys: {}, + title: null, + defaultGMLGFIStyle: null, + theme: null, + wgs84Resolutions: [] + }; + this.layers = {}; + this.tileMatrixSets = {}; +} +ConfigInterface.prototype = { + /* + * Constructor (alias) + */ + constructor: ConfigInterface, + /** + * Check if config is loaded for a given key + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise + */ + isKeyConfLoaded: function isKeyConfLoaded(apiKey) { + if (!apiKey) { + return; + } + if (this.generalOptions.apiKeys[apiKey]) { + return true; + } + return false; + }, + /** + * Returns an array of Geoportal layers identifiers, corresponding to an API contract key. + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Array} apiKeys - Array of geoportal layers identifiers + */ + getLayersId: function getLayersId(apiKey) { + return this.generalOptions.apiKeys[apiKey]; + }, + /** + * Returns the id of a Geoportal layer with its name and its service. + * + * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") + * @param {String} service - name of the service (ex. "WMS" ou "WMTS") + * @returns {String} Id of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS") + */ + getLayerId: function getLayerId(layerName, service) { + if (!layerName || !service) { + return; + } + var layerId = null; + + // layer + // key : [layerName]$[contexte]:OGC:[service] + // ex : "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS" + + // service + // key : [layerName]$[contexte];[service] + // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode + + if (this.layers) { + var layers = this.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.toUpperCase()) { + layerId = key; + break; + } + if (servicePartsLayer[2] === service.toUpperCase()) { + layerId = key; + break; + } + } + } + } + } + } + if (!layerId) { + return; + } + return layerId; + }, + /** + * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key. + * If no key is specified, all layers from configuration are returned. + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Object} layers - Object which properties are layers identifiers. + */ + getLayersConf: function getLayersConf(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; + }, + /** + * Returns a geoportal layer configuration, given its identifier + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @return {Object} layer - Layer configuration + */ + getLayerConf: function getLayerConf(layerId) { + if (!this.layers) { + return; + } + return this.layers[layerId]; + }, + /** + * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key + * + * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") + * @param {String} service - name of the service (ex. "WMS" ou "WMTS") + * @param {String} [apiKey] - Contract API key + * @returns {Object} params - params of the service (WMS or WMTS) for the given layer + * @returns {String} params.url - Url of the service to reach to display the layer + * @returns {String} params.version - Version of the service + * @returns {String} params.styles - Default style of the layer + * @returns {String} params.format - Default format of the layer + * @returns {String} params.projection - Default projection of the layer + * @returns {Number} params.minScale - Min scale denominator of the layer + * @returns {Number} params.maxScale - Max scale denominator of the layer + * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer + * @returns {Array} params.legends - Array of legends associated to the layer + * @returns {Array} params.title - Name of the layer, readable by a human + * @returns {Array} params.description - Description of the layer + * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer + * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer + * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer + * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer + */ + getLayerParams: function getLayerParams(layerName, service) { + var params = {}; + if ((service === "WMS" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) { + // get the layerId of the layer + var layerId = this.getLayerId(layerName, service); + if (layerId) { + // get the layer Conf Object + var layerConf = this.getLayerConf(layerId); + var keys = this.getLayerKey(layerId); + if (keys.length === 0) { + return; + } + + // get services params + for (var i = 0; i < keys.length; i++) { + // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property + if (layerConf.serviceParams.serverUrl[keys[i]]) { + params.url = layerConf.serviceParams.serverUrl[keys[i]]; + } + } + var wmsTypeRegex = /\/v\//; + // WMS vector style always empty (not in getCap) + if (wmsTypeRegex.test(params.url)) { + params.styles = " "; + } else { + // WMS raster style is defined in getCap + params.styles = layerConf.styles[0].name; + } + params.version = layerConf.serviceParams.version; + params.format = layerConf.formats[0].name; + params.projection = layerConf.defaultProjection; + + // get layer info and constraints + params.minScale = layerConf.globalConstraint.minScaleDenominator; + params.maxScale = layerConf.globalConstraint.maxScaleDenominator; + params.extent = layerConf.globalConstraint.bbox; + params.legends = layerConf.legends; + params.title = layerConf.title; + params.description = layerConf.description; + if (service === "WMS") { + params.metadata = layerConf.metadata; + } + + // Informations non disponibles avec les getCap + // params.metadata = layerConf.getMetadata(); + // params.originators = layerConf.getOriginators(); + // params.quicklookUrl = layerConf.getQuicklookUrl(); + + // WMTS : get the tileMatrixSetLimits + if (layerConf.wmtsOptions) { + params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits; + var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink; + if (TMSLink) { + params.TMSLink = TMSLink; + var tmsConf = this.getTMSConf(TMSLink); + // Get matrix origin : Gp.Point = Object{x:Float, y:Float} + // params.matrixOrigin = tmsConf.getTopLeftCorner(); + params.matrixIds = Object.keys(tmsConf.tileMatrices); + params.tileMatrices = tmsConf.tileMatrices; + // by default, pseudo mercator resolutions + params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf("PM").nativeResolutions; + } + } + } + } + return params; + }, + /** + * Get the contract key(s) associated to a given layer. + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @return {Array} layerKey - array of key(s) associated to the given layer + */ + getLayerKey: function getLayerKey(layerId) { + var layerKey = []; + if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) { + var resourcesByKey = this.generalOptions.apiKeys; + for (var key in resourcesByKey) { + var resourcesArray = resourcesByKey[key]; + resourcesArray.forEach(function (arrayLayerId) { + if (arrayLayerId === layerId) { + layerKey.push(key); + } + }); + } + } + return layerKey; + }, + /** + * Returns an associative array of Tile Matrix Sets configurations. + * + * @return {Object} tileMatrixSets - Object which properties are TMS identifiers + * + */ + getTileMatrixSets: function getTileMatrixSets() { + return this.tileMatrixSets; + }, + /** + * Returns a Tile Matrix Sets configuration, given its identifier. + * + * @param {String} tmsID - Tile Matrix Set identifier (e.g. : "PM") + * @return {Object} tileMatrixSet - Tile Matrix Set configuration + */ + getTMSConf: function getTMSConf(tmsID) { + if (!this.tileMatrixSets) { + return; + } + return this.tileMatrixSets[tmsID]; + }, + /** + * Get global constraints for a given Layer : extent, minScale, maxScale, projection + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @returns {Object} params - layer constraints + * @returns {String} params.projection - default layer projection + * @returns {Number} params.minScale - layer min scale denominator + * @returns {Number} params.maxScale - layer max scale denominator + * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection + */ + getGlobalConstraints: function getGlobalConstraints(layerId) { + var params = {}; + if (layerId) { + // get layer configuration object + var layerConf = this.getLayerConf(layerId); + params.projection = layerConf.defaultProjection; + params.minScale = layerConf.globalConstraint.minScaleDenominator; + params.maxScale = layerConf.globalConstraint.maxScaleDenominator; + params.extent = layerConf.globalConstraint.bbox; + } + return params; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (ConfigInterface); + +/***/ }), +/* 21 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(22); +/* harmony import */ var _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29); + + + + + + + + +/** + * @classdesc + * + * Appel du service d'altimétrie du Géoportail + * + * @todo gestion du parma. output et callback + * @todo outputFormat (REST) et format (WPS) + * @todo La reponse JSON peut encapsuler un XML ! + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Alti + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84) + * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil). + * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants. + * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine). + * Maximum 50 éléments. + * + * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'. + * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST, + * ou la valeur du paramètre 'format' dans le cas de la norme WPS. + * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST, + * pour connaître le format dans lequel sera fournie la réponse (pour son traitement). + * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'. + * + * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000. + * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité. + * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique + * le long duquel le profil doit être calculé. + * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis, + * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis). + * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points). + * + * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS). + * Par défaut, on utilise l'API REST. + * + * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'. + * Vaut 'false' par défaut. + * + * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul. + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * positions : [{lon:, lat:}, {lon:, lat:}], + * outputFormat : 'json' // json|xml + * sampling : 3, + * api : 'REST', // REST|WPS + * zonly : false // false|true, + * resource : "resource-par-defaut" + * }; + * + */ +function Alti(options) { + if (!(this instanceof Alti)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Alti")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "Alti"; + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Alti"); + this.logger.trace("[Constructeur Alti (options)]"); + + // ##################### + // analyse des options + // ##################### + + if (!options.positions) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "positions")); + } + if (options.positions.length === 0) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "positions")); + } + + // ajout des options spécifiques au service + this.options.positions = options.positions; + + // format de réponse du service : "json" ou "xml" (valeur par défaut), en minuscule ! + this.options.outputFormat = typeof options.outputFormat === "string" ? options.outputFormat.toLowerCase() : "xml"; + + // ressource utilisée pour le calcul altimétrique + this.options.resource = options.resource || "rge_alti_corse2a_float32_zip_lamb93"; + + // sampling + this.options.sampling = options.sampling || null; + + // type d'api utilisé pour requeter le service, en majuscule ! + this.options.api = typeof options.api === "string" ? options.api.toUpperCase() : "REST"; + + // l'api ne peut être interrogée qu'en GET. + if (this.options.api === "REST") { + this.options.httpMethod = "GET"; + } + + // param. zonly + this.options.zonly = options.zonly || false; + + // param. measures + this.options.measures = options.measures || false; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat) + // ainsi que sur le type de service (profil ou elevation) + if (!this.options.serverUrl) { + // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti + /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl(); + if (this.options.oldAltiService) { + lstUrlByDefault = DefaultUrlService.Alti.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti + var lstUrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Alti.url(); + 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(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_UNKNOWN", "api")); + } + if (!urlFound) { + throw new Error("Url by default not found !"); + } + this.options.serverUrl = urlFound; + this.logger.trace("Server URL by default : " + this.options.serverUrl); + } + + // gestion du type de service + // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat) + var idx = this.options.serverUrl.lastIndexOf("."); + if (idx !== -1) { + var extension = this.options.serverUrl.substring(idx + 1); + if (extension && extension.length < 5) { + // FIXME extension de moins de 4 car. ... + this.logger.trace("Server Extension URL : " + extension); + 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) !"); + } + } + } +} + +/** + * @lends module:Alti# + */ +Alti.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { + // todo + // getter/setter +}); + +/** + * Constructeur (alias) + */ +Alti.prototype.constructor = Alti; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Alti.prototype.buildRequest = function (error, success) { + // utilisation en mode callback + var options = { + httpMethod: this.options.httpMethod, + // callback + onSuccess: function onSuccess(result) { + // sauvegarde de la requete ! + this.request = result; + success.call(this, this.request); + }, + onError: error, + scope: this, + // spécifique au service : + resource: this.options.resource, + positions: this.options.positions, + outputFormat: this.options.outputFormat, + sampling: this.options.sampling, + api: this.options.api, + zonly: this.options.zonly, + measures: this.options.measures + }; + _Request_AltiRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); +}; + +/** + * Analyse de la reponse (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Alti.prototype.analyzeResponse = function (error, success) { + // INFO + // Factory pour masquer la complexité du retour du service qui renvoie soit + // - une 'string' qui contient du XML ou JSON natif en mode XHR + // - un objet JSON qui est natif ou encapsulé + + if (this.response) { + var options = { + response: this.response, + outputFormat: this.options.outputFormat, + // utile pour parser la string en mode XHR : JSON ou XML ! + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + _Response_AltiResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); + } else { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Alti); + +/***/ }), +/* 22 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); +/* harmony import */ var _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23); +/* harmony import */ var _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(27); +/** + * Creation d'une requête en REST ou WPS + * (Factory) + * + * @module AltiRequestFactory + * @alias Gp.Services.Alti.Request.AltiRequestFactory + * @private + */ + + + + +var AltiRequestFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * httpMethod : 'GET', // GET|POST + * onSuccess : function (response) {}, + * onError : function (error) {}, + * scope : this, + * positions : [{lon:, lat:}, {lon:, lat:}], + * outputFormat : 'json' // json|xml + * sampling : 3, + * api : 'REST', // REST|WPS + * zonly : false // false|true + * }; + * + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestFactory"); + logger.trace(["AltiRequestFactory::build()"]); + var request = null; + + // on factorise les options par groupe; + // - global, + // - param, les params pour les data inputs + // - wps, les param du service + // - callback + + var settings = { + // ajout des valeurs par defaut spécifiques au service + type: options.sampling ? "Profil" : "Elevation", + method: options.httpMethod, + param: { + positions: null, + delimiter: null, + // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !? + indent: null, + // par defaut + crs: null, + // par defaut + format: null, + // (only to POST) + sampling: null, + // (only use by Profil) + zonly: null, + // (only use by Elevation) + measures: null // (only use by Elevation) + } + }; + + // surcharge des valeurs obligatoires + settings.param.positions = options.positions; + settings.param.format = options.outputFormat; + settings.param.sampling = options.sampling; + settings.param.zonly = options.zonly; + settings.param.measures = options.measures; + settings.param.resource = options.resource; + + // gestion des callback + var bOnError = !!(options.onError !== null && typeof options.onError === "function"); // cast variable to boolean + var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); + var message = null; + switch (options.api) { + case "REST": + // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! + var myReq = new _AltiRequestREST__WEBPACK_IMPORTED_MODULE_2__["default"](settings); + if (!myReq.processRequestString()) { + message = "Error in process request (rest) !"; + if (bOnError) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); + return; + } + throw new Error(message); + } + request = myReq.requestString; + break; + case "WPS": + // ajout des valeurs par defaut spécifiques au service WPS + settings.wps = { + service: null, + // par defaut + version: null, + // par defaut + identifier: null, + // par defaut + rawdataoutput: null, + // par defaut + request: null // par defaut + }; + + request = _AltiRequestWPS__WEBPACK_IMPORTED_MODULE_3__["default"].build(settings); + if (!request) { + message = "Error in process request (wps) !"; + if (bOnError) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](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 _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); + return; + } + throw new Error(message); + } + if (bOnSuccess) { + options.onSuccess.call(options.scope, request); + } + return request; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiRequestFactory); + +/***/ }), +/* 23 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24); +/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(26); +/* jshint multistr : true */ + + + + + + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service altimetrique. + * + * @todo Le service Alti n'implemente pas le POST !? + * @constructor + * @alias Gp.Services.Alti.Request.AltiRequestREST + * @param {Object} options - options + * @param {Object} options.param.positions - tableau de coordonnées lon/lat + * @param {String} options.param.delimiter - '|' + * @param {Boolean} options.param.indent - false|true + * @param {String} options.param.crs - 'CRS:84' + * @param {String} options.param.sampling - 3 + * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93' + * @param {Boolean} options.param.zonly - false|true + * @param {Boolean} options.param.measures - false|true + * @param {String} options.param.format - "JSON|XML" + * @param {String} options.type - "Profil|Elevation" + * @param {String} options.method - GET|POST + * + * @example + * var options = { + * type : 'Profil', // Elevation + * method : 'GET', // par defaut + * param : { + * positions : [ + * {lon:'1.11', lat:'1.11'}, + * {lon:'1.10', lat:'1.10'}, + * {lon:'1.12', lat:'1.12'} + * ], + * delimiter : ";", // par defaut + * indent : true, // par defaut + * crs : 'EPSG:4326', // par defaut + * format : 'json', // par defaut (only to POST) + * sampling : 3 , // par defaut (only use by Profil) + * zonly : false // par defaut (only use by Elevation) + * measures : false // par defaut (only use by Elevation) + * } + * }; + * + * var result; + * try { + * var obj = new AltiRequestREST (options); + * if (! obj.processRequestString ()) { + * throw new Error("Request empty !?") + * } + * result = obj.requestString; + * } catch (e) { + * // exceptions... + * } + * @private + */ +function AltiRequestREST(options) { + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestREST"); + this.logger.trace("[Constructeur AltiRequestREST ()]"); + if (!(this instanceof AltiRequestREST)) { + throw new TypeError("AltiRequestREST constructor cannot be called as a function."); + } + this.options = options || {}; + + // existance des options + if (!this.options) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); + } + + // type de requete : Altitude ou Profil + // (param. à determiner en fonction des parametres d'entrée) + if (!this.options.type) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); + } + + // construction du modele de requête + // (test du type d'objet candidat) + this.DataObject = null; + switch (this.options.type) { + case "Elevation": + this.DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_2__["default"](this.options.param); + break; + case "Profil": + this.DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_3__["default"](this.options.param); + break; + default: + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)")); + } + + /** + * methode. + * Par defaut, "GET". + */ + this.method = this.options.method || "GET"; +} +AltiRequestREST.prototype = { + /** + * request + * @type {String} + */ + requestString: null, + /** + * Constructeur (alias) + */ + constructor: AltiRequestREST, + /** + * Template de la requête. + */ + template: { + get: { + // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__' + value: "lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__", + input: { + point: "&zonly=__ZONLY__", + profil: "&sampling=__SAMPLING__" + } + }, + post: { + // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\n\ + value: "lon=__LON__\n" + "lat=__LAT__\n" + "indent=__INDENT__\n" + "crs='__CRS__'\n" + "resource='__RESOURCE__'\n" + "measures='__MEASURES__'\n", + input: { + point: "zonly=__ZONLY__\n", + profil: "sampling=__SAMPLING__" + } + } + }, + /** + * Construction de la requête. + * + * @example + * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84' + * // POST out : Not yet supported method POST ! + * @returns {String} + */ + processRequestString: function processRequestString() { + this.logger.trace("AltiRequestREST::processRequestString ()"); + 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()); + // FIXME on retire le param 'delimiter' + // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter); + template = template.replace(/__INDENT__/g, this.DataObject.indent); + template = template.replace(/__CRS__/g, this.DataObject.crs); + template = template.replace(/__RESOURCE__/g, this.DataObject.resource); + template = template.replace(/__MEASURES__/g, this.DataObject.measures); + + // ajout + + template = template + this.__addDataInputs(); + this.logger.trace("traduction tmpl", template); + + // sauvegarde + this.requestString = template; + return this.requestString; + }, + /** + * Ajout de parametres spécifiques (ex. zonly) + * + * @returns {String} + */ + __addDataInputs: function __addDataInputs() { + this.logger.trace("AltiRequestREST::addDataInput ()"); + 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.toString()); + } 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 !?"); + } + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiRequestREST); + +/***/ }), +/* 24 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); + + + +/** + * @classdesc + * + * Classe de gestion des param. des requêtes de type POINT du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiElevationRequest + * @param {Object} options - options + * @param {Boolean} options.zonly - false|true + * + * @private + */ +function AltiElevationRequest(options) { + if (!(this instanceof AltiElevationRequest)) { + throw new TypeError("AltiElevationRequest constructor cannot be called as a function."); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "AltiElevationRequest"; + + // appel du constructeur par heritage + _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments); + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur AltiElevationRequest ()]"); + + /** + * Z uniquement. + * true|false + */ + this.zonly = this.options.zonly || false; // test des options héritées ! +} + +/** + * @lends module:AltiElevationRequest# + */ + +AltiElevationRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, { + /** + * Setter/getter pour "zonly" + */ + zonly: { + /** getter */ + get: function get() { + return this._zonly; + }, + /** setter */ + set: function set(z) { + this._zonly = z; + } + } +}); + +/** + * Constructeur (alias) + */ +AltiElevationRequest.prototype.constructor = AltiElevationRequest; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} + */ +AltiElevationRequest.prototype.getData = function () { + // par glop..., appel de AltiRequest::getData () ! + var map = []; + map.push({ + k: "lon", + v: this.getLon() + }); + map.push({ + k: "lat", + v: this.getLat() + }); + // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" + 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 + }); + map.push({ + k: "resource", + v: this.resource + }); + return map; +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiElevationRequest); + +/***/ }), +/* 25 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); + + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiRequest + * @param {Object} options - options + * @param {Object} options.positions - tableau de coordonnées lon/lat + * @param {String} options.delimiter - "|" + * @param {Boolean} options.indent - false|true + * @param {String} options.crs - "CRS:84" + * @param {String} options.format - "JSON|XML" + * + * @private + */ +function AltiRequest(options) { + if (!(this instanceof AltiRequest)) { + throw new TypeError("AltiRequest constructor cannot be called as a function."); + } + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur AltiRequest ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + /** + * Liste des coordonnées. + * @example + * var c = [{lon : "", lat : ""}, {lon : "", lat : ""}]; + */ + this.positions = this.options.positions || []; + + /** + * Caractère de séparation. + * Par defaut, "|". + */ + this.delimiter = this.options.delimiter || "|"; + + /** + * Indentation. + * true|false + */ + this.indent = this.options.indent || false; + + /** + * Projection. + * Par defaut, CRS:84. + */ + this.crs = this.options.crs || "CRS:84"; + + /** + * format de sortie. + * Par defaut, "json". + */ + this.format = this.options.format || "json"; + + /* + * Ressource utilisée + */ + this.resource = this.options.resource; + + /** + * Réponse détaillée (source & accuracy) + * true|false + */ + this.measures = this.options.measures || false; +} + +/** + * CLASSNAME + */ +AltiRequest.CLASSNAME = "AltiRequest"; +AltiRequest.prototype = { + /** + * @lends module:AltiRequest# + */ + + /** + * Constructeur (alias) + */ + constructor: AltiRequest, + /** + * Ajout d"une liste de coordonnées. + * + * @param {Object[]} lstPosition - liste de positions + * @example + * obj.setPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); + */ + setPositions: function setPositions(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; + }, + /** + * Liste des coordonnées. + * + * @param {Int} pos - position + * @returns {positions} + * @example + * obj.getPositions (); // [{lon : "", lat : ""}, {lon : "", lat : ""}] + * obj.getPositions (0); // [{lon : "", lat : ""}] + */ + getPositions: function getPositions(pos) { + // FIXME test if not a number !? + if (!pos) { + return this.positions; + } + var index = this.positions.length - 1; + if (pos > index || pos < index) { + this.logger.warn("index out of range !"); + return this.positions; + } + return this.positions[pos]; + }, + /** + * Ajout d"une liste de coordonnées. + * + * @param {Object[]} lstPosition - liste de positions + * @example + * obj.addPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); + */ + addPositions: function addPositions(lstPosition) { + for (var i = 0; i < lstPosition.length; i++) { + var o = lstPosition[i]; + if (o.lon && o.lat) { + this.positions.push(lstPosition[i]); + } + } + }, + /** + * Retourne la liste des longitudes avec un caractère de séparation. + * + * @returns {String} - une liste de longitudes + * @example + * // out : 0.2367|2.1570|43.789|... + */ + getLon: function getLon() { + var lstLon = []; + for (var i = 0; i < this.positions.length; i++) { + lstLon.push(this.positions[i].lon); + } + this.logger.trace(lstLon); + return lstLon.join(this.delimiter); + }, + /** + * Retourne la liste des lattitudes avec un caractère de séparation. + * + * @returns {String} - une liste de lattitudes + * @example + * // out : 0.2367|2.1570|43.789|... + */ + getLat: function getLat() { + var lstLat = []; + for (var i = 0; i < this.positions.length; i++) { + lstLat.push(this.positions[i].lat); + } + this.logger.trace(lstLat); + return lstLat.join(this.delimiter); + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} + */ +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; +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiRequest); + +/***/ }), +/* 26 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _AltiRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); + + + +/** + * @classdesc + * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiProfilRequest + * @param {Object} options - options + * @param {String} options.sampling - 3 + * + * @private + */ +function AltiProfilRequest(options) { + if (!(this instanceof AltiProfilRequest)) { + throw new TypeError("AltiProfilRequest constructor cannot be called as a function."); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "AltiProfilRequest"; + + // appel du constructeur par heritage + _AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].apply(this, arguments); + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur AltiProfilRequest ()]"); + + /** + * Sampling + * Par defaut, 3 + */ + this.sampling = this.options.sampling || 3; // test des options héritées ! +} + +/** + * @lends module:AltiProfilRequest# + */ + +AltiProfilRequest.prototype = Object.create(_AltiRequest__WEBPACK_IMPORTED_MODULE_1__["default"].prototype, { + /** + * Setter/getter pour "sampling" + */ + sampling: { + /** getter */ + get: function get() { + return this._sampling; + }, + /** setter */ + set: function set(value) { + this._sampling = value; + } + } +}); + +/** + * Constructeur (alias) + */ +AltiProfilRequest.prototype.constructor = AltiProfilRequest; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} + */ +AltiProfilRequest.prototype.getData = function () { + // par glop..., appel de AltiRequest::getData () ! + var map = []; + map.push({ + k: "lon", + v: this.getLon() + }); + map.push({ + k: "lat", + v: this.getLat() + }); + // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" + 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 + }); + map.push({ + k: "resource", + v: this.resource + }); + return map; +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiProfilRequest); + +/***/ }), +/* 27 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28); +/* harmony import */ var _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); +/* harmony import */ var _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26); +/** + * Classe d'interface des requêtes de type WPS sur le service altimetrique. + * (Factory) + * + * @module Gp.Services.Alti.Request.AltiRequestWPS + * @alias Gp.Services.Alti.Request.AltiRequestWPS + * @private + */ + + + + + +var AltiRequestWPS = { + /** + * Interface unique de construction de la requête. + * + * @method build + * @param {Object} options - options + * @param {Object} options.param.positions - tableau de coordonnées lon/lat + * @param {String} options.param.delimiter - '|' + * @param {Boolean} options.param.indent - false|true + * @param {String} options.param.crs - 'CRS:84' + * @param {String} options.param.sampling - 3 + * @param {Boolean} options.param.zonly - false|true + * @param {String} options.param.format - "JSON|XML" (only to POST) + * @param {String} options.wps.service - "WPS" + * @param {String} options.wps.version - "1.0.0" + * @param {String} options.wps.identifier - "gs:WPSElevation|gs:WPSLineElevation" + * @param {String} options.wps.rawdataoutput - "result" + * @param {String} options.wps.request - "Execute" + * @param {String} options.type - "Profil|Elevation" + * @param {String} options.method - GET|POST + * @example + * var options = { + * type : 'Profil', // Elevation + * method : 'GET', // par defaut + * param : { + * positions : [ + * {lon:'1.11', lat:'1.11'}, + * {lon:'1.10', lat:'1.10'}, + * {lon:'1.12', lat:'1.12'} + * ], + * delimiter : ";", // par defaut + * indent : true, // par defaut + * crs : 'EPSG:4326', // par defaut + * format : 'json', // par defaut (only to POST) + * sampling : 3 , // par defaut (only use by Profil) + * zonly : false, // par defaut (only use by Elevation) + * }, + * wps : { + * service : 'WPS', // par defaut + * version : '1.0.0', // par defaut + * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation + * rawdataoutput : 'result',// par defaut + * request : 'Execute' // par defaut + * } + * }; + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiRequestWPS"); + logger.trace(["AltiRequestWPS::build()"]); + + // existance des options + if (!options) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); + } + + // type de requete : Altitude ou Profil + // (param. à determiner en fonction des parametres d'entrée) + if (!options.type) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); + } + + // construction du modele de requête + // (test du type d'objet candidat) + var DataObject = null; + switch (options.type) { + case "Elevation": + // surcharge + options.wps.identifier = "gs:WPSElevation"; + DataObject = new _model_AltiElevationRequest__WEBPACK_IMPORTED_MODULE_3__["default"](options.param); + break; + case "Profil": + // surcharge + options.wps.identifier = "gs:WPSLineElevation"; + DataObject = new _model_AltiProfilRequest__WEBPACK_IMPORTED_MODULE_4__["default"](options.param); + break; + default: + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "type (Elevation or Profil)")); + } + + // construction de la requête WPS + var settings = { + data: DataObject, + method: options.method, + param: options.wps + }; + var rqstWPS = new _Formats_WPS__WEBPACK_IMPORTED_MODULE_2__["default"](settings); + if (!rqstWPS.processRequestString()) { + throw new Error("Enable to process request !"); + } + return rqstWPS.requestString; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiRequestWPS); + +/***/ }), +/* 28 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); + + +/** + * @classdesc + * Standard WPS + * + * @constructor + * @alias Gp.Formats.WPS + * @param {Object} options - options + * @param {Object} options.data - objet + * @param {String} options.method - POST|GET + * @param {String} options.param.service - "WPS" + * @param {String} options.param.version - "1.0.0" + * @param {String} options.param.identifier - "gs:WPSElevation|gs:WPSLineElevation" + * @param {String} options.param.rawdataoutput - "result" + * @param {String} options.param.request - "Execute" + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * @private + */ +function WPS(options) { + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur WPS()]"); + if (!(this instanceof WPS)) { + throw new TypeError("WPS constructor cannot be called as a function."); + } + this.options = options || {}; + + /** + * Objet DATA + */ + this.DataObject = this.options.data; + if (!this.DataObject) { + throw new TypeError("This data object is not defined !"); + } + + /** + * param service. + * Par defaut, "WPS". + */ + this.paramservice = this.options.param.service || "WPS"; + + /** + * param version. + * Par defaut, "1.0.0". + */ + this.paramversion = this.options.param.version || "1.0.0"; + + /** + * param identifier + * Par defaut, "gs:WPS" + */ + this.paramidentifier = this.options.param.identifier || "gs:WPS"; + + /** + * param rawdataoutput + * Par defaut, "result". + */ + this.paramrawdataoutput = this.options.param.rawdataoutput || "result"; + + /** + * param request + * Par defaut, "Execute". + */ + this.paramrequest = this.options.param.request || "Execute"; + + /** + * methode. + * Par defaut, "GET". + */ + this.method = this.options.method || "GET"; +} +WPS.prototype = { + /** + * @lends module:WPS# + */ + + /** + * request + * @type {String} + */ + requestString: null, + /** + * Constructeur (alias) + */ + constructor: WPS, + /** + * Template de la requête. + */ + template: { + get: { + value: "service=__SERVICE__" + "&version=__VERSION__" + "&rawdataoutput=__RAWDATAOUTPUT__" + "&identifier=__IDENTIFIER__" + "&request=__REQUEST__" + "&datainputs=", + input: "__KEY__=__DATA__" + }, + post: { + value: "" + "" + "__IDENTIFIER__" + "" + "" + "" + "" + "" + "__RAWDATAOUTPUT__" + "" + "" + "", + input: "" + "__KEY__" + "" + "__DATA__" + "" + "" + } + }, + /** + * Namespace par defaut de la requete POST. + * + * @returns {String} namespace + */ + namespaceByDefault: function namespaceByDefault() { + 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(" "); + }, + /** + * Schemalocation par defaut. + * + * @returns {String} schemaLocation + */ + schemaLocationByDefault: function schemaLocationByDefault() { + return "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\""; + }, + /** + * Construction de la requête. + * + * @example + * // GET out : + * // service=__SERVICE__ + * // &version=__VERSION__ + * // &rawdataoutput=__RAWDATAOUTPUT__ + * // &identifier=__IDENTIFIER__ + * // &request=__REQUEST__ + * // &datainputs="__DATAINPUTS__" + * // avec __DATAINPUTS__ = __KEY__=__DATA__;... + * + * // POST out : + * // + * // + * // __IDENTIFIER__ + * // + * // + * // + * // + * // + * // __RAWDATAOUTPUT__ + * // + * // + * // ", + * // avec __DATAINPUTS__ + * // + * // __KEY__ + * // + * // __DATA__ + * // + * // + * + * @returns {Boolean} validation de la construction de la requete + */ + processRequestString: function processRequestString() { + this.logger.trace("WPS::processRequestString ()"); + var template = ""; + if (this.method === "POST") { + template = this.template.post.value; + } else if (this.method === "GET") { + template = this.template.get.value; + } else { + this.logger.error("No other method supported by the service !"); + 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); + + // ajout + + if (this.method === "POST") { + template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); + template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); + } + + // ajout des datainputs + template = template.replace(//g, this.__addDataInputs()); + if (!template) { + this.logger.warn("traduction tmpl : empty request !?"); + return false; + } + this.requestString = template; + this.logger.trace("traduction tmpl", template); + return true; + }, + /** + * Ajout des données + * + * @returns {String} Données concaténées dans une chaine + */ + __addDataInputs: function __addDataInputs() { + this.logger.trace("WPS::__addDataInputs ()"); + + // c'est un peu grossier... + 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++) { + // FIXME closure ? + (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; + }, + /** + * Ajout d'une donnée. + * + * @param {String} tmpl - template + * @param {String} key - clef + * @param {String} data - valeur + * @returns {String} chaine avec les substitutions clef/valeur + */ + __addDataInput: function __addDataInput(tmpl, key, data) { + var tmp = tmpl; + tmp = tmp.replace(/__KEY__/g, key); + tmp = tmp.replace(/__DATA__/g, data); + return tmp; + }, + /** + * Definir le mode de requête + * + * @param {String} method - GET|POST + */ + setMethod: function setMethod(method) { + if (method === "GET" || method === "POST") { + this.method = method; + } else { + this.logger.warn("support only GET and POST method !"); + } + }, + /** + * Retourne le mode de requete (GET|POST). + * + * @returns {AltiRequest.options.mode|String} methode (GET|POST) + */ + getMethod: function getMethod() { + return this.method; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (WPS); + +/***/ }), +/* 29 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _Formats_XML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(30); +/* harmony import */ var _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(31); +/* harmony import */ var _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(32); +/* harmony import */ var _model_Elevation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(33); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module AltiResponseFactory + * @private + * @alias Gp.Services.Alti.Response.AltiResponseFactory + */ + + + + + + + +var AltiResponseFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AltiResponseFactory"); + logger.trace(["AltiResponseFactory::build()"]); + var data = null; + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + switch (options.outputFormat) { + case "xml": + logger.trace("analyze response : xml"); + try { + var p = new _Formats_XML__WEBPACK_IMPORTED_MODULE_3__["default"]({ + reader: _Formats_AltiResponseReader__WEBPACK_IMPORTED_MODULE_4__["default"] + }); + if (typeof options.response === "string") { + p.setXMLString(options.response); + } else { + p.setXMLDoc(options.response); + } + data = p.parse(); + if (!data) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2")); + } + } catch (e) { + var message = e.message; + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", message), + status: 200, + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR + })); + return; + } + break; + case "json": + logger.trace("analyze response : json"); + logger.trace("analyze response : ", _typeof(options.response)); + var JSONResponse = null; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // le service renvoie t il une erreur ? + if (JSONResponse && JSONResponse.error) { + // ex. {"error": {"code": "BAD_PARAMETER","description": "The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180)."}} + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), + status: 200, + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR + })); + return; + } + + // analyse de la reponse + if (JSONResponse) { + var elevations = JSONResponse.elevations; + var altiResponse = new _model_AltiResponse__WEBPACK_IMPORTED_MODULE_5__["default"](); + var elevation; + if (Array.isArray(elevations) && elevations.length) { + for (var i = 0; i < elevations.length; i++) { + elevation = new _model_Elevation__WEBPACK_IMPORTED_MODULE_6__["default"](); + if (_typeof(elevations[i]) === "object") { + // elevations[i] est un objet elevation + 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; + } + if (elevations[i].measures) { + elevation.measures = elevations[i].measures; + } + } else if (typeof elevations[i] === "number") { + // elevations[i] est un nombre, dans le cas de zonly=true notamment + elevation.z = elevations[i]; + } + if (Array.isArray(altiResponse.elevations)) { + altiResponse.elevations.push(elevation); + } + } + } + data = altiResponse; + } + if (!data) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, + status: -1 + })); + return; + } + break; + default: + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_2"), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, + status: -1 + })); + return; + } + + // Si la réponse contenait une exception renvoyée par le service + if (data.exceptionReport) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, + status: 200 + })); + return; + } else if (data.error) { + var errorMess = data.error.description; + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", errorMess), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + options.onSuccess.call(options.scope, data); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiResponseFactory); + +/***/ }), +/* 30 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* global require */ + + +// import __xmldom from "xmldom"; + +/** + * @classdesc + * + * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM, + * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques. + * + * @constructor + * @alias Gp.Formats.XML + * + * @param {Object} [options] - options du format XML + * + * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) + * utile pour interpréter le XML lorsque sa structure est connue. + * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. + * + * @param {Object} [options.writers] - writers + * + * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter. + * + * @private + */ +function XML(options) { + if (!(this instanceof XML)) { + throw new TypeError("XML constructor cannot be called as a function."); + } + + // FIXME : notion de singleton + + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur XML ()]"); + + /** + * Chaîne de caractères contenant le texte XML + * @type {String} + */ + this.xmlString = null; + + /** + * DOM Element correspondant à la structure du XML. + * @type {DOMElement} + */ + this.xmlDoc = null; + + /** + * Objet contenant des fonctions de lecture des différentes balises XML. + * @type {Object} + */ + this.reader = null; + + // traitement des paramètres d'options s'il y en a + if (options) { + if (options.xmlString && typeof options.xmlString === "string") { + this.xmlString = options.xmlString; + // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document + this.xmlDoc = __getXMLDOC(options.xmlString); + } + if (options.reader) { + this.setReader(options.reader); + } + } +} +XML.prototype = { + /** + * @lends module:XML + */ + + /* + * Constructeur (alias) + */ + constructor: XML, + /** + * Méthode permettant de récupérer la chaîne de caractères associée au format XML + * + * @returns {String} xmlString - la chaîne de caractères correspondant au format XML + */ + getXMLString: function getXMLString() { + return this.xmlString; + }, + /** + * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString). + * La méthode va aussi transformer cette chaîne de caractères en document XML, + * afin de remplir l'attribut xmlDoc. + * + * @param {String} xmlString - la chaîne de caractères correspondant au format XML + */ + setXMLString: function setXMLString(xmlString) { + if (xmlString && typeof xmlString === "string") { + this.xmlString = xmlString; + this.xmlDoc = __getXMLDOC(xmlString); + } + }, + /** + * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis + * + * @return {Object} readers - les readers associés au format XML, s'ils existent, + * sous forme d'une collection de fonctions + */ + getReader: function getReader() { + return this.reader; + }, + /** + * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data), + * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)). + * + * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) + * utile pour interpréter le XML lorsque sa structure est connue. + * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. + */ + setReader: function setReader(reader) { + if (reader && reader.read && typeof reader.read === "function") { + this.reader = reader; + } + }, + /** + * Méthode permettant de récupérer le document XML associé au format, s'il existe. + * + * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe + */ + getXMLDoc: function getXMLDoc() { + return this.xmlDoc; + }, + /** + * Setter + */ + setXMLDoc: function setXMLDoc(doc) { + this.xmlDoc = doc; + }, + /** + * Méthode initialisant la lecture du XML, à partir d'un XML Document : + * création d'un objet JavaScript contenant les informations du XML, + * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide). + * + * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML : + * - soit toutes les informations si aucun reader n'a été spécifié à la création du format + * - soit les informations spécifiées dans le reader. + */ + parse: function parse() { + // build xml document from xmlString + if (!this.xmlDoc && this.xmlString) { + this.xmlDoc = __getXMLDOC(this.xmlString); + } + if (this.xmlDoc) { + var root = __getRootNode(this.xmlDoc); + if (root) { + var parserOutput; + // call reader if exists + if (this.reader && this.reader.read) { + parserOutput = this.reader.read(root); + } else { + parserOutput = {}; + parserOutput[root.nodeName] = __readDefault(root); + } + return parserOutput; + } else { + return {}; + } + } + } +}; + +/** + * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML, + * en utilisant DOMParser () lorsque c'est possible. + * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface + * + * @private + * @memberof XML + * @method __getXMLDOC + * @param {String} xmlString - xml string to be converted into DOM element + * @return {DOMElement} - the corresponding XML Document + */ +function __getXMLDOC(xmlString) { + if (typeof window === "undefined") { + // env. nodejs + var DOMParser = __webpack_require__(15).DOMParser; // __xmldom.DOMParser; + return new DOMParser().parseFromString(xmlString, "text/xml"); + } else { + // env. browser + + var parser; + var xmlDoc; + var errorMsg = "Erreur lors du parsing de la réponse du service : XML non conforme"; + if (window.ActiveXObject) { + // Internet Explorer < 9 + 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) { + // les autres (Chrome, Mozilla, IE >= 9) + parser = new window.DOMParser(); + try { + xmlDoc = parser.parseFromString(xmlString, "text/xml"); + } catch (e) { + // Internet Explorer browser raises exception if xmlString is not valid XML + if (e.message === "SyntaxError") { + throw new Error(errorMsg); + } else { + throw new Error("Erreur lors du parsing de la réponse du service : " + e.message); + } + } + // look for parsing error in case no exception was raised + if (xmlDoc.getElementsByTagName("parsererror").length > 0) { + var parsererror = xmlDoc.getElementsByTagName("parsererror"); + for (var i = 0; i < parsererror.length; i++) { + var content = parsererror[i].innerHTML; + // except in case parsererror is just because of huge xml, but parsing is done. + if (content.indexOf("Huge input lookup") === -1) { + errorMsg += "(" + content + ")"; + throw new Error(errorMsg); + } + } + } else if (!xmlDoc.documentElement) { + // may happen in chrome browser + throw new Error(errorMsg); + } + return xmlDoc; + } else { + // FIXME + throw new Error("Incompatible DOM Parser pour ce navigateur !"); + } + } +} + +/** + * Méthode de la classe (privée) permettant de récupérer le noeud racine du document, + * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode) + * + * @private + * @memberof XML + * @method __getRootNode + * @param {DOMElement} [xmlDoc] - a Document Node + * @return {DOMElement} root - the document root node + */ +function __getRootNode(xmlDoc) { + var root; + if (xmlDoc.nodeType === 9) { + // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree) + root = xmlDoc.documentElement; + } else if (xmlDoc.nodeType === 1) { + root = xmlDoc; + } + return root; +} + +/** + * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML, + * lorsqu'aucun reader spécifique n'a été spécifié (parser brut) + * + * @private + * @memberof XML + * @method readDefault + * @param {DOMElement} node - a DOM element node + * @example final data object looks like : + * data = { + * attributeName: attributeValue, + * childName: { + * attributeName: attributeValue, + * attributeName: attributeValue, + * childName: { + * "textContent": textContent + * }, + * childName: { + * childName: { + * attributeName:attributeValue + * } + * } + * } + * } + */ +function __readDefault(node) { + var data = {}; + + // if element node has attributes, set their values to data + if (node.attributes.length > 0) { + var dataAttributes = __getAttributes(node); + data["attributes"] = dataAttributes; + } + + // if element node has childNodes, read them and set them to data + 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) { + // TEXT_NODE + data["textContent"] = child.nodeValue; + } else if (child.nodeType === 1) { + childData = __readDefault(child); + if (!data[child.nodeName]) { + // store childData in an object + data[child.nodeName] = childData; + } else { + // in case several childNodes has the same name : store them in an array. + // if data[nodeName] already exists but is not an array + if (!Array.isArray(data[child.nodeName])) { + var old = data[child.nodeName]; + data[child.nodeName] = []; + data[child.nodeName].push(old); + } + data[child.nodeName].push(childData); + } + } + // TODO : manage other node types (4=CDATA, etc) + } + } + + return data; +} + +/** + * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément + * + * @private + * @memberof XML + * @method __getAttributes + * @param {DOMElement} node - noeud contenant l'attribut recherché + * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs + */ +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; + } +} +/* harmony default export */ __webpack_exports__["default"] = (XML); + +/***/ }), +/* 31 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); +/* harmony import */ var _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33); +/* harmony import */ var _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34); +/** + * Fonction retournant un objet contenant des clés de lecture (readers) + * qui permettent de parser des réponses XML du service Altimétrique du Géoportail + * (calcul altimétrique simple ou profil altimétrique d'une courbe), + * lorsque le paramètre output = xml, + * afin de récupérer les élévations retournées. + * + * @module AltiResponseReader + * @alias Gp.Services.Alti.Formats.AltiResponseReader + * @private + */ + +// import Logger from "../../../Utils/LoggerByDefault"; + + + + +/** + * + * Objet AltiResponseReader + * + * @member {Object} AltiResponseReader + * + * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" + * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire + * et la valeur associée est une fonction (node, data) + * où node est un noeud du document DOM + * et data est un objet où l'on stocke les informations lues dans le XML. + * + * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud "elevations" de la réponse XML + * du service alti, correspondant logiquement à la racine du document + * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) + * + * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud "elevation" de la réponse xml du service alti. + * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc) + * + * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti. + * (contient une valeur de latitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti. + * (contient une valeur de longitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti. + * (contient une valeur d'altitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud "measures" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud "source_name" de la réponse xml du service alti. + * (pour remplir l'éventuel objet measure) + * + * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud "source_mesure" de la réponse xml du service alti. + * (pour remplir l'éventuel objet measure) + * + * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. + * + * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti. + * + * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, + * à l'aide des readers de la classe. + * + */ +var AltiResponseReader = {}; +AltiResponseReader.READERS = { + /** + * Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document + * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) + * + * @param {DOMElement} root - racine de la réponse XML + * @static + * @memberof AltiResponseReader + * @returns {Object} Retourne un objet de type AltiResponse + */ + elevations: function elevations(root) { + // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir. + var altiResponse = new _Response_model_AltiResponse__WEBPACK_IMPORTED_MODULE_0__["default"](); + 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; + }, + /** + * Lecture d'un noeud "elevation" de la réponse xml du service alti. + * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures) + * + * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures]) + * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse + * @static + * @memberof AltiResponseReader + */ + elevation: function elevation(node) { + var elevation = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"](); + 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]) { + // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. + AltiResponseReader.READERS[child.nodeName](child, elevation); + } + } + } + return elevation; + }, + /** + * Lecture d'un noeud "lat" de la réponse xml du service alti. + * (contient une valeur de latitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la latitude + * @param {Object} elevation - objet dans lequel stocker la latitude retournée + * @static + * @memberof AltiResponseReader + */ + lat: function lat(node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + elevation.lat = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "lon" de la réponse xml du service alti. + * (contient une valeur de longitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la longitude + * @param {Object} elevation - objet dans lequel stocker la longitude retournée + * @static + * @memberof AltiResponseReader + */ + lon: function lon(node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + elevation.lon = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "z" de la réponse xml du service alti. + * (contient une valeur d'altitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer l'altitude + * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure + * @static + * @memberof AltiResponseReader + */ + z: function z(node, elevationObject) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + if (elevationObject) { + elevationObject.z = parseFloat(textNode.nodeValue); + } else { + elevationObject = new _Response_model_Elevation__WEBPACK_IMPORTED_MODULE_1__["default"](); + elevationObject.z = parseFloat(textNode.nodeValue); + return elevationObject; + } + } else { + throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "acc" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure + * @static + * @memberof AltiResponseReader + */ + acc: function acc(node, elevationObject) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + elevationObject.acc = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "source_name" de la réponse xml du service alti. + * (contient le nom de la source, qui est un string) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} measure - objet dans lequel stocker le nom de la source retourné + * @static + * @memberof AltiResponseReader + */ + source_name: function source_name(node, measure) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + measure.source_name = textNode.nodeValue; + } else { + throw new Error("Erreur dans la lecture de la réponse du service : source_name attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "source_measure" de la réponse xml du service alti. + * (contient le nom de la mesure, qui est un string) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} measure - objet dans lequel stocker le nom de la source retourné + * @static + * @memberof AltiResponseReader + */ + source_measure: function source_measure(node, measure) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + measure.source_measure = textNode.nodeValue; + } else { + throw new Error("Erreur dans la lecture de la réponse du service : source_measure attendue mais absente"); + } + }, + /** + * Lecture d'un noeud "measures" et de ses enfants "measure" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} elevation - objet dans lequel stocker la précision retournée + * @static + * @memberof AltiResponseReader + */ + measures: function measures(node, elevation) { + elevation.measures = []; + var measure; + if (node.hasChildNodes()) { + var children = node.childNodes; + var measureNode; + var measureChildren; + for (var i = 0; i < children.length; i++) { + measure = new _Response_model_Measure__WEBPACK_IMPORTED_MODULE_2__["default"](); + measureNode = children[i]; + measureChildren = measureNode.childNodes; + for (var j = 0; j < measureChildren.length; j++) { + if (AltiResponseReader.READERS[measureChildren[j].nodeName]) { + // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. + AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : measures attendues mais absentes"); + } + } + elevation.measures.push(measure); + } + } + }, + /** + * Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} exceptionReport - objet contenant l'exception + * @static + * @memberof AltiResponseReader + */ + exceptionreport: function exceptionreport(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; + }, + /** + * Lecture d'un noeud "Exception" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs : + * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception + * {String} exceptionReport.exception - qui contient le message de l'exception + * @static + * @memberof AltiResponseReader + */ + exception: function exception(node) { + var exceptionReport = {}; + + // get exception code + var exceptionCode = node.getAttribute("exceptionCode"); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + + // get exception message + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + exceptionReport.exception = textNode.nodeValue; + } + return exceptionReport; + }, + /** + * Lecture d'un noeud "Error" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} error - objet contenant l'exception + * @static + */ + error: function error(node) { + var response = { + error: {} + }; + // get error code and description + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + var textNode; + // get error code + if (child.nodeType === 1 && child.nodeName === "code") { + // 1 === node.ELEMENT_NODE + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + response.error.code = textNode.nodeValue; + } + } + // get error description + if (child.nodeType === 1 && child.nodeName === "description") { + // 1 === node.ELEMENT_NODE + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { + // 3 === node.TEXT_NODE + response.error.description = textNode.nodeValue; + } + } + } + } + return response; + } +}; + +/** + * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, + * à l'aide des readers de la classe. + * + * @method AltiResponseReader.read + * @param {DOMElement} root - racine de la réponse XML à lire + * @static + * @memberof AltiResponseReader + */ +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."); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiResponseReader); + +/***/ }), +/* 32 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} elevations - Elevations array. + * + * @namespace + * @alias Gp.Services.AltiResponse + */ +function AltiResponse() { + if (!(this instanceof AltiResponse)) { + throw new TypeError("AltiResponse constructor cannot be called as a function."); + } + this.elevations = []; +} +AltiResponse.prototype = { + constructor: AltiResponse +}; +/* harmony default export */ __webpack_exports__["default"] = (AltiResponse); + +/***/ }), +/* 33 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if "zonly" parameter wasn't set to true. + * + * @property {Float} lat - Point latitude. (only if zonly=false) + * @property {Float} lon - Point longitude. (only if zonly=false) + * @property {Float} z - Point elevation. + * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) + * + * @namespace + * @alias Gp.Services.Alti.Elevation + */ +function Elevation() { + if (!(this instanceof Elevation)) { + throw new TypeError("Elevation constructor cannot be called as a function."); + } + this.z = null; +} +Elevation.prototype = { + constructor: Elevation +}; +/* harmony default export */ __webpack_exports__["default"] = (Elevation); + +/***/ }), +/* 34 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Single measure object returned by underlying web service if measures = true and zonly = false + * + * @property {String} source_name - Name of the source + * @property {String} source_measure - Name of the measure + * @property {Float} z - Point elevation. + * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) + * + * @namespace + * @alias Gp.Services.Alti.Measure + */ +function Measure() { + if (!(this instanceof Measure)) { + throw new TypeError("Measure constructor cannot be called as a function."); + } + this.source_name = null; + this.source_measure = null; + this.z = null; + this.acc = null; +} +Measure.prototype = { + constructor: Measure +}; +/* harmony default export */ __webpack_exports__["default"] = (Measure); + +/***/ }), +/* 35 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36); +/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } + + + + + + + + +/** + * @classdesc + * Appel du service de géocodage direct du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Geocode + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée. + * + * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après. + * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme + * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. + * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : + * "postalCode", "inseeCode", "city". + * Il permet également de filtrer les toponymes avec les propriétés : + * "postalCode", "inseeCode", "type". + * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : + * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * + * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. + * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' + * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. + * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, index = 'StreetAddress'. + * + * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. + * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. + * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. + * + * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. + * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20. + * + * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. + * false par défaut. + * + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * proxyURL : null, + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * position : {lon:, lat:}, + * index : 'StreetAddress', + * query : '10 rue du pont Machin-ville' + * (...) + * }; + */ +function Geocode(options_) { + if (!(this instanceof Geocode)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Geocode")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "Geocode"; + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Geocode"); + this.logger.trace("[Constructeur Geocode (options)]"); + var options = this.patchOptionConvertor(options_); + if (!options.serverUrl) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Geocode.newUrl(); + if (options.oldGeocodeService) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Geocode.url(); + } + } + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, [options]); + if (!options.hasOwnProperty("query")) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "query")); + } + + // ajout des options spécifiques au service + this.options.query = options.query; + + // on definit l'index par defaut + if (!options.index) { + this.options.index = options.index = "StreetAddress"; + } + if (options.filters) { + var filter = Object.keys(options.filters); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + // on supprime les filtres vides + if (typeof options.filters[key] === "undefined" || _typeof(options.filters[key]) === "object" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === "string" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) { + delete this.options.filters[key]; + } + } + } + this.options.index = options.index || "StreetAddress"; + this.options.maximumResponses = options.maximumResponses || 20; +} + +/** + * @lends module:Geocode# + */ +Geocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +Geocode.prototype.constructor = Geocode; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +Geocode.prototype.patchOptionConvertor = function (options_) { + var options = options_; + if (options.hasOwnProperty("location")) { + this.logger.warn("The parameter 'location' is deprecated"); + if (!options.query) { + options.query = options.location; + } + delete options.location; + } + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + if (!options.filters) { + options.filters = options.filterOptions; + if (options.filters.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.index) { + if (Array.isArray(options.filters.type) && options.filters.type.length > 0) { + options.index = options.filters.type[0]; + } else { + options.index = options.filters.type; + } + } + delete options.filters.type; + } + if (options.filters.bbox) { + this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); + delete options.filters.bbox; + } + } + delete options.filterOptions; + } + if (options.position) { + if (options.position.x) { + this.logger.warn("The parameter 'position.x' is deprecated"); + if (!options.position.lon) { + options.position.lon = options.position.x; + } + delete options.position.x; + } + if (options.position.y) { + this.logger.warn("The parameter 'position.y' is deprecated"); + if (!options.position.lat) { + options.position.lat = options.position.y; + } + delete options.position.y; + } + } + if (options.returnFreeForm) { + this.logger.warn("The parameter 'returnFreeForm' is deprecated"); + delete options.returnFreeForm; + } + if (options.srs) { + this.logger.warn("The parameter 'srs' is deprecated"); + delete options.srs; + } + return options; +}; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Geocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod: this.options.httpMethod, + // options specifiques du service + geocodeMethod: "search", + query: this.options.query, + index: this.options.index, + returnTrueGeometry: this.options.returnTrueGeometry, + position: this.options.position, + maxResp: this.options.maximumResponses, + filters: this.options.filters + }; + this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); + + // on teste si la requete a bien été construite ! + !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); +}; + +/** + * Analyse de la reponse (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Geocode.prototype.analyzeResponse = function (error, success) { + /* INFO : + Etape 1 : Création de la requête (URL) + -> stockage de la requête dans this.request + Etape 2 : Envoi de la requête + -> appel du protocol XHR, et envoi (par ex send ()) + -> récupération de la réponse JSON dans la fonction onSuccess () (this.response) + -> si code HTTP 200 et pas de message d'erreur : etape 3 + -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur + Etape 3 : Analyse de la réponse JSON (si rawResponse === false ) + -> appel du parser pour récupérer le document + Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse : + -> JSON (si rawResponse === true) + -> ou geocodedLocations + */ + + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); + } else { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Geocode); + +/***/ }), +/* 36 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(37); + + + +/** + * Creation d'une requête + * (Factory) + * + * @module GeocodeRequestFactory + * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory + * @private + */ +var GeocodeRequestFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Geocode + * + * @example + * var options = { + * // options specifiques du service + * geocodeMethod: + * query: + * filters: + * maximumResponses: + * }; + * var result = GeocodeRequestFactory.build(options); + * if (!result) { + * // error... + * } + * @returns {String} request + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("GeocodeRequestFactory"); + logger.trace(["GeocodeRequestFactory::build()"]); + var settings = options || {}; + var myReq = new _GeocodeRequestREST__WEBPACK_IMPORTED_MODULE_1__["default"](settings); + if (!myReq.processRequestString()) { + throw new Error("Error process request (rest) !"); + } + var request = myReq.requestString; + logger.trace(request); + return request; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodeRequestFactory); + +/***/ }), +/* 37 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(38); + + + + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire + * (uniquement en GET) + * + * @constructor + * @alias Gp.Services.Geocode.Request.GeocodeRequestREST + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * (...) + * }; + * + * @private + */ +function GeocodeRequestREST(options) { + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("GeocodeRequestREST"); + this.logger.trace("[Constructeur GeocodeRequestREST ()]"); + if (!(this instanceof GeocodeRequestREST)) { + throw new TypeError("GeocodeRequestREST constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); + } + + /** liste des options */ + this.settings = options; +} +GeocodeRequestREST.prototype = { + /** + * @lends module:GeocodeRequestREST# + */ + + /** + * request + * @type {String} + */ + requestString: null, + /** + * Constructeur (alias) + */ + constructor: GeocodeRequestREST, + /** + * Construction de la requête. + * + * @returns {String} request + */ + processRequestString: function processRequestString() { + var request = ""; + + // Mapping des options avec le service de l'API REST + var oParams = new _model_GeocodeParamREST__WEBPACK_IMPORTED_MODULE_2__["default"](this.settings); + var params = oParams.getParams(); + for (var i = 0; i < params.length; i++) { + var o = params[i]; + if (request) { + request += "&"; + } + request += o.k + "=" + o.v; + } + if (!this.settings.geocodeMethod || this.settings.geocodeMethod !== "search" && this.settings.geocodeMethod !== "reverse") { + throw new Error("Error geocodeMethod not valid"); + } + this.requestString = "?" + request; + this.logger.trace(this.requestString); + return this.requestString; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodeRequestREST); + +/***/ }), +/* 38 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); + + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). + * Permet le mapping avec les options du service. + * @constructor + * @alias Gp.Services.Route.Request.RouteParamREST + * @param {Object} options - options + * + * @private + */ +function GeocodeParamREST(options) { + if (!(this instanceof GeocodeParamREST)) { + throw new TypeError("GeocodeParamREST constructor cannot be called as a function."); + } + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur GeocodeParamREST ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // methode de geocodage + if (!this.options.geocodeMethod || this.options.geocodeMethod !== "search" && this.options.geocodeMethod !== "reverse") { + throw new Error("Error geocodeMethod not valid"); + } + this.geocodeMethod = this.options.geocodeMethod; + + // mapping des options avec l'API REST + this.query = typeof this.options !== "undefined" ? this.options.query : null; + this.searchGeometry = this.options.searchGeometry || null; + this.index = this.options.index || null; + this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null; + this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null; + this.maxResp = this.options.maxResp || null; + this.returnTrueGeometry = this.options.returnTrueGeometry || null; + this.filters = this.options.filters || {}; +} + +/** + * CLASSNAME + */ +GeocodeParamREST.CLASSNAME = "GeocodeParamREST"; +GeocodeParamREST.prototype = { + /** + * @lends module:GeocodeParamREST# + */ + + /** + * Constructeur (alias) + */ + constructor: GeocodeParamREST, + /** + * Retourne les filtres + * @returns {String} les filtres + */ + getFilters: function getFilters() { + var filters = {}; + for (var prop in this.filters) { + if (this.filters.hasOwnProperty(prop)) { + filters[prop] = this.filters[prop]; + } + } + return filters; + }, + /** + * Retourne l'index + * @returns {String} l'index + */ + getIndex: function getIndex() { + if (this.index === undefined) { + return null; + } + if (this.index === "StreetAddress") { + return "address"; + } else if (this.index === "CadastralParcel") { + return "parcel"; + } else if (this.index === "PositionOfInterest") { + return "poi"; + } else if (this.index === "location") { + return "location"; + } + return this.index; + }, + /** + * Retourne la géométrie de recherche + * @returns {String} la géométrie de recherche au format json + */ + getSearchGeometry: function getSearchGeometry() { + return JSON.stringify(this.searchGeometry); + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} liste de paramêtres + */ +GeocodeParamREST.prototype.getParams = function () { + var map = []; + if (this.geocodeMethod === "search") { + map.push({ + k: "q", + v: this.query + }); + } + if (this.index) { + map.push({ + k: "index", + v: this.getIndex() + }); + } + if (this.geocodeMethod === "reverse" && this.searchGeometry) { + map.push({ + k: "searchgeom", + v: this.getSearchGeometry() + }); + } + if (this.lon && this.lat) { + map.push({ + k: "lon", + v: this.lon + }); + map.push({ + k: "lat", + v: this.lat + }); + } + if (this.maxResp) { + map.push({ + k: "limit", + v: this.maxResp + }); + } + if (this.returnTrueGeometry) { + map.push({ + k: "returntruegeometry", + v: this.returnTrueGeometry + }); + } + var filters = this.getFilters(); + for (var key in filters) { + map.push({ + k: key, + v: filters[key] + }); + } + return map; +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodeParamREST); + +/***/ }), +/* 39 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(17); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(40); +/** + * Factory pour générer une reponse JSON à partir d'un XML + * (Factory) + * + * @module GeocodeResponseFactory + * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory + * @private + */ +// import Logger from "../../../Utils/LoggerByDefault"; + + + +var GeocodeReponseFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Geocode + * + * @example + * var options = { + * response : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build: function build(options) { + // data de type GeocodeResponse + var data = null; + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + try { + var parser = new _Formats_GeocodeResponseParser__WEBPACK_IMPORTED_MODULE_2__["default"](); + data = parser.parse(options.response); + 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 _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", message), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_UNKERR, + status: -1 + })); + return; + } + + // Si la réponse contenait une exception renvoyée par le service + if (data.exceptionReport) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR, + status: 200 // FIXME : 200 ? + })); + + return; + } + } + } else { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_0__["default"].TYPE_SRVERR, + status: -1 // FIXME : status response + })); + + return; + } + options.onSuccess.call(options.scope, data); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodeReponseFactory); + +/***/ }), +/* 40 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); +/* harmony import */ var _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41); +/* harmony import */ var _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42); +// import Logger from "../../../Utils/LoggerByDefault"; + + + + + +/** + * Fonction retournant un objet contenant des clés de lecture (readers) + * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail + * afin de récupérer les résultats retournés. + * @module GeocodeResponseParser + * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser + * @private + */ + +/** + * @classdesc + * + * Classe permettant de parser une réponse GeoJSON + * + * @constructor + * @alias Gp.Formats.GeocodeResponseParser + * + * @private + */ +function GeocodeResponseParser() { + if (!(this instanceof GeocodeResponseParser)) { + throw new TypeError("GeocodeResponseParser constructor cannot be called as a function."); + } +} +GeocodeResponseParser.prototype = { + /** + * @lends module:GeocodeResponseParser + */ + + /* + * Constructeur (alias) + */ + constructor: GeocodeResponseParser, + /** + * Méthode permettant de lancer la lecture d'une réponse GeoJSON, + * + * @param {String} json - réponse au format GeoJSON + * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON, + * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception. + */ + parse: function parse(json) { + var geocodeResponse = new _Response_model_GeocodeResponse__WEBPACK_IMPORTED_MODULE_2__["default"](); + var obj = JSON.parse(json); + if (obj.type === "FeatureCollection") { + for (var i = 0; i < obj.features.length; ++i) { + _parseFeature(obj.features[i], geocodeResponse); + } + } else if (obj.type === "Feature") { + _parseFeature(obj, geocodeResponse); + } else if (obj.type === "SERVICE_ERROR") { + return _parseError(obj); + } else { + var mess = _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_0__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", obj.type); + throw new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"]({ + message: mess, + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"].TYPE_UNKERR, + status: 200 + }); + } + return geocodeResponse; + } +}; + +/** + * Méthode permettant de parser un feature + * + * @private + * + * @param {Object} feature + * @param {Object} geocodeResponse + * + * @memberof GeocodeResponseParser + * @return {Object} objet GeocodedLocation + */ +function _parseFeature(feature, geocodeResponse) { + var location = new _Response_model_GeocodedLocation__WEBPACK_IMPORTED_MODULE_3__["default"](); + if (feature.geometry && feature.geometry.type === "Point") { + location.position = { + lon: feature.geometry.coordinates[0], + lat: feature.geometry.coordinates[1] + }; + } + if (feature.properties) { + for (var prop in feature.properties) { + if (prop === "_score") { + location.accuracy = feature.properties[prop]; + } else if (prop === "_type") { + if (feature.properties[prop] === "address") { + location.type = "StreetAddress"; + } else if (feature.properties[prop] === "poi") { + location.type = "PositionOfInterest"; + } else if (feature.properties[prop] === "parcel") { + location.type = "CadastralParcel"; + } + } else { + location.placeAttributes[prop] = feature.properties[prop]; + } + } + if (feature.properties._type === "address") { + location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? "street number" : "street"; + } + } + geocodeResponse.locations.push(location); +} + +/** + * Méthode permettant de parser une erreur + * + * @private + * + * @param {Object} error + * + * @memberof GeocodeResponseParser + * @return {Object} + */ +function _parseError(error) { + return { + exceptionReport: error + }; +} +/* harmony default export */ __webpack_exports__["default"] = (GeocodeResponseParser); + +/***/ }), +/* 41 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} locations - locations array. + * + * @namespace + * @alias Gp.Services.GeocodeResponse + */ +function GeocodeResponse() { + if (!(this instanceof GeocodeResponse)) { + throw new TypeError("GeocodeResponse constructor cannot be called as a function."); + } + this.locations = []; +} +GeocodeResponse.prototype = { + constructor: GeocodeResponse +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodeResponse); + +/***/ }), +/* 42 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Single location object returned by the underlying geocoding web service. + * + * @property {Gp.Point} position - Position of the location given in the requested coordinates system. + * @property {String} type - location type "StreetAddress" (for an address), "PositionOfInterest" (for a place name) or "CadastralParcel" (for cadastral parcel). + * @property {String} matchType - how geocoding is performed : "street number" (exact address), "street enhanced" (street number calculated by interpolation), "street" (only the street), "city" (only the city). + * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match). + * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service : + * + * *Common attributes : * + * + * - **trueGeometry** - the 'real life' geometry if different from 'Point' type. + * + * *if type === "StreetAddress" :* + * + * - **number** - Street number. + * - **postalCode** - PostCode + * - **street** - Street name + * - **city** - City + * - **houseNumberInfos** - additional street number information + * - **inseeCode** - INSEE Code + * + * + * *if type === "PositionOfInterest" :* + * + * - **type** - Place name type + * - **postalCode** - PostCode + * - **toponyme** - Toponyme + * - **extraFields** - additional place name properties + * - **inseeCode** - INSEE Code + * + * + * *si type = "CadastralParcel" :* + * + * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. "000" otherwise. + * - **codeArrondissement** - arrondissement + * - **identifiant** - cadastral parcel code + * - **feuille** - Parcel Sheet (eg. "1"). + * - **numero** - Parcel Number (eg. "0041") + * - **section** - Parcel Section (eg. "0D"). + * - **nomCommune** - Parcel municipality name. + * - **codeCommune** - Parcel municipality. + * - **codeDepartement** - Parcel Department. + * + * @namespace + * @alias Gp.Services.Geocode.GeocodedLocation + */ +function GeocodedLocation() { + if (!(this instanceof GeocodedLocation)) { + throw new TypeError("GeocodedLocation constructor cannot be called as a function."); + } + this.position = null; + this.matchType = null; + this.placeAttributes = {}; + this.type = null; + this.accuracy = null; + + /** + * Nom de la classe : "GeocodedLocation" + * @type {String} + */ + this.CLASSNAME = "GeocodedLocation"; +} +GeocodedLocation.prototype = { + constructor: GeocodedLocation +}; +/* harmony default export */ __webpack_exports__["default"] = (GeocodedLocation); + +/***/ }), +/* 43 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36); +/* harmony import */ var _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } + + + + + + + + +/** + * @classdesc + * Appel du service de géocodage inverse du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.ReverseGeocode + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. + * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. + * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. + * + * @param {Object} [options.filters] - Les propriétés possibles de cet objet. + * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme + * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. + * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : + * "postalCode", "inseeCode", "city". + * Il permet également de filtrer les toponymes avec les propriétés : + * "postalCode", "inseeCode", "type". + * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : + * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * + * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche. + * Les propriétés possibles de cet objet sont décrites ci-après. + * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon) + * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie. + * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'. + * + * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. + * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' + * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche + * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, index = 'StreetAddress'. + * + * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s. + * + * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. + * false par défaut. + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * proxyURL : null, + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * index : 'StreetAddress', + * searchGeometry : { + * type : Circle, + * coordinates : [48, 2], + * radius : 100 + * }, + * position : {lon:2 , lat:48.5}, + * maximumResponses : 25, + * }; + * + */ +function ReverseGeocode(options_) { + if (!(this instanceof ReverseGeocode)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ReverseGeocode")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "ReverseGeocode"; + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ReverseGeocode"); + this.logger.trace("[Constructeur ReverseGeocode (options)]"); + var options = this.patchOptionConvertor(options_); + if (!options.serverUrl) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ReverseGeocode.newUrl(); + if (options.oldReverseService) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ReverseGeocode.url(); + } + } + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, [options]); + if (!options.searchGeometry) { + if (!options.position) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "searchGeometry")); + } + } else { + this.options.searchGeometry = options.searchGeometry; + } + + // on definit l'index par defaut + if (!options.index) { + this.options.index = options.index = "StreetAddress"; + } + if (options.filters) { + var filter = Object.keys(options.filters); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + // on supprime les filtres vides + if (typeof options.filters[key] === "undefined" || _typeof(options.filters[key]) === "object" && Object.keys(options.filters[key]).length === 0 || typeof options.filters[key] === "string" && options.filters[key].length === 0 || Array.isArray(options.filters[key]) && options.filters[key].length === 0) { + delete this.options.filters[key]; + } + } + } + this.options.position = options.position; + this.options.index = options.index || "StreetAddress"; + this.options.maximumResponses = options.maximumResponses || 20; +} + +/** + * @lends module:ReverseGeocode# + */ +ReverseGeocode.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +ReverseGeocode.prototype.constructor = ReverseGeocode; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +ReverseGeocode.prototype.patchOptionConvertor = function (options_) { + var options = options_; + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + if (options.filterOptions.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.index) { + if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) { + options.index = options.filterOptions.type[0]; + } else { + options.index = options.filterOptions.type; + } + } + delete options.filterOptions.type; + } + if (options.filterOptions.bbox) { + this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.bbox2Json(options.filterOptions.bbox); + } + delete options.filterOptions.bbox; + } + if (options.filterOptions.circle) { + this.logger.warn("The parameter 'filterOptions.circle' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.circle2Json(options.filterOptions.circle); + } + delete options.filterOptions.circle; + } + if (options.filterOptions.polygon) { + this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.polygon2Json(options.filterOptions.polygon); + } + delete options.filterOptions.polygon; + } + if (!options.filters && Object.keys(options.filterOptions).length > 0) { + options.filters = options.filterOptions; + } + delete options.filterOptions; + } + if (options.position) { + if (options.position.x) { + this.logger.warn("The parameter 'position.x' is deprecated"); + if (!options.position.lon) { + options.position.lon = options.position.x; + } + delete options.position.x; + } + if (options.position.y) { + this.logger.warn("The parameter 'position.y' is deprecated"); + if (!options.position.lat) { + options.position.lat = options.position.y; + } + delete options.position.y; + } + } + if (options.srs) { + this.logger.warn("The parameter 'srs' is deprecated"); + delete options.srs; + } + return options; +}; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +ReverseGeocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod: this.options.httpMethod, + // options specifiques du service + geocodeMethod: "reverse", + searchGeometry: this.options.searchGeometry, + index: this.options.index, + position: this.options.position, + returnTrueGeometry: this.options.returnTrueGeometry, + maxResp: this.options.maximumResponses, + filters: this.options.filters + }; + this.request = _Request_GeocodeRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); + + // on teste si la requete a bien été construite ! + !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +ReverseGeocode.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this + }; + _Response_GeocodeResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); + } else { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Array} bbox - bbox + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.bbox2Json = function (bbox) { + return { + type: "Polygon", + coordinates: [[[bbox.left, bbox.top], [bbox.right, bbox.top], [bbox.right, bbox.bottom], [bbox.left, bbox.bottom], [bbox.left, bbox.top]]] + }; +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} circle - circle + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.circle2Json = function (circle) { + return { + type: "Circle", + radius: circle.radius, + coordinates: [circle.x, circle.y] + }; +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Array} polygon - polygon + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.polygon2Json = function (polygon) { + var jsonGeom = { + type: "Polygon", + coordinates: [[]] + }; + for (var i = 0; i < polygon.length; ++i) { + jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]); + } + return jsonGeom; +}; + +/** + * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées. + */ +ReverseGeocode.geoEPSG = ["EPSG:4326"]; +/* harmony default export */ __webpack_exports__["default"] = (ReverseGeocode); + +/***/ }), +/* 44 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); +/* harmony import */ var _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6); +/* harmony import */ var _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(17); + + + + + + + + +/** + * @classdesc + * Appel du service d'autocomplétion du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.AutoComplete + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.text - La chaîne de caractère à compléter. + * Cette chaîne n'est pas "URL encodée". + * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête. + * + * @param {Array.} [options.type = ["StreetAddress"]] - Type de l'objet recherché. + * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, type = ['StreetAddress']. + * + * @param {String} [options.territory] - Limitation de la zone de recherche de localisants. + * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE', + * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31' + * Pas de valeur par défaut. + * La valeur par défaut est donc celle du service. + * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié. + * + * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. + * La valeur par défaut sera donc celle du service : 10. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * text : "", + * type : "StreetAddress", + * territory : 'METROPOLE', + * maximumResponses : 10 + * }; + */ +function AutoComplete(options_) { + if (!(this instanceof AutoComplete)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("CLASS_CONSTRUCTOR", "AutoComplete")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "AutoComplete"; + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_3__["default"].getLogger("Gp.Services.AutoComplete"); + this.logger.trace("[Constructeur AutoComplete (options)]"); + var options = this.patchOptionConvertor(options_); + if (!options.serverUrl) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"].AutoComplete.newUrl(); + if (options.oldAutocompleteService) { + options.serverUrl = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_1__["default"].AutoComplete.url(); + } + } + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].apply(this, arguments); + if (!options.text) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("PARAM_MISSING", "text")); + } + + // ajout des options spécifiques au service + this.options.text = options.text; + + // on definit des parametres par defaut + if (!options.type) { + options.type = ["StreetAddress,PositionOfInterest"]; + } + this.options.type = options.type; + this.options.territory = options.territory || ""; + this.options.maximumResponses = options.maximumResponses || 10; + + // INFO + // le service ne repond pas en mode POST (405 Method Not Allowed) + if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") { + this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"); + this.options.httpMethod = "GET"; // on surcharge ! + } + + // attributs d'instances + + /** + * Format forcé de la réponse du service : "json" + * sauf si l'on souhaite une reponse brute (options.rawResponse) + */ + this.options.outputFormat = this.options.rawResponse ? "" : "json"; +} + +/** + * @lends module:AutoComplete# + */ + +AutoComplete.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_0__["default"].prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +AutoComplete.prototype.constructor = AutoComplete; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +AutoComplete.prototype.patchOptionConvertor = function (options_) { + var options = options_; + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + if (options.filterOptions.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.type) { + options.type = options.filterOptions.type; + } + } + if (options.filterOptions.territory) { + this.logger.warn("The parameter 'filterOptions.territory' is deprecated"); + if (!options.terr) { + options.terr = options.filterOptions.territory; + } + } + delete options.filterOptions; + } + return options; +}; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +AutoComplete.prototype.buildRequest = function (error, success) { + // ex. + // http://wxs.ign.fr/CLEF/ols/apis/completion? + // text=Brie-Comt& + // type=StreetAddress,PositionOfInterest& + // territory=METROPOLE& + // maximumResponses=10 + + // traitement des param KPV sous forme de tableau + var territory = ""; + if (this.options.territory) { + territory = this.options.territory; + } + var type = ""; + if (this.options.type) { + type = this.options.type.join(","); + } + + // normalisation de la requete avec param KPV + this.request = _Utils_Helper__WEBPACK_IMPORTED_MODULE_5__["default"].normalyzeParameters({ + text: encodeURIComponent(this.options.text), + type: type, + terr: territory, + maximumResponses: this.options.maximumResponses + }); + !this.request ? error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback de succès de l'analyse de la réponse + */ +AutoComplete.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response: this.response, + rawResponse: this.options.rawResponse, + onSuccess: success, + onError: error, + scope: this + }; + _Response_AutoCompleteResponseFactory__WEBPACK_IMPORTED_MODULE_2__["default"].build(options); + } else { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_6__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_4__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AutoComplete); + +/***/ }), +/* 45 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46); +/* harmony import */ var _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(47); +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module AutoCompleteResponseFactory + * @private + * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory + */ + + + + + +var AutoCompleteResponseFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("AutoCompleteResponseFactory"); + logger.trace(["AutoCompleteResponseFactory::build()"]); + var data = null; + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + var JSONResponse = null; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // analyse de la réponse + if (JSONResponse) { + // le service renvoie t il une erreur ? + if (JSONResponse.error) { + // ex. ? + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), + status: JSONResponse.error.code, + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR + })); + return; + } + + // création de l'objet réponse + data = new _model_AutoCompleteResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); + + // boucle sur les résultats de l'autocomplétion + if (JSONResponse.results && Array.isArray(JSONResponse.results)) { + var suggestedLocation = null; + for (var i = 0; i < JSONResponse.results.length; i++) { + var result = JSONResponse.results[i]; + suggestedLocation = new _model_SuggestedLocation__WEBPACK_IMPORTED_MODULE_4__["default"](); + if (result) { + if (result.country === "StreetAddress") { + suggestedLocation.street = result.street; + suggestedLocation.type = "StreetAddress"; + } else if (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; + } + // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation + data.suggestedLocations.push(suggestedLocation); + } + } else { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3"))); + return; + } + if (!data.suggestedLocations.length) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_FORMAT_3"))); + return; + } + } + if (!data) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE_2"), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_UNKERR, + status: -1 + })); + return; + } + + // Si la réponse contenait une exception renvoyée par le service + if (data.exceptionReport) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + // si la réponse (xmlString) est vide, on appelle le callback d'erreur + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + + // si tout s'est bien passé, on appelle le callback de succès + options.onSuccess.call(options.scope, data); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponseFactory); + +/***/ }), +/* 46 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} suggestedLocations - SuggestedLocations array. + * + * @namespace + * @alias Gp.Services.AutoCompleteResponse + */ +function AutoCompleteResponse() { + if (!(this instanceof AutoCompleteResponse)) { + throw new TypeError("AutoCompleteResponse constructor cannot be called as a function."); + } + this.suggestedLocations = []; +} +AutoCompleteResponse.prototype = { + constructor: AutoCompleteResponse +}; +/* harmony default export */ __webpack_exports__["default"] = (AutoCompleteResponse); + +/***/ }), +/* 47 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Single SuggestedLocation Object returned by underlying web service. + * Each suggested location represents a street address ("StreetAddress") or a place name ("PositionOfInterest"). + * + * @property {String} type - Suggested location type : "StreetAddress" ou "PositionOfInterest" + * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system. + * @property {String} commune - Suggested municipality + * @property {String} fullText - Full text representation of the suggested location. + * @property {String} postalCode - Suggested location postcode + * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). + * @property {String} street - Street name of the suggested location ("StreetAddress" only). + * @property {String} kind - Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). + * + * @namespace + * @alias Gp.Services.AutoComplete.SuggestedLocation + */ +function SuggestedLocation() { + if (!(this instanceof SuggestedLocation)) { + throw new TypeError("SuggestedLocation constructor cannot be called as a function."); + } + + /* REPONSE : + { + "status" : "OK", + "results" : [ + { + "country":"PositionOfInterest", + "x":-1.559185, + "y":47.952603, + "city":"Brie", + "zipcode":"35150", + "street":"corbe", + "kind":"Lieu-dit habité", + "fulltext":"corbe, 35150 Brie", + "classification":6 + }, + { + "country":"StreetAddress", + "x":1.538295, + "y":43.19646, + "city":"Brie", + "zipcode":"09700", + "street":"courreste", + "kind":"", + "fulltext":"courreste, 09700 Brie", + "classification":7 + } + ] + } + */ + + /* REPONSE EN ERREUR + { + status : "ERROR", + results : [ ] + } + */ + + /** + * Suggested location type : "StreetAddress" ou "PositionOfInterest" + * @type {String} + */ + this.type = null; + + /** + * Position of the suggested location given in requested coordinates system. + * @type {Gp.Point} + */ + this.position = { + x: null, + y: null + }; + + /** + * Suggested municipality + * @type {String} + */ + this.commune = null; + + /** + * Full text representation of the suggested location. + * @type {String} + */ + this.fullText = null; + + /** + * Suggested location postcode + * @type {Number} + */ + this.postalCode = null; + + /** + * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). + * @type {Integer} + */ + this.classification = null; + + /** + * Street name of the suggested location ("StreetAddress" only). + * @type {String} + */ + this.street = null; + + /** + * Place name of the suggested location ("PositionOfInterest" only). + * @type {String} + */ + this.poi = null; + + /** + * Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). + * @type {String} + */ + this.kind = null; +} +SuggestedLocation.prototype = { + constructor: SuggestedLocation +}; +/* harmony default export */ __webpack_exports__["default"] = (SuggestedLocation); + +/***/ }), +/* 48 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(49); +/* harmony import */ var _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(52); + + + + + + + + +/** + * @classdesc + * Appel du service d'itinéraire du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * + * @alias Gp.Services.Route + * @constructor + * @extends {Gp.Services.CommonService} + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. + * + * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut. + * + * @param {String} [options.routePreference = "fastest"] - Mode de calcul à utiliser : + * - le plus rapide « fastest » + * - le plus court « shortest » + * Par défaut : « fastest ». + * + * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire. + * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire. + * + * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire. + * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire. + * + * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau. + * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float} + * + * @param {String} [options.graph = "voiture"] - Type de graphe utilisé : "Voiture" ou "Pieton". + * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non. + * Par défaut, c'est la valeur "Voiture" qui sera utilisée. + * + * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre "avoidFeature" d'OpenLS) + * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte + * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). + * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints + * + * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". + * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". + * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". + * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". + * + * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions. + * (correspond au paramètre "provideGeometry" d'OpenLS) Par défaut : false. + * + * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse. + * Par défaut : true. + * + * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse. + * Par défaut : m. + * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard. + * Les valeurs possibles sont "standard", "second", "minute" ou "hour". + * Par défaut : "standard". + * + * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés. + * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'. + * + * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'XHR', + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * resource : 'bdtopo' + * outputFormat : 'json', + * startPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * endPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * provideBbox : true, + * exclusions : ["Bridge", "Tunnel", "Toll"], + * distanceUnit : "km", + * graph : "Voiture", + * geometryInInstructions : true, + * routePreference : "fastest" + * }; + * + */ +function Route(options) { + if (!(this instanceof Route)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "Route")); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "Route"; + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.Route"); + this.logger.trace("[Constructeur Route (options)]"); + if (!options.startPoint) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint")); + } + + // on lance une exception afin d'eviter au service de le faire... + if (options.startPoint.x === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.x")); + } + if (options.startPoint.y === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "startPoint.y")); + } + if (!options.endPoint) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint")); + } + + // on lance une exception afin d'eviter au service de le faire... + if (options.endPoint.x === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.x")); + } + if (options.endPoint.y === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "endPoint.y")); + } + + // options par defaut + + // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. + if (options.outputFormat && options.outputFormat !== "json") { + this.logger.warn("options.outputFormat could only be json"); + } + this.options.outputFormat = "json"; + this.options.resource = options.resource || "bdtopo-osrm"; + this.options.startPoint = options.startPoint; + this.options.endPoint = options.endPoint; + this.options.viaPoints = options.viaPoints || []; + this.options.routePreference = options.routePreference || "fastest"; + /** Gestion des anciennes valeurs de graph */ + if (options.graph) { + if (options.graph === "Voiture") { + this.options.graph = "car"; + } + if (options.graph === "Pieton") { + this.options.graph = "pedestrian"; + } + } else { + this.options.graph = "car"; + } + this.options.constraints = []; + if (options.constraints) { + if (Array.isArray(options.constraints)) { + for (var k = 0; k < options.constraints.length; k++) { + this.options.constraints.push(options.constraints[k]); + } + } else { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "constraints")); + } + } + + /** Gestion de l'ancien paramètre exclusion */ + var constraintTunnel = {}; + var constraintPont = {}; + var constraintAutoroute = {}; + if (options.exclusions) { + if (options.exclusions.length !== 0) { + this.logger.warn("options.exclusions is DEPRECATED !!"); + for (var c = 0; c < options.exclusions.length; c++) { + if (typeof options.exclusions[c] === "string") { + options.exclusions[c] = options.exclusions[c].toLowerCase(); + } else { + // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions + continue; + } + if (options.exclusions[c] === "toll") { + constraintAutoroute.constraintType = "banned"; + constraintAutoroute.key = "wayType"; + constraintAutoroute.operator = "="; + constraintAutoroute.value = "autoroute"; + this.options.constraints.push(constraintAutoroute); + } + if (options.exclusions[c] === "tunnel") { + constraintTunnel.constraintType = "banned"; + constraintTunnel.key = "wayType"; + constraintTunnel.operator = "="; + constraintTunnel.value = "tunnel"; + this.options.constraints.push(constraintTunnel); + } + if (options.exclusions[c] === "bridge") { + constraintPont.constraintType = "banned"; + constraintPont.key = "wayType"; + constraintPont.operator = "="; + constraintPont.value = "pont"; + this.options.constraints.push(constraintPont); + } + } + } + } + this.options.geometryInInstructions = options.geometryInInstructions || false; + this.options.provideBbox = options.provideBbox || true; + this.options.distanceUnit = options.distanceUnit || "m"; + this.options.timeUnit = options.timeUnit || "second"; + this.options.expectedStartTime = null; // FIXME not yet implemented ! + this.options.srs = options.srs || "EPSG:4326"; + this.options.waysAttributes = options.waysAttributes || []; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + if (!this.options.serverUrl) { + // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire + /* var UrlByDefault = DefaultUrlService.Route.newUrl(); + if (this.options.oldRouteService) { + UrlByDefault = DefaultUrlService.Route.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire + var UrlByDefault = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].Route.url(); + if (!UrlByDefault) { + throw new Error("Url by default not found !"); + } + this.options.serverUrl = UrlByDefault; + this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); + } +} + +/** + * @lends module:Route# + */ +Route.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +Route.prototype.constructor = Route; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Route.prototype.buildRequest = function (error, success) { + var options = { + // spécifique au service + resource: this.options.resource, + startPoint: this.options.startPoint, + endPoint: this.options.endPoint, + viaPoints: this.options.viaPoints, + provideBbox: this.options.provideBbox, + constraints: this.options.constraints, + distanceUnit: this.options.distanceUnit, + timeUnit: this.options.timeUnit, + graph: this.options.graph, + geometryInInstructions: this.options.geometryInInstructions, + routePreference: this.options.routePreference, + srs: this.options.srs, + waysAttributes: this.options.waysAttributes + }; + this.request = _Request_RouteRequestFactory__WEBPACK_IMPORTED_MODULE_5__["default"].build(options); + + // on teste si la requete a bien été construite ! + if (!this.request) { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD"))); + } else { + success.call(this, this.request); + } +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Route.prototype.analyzeResponse = function (error, success) { + // INFO + // Factory pour masquer la complexité du retour du service + + if (this.response) { + var options = { + distanceUnit: this.options.distanceUnit, + timeUnit: this.options.timeUnit, + response: this.response, + outputFormat: this.options.outputFormat, + // utile pour parser la string en mode XHR : JSON ou XML ! + rawResponse: this.options.rawResponse, + onError: error, + onSuccess: success, + scope: this, + geometryInInstructions: this.options.geometryInInstructions + }; + _Response_RouteResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); + } else { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (Route); + +/***/ }), +/* 49 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); +/* harmony import */ var _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50); + + + + +/** + * Creation d'une requête REST en mode POST ou GET + * (Factory) + * + * @module RouteRequestFactory + * @alias Gp.Services.Route.Request.RouteRequestFactory + * @private + */ +var RouteRequestFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Route + * + * @example + * // utilisation avec les callback + * var options = { + * (...) + * onSuccess : function (response) {}, + * onError : function (error) {}, + * // spécifique au service + * startPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * endPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * provideBbox : false, + * exclusions : ["bridge", "tunnel", "toll"], + * distanceUnit : "km", + * graph : "Voiture", + * geometryInInstructions : false, + * routePreference : "fastest" + * }; + * RouteRequestFactory.build(options); + * + * // utilisation sans callback + * var options = {...}; + * try { + * var result = RouteRequestFactory.build(options); + * if (! result) { throw new Error("..."):} + * } catch (e) { + * // todo + * } + * @returns {String} request + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestFactory"); + logger.trace(["RouteRequestFactory::build()"]); + var request = null; + var settings = options || {}; + + // gestion des callback + var bOnError = !!(options.onError !== null && typeof options.onError === "function"); + var message = null; + + // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! + var myReq = new _RouteRequestREST__WEBPACK_IMPORTED_MODULE_2__["default"](settings); + if (!myReq.processRequestString()) { + message = "Error process request (rest) !"; + if (bOnError) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_1__["default"](message)); + return; + } + throw new Error(message); + } + request = myReq.requestString; + return request; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteRequestFactory); + +/***/ }), +/* 50 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51); + + + + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire + * (uniquement en GET) + * + * @constructor + * @alias Gp.Services.Route.Request.RouteRequestREST + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * (...) + * }; + * + * @private + */ +function RouteRequestREST(options) { + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteRequestREST"); + this.logger.trace("[Constructeur RouteRequestREST ()]"); + if (!(this instanceof RouteRequestREST)) { + throw new TypeError("RouteRequestREST constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); + } + + /** liste des options */ + this.settings = options; +} +RouteRequestREST.prototype = { + /** + * @lends module:RouteRequestREST# + */ + + /** + * request + * @type {String} + */ + requestString: null, + /** + * Constructeur (alias) + */ + constructor: RouteRequestREST, + /** + * Construction de la requête. + * + * @example + * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838 + * // POST out : Not yet supported method POST ! + * @returns {String} request + */ + processRequestString: function processRequestString() { + // INFO + // construction simple sans template..., + // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE ! + this.logger.warn(" PROTOTYPE !"); + + // Mapping des options avec le service de l'API REST + var oParams = new _model_RouteParamREST__WEBPACK_IMPORTED_MODULE_2__["default"](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; + } + + // Exemple : + // http://wxs.ign.fr/KEY/itineraire/rest/route.json? + // origin=& + // destination=& + // waypoints=& + // method=DISTANCE& + // graph=Pieton& + // graphName=Pieton& + // exclusions=& + // tolerance=10& + // srs= + + this.logger.trace(request); + this.requestString = request; + return this.requestString; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteRequestREST); + +/***/ }), +/* 51 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); + + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). + * Permet le mapping avec les options du service. + * @constructor + * @alias Gp.Services.Route.Request.RouteParamREST + * @param {Object} options - options + * + * @private + */ +function RouteParamREST(options) { + if (!(this instanceof RouteParamREST)) { + throw new TypeError("RouteParamREST constructor cannot be called as a function."); + } + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur RouteParamREST ()]"); + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // mapping des options avec l'API REST + + /** Ressource utilisée */ + this.resource = this.options.resource; + + /** Coordonnées du point de départ. */ + this.start = this.options.startPoint.x + "," + this.options.startPoint.y; + + /** Coordonnées du point d’arrivée. */ + this.end = this.options.endPoint.x + "," + this.options.endPoint.y; + + /** Coordonnées des étapes point de départ. */ + this.intermediates = this.options.viaPoints; + + /** Nom du profile à utiliser */ + this.profile = this.options.graph; + + /** projection (code EPSG comme epsg:4326 ou wgs84) */ + this.crs = this.options.srs; + + /** Liste des contraintes */ + this.constraints = this.options.constraints; + + /** Nom de l'optimisation à utiliser */ + this.optimization = this.options.routePreference; + + /** Format de sortie (résumé de l’itinéraire) */ + this.getSteps = this.options.geometryInInstructions ? "true" : "false"; + + /** Unité des distances */ + this.distanceUnit = this.options.distanceUnit; + + /** Unité des durées */ + this.timeUnit = this.options.timeUnit; + + /** Attributs des voies */ + this.waysAttributes = this.options.waysAttributes; +} + +/** + * CLASSNAME + */ +RouteParamREST.CLASSNAME = "RouteParamREST"; +RouteParamREST.prototype = { + /** + * @lends module:RouteParamREST# + */ + + /** + * Constructeur (alias) + */ + constructor: RouteParamREST, + /** + * Retourne une liste de points + * @returns {String} une liste de points (sep '|') + */ + getIntermediates: function getIntermediates() { + var array = []; + if (this.intermediates.length !== 0) { + for (var i = 0; i < this.intermediates.length; i++) { + var obj = this.intermediates[i]; + array.push(obj.x + "," + obj.y); + } + } + return array.join("|"); + }, + /** + * Retourne une liste d'attributs + * @returns {String} une liste d'attributs (sep '|') + */ + getWaysAttributes: function getWaysAttributes() { + return this.waysAttributes.join("|"); + }, + /** + * Retourne un profile + * @returns {String} profile + */ + getProfile: function getProfile() { + return this.profile; + }, + /** + * Retourne un distanceUnit + * @returns {String} distanceUnit + */ + getDistanceUnit: function getDistanceUnit() { + if (this.distanceUnit === "m") { + return "meter"; + } + if (this.distanceUnit === "km") { + return "kilometer"; + } + return ""; + }, + /** + * Retourne une optimisation + * @returns {String} optimization + */ + getOptimization: function getOptimization() { + if (this.optimization) { + return this.optimization; + } else { + return ""; + } + }, + /** + * Retourne la liste des constraints + * @returns {String} une liste des constraints (sep '|') + */ + getConstraints: function getConstraints() { + var constraintArray = []; + if (this.constraints.length !== 0) { + for (var k = 0; k < this.constraints.length; k++) { + constraintArray.push(JSON.stringify(this.constraints[k])); + } + } + return constraintArray.join("|"); + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} liste de paramêtres + */ +RouteParamREST.prototype.getParams = function () { + var map = []; + map.push({ + k: "resource", + v: this.resource + }); + map.push({ + k: "start", + v: this.start + }); + map.push({ + k: "end", + v: this.end + }); + map.push({ + k: "geometryFormat", + v: "geojson" + }); + if (this.optimization) { + map.push({ + k: "optimization", + v: this.getOptimization() + }); + } + if (this.intermediates) { + map.push({ + k: "intermediates", + v: this.getIntermediates() + }); + } + if (this.profile) { + map.push({ + k: "profile", + v: this.getProfile() + }); + } + if (this.constraints) { + map.push({ + k: "constraints", + v: this.getConstraints() + }); + } + if (this.crs) { + map.push({ + k: "crs", + v: this.crs + }); + } + if (this.distanceUnit) { + map.push({ + k: "distanceUnit", + v: this.getDistanceUnit() + }); + } + if (this.timeUnit) { + map.push({ + k: "timeUnit", + v: this.timeUnit + }); + } + if (this.waysAttributes) { + map.push({ + k: "waysAttributes", + v: this.getWaysAttributes() + }); + } + return map; +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteParamREST); + +/***/ }), +/* 52 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(53); +/* harmony import */ var _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(54); + + + + + + +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module RouteResponseFactory + * @alias Gp.Services.Route.Response.RouteResponseFactory + * @private + */ +var RouteResponseFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("RouteResponseFactory"); + logger.trace("RouteResponseFactory::build()"); + var data = null; + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + logger.trace("analyze response : json"); + var JSONResponse; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // construction de l'objet réponse JSON + if (JSONResponse) { + // le service renvoie t il une erreur ? + if (JSONResponse.message) { + // ex. {"message":"message not null", "status":"ERROR"} + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.message))); + return; + } + var legs = []; + var legSteps = []; + var steps = []; + data = new _model_RouteResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); + if (data.hasOwnProperty("totalTime")) { + data.totalTime = parseFloat(JSONResponse.duration); + } + if (data.hasOwnProperty("totalDistance")) { + data.totalDistance = parseFloat(JSONResponse.distance); + } + if (data.hasOwnProperty("bbox")) { + data.bbox.left = parseFloat(JSONResponse.bbox[0]); + data.bbox.bottom = parseFloat(JSONResponse.bbox[1]); + data.bbox.right = parseFloat(JSONResponse.bbox[2]); + data.bbox.top = parseFloat(JSONResponse.bbox[3]); + } + if (data.hasOwnProperty("routeGeometry") && !options.geometryInInstructions) { + data.routeGeometry = JSONResponse.geometry; + } + if (data.hasOwnProperty("routeInstructions") && options.geometryInInstructions) { + var legList = JSONResponse.portions; + var i; + if (Array.isArray(legList) && legList.length) { + for (i = 0; i < legList.length; i++) { + legs.push(legList[i]); + } + } + if (legs.length) { + for (i = 0; i < legs.length; i++) { + legSteps.push(legs[i].steps); + } + } + if (legSteps.length) { + for (i = 0; i < legSteps.length; i++) { + steps = steps.concat(legSteps[i]); + } + } + steps.forEach(function (step) { + data.routeInstructions.push(new _model_RouteInstruction__WEBPACK_IMPORTED_MODULE_4__["default"]()); + data.routeInstructions[data.routeInstructions.length - 1].duration = step.duration; + data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance; + data.routeInstructions[data.routeInstructions.length - 1].code = ""; + data.routeInstructions[data.routeInstructions.length - 1].instruction = ""; + data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry; + + // on ne souhaite pas de ce type de valeur... + if (step.name === "Valeur non renseignée") { + step.name = ""; + } + switch (step.instruction.type) { + case "turn": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Tourner"; + break; + case "new name": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer tout droit"; + break; + case "depart": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Départ"; + break; + case "arrive": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Arrivée"; + break; + case "merge": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Rejoindre"; + break; + case "ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; + break; + case "on ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; + break; + case "off ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la sortie"; + break; + case "fork": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Sur la bifurcation, prendre"; + break; + case "end of road": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "À la fin de la route, prendre"; + break; + case "use lane": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Utiliser la file"; + break; + case "continue": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer"; + break; + case "roundabout": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; + break; + case "rotary": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; + break; + case "roundabout turn": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond point, tourner"; + break; + case "notification": + data.routeInstructions[data.routeInstructions.length - 1].instruction += ""; + break; + default: + data.routeInstructions[data.routeInstructions.length - 1].instruction += "?" + step.instruction.type + "?"; + break; + } + if (step.instruction.modifier) { + switch (step.instruction.modifier) { + case "uturn": + data.routeInstructions[data.routeInstructions.length - 1].instruction = "Faire demi-tour"; + break; + case "sharp right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à droite"; + break; + case "right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " à droite"; + break; + case "slight right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " légèrement à droite"; + break; + case "straight": + data.routeInstructions[data.routeInstructions.length - 1].instruction = "Continuer tout droit"; + break; + case "slight left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " lègèrement à gauche"; + break; + case "left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " à gauche"; + break; + case "sharp left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à gauche"; + break; + default: + data.routeInstructions[data.routeInstructions.length - 1].instruction += " ?" + step.instruction.modifier + "?"; + break; + } + } + if (step.instruction.exit) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += "".concat(step.instruction.exit, "e sortie"); + } + if (step.attributes.name) { + if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += " sur"; + } + if (step.attributes.name.nom_1_droite) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += " ".concat(step.attributes.name.nom_1_droite); + } + if (step.attributes.name.toponyme) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += " ".concat(step.attributes.name.toponyme); + } + } + }); + } + } + if (!data) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", "json"))); + return; + } + + // Si la réponse contenait une exception renvoyée par le service + if (data.exceptionReport) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION_2"))); + return; + } + } + } else { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + options.onSuccess.call(options.scope, data); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteResponseFactory); + +/***/ }), +/* 53 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call. + * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route. + * @property {Array.} routeInstructions - Instructions of the route. + * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to "km" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by " Km" (e.g. : "19.6 Km"). If distanceUnit parameter was set to "m", totalDistance is a string containing the total distance expressed in meters (e.g. : "19599.14"). + * @property {Float} totalTime - Route duration in seconds. + * + * @namespace + * @alias Gp.Services.RouteResponse + */ +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; // FIXME can be null if option 'geometryInInstructions' is true ! + + this.routeInstructions = []; +} +RouteResponse.prototype = { + constructor: RouteResponse +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteResponse); + +/***/ }), +/* 54 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Single Route Instruction object. + * + * @property {String} code - Instruction code : + * + * - "F" : Straight forward + * - "B" : U-turn + * - "L" : turn left + * - "R" : turn right + * - "BL" : turn left strongly + * - "BR" : turn right strongly + * - "FL" : turn lightly to the left + * - "FR" : turn lightly to the right + * - "round_about_entry" : round about entry + * - "round_about_exit" : round about exit + * + * @property {String} instruction - Instruction text : translated code + street name + * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street. + * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter. + * @property {Float} duration - Instruction duration in seconds. + * + * @namespace + * @alias Gp.Services.Route.RouteInstruction + */ +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; // FIXME can be null if option 'geometryInInstructions' is false ! +} + +RouteInstruction.prototype = { + constructor: RouteInstruction +}; +/* harmony default export */ __webpack_exports__["default"] = (RouteInstruction); + +/***/ }), +/* 55 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _CommonService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7); +/* harmony import */ var _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56); +/* harmony import */ var _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(58); + + + + + + + + +/** + * @classdesc + * Appel du service d'isochrone/distance du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.ProcessIsoCurve + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. + * + * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut. + * + * @param {Object} options.position - Point de départ du calcul. + * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance. + * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance. + * + * @param {String} options.srs - Projection. + * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et + * dans lequel la géométrie de la courbe résultante sera exprimée. + * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ». + * + * @param {String} [options.graph = "voiture"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »). + * La valeur par défaut est : «voiture» + * + * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints. + * Critères d'exclusions à appliquer pour le calcul. + * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte + * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). + * + * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". + * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". + * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". + * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". + * + * @param {String} [options.method = "time"] - Méthode utilisée pour le calcul de la courbe iso. + * Les valeurs possible sont "time" pour un calcul d'isochrone, "distance" pour un calcul d'isodistance. + * Pas de valeur spécifié équivaut à un calcul d'isochrone. + * + * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse ("m" or "km"). + * + * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse ("standard", "second", "minute", "hour"). Il peut-être formatté hh:mm::ss avec la valeur standard. + * + * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ». + * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "time". + * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné. + * + * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ». + * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "DISTANCE". + * Si l'option "method" n'est pas renseignée, ce paramètre sera ignoré. + * + * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. + * Par défaut, la valeur « false » est appliquée. + * + * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. + * Par défaut, la valeur « false » est appliquée. + * + * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »). + * Par défaut, la valeur « false » est appliquée. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * position : { + * x : 2.3242664298058053, + * y : 48.86118017324745 + * }, + * distance : 200, + * [time : ] + * method : "distance", + * graph : "voiture", + * reverse : false + * }; + */ + +function ProcessIsoCurve(options) { + if (!(this instanceof ProcessIsoCurve)) { + throw new TypeError(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("CLASS_CONSTRUCTOR", "ProcessIsoCurve")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "ProcessIsoCurve"; + + // appel du constructeur par heritage + _CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].apply(this, arguments); + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("Gp.Services.ProcessIsoCurve"); + this.logger.trace("[Constructeur ProcessIsoCurve (options)]"); + if (!options.position) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position")); + } + + // on lance une exception afin d'eviter au service de le faire... + if (options.position.x === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_MISSING", "position.x")); + } + if (options.position.y === null) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].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"); + } + + // si on a que le paramètre "distance" en entrée, on calcule une isodistance. + // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "distance" + if (!options.time && options.distance) { + this.options.method = "distance"; + // on supprime l'éventuel attribut time, résidu d'un appel antérieur + if (this.options.time) { + delete this.options.time; + } + } + + // si on a que le paramètre "time" en entrée, on calcule une isochrone. + // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "time" + if (options.time && !options.distance) { + this.options.method = "time"; + // on supprime l'éventuel attribut time, résidu d'un appel antérieur + if (this.options.distance) { + delete this.options.distance; + } + } + + // au cas où on a ni l'un, ni l'autre... + this.options.method = this.options.method || "time"; + + // options par defaut du service + // TODO: modifier la ressource lors de la mise en production du service + this.options.resource = options.resource || "bdtopo-iso"; + this.options.exclusions = options.exclusions || []; + this.options.reverse = options.reverse || false; + this.options.srs = options.srs || "EPSG:4326"; + this.options.distanceUnit = options.distanceUnit || "m"; + this.options.timeUnit = options.timeUnit || "second"; + + // options depreciees + if (options.smoothing) { + this.logger.warn("options.smoothing is DEPRECATED"); + } + this.options.smoothing = false; + if (options.holes) { + this.logger.warn("options.holes is DEPRECATED"); + } + this.options.holes = false; + + // Gestion du graphe + if (options.graph) { + if (options.graph === "Voiture") { + this.options.graph = "car"; + } + if (options.graph === "Pieton") { + this.options.graph = "pedestrian"; + } + } else { + this.options.graph = "car"; + } + + // Gestions des contraintes + this.options.constraints = []; + if (options.constraints) { + if (Array.isArray(options.constraints)) { + for (var k = 0; k < options.constraints.length; k++) { + this.options.constraints.push(options.constraints[k]); + } + } else { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_TYPE", "constraints")); + } + } + + // Gestion de l'ancien paramètre exclusions + var constraintTunnel = {}; + var constraintPont = {}; + var constraintAutoroute = {}; + if (options.exclusions) { + if (options.exclusions.length !== 0) { + this.logger.warn("options.exclusions is DEPRECATED !!"); + for (var c = 0; c < options.exclusions.length; c++) { + if (typeof options.exclusions[c] === "string") { + options.exclusions[c] = options.exclusions[c].toLowerCase(); + } else { + // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions + continue; + } + if (options.exclusions[c] === "toll") { + constraintAutoroute.constraintType = "banned"; + constraintAutoroute.key = "wayType"; + constraintAutoroute.operator = "="; + constraintAutoroute.value = "autoroute"; + this.options.constraints.push(constraintAutoroute); + } + if (options.exclusions[c] === "tunnel") { + constraintTunnel.constraintType = "banned"; + constraintTunnel.key = "wayType"; + constraintTunnel.operator = "="; + constraintTunnel.value = "tunnel"; + this.options.constraints.push(constraintTunnel); + } + if (options.exclusions[c] === "bridge") { + constraintPont.constraintType = "banned"; + constraintPont.key = "wayType"; + constraintPont.operator = "="; + constraintPont.value = "pont"; + this.options.constraints.push(constraintPont); + } + } + } + } + + // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. + this.options.outputFormat = typeof options.outputFormat === "string" ? options.outputFormat.toLowerCase() : "json"; + if (options.outputFormat && options.outputFormat !== "json") { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_NOT_SUPPORT", "outputFormat")); + } + this.options.outputFormat = "json"; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + if (!this.options.serverUrl) { + // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone + /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl(); + if (this.options.oldIsoService) { + urlFound = DefaultUrlService.ProcessIsoCurve.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone + var urlFound = _DefaultUrlService__WEBPACK_IMPORTED_MODULE_4__["default"].ProcessIsoCurve.url(); + if (!urlFound) { + throw new Error("Url by default not found !"); + } + this.options.serverUrl = urlFound; + this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); + } +} + +/** + * @lends module:ProcessIsoCurve# + */ +ProcessIsoCurve.prototype = Object.create(_CommonService__WEBPACK_IMPORTED_MODULE_3__["default"].prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +ProcessIsoCurve.prototype.constructor = ProcessIsoCurve; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +ProcessIsoCurve.prototype.buildRequest = function (error, success) { + try { + var oIsoCurve = new _Request_ProcessIsoCurveRequest__WEBPACK_IMPORTED_MODULE_5__["default"](this.options); + if (!oIsoCurve.processRequestString()) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_REQUEST_BUILD")); + } + this.request = oIsoCurve.requestString; + } catch (e) { + error.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](e.message)); + return; + } + success.call(this, this.request); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} onError - callback des erreurs + * @param {Function} onSuccess - callback de succès de l'analyse de la réponse + */ +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 + }; + _Response_ProcessIsoCurveResponseFactory__WEBPACK_IMPORTED_MODULE_6__["default"].build(options); + } else { + onError.call(this, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurve); + +/***/ }), +/* 56 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(57); + + + + +/** + * @classdesc + * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance. + * Les requêtes peuvent être en mode GET ou POST, + * et le format de sorti est en JSON. + * + * @constructor + * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest + * @param {Object} options - options + * + * @example + * var options = { + * httpMethod : 'GET', // GET|POST + * // spécifique au service + * position : { + * x : 2.3242664298058053, + * y : 48.86118017324745 + * }, + * graph : "car", + * method : 'time', + * time : 1000, //distance : 200 + * reverse : false, + * srs : 'EPSG:4326' + * }; + * + * try { + * + * var oIsoCurve = new ProcessIsoCurveRequest (options); + * if (!oIsoCurve.processRequestString ()) { + * // error + * } + * + * var request = oIsoCurve.requestString; + * + * } catch (e) { + * // error + * } + * @private + */ +function ProcessIsoCurveRequest(options) { + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveRequest"); + this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]"); + if (!(this instanceof ProcessIsoCurveRequest)) { + throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("PARAM_EMPTY", "options")); + } + + /** + * Liste des options + */ + this.settings = options; + + /** + * Mode HTPP. + * Par defaut, "GET". + * @type {String} + */ + this.mode = this.settings.httpMethod || "GET"; +} +ProcessIsoCurveRequest.prototype = { + /** + * @lends module:ProcessIsoCurveRequest# + */ + + /** + * Requête + * @type {String} + */ + requestString: null, + /** + * Constructeur (alias) + */ + constructor: ProcessIsoCurveRequest, + /** + * Construction de la requête. + * + * @example + * // GET out : + * // (http://wxs.ign.fr/KEY/isochrone?) + * // resource=& + * // point=& + * // costValue=& + * // costType=& + * // profile=& + * // constraints=& + * // direction=& + * // crs= + * + * // POST out : + * { + * resource: "bduni-idf-pgr", + * point: "2.337306,48.849319", + * costValue: 100, + * costType: "time", + * profile: "car", + * constraints: [{ + * constraintType: "banned", + * key: "ways_type", + * operator: "=", + * value: "autoroute" + * }] + * } + * + * @returns {String} request + */ + processRequestString: function processRequestString() { + var request = ""; + var i = 0; + switch (this.mode) { + case "GET": + this.logger.trace("Process GET Request"); + + // Mapping des options avec le service de l'API REST + var oParams = new _model_ProcessIsoCurveParam__WEBPACK_IMPORTED_MODULE_2__["default"](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": + this.logger.trace("Process POST Request"); + // creation du JSON + var postRequest = {}; + postRequest.resource = this.settings.resource; + postRequest.point = this.settings.position.x + "," + this.settings.position.y; + if (this.settings.method === "distance") { + postRequest.costType = "distance"; + postRequest.costValue = this.settings.distance; + } else { + postRequest.costType = "time"; + postRequest.costValue = this.settings.time; + } + postRequest.profile = this.settings.graph; + if (this.settings.reverse) { + postRequest.direction = "arrival"; + } else { + postRequest.direction = "departure"; + } + postRequest.constraints = this.settings.constraints; + postRequest.distanceUnit = this.settings.distanceUnit; + postRequest.timeUnit = this.settings.timeUnit; + postRequest.crs = this.settings.srs; + + // conversion en chaîne de caractères + request = JSON.stringify(postRequest); + break; + default: + this.logger.error("No other HTTP method supported by the service !"); + } + this.logger.trace(request); + this.requestString = request; + return this.requestString; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveRequest); + +/***/ }), +/* 57 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); + + +/** + * @classdesc + * + * Classe de gestion des param. des requêtes du service de calcul des iso. + * Permet le mapping avec les options du service. + * + * @constructor + * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam + * @param {Object} options - options + * @private + * + */ +function ProcessIsoCurveParam(options) { + if (!(this instanceof ProcessIsoCurveParam)) { + throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function."); + } + this.logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger(); + this.logger.trace("[Constructeur ProcessIsoCurveParam ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // mapping des options avec l'API REST + + /** Identifiant de l’isochrone */ + this.id = this.options.id; + + /** Resource */ + this.resource = this.options.resource; + + /** Coordonnées de départ (ou arrivée si le reverse est à true). */ + this.point = this.options.position; + + /** projection (code EPSG comme epsg:4326 ou wgs84) */ + this.crs = this.options.srs; + + /** + * Profil de véhicule à utiliser pour le calcul. + * Voiture ou Pieton + */ + this.profile = this.options.graph; + + /** Liste des règles de restrictions à utiliser */ + this.constraints = this.options.constraints; + this.reverse = this.options.reverse; + this.timeUnit = this.options.timeUnit; + this.distanceUnit = this.options.distanceUnit; + + /** + * "time" pour isochrone ou "distance" for isodistance. + * Par defaut, time... + */ + if (this.options.method === "distance") { + this.costType = "distance"; + this.costValue = this.options.distance; + } else { + this.costType = "time"; + this.costValue = this.options.time; + } +} + +/** + * CLASSNAME + */ +ProcessIsoCurveParam.CLASSNAME = "ProcessIsoCurveParam"; +ProcessIsoCurveParam.prototype = { + /** + * @lends module:ProcessIsoCurveParam# + */ + + /** + * Constructeur (alias) + */ + constructor: ProcessIsoCurveParam, + /** + * Retourne le point + * @returns {String} x,y + */ + getLocation: function getLocation() { + return this.point.x + "," + this.point.y; + }, + /** + * Retourne l'unité de la distance + * @returns {String} + */ + getDistanceUnit: function getDistanceUnit() { + if (this.distanceUnit === "m") { + return "meter"; + } + if (this.distanceUnit === "km") { + return "kilometer"; + } + return ""; + }, + /** + * Retourne la liste des contraintes + * @returns {String} + */ + getConstraints: function getConstraints() { + var constraintArray = []; + if (this.constraints.length !== 0) { + for (var k = 0; k < this.constraints.length; k++) { + constraintArray.push(JSON.stringify(this.constraints[k])); + } + } + return constraintArray.join("|"); + }, + /** + * Retourne la direction + * @returns {String} + */ + getDirection: function getDirection() { + if (this.reverse) { + return "arrival"; + } else { + return "departure"; + } + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} KVP + */ +ProcessIsoCurveParam.prototype.getParams = function () { + var map = []; + map.push({ + k: "resource", + v: this.resource + }); + map.push({ + k: "point", + v: this.getLocation() + }); + map.push({ + k: "direction", + v: this.getDirection() + }); + map.push({ + k: "costType", + v: this.costType + }); + map.push({ + k: "costValue", + v: this.costValue + }); + map.push({ + k: "profile", + v: this.profile + }); + map.push({ + k: "timeUnit", + v: this.timeUnit + }); + map.push({ + k: "distanceUnit", + v: this.getDistanceUnit() + }); + if (this.crs) { + map.push({ + k: "crs", + v: this.crs + }); + } + if (this.constraints) { + map.push({ + k: "constraints", + v: this.getConstraints() + }); + } + return map; +}; +/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveParam); + +/***/ }), +/* 58 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(59); + + + + + +/** + * Factory pour générer une reponse JSON à partir d'un JSON + * (Factory) + * + * @module ProcessIsoCurveResponseFactory + * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory + * @private + */ +var ProcessIsoCurveResponseFactory = { + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant ProcessIsoCurve + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build: function build(options) { + // logger + var logger = _Utils_LoggerByDefault__WEBPACK_IMPORTED_MODULE_0__["default"].getLogger("ProcessIsoCurveResponseFactory"); + logger.trace(["ProcessIsoCurveResponseFactory::build()"]); + var data = null; + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + logger.trace("analyze response : json"); + var JSONResponse; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // analyse de la reponse + // création de l'objet de réponse + data = new _model_ProcessIsoCurveResponse__WEBPACK_IMPORTED_MODULE_3__["default"](); + + // remplissage de l'objet créé avec les attribtuts de la réponse du service + if (JSONResponse) { + if (JSONResponse.costType === "distance") { + data.time = ""; + data.distance = JSONResponse.costValue; + } else { + data.time = JSONResponse.costValue; + data.distance = ""; + } + data.message = ""; + data.id = ""; + data.srs = JSONResponse.crs; + data.geometry = JSONResponse.geometry; + var coords = JSONResponse.point.split(","); + if (data.location) { + data.location.x = coords[0]; + data.location.y = coords[1]; + } + } else { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_ANALYSE", options.response))); + return; + } + + // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !! + // ex. Key does not exist or has expired + // mais le statut est 403, l'erreur est donc remontée plus tôt. + if (data.exceptionReport) { + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"]({ + message: _Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), + type: _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"].TYPE_SRVERR, + status: 200 + })); + return; + } + } + } else { + // si la réponse est vide, on appelle le callback d'erreur + options.onError.call(options.scope, new _Exceptions_ErrorService__WEBPACK_IMPORTED_MODULE_2__["default"](_Utils_MessagesResources__WEBPACK_IMPORTED_MODULE_1__["default"].getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + + // si tout s'est bien passé, on appelle le callback de succès + options.onSuccess.call(options.scope, data); + } +}; +/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponseFactory); + +/***/ }), +/* 59 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Float} distance - distance (expressed in meters) used for the request. + * @property {Float} time - time (expressed in seconds) used for the request. + * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve. + * @property {String} id - request id (used by underlying webservice). + * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in "srs" coordinates system). + * @property {String} message - message + * @property {String} srs - Identifier of the coordinates system used for the isocurve. + * + * @namespace + * @alias Gp.Services.IsoCurveResponse + * + */ +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 +}; +/* harmony default export */ __webpack_exports__["default"] = (ProcessIsoCurveResponse); + +/***/ }) +/******/ ])["default"]; +}); \ No newline at end of file diff --git a/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js new file mode 100644 index 00000000..d8489a33 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/dist/GpServices.js @@ -0,0 +1,30 @@ +/*! + * @brief Geoportal resources access library + * + * 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 3.4.0-beta2 + * @date 27/10/2023 + * + */ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.4 + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("node-fetch"),require("xmldom")):"function"==typeof define&&define.amd?define("Gp",["require","require"],e):"object"==typeof exports?exports.Gp=e(require("node-fetch"),require("xmldom")):t.Gp=e(t[void 0],t[void 0])}(this,(function(t,e){return function(t){var e={};function o(r){if(e[r])return e[r].exports;var s=e[r]={i:r,l:!1,exports:{}};return t[r].call(s.exports,s,s.exports,o),s.l=!0,s.exports}return o.m=t,o.c=e,o.d=function(t,e,r){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)o.d(r,s,function(e){return t[e]}.bind(null,s));return r},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=5)}([function(t){t.exports=JSON.parse('{"name":"geoportal-access-lib","version":"3.4.0-beta2","date":"27/10/2023","description":"French Geoportal resources access library","module":"src/Gp.js","main":"dist/GpServices-src.js","homepage":"https://github.com/IGNF/geoportal-access-lib#readme","scripts":{"clean":"echo \\"Warning: no yet implemented!\\" && exit 0","setup":"npm install","cover":"nyc --reporter=lcov --reporter=text npm run test","eslint":"eslint src/","build":"webpack --mode=none","build:prod":"webpack --mode=production","build:dev":"webpack --mode=development","test":"mocha-webpack --reporter mochawesome --reporter-options reportDir=test-report,reportFilename=index --webpack-config ./test/webpack/webpack.test.js --glob \\"test_*.js\\" test/spec/","test:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.js","test:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.test.serve.docker.js","test:end-to-end:serve":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.js","test:end-to-end:serve:docker":"webpack-dev-server --hot --config ./test/webpack/webpack.end-to-end.serve.docker.js","sample":"npm run sample:serve","sample:serve":"webpack-dev-server --mode=none --open-page samples/index-src.html --https --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:prod":"webpack-dev-server --mode=production --open-page samples/index-prod.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","sample:serve:dev":"webpack-dev-server --mode=development --open-page samples/index-map.html --content-base . --output-public-path \'/dist/\' --port 9001 --open","doc":"npm run doc:serve","doc:serve":"webpack-dev-server --content-base jsdoc --port 9001 --open"},"nyc":{"include":["src/**/*.js"],"instrument":false,"sourceMap":false},"repository":{"type":"git","url":"https://github.com/IGNF/geoportal-access-lib.git"},"keywords":["geoportail","webservice","javascript","es6"],"author":"IGNF","license":"CECILL-B","dependencies":{"es6-promise":"^4.2.4","node-fetch":"^2.6.1","xmldom":"^0.1.27"},"devDependencies":{"@babel/core":"^7.12.10","@babel/plugin-transform-template-literals":"^7.12.1","@babel/preset-env":"^7.12.11","babel-loader":"^8.2.2","chai":"^4.1.2","clean-webpack-plugin":"^3.0.0","copy-webpack-plugin":"^5.1.2","eslint":"^7.18.0","eslint-config-standard":"^16.0.2","eslint-loader":"^4.0.2","eslint-plugin-import":"^2.22.1","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^4.2.1","eslint-plugin-standard":"^5.0.0","glob":"^7.1.2","handlebars-layouts":"^3.1.4","handlebars-webpack-plugin":"^1.4.1","html-webpack-plugin":"^4.5.1","istanbul-instrumenter-loader":"^3.0.1","jsdoc-webpack-plugin":"^0.3.0","loglevel":"^1.6.1","mocha":"^7.2.0","mocha-loader":"^5.1.5","mocha-webpack":"^2.0.0-beta.0","mochawesome":"^6.2.1","nyc":"^15.1.0","path":"^0.12.7","replace-bundle-webpack-plugin":"^1.0.0","sinon":"^9.2.4","sinon-es6":"0.0.3","speed-measure-webpack-plugin":"^1.4.2","string-template":"^1.0.0","terser-webpack-plugin":"^2.3.8","webpack":"^4.46.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.2","webpack-node-externals":"^2.5.2","webpack-shell-plugin":"^0.5.0"},"bundledDependencies":[],"peerDependencies":{},"optionalDependencies":{}}')},function(t,e,o){var r,s;!function(n,i){"use strict";void 0===(s="function"==typeof(r=function(){var t=function(){},e="undefined"!=typeof window&&void 0!==window.navigator&&/Trident\/|MSIE /.test(window.navigator.userAgent),o=["trace","debug","info","warn","error"];function r(t,e){var o=t[e];if("function"==typeof o.bind)return o.bind(t);try{return Function.prototype.bind.call(o,t)}catch(e){return function(){return Function.prototype.apply.apply(o,[t,arguments])}}}function s(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function n(o){return"debug"===o&&(o="log"),"undefined"!=typeof console&&("trace"===o&&e?s:void 0!==console[o]?r(console,o):void 0!==console.log?r(console,"log"):t)}function i(e,r){for(var s=0;s=0&&e<=n.levels.SILENT))throw"log.setLevel() called with invalid level: "+e;if(s=e,!1!==r&&function(t){var e=(o[t]||"silent").toUpperCase();if("undefined"!=typeof window&&a){try{return void(window.localStorage[a]=e)}catch(t){}try{window.document.cookie=encodeURIComponent(a)+"="+e+";"}catch(t){}}}(e),i.call(n,e,t),"undefined"==typeof console&&e1)for(var o=1;o0?n.replace("%var%",s.join(" - ")):n.replace("%var%","%var% (not specified)")}catch(t){}return n}},i={normalyzeParameters:function(t){var e=null;if(t){var o=[];for(var r in t)if(t.hasOwnProperty(r)){var s=t[r];s||(s=""),o.push(r+"="+s)}e=o.join("&")}return e},normalyzeUrl:function(t,e,o){var r=t;if(t){var s=t.indexOf("?");-1===s&&(r+="?"),-1!==s&&s!==t.length-1&&(r+="&")}return e&&(r+="string"==typeof e?e:this.normalyzeParameters(e)),o&&(r=encodeURIComponent(r)),r},indent:function(t,e){return new Array((t||0)+1).join("\t")+e}},a=o(4),c=o.n(a);function l(t){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u,p={call:function(t){var e=s.getLogger("XHR");if(e.trace("[XHR::call()]"),c.a.polyfill(),!t.url)throw new Error("missing parameter : url is not defined !");if(!t.method)throw new Error("missing parameter : method is not defined !");t.format||(t.format="text");var o={};switch(o.url=t.url,o.data=t.data?t.data:null,o.method=t.method,o.timeOut=t.timeOut||0,o.scope=t.scope||this,o.proxy=t.proxy||null,o.content=t.content||null,o.headers=t.headers||{referer:"http://localhost"},t.method){case"DELETE":case"GET":break;case"PUT":case"POST":o.content=t.content?t.content:"application/x-www-form-urlencoded",o.headers=t.headers?t.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(t.format){case"text":this.__call(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;case"json":this.__callJSON(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;case"xml":this.__callXML(o).then((function(o){e.trace(o),t.onResponse.call(this,o)})).catch((function(e){t.onFailure.call(this,e)}));break;default:throw new Error("This output Format is not yet supported !")}},__call:function(t){var e=s.getLogger("XHR");return e.trace("[XHR::__call()]"),new Promise((function(r,s){var n="POST"===t.method||"PUT"===t.method?1:0;t.data&&("object"===l(t.data)&&Object.keys(t.data).length||"string"==typeof t.data&&t.data.length)&&!n&&("Geocode"===t.scope.CLASSNAME||"ReverseGeocode"===t.scope.CLASSNAME?t.url=t.url+t.data:t.url=i.normalyzeUrl(t.url,t.data)),e.trace("URL = ",t.url);var a=null;if("undefined"==typeof window){var c=o(2),u={headers:{Referer:"https://localhost"}};return t.data&&"string"==typeof t.data&&n&&(u={method:t.method,body:t.data,headers:{"Content-Type":t.content,Referer:"https://localhost"}}),c(t.url,u).then((function(t){if(t.ok)r(t.text());else{var e="Errors Occured on Http Request (status : '"+t.statusText+"' | url : '"+t.url+"')",o=t.status;s({message:e,status:o})}})).catch((function(t){s({message:t,status:-1})}))}if(window.XMLHttpRequest){e.trace("XMLHttpRequest"),(a=new XMLHttpRequest).open(t.method,t.url,!0),a.overrideMimeType=t.content;var p=null;t.timeOut>0&&(e.trace("XHR - TimeOut actif !"),p=window.setTimeout((function(){s({message:"TimeOut Occured on Http Request with XMLHttpRequest !",status:-1})}),t.timeOut)),n&&(e.trace("data = ",t.data),a.setRequestHeader("Content-type",t.content)),a.onerror=function(t){console.log(t),s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(t){console.log(t),s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onreadystatechange=function(t){if(4===a.readyState)if(200===a.status)window.clearTimeout(p),r(a.response);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"' | response : '"+t.target.response+"')",o=t.target.status;s({message:e,status:o})}};var h=t.data&&n?t.data:null;a.send(h)}else{if(!window.XDomainRequest)throw new Error("CORS not supported");e.trace("XDomainRequest"),(a=new XDomainRequest).open(t.method,t.url),a.overrideMimeType=t.content,t.timeOut>0&&(a.timeout=t.timeout,e.trace("XHR - TimeOut actif !")),n&&a.setRequestHeader("Content-type",t.content),a.onerror=function(){s(new Error("Errors Occured on Http Request with XMLHttpRequest !"))},a.ontimeout=function(){s(new Error("TimeOut Occured on Http Request with XMLHttpRequest !"))},a.onload=function(t){if(200===a.status)r(a.responseText);else{var e="Errors Occured on Http Request (status : '"+t.target.statusText+"' | url : '"+t.target.responseURL+"')",o=t.target.status;s({message:e,status:o})}};var f=t.data&&n?t.data:null;a.send(f)}}))},__callJSON:function(t){return this.__call(t).then(JSON.parse).catch((function(e){console.log("_callJSON failed on : ",t.url,e)}))},__callXML:function(t){return this.__call(t).then((function(t){var e;"undefined"==typeof window?e=(new(0,o(3).DOMParser)).parseFromString(t,"text/xml"):window.DOMParser?e=(new window.DOMParser).parseFromString(t,"text/xml"):((e=new window.ActiveXObject("Microsoft.XMLDOM")).async=!1,e.loadXML(t));return e})).catch((function(e){console.log("__callXML failed on : ",t.url,e)}))}},h={uuid:(u=Math.floor(Date.now()),function(){return u++}),call:function(t){var e=s.getLogger("JSONP");if(e.trace("[JSONP::call ()]"),!t)throw e.error("missing parameter : options !"),new Error("missing parameter : options !");if(!t.url)throw e.error("missing parameter : options.url !"),new Error("missing parameter : options.url !");if(t.timeOut||(e.info("setting 'options.timeOut' default value"),t.timeOut=0),!t.onResponse)throw e.error("missing parameter : options.onResponse !"),new Error("missing parameter : options.onResponse !");var o="string"==typeof t.callbackSuffix?t.callbackSuffix:this.uuid(),r=!1,n=!1,i=t.url.indexOf("callback=");if(-1!==i){r=!0;var a=t.url.indexOf("&",i);-1===a&&(a=t.url.length);var c=t.url.substring(i+9,a);c&&(n=!0,t.callbackName=c,e.info("setting 'options.callbackName' value ("+t.callbackName+") from 'options.url' parameter"))}if(!r){var l=t.url.indexOf("?");-1===l?t.url=t.url+"?callback=":l===t.url.length?t.url=t.url+"callback=":t.url=t.url+"&callback=",e.info("setting callback default key in 'options.url' : "+t.url)}var u=!!t.callbackName||n;if(n||(t.callbackName||(e.info("setting 'options.callbackName' default value"),t.callbackName="callback",(o||""===o)&&(t.callbackName+=o)),t.url=t.url.replace("callback=","callback="+t.callbackName),e.info("setting callback function name in 'options.url' : "+t.url)),t.onTimeOut||(e.info("setting 'options.onTimeOut' default value"),t.onTimeOut=function(){console.log("TimeOut while invoking url : "+t.url)}),!u){var p=this,h=null;t.timeOut>0&&(h=window.setTimeout((function(){window[t.callbackName]=function(){},t.onTimeOut(),p._deleteScript(o)}),t.timeOut)),window[t.callbackName]=function(e){window.clearTimeout(h),t.onResponse(e),p._deleteScript(o)}}this._createScript(o,t.url)},_createScript:function(t,e){var o,r=document.getElementById("results"+t);(o=document.createElement("script")).setAttribute("type","text/javascript"),o.setAttribute("src",e),o.setAttribute("charset","UTF-8"),o.setAttribute("id","results"+t),o.setAttribute("async","true");var s=document.documentElement||document.getElementsByTagName("head")[0];null===r?s.appendChild(o):s.replaceChild(o,r)},_deleteScript:function(t){var e=document.getElementById("results"+t);if(e){var o=e.parentNode||document.documentElement;if(!o)return;o.removeChild(e)}}},f={send:function(t){var e=t||{method:"GET",protocol:"XHR",timeOut:0,format:null,wrap:!0,nocache:!0,output:"json",callback:null,callbackSuffix:null};if("undefined"!=typeof window||"JSONP"!==t.protocol){if("XHR"===t.protocol||"json"===t.format?e.wrap=!1:"JSONP"===t.protocol&&"xml"===t.format&&(e.wrap=!0),e.callback=null,e.output=e.wrap?"json":null,e.wrap){var o={};o.output=e.output,o.callback=e.callback,delete o.callback,e.url=i.normalyzeUrl(t.url,o)}switch(e.protocol){case"XHR":"GET"===t.method&&t.nocache&&(e.url=i.normalyzeUrl(e.url,{t:(new Date).getTime()})),p.call(e);break;case"JSONP":e.data&&(e.url=i.normalyzeUrl(e.url,e.data)),h.call(e);break;default:throw new Error("protocol not supported (XHR|JSONP) !")}}else console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS")}};function d(t){if(!(this instanceof d))throw new TypeError("ErrorService constructor cannot be called as a function.");var e=t;"string"==typeof t||t instanceof String?(this.message=t,this.status=-1,this.type=d.TYPE_UNKERR):(this.message=e.message||"undefined!?",this.type=e.type,this.status=e.status||-1),this.name="ErrorService",this.stack=(new Error).stack}d.TYPE_SRVERR="SERVICE_ERROR",d.TYPE_USEERR="USAGE_ERROR",d.TYPE_UNKERR="UNKNOWN_ERROR",d.prototype=Object.create(Error.prototype,{constructor:{value:d,writable:!0,configurable:!0}});var g=d,m=o(0);function y(t){if(!(this instanceof y))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR"));for(var e in this.logger=s.getLogger("CommonService"),this.logger.trace("[Constructeur CommonService (options)]"),this.options={protocol:"XHR",ssl:!0,proxyURL:"",callbackSuffix:null,httpMethod:"GET",timeOut:0,rawResponse:!1,scope:this,onSuccess:function(t){console.log("onSuccess - la reponse est la suivante : ",t)},onFailure:function(t){200!==t.status&&t.status?console.log("onFailure - Erreur (",t.status,") : ",t.message):console.log("onFailure : ",t.message)}},t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);if(this.options.rawResponse&&!this.options.onSuccess&&(this.options.onSuccess=function(t){console.log("onSuccess - la réponse brute du service est la suivante : ",t)}),!!(null===this.options.onSuccess||"function"!=typeof this.options.onSuccess))throw new Error(n.getMessage("PARAM_MISSING","onSuccess()"));switch(this.options.httpMethod="string"==typeof t.httpMethod?t.httpMethod.toUpperCase():"GET",this.options.httpMethod){case"POST":case"GET":break;case"PUT":case"DELETE":case"HEAD":case"OPTIONS":throw new Error(n.getMessage("PARAM_NOT_SUPPORT","httpMethod"));default:throw new Error(n.getMessage("PARAM_UNKNOWN","httpMethod"))}switch(this.options.protocol="string"==typeof t.protocol?t.protocol.toUpperCase():"XHR",this.options.protocol){case"JSONP":case"XHR":break;default:throw new Error(n.getMessage("PARAM_UNKNOWN","protocol"))}if("undefined"==typeof window&&"JSONP"===this.options.protocol)throw new Error(n.getMessage("PARAM_NOT_SUPPORT_NODEJS","protocol=JSONP (instead use XHR)"));"JSONP"===this.options.protocol&&(this.options.httpMethod="GET"),this.options.nocache=t.nocache||!1,this.options.outputFormat=null,this.request=null,this.response=null}y.prototype={constructor:y,call:function(){this.logger.trace("CommonService::call ()");var t=this;function e(e){this.logger.trace("CommonService::onBuildRequest : ",e),this.callService.call(t,s,o)}function o(e){this.logger.trace("CommonService::onCallService : ",e),this.analyzeResponse.call(t,s,r)}function r(t){if(this.logger.trace("CommonService::onAnalyzeResponse : ",t),!t)return s.call(this,new g("Analyse de la reponse en échec !?"));this.options.onSuccess.call(this,t)}function s(t){this.logger.trace("CommonService::onError()");var e=t;e instanceof g||(e=new g(t.message)),this.options.onFailure.call(this,e)}(function(){this.logger.trace("CommonService::run ()"),this.buildRequest.call(t,s,e)}).call(t)},buildRequest:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")},callService:function(t,e){var o=null,r=this.request,s=!(!this.options.proxyURL||"XHR"!==this.options.protocol);"Geocode"!==this.CLASSNAME&&"ReverseGeocode"!==this.CLASSNAME&&"AutoComplete"!==this.CLASSNAME&&(this.options.serverUrl=i.normalyzeUrl(this.options.serverUrl,{"gp-access-lib":m.version,apiKey:this.options.apiKey||"calcul"},!1)),s&&("GET"===this.options.httpMethod&&(o=this.options.proxyURL+i.normalyzeUrl(this.options.serverUrl,this.request,!0),r=null),"POST"===this.options.httpMethod&&(o=this.options.proxyURL+i.normalyzeUrl(this.options.serverUrl,null,!0),r=this.request));var n=this,a={url:o||this.options.serverUrl,method:this.options.httpMethod,protocol:this.options.protocol,timeOut:this.options.timeOut||0,format:this.options.outputFormat,nocache:this.options.nocache||!1,wrap:"XHR"!==this.options.protocol,callbackSuffix:this.options.callbackSuffix,data:r,headers:null,content:this.options.contentType||"application/xml",scope:this.options.scope||this,onResponse:function(o){n.logger.trace("callService::onResponse()");var r=null;if("XHR"===n.options.protocol&&(n.logger.trace("Response XHR",o),r=o),"JSONP"===n.options.protocol){if(n.logger.trace("Response JSON",o),!o)return void t.call(n,new g("Le contenu de la reponse est vide !?"));if(o.http){if(200!==o.http.status)return void t.call(n,new g({status:o.http.status,message:o.http.error,type:g.TYPE_SRVERR}));r=o.xml,n.options.rawResponse&&(r=o)}else r=o}if("function"==typeof n.options.onBeforeParse){var s=n.options.onBeforeParse(r);"string"==typeof s&&(r=s)}n.response=r,e.call(n,r)},onFailure:function(e){n.logger.trace("callService::onFailure()"),e.type=g.TYPE_SRVERR,t.call(n,new g(e))},onTimeOut:function(){n.logger.trace("callService::onTimeOut()"),t.call(n,new g("TimeOut!"))}};f.send(a)},analyzeResponse:function(t,e){this.logger.error("overwritten method !"),t&&t.call(this,"This method must be overwritten !"),e.call(this,"This method must be overwritten !")}};var v=y,w={ssl:!0,url:function(t){return(!1===w.ssl?"http://":"https://")+"wxs.ign.fr"+t},newUrl:function(t,e){return(!1===w.ssl?"http://":"https://")+e+t},Alti:{new_key:{"elevation-json":"/altimetrie/1.0/calcul/alti/rest/elevation.json","elevation-xml":"/altimetrie/1.0/calcul/alti/rest/elevation.xml","profil-json":"/altimetrie/1.0/calcul/alti/rest/elevationLine.json","profil-xml":"/altimetrie/1.0/calcul/alti/rest/elevationLine.xml"},_key:{"elevation-json":"/calcul/alti/rest/elevation.json","elevation-xml":"/calcul/alti/rest/elevation.xml","profil-json":"/calcul/alti/rest/elevationLine.json","profil-xml":"/calcul/alti/rest/elevationLine.xml",wps:"/alti/wps"},newUrl:function(){},url:function(){return{"elevation-json":w.url(this._key["elevation-json"]),"elevation-xml":w.url(this._key["elevation-xml"]),"profil-json":w.url(this._key["profil-json"]),"profil-xml":w.url(this._key["profil-xml"])}}},ProcessIsoCurve:{new_key:"/itineraire/isochrone",_key:"/calcul/geoportail/isochrone/rest/1.0.0/isochrone",newUrl:function(){},url:function(){return w.url(this._key)}},Config:{_key:"https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/",url:function(t){Array.isArray(t)||(t=t.split(","));for(var e=[],o=0;oe||t__IDENTIFIER__\x3c!-- __DATAINPUTS__ --\x3e__RAWDATAOUTPUT__',input:"__KEY____DATA__"}},namespaceByDefault:function(){return['xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns="http://www.opengis.net/wps/1.0.0"','xmlns:wfs="http://www.opengis.net/wfs"','xmlns:wps="http://www.opengis.net/wps/1.0.0"','xmlns:ows="http://www.opengis.net/ows/1.1"','xmlns:gml="http://www.opengis.net/gml"','xmlns:ogc="http://www.opengis.net/ogc"','xmlns:wcs="http://www.opengis.net/wcs/1.1.1"','xmlns:xlink="http://www.w3.org/1999/xlink"'].join(" ")},schemaLocationByDefault:function(){return'xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd"'},processRequestString:function(){this.logger.trace("WPS::processRequestString ()");var t="";if("POST"===this.method)t=this.template.post.value;else{if("GET"!==this.method)return this.logger.error("No other method supported by the service !"),!1;t=this.template.get.value}return t=(t=(t=(t=(t=t.replace(/__SERVICE__/g,this.paramservice)).replace(/__VERSION__/g,this.paramversion)).replace(/__RAWDATAOUTPUT__/g,this.paramrawdataoutput)).replace(/__IDENTIFIER__/g,this.paramidentifier)).replace(/__REQUEST__/g,this.paramrequest),"POST"===this.method&&(t=(t=t.replace(/__NAMESPACE__/g,this.namespaceByDefault)).replace(/__SCHEMALOCATION__/g,this.schemaLocationByDefault)),(t=t.replace(//g,this.__addDataInputs()))?(this.requestString=t,this.logger.trace("traduction tmpl",t),!0):(this.logger.warn("traduction tmpl : empty request !?"),!1)},__addDataInputs:function(){this.logger.trace("WPS::__addDataInputs ()");for(var t,e="GET"===this.method?this.template.get.input:this.template.post.input,o="GET"===this.method?";":"",r="",s=this,n=this.DataObject.getData(),i=0;i0)for(var i=r.getElementsByTagName("parsererror"),a=0;a0){var r=function(t){if(t.attributes.length>0){for(var e={},o=t.attributes,r=0;r0?e.index=e.filters.type[0]:e.index=e.filters.type),delete e.filters.type),e.filters.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),delete e.filters.bbox)),delete e.filterOptions),e.position&&(e.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),e.position.lon||(e.position.lon=e.position.x),delete e.position.x),e.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),e.position.lat||(e.position.lat=e.position.y),delete e.position.y)),e.returnFreeForm&&(this.logger.warn("The parameter 'returnFreeForm' is deprecated"),delete e.returnFreeForm),e.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete e.srs),e},vt.prototype.buildRequest=function(t,e){var o={httpMethod:this.options.httpMethod,geocodeMethod:"search",query:this.options.query,index:this.options.index,returnTrueGeometry:this.options.returnTrueGeometry,position:this.options.position,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=ct.build(o),this.request?e.call(this,this.request):t.call(this,new g(n.getMessage("SERVICE_REQUEST_BUILD")))},vt.prototype.analyzeResponse=function(t,e){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};mt.build(o)}else t.call(this,new g(n.getMessage("SERVICE_RESPONSE_EMPTY")))};var wt=vt;function Et(t){return(Et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function St(t){if(!(this instanceof St))throw new TypeError(n.getMessage("CLASS_CONSTRUCTOR","ReverseGeocode"));this.CLASSNAME="ReverseGeocode",this.logger=s.getLogger("Gp.Services.ReverseGeocode"),this.logger.trace("[Constructeur ReverseGeocode (options)]");var e=this.patchOptionConvertor(t);if(e.serverUrl||(e.serverUrl=E.ReverseGeocode.newUrl(),e.oldReverseService&&(e.serverUrl=E.ReverseGeocode.url())),v.apply(this,[e]),e.searchGeometry)this.options.searchGeometry=e.searchGeometry;else if(!e.position)throw new Error(n.getMessage("PARAM_MISSING","searchGeometry"));if(e.index||(this.options.index=e.index="StreetAddress"),e.filters)for(var o=Object.keys(e.filters),r=0;r0?e.index=e.filterOptions.type[0]:e.index=e.filterOptions.type),delete e.filterOptions.type),e.filterOptions.bbox&&(this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"),e.searchGeometry||(e.searchGeometry=this.bbox2Json(e.filterOptions.bbox)),delete e.filterOptions.bbox),e.filterOptions.circle&&(this.logger.warn("The parameter 'filterOptions.circle' is deprecated"),e.searchGeometry||(e.searchGeometry=this.circle2Json(e.filterOptions.circle)),delete e.filterOptions.circle),e.filterOptions.polygon&&(this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"),e.searchGeometry||(e.searchGeometry=this.polygon2Json(e.filterOptions.polygon)),delete e.filterOptions.polygon),!e.filters&&Object.keys(e.filterOptions).length>0&&(e.filters=e.filterOptions),delete e.filterOptions),e.position&&(e.position.x&&(this.logger.warn("The parameter 'position.x' is deprecated"),e.position.lon||(e.position.lon=e.position.x),delete e.position.x),e.position.y&&(this.logger.warn("The parameter 'position.y' is deprecated"),e.position.lat||(e.position.lat=e.position.y),delete e.position.y)),e.srs&&(this.logger.warn("The parameter 'srs' is deprecated"),delete e.srs),e},St.prototype.buildRequest=function(t,e){var o={httpMethod:this.options.httpMethod,geocodeMethod:"reverse",searchGeometry:this.options.searchGeometry,index:this.options.index,position:this.options.position,returnTrueGeometry:this.options.returnTrueGeometry,maxResp:this.options.maximumResponses,filters:this.options.filters};this.request=ct.build(o),this.request?e.call(this,this.request):t.call(this,new g(n.getMessage("SERVICE_REQUEST_BUILD")))},St.prototype.analyzeResponse=function(t,e){if(this.response){var o={response:this.response,rawResponse:this.options.rawResponse,onError:t,onSuccess:e,scope:this};mt.build(o)}else t.call(this,new g(n.getMessage("SERVICE_RESPONSE_EMPTY")))},St.prototype.bbox2Json=function(t){return{type:"Polygon",coordinates:[[[t.left,t.top],[t.right,t.top],[t.right,t.bottom],[t.left,t.bottom],[t.left,t.top]]]}},St.prototype.circle2Json=function(t){return{type:"Circle",radius:t.radius,coordinates:[t.x,t.y]}},St.prototype.polygon2Json=function(t){for(var e={type:"Polygon",coordinates:[[]]},o=0;o + * // + * // 42 1.5 + * // + * + * @constructor + * @alias Gp.Formats.GML.Geometry + * @private + * @param {Object} options - options + */ +function Geometry (options) { + this.logger = Logger.getLogger("GML.Geometry"); + this.logger.trace("[Constructeur Geometry ()]"); + + if (!(this instanceof Geometry)) { + throw new TypeError("Geometry constructor cannot be called as a function."); + } + + this.options = options || {}; + + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + if (options[opt]) { + this.options[opt] = options[opt]; + } + } + } + + // gestion du type + if (!this.options.type) { + throw new Error("Type is not defined !"); + } + + // gestion des data + if (!this.options.data) { + throw new Error("Data is not defined !"); + } + + if (typeof this.options.data === "object" && Object.keys(this.options.data).length === 0) { + throw new Error("Data is empty !"); + } +} + +Geometry.prototype = { + + /** constructeur (alias) */ + constructor : Geometry, + + /** namespace GML par defaut */ + featureNS : "http://www.opengis.net/gml", + + /** namespace GML par defaut */ + featurePrefix : "gml", + + /** template */ + template : { + point : "" + + "__X__ __Y__" + + "", + envelop : "" + + "__LEFT__ __BOTTOM__" + + "__RIGHT__ __TOP__" + + "", + circle : "" + + "__X__ __Y__" + + "__RADIUS__" + + "", + polygon : "" + + "" + + "" + + "__XY__" + + "" + + "" + + "", + multipolygon : "" + }, + + /** + * choix du template GML + * @param {String} name - nom du template + * @returns {String} le template avec les substitutions clef/valeur + */ + getTemplate : function (name) { + var template = this.template[name]; + + if (!template) { + throw new Error("Type of template is unknow !"); + } + + if (!this.featurePrefix) { + return template; + } + + var regex; + var subst; + + // regex ns tag + regex = /<(\w+[^\s>])/; + subst = "<$1 xmlns:" + this.featurePrefix + "=\"" + this.featureNS + "\""; + template = template.replace(regex, subst); + + // regex prefixe balise ouvrante + regex = /<(\w+[\s>])/g; + subst = "<" + this.featurePrefix + ":$1"; + template = template.replace(regex, subst); + + // regex prefixe balise fermante + regex = /<\/(\w+[\s>])/g; + subst = "__X__ __Y__"; + var template = this.getTemplate("point"); + template = template.replace(/__X__/g, data.x); + template = template.replace(/__Y__/g, data.y); + return template; + }, + + /** + * creation d'une bbox + * @returns {String} le template avec les substitutions clef/valeur + */ + toEnvelop : function () { + var data = this.options.data; + if (!data.left || !data.bottom || !data.right || !data.top) { + throw new Error("One coordinate is undefined !"); + } + var template = this.getTemplate("envelop"); ; + template = template.replace(/__LEFT__/g, data.left); + template = template.replace(/__BOTTOM__/g, data.bottom); + template = template.replace(/__RIGHT__/g, data.right); + template = template.replace(/__TOP__/g, data.top); + return template; + }, + + /** + * creation d'un cercle + * @returns {String} le contenu du template + */ + toCircle : function () { + var data = this.options.data; + if (!data.x || !data.y || !data.radius) { + throw new Error("One parameter is undefined !"); + } + var template = this.getTemplate("circle"); + template = template.replace(/__X__/g, data.x); + template = template.replace(/__Y__/g, data.y); + template = template.replace(/__RADIUS__/g, data.radius); + return template; + }, + + /** + * creation d'un polygone + * @returns {String} le contenu du template + */ + toPolygon : function () { + var data = this.options.data; + if (data.length === 0) { + throw new Error("Array is empty !"); + } + + // fermeture du polygone + if (JSON.stringify(data[0]) !== JSON.stringify(data[data.length - 1])) { + data.push(data[0]); + } + var strCoordinates = ""; + for (var i = 0; i < data.length; i++) { + var coord = data[i]; + if (Array.isArray(coord)) { + throw new Error("Holes are not implemented !"); + } + if ((coord.x && coord.y) || (coord.x === 0 || coord.y === 0)) { + strCoordinates += coord.x + " " + coord.y; + if (data.length !== i + 1) { + strCoordinates += " "; + } + } + } + + if (!strCoordinates) { + throw new Error("Coordinates are empty !"); + } + + var template = this.getTemplate("polygon"); + template = template.replace(/__XY__/g, strCoordinates); + return template; + }, + + /** + * creation d'un polygone + */ + toMultiPolygon : function () { + throw new Error("Not yet implemented !"); + }, + + /** + * to string + * @returns {String} le contenu du template + */ + toString : function () { + var result = null; + + switch (this.options.type.toUpperCase()) { + case "POINT": + result = this.toPoint(); + break; + case "ENVELOP": + result = this.toEnvelop(); + break; + case "CIRCLE": + result = this.toCircle(); + break; + case "POLYGON": + result = this.toPolygon(); + break; + case "MULTIPOLYGON": + result = this.toMultiPolygon(); + break; + default: + this.logger.warn("Type is not supported !"); + } + + this.logger.trace("result :", result); + return result; + } +}; + +export default Geometry; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js new file mode 100644 index 00000000..469ac960 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WKT.js @@ -0,0 +1,142 @@ +import Logger from "../Utils/LoggerByDefault"; + +/** + * Lecture / Ecriture du format WKT + * + * Les besoins sont assez simples : + * 1. lecture des types suivants : + * - LINESTRING + * - POLYGON + * - (TODO) + * 2. convertir aux formats suivants : + * - json + * - (TODO) + * + * + * @example + * var strWKT = "LINESTRING (2.416907 48.846577, 2.416916 48.846613)"; + * WKT.toJson (strWKT, + * function onSuccess (json) { + * // { + * // type : 'LINESTRING', + * // coordinates : [ + * // [2.416907, 48.846577], + * // [2.416916, 48.846613] + * // ] + * // } + * }, + * function onError (error) { + * console.log(error); + * } + * ); + * + * @module WKT + * @alias Gp.Formats.WKT + * @private + */ + +var WKT = { + + /** + * Parsing d'une chaine WKT + * + * @method toJson + * @param {String} strWkt - chaine de type WKT + * @param {Function} success - fonction callback + * @param {Function} error - fonction callback + */ + toJson : function (strWkt, success, error) { + var logger = Logger.getLogger(); + + var json = null; + + try { + if (!strWkt) { + throw new Error("La chaine WKT n'est pas renseignée !"); + } + + if (!success) { + // callback success par defaut + success = function (json) { + console.log(json); + }; + } + + if (!error) { + // callback error par defaut + error = function (e) { + console.log(e); + }; + } + + var regex; + var subst; + + // regex coordinates + regex = /(-?\d+\.?[0-9]*)\s(-?\d+\.?[0-9]+)/g; + subst = "[$1,$2]"; + strWkt = strWkt.replace(regex, subst); + + // regex type + regex = /^(\w+)/; + regex.exec(strWkt); + if (RegExp.$1 === "POLYGON") { + subst = "{\"type\" : \"Polygon\","; + strWkt = strWkt.replace(RegExp.$1, subst); + // clean + // (( --> coordinates : [[ + regex = /(\({2}?)/; + subst = "\"coordinates\" : [["; + strWkt = strWkt.replace(regex, subst); + // )) --> ]]} + regex = /(\){2}?)/; + subst = "]]}"; + strWkt = strWkt.replace(regex, subst); + // all ( --> [ + regex = /(\()/g; + subst = "["; + strWkt = strWkt.replace(regex, subst); + // all ) --> ] + regex = /(\))/g; + subst = "]"; + strWkt = strWkt.replace(regex, subst); + } else if (RegExp.$1 === "LINESTRING") { + subst = "{\"type\" : \"LineString\","; + strWkt = strWkt.replace(RegExp.$1, subst); + // clean + regex = /(\(\(?)/; + subst = "\"coordinates\" : ["; + strWkt = strWkt.replace(regex, subst); + regex = /(\)\)?)/; + subst = "]}"; + strWkt = strWkt.replace(regex, subst); + } + + logger.trace(strWkt); + + 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); + } + } +}; + +export default WKT; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js new file mode 100644 index 00000000..31699e3b --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/WPS.js @@ -0,0 +1,306 @@ +import Logger from "../Utils/LoggerByDefault"; + +/** + * @classdesc + * Standard WPS + * + * @constructor + * @alias Gp.Formats.WPS + * @param {Object} options - options + * @param {Object} options.data - objet + * @param {String} options.method - POST|GET + * @param {String} options.param.service - "WPS" + * @param {String} options.param.version - "1.0.0" + * @param {String} options.param.identifier - "gs:WPSElevation|gs:WPSLineElevation" + * @param {String} options.param.rawdataoutput - "result" + * @param {String} options.param.request - "Execute" + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * @private + */ +function WPS (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur WPS()]"); + + if (!(this instanceof WPS)) { + throw new TypeError("WPS constructor cannot be called as a function."); + } + + this.options = options || {}; + + /** + * Objet DATA + */ + this.DataObject = this.options.data; + + if (!this.DataObject) { + throw new TypeError("This data object is not defined !"); + } + + /** + * param service. + * Par defaut, "WPS". + */ + this.paramservice = this.options.param.service || "WPS"; + + /** + * param version. + * Par defaut, "1.0.0". + */ + this.paramversion = this.options.param.version || "1.0.0"; + + /** + * param identifier + * Par defaut, "gs:WPS" + */ + this.paramidentifier = this.options.param.identifier || "gs:WPS"; + + /** + * param rawdataoutput + * Par defaut, "result". + */ + this.paramrawdataoutput = this.options.param.rawdataoutput || "result"; + + /** + * param request + * Par defaut, "Execute". + */ + this.paramrequest = this.options.param.request || "Execute"; + + /** + * methode. + * Par defaut, "GET". + */ + this.method = this.options.method || "GET"; +} + +WPS.prototype = { + + /** + * @lends module:WPS# + */ + + /** + * request + * @type {String} + */ + requestString : null, + + /** + * Constructeur (alias) + */ + constructor : WPS, + + /** + * Template de la requête. + */ + template : { + get : { + value : "service=__SERVICE__" + + "&version=__VERSION__" + + "&rawdataoutput=__RAWDATAOUTPUT__" + + "&identifier=__IDENTIFIER__" + + "&request=__REQUEST__" + + "&datainputs=", + + input : "__KEY__=__DATA__" + + }, + post : { + + value : "" + + "" + + "__IDENTIFIER__" + + "" + + "" + + "" + + "" + + "" + + "__RAWDATAOUTPUT__" + + "" + + "" + + "", + + input : "" + + "__KEY__" + + "" + + "__DATA__" + + "" + + "" + } + }, + + /** + * Namespace par defaut de la requete POST. + * + * @returns {String} namespace + */ + 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(" "); + }, + + /** + * Schemalocation par defaut. + * + * @returns {String} schemaLocation + */ + schemaLocationByDefault : function () { + return "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\""; + }, + + /** + * Construction de la requête. + * + * @example + * // GET out : + * // service=__SERVICE__ + * // &version=__VERSION__ + * // &rawdataoutput=__RAWDATAOUTPUT__ + * // &identifier=__IDENTIFIER__ + * // &request=__REQUEST__ + * // &datainputs="__DATAINPUTS__" + * // avec __DATAINPUTS__ = __KEY__=__DATA__;... + * + * // POST out : + * // + * // + * // __IDENTIFIER__ + * // + * // + * // + * // + * // + * // __RAWDATAOUTPUT__ + * // + * // + * // ", + * // avec __DATAINPUTS__ + * // + * // __KEY__ + * // + * // __DATA__ + * // + * // + * + * @returns {Boolean} validation de la construction de la requete + */ + processRequestString : function () { + this.logger.trace("WPS::processRequestString ()"); + + var template = ""; + if (this.method === "POST") { + template = this.template.post.value; + } else if (this.method === "GET") { + template = this.template.get.value; + } else { + this.logger.error("No other method supported by the service !"); + 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); + + // ajout + + if (this.method === "POST") { + template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); + template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); + } + + // ajout des datainputs + template = template.replace(//g, this.__addDataInputs()); + + if (!template) { + this.logger.warn("traduction tmpl : empty request !?"); + return false; + } + + this.requestString = template; + this.logger.trace("traduction tmpl", template); + + return true; + }, + + /** + * Ajout des données + * + * @returns {String} Données concaténées dans une chaine + */ + __addDataInputs : function () { + this.logger.trace("WPS::__addDataInputs ()"); + + // c'est un peu grossier... + 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++) { + // FIXME closure ? + (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; + }, + + /** + * Ajout d'une donnée. + * + * @param {String} tmpl - template + * @param {String} key - clef + * @param {String} data - valeur + * @returns {String} chaine avec les substitutions clef/valeur + */ + __addDataInput : function (tmpl, key, data) { + var tmp = tmpl; + tmp = tmp.replace(/__KEY__/g, key); + tmp = tmp.replace(/__DATA__/g, data); + return tmp; + }, + + /** + * Definir le mode de requête + * + * @param {String} method - GET|POST + */ + setMethod : function (method) { + if (method === "GET" || method === "POST") { + this.method = method; + } else { + this.logger.warn("support only GET and POST method !"); + } + }, + + /** + * Retourne le mode de requete (GET|POST). + * + * @returns {AltiRequest.options.mode|String} methode (GET|POST) + */ + getMethod : function () { + return this.method; + } +}; + +export default WPS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js new file mode 100644 index 00000000..44ade42d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS.js @@ -0,0 +1,482 @@ +import Logger from "../Utils/LoggerByDefault"; +import RequestHeader from "./XLS/RequestHeader"; +import Request from "./XLS/Request"; +import AbstractService from "./XLS/AbstractService"; + +/** + * @classdesc + * + * standard OpenLS + * standard XLS + * (version 1.2) + * + * Réfs : + * - {@link http://schemas.opengis.net/ols/1.2/} + * - {@link http://www.opengeospatial.org/standards/ols} + * - {@link http://wxs.ign.fr/schemas/} + * + * + * Création du template XLS (avec gestion des namespaces) + * ------------------------ + * ``` + * balise xsd : element name="XLS" attribute name="version" [(attribute ref="lang")] + * ``` + * + * Exemple : + * ``` + * + * < (ref. OLS) /> + * + * ``` + * ``` + * + * + * + * ``` + * + * Création des templates OLS pour LocationUtilityService + * ------------------------------------------------------ + * + * Exemple : + * + * ``` + * + * + * + *
+ * saint mandé + *
+ *
+ *
+ * ``` + * ``` + * + * + * + * + * + * 50.347775 3.205098 + * + * + * StreetAddress + * + * + * ``` + * ``` + * Geocodage direct (balise xsd) : + * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] + * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] + * element name="GeocodeRequest" attribute name="returnFreeForm" + * element ref="xls:Address" + * ``` + * ``` + * Geocodage inverse (balise xsd) : + * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] + * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] + * element name="ReverseGeocodeRequest" + * element ref="xls:Position" + * element name="ReverseGeocodePreference" (enumeration) + * ``` + * + * Il existe 3 sous ensembles d'objets : + * - RequestHeader + * - Request + * - ReverseGeocodeRequest, GeocodeRequest + * + * GeocodeRequest est composé d'un objet {@link Gp.Services.Geocode.Response.GeocodeLocation}. + * ReverseGeocodeRequest est composé d'un objet {@link Gp.Services.ReverseGeocode.Response.ReverseGeocodeLocation}. + * + * Les locations font appels aux objets suivants qui possèdent des attributs spécifiques + * en fonction du type de table de geocodage interrogé : + * - StreetAddress + * - CadastralParcel + * - PositionOfInterest + * - Administratif + * + * + * et des élements sous jacents tels que : + * - ReverseGeocodePreference -> tables de geocodages : + * - StreetAddress + * - CadastralParcel + * - PositionOfInterest + * - Administratif (une balise par table) + * - Position -> standard GML 3.2.1 + * - Address -> cf. ci-dessous + * + * ``` + * Position (balise xsd) : + * ex. 50.347775 3.205098 + * ex. 48.85978570614691 2.29135727611288781000 + * (au choix) + * element ref="gml:Point" + * element ref="gml:CircleByCenterPoint" + * element ref="gml:Polygon" + * element ref="gml:MultiPolygon" + * les autres elemennts ne sont pas implémentés (QoP, Speed, Direction, Time, ...) + * + * Address (balise xsd) : + * ex.
1 r de paris saint denis
+ * attribute name="countryCode" + * element name="freeFormAddress" + * element ref="xls:Place" + * element ref="gml:Envelope" + * ou + * ex.
1 rue MarconiMetz57000
+ * attribute name="countryCode" + * element ref="xls:StreetAddress" + * element ref="xls:PostalCode" + * element ref="xls:Place" + * element ref="gml:Envelope" + * + * Place (balise xsd) : + * ex. Metz + * attribute name="type" + * enumeration value="CountrySubdivision" + * enumeration value="CountrySecondarySubdivision" + * enumeration value="Municipality" + * enumeration value="MunicipalitySubdivision" + * enumeration value="choume-banchi-go" + * enumeration value="Qualite" + * enumeration value="Departement" + * enumeration value="Bbox" + * enumeration value="Commune" + * enumeration value="Territoire" + * enumeration value="Importance" + * enumeration value="Nature" + * (la liste n'est pas exhaustives...) + * + * StreetAddress (balise xsd) : + * ex. 1 rue Marconi + * attribute name="locator" + * element name="xls:Building" + * element ref="xls:Street" + * + * Street (balise xsd) : + * ex. 1 rue Marconi + * attribute name="officialName" (...) + * + * Building (balise xsd) : + * ex. + * attribute name="number" attribute name="subdivision" attribute name="buildingName" + * + * PostalCode (balise xsd) : + * ex. 77182 + * + * ``` + * + * Requête + * ------- + * + * 2 modes de requête sur les services : GET ou POST. + * + * Le mode GET n'est que l'encodage du XML en param (qxml) de la requête (donc pas d'implementation particulière ?) + * + * Modèle de classes + * ----------------- + * + * ``` + * ________ XLS ____________ + * / | \ + * RequestHeader AbstractService Request + * ^ + * ______|________________________ + * (extends) / \ (extends) + * LocationUtilityService RouteService + * | | + * ___________|___________ (...) + * / \ + * GeocodeRequest ReverseGeocodeRequest + * | | + * | _____|______ + * | / \ + * Address Preference Position + * | + * / \ + * Place StreetAddress + * | + * / \ + * Street Building + * ``` + * + * @example + * // encapsule un objet 'LocationUtilityService' + * // dans une coquille XSL (avec/sans namespace) + * xsl = new XSL (); + * xsl.namespace = false; + * xsl.srsName = "epsg:4326"; + * xsl.maximumResponses = 26; + * // methodName fournit par l'objet 'lus' + * // requestID est calculé + * xsl.setService (lus); + * xsl.build (); + * // out -> + * // + * // + * // + * // < (ref. LocationUtilityService ou vide) /> + * // + * // + * + * + * @constructor + * @alias Gp.Formats.XLS + * @param {Object} options - options du constructeur + * @param {Object} options.srsName - identifiant du Systeme de Coordonnees + * @param {String} options.maximumResponses - nombre de reponses max d'une requete + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function XLS (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur XLS()]"); + + if (!(this instanceof XLS)) { + throw new TypeError("XLS constructor cannot be called as a function."); + } + + // options par defaut + this.options = { + srsName : "EPSG:4326", + maximumResponses : 25 + }; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + if (options[opt]) { + this.options[opt] = options[opt]; + } + } + } +} + +/** + * Version + */ +XLS.VERSION = "1.2"; + +XLS.prototype = { + + /** + * @lends module:XLS# + */ + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * namespace + * Surcharge les balises XLS d'un prefixe. + * Par defaut, false + * @type {Boolean} + */ + namespace : false, + + /** + * Objet Service + * LocationUtilityService ou RouteService + * @type {AbstractService} + */ + oService : null, + + /** + * Constructeur (alias) + */ + constructor : XLS, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __VERSION__, __NAMESPACE__, __SCHEMALOCATION__ + * __REQUESTHEADER__, __REQUEST__ + */ + template : "\n" + + "\n" + + "__REQUESTHEADER__\n" + + "__REQUEST__\n" + + "\n", + + /** + * Namespace par defaut. + * + * @returns {String} namespace + */ + 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(" "); + }, + + /** + * Schemalocation par defaut + * + * @returns {String} schemaLocation + */ + schemaLocationByDefault : function () { + return "xsi:schemaLocation=\"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.2/olsAll.xsd\""; + }, + + /** + * Setter Service + * Ajout d'un objet de type LocationUtilityService (LUS) ou RouteService + * + * @param {Object} oService - GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest + */ + setService : function (oService) { + if (!oService) { + this.logger.trace("L'objet de type Service XSL n'est pas encore defini !?"); + return; + } + + if (oService instanceof AbstractService) { + this.oService = oService; + } else { + this.logger.error("L'objet n'est pas du type 'LocationUtilityService' ou 'RouteService' !?"); + } + }, + + /** + * Getter Service + * Retourne un objet de type LocationUtilityService (LUS) ou RouteService + * ex. GeoceodeRequest / ReverseGeocodeRequest ou RouteRequest + * + * @returns {Object} service (LocationUtilityService|RouteService) + */ + getService : function () { + return this.oService; + } +}; + +/** + * Ajout d'un prefixe de namespace + * + * @todo impl. l'ajout de namespace + * @param {Object} ns - ex. {key:xls, url:http://www.opengis.net/xls} + * @param {String} request - requête + * @returns {String} requête + */ +XLS.prototype.addNamespace = function (ns, request) { + // INFO + // on recherche la clef dans les namespaces par defaut. + // si la clef n'existe pas dans les namespaceByDefault (), on l'ajoute. + // on surcharge toutes les balises, ex. XLS -> xls:XLS + // sauf celles qui sont déjà prefixées ! + + var keyNS = ns.key; + // var urlNS = ns.url; // TODO not yet implemented ! + + // recherche la clef dans les namespaces par defaut + 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]; + // var url = map[1]; // TODO not yet implemented ! + + if (key === "xmlns:" + keyNS) { + bFound = true; + break; + } + } + + // TODO + // si on a une nouvelle clef, on l'ajoute... + if (!bFound) { + this.logger.warn("L'ajout d'un nouvel namespace n'est pas encore implémenté !"); + return request; + } + + // surcharge toutes les balises + var regex; + var subst; + + // regex balise ouvrante + regex = /<(\w+[\s>])/g; + subst = "<" + keyNS + ":$1"; + request = request.replace(regex, subst); + + // regex balise fermante + regex = /<\/(\w+[\s>])/g; + subst = " + // + // + // + // < (ref. LocationUtilityService ou vide) /> + // + // + + // as t on un objet de type Service XLS à disposition ? + var bService = !!this.getService(); + + var template = ""; + template = this.template; + template = template.replace(/__VERSION__/g, XLS.VERSION); + template = template.replace(/__NAMESPACE__/g, this.namespaceByDefault); + template = template.replace(/__SCHEMALOCATION__/g, this.schemaLocationByDefault); + + // header + var oHeader = new RequestHeader({ + srsName : this.options.srsName + }); + template = template.replace(/__REQUESTHEADER__/g, oHeader.toString()); + + // request + var oRequest = new Request({ + maximumResponses : this.options.maximumResponses, + version : XLS.VERSION, // FIXME même version ? + methodName : bService ? this.getService().CLASSTYPE : null + }); + template = template.replace(/__REQUEST__/g, oRequest.toString()); + + // objet lus ou route + if (bService) { // INFO : clef __REQUESTSERVICE__ dispo dans l'objet 'Request' + template = template.replace(//g, this.getService().toString()); + } + + if (!template) { + this.logger.warn("traduction tmpl : empty request !?"); + return; + } + + // ajout d'un namespace + if (this.namespace) { + // ajout de xls par defaut + template = this.addNamespace({ + key : "xls", + url : "http://www.opengis.net/xls" + }, template); + } + + this.requestString = template; + this.logger.trace("traduction tmpl", template); + + // on retourne qqchose ! + return this.requestString; +}; + +export default XLS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js new file mode 100644 index 00000000..317485a4 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/AbstractService.js @@ -0,0 +1,85 @@ +import Logger from "../../Utils/LoggerByDefault"; + +/** + * @classdesc + * @private + * + * @constructor + * @alias Gp.Formats.XLS.AbstractService + * + * @param {Object} [options] - options + */ +function AbstractService (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur AbstractService ()]"); + + if (!(this instanceof AbstractService)) { + throw new TypeError("AbstractService constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || {}; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } +} + +/** + * @lends module:AbstractService# + */ +AbstractService.prototype = { + + /** + * request (out) + * @type {String} + */ + strRequest : null, + + /** + * objet Request + * @type {Request} + */ + oRequest : null, + + /** + * Filter + * @type {FilterExtension} + */ + oFilter : null, + + /** + * Constructeur (alias) + */ + constructor : AbstractService, + + /** + * Ajout d'un objet de type Request : GeocodeRequest / ReverseGeocodeRequest / RouteRequest + * + * @param {Object} oRequest - GeocodeRequest / ReverseGeocodeRequest / RouteRequest + */ + addRequest : function (oRequest) { + this.logger.error("overwritten method !"); + }, + + /** + * Ajout d'un objet de type FilterExtension : GeocodeFilterExtension ou RouteRequestExtension + * + * @param {Object} oFilter - GeocodeFilterExtension ou RouteRequestExtension + */ + addFilter : function (oFilter) { + this.logger.error("overwritten method !"); + }, + + /** + * toString + */ + toString : function () { + this.logger.error("overwritten method !"); + } +}; + +export default AbstractService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js new file mode 100644 index 00000000..8742942f --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService.js @@ -0,0 +1,194 @@ +import Logger from "../../Utils/LoggerByDefault"; +import AbstractService from "./AbstractService"; +import GeocodeRequest from "./LocationUtilityService/GeocodeRequest"; +import ReverseGeocodeRequest from "./LocationUtilityService/ReverseGeocodeRequest"; +import GeocodeFilterExtension from "./LocationUtilityService/GeocodeFilterExtension"; + +/** + * @classdesc + * + * Requête de type LocationUtilityService (LUS) + * (Factory) + * + * @example + * // encapsule un objet dans une coquille XSL, Factory sur les objets Geocode/ReverseGeocode + * lus = new LocationUtilityService (); + * lus.addRequest (req); + * lus.toString(); + * ou + * lus = new LocationUtilityService ({ + * location : "saint mandé", + * returnFreeForm : true, + * filterOptions : { + * type : ['PositionOfInterest'] + * } + * }); + * lus.toString(); + * + * // out -> + * // + * //
+ * // saint mandé + * //
+ * //
+ * + * // creation de l'objet Geocode + * req = new GeocodeRequest (); + * req.addAddress (new Address (/*todo/*)); + * req.toString(); + * // out -> + * // + * //
+ * // saint mandé + * //
+ * //
+ * + * // creation de l'objet ReverseGeocode + * req = new ReverseGeocodeRequest (); + * req.addPosition (new Position (position:{x: , y: })); + * req.addPreference (['StreetAddress']); + * req.toString(); + * // out -> + * // + * // + * // + * // 50.347775 3.205098 + * // + * // + * // StreetAddress + * // + * + * @constructor + * @alias Gp.Formats.XLS.LocationUtilityService + * @param {Object} options - options + * @param {Object} options.location - location + * @param {String} options.position - position : {x : "", y : ""} + * @param {String} options.returnFreeForm - true|false + * @param {Object} options.filterOptions - filtres + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function LocationUtilityService (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur LocationUtilityService ()]"); + + if (!(this instanceof LocationUtilityService)) { + throw new TypeError("LocationUtilityService constructor cannot be called as a function."); + } + + /** + * Nom de la classe + */ + this.CLASSNAME = "LocationUtilityService"; + + /** + * Type de classe de geocodage + * ex. GeocodeRequest ou ReverseGeocodeRequest + */ + this.CLASSTYPE = null; + + // appel du constructeur par heritage + AbstractService.apply(this, arguments); + + // on determine le type de geocodage si les options sont renseignées + if (this.options) { + this.CLASSTYPE = (this.options.location) ? "GeocodeRequest" : (this.options.position) ? "ReverseGeocodeRequest" : null; + } +} + +/** + * @lends module:LocationUtilityService# + */ +LocationUtilityService.prototype = Object.create(AbstractService.prototype, { + // todo + // getter/setter +}); + +/** + * Constructeur (alias) + */ +LocationUtilityService.prototype.constructor = LocationUtilityService; + +/** + * (overwrite) Ajout d'un objet de type LUS : GeocodeRequest ou ReverseGeocodeRequest + * + * @param {Object} oLUSRequest - objet de type LUS + */ +LocationUtilityService.prototype.addRequest = function (oLUSRequest) { + // on determine le type de geocodage + this.CLASSTYPE = oLUSRequest.CLASSNAME; + + // on controle les types acceptés + 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' !?"); + } +}; + +/** + * (overwrite) Ajout d'un objet de type GeocodeFilterExtension + * + * @param {Object} oFilter - objet de type Filtre + */ +LocationUtilityService.prototype.addFilter = function (oFilter) { + // FIXME gestion des filtres à partir des tables de geocodages + if (oFilter instanceof GeocodeFilterExtension) { + this.oFilter = oFilter; + } +}; + +/** + * (overwrite) toString + * + * @returns {String} requête + */ +LocationUtilityService.prototype.toString = function () { + // soit, on a un objet LUS Request déjà instancié + // sinon, il faut le construire à partir des options à disposition + if (!this.oRequest) { + // il nous faut des options + if (!this.options) { + throw new Error("Les options ne sont pas renseignées, impossible de construire la requête !"); + } + + // si les options 'location' et 'position' sont renseignées, + // on prendra par defaut le choix du geocodage direct + if (this.CLASSTYPE === "GeocodeRequest") { + var settingsDirect = { + location : this.options.location, + returnFreeForm : this.options.returnFreeForm, + filterOptions : this.options.filterOptions || {} + }; + this.oRequest = new GeocodeRequest(settingsDirect); + // ajout des filtres spécifiques au service du geocodage direct de l'IGN + 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 { + this.logger.error("impossible de determiner le type de geocodage : Direct ou Inverse !?"); + } + } + + // objet indefini !? + if (!this.oRequest) { + throw new Error("Type de Geocodage indefini !"); + } + + this.strRequest = this.oRequest.toString(); + return this.strRequest; +}; + +export default LocationUtilityService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js new file mode 100644 index 00000000..f42cb50d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeFilterExtension.js @@ -0,0 +1,188 @@ + +import Logger from "../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Ajouter des extensions de filtres spécifiques au service de geocodage de l'IGN. + * Ceci permet de contrôler les options spécifiques de la table de geocodage intérrogées. + * + * @example + * var ext = new GeocodeFiltersExtension (); + * ext.add (new Administratif ()); + * ext.add (new StreetAddress ()); + * ext.add (new PositionOfInterest ()); + * ext.add (new CadastralParcel ()); + * + * ext.getNames () + * // --> out + * // [Administratif, StreetAddress, PositionOfInterest, CadastralParcel] + * + * ext.getFilters () + * // --> out + * // [Object, Object, Object, Object] = tableau d'objet GeocodeLocation + * + * ext.getFilter ('StreetAddress') + * // --> out + * // {Object} = objet GeocodeLocation + * + * ext.getAttributs ('StreetAddress') + * // --> out + * // ["bbox", "number", "ID", "IDTR", "postalCode", "quality", "street", "territoire", "commune", "department", "insee", "municipality"] + * + * ext.setPlaceAttributs ('StreetAddress', {number:'', territoire:'', quality:'', fake:''}) + * // --> out + * // (fake est écarté car il n'appartient pas à la liste !) + * + * ext.getPlaceAttributs ('StreetAddress') + * // --> out + * // {number : '', territoire : '', quality : ''} + * + * // Comment ajouter des filtres spécifiques au service de geocodage ? + * var req = new GeocodeRequest ({ + * location : "saint mandé", + * returnFreeForm : true, + * filterOptions : { + * type : ['PositionOfInterest'], <-- ajouter une extension afin de gerer les attributs de cette table de geocodage ! + * (...) + * } + * }) + * req.addFilter (new PositionOfInterest ()); + * @constructor + * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeFilterExtension + * + * @private + */ +function GeocodeFilterExtension () { + this.logger = Logger.getLogger("GeocodeFilterExtension"); + this.logger.trace("[Constructeur GeocodeFilterExtension ()]"); + + if (!(this instanceof GeocodeFilterExtension)) { + throw new TypeError("GeocodeFilterExtension constructor cannot be called as a function."); + } + + /** + * Tableau de filtres (table de geocodage) + */ + this.filters = []; +} + +/** + * @lends module:GeocodeFilterExtension# + */ +GeocodeFilterExtension.prototype = { + + /** + * Constructeur (alias) + */ + constructor : GeocodeFilterExtension, + + /** + * Ajout d'un filtre + * + * @param {Object} oGeocodeLocation - objet de type 'GeocodeLocation' + */ + addFilterExtensions : function (oGeocodeLocation) { + // FIXME test sur le type d'objet ! + if (oGeocodeLocation) { + // FIXME ou test sur ses propriétés ! + this.filters.push(oGeocodeLocation); + } + }, + + // getter + + /** + * Tableau de noms (tables de geocodage) + * + * @returns {Array.} liste des noms de filtres + */ + getNames : function () { + var names = []; + for (var idx in this.filters) { + names.push(this.filters[idx].CLASSNAME); + } + this.logger.trace(names); + return names; + }, + + /** + * Retourne une table de geocodage + * + * @param {String} name - nom de la table de geocodage + * @returns {Object} filtre + */ + getFilter : function (name) { + var filter = null; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME === name) { + filter = this.filters[idx]; + } + } + this.logger.trace(filter); + return filter; + }, + + /** + * Tableau d'objects (tables de geocodage) + * + * @returns {Array.} liste des filtres + */ + getFilters : function () { + this.logger.trace(this.filters); + return this.filters; + }, + + /** + * Récupère la liste des attributs (filtres) sur une table de geocodage + * + * @param {String} name - nom de la table de geocodage + * @returns {Array} liste des attributs d'un filtre + */ + getAttributs : function (name) { + var attributs = []; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME === name) { + attributs = this.filters[idx].attributesList; + } + } + this.logger.trace(attributs); + return attributs; + }, + + /** + * Ajout des attributs (filtres) sur une table de geocodage + * + * @param {String} name - nom de la table de geocodage + * @param {Object} options - options de la table de geocodage + */ + 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]; + } + } + }, + + /** + * Retourne les attributs (filtres) sur une table de geocodage + * + * @param {String} name - nom de la table de geocodage + * @returns {Array} liste des attributs d'un filtre + */ + getPlaceAttributs : function (name) { + var places = {}; + for (var idx in this.filters) { + if (this.filters[idx].CLASSNAME === name) { + places = this.filters[idx].placeAttributes; + } + } + this.logger.trace(places); + return places; + } +}; + +export default GeocodeFilterExtension; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js new file mode 100644 index 00000000..13cb41cd --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/GeocodeRequest.js @@ -0,0 +1,226 @@ +import Logger from "../../../Utils/LoggerByDefault"; +import Address from "./model/Address"; +import GeocodeFilterExtension from "./GeocodeFilterExtension"; + +/** + * @classdesc + * Requête de geocodage direct + * + * ``` + * XSD + * Geocodage direct (balise xsd) : + * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] + * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] + * element name="GeocodeRequest" attribute name="returnFreeForm" + * element ref="xls:Address" + * ``` + * + * @example + * // creation de l'objet Geocode an ajoutant un objet Address + * req = new GeocodeRequest (); + * req.returnFreeForm = true; // TODO ! + * req.addAddress (new Address ({ + * location : "saint mandé", + * type : ['PositionOfInterest'], + * filter : { + * (...) + * } + * })); + * req.toString(); + * // out -> + * // + * //
+ * // saint mandé + * //
+ * //
+ * + * // creation de l'objet Geocode avec les options uniquement + * req = new GeocodeRequest ({ + * location : "saint mandé", + * returnFreeForm : true, + * filterOptions : { + * type : ['PositionOfInterest'], + * (...) + * } + * }); + * req.toString(); + * // out -> + * // + * //
+ * // saint mandé + * //
+ * //
+ * @constructor + * + * @alias Gp.Formats.XLS.LocationUtilityService.GeocodeRequest + * @param {Object} options - options + * @param {Object} options.location - location + * @param {String} options.returnFreeForm - returnFreeForm + * @param {String} options.filterOptions - filtres + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function GeocodeRequest (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur GeocodeRequest ()]"); + + if (!(this instanceof GeocodeRequest)) { + throw new TypeError("GeocodeRequest constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || {}; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + + // TODO + // gestion de l'option 'returnFreeForm' si elle n'est pas renseignée dans les options ! + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "GeocodeRequest"; +} + +GeocodeRequest.prototype = { + + /** + * @lends module:GeocodeRequest# + */ + + /** + * request (out) + * @type {String} + */ + strRequest : null, + + /** + * Addresse + * @type {Address} + */ + oAddress : null, + + /** + * Filter + * @type {GeocodeFilterExtension} + */ + oFilter : null, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __ADDRESS__, __RETURNFREEFORM__ + */ + template : "" + + "__ADDRESS__" + + "", + + /** + * Ajout d'un objet de type Adresse + * + * @param {Object} oAddress - Adresse + */ + addAddress : function (oAddress) { + if (oAddress instanceof Address) { + this.oAddress = oAddress; + } + }, + + /** + * Ajout d'un objet de type GeocodeFilterExtension + * + * @param {Object} oFilter - GeocodeFilterExtension + */ + addFilter : function (oFilter) { + // FIXME gestion des filtres à partir des tables de geocodages + if (oFilter instanceof GeocodeFilterExtension) { + this.oFilter = oFilter; + } + }, + + /** + * Constructeur (alias) + */ + constructor : GeocodeRequest, + + /** + * toString + * + * @returns {String} requête + */ + toString : function () { + var template = ""; + template = this.template; + + // soit on a déjà un objet Address instancié, + // sinon, on le fabrique via les options + 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; // on ne met pas le 'type' dans les filtres... + + // gestion des filtres + if (this.oFilter) { + // on reconstruit les filtres + settings.filter = {}; + + // on determine la liste des filtres possibles + // pour chaque table de geocodage en param + for (var idx in settings.type) { + var filter = settings.type[idx]; + var oFilter = this.oFilter.getFilter(filter); + + if (!oFilter) { + this.logger.warn("Le filtre '" + filter + "' n'existe pas !?"); + continue; + } + + var mFilter = this.options.filterOptions; + + // correspondances des attributs de filtres possibles avec ceux qui sont en options + 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]; + this.logger.trace("Selection du filtre '" + key + "' sur le type '" + filter + "'."); + } + } + + // ajout des valeurs des filtres + 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 !?"); + } + } + + // FIXME gestion des filtres pour un objet Address déjà instancié ? + + template = template.replace(/__ADDRESS__/g, this.oAddress.toString()); + template = template.replace(/__RETURNFREEFORM__/g, (this.options.returnFreeForm) ? "true" : "false"); + + this.strRequest = template; + return this.strRequest; + } +}; + +export default GeocodeRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js new file mode 100644 index 00000000..4ef2e177 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/ReverseGeocodeRequest.js @@ -0,0 +1,177 @@ + +import Logger from "../../../Utils/LoggerByDefault"; +import Position from "./model/Position"; +import Preference from "./model/Preference"; + +/** + * @classdesc + * + * Requête de geocodage inverse + * + * XSD + * ``` + * Geocodage inverse (balise xsd) : + * element ref="RequestHeader" [ (attribute name="clientName" attribute name="clientPassword" attribute name="sessionID" attribute name="srsName" attribute name="MSID") ] + * element name="Request" attribute name="methodName" attribute name="version" attribute name="requestID" [ attribute name="maximumResponses" ] + * element name="ReverseGeocodeRequest" + * element ref="xls:Position" + * element name="ReverseGeocodePreference" (enumeration) + * ``` + * + * @example + * // creation de l"objet ReverseGeocode + * req = new ReverseGeocodeRequest (); + * req.addPosition (new Position (position:{x: , y: })); + * req.addPreference (["StreetAddress"]); + * req.toString(); + * // out -> + * // + * // + * // + * // 50.347775 3.205098 + * // + * // + * // StreetAddress + * // + * @constructor + * @alias Gp.Formats.XLS.ReverseGeocodeRequest + * @param {Object} options - options + * @param {Object} options.position - position + * @param {String} options.returnFreeForm - returnFreeForm + * @param {String} options.filterOptions - filtres + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function ReverseGeocodeRequest (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur ReverseGeocodeRequest ()]"); + + if (!(this instanceof ReverseGeocodeRequest)) { + throw new TypeError("ReverseGeocodeRequest constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || {}; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "ReverseGeocodeRequest"; +} + +ReverseGeocodeRequest.prototype = { + + /** + * @lends module:ReverseGeocodeRequest# + */ + + /** + * request (out) + * @type {String} + */ + strRequest : null, + + /** + * Position + * @type {Position} + */ + oPosition : null, + + /** + * Preference + * @type {Preference} + */ + oPreference : null, + + /** + * Constructeur (alias) + */ + constructor : ReverseGeocodeRequest, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __POSITION__, __PREFERENCE__, __RETURNFREEFORM__ + */ + template : "" + + "__POSITION__" + + "__PREFERENCE__" + + "", + + /** + * Ajout d"un objet de type Position + * + * @param {Object} oPosition - Position + */ + addPosition : function (oPosition) { + if (oPosition instanceof Position) { + this.oPosition = oPosition; + } + }, + + /** + * Ajout d"une liste de table de référence LUS : + * [StreetAddress, PointOfInterest, CadastralParcel, Administrativ] + * + * @param {Object} oPreference - Preference + */ + addPreferences : function (oPreference) { + if (oPreference instanceof Preference) { + this.oPreference = oPreference; + } + }, + + /** + * toString + * @returns {String} requête + */ + toString : function () { + var template = ""; + template = this.template; + + // si on a déjà un objet Preference instancié, + // sinon, on le fabrique via les options + 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()); + + // si on a déjà un objet Position instancié, + // sinon, on le fabrique via les options + if (!this.oPosition) { + var settings = { + position : this.options.position, + filter : {} + }; + + // FIXME gestion des filtres ? + if (this.options.filterOptions) { + settings.filter = this.options.filterOptions; + delete settings.filter.type; // pas besoin ? + } + 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; + } +}; + +export default ReverseGeocodeRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js new file mode 100644 index 00000000..4f61d7d3 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Address.js @@ -0,0 +1,281 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Location type "Address". + * + * Modèles de classes : + * ------------------ + * ``` + * + * Address + * (est composé de) + * ______ | _________ _________________ + * / | \ \ + * Place (StreetAddress ou FreeFormAddress) PostalCode + * (*) _|_ + * / \ + * Street Building + * ``` + * ``` + * XSD + * Address (balise xsd) : + * ex.
1 r de paris saint denis
+ * attribute name="countryCode" + * element name="freeFormAddress" + * element ref="xls:Place" + * element ref="gml:Envelope" + * ou + * ex.
1 rue MarconiMetz57000
+ * attribute name="countryCode" + * element ref="xls:StreetAddress" + * element ref="xls:PostalCode" + * element ref="xls:Place" + * element ref="gml:Envelope" + * ``` + * + * @example + * // simple + * adr = new Address ({ + * location : "2 av pasteur, Saint-Mandée", + * type : ["StreetAddress"], + * filter : {} + * }); + * adr.toString(); + * // -> out + * //
+ * // 2 av pasteur, Saint-Mandée + * //
+ * + * // avec filtre + * adr = new Address ({ + * location : { + * number : 2, + * street : "av pasteur", + * city : "Saint-Mandée", // FIXME filter Place "commune" ou "municipality" ? + * postalCode : "94166" // FIXME filter Place ou balise PostalCode ? + * }, + * type : ["StreetAddress"], + * filter : { + * territory : "FR", + * department : "94" + * } + * }); + * adr.toString(); + * // -> out + * //
+ * // + * // + * // 2 av pasteur + * // + * // Saint-Mandée + * // 94 + * // FR + * // 94166 + * //
+ * + * // avec bbox + * adr = new Address ({ + * location : "2 av pasteur, Saint-Mandée", + * type : ["StreetAddress"], + * filter : { + * bbox : {left:1, right:2, top:2, bottom:0} + * } + * }); + * adr.toString(); + * // -> out + * //
+ * // 2 av pasteur, Saint-Mandée + * // + * // 1 0 + * // 2 2 + * // + * //
+ * + * @constructor + * @alias Gp.Formats.XLS.LocationUtilityService.Address + * @param {Object} options - options + * @param {Object} options.location - location + * @param {String} options.type - type + * @param {String} options.filter - filtres + * @param {String} options.filter.* - Filtré en fonction des tables de geocodage interrogées + * + * @private + */ +function Address (options) { + this.logger = Logger.getLogger("Address"); + this.logger.trace("[Constructeur Address ()]"); + + if (!(this instanceof Address)) { + throw new TypeError("Address constructor cannot be called as a function."); + } + + // param par defaut + this.options = options || { + location : {}, + type : ["StreetAddress"], + filter : {} + }; + + // param obligatoire + if (!this.options.location || Object.keys(this.options.location).length === 0) { + throw new Error("l'option 'location' n'est pas renseignée !"); + } +} + +/** + * @lends module:Address# + */ +Address.prototype = { + + /** + * Constructeur (alias) + */ + constructor : Address, + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * + * substitution des valeurs suivantes : + * - address : __COUNTRYCODE__, __LOCATION__, __PLACE__, __POSTALCODE__, __ENVELOPE__ + * - freeFormAddress : __FREEFORMADDRESSVALUE__ + * - streetAddress : __STREET__, __BUILDING__ + * - street : __STREETVALUE__ + * - building : __BUILDINGVALUE__ + * - place : __PLACEATYPE__, __PLACEVALUE__ + * - postalCode : __POSTALCODEVALUE__ + * - gml:envelope : __LEFT__ __BOTTOM__ __RIGHT__ __TOP__ + * + * @todo gestion de l"indentation + */ + 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__" + + "" + } + +}; + +/** + * toString + * + * @returns {String} requête + */ +Address.prototype.toString = function () { + var template = null; + template = this.template.address; + template = template.replace(/__COUNTRYCODE__/g, this.options.type); + + // on a une adresse structurée ou libre ? + if (typeof this.options.location === "string") { + // balise freeFormeAddress + var tmplFreeFormAddress = this.template.location.freeFormAddress; + tmplFreeFormAddress = tmplFreeFormAddress.replace(/__FREEFORMADDRESSVALUE__/g, this.options.location); + template = template.replace(/__LOCATION__/g, tmplFreeFormAddress); + } else { + // balises Street et Building + 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); + } + + // balise streetAddress + 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); + } + + // a t on un filtre de type PostalCode ? + var tmplPostalCode = ""; + if (this.options.location.postalCode) { + tmplPostalCode = this.template.postalCode; + tmplPostalCode = tmplPostalCode.replace(/__POSTALCODEVALUE__/g, this.options.location.postalCode); + } + + // a t on un filtre de type GML::Envelope ? + 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); + } + } + + // liste des filtres Place + var Places = []; + + // a t on des filtres de type Place ? + var tmplPlace = ""; + if (this.options.filter) { + var filters = this.options.filter; + for (var filter in filters) { + if (filter === "bbox") { + continue; + } + // FIXME gestion des filtres spécifiques IGN ? + tmplPlace = this.template.place; + tmplPlace = tmplPlace.replace(/__PLACETYPE__/g, filter); + tmplPlace = tmplPlace.replace(/__PLACEVALUE__/g, filters[filter]); + Places.push(tmplPlace); + } + } + + // a t on un filtre de type Place dans location ? + 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; +}; + +export default Address; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js new file mode 100644 index 00000000..78affdef --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Building.js @@ -0,0 +1,26 @@ +/** + * implemented into class 'Address' ! + * + * Location type Building + * + * - options + * - options.location.number + * + * FIXME on traite les autres attributs ? + * + * ``` + * XSD + * Building (balise xsd) : + * ex. + * attribute name="number" attribute name="subdivision" attribute name="buildingName" + * + * template : { + * 'attributs' : "" + * avec __attributs__ = + * number=value + * (...) + * } + * ``` + * @alias Gp.Formats.XLS.LocationUtilityService.Building + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js new file mode 100644 index 00000000..b8696fc2 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Place.js @@ -0,0 +1,25 @@ +/** + * implemented into class 'Address' ! + * + * Filter + * + * - options + * - options.filterOptions.municipality + * - options.filterOptions.insee + * - options.filterOptions.department + * - (...) + * + * FIXME liste des attributs disponibles par table ? + * Les filtres de recherches sont disponibles dans les objets de type 'GeocodeLocation' : + * (liste des attributs sur la balise ) + * - Administratif + * - PointOfInterest + * - StreetAddress + * - CadastralParcel + * + * ``` + * template : "__VALUE__" + * ``` + * @alias Gp.Formats.XLS.LocationUtilityService.Place + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js new file mode 100644 index 00000000..b4fe8647 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Position.js @@ -0,0 +1,180 @@ +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * Location de type Position + * + * ``` + * XSD + * Position (balise xsd) : + * ex. 50.347775 3.205098 + * ex. 48.85978570614691 2.29135727611288781000 + * (au choix) + * element ref="gml:Point" + * element ref="gml:CircleByCenterPoint" + * element ref="gml:Polygon" + * element ref="gml:MultiPolygon" + * ``` + * + * FIXME les autres elements ne sont pas implémentés (QoP, Speed, Direction, Time, ...) ? + * + * ``` + * template : " + * __GMLPOINT__ + * __GMLFILTER__ + * " + * ``` + * ``` + * GML : { + * pos : "__X__ __Y__", + * point : "__POS__", + * circle : "__POS____RADIUS__", + * // not yet implemented ! + * polygon : "", + * multipolygon : "" + * } + * ``` + * + * @constructor + * @alias Gp.Formats.XLS.LocationUtilityService.Position + * @param {Object} options - options données en entrée + * @param {Object} options.position - x/y + * @param {Object} options.filter - filtre + * @param {Object} options.filter.circle - un cercle + * @param {Object} options.filter.polygon - un polygone + * + * @private + */ +function Position (options) { + this.logger = Logger.getLogger("Position"); + this.logger.trace("[Constructeur Position ()]"); + + if (!(this instanceof Position)) { + throw new TypeError("Position constructor cannot be called as a function."); + } + + // param par defaut + this.options = options || {}; + + // param obligatoire + if (!this.options.position) { + throw new Error("l'option 'position' n'est pas renseignée !"); + } +} + +/** + * @lends module:Position# + */ +Position.prototype = { + + /** + * Constructeur (alias) + */ + constructor : Position, + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * + * substitution des valeurs suivantes : + * __GMLPOINT__ __GMLFILTER__ + * __X__ __Y__ __RADIUS__ + * __XY__ + * @todo indentation XML + * @todo implementation classe GML + */ + template : { + position : "" + + "__GMLPOINT__" + + "__GMLFILTER__" + + "", + gml : { + point : "__X__ __Y__", + pos : null, + filter : { + bbox : "" + + "__LEFT__ __BOTTOM__" + + "__RIGHT__ __TOP__" + + "", + circle : "__X__ __Y____RADIUS__", + polygon : "__XY__", + multipolygon : null + } + } + } +}; + +/** + * toString + * + * @returns {String} requête + */ +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": + // FIXME implementation simple du polygone ! + // aucun test de fermeture du polygone, ni de gestion des trous ! + 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)) { + this.logger.error("Holes are not implemented !"); + 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": + this.logger.warn("Filter '" + name + "' is not yet implemented !"); + break; + default: + this.logger.error("This filter '" + name + "' is not useful !"); + } + } + } + + template = template.replace(/__GMLPOINT__/g, tmplGmlPoint); + template = template.replace(/__GMLFILTER__/g, tmplGmlFilter); + + this.requestString = template; + return this.requestString; +}; + +export default Position; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js new file mode 100644 index 00000000..385813a7 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/PostalCode.js @@ -0,0 +1,21 @@ +/** + * implemented into class 'Address' ! + * + * Location type PostalCode + * + * options + * options.location.postalCode + * + * FIXME filtre (Place) ou location ? + * + * ``` + * XSD + * PostalCode (balise xsd) : + * ex. 77182 + * ``` + * ``` + * template : "__VALUE__" + * ``` + * @alias Gp.Formats.XLS.LocationUtilityService.PostalCode + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js new file mode 100644 index 00000000..c63080b5 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Preference.js @@ -0,0 +1,81 @@ +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Preference (Reverse) + * + * FIXME liste des types de tables de geocodage + * + * ``` + * template : "__TYPE__" + * ``` + * + * @constructor + * @alias Gp.Formats.XLS.LocationUtilityService.Preference + * @param {String} type - type de table de geocodage + * + * @private + * + */ + +function Preference (type) { + this.logger = Logger.getLogger("Preference"); + this.logger.trace("[Constructeur Preference ()]"); + + if (!(this instanceof Preference)) { + throw new TypeError("Preference constructor cannot be called as a function."); + } + + /** + * type de table de geocodage + * @type {Array.} + */ + this.type = type; +} + +/** + * @lends module:Preference# + */ +Preference.prototype = { + + /** + * Constructeur (alias) + */ + constructor : Preference, + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * + * substitution des valeurs suivantes : + * __TYPE__ + * + */ + template : "__TYPE__" +}; + +/** + * toString + * + * @returns {String} requête + */ +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; +}; + +export default Preference; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js new file mode 100644 index 00000000..c08c6b6d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/Street.js @@ -0,0 +1,22 @@ +/** + * implemented into class 'Address' ! + * + * Location type Street + * + * options + * options.location.street + * + * FIXME on traite les attributs ? + * + * ``` + * XSD + * Street (balise xsd) : + * ex. 1 rue Marconi + * attribute name="officialName" (...) + * ``` + * ``` + * template : "__VALUE__" + * ``` + * @alias Gp.Formats.XLS.LocationUtilityService.Street + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js new file mode 100644 index 00000000..9a63fc05 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/LocationUtilityService/model/StreetAddress.js @@ -0,0 +1,32 @@ +/** + * implemented into class 'Address' ! + * + * Location de type StreetAddress + * + * - options + * - options.location.street + * - options.location.number + * - options.city // FIXME quel est son type d'objet ? + * + * ``` + * XSD + * StreetAddress (balise xsd) : + * ex. 1 rue Marconi + * attribute name="locator" + * element name="xls:Building" + * element ref="xls:Street" + * ``` + * + * FIXME on traite les attributs ? + * + * ``` + * template : "\ + * \n\ + * STREET__ \n\ + * BUILDING__\n\ + * " + * ``` + * + * @alias Gp.Formats.XLS.LocationUtilityService.StreetAddress + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js new file mode 100644 index 00000000..16a4cc8c --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/Request.js @@ -0,0 +1,113 @@ +/* jshint bitwise: false */ +import Logger from "../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Requête XLS + * + * @example + * // request XSL + * request = new Request (); + * request.maximumResponses = 26; + * request.methodName = "GeocodeRequest"; + * request.version = "1.2"; + * request.toString(); + * // out -> + * // + * // + * // + * + * @constructor + * @alias Gp.Formats.XLS.Request + * @param {Object} options - options + * @param {Object} options.maximumResponses - 25 + * @param {String} options.methodName - nom de l'objet LUS, "GeocodeRequest" | "ReverseGeocodeRequest" + * @param {String} options.version - '1.2' + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function Request (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur Request ()]"); + + if (!(this instanceof Request)) { + throw new TypeError("Request constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || { + maximumResponses : 25, + methodName : null, + version : "1.2" + }; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } +} + +Request.prototype = { + + /** + * @lends module:Request# + */ + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __MAXRESPONSES__, __METHODNAME__, __UUID__, __VERSION__ + * __REQUESTSERVICE__ + */ + template : "" + + "" + + "", + + /** + * Constructeur (alias) + */ + constructor : Request, + + /** + * an rfc4122 version 4 compliant guid + * @returns {String} guid + */ + guid : function () { + // INFO + // cf. http://byronsalau.com/blog/how-to-create-a-guid-uuid-in-javascript/ + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0; + var v = c === "x" ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }, + + /** + * toString + * @returns {String} requête + */ + 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; + } +}; + +export default Request; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js new file mode 100644 index 00000000..c8b12830 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RequestHeader.js @@ -0,0 +1,83 @@ +import Logger from "../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Entête de la requête XSL + * + * @example + * // header XSL + * header = new RequestHeader (); + * header.srsName = "epsg:4326"; + * header.toString(); + * // out -> + * // + * + * @constructor + * @alias Gp.Formats.XLS.RequestHeader + * @param {Object} options - options + * @param {Object} options.srsName - projection + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function RequestHeader (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur RequestHeader ()]"); + + if (!(this instanceof RequestHeader)) { + throw new TypeError("RequestHeader constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || { + srsName : "EPSG:4326" + }; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } +} + +RequestHeader.prototype = { + + /** + * @lends module:RequestHeader# + */ + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __SRSNAME__ + */ + template : "", + + /** + * Constructeur (alias) + */ + constructor : RequestHeader, + + /** + * toString + * @returns {String} requête + */ + toString : function () { + var template = null; + template = this.template; + template = template.replace(/__SRSNAME__/g, this.options.srsName); + this.requestString = template; + return this.requestString; + } +}; + +export default RequestHeader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js new file mode 100644 index 00000000..f31a9574 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService.js @@ -0,0 +1,312 @@ +import Logger from "../../Utils/LoggerByDefault"; +import AbstractService from "./AbstractService"; +import DetermineRouteRequest from "./RouteService/DetermineRouteRequest"; +import RouteRequestExtension from "./RouteService/RouteRequestExtension"; + +/** + * @classdesc + * + * Requête de type RouteService + * (Factory) + * + * XSD : + * ---- + * [] => non implementé ! + * + * ``` + * element name="DetermineRouteRequest" + * [attribute name="provideRouteHandle" default="false"] + * attribute name="distanceUnit" default="M" + * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] + * element ref="xls:RoutePlan" + * element ref="xls:RouteInstructionsRequest" + * [element ref="xls:RouteGeometryRequest"] + * [element ref="xls:RouteMapRequest"] + * ``` + * ``` + * element name="RoutePlan" + * [attribute name="useRealTimeTraffic" default="false"] + * [attribute name="expectedStartTime" type="dateTime"] + * [attribute name="expectedEndTime" type="dateTime"] + * element ref="xls:RoutePreference" + * element ref="xls:WayPointList" + * element ref="xls:AvoidList" + * ``` + * ``` + * element name="RoutePreference" => value = Fastest | Shortest | Pedestrian + * ``` + * ``` + * element name="WayPointList" + * element ref="xls:StartPoint" + * element ref="xls:ViaPoint" minOccurs="0" + * element ref="xls:EndPoint" + * ``` + * ``` + * element name="StartPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="ViaPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="EndPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="AvoidList" + * [element ref="xls:AOI"] + * [element ref="xls:_Location"] (cf. element name="Position") + * element ref="xls:AvoidFeature" + * ``` + * ``` + * [element name="AOI"] + * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] + * ``` + * ``` + * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge + * ``` + * ``` + * [element name="RouteMapRequest"] + * [element name="Output"] + * attribute name="width" + * attribute name="height" + * attribute name="format" + * attribute name="BGcolor" + * attribute name="transparent" + * attribute name="style" => value = Overview | Maneuver + * element name="BBoxContext" type="gml:EnvelopeType" + * ``` + * ``` + * element name="RouteInstructionsRequest" + * [attribute name="format"] default="text/plain" + * attribute name="provideGeometry" default="false" + * attribute name="provideBoundingBox" default="false" + * ``` + * ``` + * [element name="RouteGeometryRequest"] + * [attribute name="scale"] default="1" + * [attribute name="provideStartingPortion"] default="false" + * [attribute name="maxPoints"] default="100" + * [element name="BoundingBox" type="gml:EnvelopeType" ] + * ``` + * + * -------- + * Requête : + * -------- + * ``` + * + * + * + * + * + * + * Fastest + * + * + * + * 2.29993 48.87228 + * + * + * -1.53604 47.21548 + * + * + * + * + * + * + * + * non implementé ! + * + * ``` + * element name="DetermineRouteRequest" + * [attribute name="provideRouteHandle" default="false"] + * attribute name="distanceUnit" default="M" + * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] + * element ref="xls:RoutePlan" + * element ref="xls:RouteInstructionsRequest" + * [element ref="xls:RouteGeometryRequest"] + * [element ref="xls:RouteMapRequest"] + * ``` + * ``` + * element name="RouteInstructionsRequest" + * [attribute name="format"] default="text/plain" + * attribute name="provideGeometry" default="false" + * attribute name="provideBoundingBox" default="false" + * ``` + * ``` + * element name="RouteGeometryRequest" + * [attribute name="scale"] default="1" + * [attribute name="provideStartingPortion"] default="false" + * [attribute name="maxPoints"] default="100" + * [element name="BoundingBox" type="gml:EnvelopeType" ] + * ``` + * ``` + * [element name="RouteMapRequest"] + * [element name="Output"] + * [attribute name="width"] + * [attribute name="height"] + * [attribute name="format"] + * [attribute name="BGcolor"] + * [attribute name="transparent"] + * [attribute name="style"] => value = Overview | Maneuver + * [element name="BBoxContext" type="gml:EnvelopeType"] + * ``` + * + * -------- + * Requête : + * -------- + * ``` + * + * + * Fastest + * + * + * + * 2.29993 48.87228 + * + * + * -1.53604 47.21548 + * + * + * + * + * + * + * ``` + * + * @constructor + * @alias Gp.Formats.XLS.RouteService.DetermineRouteRequest + * @param {Object} options - options + * @param {Object} options.route.routePreference - « fastest », « shortest » ou « pedestrian » + * @param {String} options.route.startPoint - Point de départ (coordonnées exprimées en WGS84G) + * @param {String} options.route.viaPoint - Liste de points intermédiaires + * @param {String} options.route.endPoint - Point d'arrivée (coordonnées) + * @param {Object} options.route.avoidFeature - « highway », « tollway », « tunnel » ou « bridge » + * @param {Object} options.route.vehicle - « car » + * @param {Object} options.route.expectedStartTime - Date et heure de départ + * @param {Object} options.provideGeometry - true | false + * @param {Object} options.provideBoundingBox - true | false + * @param {Object} options.distanceUnit - Unité dans lesquelles la distance est exprimée (« m » ou « km ») + * @param {Function} options.onsuccess - function callback success (TODO) + * @param {Function} options.onerror - function callback error (TODO) + * + * @private + */ +function DetermineRouteRequest (options) { + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur DetermineRouteRequest ()]"); + + if (!(this instanceof DetermineRouteRequest)) { + throw new TypeError("DetermineRouteRequest constructor cannot be called as a function."); + } + + // options par defaut + this.options = options || {}; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "DetermineRouteRequest"; +} + +DetermineRouteRequest.prototype = { + + /** + * @lends module:DetermineRouteRequest# + */ + + /** + * request (out) + * @type {String} + */ + strRequest : null, + + /** + * RoutePlan + * @type {Address} + */ + oRoutePlan : null, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * __DISTANCEUNIT__, + * __ROUTEPLAN__, __ROUTEINSTRUCTIONREQUEST__, __ROUTEGEOMETRYREQUEST__, __ROUTEMAPREQUEST__ + * __PROVIDEGEOMETRY__, __PROVIDEBBOX__ + */ + template : { + determineRouteRequest : "" + + "__ROUTEPLAN__" + + "__ROUTEINSTRUCTIONREQUEST__" + + "__ROUTEGEOMETRYREQUEST__" + + "__ROUTEMAPREQUEST__" + + "", + routeInstructionRequest : "", + routeGeometryRequest : "", + routeMapRequest : "" // FIXME not yet implemented ! + }, + + /** + * Ajout d'un objet de type RoutePlan + * + * @param {Object} oRoutePlan - RoutePlan + */ + addRoute : function (oRoutePlan) { + if (oRoutePlan instanceof RoutePlan) { + this.oRoutePlan = oRoutePlan; + } + }, + + /** + * Constructeur (alias) + */ + constructor : DetermineRouteRequest, + + /** + * toString + * + * @returns {String} requête + */ + toString : function () { + var template = ""; + template = this.template.determineRouteRequest; + template = template.replace(/__DISTANCEUNIT__/g, this.options.distanceUnit || "KM"); + + // soit on a déjà un objet RoutePlan instancié, + // sinon, on le fabrique via les options + 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 !?"); + } + } + + // routeplan + template = template.replace(/__ROUTEPLAN__/g, this.oRoutePlan.toString()); + + // instruction + 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); + + // geometry + var tmplGeometry = this.template.routeGeometryRequest; + template = template.replace(/__ROUTEGEOMETRYREQUEST__/g, tmplGeometry); + + // map + var tmplMap = this.template.routeMapRequest; + template = template.replace(/__ROUTEMAPREQUEST__/g, tmplMap); + + this.strRequest = template; + return this.strRequest; + } +}; + +export default DetermineRouteRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js new file mode 100644 index 00000000..1989a5de --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/RouteRequestExtension.js @@ -0,0 +1,10 @@ +/** + * not implemented ! + * + * Extension de type 'graphName' de l'objet RoutePlan' + * + * FIXME L'extension 'graphName' est intégré comme étant du standard OLS. + * La balise viendrait surcharger le comportement de RoutePreference... + * + * ex. + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js new file mode 100644 index 00000000..56758d5e --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/AvoidList.js @@ -0,0 +1,37 @@ +/** + * implemented into class 'RoutePlan' ! + * + * Element permettant de spécifier des caractéristiques de tronçons à éviter. + * + * ---- + * XSD : + * ---- + * [] => non implementé ! + * ``` + * element name="RoutePlan" + * [attribute name="useRealTimeTraffic" default="false"] + * [attribute name="expectedStartTime" type="dateTime"] + * [attribute name="expectedEndTime" type="dateTime"] + * element ref="xls:RoutePreference" + * element ref="xls:WayPointList" + * element ref="xls:AvoidList" + * ``` + * ``` + * element name="AvoidList" + * [element ref="xls:AOI"] + * [element ref="xls:Location"] (cf. element name="Position") + * element ref="xls:AvoidFeature" + * ``` + * ``` + * [element name="AOI"] + * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] + * ``` + * ``` + * element name="AvoidFeature" + * => value = highway | tollway | tunnel | bridge + * ``` + * + * @module AvoidList + * @private + * @alias Gp.Formats.XLS.RouteService.AvoidList + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js new file mode 100644 index 00000000..f79ae6dd --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteGeometryRequest.js @@ -0,0 +1,31 @@ +/** + * implemented into class 'DetermineRouteRequest' ! + * + * ---- + * XSD : + * ---- + * + * [] => non implementé ! + * ``` + * element name="DetermineRouteRequest" + * [attribute name="provideRouteHandle" default="false"] + * attribute name="distanceUnit" default="M" + * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] + * element ref="xls:RoutePlan" + * element ref="xls:RouteInstructionsRequest" + * [element ref="xls:RouteGeometryRequest"] + * [element ref="xls:RouteMapRequest"] + * ``` + * ``` + * element name="RouteGeometryRequest" + * [attribute name="scale"] default="1" + * [attribute name="provideStartingPortion"] default="false" + * [attribute name="maxPoints"] default="100" + * [element name="BoundingBox" type="gml:EnvelopeType" ] + * ``` + * + * @module RouteGeometryRequest + * @private + * @alias Gp.Formats.XLS.RouteService.RouteGeometryRequest + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js new file mode 100644 index 00000000..ce540820 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteInstructionsRequest.js @@ -0,0 +1,35 @@ +/** + * implemented into class 'DetermineRouteRequest' ! + * + * Pour pouvoir spécifier les éléments qui doivent apparaître dans la réponse au niveau des instructions : + * - géométrie de chaque instruction + * - zone d'encombrement de chaque instruction + * Par défaut, tous ces paramètres sont à false. + * + * ---- + * XSD : + * ---- + * + * [] => non implementé ! + * ``` + * element name="DetermineRouteRequest" + * [attribute name="provideRouteHandle" default="false"] + * attribute name="distanceUnit" default="M" + * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] + * element ref="xls:RoutePlan" + * element ref="xls:RouteInstructionsRequest" + * [element ref="xls:RouteGeometryRequest"] + * [element ref="xls:RouteMapRequest"] + * ``` + * ``` + * element name="RouteInstructionsRequest" + * [attribute name="format"] default="text/plain" + * attribute name="provideGeometry" default="false" + * attribute name="provideBoundingBox" default="false" + * ``` + * + * @module RouteInstructionsRequest + * @private + * @alias Gp.Formats.XLS.RouteService.RouteInstructionsRequest + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js new file mode 100644 index 00000000..bf23fec4 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RouteMapRequest.js @@ -0,0 +1,35 @@ +/** + * not implemented ! + * + * ---- + * XSD : + * ---- + * [] => non implementé ! + * + * ``` + * element name="DetermineRouteRequest" + * [attribute name="provideRouteHandle" default="false"] + * attribute name="distanceUnit" default="M" + * [element ref="xls:RouteHandle" || element ref="xls:RoutePlan"] + * element ref="xls:RoutePlan" + * element ref="xls:RouteInstructionsRequest" + * [element ref="xls:RouteGeometryRequest"] + * [element ref="xls:RouteMapRequest"] + * ``` + * ``` + * [element name="RouteMapRequest"] + * [element name="Output"] + * [attribute name="width"] + * [attribute name="height"] + * [attribute name="format"] + * [attribute name="BGcolor"] + * [attribute name="transparent"] + * [attribute name="style"] => value = Overview | Maneuver + * [element name="BBoxContext" type="gml:EnvelopeType"] + * ``` + * + * @module RouteMapRequest + * @private + * @alias Gp.Formats.XLS.RouteService.RouteMapRequest + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js new file mode 100644 index 00000000..d3689744 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePlan.js @@ -0,0 +1,255 @@ +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * * Élément regroupant l'ensemble des données et paramètres pour le calcul d'itinéraire : points de navigation, configuration. + * + * ---- + * XSD : + * ---- + * [] => non implementé ! + * + * ``` + * element name="RoutePlan" + * [attribute name="useRealTimeTraffic" default="false"] + * [attribute name="expectedStartTime" type="dateTime"] + * [attribute name="expectedEndTime" type="dateTime"] + * element ref="xls:RoutePreference" + * element ref="xls:WayPointList" + * element ref="xls:AvoidList" + * ``` + * ``` + * element name="RoutePreference" + * => value = fastest | shortest | pedestrian + * ``` + * ``` + * element name="WayPointList" + * element ref="xls:StartPoint" + * element ref="xls:ViaPoint" minOccurs="0" + * element ref="xls:EndPoint" + * ``` + * ``` + * element name="StartPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="ViaPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="EndPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="AvoidList" + * [element ref="xls:AOI"] + * [element ref="xls:_Location"] (cf. element name="Position") + * element ref="xls:AvoidFeature" + * ``` + * ``` + * [element name="AOI"] + * [element ref="gml:CircleByCenterPoint" || element ref="gml:Polygon" || element ref="gml:Envelope"] + * ``` + * ``` + * element name="AvoidFeature" => value = highway | tollway | tunnel | bridge + * ``` + * + * -------- + * Requête : + * -------- + * ``` + * + * Fastest + * + * + * + * 2.29993 48.87228 + * + * + * -1.53604 47.21548 + * + * + * + * highway + * tollway + * tunnel + * + * + * ``` + * @constructor + * @alias Gp.Formats.XLS.RouteService.RoutePlan + * @param {Object} options - options + * + * @private + */ +function RoutePlan (options) { + this.logger = Logger.getLogger("RoutePlan"); + this.logger.trace("[Constructeur RoutePlan ()]"); + + if (!(this instanceof RoutePlan)) { + throw new TypeError("RoutePlan constructor cannot be called as a function."); + } + + // param par defaut + this.options = options || {}; + + // param obligatoire + if (!this.options.startPoint) { + throw new Error("l'option 'startPoint' n'est pas renseignée !"); + } + + if (!this.options.endPoint) { + throw new Error("l'option 'endPoint' n'est pas renseignée !"); + } +} + +RoutePlan.prototype = { + + /** + * Constructeur (alias) + */ + constructor : RoutePlan, + + /** + * request (out) + * @type {String} + */ + requestString : null, + + /** + * Template de la requête. + * substitution des valeurs suivantes : + * - __ROUTEPREFERENCE__, __VALUEROUTEPREFERENCE__ + * - __GRAPH__, __VALUEGRAPH__ + * - __WAYPOINTLIST__ (lst?), __STARTPOINT__, __VIAPOINT__, __ENDPOINT__, __POINT__, __X__, __Y__ + * - __AVOIDLIST__ (lst!), __AVOIDFEATURE__, __VALUEAVOIDFEATURE__ + */ + template : { + routePlan : "" + + "__ROUTEPREFERENCE__" + + "__GRAPH__" + + "__WAYPOINTLIST__" + + "__AVOIDLIST__" + + "", + routePreference : "__VALUEROUTEPREFERENCE__", + graph : "", + wayPointList : { + container : "" + + "__STARTPOINT__" + + "__VIAPOINT__" + + "__ENDPOINT__" + + "", + point : "__X__ __Y__", + startPoint : "" + + "__POINT__" + + "", + endPoint : "" + + "__POINT__" + + "", + viaPoint : "" + + "__POINT__" + + "" // implémentation de plusieurs étapes... + }, + avoidList : { + container : "" + + "__AVOIDFEATURE__" + + "", + avoidFeature : "__VALUEAVOIDFEATURE__" + } + }, + + /** + * toString + * + * @returns {String} requête + */ + toString : function () { + var template = ""; + template = this.template.routePlan; + + // preference + if (this.options.routePreference) { + var tmplPreference = this.template.routePreference; + tmplPreference = tmplPreference.replace(/__VALUEROUTEPREFERENCE__/, this.options.routePreference); + template = template.replace(/__ROUTEPREFERENCE__/g, tmplPreference); + } + // clean preference + template = template.replace(/__ROUTEPREFERENCE__/g, ""); + + // exclusions + 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); + } + // clean exclusions + template = template.replace(/__AVOIDLIST__/g, ""); + + // graph + if (this.options.graph) { + var tmplVehicle = this.template.graph; + tmplVehicle = tmplVehicle.replace(/__VALUEGRAPH__/, this.options.graph); + template = template.replace(/__GRAPH__/g, tmplVehicle); + } + // clean vehicle + template = template.replace(/__GRAPH__/g, ""); + + // points + var tmplWayPointList = this.template.wayPointList.container; + var tmplPoint = ""; + // start + 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)); + // end + 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)); + // via + 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 { + // clean viaPoint + tmplWayPointList = tmplWayPointList.replace(/__VIAPOINT__/, ""); + } + + template = template.replace(/__WAYPOINTLIST__/g, tmplWayPointList); + + this.requestString = template; + return this.requestString; + } +}; + +export default RoutePlan; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js new file mode 100644 index 00000000..705fd003 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/RoutePreference.js @@ -0,0 +1,31 @@ +/** + * implemented into class 'RoutePlan' ! + * + * Indique le type de calcul d'itinéraire souhaité : + * - « Fastest » : au plus rapide + * - « Shortest » : au plus court + * + * ---- + * XSD : + * ---- + * [] => non implementé ! + * + * ``` + * element name="RoutePlan" + * [attribute name="useRealTimeTraffic" default="false"] + * [attribute name="expectedStartTime" type="dateTime"] + * [attribute name="expectedEndTime" type="dateTime"] + * element ref="xls:RoutePreference" + * element ref="xls:WayPointList" + * element ref="xls:AvoidList" + * ``` + * ``` + * element name="RoutePreference" + * => value = fastest | shortest | pedestrian + * ``` + * + * @module RoutePreference + * @private + * @alias Gp.Formats.XLS.RouteService.RoutePreference + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js new file mode 100644 index 00000000..3d2a52af --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XLS/RouteService/model/WayPointList.js @@ -0,0 +1,58 @@ +/** + * implemented into class 'RoutePlan' ! + * + * Element permettant de spécifier les points de navigation. + * - Point de départ pour le calcul d'itinéraire. + * - Etape pour le calcul d'itinéraire. Plusieurs VaiPoint peuvent être spécifiés. + * - Point d'arrivée pour le calcul d'itinéraire. + * + * ---- + * XSD : + * ---- + * [] => non implementé ! + * + * ``` + * element name="RoutePlan" + * [attribute name="useRealTimeTraffic" default="false"] + * [attribute name="expectedStartTime" type="dateTime"] + * [attribute name="expectedEndTime" type="dateTime"] + * element ref="xls:RoutePreference" + * element ref="xls:WayPointList" + * element ref="xls:AvoidList" + * ``` + * ``` + * element name="WayPointList" + * element ref="xls:StartPoint" + * element ref="xls:ViaPoint" minOccurs="0" + * element ref="xls:EndPoint" + * ``` + * ``` + * element name="StartPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="ViaPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * ``` + * element name="EndPoint" + * [element name="GeocodeMatchCode"] + * [attribute name="accuracy"] + * [attribute name="matchType"] => value = City, Street, Street number, Street enhanced, ... + * element name="Position" + * element ref="gml:Point" + * ``` + * + * @module WayPointList + * @private + * @alias Gp.Formats.XLS.RouteService.WayPointList + * + */ diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js new file mode 100644 index 00000000..7db72f85 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Formats/XML.js @@ -0,0 +1,360 @@ +/* global require */ + +import Logger from "../Utils/LoggerByDefault"; +// import __xmldom from "xmldom"; + +/** + * @classdesc + * + * Classe permettant d'écrire ou de lire du XML, sous forme de document DOM, + * éventuellement selon des clés de lecture (readers) ou d'écriture (writers) spécifiques. + * + * @constructor + * @alias Gp.Formats.XML + * + * @param {Object} [options] - options du format XML + * + * @param {Object} [options.reader] - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) + * utile pour interpréter le XML lorsque sa structure est connue. + * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. + * + * @param {Object} [options.writers] - writers + * + * @param {String} [options.xmlString] - chaîne de caractère contenant du XML à interpréter. + * + * @private + */ +function XML (options) { + if (!(this instanceof XML)) { + throw new TypeError("XML constructor cannot be called as a function."); + } + + // FIXME : notion de singleton + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur XML ()]"); + + /** + * Chaîne de caractères contenant le texte XML + * @type {String} + */ + this.xmlString = null; + + /** + * DOM Element correspondant à la structure du XML. + * @type {DOMElement} + */ + this.xmlDoc = null; + + /** + * Objet contenant des fonctions de lecture des différentes balises XML. + * @type {Object} + */ + this.reader = null; + + // traitement des paramètres d'options s'il y en a + if (options) { + if (options.xmlString && typeof options.xmlString === "string") { + this.xmlString = options.xmlString; + // Si une chaine de caractère a été passée en entrée : on la transforme aussi en XML document + this.xmlDoc = __getXMLDOC(options.xmlString); + } + if (options.reader) { + this.setReader(options.reader); + } + } +} + +XML.prototype = { + + /** + * @lends module:XML + */ + + /* + * Constructeur (alias) + */ + constructor : XML, + + /** + * Méthode permettant de récupérer la chaîne de caractères associée au format XML + * + * @returns {String} xmlString - la chaîne de caractères correspondant au format XML + */ + getXMLString : function () { + return this.xmlString; + }, + + /** + * Méthode permettant d'attribuer une chaîne de caractères au format XML (attribut xmlString). + * La méthode va aussi transformer cette chaîne de caractères en document XML, + * afin de remplir l'attribut xmlDoc. + * + * @param {String} xmlString - la chaîne de caractères correspondant au format XML + */ + setXMLString : function (xmlString) { + if (xmlString && typeof xmlString === "string") { + this.xmlString = xmlString; + this.xmlDoc = __getXMLDOC(xmlString); + } + }, + + /** + * Méthode permettant de récupérer les readers associés au format XML, s'ils ont été définis + * + * @return {Object} readers - les readers associés au format XML, s'ils existent, + * sous forme d'une collection de fonctions + */ + getReader : function () { + return this.reader; + }, + + /** + * Méthode permettant d'attribuer des readers, sous la forme d'un objet de fonctions (node, data), + * lorsqu'ils n'ont pas été définis lors de l'instanciation par exemple (new XML (options)). + * + * @param {Object} reader - Instance d'un Reader de service (AltiResponseReader, GeocodeRequestReader, etc.) + * utile pour interpréter le XML lorsque sa structure est connue. + * Ce reader doit comporter au moins une fonction statique read (root) permettant d'initialiser la lecture. + */ + setReader : function (reader) { + if (reader && reader.read && typeof reader.read === "function") { + this.reader = reader; + } + }, + + /** + * Méthode permettant de récupérer le document XML associé au format, s'il existe. + * + * @return {DOMElement} xmlDoc - le document XML (DOM document node) s'il existe + */ + getXMLDoc : function () { + return this.xmlDoc; + }, + + /** + * Setter + */ + setXMLDoc : function (doc) { + this.xmlDoc = doc; + }, + /** + * Méthode initialisant la lecture du XML, à partir d'un XML Document : + * création d'un objet JavaScript contenant les informations du XML, + * sauf dans le cas où il n'existe pas de XML Document à interpréter (retourne un objet vide). + * + * @return {Object} [parserOutput] - un objet JavaScript contenant les informations du XML : + * - soit toutes les informations si aucun reader n'a été spécifié à la création du format + * - soit les informations spécifiées dans le reader. + */ + parse : function () { + // build xml document from xmlString + if (!this.xmlDoc && this.xmlString) { + this.xmlDoc = __getXMLDOC(this.xmlString); + } + if (this.xmlDoc) { + var root = __getRootNode(this.xmlDoc); + if (root) { + var parserOutput; + // call reader if exists + if (this.reader && this.reader.read) { + parserOutput = this.reader.read(root); + } else { + parserOutput = {}; + parserOutput[root.nodeName] = __readDefault(root); + } + return parserOutput; + } else { + return {}; + } + } + } + +}; + +/** + * Méthode de la classe (privée) permettant de créer un XML Document à partir d'une chaîne de caractères XML, + * en utilisant DOMParser () lorsque c'est possible. + * For more information, see: https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#the-domparser-interface + * + * @private + * @memberof XML + * @method __getXMLDOC + * @param {String} xmlString - xml string to be converted into DOM element + * @return {DOMElement} - the corresponding XML Document + */ +function __getXMLDOC (xmlString) { + if (typeof window === "undefined") { + // env. nodejs + var DOMParser = require("xmldom").DOMParser; // __xmldom.DOMParser; + return new DOMParser().parseFromString(xmlString, "text/xml"); + } else { + // env. browser + + var parser; + var xmlDoc; + var errorMsg = "Erreur lors du parsing de la réponse du service : XML non conforme"; + + if (window.ActiveXObject) { + // Internet Explorer < 9 + 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) { + // les autres (Chrome, Mozilla, IE >= 9) + parser = new window.DOMParser(); + try { + xmlDoc = parser.parseFromString(xmlString, "text/xml"); + } catch (e) { + // Internet Explorer browser raises exception if xmlString is not valid XML + if (e.message === "SyntaxError") { + throw new Error(errorMsg); + } else { + throw new Error("Erreur lors du parsing de la réponse du service : " + e.message); + } + } + // look for parsing error in case no exception was raised + if (xmlDoc.getElementsByTagName("parsererror").length > 0) { + var parsererror = xmlDoc.getElementsByTagName("parsererror"); + for (var i = 0; i < parsererror.length; i++) { + var content = parsererror[i].innerHTML; + // except in case parsererror is just because of huge xml, but parsing is done. + if (content.indexOf("Huge input lookup") === -1) { + errorMsg += "(" + content + ")"; + throw new Error(errorMsg); + } + } + } else if (!xmlDoc.documentElement) { // may happen in chrome browser + throw new Error(errorMsg); + } + return xmlDoc; + } else { + // FIXME + throw new Error("Incompatible DOM Parser pour ce navigateur !"); + } + } +} + +/** + * Méthode de la classe (privée) permettant de récupérer le noeud racine du document, + * à partir d'un document node (nodeType=9), puis lecture de ce noeud (readNode) + * + * @private + * @memberof XML + * @method __getRootNode + * @param {DOMElement} [xmlDoc] - a Document Node + * @return {DOMElement} root - the document root node + */ +function __getRootNode (xmlDoc) { + var root; + if (xmlDoc.nodeType === 9) { + // INFO : nodeType 9 represents the entire document (the root-node of the DOM tree) + root = xmlDoc.documentElement; + } else if (xmlDoc.nodeType === 1) { + root = xmlDoc; + } + return root; +} + +/** + * Méthode de la classe (privée) permettant de lire automatiquement un noeud XML, + * lorsqu'aucun reader spécifique n'a été spécifié (parser brut) + * + * @private + * @memberof XML + * @method readDefault + * @param {DOMElement} node - a DOM element node + * @example final data object looks like : + * data = { + * attributeName: attributeValue, + * childName: { + * attributeName: attributeValue, + * attributeName: attributeValue, + * childName: { + * "textContent": textContent + * }, + * childName: { + * childName: { + * attributeName:attributeValue + * } + * } + * } + * } + */ +function __readDefault (node) { + var data = {}; + + // if element node has attributes, set their values to data + if (node.attributes.length > 0) { + var dataAttributes = __getAttributes(node); + data["attributes"] = dataAttributes; + } + + // if element node has childNodes, read them and set them to data + 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) { // TEXT_NODE + data["textContent"] = child.nodeValue; + } else if (child.nodeType === 1) { + childData = __readDefault(child); + + if (!data[child.nodeName]) { + // store childData in an object + data[child.nodeName] = childData; + } else { + // in case several childNodes has the same name : store them in an array. + // if data[nodeName] already exists but is not an array + if (!Array.isArray(data[child.nodeName])) { + var old = data[child.nodeName]; + data[child.nodeName] = []; + data[child.nodeName].push(old); + } + data[child.nodeName].push(childData); + } + } + // TODO : manage other node types (4=CDATA, etc) + } + } + + return data; +} + +/** + * Méthode de la classe (privée) permettant de récupérer les attributs d'un noeud élément + * + * @private + * @memberof XML + * @method __getAttributes + * @param {DOMElement} node - noeud contenant l'attribut recherché + * @return {Object} nodeAttributes - objet contenant les noms et valeurs des différents attributs + */ +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; + } +} + +export default XML; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js b/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js new file mode 100644 index 00000000..9c670cf6 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Gp.js @@ -0,0 +1,109 @@ +/** +* Global variable Gp. +* +* @module Gp +* @alias Gp +* @description +* +* This is the global variable that is exposed in the browser environment. +* Content is composed of constructor, functions and properties... +* +* > {@link Gp.Error Error()} +* - .TYPE_SRVERR : "SERVICE_ERROR" +* - .TYPE_UNKERR : "UNKNOWN_ERROR" +* - .TYPE_USEERR : "USAGE_ERROR" +* +* > {@link module:Helper Helper} +* - .indent() +* - .normalyzeParameters() +* - .normalyzeUrl() +* +* > {@link module:XHR Protocols.XHR} +* - .call() +* +* > {@link module:Services Services (objects)} +* - .Alti +* - {@link Gp.Services.Alti.Elevation .Elevation()} +* - {@link Gp.Services.AltiResponse .AltiResponse()} +* - .AutoComplete +* - {@link Gp.Services.AutoComplete.SuggestedLocation .SuggestedLocation()} +* - {@link Gp.Services.AutoCompleteResponse .AutoCompleteResponse()} +* - {@link Gp.Services.Config .Config()} +* - {@link Gp.Services.DefaultUrl .DefaultUrl()} +* - {@link Gp.Services.GeocodeResponse .GeocodeResponse()} +* - {@link Gp.Services.GetConfigResponse .GetConfigResponse()} +* - {@link Gp.Services.IsoCurveResponse .IsoCurveResponse()} +* - .Route +* - {@link Gp.Services.Route.RouteInstruction .RouteInstruction()} +* - {@link Gp.Services.RouteResponse .RouteResponse()} +* +* > Services (factory) +* - {@link module:Services~autoComplete .autoComplete()} +* - {@link module:Services~geocode .geocode()} +* - {@link module:Services~getAltitude .getAltitude()} +* - {@link module:Services~getConfig .getConfig()} +* - {@link module:Services~isoCurve .isoCurve()} +* - {@link module:Services~reverseGeocode .reverseGeocode()} +* - {@link module:Services~route .route()} +* +* > servicesDate : "YYYY-MM-DD" +* +* > servicesVersion : "X.X.X" +* +*/ + +import Services from "./Services/Services"; +import DefaultUrl from "./Services/DefaultUrlService"; +import AltiResponse from "./Services/Alti/Response/model/AltiResponse"; +import Elevation from "./Services/Alti/Response/model/Elevation"; +import AutoCompleteResponse from "./Services/AutoComplete/Response/model/AutoCompleteResponse"; +import SuggestedLocation from "./Services/AutoComplete/Response/model/SuggestedLocation"; +import IsoCurveResponse from "./Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse"; +import RouteResponse from "./Services/Route/Response/model/RouteResponse"; +import RouteInstruction from "./Services/Route/Response/model/RouteInstruction"; +import Config from "./Services/Config/Config"; +import XHR from "./Protocols/XHR"; +import Error from "./Exceptions/ErrorService"; +import Helper from "./Utils/Helper"; + +import Pkg from "../package.json"; + +/** Version */ +export const servicesVersion = Pkg.version; +/** Publication date */ +export const servicesDate = Pkg.date; + +// on declare les ns dans root global +var Gp = {}; + +Gp.servicesVersion = servicesVersion; +Gp.servicesDate = servicesDate; + +// Export Protocols +Gp.Protocols = {}; +Gp.Protocols.XHR = XHR; +// Export services +Gp.Services = Services; +// Export DefaultUrls +Gp.Services.DefaultUrl = DefaultUrl; +// Export Alti +Gp.Services.AltiResponse = AltiResponse; +Gp.Services.Alti = {}; +Gp.Services.Alti.Elevation = Elevation; +// Export Autocomplete +Gp.Services.AutoCompleteResponse = AutoCompleteResponse; +Gp.Services.AutoComplete = {}; +Gp.Services.AutoComplete.SuggestedLocation = SuggestedLocation; +// Export Config +Gp.Services.Config = Config; +// Export IsoCurve +Gp.Services.IsoCurveResponse = IsoCurveResponse; +// Export Route +Gp.Services.RouteResponse = RouteResponse; +Gp.Services.Route = {}; +Gp.Services.Route.RouteInstruction = RouteInstruction; +// Export Erreurs et Outils +Gp.Error = Error; +Gp.Helper = Helper; + +export default Gp; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js new file mode 100644 index 00000000..5abac3ea --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/JSONP.js @@ -0,0 +1,247 @@ +/** + * JSONP : Implémentation du protocole JSONP de la plateforme Géoportail + * + * @module JSONP + * @private + * @alias Gp.Protocols.JSONP + */ +import Logger from "../Utils/LoggerByDefault"; + +// cf. https://github.com/sobstel/jsonp.js +var JSONP = { + + /** + * Construction d'un identifiant statique basé sur le timestamp, + * et qui s'incremente de +1 à chaque appel + */ + uuid : (function () { + var id = Math.floor(Date.now()); + return function () { + return id++; + }; + })(), + + /** + * Cette fonction réalise l'appel du service fourni via le paramètre "options.url" + * en mettant en œuvre le protocole JSONP. + * + * @method call + * @static + * @param {Object} options - parametres d'invocation du service en JSONP + * @param {String} options.url - URL du service à invoquer (indépendamment du protocole JSONP). + * Cette URL contient déjà les paramètres du service. + * Si le paramètre dédié à la mise en oeuvre du protocole JSONP (callback=xxx) n'est pas présent, il est rajouté par la fonction ; + * sa valeur est déterminée en fonction du paramètre callbackName. + * @param {Number} [options.timeOut = 0] - Nombre de ms au bout duquel on considère que le service n'a pas répondu. + * Une valeur de 0 pour ce paramètre permet de désactiver la gestion du timeOut. + * @param {String} [options.callbackSuffix = null] - Suffixe de la fonction de callback à rajouter sur l'URL. + * Si aucun suffixe n'est spécifié (cas par défaut), on utilisera l'identifiant this.uuid () comme suffixe. Ex: "callback1458574396582 ()" + * @param {String} [options.callbackName = gp.protocol.jsonp] - Valeur du paramètre callback à rajouter sur l'URL. + * Si l'URL fournie contient déjà le paramètre callback, le paramètre callbackName ne sera pas pris en compte. + * La fonction de callback est créée dynamiquement par la fonction JSONP ; + * elle a deux fonctions : + * elle annule la condition de timeOut + * puis appelle la fonction fournie par l'utilisateur via le paramètre onResponse. + * @param {Function} options.onResponse - Nom de la fonction qui sera appelée lors de la réception des résultats du service. + * Ce paramètre sera ignoré si l'URL contient déjà le paramètre callback. + * La fonction de rappel appelée sera alors celle ayant pour nom la valeur de ce paramètre. + * @param {Function} [options.onTimeOut] - Nom de la fonction qui sera appelée en cas de non réponse du service. + * Le temps au bout duquel on considère que le service n'a pas répondu est déterminé par le paramètre timeOut. + * @example + * var options = { + * url : 'http://localhost/some/test.json&callback=myResults', + * timeOut : 100, + * callbackName : 'myResults', + * callbackSuffix : "", + * onResponse : function (response) { + * console.log('results : ', response); + * }, + * + * }; + * JSONP.call(options); + */ + call : function (options) { + // logger + var logger = Logger.getLogger("JSONP"); + logger.trace("[JSONP::call ()]"); + + // analyse parametres + + if (!options) { + logger.error("missing parameter : options !"); + throw new Error("missing parameter : options !"); + } + + if (!options.url) { + logger.error("missing parameter : options.url !"); + throw new Error("missing parameter : options.url !"); + } + + if (!options.timeOut) { + logger.info("setting 'options.timeOut' default value"); + options.timeOut = 0; + } + + // FIXME si un callback coté client a été mis en place, + // cette condition sur cette methode n'a pas de sens !? + if (!options.onResponse) { + logger.error("missing parameter : options.onResponse !"); + throw new Error("missing parameter : options.onResponse !"); + // FIXME doit on definir un callback interne par defaut !? + // options.onResponse = function (data) { + // console.log("response callback (inner) : ", data); + // }; + } + + // ID du callback à utiliser : null ou string. + // si l'utilisateur a spécifié un suffixe pour le callback, on le récupère comme un ID (ex: options.callbackSuffix = "") + // sinon, on utilise un timestamp : this.uuid () + var callbackId = (typeof options.callbackSuffix === "string") ? options.callbackSuffix : this.uuid(); + + // on recherche le parametre callback et son nom de fonction dans l'url + var urlHasCallbackKey = false; + var urlHasCallbackName = false; + + var idx = options.url.indexOf("callback="); + + if (idx !== -1) { + urlHasCallbackKey = true; + // extraction callbackName de l'url : entre "callback=" et "&" ou fin de ligne + var j = options.url.indexOf("&", idx); + if (j === -1) { + j = options.url.length; + } + + // on ecrase le parametre options.callbackName s'il avait été défini + var callbackName = options.url.substring(idx + 9, j); + + if (callbackName) { + urlHasCallbackName = true; + options.callbackName = callbackName; + logger.info("setting 'options.callbackName' value (" + options.callbackName + ") from 'options.url' parameter"); + } + } + + // on ajoute le parametre callback dans l'URL s'il n'existe pas + if (!urlHasCallbackKey) { + // gestion des autres param. et "?" + var k = options.url.indexOf("?"); + if (k === -1) { + // aucun param., ni de '?' + options.url = options.url + "?" + "callback="; + } else if (k === options.url.length) { + // uniquement le '?' + options.url = options.url + "callback="; + } else { + // le '?' et les param. existent + options.url = options.url + "&" + "callback="; + } + logger.info("setting callback default key in 'options.url' : " + options.url); + } + + // utilisation de la fonction callback coté client ? + var HasCallbackName = options.callbackName ? true : urlHasCallbackName; + + // on ajoute le nom de la fonction callback dans l'URL si elle n'existe pas + if (!urlHasCallbackName) { + // fonction callback par defaut + if (!options.callbackName) { + logger.info("setting 'options.callbackName' default value"); + options.callbackName = "callback"; // ou "gp.protocol.jsonp" ? + // info : si on ne veut pas gerer d'ID dans le callback, + // options.callbackSuffix = "" + if (callbackId || callbackId === "") { + options.callbackName += callbackId; + } + } + options.url = options.url.replace("callback=", "callback=" + options.callbackName); + logger.info("setting callback function name in 'options.url' : " + options.url); + } + + // timeOut par defaut + if (!options.onTimeOut) { + logger.info("setting 'options.onTimeOut' default value"); + /** callback timeout par defaut */ + options.onTimeOut = function (/* error */) { + console.log("TimeOut while invoking url : " + options.url); + }; + } + + if (!HasCallbackName) { + var self = this; + + // event du timeout + var onTimeOutTrigger = null; + + // declenche le timeout si > à 0 ! + if (options.timeOut > 0) { + onTimeOutTrigger = window.setTimeout( + function () { + /** fonction de reponse du service */ + window[options.callbackName] = function () {}; + options.onTimeOut(); + self._deleteScript(callbackId); + }, options.timeOut); + } + + // FIXME le nom de la fonction n'accepte pas de namespace ! + // ex. Gp.Function.callback + /** + * fonction de reponse du service + * @param {Object} data - data + * @private + */ + window[options.callbackName] = function (data) { + window.clearTimeout(onTimeOutTrigger); + options.onResponse(data); + self._deleteScript(callbackId); + }; + } + + this._createScript(callbackId, options.url); + }, + + /** + * create Script + * @param {String} callbackId - callback Id + * @param {String} url - url + * @private + */ + _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"); // FIXME async ? + // head ou body ou autres ? + var node = document.documentElement || document.getElementsByTagName("head")[0]; + if (scripto === null) { + node.appendChild(scriptu); + } else { + // s'il existe déjà, on le remplace ! + node.replaceChild(scriptu, scripto); + } + }, + + /** + * delete Script + * @param {String} callbackId - callback Id + * @private + */ + _deleteScript : function (callbackId) { + var script = document.getElementById("results" + callbackId); + if (script) { + var node = script.parentNode || document.documentElement; + if (!node) { + return; + } + node.removeChild(script); + } + } +}; + +export default JSONP; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js new file mode 100644 index 00000000..f62ee826 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/Protocol.js @@ -0,0 +1,139 @@ +/** + * Interface de dialogue avec les webservices + * + * @module Protocols + * @private + * @alias Gp.Protocols + */ +import Helper from "../Utils/Helper"; +import XHR from "./XHR"; +import JSONP from "./JSONP"; + +var Protocol = { + + /** + * Interface unique d"envoi d"une requête. + * + * @method send + * @static + * @param {Object} options - options generales + * @param {String} options.url - url du service + * @param {String} options.method - GET, POST, PUT, DELETE + * @param {String} options.protocol - XHR | JSONP + * @param {String} options.format - format de la reponse du service : json, xml ou null (brute)... + * @param {String} options.wrap - encapsuler la reponse du service dans du JSON : true|false (true par defaut sur le protocole JSONP) + * @param {String} options.callbackSuffix - suffixe de la fonction de callback (JSONP uniquement) (ex: si callbackSuffix="", la fonction s'appellera "callback") + * @param {String} options.timeOut - 0 ms + * @param {Boolean} options.nocache - true|false + * @param {Object|String} options.data - content (post) ou param (get) + * @param {Object|String} options.headers - (post) ex. referer + * @param {Object|String} options.content - (post) ex. "application/json" + * @param {String} options.scope - this (TODO) + * @param {Function} options.onResponse - callback + * @param {Function} options.onFailure - callback + * @param {Function} options.onTimeOut - callback + * @param {String} options.proxyUrl - (TODO) + */ + send : function (options) { + // INFO + // "output" - param est interne à la classe "Protocol" (parametrable via "wrap"), et à ajouter à l"url + // ce param est independant du service car il est géré par le filtre LUA : + // ex. json|xml (json par defaut). + // Ce param. permet d"encapsuler du XML dans du JSON : + // {http : {status:200, error:null},xml :"réponse du service"} + // Utile pour les services qui ne repondent que du XML (ex. Geocodage) + // + // |-------------------------------------------------| + // | \service | | | | + // | output\ format| json | xml | remarques | + // |--------\------|------|-----|--------------------| + // | json | json | json| json/xml encapsulé | + // | xml | json | xml | param inactif | + // |-------------------------------------------------| + // ex. le service demande une reponse native au "format" json et avec un "output" json. + // on a donc une reponse json encapsulé dans un json : ce qu'on ne souhaite pas ! + // dans ce cas on ne renseigne pas output=json + + // INFO + // "wrap" - choix d"encapsuler ou non les reponses dans du JSON. + // Par defaut, on encapsule uniquement les reponses sur le protocole JSONP (et qui sont en xml) ! + + // INFO + // "callback" - param est interne à la classe "Protocol" (non parametrable), et à ajouter à l"url + // ce param est independant du service car il est géré aussi par le filtre LUA : + // ex. callback|null + // Ce param. permet de renvoyer une reponse javascript : + // callback ({http : {status:200, error:null},xml :"réponse du service"}) + // Ce param. est non renseigné par defaut car pour du JSONP, on utilise le + // le protocol JSONP, et ce dernier implemente déjà le callback ! + + // settings par defaut + var settings = options || { + method : "GET", + // protocol : "JSONP", + protocol : "XHR", + timeOut : 0, + format : null, + wrap : true, + nocache : true, + output : "json", + callback : null, + callbackSuffix : null + }; + + // on determine l'environnement d'execution : browser ou non ? + // et on stoppe pour nodeJS... sur un protocole JSONP ! + if (typeof window === "undefined" && options.protocol === "JSONP") { + console.log("Value (s) for parameter (s) 'protocol=JSONP (instead use XHR)' not supported to NodeJS"); + return; + } + + if (options.protocol === "XHR" || options.format === "json") { + settings.wrap = false; + } else if (options.protocol === "JSONP" && options.format === "xml") { + settings.wrap = true; + } + + settings.callback = null; // FIXME non géré !? + settings.output = settings.wrap ? "json" : null; + + // on encapsule les reponses dans un objet JSON + if (settings.wrap) { + var params = {}; + params.output = settings.output; + params.callback = settings.callback; + delete params.callback; // FIXME non géré !? + settings.url = Helper.normalyzeUrl(options.url, params); + } + + // choix de l"implementation : + // XHR ou JSONP + switch (settings.protocol) { + case "XHR": + // on normalise l'url (gestion du cache) + if (options.method === "GET" && options.nocache) { + settings.url = Helper.normalyzeUrl(settings.url, { + t : new Date().getTime() + }); + } + // appel du service en XHR + XHR.call(settings); + break; + case "JSONP": + + // on normalise l'url si les params. sont renseignés dans la string|object "data" + if (settings.data) { + settings.url = Helper.normalyzeUrl(settings.url, settings.data); + } + + // appel du service en JSONP + JSONP.call(settings); + break; + default: + throw new Error("protocol not supported (XHR|JSONP) !"); + } + } + +}; + +export default Protocol; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js new file mode 100644 index 00000000..1b1114c7 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Protocols/XHR.js @@ -0,0 +1,423 @@ +/* global Promise, require, XDomainRequest */ + +import Logger from "../Utils/LoggerByDefault"; +import Helper from "../Utils/Helper"; +import ES6Promise from "es6-promise"; +// import __request from "request"; +// import __xmldom from "xmldom"; + +/** + * Ajax Request (use of Promises) + * + * @module XHR + * @alias Gp.Protocols.XHR + * @see dependance 'es6-promise' + */ + +// cf. https://xhr.spec.whatwg.org/ +// cf. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest + +var XHR = { + + /** + * Interface unique d'envoi d'une requête. + * + * @method call + * @static + * @param {Object} settings - options generales + * @param {String} settings.url - url du service + * @param {String} settings.method - GET, POST, PUT, DELETE + * @param {String} settings.format - format de la reponse du service : json, xml ou null (brute) + * @param {String} settings.data - content (post) ou param (get) + * @param {String} settings.proxy - proxy url + * @param {Object|String} settings.headers - (post) ex. referer + * @param {Object|String} settings.content - (post) ex. 'application/json' + * @param {String} settings.timeOut - timeout = 0 par defaut + * @param {String} settings.scope - this + * @param {Function} settings.onResponse - callback + * @param {Function} settings.onFailure - callback + */ + call : function (settings) { + // logger + var logger = Logger.getLogger("XHR"); + logger.trace("[XHR::call()]"); + + // FIXME + // To polyfill the global environment + ES6Promise.polyfill(); + + // test sur les settings obligatoires + 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"; // reponse brute ! + } + + 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; + options.proxy = settings.proxy || null; + options.content = settings.content || null; + options.headers = settings.headers || { + referer : "http://localhost" + }; + + // test sur les valeurs de 'settings.method' + switch (settings.method) { + case "DELETE": + case "GET": + break; + case "PUT": + case "POST": + // on force sur ces params spécifiques au mode POST + options.content = settings.content ? settings.content : "application/x-www-form-urlencoded"; // FIXME en attente des services : bascule en "application/xml" ou "application/json" + options.headers = settings.headers ? settings.headers : { referer : "http://localhost" }; // FIXME parametrable... + break; + case "HEAD": + case "OPTIONS": + throw new Error("HTTP method not yet supported !"); + default: + throw new Error("HTTP method unknown !"); + } + + // test sur les valeurs de 'settings.format' + switch (settings.format) { + case "text": + this.__call(options) + .then(function (response) { + logger.trace(response); + settings.onResponse.call(this, response); + }) + .catch(function (error) { + settings.onFailure.call(this, error); + }); + break; + case "json": + this.__callJSON(options) + .then(function (response) { + logger.trace(response); + settings.onResponse.call(this, response); + }) + .catch(function (error) { + settings.onFailure.call(this, error); + }); + break; + case "xml": + this.__callXML(options) + .then(function (response) { + logger.trace(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 !"); + } + }, + + /** + * Requete + * + * @method __call + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __call : function (options) { + var logger = Logger.getLogger("XHR"); + logger.trace("[XHR::__call()]"); + + var promise = new Promise( + function (resolve, reject) { + // traitement du corps de la requête + var corps = (options.method === "POST" || options.method === "PUT") ? 1 : 0; + + // seulement si options.data n'est pas vide (peut être un objet ou une chaine de caractères) + if (options.data && ((typeof options.data === "object" && Object.keys(options.data).length) || (typeof options.data === "string" && options.data.length)) && !corps) { + if (options.scope.CLASSNAME === "Geocode" || options.scope.CLASSNAME === "ReverseGeocode") { + options.url = options.url + options.data; + } else { + options.url = Helper.normalyzeUrl(options.url, options.data); + } + } + + logger.trace("URL = ", options.url); + + var hXHR = null; + + // test on env. nodejs or browser + if (typeof window === "undefined") { + var nodefetch = require("node-fetch"); + + var opts = { + headers : { + Referer : "https://localhost" + } + }; + + if (options.data && typeof options.data === "string" && corps) { + opts = { + method : options.method, + body : options.data, + headers : { + "Content-Type" : options.content, + Referer : "https://localhost" + } + }; + } + + return nodefetch(options.url, opts) + .then(function (response) { + if (response.ok) { // res.status >= 200 && res.status < 300 + resolve(response.text()); + } else { + var message = "Errors Occured on Http Request (status : '" + response.statusText + "' | url : '" + response.url + "')"; + var status = response.status; + reject({ + message : message, + status : status + }); + } + }) + .catch(function (e) { + reject({ + message : e, + status : -1 + }); + }); + } else { + if (window.XMLHttpRequest) { + logger.trace("XMLHttpRequest"); + + hXHR = new XMLHttpRequest(); + hXHR.open(options.method, options.url, true); // async + hXHR.overrideMimeType = options.content; + + // gestion du timeout + var onTimeOutTrigger = null; + if (options.timeOut > 0) { + // FIXME le timeout interne ne me permet pas de declencher le bon message... + // hXHR.timeout = options.timeOut; + logger.trace("XHR - TimeOut actif !"); + /** + * Description + * + * @method onTimeOutTrigger + * @private + */ + onTimeOutTrigger = window.setTimeout( + function () { + var message = "TimeOut Occured on Http Request with XMLHttpRequest !"; + reject({ + message : message, + status : -1 + }); + }, options.timeOut); + } + + if (corps) { + // headers, data, content of data + // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader + logger.trace("data = ", options.data); + hXHR.setRequestHeader("Content-type", options.content); + // FIXME refused to set unsafe header content-length javascript + // hXHR.setRequestHeader ("Content-length", options.data.length); + // hXHR.setRequestHeader ("Referer", options.headers.referer); + } + + /** + * On Error + * FIXME ne se declenche pas !? + * + * @param {Object} e - Event + * @method onerror + * @private + */ + hXHR.onerror = function (e) { + console.log(e); + reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * On Timeout + * FIXME ne se declenche pas !? + * + * @param {Object} e - Event + * @method ontimeout + * @private + */ + hXHR.ontimeout = function (e) { + console.log(e); + reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * Description + * + * @method onreadystatechange + * @private + */ + hXHR.onreadystatechange = function (e) { + if (hXHR.readyState === 4) { // DONE + if (hXHR.status === 200) { + window.clearTimeout(onTimeOutTrigger); + resolve(hXHR.response); + } else { + var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "' | response : '" + e.target.response + "')"; + var status = e.target.status; + reject({ + message : message, + status : status + }); + } + } + }; + + // gestion du content data + var data4xhr = (options.data && corps) ? options.data : null; + + hXHR.send(data4xhr); + } else if (window.XDomainRequest) { + // worked in Internet Explorer 8–10 only ! + logger.trace("XDomainRequest"); + + hXHR = new XDomainRequest(); + hXHR.open(options.method, options.url); + + hXHR.overrideMimeType = options.content; + + if (options.timeOut > 0) { + hXHR.timeout = options.timeout; + logger.trace("XHR - TimeOut actif !"); + } + + if (corps) { + // headers, data, content of data + // cf. https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-setrequestheader + hXHR.setRequestHeader("Content-type", options.content); + // FIXME refused to set unsafe header content-length javascript + // hXHR.setRequestHeader ("Content-length", options.data.length); + // hXHR.setRequestHeader ("Referer", options.headers.referer); + } + + /** + * Description + * + * @method onerror + * @private + */ + hXHR.onerror = function () { + reject(new Error("Errors Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * Description + * + * @method ontimeout + * @private + */ + hXHR.ontimeout = function () { + reject(new Error("TimeOut Occured on Http Request with XMLHttpRequest !")); + }; + + /** + * On Load + * + * @method onload + * @private + */ + hXHR.onload = function (e) { + if (hXHR.status === 200) { + resolve(hXHR.responseText); + } else { + var message = "Errors Occured on Http Request (status : '" + e.target.statusText + "' | url : '" + e.target.responseURL + "')"; + var status = e.target.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; + }, + + /** + * Requete avec parser JSON + * + * @method __callJSON + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __callJSON : function (options) { + return this.__call(options) + .then(JSON.parse) + .catch(function (error) { + console.log("_callJSON failed on : ", options.url, error); + // FIXME pas d'exception, laissons le fil se derouler... + // throw error; + }); + }, + + /** + * Requete avec parser XML + * + * @method __callXML + * @private + * @param {Object} options - options + * @return {Object} promise + */ + __callXML : function (options) { + return this.__call(options) + .then(function (response) { + var xmlDoc; + + // test on env. nodejs or browser + if (typeof window === "undefined") { + var DOMParser = require("xmldom").DOMParser; // __xmldom.DOMParser + xmlDoc = new DOMParser().parseFromString(response, "text/xml"); + } else { + if (window.DOMParser) { + var parser = new window.DOMParser(); + xmlDoc = parser.parseFromString(response, "text/xml"); + } else { // IE + 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); + // FIXME pas d'exception, laissons le fil se derouler... + // throw error; + }); + } + +}; + +export default XHR; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js new file mode 100644 index 00000000..9f420443 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Alti.js @@ -0,0 +1,253 @@ + +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import ErrorService from "../../Exceptions/ErrorService"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import AltiRequestFactory from "./Request/AltiRequestFactory"; +import AltiResponseFactory from "./Response/AltiResponseFactory"; + +/** + * @classdesc + * + * Appel du service d'altimétrie du Géoportail + * + * @todo gestion du parma. output et callback + * @todo outputFormat (REST) et format (WPS) + * @todo La reponse JSON peut encapsuler un XML ! + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Alti + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {Array.} options.positions - Tableau ({lon:float,lat:float}) contenant les coordonnées des points (CRS:84) + * dont on veut connaître les altitudes (ou à partir desquelles on va calculer le profil). + * Chaque élément du tableau est un objet JavaScript avec deux attributs : lon et lat, qui sont des flottants. + * Minimum 2 éléments si on souhaite calculer un profil altimétrique (ElevationLine). + * Maximum 50 éléments. + * + * @param {String} options.outputFormat - Le format de la réponse du service alti : 'xml' ou 'json'. + * Ce paramètre déterminera l'extension '.xml' ou '.json' du service dans le cas de l'API REST, + * ou la valeur du paramètre 'format' dans le cas de la norme WPS. + * Nécessaire si serverUrl est renseigné, et qu'on souhaite passer par l'API REST, + * pour connaître le format dans lequel sera fournie la réponse (pour son traitement). + * Non nécessaire pour la norme WPS. Par défaut, ce paramètre vaut 'json'. + * + * @param {Number} [options.sampling] - Nombre de points à utiliser pour déterminer le tracé d'un profil altimétrique, compris entre 2 et 5000. + * A spécifier lorsqu'on souhaite accéder à cette fonctionnalité. + * Dans ce cas, les points fournis en entrée (au minimum de deux) servent à déterminer l'axe planimétrique + * le long duquel le profil doit être calculé. + * Si le paramètre sampling n'est pas spécifié ou moins de deux points sont fournis, + * c'est le service Elevation qui sera interrogé (altitudes simples calculées pour les points fournis). + * Une valeur de sampling strictement inférieure à 2 déclenchera un échantillonnage avec la valeur par défaut du service (3 points). + * + * @param {String} [options.api] - Manière d'accéder au service : 'REST' (via l'API REST) ou 'WPS' (via la norme WPS). + * Par défaut, on utilise l'API REST. + * + * @param {Boolean} [options.zonly] - Permet de ne récupérer que les altitudes en sortie s'il vaut 'true'. + * Vaut 'false' par défaut. + * + * @param {String} [options.resource] - Resource utilisée pour réaliser le calcul. + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * positions : [{lon:, lat:}, {lon:, lat:}], + * outputFormat : 'json' // json|xml + * sampling : 3, + * api : 'REST', // REST|WPS + * zonly : false // false|true, + * resource : "resource-par-defaut" + * }; + * + */ +function Alti (options) { + if (!(this instanceof Alti)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Alti")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "Alti"; + + // appel du constructeur par heritage + CommonService.apply(this, arguments); + + this.logger = Logger.getLogger("Gp.Services.Alti"); + this.logger.trace("[Constructeur Alti (options)]"); + + // ##################### + // analyse des options + // ##################### + + if (!options.positions) { + throw new Error(_.getMessage("PARAM_MISSING", "positions")); + } + + if (options.positions.length === 0) { + throw new Error(_.getMessage("PARAM_EMPTY", "positions")); + } + + // ajout des options spécifiques au service + this.options.positions = options.positions; + + // format de réponse du service : "json" ou "xml" (valeur par défaut), en minuscule ! + this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "xml"; + + // ressource utilisée pour le calcul altimétrique + this.options.resource = options.resource || "rge_alti_corse2a_float32_zip_lamb93"; + + // sampling + this.options.sampling = options.sampling || null; + + // type d'api utilisé pour requeter le service, en majuscule ! + this.options.api = (typeof options.api === "string") ? options.api.toUpperCase() : "REST"; + + // l'api ne peut être interrogée qu'en GET. + if (this.options.api === "REST") { + this.options.httpMethod = "GET"; + } + + // param. zonly + this.options.zonly = options.zonly || false; + + // param. measures + this.options.measures = options.measures || false; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + // en fonction du type d'api, REST ou WPS, du format de reponse demandé (outputFormat) + // ainsi que sur le type de service (profil ou elevation) + if (!this.options.serverUrl) { + // Code commenté pour Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti + /* var lstUrlByDefault = DefaultUrlService.Alti.newUrl(); + if (this.options.oldAltiService) { + lstUrlByDefault = DefaultUrlService.Alti.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'alti + var lstUrlByDefault = DefaultUrlService.Alti.url(); + 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; + this.logger.trace("Server URL by default : " + this.options.serverUrl); + } + + // gestion du type de service + // si l'extension de l'url est .json ou .xml, on surcharge le format de sortie (outputFormat) + var idx = this.options.serverUrl.lastIndexOf("."); + if (idx !== -1) { + var extension = this.options.serverUrl.substring(idx + 1); + if (extension && extension.length < 5) { // FIXME extension de moins de 4 car. ... + this.logger.trace("Server Extension URL : " + extension); + 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) !"); + } + } + } +} + +/** + * @lends module:Alti# + */ +Alti.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/** + * Constructeur (alias) + */ +Alti.prototype.constructor = Alti; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Alti.prototype.buildRequest = function (error, success) { + // utilisation en mode callback + var options = { + httpMethod : this.options.httpMethod, + // callback + onSuccess : function (result) { + // sauvegarde de la requete ! + this.request = result; + success.call(this, this.request); + }, + onError : error, + scope : this, + // spécifique au service : + resource : this.options.resource, + positions : this.options.positions, + outputFormat : this.options.outputFormat, + sampling : this.options.sampling, + api : this.options.api, + zonly : this.options.zonly, + measures : this.options.measures + }; + + AltiRequestFactory.build(options); +}; + +/** + * Analyse de la reponse (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Alti.prototype.analyzeResponse = function (error, success) { + // INFO + // Factory pour masquer la complexité du retour du service qui renvoie soit + // - une 'string' qui contient du XML ou JSON natif en mode XHR + // - un objet JSON qui est natif ou encapsulé + + if (this.response) { + var options = { + response : this.response, + outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML ! + rawResponse : this.options.rawResponse, + onError : error, + onSuccess : success, + scope : this + }; + + AltiResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; + +export default Alti; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js new file mode 100644 index 00000000..6296e231 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Formats/AltiResponseReader.js @@ -0,0 +1,391 @@ + +/** + * Fonction retournant un objet contenant des clés de lecture (readers) + * qui permettent de parser des réponses XML du service Altimétrique du Géoportail + * (calcul altimétrique simple ou profil altimétrique d'une courbe), + * lorsque le paramètre output = xml, + * afin de récupérer les élévations retournées. + * + * @module AltiResponseReader + * @alias Gp.Services.Alti.Formats.AltiResponseReader + * @private + */ + +// import Logger from "../../../Utils/LoggerByDefault"; +import AltiResponse from "../Response/model/AltiResponse"; +import Elevation from "../Response/model/Elevation"; +import Measure from "../Response/model/Measure"; + +/** + * + * Objet AltiResponseReader + * + * @member {Object} AltiResponseReader + * + * @property {Object} AltiResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" + * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire + * et la valeur associée est une fonction (node, data) + * où node est un noeud du document DOM + * et data est un objet où l'on stocke les informations lues dans le XML. + * + * @property {Method} AltiResponseReader.READERS.elevations - Lecture d'un noeud "elevations" de la réponse XML + * du service alti, correspondant logiquement à la racine du document + * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) + * + * @property {Method} AltiResponseReader.READERS.elevation - Lecture d'un noeud "elevation" de la réponse xml du service alti. + * (contient un ou 4 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, et acc) + * + * @property {Method} AltiResponseReader.READERS.lat - Lecture d'un noeud "lat" de la réponse xml du service alti. + * (contient une valeur de latitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.lon - Lecture d'un noeud "lon" de la réponse xml du service alti. + * (contient une valeur de longitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.z - Lecture d'un noeud "z" de la réponse xml du service alti. + * (contient une valeur d'altitude, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.acc - Lecture d'un noeud "acc" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.measures - Lecture d'un noeud "measures" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @property {Method} AltiResponseReader.READERS.source_name - Lecture d'un noeud "source_name" de la réponse xml du service alti. + * (pour remplir l'éventuel objet measure) + * + * @property {Method} AltiResponseReader.READERS.source_mesure - Lecture d'un noeud "source_mesure" de la réponse xml du service alti. + * (pour remplir l'éventuel objet measure) + * + * @property {Method} AltiResponseReader.READERS.exceptionreport - Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. + * + * @property {Method} AltiResponseReader.READERS.exception - Lecture d'un noeud "Exception" de la réponse xml du service alti. + * + * @property {Method} AltiResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, + * à l'aide des readers de la classe. + * + */ +var AltiResponseReader = {}; + +AltiResponseReader.READERS = { + + /** + * Lecture d'un noeud "elevations" de la réponse XML du service alti, correspondant logiquement à la racine du document + * (contient un ou plusieurs childNodes correspondant chacun à une élévation retournée) + * + * @param {DOMElement} root - racine de la réponse XML + * @static + * @memberof AltiResponseReader + * @returns {Object} Retourne un objet de type AltiResponse + */ + elevations : function (root) { + // INFO : on passe en paramètre l'objet en entrée elevations, vide, à remplir. + 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; + }, + + /** + * Lecture d'un noeud "elevation" de la réponse xml du service alti. + * (contient un ou 5 childNode (s) correspondant à l'altitude (z) et éventuellement lat, lon, acc et measures) + * + * @param {DOMElement} node - noeud elevation à lire pour récupérer les informations de l'élévation retournée (z [, lon, lat, acc, measures]) + * @return {Array} elevationResponse - format de la réponse en sortie, instance de AltiResponse + * @static + * @memberof AltiResponseReader + */ + 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]) { + // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. + AltiResponseReader.READERS[child.nodeName](child, elevation); + } + } + } + return elevation; + }, + + /** + * Lecture d'un noeud "lat" de la réponse xml du service alti. + * (contient une valeur de latitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la latitude + * @param {Object} elevation - objet dans lequel stocker la latitude retournée + * @static + * @memberof AltiResponseReader + */ + lat : function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + elevation.lat = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : latitude attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "lon" de la réponse xml du service alti. + * (contient une valeur de longitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la longitude + * @param {Object} elevation - objet dans lequel stocker la longitude retournée + * @static + * @memberof AltiResponseReader + */ + lon : function (node, elevation) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + elevation.lon = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : longitude attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "z" de la réponse xml du service alti. + * (contient une valeur d'altitude, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer l'altitude + * @param {Object} elevationObject - objet dans lequel stocker l'altitude retournée : elevation ou measure + * @static + * @memberof AltiResponseReader + */ + z : function (node, elevationObject) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + if (elevationObject) { + elevationObject.z = parseFloat(textNode.nodeValue); + } else { + elevationObject = new Elevation(); + elevationObject.z = parseFloat(textNode.nodeValue); + return elevationObject; + } + } else { + throw new Error("Erreur dans la lecture de la réponse du service : altitude attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "acc" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} elevationObject - objet dans lequel stocker la précision retournée : elevation ou measure + * @static + * @memberof AltiResponseReader + */ + acc : function (node, elevationObject) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + elevationObject.acc = parseFloat(textNode.nodeValue); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : précision (acc) attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "source_name" de la réponse xml du service alti. + * (contient le nom de la source, qui est un string) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} measure - objet dans lequel stocker le nom de la source retourné + * @static + * @memberof AltiResponseReader + */ + source_name : function (node, measure) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + measure.source_name = textNode.nodeValue; + } else { + throw new Error("Erreur dans la lecture de la réponse du service : source_name attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "source_measure" de la réponse xml du service alti. + * (contient le nom de la mesure, qui est un string) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} measure - objet dans lequel stocker le nom de la source retourné + * @static + * @memberof AltiResponseReader + */ + source_measure : function (node, measure) { + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + measure.source_measure = textNode.nodeValue; + } else { + throw new Error("Erreur dans la lecture de la réponse du service : source_measure attendue mais absente"); + } + }, + + /** + * Lecture d'un noeud "measures" et de ses enfants "measure" de la réponse xml du service alti. + * (contient une valeur de précision, qui est un flottant) + * + * @param {DOMElement} node - noeud à lire pour récupérer la précision + * @param {Object} elevation - objet dans lequel stocker la précision retournée + * @static + * @memberof AltiResponseReader + */ + measures : function (node, elevation) { + elevation.measures = []; + var measure; + if (node.hasChildNodes()) { + var children = node.childNodes; + var measureNode; + var measureChildren; + for (var i = 0; i < children.length; i++) { + measure = new Measure(); + measureNode = children[i]; + measureChildren = measureNode.childNodes; + for (var j = 0; j < measureChildren.length; j++) { + if (AltiResponseReader.READERS[measureChildren[j].nodeName]) { + // INFO : on passe en paramètre l'objet en entrée elevation, vide, à remplir. + AltiResponseReader.READERS[measureChildren[j].nodeName](measureChildren[j], measure); + } else { + throw new Error("Erreur dans la lecture de la réponse du service : measures attendues mais absentes"); + } + } + elevation.measures.push(measure); + } + } + }, + + /** + * Lecture d'un noeud "ExceptionReport" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} exceptionReport - objet contenant l'exception + * @static + * @memberof AltiResponseReader + */ + 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; + }, + + /** + * Lecture d'un noeud "Exception" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} exceptionReport - objet contenant l'exception, avec deux attributs : + * {String} exceptionReport.exceptionCode - qui contient l'identifiant du code de l'exception + * {String} exceptionReport.exception - qui contient le message de l'exception + * @static + * @memberof AltiResponseReader + */ + exception : function (node) { + var exceptionReport = {}; + + // get exception code + var exceptionCode = node.getAttribute("exceptionCode"); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + + // get exception message + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + exceptionReport.exception = textNode.nodeValue; + } + + return exceptionReport; + }, + + /** + * Lecture d'un noeud "Error" de la réponse xml du service alti. + * + * @param {DOMElement} node - noeud à lire pour récupérer l'exception + * @return {Object} error - objet contenant l'exception + * @static + */ + error : function (node) { + var response = { + error : {} + }; + // get error code and description + if (node.hasChildNodes()) { + var children = node.childNodes; + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + var textNode; + // get error code + if (child.nodeType === 1 && child.nodeName === "code") { // 1 === node.ELEMENT_NODE + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + response.error.code = textNode.nodeValue; + } + } + // get error description + if (child.nodeType === 1 && child.nodeName === "description") { // 1 === node.ELEMENT_NODE + textNode = child.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + response.error.description = textNode.nodeValue; + } + } + } + } + return response; + } + +}; + +/** + * Méthode permettant de lancer la lecture d'une réponse XML du service altimétrique, + * à l'aide des readers de la classe. + * + * @method AltiResponseReader.read + * @param {DOMElement} root - racine de la réponse XML à lire + * @static + * @memberof AltiResponseReader + */ +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."); + } +}; + +export default AltiResponseReader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js new file mode 100644 index 00000000..a6aa4c89 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestFactory.js @@ -0,0 +1,130 @@ +/** + * Creation d'une requête en REST ou WPS + * (Factory) + * + * @module AltiRequestFactory + * @alias Gp.Services.Alti.Request.AltiRequestFactory + * @private + */ +import Logger from "../../../Utils/LoggerByDefault"; +import ErrorService from "../../../Exceptions/ErrorService"; +import AltiRequestREST from "./AltiRequestREST"; +import AltiRequestWPS from "./AltiRequestWPS"; + +var AltiRequestFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * httpMethod : 'GET', // GET|POST + * onSuccess : function (response) {}, + * onError : function (error) {}, + * scope : this, + * positions : [{lon:, lat:}, {lon:, lat:}], + * outputFormat : 'json' // json|xml + * sampling : 3, + * api : 'REST', // REST|WPS + * zonly : false // false|true + * }; + * + */ + build : function (options) { + // logger + var logger = Logger.getLogger("AltiRequestFactory"); + logger.trace(["AltiRequestFactory::build()"]); + + var request = null; + + // on factorise les options par groupe; + // - global, + // - param, les params pour les data inputs + // - wps, les param du service + // - callback + + var settings = { + // ajout des valeurs par defaut spécifiques au service + type : options.sampling ? "Profil" : "Elevation", + method : options.httpMethod, + param : { + positions : null, + delimiter : null, // FIXME par defaut, on ne le met pas en place car ça fait planter la requête !? + indent : null, // par defaut + crs : null, // par defaut + format : null, // (only to POST) + sampling : null, // (only use by Profil) + zonly : null, // (only use by Elevation) + measures : null // (only use by Elevation) + } + }; + + // surcharge des valeurs obligatoires + settings.param.positions = options.positions; + settings.param.format = options.outputFormat; + settings.param.sampling = options.sampling; + settings.param.zonly = options.zonly; + settings.param.measures = options.measures; + settings.param.resource = options.resource; + + // gestion des callback + var bOnError = !!(options.onError !== null && typeof options.onError === "function"); // cast variable to boolean + var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); + + var message = null; + switch (options.api) { + case "REST": + // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! + 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": + // ajout des valeurs par defaut spécifiques au service WPS + settings.wps = { + service : null, // par defaut + version : null, // par defaut + identifier : null, // par defaut + rawdataoutput : null, // par defaut + request : null // par defaut + }; + + 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; + } +}; + +export default AltiRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js new file mode 100644 index 00000000..1fe1fa77 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestREST.js @@ -0,0 +1,209 @@ +/* jshint multistr : true */ + +import Logger from "../../../Utils/LoggerByDefault"; +import _ from "../../../Utils/MessagesResources"; +import AltiElevationRequest from "./model/AltiElevationRequest"; +import AltiProfilRequest from "./model/AltiProfilRequest"; + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service altimetrique. + * + * @todo Le service Alti n'implemente pas le POST !? + * @constructor + * @alias Gp.Services.Alti.Request.AltiRequestREST + * @param {Object} options - options + * @param {Object} options.param.positions - tableau de coordonnées lon/lat + * @param {String} options.param.delimiter - '|' + * @param {Boolean} options.param.indent - false|true + * @param {String} options.param.crs - 'CRS:84' + * @param {String} options.param.sampling - 3 + * @param {String} options.param.resource - 'rge_alti_corse2a_float32_zip_lamb93' + * @param {Boolean} options.param.zonly - false|true + * @param {Boolean} options.param.measures - false|true + * @param {String} options.param.format - "JSON|XML" + * @param {String} options.type - "Profil|Elevation" + * @param {String} options.method - GET|POST + * + * @example + * var options = { + * type : 'Profil', // Elevation + * method : 'GET', // par defaut + * param : { + * positions : [ + * {lon:'1.11', lat:'1.11'}, + * {lon:'1.10', lat:'1.10'}, + * {lon:'1.12', lat:'1.12'} + * ], + * delimiter : ";", // par defaut + * indent : true, // par defaut + * crs : 'EPSG:4326', // par defaut + * format : 'json', // par defaut (only to POST) + * sampling : 3 , // par defaut (only use by Profil) + * zonly : false // par defaut (only use by Elevation) + * measures : false // par defaut (only use by Elevation) + * } + * }; + * + * var result; + * try { + * var obj = new AltiRequestREST (options); + * if (! obj.processRequestString ()) { + * throw new Error("Request empty !?") + * } + * result = obj.requestString; + * } catch (e) { + * // exceptions... + * } + * @private + */ +function AltiRequestREST (options) { + this.logger = Logger.getLogger("AltiRequestREST"); + this.logger.trace("[Constructeur AltiRequestREST ()]"); + + if (!(this instanceof AltiRequestREST)) { + throw new TypeError("AltiRequestREST constructor cannot be called as a function."); + } + + this.options = options || {}; + + // existance des options + if (!this.options) { + throw new Error(_.getMessage("PARAM_EMPTY", "options")); + } + + // type de requete : Altitude ou Profil + // (param. à determiner en fonction des parametres d'entrée) + if (!this.options.type) { + throw new Error(_.getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); + } + + // construction du modele de requête + // (test du type d'objet candidat) + 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)")); + } + + /** + * methode. + * Par defaut, "GET". + */ + this.method = this.options.method || "GET"; +} + +AltiRequestREST.prototype = { + + /** + * request + * @type {String} + */ + requestString : null, + + /** + * Constructeur (alias) + */ + constructor : AltiRequestREST, + + /** + * Template de la requête. + */ + template : { + get : { + // FIXME on retire le param 'delimiter' : &delimiter='__DELIMITER__' + value : "lon=__LON__&lat=__LAT__&indent=__INDENT__&crs='__CRS__'&resource=__RESOURCE__&measures=__MEASURES__", + input : { + point : "&zonly=__ZONLY__", + profil : "&sampling=__SAMPLING__" + } + }, + post : { + // FIXME on retire le param 'delimiter' : delimiter='__DELIMITER__'\n\ + value : "lon=__LON__\n" + + "lat=__LAT__\n" + + "indent=__INDENT__\n" + + "crs='__CRS__'\n" + + "resource='__RESOURCE__'\n" + + "measures='__MEASURES__'\n", + input : { + point : "zonly=__ZONLY__\n", + profil : "sampling=__SAMPLING__" + } + } + }, + + /** + * Construction de la requête. + * + * @example + * // GET out : lon=0.2367,2.1570&lat=48.0551,46.6077&delimiter=,&indent=true&zonly=true&crs='CRS:84' + * // POST out : Not yet supported method POST ! + * @returns {String} + */ + processRequestString : function () { + this.logger.trace("AltiRequestREST::processRequestString ()"); + + 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()); + // FIXME on retire le param 'delimiter' + // template = template.replace(/__DELIMITER__/g, this.DataObject.delimiter); + template = template.replace(/__INDENT__/g, this.DataObject.indent); + template = template.replace(/__CRS__/g, this.DataObject.crs); + template = template.replace(/__RESOURCE__/g, this.DataObject.resource); + template = template.replace(/__MEASURES__/g, this.DataObject.measures); + + // ajout + + template = template + this.__addDataInputs(); + this.logger.trace("traduction tmpl", template); + + // sauvegarde + this.requestString = template; + + return this.requestString; + }, + + /** + * Ajout de parametres spécifiques (ex. zonly) + * + * @returns {String} + */ + __addDataInputs : function () { + this.logger.trace("AltiRequestREST::addDataInput ()"); + + 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.toString()); + } 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 !?"); + } + } +}; + +export default AltiRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js new file mode 100644 index 00000000..f366c891 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/AltiRequestWPS.js @@ -0,0 +1,113 @@ +/** + * Classe d'interface des requêtes de type WPS sur le service altimetrique. + * (Factory) + * + * @module Gp.Services.Alti.Request.AltiRequestWPS + * @alias Gp.Services.Alti.Request.AltiRequestWPS + * @private + */ +import Logger from "../../../Utils/LoggerByDefault"; +import _ from "../../../Utils/MessagesResources"; +import WPS from "../../../Formats/WPS"; +import AltiElevationRequest from "./model/AltiElevationRequest"; +import AltiProfilRequest from "./model/AltiProfilRequest"; + +var AltiRequestWPS = { + + /** + * Interface unique de construction de la requête. + * + * @method build + * @param {Object} options - options + * @param {Object} options.param.positions - tableau de coordonnées lon/lat + * @param {String} options.param.delimiter - '|' + * @param {Boolean} options.param.indent - false|true + * @param {String} options.param.crs - 'CRS:84' + * @param {String} options.param.sampling - 3 + * @param {Boolean} options.param.zonly - false|true + * @param {String} options.param.format - "JSON|XML" (only to POST) + * @param {String} options.wps.service - "WPS" + * @param {String} options.wps.version - "1.0.0" + * @param {String} options.wps.identifier - "gs:WPSElevation|gs:WPSLineElevation" + * @param {String} options.wps.rawdataoutput - "result" + * @param {String} options.wps.request - "Execute" + * @param {String} options.type - "Profil|Elevation" + * @param {String} options.method - GET|POST + * @example + * var options = { + * type : 'Profil', // Elevation + * method : 'GET', // par defaut + * param : { + * positions : [ + * {lon:'1.11', lat:'1.11'}, + * {lon:'1.10', lat:'1.10'}, + * {lon:'1.12', lat:'1.12'} + * ], + * delimiter : ";", // par defaut + * indent : true, // par defaut + * crs : 'EPSG:4326', // par defaut + * format : 'json', // par defaut (only to POST) + * sampling : 3 , // par defaut (only use by Profil) + * zonly : false, // par defaut (only use by Elevation) + * }, + * wps : { + * service : 'WPS', // par defaut + * version : '1.0.0', // par defaut + * identifier : 'gs:WPS', // par defaut, Elevation = gs:WPSElevation, Profil = gs:WPSLineElevation + * rawdataoutput : 'result',// par defaut + * request : 'Execute' // par defaut + * } + * }; + */ + build : function (options) { + // logger + var logger = Logger.getLogger("AltiRequestWPS"); + logger.trace(["AltiRequestWPS::build()"]); + + // existance des options + if (!options) { + throw new Error(_.getMessage("PARAM_EMPTY", "options")); + } + + // type de requete : Altitude ou Profil + // (param. à determiner en fonction des parametres d'entrée) + if (!options.type) { + throw new Error(_.getMessage("PARAM_EMPTY", "type (Elevation or Profil)")); + } + + // construction du modele de requête + // (test du type d'objet candidat) + var DataObject = null; + switch (options.type) { + case "Elevation": + // surcharge + options.wps.identifier = "gs:WPSElevation"; + DataObject = new AltiElevationRequest(options.param); + break; + case "Profil": + // surcharge + options.wps.identifier = "gs:WPSLineElevation"; + DataObject = new AltiProfilRequest(options.param); + break; + default: + throw new Error(_.getMessage("PARAM_TYPE", "type (Elevation or Profil)")); + } + + // construction de la requête WPS + 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; + } +}; + +export default AltiRequestWPS; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js new file mode 100644 index 00000000..7c6b6460 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiElevationRequest.js @@ -0,0 +1,108 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; +import AltiRequest from "./AltiRequest"; + +/** + * @classdesc + * + * Classe de gestion des param. des requêtes de type POINT du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiElevationRequest + * @param {Object} options - options + * @param {Boolean} options.zonly - false|true + * + * @private + */ +function AltiElevationRequest (options) { + if (!(this instanceof AltiElevationRequest)) { + throw new TypeError("AltiElevationRequest constructor cannot be called as a function."); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "AltiElevationRequest"; + + // appel du constructeur par heritage + AltiRequest.apply(this, arguments); + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur AltiElevationRequest ()]"); + + /** + * Z uniquement. + * true|false + */ + this.zonly = this.options.zonly || false; // test des options héritées ! +} + +/** + * @lends module:AltiElevationRequest# + */ + +AltiElevationRequest.prototype = Object.create(AltiRequest.prototype, { + + /** + * Setter/getter pour "zonly" + */ + zonly : { + /** getter */ + get : function () { + return this._zonly; + }, + /** setter */ + set : function (z) { + this._zonly = z; + } + } + +}); + +/** + * Constructeur (alias) + */ +AltiElevationRequest.prototype.constructor = AltiElevationRequest; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} + */ +AltiElevationRequest.prototype.getData = function () { + // par glop..., appel de AltiRequest::getData () ! + var map = []; + map.push({ + k : "lon", + v : this.getLon() + }); + map.push({ + k : "lat", + v : this.getLat() + }); + // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" + 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 + }); + map.push({ + k : "resource", + v : this.resource + }); + + return map; +}; + +export default AltiElevationRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js new file mode 100644 index 00000000..bb50ae89 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiProfilRequest.js @@ -0,0 +1,106 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; +import AltiRequest from "./AltiRequest"; + +/** + * @classdesc + * Classe de gestion des param. des requêtes de type PROFIL du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiProfilRequest + * @param {Object} options - options + * @param {String} options.sampling - 3 + * + * @private + */ +function AltiProfilRequest (options) { + if (!(this instanceof AltiProfilRequest)) { + throw new TypeError("AltiProfilRequest constructor cannot be called as a function."); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "AltiProfilRequest"; + + // appel du constructeur par heritage + AltiRequest.apply(this, arguments); + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur AltiProfilRequest ()]"); + + /** + * Sampling + * Par defaut, 3 + */ + this.sampling = this.options.sampling || 3; // test des options héritées ! +} + +/** + * @lends module:AltiProfilRequest# + */ + +AltiProfilRequest.prototype = Object.create(AltiRequest.prototype, { + + /** + * Setter/getter pour "sampling" + */ + sampling : { + /** getter */ + get : function () { + return this._sampling; + }, + /** setter */ + set : function (value) { + this._sampling = value; + } + } +}); + +/** + * Constructeur (alias) + */ +AltiProfilRequest.prototype.constructor = AltiProfilRequest; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} + */ +AltiProfilRequest.prototype.getData = function () { + // par glop..., appel de AltiRequest::getData () ! + var map = []; + map.push({ + k : "lon", + v : this.getLon() + }); + map.push({ + k : "lat", + v : this.getLat() + }); + // map.push({k : "delimiter", v : this.delimiter}); // FIXME on retire le param "delimiter" + 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 + }); + map.push({ + k : "resource", + v : this.resource + }); + + return map; +}; + +export default AltiProfilRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js new file mode 100644 index 00000000..13029882 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Request/model/AltiRequest.js @@ -0,0 +1,220 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service altimetrique. + * + * @constructor + * @alias Gp.Services.Alti.Request.AltiRequest + * @param {Object} options - options + * @param {Object} options.positions - tableau de coordonnées lon/lat + * @param {String} options.delimiter - "|" + * @param {Boolean} options.indent - false|true + * @param {String} options.crs - "CRS:84" + * @param {String} options.format - "JSON|XML" + * + * @private + */ +function AltiRequest (options) { + if (!(this instanceof AltiRequest)) { + throw new TypeError("AltiRequest constructor cannot be called as a function."); + } + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur AltiRequest ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + /** + * Liste des coordonnées. + * @example + * var c = [{lon : "", lat : ""}, {lon : "", lat : ""}]; + */ + this.positions = this.options.positions || []; + + /** + * Caractère de séparation. + * Par defaut, "|". + */ + this.delimiter = this.options.delimiter || "|"; + + /** + * Indentation. + * true|false + */ + this.indent = this.options.indent || false; + + /** + * Projection. + * Par defaut, CRS:84. + */ + this.crs = this.options.crs || "CRS:84"; + + /** + * format de sortie. + * Par defaut, "json". + */ + this.format = this.options.format || "json"; + + /* + * Ressource utilisée + */ + this.resource = this.options.resource; + + /** + * Réponse détaillée (source & accuracy) + * true|false + */ + this.measures = this.options.measures || false; +} + +/** + * CLASSNAME + */ +AltiRequest.CLASSNAME = "AltiRequest"; + +AltiRequest.prototype = { + + /** + * @lends module:AltiRequest# + */ + + /** + * Constructeur (alias) + */ + constructor : AltiRequest, + + /** + * Ajout d"une liste de coordonnées. + * + * @param {Object[]} lstPosition - liste de positions + * @example + * obj.setPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); + */ + 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; + }, + + /** + * Liste des coordonnées. + * + * @param {Int} pos - position + * @returns {positions} + * @example + * obj.getPositions (); // [{lon : "", lat : ""}, {lon : "", lat : ""}] + * obj.getPositions (0); // [{lon : "", lat : ""}] + */ + getPositions : function (pos) { + // FIXME test if not a number !? + if (!pos) { + return this.positions; + } + + var index = this.positions.length - 1; + if (pos > index || pos < index) { + this.logger.warn("index out of range !"); + return this.positions; + } + + return this.positions[pos]; + }, + + /** + * Ajout d"une liste de coordonnées. + * + * @param {Object[]} lstPosition - liste de positions + * @example + * obj.addPositions ([{lon : "0.15", lat : "0.15"}, {lon : "1.15", lat : "1.15"}]); + */ + 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]); + } + } + }, + + /** + * Retourne la liste des longitudes avec un caractère de séparation. + * + * @returns {String} - une liste de longitudes + * @example + * // out : 0.2367|2.1570|43.789|... + */ + getLon : function () { + var lstLon = []; + for (var i = 0; i < this.positions.length; i++) { + lstLon.push(this.positions[i].lon); + } + this.logger.trace(lstLon); + return lstLon.join(this.delimiter); + }, + + /** + * Retourne la liste des lattitudes avec un caractère de séparation. + * + * @returns {String} - une liste de lattitudes + * @example + * // out : 0.2367|2.1570|43.789|... + */ + getLat : function () { + var lstLat = []; + for (var i = 0; i < this.positions.length; i++) { + lstLat.push(this.positions[i].lat); + } + this.logger.trace(lstLat); + return lstLat.join(this.delimiter); + } + +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} + */ +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; +}; + +export default AltiRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js new file mode 100644 index 00000000..bf26cb6b --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/AltiResponseFactory.js @@ -0,0 +1,188 @@ +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module AltiResponseFactory + * @private + * @alias Gp.Services.Alti.Response.AltiResponseFactory + */ +import Logger from "../../../Utils/LoggerByDefault"; +import MRes from "../../../Utils/MessagesResources"; +import ErrorService from "../../../Exceptions/ErrorService"; +import XML from "../../../Formats/XML"; +import AltiResponseReader from "../Formats/AltiResponseReader"; +import AltiResponse from "./model/AltiResponse"; +import Elevation from "./model/Elevation"; + +var AltiResponseFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build : function (options) { + // logger + var logger = Logger.getLogger("AltiResponseFactory"); + logger.trace(["AltiResponseFactory::build()"]); + + var data = null; + + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + switch (options.outputFormat) { + case "xml": + logger.trace("analyze response : 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": + logger.trace("analyze response : json"); + logger.trace("analyze response : ", typeof options.response); + + var JSONResponse = null; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // le service renvoie t il une erreur ? + if (JSONResponse && JSONResponse.error) { + // ex. {"error": {"code": "BAD_PARAMETER","description": "The values () cannot be parsed as a valid longitude (double value such as -180 < lat < 180)."}} + options.onError.call(options.scope, new ErrorService({ + message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.error.description), + status : 200, + type : ErrorService.TYPE_SRVERR + })); + return; + } + + // analyse de la reponse + 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") { + // elevations[i] est un objet elevation + 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; + } + if (elevations[i].measures) { + elevation.measures = elevations[i].measures; + } + } else if (typeof elevations[i] === "number") { + // elevations[i] est un nombre, dans le cas de zonly=true notamment + 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; + } + + // Si la réponse contenait une exception renvoyée par le service + 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); + } +}; + +export default AltiResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js new file mode 100644 index 00000000..01db7918 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/AltiResponse.js @@ -0,0 +1,23 @@ +/** + * Response object for {@link module:Services~getAltitude Gp.Services.getAltitude ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} elevations - Elevations array. + * + * @namespace + * @alias Gp.Services.AltiResponse + */ +function AltiResponse () { + if (!(this instanceof AltiResponse)) { + throw new TypeError("AltiResponse constructor cannot be called as a function."); + } + + this.elevations = []; +} + +AltiResponse.prototype = { + + constructor : AltiResponse + +}; + +export default AltiResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js new file mode 100644 index 00000000..e7214f88 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Elevation.js @@ -0,0 +1,27 @@ + +/** + * Single elevation object returned by underlying web service. Contains at least, one elevation (z). May also contain point coordinates and elevation accuracy if "zonly" parameter wasn't set to true. + * + * @property {Float} lat - Point latitude. (only if zonly=false) + * @property {Float} lon - Point longitude. (only if zonly=false) + * @property {Float} z - Point elevation. + * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) + * + * @namespace + * @alias Gp.Services.Alti.Elevation + */ +function Elevation () { + if (!(this instanceof Elevation)) { + throw new TypeError("Elevation constructor cannot be called as a function."); + } + + this.z = null; +} + +Elevation.prototype = { + + constructor : Elevation + +}; + +export default Elevation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js new file mode 100644 index 00000000..e46bebb3 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Alti/Response/model/Measure.js @@ -0,0 +1,30 @@ + +/** + * Single measure object returned by underlying web service if measures = true and zonly = false + * + * @property {String} source_name - Name of the source + * @property {String} source_measure - Name of the measure + * @property {Float} z - Point elevation. + * @property {Float} acc - Accuracy of elevation for this point. (only if zonly=false) + * + * @namespace + * @alias Gp.Services.Alti.Measure + */ +function Measure () { + if (!(this instanceof Measure)) { + throw new TypeError("Measure constructor cannot be called as a function."); + } + + this.source_name = null; + this.source_measure = null; + this.z = null; + this.acc = null; +} + +Measure.prototype = { + + constructor : Measure + +}; + +export default Measure; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js new file mode 100644 index 00000000..ceae1497 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/AutoComplete.js @@ -0,0 +1,227 @@ +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import AutoCompleteResponseFactory from "./Response/AutoCompleteResponseFactory"; +import Logger from "../../Utils/LoggerByDefault"; +import MR from "../../Utils/MessagesResources"; +import Helper from "../../Utils/Helper"; +import ErrorService from "../../Exceptions/ErrorService"; + +/** + * @classdesc + * Appel du service d'autocomplétion du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.AutoComplete + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.text - La chaîne de caractère à compléter. + * Cette chaîne n'est pas "URL encodée". + * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête. + * + * @param {Array.} [options.type = ["StreetAddress"]] - Type de l'objet recherché. + * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, type = ['StreetAddress']. + * + * @param {String} [options.territory] - Limitation de la zone de recherche de localisants. + * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE', + * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31' + * Pas de valeur par défaut. + * La valeur par défaut est donc celle du service. + * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié. + * + * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. + * La valeur par défaut sera donc celle du service : 10. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * text : "", + * type : "StreetAddress", + * territory : 'METROPOLE', + * maximumResponses : 10 + * }; + */ +function AutoComplete (options_) { + if (!(this instanceof AutoComplete)) { + throw new TypeError(MR.getMessage("CLASS_CONSTRUCTOR", "AutoComplete")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "AutoComplete"; + + this.logger = Logger.getLogger("Gp.Services.AutoComplete"); + this.logger.trace("[Constructeur AutoComplete (options)]"); + + var options = this.patchOptionConvertor(options_); + + if (!options.serverUrl) { + options.serverUrl = DefaultUrlService.AutoComplete.newUrl(); + if (options.oldAutocompleteService) { + options.serverUrl = DefaultUrlService.AutoComplete.url(); + } + } + + // appel du constructeur par heritage + CommonService.apply(this, arguments); + + if (!options.text) { + throw new Error(MR.getMessage("PARAM_MISSING", "text")); + } + + // ajout des options spécifiques au service + this.options.text = options.text; + + // on definit des parametres par defaut + if (!options.type) { + options.type = ["StreetAddress,PositionOfInterest"]; + } + + this.options.type = options.type; + this.options.territory = options.territory || ""; + this.options.maximumResponses = options.maximumResponses || 10; + + // INFO + // le service ne repond pas en mode POST (405 Method Not Allowed) + if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") { + this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"); + this.options.httpMethod = "GET"; // on surcharge ! + } + + // attributs d'instances + + /** + * Format forcé de la réponse du service : "json" + * sauf si l'on souhaite une reponse brute (options.rawResponse) + */ + this.options.outputFormat = (this.options.rawResponse) ? "" : "json"; +} + +/** + * @lends module:AutoComplete# + */ + +AutoComplete.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +AutoComplete.prototype.constructor = AutoComplete; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +AutoComplete.prototype.patchOptionConvertor = function (options_) { + const options = options_; + + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + + if (options.filterOptions.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.type) { + options.type = options.filterOptions.type; + } + } + + if (options.filterOptions.territory) { + this.logger.warn("The parameter 'filterOptions.territory' is deprecated"); + if (!options.terr) { + options.terr = options.filterOptions.territory; + } + } + + delete options.filterOptions; + } + + return options; +}; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +AutoComplete.prototype.buildRequest = function (error, success) { + // ex. + // http://wxs.ign.fr/CLEF/ols/apis/completion? + // text=Brie-Comt& + // type=StreetAddress,PositionOfInterest& + // territory=METROPOLE& + // maximumResponses=10 + + // traitement des param KPV sous forme de tableau + var territory = ""; + if (this.options.territory) { + territory = this.options.territory; + } + + var type = ""; + if (this.options.type) { + type = this.options.type.join(","); + } + + // normalisation de la requete avec param KPV + this.request = Helper.normalyzeParameters({ + text : encodeURIComponent(this.options.text), + type : type, + terr : territory, + maximumResponses : this.options.maximumResponses + }); + + (!this.request) + ? error.call(this, new ErrorService(MR.getMessage("SERVICE_REQUEST_BUILD"))) + : success.call(this, this.request); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback de succès de l'analyse de la réponse + */ +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"))); + } +}; + +export default AutoComplete; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js new file mode 100644 index 00000000..0b925a30 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/AutoCompleteResponseFactory.js @@ -0,0 +1,142 @@ +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module AutoCompleteResponseFactory + * @private + * @alias Gp.Services.AutoComplete.Response.AutoCompleteResponseFactory + */ +import Logger from "../../../Utils/LoggerByDefault"; +import MRes from "../../../Utils/MessagesResources"; +import ErrorService from "../../../Exceptions/ErrorService"; +import AutoCompleteResponse from "./model/AutoCompleteResponse"; +import SuggestedLocation from "./model/SuggestedLocation"; + +var AutoCompleteResponseFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Alti + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build : function (options) { + // logger + var logger = Logger.getLogger("AutoCompleteResponseFactory"); + logger.trace(["AutoCompleteResponseFactory::build()"]); + + var data = null; + + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + var JSONResponse = null; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // analyse de la réponse + if (JSONResponse) { + // le service renvoie t il une erreur ? + if (JSONResponse.error) { + // ex. ? + 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; + } + + // création de l'objet réponse + data = new AutoCompleteResponse(); + + // boucle sur les résultats de l'autocomplétion + if (JSONResponse.results && Array.isArray(JSONResponse.results)) { + var suggestedLocation = null; + + for (var i = 0; i < JSONResponse.results.length; i++) { + var result = JSONResponse.results[i]; + suggestedLocation = new SuggestedLocation(); + + if (result) { + if (result.country === "StreetAddress") { + suggestedLocation.street = result.street; + suggestedLocation.type = "StreetAddress"; + } else if (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; + } + // Ajout du résultat au tableau reverseGeocodedLocations de geocodedLocation + 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; + } + + // Si la réponse contenait une exception renvoyée par le service + 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 { + // si la réponse (xmlString) est vide, on appelle le callback d'erreur + options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + + // si tout s'est bien passé, on appelle le callback de succès + options.onSuccess.call(options.scope, data); + } +}; + +export default AutoCompleteResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js new file mode 100644 index 00000000..af06041d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/AutoCompleteResponse.js @@ -0,0 +1,23 @@ +/** + * Response object for {@link module:Services~autoComplete Gp.Services.autoComplete ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} suggestedLocations - SuggestedLocations array. + * + * @namespace + * @alias Gp.Services.AutoCompleteResponse + */ +function AutoCompleteResponse () { + if (!(this instanceof AutoCompleteResponse)) { + throw new TypeError("AutoCompleteResponse constructor cannot be called as a function."); + } + + this.suggestedLocations = []; +} + +AutoCompleteResponse.prototype = { + + constructor : AutoCompleteResponse + +}; + +export default AutoCompleteResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js new file mode 100644 index 00000000..a6e8fb2d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/AutoComplete/Response/model/SuggestedLocation.js @@ -0,0 +1,123 @@ + +/** + * Single SuggestedLocation Object returned by underlying web service. + * Each suggested location represents a street address ("StreetAddress") or a place name ("PositionOfInterest"). + * + * @property {String} type - Suggested location type : "StreetAddress" ou "PositionOfInterest" + * @property {Gp.Point} position - Position of the suggested location given in requested coordinates system. + * @property {String} commune - Suggested municipality + * @property {String} fullText - Full text representation of the suggested location. + * @property {String} postalCode - Suggested location postcode + * @property {Integer} classification - Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). + * @property {String} street - Street name of the suggested location ("StreetAddress" only). + * @property {String} kind - Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). + * + * @namespace + * @alias Gp.Services.AutoComplete.SuggestedLocation + */ +function SuggestedLocation () { + if (!(this instanceof SuggestedLocation)) { + throw new TypeError("SuggestedLocation constructor cannot be called as a function."); + } + + /* REPONSE : + { + "status" : "OK", + "results" : [ + { + "country":"PositionOfInterest", + "x":-1.559185, + "y":47.952603, + "city":"Brie", + "zipcode":"35150", + "street":"corbe", + "kind":"Lieu-dit habité", + "fulltext":"corbe, 35150 Brie", + "classification":6 + }, + { + "country":"StreetAddress", + "x":1.538295, + "y":43.19646, + "city":"Brie", + "zipcode":"09700", + "street":"courreste", + "kind":"", + "fulltext":"courreste, 09700 Brie", + "classification":7 + } + ] + } + */ + + /* REPONSE EN ERREUR + { + status : "ERROR", + results : [ ] + } + */ + + /** + * Suggested location type : "StreetAddress" ou "PositionOfInterest" + * @type {String} + */ + this.type = null; + + /** + * Position of the suggested location given in requested coordinates system. + * @type {Gp.Point} + */ + this.position = { + x : null, + y : null + }; + + /** + * Suggested municipality + * @type {String} + */ + this.commune = null; + + /** + * Full text representation of the suggested location. + * @type {String} + */ + this.fullText = null; + + /** + * Suggested location postcode + * @type {Number} + */ + this.postalCode = null; + + /** + * Number used to classify the importance of the place where is the suggested location from 1 (most important) to 7 (less important). + * @type {Integer} + */ + this.classification = null; + + /** + * Street name of the suggested location ("StreetAddress" only). + * @type {String} + */ + this.street = null; + + /** + * Place name of the suggested location ("PositionOfInterest" only). + * @type {String} + */ + this.poi = null; + + /** + * Nature of the suggested location : "prefecture", "monument", "commune", ... for instance ("PositionOfInterest" only). + * @type {String} + */ + this.kind = null; +} + +SuggestedLocation.prototype = { + + constructor : SuggestedLocation +}; + +export default SuggestedLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js new file mode 100644 index 00000000..317c7cdb --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/CommonService.js @@ -0,0 +1,493 @@ +import Logger from "../Utils/LoggerByDefault"; +import Helper from "../Utils/Helper"; +import _ from "../Utils/MessagesResources"; +import Protocol from "../Protocols/Protocol"; +import ErrorService from "../Exceptions/ErrorService"; +// import DefaultUrlService from "./DefaultUrlService"; +// package.json (extract version) +import Pkg from "../../package.json"; + +/** + * @classdesc + * Composant Service + * + * @constructor + * @alias Gp.Services.CommonService + * @param {Object} options - options communes à tous les services + * + * @param {String} [options.serverUrl] - URL d'accès au service. Par défaut "https://wxs.ign.fr/calcul/geoportail/SERVICE/". + * Permet de forcer l'utilisation d'un service équivalent déployé derrière une éventuelle autre URL d'accès. + * Si ce paramètre est renseigné alors, le paramètre par défaut est ignoré. + * + * @param {String} [options.protocol] - Le protocole à utiliser pour récupérer les informations du service : + * peut valoir 'JSONP' ou 'XHR'. + * Par défaut, c'est le protocole XHR qui sera utilisé. + * Attention, le protocole JSONP n'est pas valide dans un environnement NodeJS (Utilisation du mode XHR). + * + * @param {Boolean} [options.ssl] - Indique si l'on souhaite intérroger les services en https. + * Ce paramètre ne fonctionne que pour une utilisation hors navigateur (ex. NodeJS). + * Sur un navigateur, le protocole est automatiquement extrait de l'url du site... + * Par défaut, on utilise le protocole http (ssl=false). + * + * @param {String} [options.proxyURL] - Le proxy à utiliser pour pallier au problème de cross-domain dans le cas d'une requête XHR. + * Utile si le paramètre 'protocol' vaut 'XHR', il ne sera pas pris en compte si protocol vaut JSONP. + * + * @param {String} [options.callbackSuffix] - Suffixe de la fonction de callback à utiliser, dans le cas du protocole JSONP. + * Par défaut, la fonction de callback portera un nom du type "callback"+ID, où ID est soit un identifiant unique généré à chaque requête, + * soit le paramètre callbackSuffix s'il est spécifié. Par exemple, si callbackSuffix="_2", la fonction sera "callback_2 ()". + * Utile pour utiliser une réponse déjà encapsulée dans une fonction de callback, dont le nom est connu + * Utile seulement si le paramètre 'protocol' vaut 'JSONP', il ne sera pas pris en compte si protocol vaut 'XHR'. + * + * @param {String} [options.httpMethod] - La méthode HTTP + * à utiliser dans le cas d'une requête XHR : peut valoir 'GET' ou 'POST'. + * Non pris en compte si 'protocol' vaut JSONP qui fonctionne obligatoirement en GET. + * Par défaut, c'est la méthode GET qui est utilisée. + * + * @param {String} [options.contentType] - Content-Type de la requete + * à utiliser dans le cas d'une requête XHR en mode POST. + * Non pris en compte si 'protocol' vaut JSONP et/ou la méthode HTTP vaut GET. + * Par défaut, c'est la méthode GET qui est utilisée donc on n'utilise pas de Content-Type. + * + * @param {Number} [options.timeOut] - Délai d'attente maximal (en ms) de la réponse du service (à partir de l'envoi de la requête). + * Par défaut, aucun timeOut n'est pris en compte (timeoutDelay= 0). + * + * @param {Boolean} [options.rawResponse] - Indique si l'on souhaite que la réponse du service ne soit pas parsée par l'API avant d'être restituée. + * (Cf. paramètre « onSuccess » pour plus de détails). + * + * @param {Function} [options.onSuccess] - Fonction appelée lorsque le service répond correctement à la requête + * (code HTTP 200, sans message d'erreur). + * Cette fonction prend en paramètre la réponse du service, + * soit sous la forme d'un Object Javascript formaté par le parseur dédié à la syntaxe du service (comportement par défaut) ; + * soit brute au format String non prétraité si le paramètre « rawResponse » a été précisé avec la valeur « true ». + * + * @param {Function} [options.onFailure] - Fonction appelée lorsque le service ne répond pas correctement + * (code HTTP de retour différent de 200 ou pas de réponse). + * + * @param {Function} [options.onBeforeParse] - Fonction appelée avant le parsing de la réponse + * Permet de modifier la réponse avant parsing et la fonction doit retourner une String. + * Cette fonction prend en paramètre la réponse telle que renvoyée par le service + * (cad au format json ou xml). + * Pour le JSONP, si le paramètre "rawResponse" a été précisé avec la valeur "true", + * la fonction prend en paramètre un Object JavaScript contenant la réponse XML. + * + * @example + * var options = { + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * ssl : false, + * proxyURL : null, + * callbackName : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * onBeforeParse : function (rawResponse) {} + * }; + */ +function CommonService (options) { + if (!(this instanceof CommonService)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR")); + } + + this.logger = Logger.getLogger("CommonService"); + this.logger.trace("[Constructeur CommonService (options)]"); + + // ##################### + // récupération des options par défaut pour les paramètres optionnels + // ##################### + + /** + * Options du service + * @type {Object} + */ + this.options = { + // protocol : "JSONP", + protocol : "XHR", + ssl : true, + proxyURL : "", + // callbackName : "", + callbackSuffix : null, + httpMethod : "GET", + timeOut : 0, + rawResponse : false, + scope : this, + /** + * callback par defaut pour la reponse + * @param {Object} response - response + * @private + */ + onSuccess : function (response) { + console.log("onSuccess - la reponse est la suivante : ", response); + }, + /** + * callback par defaut pour les erreurs + * @param {Object} error - error + * @private + */ + onFailure : function (error) { + if (error.status === 200 || !error.status) { + console.log("onFailure : ", error.message); + } else { + console.log("onFailure - Erreur (", error.status, ") : ", error.message); + } + } + }; + + // et on ajoute les options en paramètre aux options par défaut + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this.options[opt] = options[opt]; + } + } + + // ##################### + // analyse des options + // ##################### + + // modification de la fonction de callback onSuccess dans le cas où la réponse brute est demandée + if (this.options.rawResponse && !this.options.onSuccess) { + /** + * callback par defaut pour la reponse + * @param {Object} response - response + * @private + */ + this.options.onSuccess = function (response) { + console.log("onSuccess - la réponse brute du service est la suivante : ", response); + }; + } + + // gestion du callback onSuccess + var bOnSuccess = !!(this.options.onSuccess !== null && typeof this.options.onSuccess === "function"); + if (!bOnSuccess) { + throw new Error(_.getMessage("PARAM_MISSING", "onSuccess()")); + } + + // FIXME traitement au niveau de chaque composant pour tester service WXS / GPF + // gestion de l'url du service par defaut + /* + if (!this.options.serverUrl) { + // INFO + // gestion de l'url du service par defaut pour les services qui ne possèdent qu'une seul url par defaut + // les cas particuliers des services avec plusieurs urls (ex. Alti) devront être traité dans la classe du composant + // donc si l'url n'est pas renseignée, il faut utiliser les urls par defaut + DefaultUrlService.ssl = this.options.ssl; + var urlByDefault = DefaultUrlService[this.CLASSNAME].url("calcul"); + if (typeof urlByDefault === "string") { + this.options.serverUrl = urlByDefault; + } else { + this.logger.trace("URL par defaut à determiner au niveau du composant..."); + } + } + */ + + // FIXME nettoyage des KVP dans l'url du service + // if (this.options.serverUrl) { + // // INFO + // // si l'url est renseignée, il faut la nettoyer de tous ses KVP + // // ex. on ne veut pas de params. 'callback' ou 'output' car ceci declencherait + // // des opérations d'encapsulations des reponses légèrement farfelues ... + // var urlsource = this.options.serverUrl; + // var urlparts = urlsource.split("?"); + // this.options.serverUrl = urlparts[0]; + // } + + // gestion de la methode HTTP + 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")); + } + + // gestion du protocole + // this.options.protocol = (typeof options.protocol === "string" ) ? options.protocol.toUpperCase() : "JSONP"; + this.options.protocol = (typeof options.protocol === "string") ? options.protocol.toUpperCase() : "XHR"; + + switch (this.options.protocol) { + case "JSONP": + case "XHR": + break; + default: + throw new Error(_.getMessage("PARAM_UNKNOWN", "protocol")); + } + + // on determine l'environnement d'execution : browser ou non ? + // et on lance une exception sur l'utilisation du protocole JSONP pour nodeJS... + if (typeof window === "undefined" && this.options.protocol === "JSONP") { + throw new Error(_.getMessage("PARAM_NOT_SUPPORT_NODEJS", "protocol=JSONP (instead use XHR)")); + } + + // le protocole JSONP ne fonctionne qu'en GET. + if (this.options.protocol === "JSONP") { + this.options.httpMethod = "GET"; + } + + // gestion du cache + this.options.nocache = options.nocache || false; + + // ##################### + // attributs d'instances + // ##################### + + /** + * Format de réponse du service + */ + this.options.outputFormat = null; + /** + * Requête envoyée au service + */ + this.request = null; + /** + * Reponse du service + */ + this.response = null; +} + +/** + * @lends module:CommonService + */ +CommonService.prototype = { + + /* + * Constructeur (alias) + */ + constructor : CommonService, + + /** + * Appel du service Géoportail + */ + call : function () { + /* jshint validthis : true */ + this.logger.trace("CommonService::call ()"); + + var context = this; + /** fonction d'execution */ + function run () { + this.logger.trace("CommonService::run ()"); + this.buildRequest.call(context, onError, onBuildRequest); + } + + run.call(context); + + // callback de fin de construction de la requête + function onBuildRequest (result) { + this.logger.trace("CommonService::onBuildRequest : ", result); + this.callService.call(context, onError, onCallService); + } + + // callback de fin d'appel au service + function onCallService (result) { + this.logger.trace("CommonService::onCallService : ", result); + this.analyzeResponse.call(context, onError, onAnalyzeResponse); + } + + // callback de fin de lecture de la reponse + function onAnalyzeResponse (result) { + this.logger.trace("CommonService::onAnalyzeResponse : ", result); + if (result) { + this.options.onSuccess.call(this, result); + } else { + return onError.call(this, new ErrorService("Analyse de la reponse en échec !?")); + } + } + + // callback de gestion des erreurs : renvoit un objet de type ErrorService + function onError (error) { + this.logger.trace("CommonService::onError()"); + // error : l'objet est du type ErrorService ou Error + var e = error; + if (!(e instanceof ErrorService)) { + e = new ErrorService(error.message); + } + this.options.onFailure.call(this, e); + } + }, + + /** + * Création de la requête + * @param {Function} error - callback + * @param {Function} success - callback + */ + buildRequest : function (error, success) { + // INFO + this.logger.error("overwritten method !"); + // retourne l'objet 'this.request' + if (error) { + error.call(this, "This method must be overwritten !"); + } + success.call(this, "This method must be overwritten !"); + }, + + /** + * Appel du service + * @param {Function} error - callback + * @param {Function} success - callback + */ + callService : function (error, success) { + // INFO + // retourne l'objet 'this.response' + + // NOTES + // Pour le mode XHR, on recupère une reponse sous forme d'un json ou xml (#document). + // Pour le mode JSONP, on a toujours un objet JSON mais sous 2 formes : + // - natif + // - XML encapsulé : + // {http : {status:200, error:null},xml :'réponse du service'} + // {http : {status:400, error:'reponse du service'},xml :null} + // En XHR, la reponse est directement sauvegardée dans 'this.response'. + // Par contre, en JSONP, on doit analyser la reponse (status ou non vide), + // et ne renvoyer que le contenu (xml ou l'objet) + + // gestion de la proxification du service + var strUrlProxified = null; + var strData = this.request; + + // a t on mis en place un proxy ? + // la proxyfication est valable uniquement en mode XHR ! + var bUrlProxified = !!(this.options.proxyURL && this.options.protocol === "XHR"); + + // rajout de l'option gpbibaccess + // INFO : acces au numero de version de package.conf aprés compilation ! + if (this.CLASSNAME !== "Geocode" && this.CLASSNAME !== "ReverseGeocode" && this.CLASSNAME !== "AutoComplete") { + this.options.serverUrl = Helper.normalyzeUrl(this.options.serverUrl, { + "gp-access-lib" : Pkg.version, + apiKey : this.options.apiKey || "calcul" + }, false); + } + + // si le proxy est renseigné, on proxifie l'url du service + 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; + } + } + + // contexte du composant spécifique ! + 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, // ceci declenche le parsing de la reponse du service, mais on souhaite toujours une reponse brute (string) ! + nocache : this.options.nocache || false, // ceci permet d'ajouter un timestamp dans la requête + wrap : this.options.protocol !== "XHR", // ceci declenche l'encapsulation de la reponse XML du service dans du JSON, mais pas en mode XHR ! + callbackSuffix : this.options.callbackSuffix, + // callbackName : this.options.callbackName || null, + data : strData, + headers : null, // TODO... + content : this.options.contentType || "application/xml", + scope : this.options.scope || this, + // callback de reponse + onResponse : function (response) { + self.logger.trace("callService::onResponse()"); + + // le contenu de la reponse à renvoyer ! + var content = null; + + // XHR : on renvoie toujours la reponse brute du service (json ou xml) + // au parser du composant... + if (self.options.protocol === "XHR") { + self.logger.trace("Response XHR", response); + content = response; // par defaut, la reponse du service ! + } + + // JSONP : on pre-analyse la reponse brute du service (encapsuler ou pas) + // avant de l'envoyer au parser du composant... + if (self.options.protocol === "JSONP") { + self.logger.trace("Response JSON", response); + if (response) { + if (response.http) { + // reponse encapsulée : + // ex. reponse du service en xml + // > {http : {status:200, error:null},xml :'réponse du service'} + 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; // par defaut ! + if (self.options.rawResponse) { + content = response; + } + } + } else { + // reponse non encapsulée : + // ex. reponse du service en json ou xml + content = response; + } + } else { + error.call(self, new ErrorService("Le contenu de la reponse est vide !?")); + return; + } + } + + // si on souhaite parser la reponse du service + if (typeof self.options.onBeforeParse === "function") { + var newResponse = self.options.onBeforeParse(content); + if (typeof newResponse === "string") { + // la reponse parsée par l'utilisateur est retournée sous + // forme de string ! + content = newResponse; + } + } + // sauvegarde de la reponse dans l'objet parent (CommonService) + self.response = content; + // on renvoie la reponse... + success.call(self, content); + }, + // callback des erreurs + onFailure : function (e) { + self.logger.trace("callService::onFailure()"); + // on est forcement sur une erreur levée par un service ! + e.type = ErrorService.TYPE_SRVERR; + error.call(self, new ErrorService(e)); + }, + // callback de timeOut + onTimeOut : function () { + self.logger.trace("callService::onTimeOut()"); + error.call(self, new ErrorService("TimeOut!")); + } + }; + + Protocol.send(options); + }, + + /** + * Analyse de la réponse + * @param {Function} error - callback + * @param {Function} success - callback + */ + analyzeResponse : function (error, success) { + // INFO + this.logger.error("overwritten method !"); + // retourne l'objet spécifique au type de composant (json) + if (error) { + error.call(this, "This method must be overwritten !"); + } + success.call(this, "This method must be overwritten !"); + } + +}; + +export default CommonService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js new file mode 100644 index 00000000..9f58c29b --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/Config.js @@ -0,0 +1,310 @@ +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import ConfigInterface from "./ConfigInterface"; + +/** + * @classdesc + * + * Recupération de la configuration de clés Géoportail sous forme de JSON + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Config + * @param {Object} options - options spécifiques au service (+ les options heritées) + * @param {Sting} options.apiKey - clé(s) dont on veut obtenir la configuration. Si plusieurs clés, séparer chacune par une virgule + * @param {Boolean} [options.sync=false] - force le mode synchrone + * @param {String} options.customConfigFile - chemin vers un fichier de configuration personnalisé. Surcharge le paramètre apiKey. + * + * @example + * var options = { + * apiKey : "cartes,ortho", + * sync : false, + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * }; + * + */ +function Config (options) { + if (!(this instanceof Config)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Config")); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "Config"; + + this.logger = Logger.getLogger("Gp.Config"); + this.logger.trace("[Constructeur Config (options)]"); + + // ##################### + // analyse des options + // ##################### + + // gestion du callback onSuccess + var bOnSuccess = !!(options.onSuccess !== null && typeof options.onSuccess === "function"); + if (!bOnSuccess) { + throw new Error(_.getMessage("PARAM_MISSING", "onSuccess()")); + } + if (!options.apiKey && !options.customConfigFile) { + // si pas de thème spécifié, on récupère toutes les ressources possibles dans l'objet Config + options.apiKey = "full"; + } + this.options = {}; + this.options.onSuccess = options.onSuccess; + this.options.onFailure = options.onFailure; + + // mode sync + this.options.sync = options.sync || false; + + // gestion d'un tableau d'url des fichiers de configuration + this.options.listConfigUrls = (options.customConfigFile) + ? [options.customConfigFile] + : !Array.isArray(options.apiKey) + ? DefaultUrlService.Config.url(options.apiKey.split(",")) + : DefaultUrlService.Config.url(options.apiKey); +} + +/** + * @lends module:Config# + */ +Config.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/** + * Constructeur (alias) + */ +Config.prototype.constructor = Config; + +/** + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.buildRequest = function (error, success) { + // liste des urls des fichiers de configuration en JSON + this.listConfigUrls = this.options.listConfigUrls; + + if (!this.listConfigUrls) { + error.call(this, new Error("url by default not found !")); + return; + } + + // INFO : + // il n'y a pas de construction de requête, + // on passe directement à l'appel des requêtes + success.call(this, this.listConfigUrls); +}; + +/** + * Récupération des configuration + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.callService = function (error, success) { + if (this.options.sync) { + __callServiceSync.call(this, error, success); + } else { + __callService.call(this, error, success); + } +}; + +/** + * Requêtes en mode asynchrone + * + * @param {*} error + * @param {*} success + * @private + */ +var __callService = function (error, success) { + // liste des resultats au format JSON + this.listConfigResults = []; + + // test on env. nodejs or browser + let Fetch = null; + if (typeof window === "undefined") { + var nodefetch = require("node-fetch"); + Fetch = nodefetch; + } else { + Fetch = window.fetch; + } + + // the factory of fetch ! + var fetchFactory = (url) => { + return Fetch(url, { credentials : "same-origin" }) + .then((response) => { + if (response.ok) { + return response.json() + .then((json) => { + // TODO : + // tester le contenu ! + return json; + }) + .catch((error) => { + throw new Error("Exception Json : " + error); + }); + } else { + throw new Error("Exception HTTP : " + response.status + " (status code) !"); + } + }) + .catch((error) => { + return new Promise((resolve, reject) => { + // eslint-disable-line no-unused-vars + reject(error); + }); + }); + }; + + // construction des promises fetch + var promises = []; + for (let index = 0; index < this.listConfigUrls.length; index++) { + const url = this.listConfigUrls[index]; + promises.push(fetchFactory(url)); + } + + Promise.all(promises) + .then((results) => { + if (!results) { + throw new Error("results config empty !?"); + } + results.forEach((result) => { + // TODO : + // verification des resultats + this.listConfigResults.push(result); + }); + }) + .then(() => { + success.call(this, this.listConfigResults); + }) + .catch((e) => { + // TODO : + // construction d'un message + error.call(this, e); + }); +}; + +/** + * Requêtes en mode synchrone + * + * @param {*} error + * @param {*} success + * @private + */ +var __callServiceSync = function (error, success) { + // liste des resultats au format JSON + this.listConfigResults = []; + + // FIXME : + // boucle synchrone ! + for (var i = 0; i < this.listConfigUrls.length; i++) { + const url = this.listConfigUrls[i]; + // TODO : + // prévoir le CORS, headers, ... + const request = new XMLHttpRequest(); + request.open("GET", url, false); + request.send(null); + if (request.status === 200) { + // TODO : + // tester la reponse ! + var response = JSON.parse(request.responseText); + this.listConfigResults.push(response); + } + } + // callback + if (this.listConfigResults.length !== 0) { + success.call(this, this.listConfigResults); + } else { + error.call(this, new Error("...")); + } +}; + +/** + * Analyse et mise en forme de la réponse en fusionnant les configurations + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + * @overload + */ +Config.prototype.analyzeResponse = function (error, success) { + // fonction de merge des objects JSON + var mergeConfig = function (objects) { + // objet fusion des couches + var allLayersConfig = {}; + // objet fusion des clés + var allKeysConfig = {}; + // objet fusion des TMS + var allTMSConfig = {}; + + // on fusionne les résultat + for (var i = 0; i < objects.length; i++) { + if (!objects[i].generalOptions || !objects[i].layers) { + return; + } + allKeysConfig = { + ...allKeysConfig, + ...objects[i].generalOptions.apiKeys + }; + allLayersConfig = { + ...allLayersConfig, + ...objects[i].layers + }; + allTMSConfig = { + ...allTMSConfig, + ...objects[i].tileMatrixSets + }; + } + + var mergedConfig = { + generalOptions : { + apiKeys : allKeysConfig + }, + layers : allLayersConfig, + tileMatrixSets : allTMSConfig + }; + return mergedConfig; + }; + + // fusion des configurations JSON + var ConfigJSON = mergeConfig(this.listConfigResults); + if (!ConfigJSON) { + error.call(this, new Error("configuration structure not conforme !")); + return; + } + + // creation des interfaces + var IConfig = new ConfigInterface(); + // ajout des interfaces avec la configuration JSON + Object.assign(IConfig, ConfigJSON); + + // définition de la variable globale Gp.Config + var scope = typeof window !== "undefined" ? window : {}; + if (!scope.Gp) { + scope.Gp = {}; + } + + // enregistrement + if (scope.Gp.Config) { + Object.assign(scope.Gp.Config, IConfig); + // dans le doute..., ceinture et bretelles ! + for (var property in IConfig) { + scope.Gp.Config[property] = IConfig[property]; + } + } else { + scope.Gp.Config = IConfig; + } + + // INFO : + // il n'y a pas d'analyse des résultats, + // on passe directement à l'appel de la callback utilisateur + success.call(this, scope.Gp.Config); +}; + +export default Config; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js new file mode 100644 index 00000000..0d245e64 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Config/ConfigInterface.js @@ -0,0 +1,319 @@ + +/** + * Response object for {@link module:Services~getConfig Gp.Services.getConfig ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Object} generalOptions - General properties for default map configuration resources. + * @property {Object} generalOptions.apiKeys - Object that associates apiKey (s) with an array of resources IDs availables with that key. + * @property {String} generalOptions.title - Underlying web service Title. + * @property {String} generalOptions.defaultGMLGFIStyle - XSL URL used by default to translate an XML GetFeatureInfo response into an HTML array. + * @property {String} generalOptions.theme - default theme (FIXME : for what ?) + * @property {Array.} generalOptions.wgs84Resolutions - geographical resolutions Array for each [zoom level of the Geoportal platform]{@link http://api.ign.fr/tech-docs-js/webmaster/layers.html#Geoportal_resolutions} from 0 to 21. Expressed in degrees/pixel. + * @property {Object} layers - Associative array mapping resources availables IDs (keys) with their properties (values given as {@link Gp.Services.Config.Layer}). + * @property {Object} tileMatrixSets - Associative Array mapping TileMatrixSets IDs (keys) availables with their properties (values given as {@link Gp.Services.Config.TileMatrixSet}). + * + * @namespace + * @alias Gp.Services.GetConfigInterface + */ +function ConfigInterface () { + if (!(this instanceof ConfigInterface)) { + throw new TypeError("ConfigInterface constructor cannot be called as a function."); + } + + this.generalOptions = { + apiKeys : {}, + title : null, + defaultGMLGFIStyle : null, + theme : null, + wgs84Resolutions : [] + }; + + this.layers = {}; + + this.tileMatrixSets = {}; +} + +ConfigInterface.prototype = { + + /* + * Constructor (alias) + */ + constructor : ConfigInterface, + + /** + * Check if config is loaded for a given key + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Boolean} isKeyConfLoaded - true if config of the key is already loaded, false otherwise + */ + isKeyConfLoaded : function (apiKey) { + if (!apiKey) { + return; + } + if (this.generalOptions.apiKeys[apiKey]) { + return true; + } + return false; + }, + + /** + * Returns an array of Geoportal layers identifiers, corresponding to an API contract key. + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Array} apiKeys - Array of geoportal layers identifiers + */ + getLayersId : function (apiKey) { + return this.generalOptions.apiKeys[apiKey]; + }, + + /** + * Returns the id of a Geoportal layer with its name and its service. + * + * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") + * @param {String} service - name of the service (ex. "WMS" ou "WMTS") + * @returns {String} Id of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS") + */ + getLayerId : function (layerName, service) { + if (!layerName || !service) { + return; + } + var layerId = null; + + // layer + // key : [layerName]$[contexte]:OGC:[service] + // ex : "ORTHOIMAGERY.ORTHOPHOTOS$GEOPORTAIL:OGC:WMTS" + + // service + // key : [layerName]$[contexte];[service] + // ex : PositionOfInterest$OGC:OPENLS;ReverseGeocode + + if (this.layers) { + var layers = this.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.toUpperCase()) { + layerId = key; + break; + } + if (servicePartsLayer[2] === service.toUpperCase()) { + layerId = key; + break; + } + } + } + } + } + } + if (!layerId) { + return; + } + return layerId; + }, + + /** + * Returns an associative array of Geoportal layers configurations, corresponding to an API contract key. + * If no key is specified, all layers from configuration are returned. + * + * @param {String} apiKey - Access key to Geoportal platform + * @returns {Object} layers - Object which properties are layers identifiers. + */ + 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; + }, + + /** + * Returns a geoportal layer configuration, given its identifier + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @return {Object} layer - Layer configuration + */ + getLayerConf : function (layerId) { + if (!this.layers) { + return; + } + return this.layers[layerId]; + }, + + /** + * Get all parameters needed to display a WMS or WMTS layer given its name, its service and its key + * + * @param {String} layerName - name of the layer (ex. "ORTHOIMAGERY.ORTHOPHOTOS") + * @param {String} service - name of the service (ex. "WMS" ou "WMTS") + * @param {String} [apiKey] - Contract API key + * @returns {Object} params - params of the service (WMS or WMTS) for the given layer + * @returns {String} params.url - Url of the service to reach to display the layer + * @returns {String} params.version - Version of the service + * @returns {String} params.styles - Default style of the layer + * @returns {String} params.format - Default format of the layer + * @returns {String} params.projection - Default projection of the layer + * @returns {Number} params.minScale - Min scale denominator of the layer + * @returns {Number} params.maxScale - Max scale denominator of the layer + * @returns {Gp.BBox} params.extent - Extent of the layer, in the projection of the layer + * @returns {Array} params.legends - Array of legends associated to the layer + * @returns {Array} params.title - Name of the layer, readable by a human + * @returns {Array} params.description - Description of the layer + * @returns {String} params.[TMSLink] - Id of the Tile Matrix Set (TMS), in the case of WMTS layer + * @returns {Gp.Point} params.[matrixOrigin] - Originof the tile matrix (top left corner), in the case of WMTS layer + * @returns {Array} params.[nativeResolutions] - Array with the resolution of each level of the tile matrix set, in the case of WMTS layer + * @returns {Array} params.[matrixIds] - Array with the ID of each level of the tile matrix set, in the case of WMTS layer + */ + getLayerParams : function (layerName, service) { + var params = {}; + + if ((service === "WMS" || Object.keys(this.tileMatrixSets).length !== 0) && Object.keys(this.layers).length !== 0) { + // get the layerId of the layer + var layerId = this.getLayerId(layerName, service); + + if (layerId) { + // get the layer Conf Object + var layerConf = this.getLayerConf(layerId); + + var keys = this.getLayerKey(layerId); + if (keys.length === 0) { + return; + } + + // get services params + for (var i = 0; i < keys.length; i++) { + // only one serverUrl is saved in Gp.Config : with multiKeys, we have to retrieve the key used in the serverUrl property + if (layerConf.serviceParams.serverUrl[keys[i]]) { + params.url = layerConf.serviceParams.serverUrl[keys[i]]; + } + } + + const wmsTypeRegex = /\/v\//; + // WMS vector style always empty (not in getCap) + if (wmsTypeRegex.test(params.url)) { + params.styles = " "; + } else { + // WMS raster style is defined in getCap + params.styles = layerConf.styles[0].name; + } + + params.version = layerConf.serviceParams.version; + params.format = layerConf.formats[0].name; + params.projection = layerConf.defaultProjection; + + // get layer info and constraints + params.minScale = layerConf.globalConstraint.minScaleDenominator; + params.maxScale = layerConf.globalConstraint.maxScaleDenominator; + params.extent = layerConf.globalConstraint.bbox; + params.legends = layerConf.legends; + params.title = layerConf.title; + params.description = layerConf.description; + + if (service === "WMS") { + params.metadata = layerConf.metadata; + } + + // Informations non disponibles avec les getCap + // params.metadata = layerConf.getMetadata(); + // params.originators = layerConf.getOriginators(); + // params.quicklookUrl = layerConf.getQuicklookUrl(); + + // WMTS : get the tileMatrixSetLimits + if (layerConf.wmtsOptions) { + params.tileMatrixSetLimits = layerConf.wmtsOptions.tileMatrixSetLimits; + var TMSLink = layerConf.wmtsOptions.tileMatrixSetLink; + if (TMSLink) { + params.TMSLink = TMSLink; + var tmsConf = this.getTMSConf(TMSLink); + // Get matrix origin : Gp.Point = Object{x:Float, y:Float} + // params.matrixOrigin = tmsConf.getTopLeftCorner(); + params.matrixIds = Object.keys(tmsConf.tileMatrices); + params.tileMatrices = tmsConf.tileMatrices; + // by default, pseudo mercator resolutions + params.nativeResolutions = tmsConf.nativeResolutions || this.getTMSConf("PM").nativeResolutions; + } + } + } + } + return params; + }, + + /** + * Get the contract key(s) associated to a given layer. + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @return {Array} layerKey - array of key(s) associated to the given layer + */ + getLayerKey : function (layerId) { + var layerKey = []; + if (this.generalOptions && this.generalOptions.apiKeys && Object.keys(this.generalOptions.apiKeys).length !== 0) { + var resourcesByKey = this.generalOptions.apiKeys; + for (var key in resourcesByKey) { + var resourcesArray = resourcesByKey[key]; + resourcesArray.forEach(function (arrayLayerId) { + if (arrayLayerId === layerId) { + layerKey.push(key); + } + }); + } + } + return layerKey; + }, + + /** + * Returns an associative array of Tile Matrix Sets configurations. + * + * @return {Object} tileMatrixSets - Object which properties are TMS identifiers + * + */ + getTileMatrixSets : function () { + return this.tileMatrixSets; + }, + + /** + * Returns a Tile Matrix Sets configuration, given its identifier. + * + * @param {String} tmsID - Tile Matrix Set identifier (e.g. : "PM") + * @return {Object} tileMatrixSet - Tile Matrix Set configuration + */ + getTMSConf : function (tmsID) { + if (!this.tileMatrixSets) { + return; + } + return this.tileMatrixSets[tmsID]; + }, + + /** + * Get global constraints for a given Layer : extent, minScale, maxScale, projection + * + * @param {String} layerId - Geoportal layer identifier (e.g. "GEOGRAPHICALGRIDSYSTEMS.MAPS$GEOPORTAIL:OGC:WMTS") + * @returns {Object} params - layer constraints + * @returns {String} params.projection - default layer projection + * @returns {Number} params.minScale - layer min scale denominator + * @returns {Number} params.maxScale - layer max scale denominator + * @returns {Gp.BBox} params.extent - layer extent expressed in the layer projection + */ + getGlobalConstraints : function (layerId) { + var params = {}; + + if (layerId) { + // get layer configuration object + var layerConf = this.getLayerConf(layerId); + params.projection = layerConf.defaultProjection; + params.minScale = layerConf.globalConstraint.minScaleDenominator; + params.maxScale = layerConf.globalConstraint.maxScaleDenominator; + params.extent = layerConf.globalConstraint.bbox; + } + + return params; + } + +}; + +export default ConfigInterface; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js new file mode 100644 index 00000000..5d7af509 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/DefaultUrlService.js @@ -0,0 +1,295 @@ +// cette classe contient les URLs par defaut des services. +// DefaultUrlService.Alti.url(key)[elevation-json] +// DefaultUrlService.Alti.url(key)[elevation-xml] +// DefaultUrlService.Alti.url(key)[profil-json] +// DefaultUrlService.Alti.url(key)[profil-xml] +// DefaultUrlService.ProcessIsoCurve.url(key) +// DefaultUrlService.AutoComplete.url(key) +// DefaultUrlService.ReverseGeocode.url(key) +// DefaultUrlService.Geocode.url(key) +// DefaultUrlService.Route.url(key) + +// Example : +// +// DefaultUrlService.Alti.url('alti')[elevation-json] +// output {String} -> http://wxs.ign.fr/calcul/alti/rest/elevation.json +// +// DefaultUrlService.Alti.url('calcul') +// output {Object|String} +// -> http://wxs.ign.fr/calcul/alti/rest/elevation.json +// -> http://wxs.ign.fr/calcul/alti/rest/elevation.xml +// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.json +// -> http://wxs.ign.fr/calcul/alti/rest/elevationLine.xml +// +// ssl by default. +// +// Force to not do ssl : +// DefaultUrlService.ssl = false; +// +// DefaultUrlService.AutoComplete.url('calcul') +// output {Object|String} +// -> https://wxs.ign.fr/calcul/ols/apis/completion + +// constantes internes +var HOSTNAME = "wxs.ign.fr"; + +/** + * Default Geoportal web services URLs access. + * + * @namespace + * @alias Gp.Services.DefaultUrl + */ +var DefaultUrlService = { + + /** if set true, require the use of https protocol */ + ssl : true, + + /** + * base url of services (ssl protocol management) + * @param {String} path - path + * @returns {String} url + */ + url : function (path) { + // comportement par défaut => https + // sinon, il est fixé par l'option 'ssl' (false => http) + var _protocol; + if (DefaultUrlService.ssl === false) { + _protocol = "http://"; + } else { + _protocol = "https://"; + } + + return _protocol + HOSTNAME + path; + }, + + /** + * base new-url of services (ssl protocol management) + * @param {String} path - path + * @returns {String} url + */ + newUrl : function (path, hostname) { + // comportement par défaut => https + // sinon, il est fixé par l'option 'ssl' (false => http) + var _protocol; + if (DefaultUrlService.ssl === false) { + _protocol = "http://"; + } else { + _protocol = "https://"; + } + + return _protocol + hostname + path; + }, + + /** + * Elevation web service access + * + * @member {Object} + * @property {Function} url (key) - Returns elevation service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("elevation-json", "elevation-xml", "profil-json" or "profil-xml"). + */ + Alti : { + new_key : { + // rest + "elevation-json" : "/altimetrie/1.0/calcul/alti/rest/elevation.json", + "elevation-xml" : "/altimetrie/1.0/calcul/alti/rest/elevation.xml", + "profil-json" : "/altimetrie/1.0/calcul/alti/rest/elevationLine.json", + "profil-xml" : "/altimetrie/1.0/calcul/alti/rest/elevationLine.xml" + }, + _key : { + // rest + "elevation-json" : "/calcul/alti/rest/elevation.json", + "elevation-xml" : "/calcul/alti/rest/elevation.xml", + "profil-json" : "/calcul/alti/rest/elevationLine.json", + "profil-xml" : "/calcul/alti/rest/elevationLine.xml", + // other + wps : "/alti/wps" + }, + /** + * newurl from geoplateforme service + * @param {String} key - key + * @returns {String} url + */ + newUrl : function () { + }, + /** + * url from wxs service + * @returns {String} url + */ + url : function () { + return { + // rest + "elevation-json" : DefaultUrlService.url(this._key["elevation-json"]), + "elevation-xml" : DefaultUrlService.url(this._key["elevation-xml"]), + "profil-json" : DefaultUrlService.url(this._key["profil-json"]), + "profil-xml" : DefaultUrlService.url(this._key["profil-xml"]) + }; + } + }, + /** + * IsoCurve web service access + * + * @member {Object} + * @property {Function} url (key) - Returns isocurve service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols ("iso-json" or "iso-xml"). + */ + ProcessIsoCurve : { + + new_key : "/itineraire/isochrone", + + _key : "/calcul/geoportail/isochrone/rest/1.0.0/isochrone", + + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl : function () { + }, + + /** + * url from wxs service + * @returns {String} url + */ + url : function () { + return DefaultUrlService.url(this._key); + } + }, + /** + * Config web service access + * + * @member {Object} + * @property {Function} url (key) - Returns config service default urls with or without geoportal access key given as a parameter. + */ + Config : { + _key : "https://raw.githubusercontent.com/IGNF/geoportal-configuration/new-url/dist/", + /** + * url + * @param {String} key - key + * @returns {String} url + */ + url : function (key) { + // key must be an array of one or several keys + if (!Array.isArray(key)) { + key = key.split(","); + } + // not homogeneous with others geoportal services URLs + var url = []; + for (var i = 0; i < key.length; i++) { + url[i] = this._key + key[i] + "Config.json"; + } + return url; + } + }, + /** + * Autocompletion web service access + * + * @member {Object} + * @property {Function} url (key) - Returns autocomplete service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + AutoComplete : { + new_key : "/geocodage/completion", + + _key : "/calcul/geoportail/geocodage/rest/0.1/completion", + + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl : function () { + var NEW_AUTOCOMPLETE_HOSTNAME = "data.geopf.fr"; + + return DefaultUrlService.newUrl(this.new_key, NEW_AUTOCOMPLETE_HOSTNAME); + }, + + /** + * url + * @returns {String} url + */ + url : function (key) { + return DefaultUrlService.url(this._key); + } + }, + /** + * Reverse geocoding web service access + * + * @member {Object} + * @property {Function} url (key) - Returns reverse geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + ReverseGeocode : { + new_key : "/geocodage/reverse", + + _key : "/calcul/geoportail/geocodage/rest/0.1/reverse", + + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl : function () { + var NEW_REVERSE_GEOCODE_HOSTNAME = "data.geopf.fr"; + + return DefaultUrlService.newUrl(this.new_key, NEW_REVERSE_GEOCODE_HOSTNAME); + }, + + /** + * url + * @returns {String} url + */ + url : function () { + return DefaultUrlService.url(this._key); + } + }, + /** + * Geocoding web service access + * + * @member {Object} + * @property {Function} url (key) - Returns geocoding service default urls with or without geoportal access key given as a parameter. The result is a String. + */ + Geocode : { + new_key : "/geocodage/search", + + _key : "/calcul/geoportail/geocodage/rest/0.1/search", + + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl : function () { + var NEW_GEOCODE_HOSTNAME = "data.geopf.fr"; + + return DefaultUrlService.newUrl(this.new_key, NEW_GEOCODE_HOSTNAME); + }, + + /** + * url + * @returns {String} url + */ + url : function () { + return DefaultUrlService.url(this._key); + } + }, + /** + * Routing web service access + * + * @member {Object} + * @property {Function} url (key) - Returns routing service default urls with or without geoportal access key given as a parameter. The result is a javascript object with different urls given used protocols. + */ + Route : { + new_key : "/itineraire/route", + + _key : "/calcul/geoportail/itineraire/rest/1.0.0/route", + + /** + * url from geoplateforme service + * @returns {String} url + */ + newUrl : function () { + }, + + /** + * url from wxs service + * @returns {String} url + */ + url : function () { + return DefaultUrlService.url(this._key); + } + } +}; + +export default DefaultUrlService; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js new file mode 100644 index 00000000..edacb237 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Formats/GeocodeResponseParser.js @@ -0,0 +1,134 @@ +// import Logger from "../../../Utils/LoggerByDefault"; +import MR from "../../../Utils/MessagesResources"; +import ErrSrv from "../../../Exceptions/ErrorService"; +import GeocodeResponse from "../Response/model/GeocodeResponse"; +import GeocodedLocation from "../Response/model/GeocodedLocation"; + +/** + * Fonction retournant un objet contenant des clés de lecture (readers) + * qui permettent de parser des réponses XML du service de géocodage direct du Géoportail + * afin de récupérer les résultats retournés. + * @module GeocodeResponseParser + * @alias Gp.Services.Geocode.Formats.GeocodeResponseParser + * @private + */ + +/** + * @classdesc + * + * Classe permettant de parser une réponse GeoJSON + * + * @constructor + * @alias Gp.Formats.GeocodeResponseParser + * + * @private + */ +function GeocodeResponseParser () { + if (!(this instanceof GeocodeResponseParser)) { + throw new TypeError("GeocodeResponseParser constructor cannot be called as a function."); + } +} + +GeocodeResponseParser.prototype = { + + /** + * @lends module:GeocodeResponseParser + */ + + /* + * Constructeur (alias) + */ + constructor : GeocodeResponseParser, + + /** + * Méthode permettant de lancer la lecture d'une réponse GeoJSON, + * + * @param {String} json - réponse au format GeoJSON + * @return {Object} geocodeResponse|exceptionReport : l'objet contenant les informations de la réponse GeoJSON, + * sous la forme d'un objet GeocodeResponse, ou un objet littéral exceptionReport si le service a renvoyé une exception. + */ + parse : function (json) { + var geocodeResponse = new GeocodeResponse(); + + const obj = JSON.parse(json); + + if (obj.type === "FeatureCollection") { + for (var i = 0; i < obj.features.length; ++i) { + _parseFeature(obj.features[i], geocodeResponse); + } + } else if (obj.type === "Feature") { + _parseFeature(obj, geocodeResponse); + } else if (obj.type === "SERVICE_ERROR") { + return _parseError(obj); + } else { + var mess = MR.getMessage("SERVICE_RESPONSE_ANALYSE", obj.type); + throw new ErrSrv({ + message : mess, + type : ErrSrv.TYPE_UNKERR, + status : 200 + }); + } + + return geocodeResponse; + } +}; + +/** + * Méthode permettant de parser un feature + * + * @private + * + * @param {Object} feature + * @param {Object} geocodeResponse + * + * @memberof GeocodeResponseParser + * @return {Object} objet GeocodedLocation + */ +function _parseFeature (feature, geocodeResponse) { + var location = new GeocodedLocation(); + if (feature.geometry && feature.geometry.type === "Point") { + location.position = { + lon : feature.geometry.coordinates[0], + lat : feature.geometry.coordinates[1] + }; + } + if (feature.properties) { + for (var prop in feature.properties) { + if (prop === "_score") { + location.accuracy = feature.properties[prop]; + } else if (prop === "_type") { + if (feature.properties[prop] === "address") { + location.type = "StreetAddress"; + } else if (feature.properties[prop] === "poi") { + location.type = "PositionOfInterest"; + } else if (feature.properties[prop] === "parcel") { + location.type = "CadastralParcel"; + } + } else { + location.placeAttributes[prop] = feature.properties[prop]; + } + } + if (feature.properties._type === "address") { + location.matchType = feature.properties.number !== undefined && feature.properties.number !== null ? "street number" : "street"; + } + } + geocodeResponse.locations.push(location); +} + +/** + * Méthode permettant de parser une erreur + * + * @private + * + * @param {Object} error + * + * @memberof GeocodeResponseParser + * @return {Object} + */ +function _parseError (error) { + return { + exceptionReport : error + }; +} + +export default GeocodeResponseParser; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js new file mode 100644 index 00000000..9ba48dfd --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Geocode.js @@ -0,0 +1,281 @@ +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import ErrorService from "../../Exceptions/ErrorService"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import GeocodeRequestFactory from "./Request/GeocodeRequestFactory"; +import GeocodeResponseFactory from "./Response/GeocodeResponseFactory"; + +/** + * @classdesc + * Appel du service de géocodage direct du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * + * + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.Geocode + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String|Object} options.query - Nom de l'adresse, du toponyme, de l'unité administrative ou de la parcelle cadastrale recherchée. + * + * @param {Object} [options.filters] - Les propriétés possibles de cet objet sont décrites ci-après. + * @param {String} [options.filters.[prop]] - Critère supplémentaire pour filtrer la recherche sous la forme + * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. + * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : + * "postalCode", "inseeCode", "city". + * Il permet également de filtrer les toponymes avec les propriétés : + * "postalCode", "inseeCode", "type". + * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : + * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * + * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. + * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' + * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. + * L'index 'location' regroupe les indexes 'StreetAddress' et 'PositionOfInterest'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, index = 'StreetAddress'. + * + * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. + * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. + * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. + * + * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. + * Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20. + * + * @param {Boolean} [options.returnTrueGeometry = false] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. + * false par défaut. + * + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * proxyURL : null, + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * position : {lon:, lat:}, + * index : 'StreetAddress', + * query : '10 rue du pont Machin-ville' + * (...) + * }; + */ +function Geocode (options_) { + if (!(this instanceof Geocode)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Geocode")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "Geocode"; + + this.logger = Logger.getLogger("Gp.Services.Geocode"); + this.logger.trace("[Constructeur Geocode (options)]"); + + var options = this.patchOptionConvertor(options_); + if (!options.serverUrl) { + options.serverUrl = DefaultUrlService.Geocode.newUrl(); + if (options.oldGeocodeService) { + options.serverUrl = DefaultUrlService.Geocode.url(); + } + } + + // appel du constructeur par heritage + CommonService.apply(this, [options]); + + if (!options.hasOwnProperty("query")) { + throw new Error(_.getMessage("PARAM_MISSING", "query")); + } + + // ajout des options spécifiques au service + this.options.query = options.query; + + // on definit l'index par defaut + if (!options.index) { + this.options.index = options.index = "StreetAddress"; + } + + if (options.filters) { + var filter = Object.keys(options.filters); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + // on supprime les filtres vides + if (typeof options.filters[key] === "undefined" || + (typeof options.filters[key] === "object" && Object.keys(options.filters[key]).length === 0) || + (typeof options.filters[key] === "string" && options.filters[key].length === 0) || + (Array.isArray(options.filters[key]) && options.filters[key].length === 0) + ) { + delete this.options.filters[key]; + } + } + } + + this.options.index = options.index || "StreetAddress"; + this.options.maximumResponses = options.maximumResponses || 20; +} + +/** + * @lends module:Geocode# + */ +Geocode.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +Geocode.prototype.constructor = Geocode; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +Geocode.prototype.patchOptionConvertor = function (options_) { + const options = options_; + + if (options.hasOwnProperty("location")) { + this.logger.warn("The parameter 'location' is deprecated"); + + if (!options.query) { + options.query = options.location; + } + delete options.location; + } + + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + + if (!options.filters) { + options.filters = options.filterOptions; + + if (options.filters.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.index) { + if (Array.isArray(options.filters.type) && options.filters.type.length > 0) { + options.index = options.filters.type[0]; + } else { + options.index = options.filters.type; + } + } + delete options.filters.type; + } + + if (options.filters.bbox) { + this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); + delete options.filters.bbox; + } + } + delete options.filterOptions; + } + + if (options.position) { + if (options.position.x) { + this.logger.warn("The parameter 'position.x' is deprecated"); + + if (!options.position.lon) { + options.position.lon = options.position.x; + } + delete options.position.x; + } + + if (options.position.y) { + this.logger.warn("The parameter 'position.y' is deprecated"); + + if (!options.position.lat) { + options.position.lat = options.position.y; + } + delete options.position.y; + } + } + + if (options.returnFreeForm) { + this.logger.warn("The parameter 'returnFreeForm' is deprecated"); + delete options.returnFreeForm; + } + + if (options.srs) { + this.logger.warn("The parameter 'srs' is deprecated"); + delete options.srs; + } + + return options; +}; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Geocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod : this.options.httpMethod, + // options specifiques du service + geocodeMethod : "search", + query : this.options.query, + index : this.options.index, + returnTrueGeometry : this.options.returnTrueGeometry, + position : this.options.position, + maxResp : this.options.maximumResponses, + filters : this.options.filters + }; + + this.request = GeocodeRequestFactory.build(options); + + // on teste si la requete a bien été construite ! + (!this.request) + ? error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))) + : success.call(this, this.request); +}; + +/** + * Analyse de la reponse (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Geocode.prototype.analyzeResponse = function (error, success) { + /* INFO : + Etape 1 : Création de la requête (URL) + -> stockage de la requête dans this.request + Etape 2 : Envoi de la requête + -> appel du protocol XHR, et envoi (par ex send ()) + -> récupération de la réponse JSON dans la fonction onSuccess () (this.response) + -> si code HTTP 200 et pas de message d'erreur : etape 3 + -> si code HTTP != 200 : lancement de la fonction de callback onFailure avec le message d'erreur + Etape 3 : Analyse de la réponse JSON (si rawResponse === false ) + -> appel du parser pour récupérer le document + Etape 4 : Lancement de la fonction de callback onSuccess avec la réponse : + -> JSON (si rawResponse === true) + -> ou geocodedLocations + */ + + if (this.response) { + var options = { + response : this.response, + rawResponse : this.options.rawResponse, + onError : error, + onSuccess : success, + scope : this + }; + + GeocodeResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; + +export default Geocode; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js new file mode 100644 index 00000000..3d9a70c8 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeLocation.js @@ -0,0 +1,48 @@ + +/** + * @classdesc + * + * Liste des attributs des tables de geocodage + * @constructor + * @alias Gp.Services.Geocode.Request.GeocodeLocation + * @private + */ +function GeocodeLocation () { + if (!(this instanceof GeocodeLocation)) { + throw new TypeError("GeocodeLocation constructor cannot be called as a function."); + } + + /** + * Objet qui peut prendre comme propriétés les valeurs du tableau serviceAttributes + * @type {Object} + */ + this.placeAttributes = {}; + + /** + * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation. + * Ces attributs correspondent à ceux saisis par l'utilisateur (légèrement différents de ceux du service) + * @type {String[]} + */ + this.attributesList = []; + + /** + * Tableau qui liste les attributs spécifiques selon le type de la GeocodeLocation + * Ces attributs correspondent à ceux interprétés par le service (balises Place). + * @type {String[]} + */ + this.serviceAttributes = []; +} + +/** + * @lends module:GeocodeLocation + */ +GeocodeLocation.prototype = { + + /** + * Constructeur (alias) + */ + constructor : GeocodeLocation + +}; + +export default GeocodeLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js new file mode 100644 index 00000000..1c8812bf --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestFactory.js @@ -0,0 +1,54 @@ +import Logger from "../../../Utils/LoggerByDefault"; +import GeocodeRequestREST from "./GeocodeRequestREST"; + +/** + * Creation d'une requête + * (Factory) + * + * @module GeocodeRequestFactory + * @alias Gp.Services.Geocode.Request.GeocodeRequestFactory + * @private + */ +var GeocodeRequestFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Geocode + * + * @example + * var options = { + * // options specifiques du service + * geocodeMethod: + * query: + * filters: + * maximumResponses: + * }; + * var result = GeocodeRequestFactory.build(options); + * if (!result) { + * // error... + * } + * @returns {String} request + */ + build : function (options) { + // logger + var logger = Logger.getLogger("GeocodeRequestFactory"); + logger.trace(["GeocodeRequestFactory::build()"]); + + var settings = options || {}; + + var myReq = new GeocodeRequestREST(settings); + if (!myReq.processRequestString()) { + throw new Error("Error process request (rest) !"); + } + var request = myReq.requestString; + + logger.trace(request); + + return request; + } +}; + +export default GeocodeRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js new file mode 100644 index 00000000..8ad68db0 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/GeocodeRequestREST.js @@ -0,0 +1,87 @@ + +import Logger from "../../../Utils/LoggerByDefault"; +import _ from "../../../Utils/MessagesResources"; +import GeocodeParamREST from "./model/GeocodeParamREST"; + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire + * (uniquement en GET) + * + * @constructor + * @alias Gp.Services.Geocode.Request.GeocodeRequestREST + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * (...) + * }; + * + * @private + */ +function GeocodeRequestREST (options) { + this.logger = Logger.getLogger("GeocodeRequestREST"); + this.logger.trace("[Constructeur GeocodeRequestREST ()]"); + + if (!(this instanceof GeocodeRequestREST)) { + throw new TypeError("GeocodeRequestREST constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_.getMessage("PARAM_EMPTY", "options")); + } + + /** liste des options */ + this.settings = options; +} + +GeocodeRequestREST.prototype = { + + /** + * @lends module:GeocodeRequestREST# + */ + + /** + * request + * @type {String} + */ + requestString : null, + + /** + * Constructeur (alias) + */ + constructor : GeocodeRequestREST, + + /** + * Construction de la requête. + * + * @returns {String} request + */ + processRequestString : function () { + var request = ""; + + // Mapping des options avec le service de l'API REST + const oParams = new GeocodeParamREST(this.settings); + + const params = oParams.getParams(); + for (var i = 0; i < params.length; i++) { + var o = params[i]; + if (request) { + request += "&"; + } + request += o.k + "=" + o.v; + } + + if (!this.settings.geocodeMethod || (this.settings.geocodeMethod !== "search" && this.settings.geocodeMethod !== "reverse")) { + throw new Error("Error geocodeMethod not valid"); + } + + this.requestString = "?" + request; + this.logger.trace(this.requestString); + + return this.requestString; + } +}; + +export default GeocodeRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js new file mode 100644 index 00000000..06396fd8 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/CadastralParcel.js @@ -0,0 +1,60 @@ + +import GeocodeLocation from "../GeocodeLocation"; + +/** + * @classdesc + * Format des attributs d'un filtre de géocodage de type CadastralParcel. + * + * @constructor + * @alias Gp.Services.Geocode.Request.CadastralParcel + * @private + */ +function CadastralParcel () { + if (!(this instanceof CadastralParcel)) { + throw new TypeError("CadastralParcel constructor cannot be called as a function."); + } + + // INFO + // appel du constructeur de la classe mère + // avec passage de param. + GeocodeLocation.apply(this, arguments); + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "CadastralParcel"; + + /** + * Liste des attributs possibles pour une GeocodeLocation de type CadastralParcel + * - **absorbedCity** : Code commune absorbée de la parcelle : + * lorsqu'une parcelle est issue p d'une ancienne commune qui a fusionné avec une autre. + * Sinon, le code vaut '000'. *{String}* + * - **sheet** : Feuille de la parcelle (ex 1). *{String}* + * - **number** : Numéro de la parcelle (ex. 0041) *{String}* + * - **section** : Section de la parcelle (ex 0D). *{String}* + * - **commune** : Ville du filtre. *{String}* + * - **department** : Département du filtre. *{String}* + * - **insee** : Code INSEE du filtre. *{Number}* + * - **municipality** : Municipalité du filtre. *{String}* + * - **origin** : L'origine de l'objet parcellaire renvoyé + * (correspond à l'attribut "type" dans la réponse XML) + * Pour plus d'informations : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html#Recherche_par_parcelles_cadastrales *{Number}* + * + */ + + this.attributesList = ["absorbedCity", "sheet", "number", "section", "commune", "department", "insee", "municipality", "origin"]; + + this.serviceAttributes = ["CommuneAbsorbee", "Feuille", "Numero", "Section", "Commune", "Departement", "INSEE", "Municipality", "Type"]; +} + +/** + * @lends module:CadastralParcel# + */ +CadastralParcel.prototype = Object.create(GeocodeLocation.prototype); + +/** + * Constructeur (alias) + */ +CadastralParcel.prototype.constructor = CadastralParcel; + +export default CadastralParcel; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js new file mode 100644 index 00000000..15a8e5fe --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/GeocodeParamREST.js @@ -0,0 +1,175 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). + * Permet le mapping avec les options du service. + * @constructor + * @alias Gp.Services.Route.Request.RouteParamREST + * @param {Object} options - options + * + * @private + */ +function GeocodeParamREST (options) { + if (!(this instanceof GeocodeParamREST)) { + throw new TypeError("GeocodeParamREST constructor cannot be called as a function."); + } + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur GeocodeParamREST ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // methode de geocodage + if (!this.options.geocodeMethod || (this.options.geocodeMethod !== "search" && this.options.geocodeMethod !== "reverse")) { + throw new Error("Error geocodeMethod not valid"); + } + this.geocodeMethod = this.options.geocodeMethod; + + // mapping des options avec l'API REST + this.query = (typeof this.options !== "undefined") ? this.options.query : null; + + this.searchGeometry = this.options.searchGeometry || null; + + this.index = this.options.index || null; + + this.lon = this.options.position && this.options.position.lon ? this.options.position.lon : null; + + this.lat = this.options.position && this.options.position.lat ? this.options.position.lat : null; + + this.maxResp = this.options.maxResp || null; + + this.returnTrueGeometry = this.options.returnTrueGeometry || null; + + this.filters = this.options.filters || {}; +} + +/** + * CLASSNAME + */ +GeocodeParamREST.CLASSNAME = "GeocodeParamREST"; + +GeocodeParamREST.prototype = { + + /** + * @lends module:GeocodeParamREST# + */ + + /** + * Constructeur (alias) + */ + constructor : GeocodeParamREST, + + /** + * Retourne les filtres + * @returns {String} les filtres + */ + getFilters : function () { + var filters = {}; + for (var prop in this.filters) { + if (this.filters.hasOwnProperty(prop)) { + filters[prop] = this.filters[prop]; + } + } + return filters; + }, + + /** + * Retourne l'index + * @returns {String} l'index + */ + getIndex : function () { + if (this.index === undefined) { + return null; + } + if (this.index === "StreetAddress") { + return "address"; + } else if (this.index === "CadastralParcel") { + return "parcel"; + } else if (this.index === "PositionOfInterest") { + return "poi"; + } else if (this.index === "location") { + return "location"; + } + return this.index; + }, + + /** + * Retourne la géométrie de recherche + * @returns {String} la géométrie de recherche au format json + */ + getSearchGeometry : function () { + return JSON.stringify(this.searchGeometry); + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} liste de paramêtres + */ +GeocodeParamREST.prototype.getParams = function () { + var map = []; + + if (this.geocodeMethod === "search") { + map.push({ + k : "q", + v : this.query + }); + } + + if (this.index) { + map.push({ + k : "index", + v : this.getIndex() + }); + } + + if (this.geocodeMethod === "reverse" && this.searchGeometry) { + map.push({ + k : "searchgeom", + v : this.getSearchGeometry() + }); + } + + if (this.lon && this.lat) { + map.push({ + k : "lon", + v : this.lon + }); + map.push({ + k : "lat", + v : this.lat + }); + } + + if (this.maxResp) { + map.push({ + k : "limit", + v : this.maxResp + }); + } + + if (this.returnTrueGeometry) { + map.push({ + k : "returntruegeometry", + v : this.returnTrueGeometry + }); + } + + const filters = this.getFilters(); + for (var key in filters) { + map.push({ + k : key, + v : filters[key] + }); + } + + return map; +}; + +export default GeocodeParamREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js new file mode 100644 index 00000000..56fea859 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/PositionOfInterest.js @@ -0,0 +1,55 @@ + +import GeocodeLocation from "../GeocodeLocation"; + +/** + * @classdesc + * Format des attributs d'un résultat de géocodage de type PositionOfInterest + * + * @constructor + * @alias Gp.Services.Geocode.Request.PositionOfInterest + * @private + */ +function PositionOfInterest () { + if (!(this instanceof PositionOfInterest)) { + throw new TypeError("PositionOfInterest constructor cannot be called as a function."); + } + + // INFO + // appel du constructeur de la classe mère + // avec passage de param. + GeocodeLocation.apply(this, arguments); + + /** + * Nom de la classe (heritage) + * @type {String} + */ + this.CLASSNAME = "PositionOfInterest"; + + /** + * Liste des attributs possibles pour une GeocodeLocation de type PositionOfInterest + * - **bbox** : Emprise du toponyme dans le système de coordonnées demandé {left, right, top, bottom} *{Object}* + * - **importance** : Importance du toponyme *{number}* + * - **nature** : Nature du toponyme. *{String}* + * - **territory** : Code du territoire français où se situe le toponyme *{String}* + * - **commune** : Ville du toponyme. *{String}* + * - **department** : Département du toponyme. *{String}* + * - **insee** : Code INSEE de la commune où se situe le toponyme. *{Number}* + * - **municipality** : Municipalité du toponyme. *{String}* + */ + + this.attributesList = ["bbox", "importance", "nature", "territory", "commune", "department", "insee", "municipality"]; + + this.serviceAttributes = ["bbox", "Importance", "Nature", "Territoire", "Commune", "Departement", "INSEE", "Municipality"]; +} + +/** + * @lends module:PositionOfInterest# + */ +PositionOfInterest.prototype = Object.create(GeocodeLocation.prototype); + +/** + * Constructeur (alias) + */ +PositionOfInterest.prototype.constructor = PositionOfInterest; + +export default PositionOfInterest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js new file mode 100644 index 00000000..659cf2f5 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Request/model/StreetAddress.js @@ -0,0 +1,56 @@ + +import GeocodeLocation from "../GeocodeLocation"; + +/** + * @classdesc + * Format des attributs d'un résultat de géocodage de type StreetAddress. + * + * @constructor + * @alias Gp.Services.Geocode.Request.StreetAddress + * @private + */ +function StreetAddress () { + if (!(this instanceof StreetAddress)) { + throw new TypeError("StreetAddress constructor cannot be called as a function."); + } + + // INFO + // appel du constructeur de la classe mère + // avec passage de param. + GeocodeLocation.apply(this, arguments); + + /** + * Nom de la classe (heritage) + * @type {String} + */ + this.CLASSNAME = "StreetAddress"; + + /** + * Liste des attributs possibles pour une GeocodeLocation de type StreetAddress + * - **bbox** : Emprise de l'adresse dans le système de coordonnées demandé {left, right, top, bottom}. *{Object}* + * - **ID** : Identifiant BD ADRESSE dans le cas où le résultat est une adresse. *{String}* + * - **IDTR** : Identifiant "Route Adresse" de la voie portant l'adresse dans la base BD ADRESSE. *{String}* + * - **quality** : Indicateur de qualité du géocodage (pour plus d'infos : http://api.ign.fr/tech-docs-js/fr/developpeur/search.html *{String}* + * - **territory** : Code du territoire français où se situe l'adresse *{String}* + * - **commune** : Ville l'adresse. *{String}* + * - **department** : Département l'adresse. *{String}* + * - **insee** : Code INSEE de l'adresse. *{Number}* + * - **municipality** : Municipalité de l'adresse. *{String}* + */ + + this.attributesList = ["bbox", "ID", "IDTR", "quality", "territory", "commune", "department", "insee", "municipality"]; + + this.serviceAttributes = ["bbox", "ID", "IDTR", "Qualite", "Territoire", "Commune", "Departement", "INSEE", "Municipality"]; +} + +/** + * @lends module:StreetAdress# + */ +StreetAddress.prototype = Object.create(GeocodeLocation.prototype); + +/** + * Constructeur (alias) + */ +StreetAddress.prototype.constructor = StreetAddress; + +export default StreetAddress; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js new file mode 100644 index 00000000..f8fe47bf --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/GeocodeResponseFactory.js @@ -0,0 +1,86 @@ +/** + * Factory pour générer une reponse JSON à partir d'un XML + * (Factory) + * + * @module GeocodeResponseFactory + * @alias Gp.Services.Geocode.Response.GeocodeResponseFactory + * @private + */ +// import Logger from "../../../Utils/LoggerByDefault"; +import ErrorService from "../../../Exceptions/ErrorService"; +import MRes from "../../../Utils/MessagesResources"; +import GeocodeResponseParser from "../Formats/GeocodeResponseParser"; + +var GeocodeReponseFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Geocode + * + * @example + * var options = { + * response : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build : function (options) { + // data de type GeocodeResponse + var data = null; + + if (options.response) { + if (options.rawResponse) { + data = options.response; + } else { + try { + const parser = new GeocodeResponseParser(); + data = parser.parse(options.response); + + 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; + } + + // Si la réponse contenait une exception renvoyée par le service + if (data.exceptionReport) { + options.onError.call(options.scope, new ErrorService({ + message : MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", data.exceptionReport), + type : ErrorService.TYPE_SRVERR, + status : 200 // FIXME : 200 ? + })); + return; + } + } + } else { + options.onError.call(options.scope, new ErrorService({ + message : MRes.getMessage("SERVICE_RESPONSE_EMPTY"), + type : ErrorService.TYPE_SRVERR, + status : -1 // FIXME : status response + })); + return; + } + + options.onSuccess.call(options.scope, data); + } +}; + +export default GeocodeReponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js new file mode 100644 index 00000000..d79dcfa5 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodeResponse.js @@ -0,0 +1,24 @@ + +/** + * Response object for {@link module:Services~geocode Gp.Services.geocode ()} or {@link module:Services~reverseGeocode Gp.Services.reverseGeocode ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Array.} locations - locations array. + * + * @namespace + * @alias Gp.Services.GeocodeResponse + */ +function GeocodeResponse () { + if (!(this instanceof GeocodeResponse)) { + throw new TypeError("GeocodeResponse constructor cannot be called as a function."); + } + + this.locations = []; +} + +GeocodeResponse.prototype = { + + constructor : GeocodeResponse + +}; + +export default GeocodeResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js new file mode 100644 index 00000000..0803b0cb --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/Response/model/GeocodedLocation.js @@ -0,0 +1,77 @@ + +/** + * Single location object returned by the underlying geocoding web service. + * + * @property {Gp.Point} position - Position of the location given in the requested coordinates system. + * @property {String} type - location type "StreetAddress" (for an address), "PositionOfInterest" (for a place name) or "CadastralParcel" (for cadastral parcel). + * @property {String} matchType - how geocoding is performed : "street number" (exact address), "street enhanced" (street number calculated by interpolation), "street" (only the street), "city" (only the city). + * @property {Float} accuracy - Accuracy of the response towards the requested location between 0 (unaccurate) and 1 (exact match). + * @property {Object} placeAttributes - Associative array matching the following attributes with their values given by the underlying web service : + * + * *Common attributes : * + * + * - **trueGeometry** - the 'real life' geometry if different from 'Point' type. + * + * *if type === "StreetAddress" :* + * + * - **number** - Street number. + * - **postalCode** - PostCode + * - **street** - Street name + * - **city** - City + * - **houseNumberInfos** - additional street number information + * - **inseeCode** - INSEE Code + * + * + * *if type === "PositionOfInterest" :* + * + * - **type** - Place name type + * - **postalCode** - PostCode + * - **toponyme** - Toponyme + * - **extraFields** - additional place name properties + * - **inseeCode** - INSEE Code + * + * + * *si type = "CadastralParcel" :* + * + * - **codeCommuneAbs** - when a parcel comes from a city that was absorbed by another, code of that old city. "000" otherwise. + * - **codeArrondissement** - arrondissement + * - **identifiant** - cadastral parcel code + * - **feuille** - Parcel Sheet (eg. "1"). + * - **numero** - Parcel Number (eg. "0041") + * - **section** - Parcel Section (eg. "0D"). + * - **nomCommune** - Parcel municipality name. + * - **codeCommune** - Parcel municipality. + * - **codeDepartement** - Parcel Department. + * + * @namespace + * @alias Gp.Services.Geocode.GeocodedLocation + */ +function GeocodedLocation () { + if (!(this instanceof GeocodedLocation)) { + throw new TypeError("GeocodedLocation constructor cannot be called as a function."); + } + + this.position = null; + + this.matchType = null; + + this.placeAttributes = {}; + + this.type = null; + + this.accuracy = null; + + /** + * Nom de la classe : "GeocodedLocation" + * @type {String} + */ + this.CLASSNAME = "GeocodedLocation"; +} + +GeocodedLocation.prototype = { + + constructor : GeocodedLocation + +}; + +export default GeocodedLocation; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js new file mode 100644 index 00000000..06e229d8 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Geocode/ReverseGeocode.js @@ -0,0 +1,341 @@ +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import ErrorService from "../../Exceptions/ErrorService"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import GeocodeRequestFactory from "./Request/GeocodeRequestFactory"; +import GeocodeResponseFactory from "./Response/GeocodeResponseFactory"; + +/** + * @classdesc + * Appel du service de géocodage inverse du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.ReverseGeocode + * + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {Object} options.position - Position du point de référence pour le calcul de proximité exprimée dans le système de référence spécifié par le srs. + * @param {Float} options.position.lon - Longitude du point de référence pour le calcul de proximité. + * @param {Float} options.position.lat - Latitude du point de référence pour le calcul de proximité. + * + * @param {Object} [options.filters] - Les propriétés possibles de cet objet. + * @param {String} [options.filters.[proprietes du filtre]] - Critère supplémentaire pour filtrer la recherche sous la forme + * d'un couple clé/valeur à définir selon les possibilités du serveur ajouté à la requête. + * Le service de géocodage du Géoportail permet de filtrer les adresses postales avec les propriétés : + * "postalCode", "inseeCode", "city". + * Il permet également de filtrer les toponymes avec les propriétés : + * "postalCode", "inseeCode", "type". + * Enfin, il permet de filtrer les parcelles cadastrales avec les propriétés : + * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * + * @param {Object} [options.searchGeometry] - Emprise dans laquelle on souhaite effectuer la recherche. + * Les propriétés possibles de cet objet sont décrites ci-après. + * @param {String} options.searchGeometry.type - Type de géometrie (Point|Circle|Linestring|Polygon) + * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordonnées des points constituant la géométrie. + * @param {Float} options.searchGeometry.radius - Rayon. Paramètre applicable uniquement pour le type 'Circle'. + * + * @param {String} [options.index = "StreetAddress"] - Type de l'objet recherché. + * Le service de géocodage du Géoportail permet de rechercher des 'PositionOfInterest' pour des toponymes, des 'StreetAddress' + * pour des adresses postales ou des 'CadastralParcel' pour des parcelles cadastrales. L'index 'location' permet une recherche + * multi-indexes en regroupant les indexes 'PositionOfInterest' et 'StreetAddress'. + * D'autres types pourront être rajoutés selon l'évolution du service. + * Par défaut, index = 'StreetAddress'. + * + * @param {Number} [options.maximumResponses] - Nombre de réponses maximal que l'on souhaite recevoir. + * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 20s. + * + * @param {Boolean} [options.returnTrueGeometry] - Booléen indiquant si l'on souhaite récupérer la géométrie vraie des objects géolocalisés. + * false par défaut. + * + * @example + * var options = { + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * proxyURL : null, + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * index : 'StreetAddress', + * searchGeometry : { + * type : Circle, + * coordinates : [48, 2], + * radius : 100 + * }, + * position : {lon:2 , lat:48.5}, + * maximumResponses : 25, + * }; + * + */ +function ReverseGeocode (options_) { + if (!(this instanceof ReverseGeocode)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "ReverseGeocode")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "ReverseGeocode"; + + this.logger = Logger.getLogger("Gp.Services.ReverseGeocode"); + this.logger.trace("[Constructeur ReverseGeocode (options)]"); + + var options = this.patchOptionConvertor(options_); + if (!options.serverUrl) { + options.serverUrl = DefaultUrlService.ReverseGeocode.newUrl(); + if (options.oldReverseService) { + options.serverUrl = DefaultUrlService.ReverseGeocode.url(); + } + } + + // appel du constructeur par heritage + CommonService.apply(this, [options]); + + if (!options.searchGeometry) { + if (!options.position) { + throw new Error(_.getMessage("PARAM_MISSING", "searchGeometry")); + } + } else { + this.options.searchGeometry = options.searchGeometry; + } + + // on definit l'index par defaut + if (!options.index) { + this.options.index = options.index = "StreetAddress"; + } + + if (options.filters) { + var filter = Object.keys(options.filters); + for (var i = 0; i < filter.length; i++) { + var key = filter[i]; + // on supprime les filtres vides + if (typeof options.filters[key] === "undefined" || + (typeof options.filters[key] === "object" && Object.keys(options.filters[key]).length === 0) || + (typeof options.filters[key] === "string" && options.filters[key].length === 0) || + (Array.isArray(options.filters[key]) && options.filters[key].length === 0) + ) { + delete this.options.filters[key]; + } + } + } + + this.options.position = options.position; + this.options.index = options.index || "StreetAddress"; + this.options.maximumResponses = options.maximumResponses || 20; +} + +/** + * @lends module:ReverseGeocode# + */ +ReverseGeocode.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +ReverseGeocode.prototype.constructor = ReverseGeocode; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} options_ - options du service + * @return {Object} - options + */ +ReverseGeocode.prototype.patchOptionConvertor = function (options_) { + var options = options_; + + if (options.filterOptions) { + this.logger.warn("The parameter 'filterOptions' is deprecated"); + + if (options.filterOptions.type) { + this.logger.warn("The parameter 'filterOptions.type' is deprecated"); + if (!options.index) { + if (Array.isArray(options.filterOptions.type) && options.filterOptions.type.length > 0) { + options.index = options.filterOptions.type[0]; + } else { + options.index = options.filterOptions.type; + } + } + delete options.filterOptions.type; + } + + if (options.filterOptions.bbox) { + this.logger.warn("The parameter 'filterOptions.bbox' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.bbox2Json(options.filterOptions.bbox); + } + delete options.filterOptions.bbox; + } + + if (options.filterOptions.circle) { + this.logger.warn("The parameter 'filterOptions.circle' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.circle2Json(options.filterOptions.circle); + } + delete options.filterOptions.circle; + } + + if (options.filterOptions.polygon) { + this.logger.warn("The parameter 'filterOptions.polygon' is deprecated"); + if (!options.searchGeometry) { + // convertir la geometrie + options.searchGeometry = this.polygon2Json(options.filterOptions.polygon); + } + delete options.filterOptions.polygon; + } + + if (!options.filters && Object.keys(options.filterOptions).length > 0) { + options.filters = options.filterOptions; + } + + delete options.filterOptions; + } + + if (options.position) { + if (options.position.x) { + this.logger.warn("The parameter 'position.x' is deprecated"); + + if (!options.position.lon) { + options.position.lon = options.position.x; + } + delete options.position.x; + } + + if (options.position.y) { + this.logger.warn("The parameter 'position.y' is deprecated"); + + if (!options.position.lat) { + options.position.lat = options.position.y; + } + delete options.position.y; + } + } + + if (options.srs) { + this.logger.warn("The parameter 'srs' is deprecated"); + delete options.srs; + } + + return options; +}; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +ReverseGeocode.prototype.buildRequest = function (error, success) { + var options = { + httpMethod : this.options.httpMethod, + // options specifiques du service + geocodeMethod : "reverse", + searchGeometry : this.options.searchGeometry, + index : this.options.index, + position : this.options.position, + returnTrueGeometry : this.options.returnTrueGeometry, + maxResp : this.options.maximumResponses, + filters : this.options.filters + }; + + this.request = GeocodeRequestFactory.build(options); + + // on teste si la requete a bien été construite ! + (!this.request) + ? error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))) + : success.call(this, this.request); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +ReverseGeocode.prototype.analyzeResponse = function (error, success) { + if (this.response) { + var options = { + response : this.response, + rawResponse : this.options.rawResponse, + onError : error, + onSuccess : success, + scope : this + }; + + GeocodeResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Array} bbox - bbox + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.bbox2Json = function (bbox) { + return { + type : "Polygon", + coordinates : [[ + [bbox.left, bbox.top], + [bbox.right, bbox.top], + [bbox.right, bbox.bottom], + [bbox.left, bbox.bottom], + [bbox.left, bbox.top] + ]] + }; +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Object} circle - circle + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.circle2Json = function (circle) { + return { + type : "Circle", + radius : circle.radius, + coordinates : [circle.x, circle.y] + }; +}; + +/** + * Patch pour la convertion des options vers le nouveau formalisme. + * + * @param {Array} polygon - polygon + * @return {Object} - geometrie au format json + */ +ReverseGeocode.prototype.polygon2Json = function (polygon) { + var jsonGeom = { + type : "Polygon", + coordinates : [[]] + }; + + for (var i = 0; i < polygon.length; ++i) { + jsonGeom.coordinates[0].push([polygon[i].x, polygon[i].y]); + } + + return jsonGeom; +}; + +/** + * Codes EPSG géographiques (lat/lon). Utiles car les coordonnées doivent être inversées. + */ +ReverseGeocode.geoEPSG = ["EPSG:4326"]; + +export default ReverseGeocode; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js new file mode 100644 index 00000000..b5c8ce6d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Formats/ProcessIsoCurveResponseReader.js @@ -0,0 +1,284 @@ +/** + * Analyse de la reponse XML + * + * @module ProcessIsoCurveResponseReader + * @alias Gp.Services.ProcessIsoCurve.Formats.ProcessIsoCurveResponseReader + * @todo not yet implemented ! + * @private + */ + +import MessagesResources from "../../../Utils/MessagesResources"; +import WKT from "../../../Formats/WKT"; +import ErrSrv from "../../../Exceptions/ErrorService"; +import ProcessIsoCurveResponse from "../Response/model/ProcessIsoCurveResponse"; + +/** + * Objet ProcessIsoCurveResponseReader + * + * @member {Object} ProcessIsoCurveResponseReader + * + * @property {Object} ProcessIsoCurveResponseReader.READERS - Objet contenant des fonctions de lecture, appelées "readers" + * dont chaque clé correspond au nom d'un tag du XML que l'on souhaite lire + * et la valeur associée est une fonction (node, data) + * où node est un noeud du document DOM + * et data est un objet où l'on stocke les informations lues dans le XML. + * + * @property {Method} ProcessIsoCurveResponseReader.read - Méthode permettant de lancer la lecture d'une réponse XML + * du service de calcul isochrone/isodistance, à l'aide des readers de la classe. + * + */ + +var ProcessIsoCurveResponseReader = {}; + +/* + // INFO + // Exemple d'erreur du service + // + // + // Location point must have 2 components separated with a , + // ERROR + // + + // + // + // ServiceException : Error in isochron computation Error in smartrouting null + // ERROR + // + + // INFO + // Exemple d'erreur NGinx + // Resource parameter not found +*/ + +/* + // INFO + // Exemple de réponse du service + + // + // OK + // + // -1.557189,47.217122 + // + // 5000 + // POLYGON ((-1.545312 47.178178, -1.545312 47.180418, ...)) + // + + // + // OK + // 1 + // -1.557189,47.217122 + // + // + // POLYGON ((-1.556864 47.216487, -1.556864 47.216948, ...)) + // +*/ + +ProcessIsoCurveResponseReader.READERS = { + + /** TODO : jsdoc block */ + isochronResult : function (root) { + // racine de la réponse XML : on crée l'objet de réponse + 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; + }, + + /** TODO : jsdoc block */ + message : function (node, response) { + if (response) { + response.message = __getChildValue(node); + } + }, + + /** TODO : jsdoc block */ + status : function (node, response) { + var status = __getChildValue(node); + if (status === "ERROR" || status === "error") { + if (response) { + response.status = "error"; + } + } + }, + + /** TODO : jsdoc block */ + id : function (node, response) { + if (response) { + response.id = __getChildValue(node); + } + }, + + /** TODO : jsdoc block */ + 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]); + } + }, + + /** TODO : jsdoc block */ + srs : function (node, response) { + if (response) { + response.srs = __getChildValue(node); + } + }, + + /** TODO : jsdoc block */ + distance : function (node, response) { + if (response) { + response.distance = parseFloat(__getChildValue(node)); + } + }, + + /** TODO : jsdoc block */ + time : function (node, response) { + if (response) { + response.time = parseFloat(__getChildValue(node)); + } + }, + + /** TODO : jsdoc block */ + wktGeometry : function (node, response) { + if (response) { + var wktGeometry = node.innerHTML; + /** TODO : jsdoc block */ + var onWKTSuccess = function (json) { + response.geometry = json; + }; + /** TODO : jsdoc block */ + var onWKTError = function () { + var msg = MessagesResources.getMessage("PARAM_FORMAT", ["wktGeometry"]); + throw new Error(msg); + }; + if (response.hasOwnProperty("geometry")) { + WKT.toJson(wktGeometry, onWKTSuccess, onWKTError); + } + } + }, + + /** TODO : jsdoc block */ + serviceResult : function (node) { + // en cas d'exception du service + 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; + }, + + /** TODO : jsdoc block */ + 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; + }, + + /** TODO : jsdoc block */ + Exception : function (node) { + var exceptionReport = {}; + + // get exception code + var exceptionCode = node.getAttribute("exceptionCode"); + if (exceptionCode) { + exceptionReport.exceptionCode = exceptionCode; + } + + // get exception message + var textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + exceptionReport.exception = textNode.nodeValue; + } + + return exceptionReport; + } +}; + +/** TODO : jsdoc block */ +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 + }); + } +}; + +/** + * Lecture de la valeur du premier child d'un noeud, si elle existe. + * + * @private + * @memberof ProcessIsoCurveResponseReader + * @method __getChildValue + * @param {DOMElement} node - a DOM node + * @return {String} value - valeur du firstChild du noeud en entrée, ou chaîne vide. + */ +function __getChildValue (node) { + var textNode; + var value = ""; + + if (node.hasChildNodes()) { + textNode = node.firstChild; + if (textNode && textNode.nodeType === 3) { // 3 === node.TEXT_NODE + value = textNode.nodeValue; + } + } + return value; +} + +export default ProcessIsoCurveResponseReader; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js new file mode 100644 index 00000000..69ce0e1d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/ProcessIsoCurve.js @@ -0,0 +1,323 @@ + +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import ErrorService from "../../Exceptions/ErrorService"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import ProcessIsoCurveRequest from "./Request/ProcessIsoCurveRequest"; +import ProcessIsoCurveResponseFactory from "./Response/ProcessIsoCurveResponseFactory"; + +/** + * @classdesc + * Appel du service d'isochrone/distance du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * @constructor + * @extends {Gp.Services.CommonService} + * @alias Gp.Services.ProcessIsoCurve + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. + * + * @param {String} options.outputFormat - Le format de la réponse du service iso : 'json' uniquement et par défaut. + * + * @param {Object} options.position - Point de départ du calcul. + * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.position.x - Abcisse du point de départ du calcul d'isochrone/distance. + * @param {Float} options.position.y - Ordonnée du point de départ du calcul d'isochrone/distance. + * + * @param {String} options.srs - Projection. + * Système de coordonnées dans lequel les coordonnées du point « location » sont exprimées et + * dans lequel la géométrie de la courbe résultante sera exprimée. + * Par défaut, le système de coordonnées utilisé sera « EPSG:4326 ». + * + * @param {String} [options.graph = "voiture"] - Nom du graphe à utiliser pour le calcul (« Pieton » ou « Voiture »). + * La valeur par défaut est : «voiture» + * + * @param {Array.} [options.exclusions] - DEPRECATED: Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints. + * Critères d'exclusions à appliquer pour le calcul. + * On précise ici le type de tronçons que l'on ne veut pas que l'isochrone/distance emprunte + * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). + * + * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". + * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". + * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". + * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". + * + * @param {String} [options.method = "time"] - Méthode utilisée pour le calcul de la courbe iso. + * Les valeurs possible sont "time" pour un calcul d'isochrone, "distance" pour un calcul d'isodistance. + * Pas de valeur spécifié équivaut à un calcul d'isochrone. + * + * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse ("m" or "km"). + * + * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse ("standard", "second", "minute", "hour"). Il peut-être formatté hh:mm::ss avec la valeur standard. + * + * @param {Float} options.time - Durée maximum (exprimée en secondes) à utiliser pour le calcul de la courbe à partir du ou jusqu'au point « location ». + * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "time". + * Si l'option method n'est pas renseignée, ce paramètre doit être renseigné. + * + * @param {Float} options.distance - Distance maximum (exprimée en metres) à utiliser pour le calcul de la courbe à partir du ou j'usqu'au point « location ». + * Ce paramètre doit être renseigné si l'option "méthod" a la valeur "DISTANCE". + * Si l'option "method" n'est pas renseignée, ce paramètre sera ignoré. + * + * @param {Boolean} [options.reverse = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. + * Par défaut, la valeur « false » est appliquée. + * + * @param {Boolean} [options.smoothing = false] - Indique si la géométrie résultante doit être lissée (« true ») pour ne pas avoir d'effet d'escalier. + * Par défaut, la valeur « false » est appliquée. + * + * @param {Boolean} [options.holes = false] - Indique si la géométrie résultante (surface) doit être retournée avec des trous (« true »). + * Par défaut, la valeur « false » est appliquée. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'JSONP', // JSONP|XHR + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * position : { + * x : 2.3242664298058053, + * y : 48.86118017324745 + * }, + * distance : 200, + * [time : ] + * method : "distance", + * graph : "voiture", + * reverse : false + * }; + */ + +function ProcessIsoCurve (options) { + if (!(this instanceof ProcessIsoCurve)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "ProcessIsoCurve")); + } + + /** + * Nom de la classe (heritage) + * FIXME instance ou classe ? + */ + this.CLASSNAME = "ProcessIsoCurve"; + + // appel du constructeur par heritage + CommonService.apply(this, arguments); + + this.logger = Logger.getLogger("Gp.Services.ProcessIsoCurve"); + this.logger.trace("[Constructeur ProcessIsoCurve (options)]"); + + if (!options.position) { + throw new Error(_.getMessage("PARAM_MISSING", "position")); + } + + // on lance une exception afin d'eviter au service de le faire... + 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"); + } + + // si on a que le paramètre "distance" en entrée, on calcule une isodistance. + // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "distance" + if (!options.time && options.distance) { + this.options.method = "distance"; + // on supprime l'éventuel attribut time, résidu d'un appel antérieur + if (this.options.time) { + delete this.options.time; + } + } + + // si on a que le paramètre "time" en entrée, on calcule une isochrone. + // Le paramètre "méthode" doit pour avoir une réponse du service, être passé à "time" + if (options.time && !options.distance) { + this.options.method = "time"; + // on supprime l'éventuel attribut time, résidu d'un appel antérieur + if (this.options.distance) { + delete this.options.distance; + } + } + + // au cas où on a ni l'un, ni l'autre... + this.options.method = this.options.method || "time"; + + // options par defaut du service + // TODO: modifier la ressource lors de la mise en production du service + this.options.resource = options.resource || "bdtopo-iso"; + this.options.exclusions = options.exclusions || []; + this.options.reverse = options.reverse || false; + this.options.srs = options.srs || "EPSG:4326"; + this.options.distanceUnit = options.distanceUnit || "m"; + this.options.timeUnit = options.timeUnit || "second"; + + // options depreciees + if (options.smoothing) { + this.logger.warn("options.smoothing is DEPRECATED"); + } + this.options.smoothing = false; + if (options.holes) { + this.logger.warn("options.holes is DEPRECATED"); + } + this.options.holes = false; + + // Gestion du graphe + if (options.graph) { + if (options.graph === "Voiture") { + this.options.graph = "car"; + } + if (options.graph === "Pieton") { + this.options.graph = "pedestrian"; + } + } else { + this.options.graph = "car"; + } + + // Gestions des contraintes + this.options.constraints = []; + if (options.constraints) { + if (Array.isArray(options.constraints)) { + for (var k = 0; k < options.constraints.length; k++) { + this.options.constraints.push(options.constraints[k]); + } + } else { + throw new Error(_.getMessage("PARAM_TYPE", "constraints")); + } + } + + // Gestion de l'ancien paramètre exclusions + var constraintTunnel = {}; + var constraintPont = {}; + var constraintAutoroute = {}; + if (options.exclusions) { + if (options.exclusions.length !== 0) { + this.logger.warn("options.exclusions is DEPRECATED !!"); + for (var c = 0; c < options.exclusions.length; c++) { + if (typeof options.exclusions[c] === "string") { + options.exclusions[c] = options.exclusions[c].toLowerCase(); + } else { + // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions + continue; + } + if (options.exclusions[c] === "toll") { + constraintAutoroute.constraintType = "banned"; + constraintAutoroute.key = "wayType"; + constraintAutoroute.operator = "="; + constraintAutoroute.value = "autoroute"; + this.options.constraints.push(constraintAutoroute); + } + if (options.exclusions[c] === "tunnel") { + constraintTunnel.constraintType = "banned"; + constraintTunnel.key = "wayType"; + constraintTunnel.operator = "="; + constraintTunnel.value = "tunnel"; + this.options.constraints.push(constraintTunnel); + } + if (options.exclusions[c] === "bridge") { + constraintPont.constraintType = "banned"; + constraintPont.key = "wayType"; + constraintPont.operator = "="; + constraintPont.value = "pont"; + this.options.constraints.push(constraintPont); + } + } + } + } + + // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. + this.options.outputFormat = (typeof options.outputFormat === "string") ? options.outputFormat.toLowerCase() : "json"; + if (options.outputFormat && options.outputFormat !== "json") { + throw new Error(_.getMessage("PARAM_NOT_SUPPORT", "outputFormat")); + } + this.options.outputFormat = "json"; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + if (!this.options.serverUrl) { + // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone + /* var urlFound = DefaultUrlService.ProcessIsoCurve.newUrl(); + if (this.options.oldIsoService) { + urlFound = DefaultUrlService.ProcessIsoCurve.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'isochrone + var urlFound = DefaultUrlService.ProcessIsoCurve.url(); + if (!urlFound) { + throw new Error("Url by default not found !"); + } + this.options.serverUrl = urlFound; + this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); + } +} + +/** + * @lends module:ProcessIsoCurve# + */ +ProcessIsoCurve.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +ProcessIsoCurve.prototype.constructor = ProcessIsoCurve; + +/** + * Création de la requête (overwrite) + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +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); +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} onError - callback des erreurs + * @param {Function} onSuccess - callback de succès de l'analyse de la réponse + */ +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"))); + } +}; + +export default ProcessIsoCurve; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js new file mode 100644 index 00000000..b353be51 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/ProcessIsoCurveRequest.js @@ -0,0 +1,190 @@ + +import Logger from "../../../Utils/LoggerByDefault"; +import _ from "../../../Utils/MessagesResources"; +import ProcessIsoCurveParam from "./model/ProcessIsoCurveParam"; + +/** + * @classdesc + * Classe de gestion des requêtes sur le service de calcul d'isoschrone/isodistance. + * Les requêtes peuvent être en mode GET ou POST, + * et le format de sorti est en JSON. + * + * @constructor + * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveRequest + * @param {Object} options - options + * + * @example + * var options = { + * httpMethod : 'GET', // GET|POST + * // spécifique au service + * position : { + * x : 2.3242664298058053, + * y : 48.86118017324745 + * }, + * graph : "car", + * method : 'time', + * time : 1000, //distance : 200 + * reverse : false, + * srs : 'EPSG:4326' + * }; + * + * try { + * + * var oIsoCurve = new ProcessIsoCurveRequest (options); + * if (!oIsoCurve.processRequestString ()) { + * // error + * } + * + * var request = oIsoCurve.requestString; + * + * } catch (e) { + * // error + * } + * @private + */ +function ProcessIsoCurveRequest (options) { + this.logger = Logger.getLogger("ProcessIsoCurveRequest"); + this.logger.trace("[Constructeur ProcessIsoCurveRequest ()]"); + + if (!(this instanceof ProcessIsoCurveRequest)) { + throw new TypeError("ProcessIsoCurveRequest constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_.getMessage("PARAM_EMPTY", "options")); + } + + /** + * Liste des options + */ + this.settings = options; + + /** + * Mode HTPP. + * Par defaut, "GET". + * @type {String} + */ + this.mode = this.settings.httpMethod || "GET"; +} + +ProcessIsoCurveRequest.prototype = { + + /** + * @lends module:ProcessIsoCurveRequest# + */ + + /** + * Requête + * @type {String} + */ + requestString : null, + + /** + * Constructeur (alias) + */ + constructor : ProcessIsoCurveRequest, + + /** + * Construction de la requête. + * + * @example + * // GET out : + * // (http://wxs.ign.fr/KEY/isochrone?) + * // resource=& + * // point=& + * // costValue=& + * // costType=& + * // profile=& + * // constraints=& + * // direction=& + * // crs= + * + * // POST out : + * { + * resource: "bduni-idf-pgr", + * point: "2.337306,48.849319", + * costValue: 100, + * costType: "time", + * profile: "car", + * constraints: [{ + * constraintType: "banned", + * key: "ways_type", + * operator: "=", + * value: "autoroute" + * }] + * } + * + * @returns {String} request + */ + processRequestString : function () { + var request = ""; + var i = 0; + + switch (this.mode) { + case "GET": + this.logger.trace("Process GET Request"); + + // Mapping des options avec le service de l'API REST + 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": + this.logger.trace("Process POST Request"); + // creation du JSON + var postRequest = {}; + + postRequest.resource = this.settings.resource; + + postRequest.point = this.settings.position.x + "," + this.settings.position.y; + + if (this.settings.method === "distance") { + postRequest.costType = "distance"; + postRequest.costValue = this.settings.distance; + } else { + postRequest.costType = "time"; + postRequest.costValue = this.settings.time; + } + + postRequest.profile = this.settings.graph; + + if (this.settings.reverse) { + postRequest.direction = "arrival"; + } else { + postRequest.direction = "departure"; + } + + postRequest.constraints = this.settings.constraints; + + postRequest.distanceUnit = this.settings.distanceUnit; + + postRequest.timeUnit = this.settings.timeUnit; + + postRequest.crs = this.settings.srs; + + // conversion en chaîne de caractères + request = JSON.stringify(postRequest); + break; + + default: + this.logger.error("No other HTTP method supported by the service !"); + } + + this.logger.trace(request); + this.requestString = request; + + return this.requestString; + } +}; + +export default ProcessIsoCurveRequest; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js new file mode 100644 index 00000000..e358018d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Request/model/ProcessIsoCurveParam.js @@ -0,0 +1,202 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * + * Classe de gestion des param. des requêtes du service de calcul des iso. + * Permet le mapping avec les options du service. + * + * @constructor + * @alias Gp.Services.ProcessIsoCurve.Request.ProcessIsoCurveParam + * @param {Object} options - options + * @private + * + */ +function ProcessIsoCurveParam (options) { + if (!(this instanceof ProcessIsoCurveParam)) { + throw new TypeError("ProcessIsoCurveParam constructor cannot be called as a function."); + } + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur ProcessIsoCurveParam ()]"); + + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // mapping des options avec l'API REST + + /** Identifiant de l’isochrone */ + this.id = this.options.id; + + /** Resource */ + this.resource = this.options.resource; + + /** Coordonnées de départ (ou arrivée si le reverse est à true). */ + this.point = this.options.position; + + /** projection (code EPSG comme epsg:4326 ou wgs84) */ + this.crs = this.options.srs; + + /** + * Profil de véhicule à utiliser pour le calcul. + * Voiture ou Pieton + */ + this.profile = this.options.graph; + + /** Liste des règles de restrictions à utiliser */ + this.constraints = this.options.constraints; + + this.reverse = this.options.reverse; + + this.timeUnit = this.options.timeUnit; + + this.distanceUnit = this.options.distanceUnit; + + /** + * "time" pour isochrone ou "distance" for isodistance. + * Par defaut, time... + */ + if (this.options.method === "distance") { + this.costType = "distance"; + this.costValue = this.options.distance; + } else { + this.costType = "time"; + this.costValue = this.options.time; + } +} + +/** + * CLASSNAME + */ +ProcessIsoCurveParam.CLASSNAME = "ProcessIsoCurveParam"; + +ProcessIsoCurveParam.prototype = { + + /** + * @lends module:ProcessIsoCurveParam# + */ + + /** + * Constructeur (alias) + */ + constructor : ProcessIsoCurveParam, + + /** + * Retourne le point + * @returns {String} x,y + */ + getLocation : function () { + return this.point.x + "," + this.point.y; + }, + + /** + * Retourne l'unité de la distance + * @returns {String} + */ + getDistanceUnit : function () { + if (this.distanceUnit === "m") { + return "meter"; + } + if (this.distanceUnit === "km") { + return "kilometer"; + } + return ""; + }, + + /** + * Retourne la liste des contraintes + * @returns {String} + */ + getConstraints : function () { + var constraintArray = []; + + if (this.constraints.length !== 0) { + for (var k = 0; k < this.constraints.length; k++) { + constraintArray.push(JSON.stringify(this.constraints[k])); + } + } + return constraintArray.join("|"); + }, + + /** + * Retourne la direction + * @returns {String} + */ + getDirection : function () { + if (this.reverse) { + return "arrival"; + } else { + return "departure"; + } + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Object[]} KVP + */ +ProcessIsoCurveParam.prototype.getParams = function () { + var map = []; + + map.push({ + k : "resource", + v : this.resource + }); + + map.push({ + k : "point", + v : this.getLocation() + }); + + map.push({ + k : "direction", + v : this.getDirection() + }); + + map.push({ + k : "costType", + v : this.costType + }); + + map.push({ + k : "costValue", + v : this.costValue + }); + + map.push({ + k : "profile", + v : this.profile + }); + + map.push({ + k : "timeUnit", + v : this.timeUnit + }); + + map.push({ + k : "distanceUnit", + v : this.getDistanceUnit() + }); + + if (this.crs) { + map.push({ + k : "crs", + v : this.crs + }); + } + + if (this.constraints) { + map.push({ + k : "constraints", + v : this.getConstraints() + }); + } + + return map; +}; + +export default ProcessIsoCurveParam; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js new file mode 100644 index 00000000..042ae724 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/ProcessIsoCurveResponseFactory.js @@ -0,0 +1,106 @@ +import Logger from "../../../Utils/LoggerByDefault"; +import MRes from "../../../Utils/MessagesResources"; +import ErrorService from "../../../Exceptions/ErrorService"; +import ProcessIsoCurveResponse from "./model/ProcessIsoCurveResponse"; + +/** + * Factory pour générer une reponse JSON à partir d'un JSON + * (Factory) + * + * @module ProcessIsoCurveResponseFactory + * @alias Gp.Services.ProcessIsoCurve.Response.ProcessIsoCurveResponseFactory + * @private + */ +var ProcessIsoCurveResponseFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant ProcessIsoCurve + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build : function (options) { + // logger + var logger = Logger.getLogger("ProcessIsoCurveResponseFactory"); + logger.trace(["ProcessIsoCurveResponseFactory::build()"]); + + var data = null; + + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + logger.trace("analyze response : json"); + + var JSONResponse; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // analyse de la reponse + // création de l'objet de réponse + data = new ProcessIsoCurveResponse(); + + // remplissage de l'objet créé avec les attribtuts de la réponse du service + if (JSONResponse) { + if (JSONResponse.costType === "distance") { + data.time = ""; + data.distance = JSONResponse.costValue; + } else { + data.time = JSONResponse.costValue; + data.distance = ""; + } + + data.message = ""; + data.id = ""; + data.srs = JSONResponse.crs; + data.geometry = JSONResponse.geometry; + var coords = JSONResponse.point.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; + } + + // info : en cas de problèmes de droits (clé invalide ou autre), la réponse est au format XML !! + // ex. Key does not exist or has expired + // mais le statut est 403, l'erreur est donc remontée plus tôt. + 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 { + // si la réponse est vide, on appelle le callback d'erreur + options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EMPTY"))); + return; + } + + // si tout s'est bien passé, on appelle le callback de succès + options.onSuccess.call(options.scope, data); + } +}; + +export default ProcessIsoCurveResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js new file mode 100644 index 00000000..c73e08d2 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/ProcessIsoCurve/Response/model/ProcessIsoCurveResponse.js @@ -0,0 +1,45 @@ + +/** + * Response object for {@link module:Services~isoCurve Gp.Services.isoCurve ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Float} distance - distance (expressed in meters) used for the request. + * @property {Float} time - time (expressed in seconds) used for the request. + * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the isocurve. + * @property {String} id - request id (used by underlying webservice). + * @property {Gp.Point} location - Position of the start or end point used for the request (expressed in "srs" coordinates system). + * @property {String} message - message + * @property {String} srs - Identifier of the coordinates system used for the isocurve. + * + * @namespace + * @alias Gp.Services.IsoCurveResponse + * + */ +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 + +}; + +export default ProcessIsoCurveResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js new file mode 100644 index 00000000..4f1ab6f9 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestFactory.js @@ -0,0 +1,86 @@ +import Logger from "../../../Utils/LoggerByDefault"; +import ErrorService from "../../../Exceptions/ErrorService"; +import RouteRequestREST from "./RouteRequestREST"; + +/** + * Creation d'une requête REST en mode POST ou GET + * (Factory) + * + * @module RouteRequestFactory + * @alias Gp.Services.Route.Request.RouteRequestFactory + * @private + */ +var RouteRequestFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Route + * + * @example + * // utilisation avec les callback + * var options = { + * (...) + * onSuccess : function (response) {}, + * onError : function (error) {}, + * // spécifique au service + * startPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * endPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * provideBbox : false, + * exclusions : ["bridge", "tunnel", "toll"], + * distanceUnit : "km", + * graph : "Voiture", + * geometryInInstructions : false, + * routePreference : "fastest" + * }; + * RouteRequestFactory.build(options); + * + * // utilisation sans callback + * var options = {...}; + * try { + * var result = RouteRequestFactory.build(options); + * if (! result) { throw new Error("..."):} + * } catch (e) { + * // todo + * } + * @returns {String} request + */ + build : function (options) { + // logger + var logger = Logger.getLogger("RouteRequestFactory"); + logger.trace(["RouteRequestFactory::build()"]); + + var request = null; + + var settings = options || {}; + + // gestion des callback + var bOnError = !!(options.onError !== null && typeof options.onError === "function"); + + var message = null; + + // FIXME les exceptions ne sont pas 'catchées' sur le constructeur ! + 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; + + return request; + } +}; + +export default RouteRequestFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js new file mode 100644 index 00000000..d6eac5aa --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/RouteRequestREST.js @@ -0,0 +1,102 @@ + +import Logger from "../../../Utils/LoggerByDefault"; +import _ from "../../../Utils/MessagesResources"; +import RouteParamREST from "./model/RouteParamREST"; + +/** + * @classdesc + * Classe de gestion des requêtes de type REST sur le service de calcul d'itineraire + * (uniquement en GET) + * + * @constructor + * @alias Gp.Services.Route.Request.RouteRequestREST + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * (...) + * }; + * + * @private + */ +function RouteRequestREST (options) { + this.logger = Logger.getLogger("RouteRequestREST"); + this.logger.trace("[Constructeur RouteRequestREST ()]"); + + if (!(this instanceof RouteRequestREST)) { + throw new TypeError("RouteRequestREST constructor cannot be called as a function."); + } + + // existance des options + if (!options) { + throw new Error(_.getMessage("PARAM_EMPTY", "options")); + } + + /** liste des options */ + this.settings = options; +} + +RouteRequestREST.prototype = { + + /** + * @lends module:RouteRequestREST# + */ + + /** + * request + * @type {String} + */ + requestString : null, + + /** + * Constructeur (alias) + */ + constructor : RouteRequestREST, + + /** + * Construction de la requête. + * + * @example + * // GET out : origin=2.416907353809513,48.8465772142297&destination=2.4248037771493673,48.84591353161838 + * // POST out : Not yet supported method POST ! + * @returns {String} request + */ + processRequestString : function () { + // INFO + // construction simple sans template..., + // mais en attendant que les services soient fixés, on taggue ce composant en mode PROTOTYPE ! + this.logger.warn(" PROTOTYPE !"); + + // Mapping des options avec le service de l'API REST + 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; + } + + // Exemple : + // http://wxs.ign.fr/KEY/itineraire/rest/route.json? + // origin=& + // destination=& + // waypoints=& + // method=DISTANCE& + // graph=Pieton& + // graphName=Pieton& + // exclusions=& + // tolerance=10& + // srs= + + this.logger.trace(request); + this.requestString = request; + + return this.requestString; + } +}; + +export default RouteRequestREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js new file mode 100644 index 00000000..2276e046 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Request/model/RouteParamREST.js @@ -0,0 +1,242 @@ + +import Logger from "../../../../Utils/LoggerByDefault"; + +/** + * @classdesc + * Classe de gestion des param. des requêtes du service de calcul d'itineraire (REST). + * Permet le mapping avec les options du service. + * @constructor + * @alias Gp.Services.Route.Request.RouteParamREST + * @param {Object} options - options + * + * @private + */ +function RouteParamREST (options) { + if (!(this instanceof RouteParamREST)) { + throw new TypeError("RouteParamREST constructor cannot be called as a function."); + } + + this.logger = Logger.getLogger(); + this.logger.trace("[Constructeur RouteParamREST ()]"); + /** + * Options en paramêtres du constructeur. + */ + this.options = options || {}; + + // mapping des options avec l'API REST + + /** Ressource utilisée */ + this.resource = this.options.resource; + + /** Coordonnées du point de départ. */ + this.start = this.options.startPoint.x + "," + this.options.startPoint.y; + + /** Coordonnées du point d’arrivée. */ + this.end = this.options.endPoint.x + "," + this.options.endPoint.y; + + /** Coordonnées des étapes point de départ. */ + this.intermediates = this.options.viaPoints; + + /** Nom du profile à utiliser */ + this.profile = this.options.graph; + + /** projection (code EPSG comme epsg:4326 ou wgs84) */ + this.crs = this.options.srs; + + /** Liste des contraintes */ + this.constraints = this.options.constraints; + + /** Nom de l'optimisation à utiliser */ + this.optimization = this.options.routePreference; + + /** Format de sortie (résumé de l’itinéraire) */ + this.getSteps = (this.options.geometryInInstructions) ? "true" : "false"; + + /** Unité des distances */ + this.distanceUnit = this.options.distanceUnit; + + /** Unité des durées */ + this.timeUnit = this.options.timeUnit; + + /** Attributs des voies */ + this.waysAttributes = this.options.waysAttributes; +} + +/** + * CLASSNAME + */ +RouteParamREST.CLASSNAME = "RouteParamREST"; + +RouteParamREST.prototype = { + + /** + * @lends module:RouteParamREST# + */ + + /** + * Constructeur (alias) + */ + constructor : RouteParamREST, + + /** + * Retourne une liste de points + * @returns {String} une liste de points (sep '|') + */ + getIntermediates : function () { + var array = []; + if (this.intermediates.length !== 0) { + for (var i = 0; i < this.intermediates.length; i++) { + var obj = this.intermediates[i]; + array.push(obj.x + "," + obj.y); + } + } + + return array.join("|"); + }, + + /** + * Retourne une liste d'attributs + * @returns {String} une liste d'attributs (sep '|') + */ + getWaysAttributes : function () { + return this.waysAttributes.join("|"); + }, + + /** + * Retourne un profile + * @returns {String} profile + */ + getProfile : function () { + return this.profile; + }, + + /** + * Retourne un distanceUnit + * @returns {String} distanceUnit + */ + getDistanceUnit : function () { + if (this.distanceUnit === "m") { + return "meter"; + } + if (this.distanceUnit === "km") { + return "kilometer"; + } + return ""; + }, + + /** + * Retourne une optimisation + * @returns {String} optimization + */ + getOptimization : function () { + if (this.optimization) { + return this.optimization; + } else { + return ""; + } + }, + + /** + * Retourne la liste des constraints + * @returns {String} une liste des constraints (sep '|') + */ + getConstraints : function () { + var constraintArray = []; + + if (this.constraints.length !== 0) { + for (var k = 0; k < this.constraints.length; k++) { + constraintArray.push(JSON.stringify(this.constraints[k])); + } + } + return constraintArray.join("|"); + } +}; + +/** + * Tableau de clefs/valeurs pour param. + * + * @returns {Array} liste de paramêtres + */ +RouteParamREST.prototype.getParams = function () { + var map = []; + + map.push({ + k : "resource", + v : this.resource + }); + + map.push({ + k : "start", + v : this.start + }); + + map.push({ + k : "end", + v : this.end + }); + + map.push({ + k : "geometryFormat", + v : "geojson" + }); + + if (this.optimization) { + map.push({ + k : "optimization", + v : this.getOptimization() + }); + } + + if (this.intermediates) { + map.push({ + k : "intermediates", + v : this.getIntermediates() + }); + } + + if (this.profile) { + map.push({ + k : "profile", + v : this.getProfile() + }); + } + + if (this.constraints) { + map.push({ + k : "constraints", + v : this.getConstraints() + }); + } + + if (this.crs) { + map.push({ + k : "crs", + v : this.crs + }); + } + + if (this.distanceUnit) { + map.push({ + k : "distanceUnit", + v : this.getDistanceUnit() + }); + } + + if (this.timeUnit) { + map.push({ + k : "timeUnit", + v : this.timeUnit + }); + } + + if (this.waysAttributes) { + map.push({ + k : "waysAttributes", + v : this.getWaysAttributes() + }); + } + + return map; +}; + +export default RouteParamREST; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js new file mode 100644 index 00000000..5be48a66 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/RouteResponseFactory.js @@ -0,0 +1,247 @@ +import Logger from "../../../Utils/LoggerByDefault"; +import MRes from "../../../Utils/MessagesResources"; +import ErrorService from "../../../Exceptions/ErrorService"; +import RouteResponse from "./model/RouteResponse"; +import RouteInstruction from "./model/RouteInstruction"; + +/** + * Factory pour générer une reponse JSON à partir d'un XML ou d'un JSON + * (Factory) + * + * @module RouteResponseFactory + * @alias Gp.Services.Route.Response.RouteResponseFactory + * @private + */ +var RouteResponseFactory = { + + /** + * interface unique + * + * @method build + * @static + * @param {Object} options - options definies dans le composant Route + * + * @example + * var options = { + * response : + * outputFormat : + * rawResponse : + * scope : + * onSuccess : + * onError : + * }; + * + */ + build : function (options) { + // logger + var logger = Logger.getLogger("RouteResponseFactory"); + logger.trace("RouteResponseFactory::build()"); + + var data = null; + + if (options.response) { + if (options.rawResponse) { + logger.trace("analyze response : raw"); + data = options.response; + } else { + logger.trace("analyze response : json"); + + var JSONResponse; + if (typeof options.response === "string") { + JSONResponse = JSON.parse(options.response); + } else { + JSONResponse = options.response; + } + + // construction de l'objet réponse JSON + if (JSONResponse) { + // le service renvoie t il une erreur ? + if (JSONResponse.message) { + // ex. {"message":"message not null", "status":"ERROR"} + options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_EXCEPTION", JSONResponse.message))); + return; + } + var legs = []; + var legSteps = []; + var steps = []; + + data = new RouteResponse(); + + if (data.hasOwnProperty("totalTime")) { + data.totalTime = parseFloat(JSONResponse.duration); + } + if (data.hasOwnProperty("totalDistance")) { + data.totalDistance = parseFloat(JSONResponse.distance); + } + + if (data.hasOwnProperty("bbox")) { + data.bbox.left = parseFloat(JSONResponse.bbox[0]); + data.bbox.bottom = parseFloat(JSONResponse.bbox[1]); + data.bbox.right = parseFloat(JSONResponse.bbox[2]); + data.bbox.top = parseFloat(JSONResponse.bbox[3]); + } + + if (data.hasOwnProperty("routeGeometry") && !options.geometryInInstructions) { + data.routeGeometry = JSONResponse.geometry; + } + + if (data.hasOwnProperty("routeInstructions") && options.geometryInInstructions) { + var legList = JSONResponse.portions; + var i; + if (Array.isArray(legList) && legList.length) { + for (i = 0; i < legList.length; i++) { + legs.push(legList[i]); + } + } + if (legs.length) { + for (i = 0; i < legs.length; i++) { + legSteps.push(legs[i].steps); + } + } + if (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.duration; + data.routeInstructions[data.routeInstructions.length - 1].distance = step.distance; + data.routeInstructions[data.routeInstructions.length - 1].code = ""; + data.routeInstructions[data.routeInstructions.length - 1].instruction = ""; + data.routeInstructions[data.routeInstructions.length - 1].geometry = step.geometry; + + // on ne souhaite pas de ce type de valeur... + if (step.name === "Valeur non renseignée") { + step.name = ""; + } + + switch (step.instruction.type) { + case "turn": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Tourner"; + break; + case "new name": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer tout droit"; + break; + case "depart": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Départ"; + break; + case "arrive": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Arrivée"; + break; + case "merge": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Rejoindre"; + break; + case "ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; + break; + case "on ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la bretelle"; + break; + case "off ramp": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Prendre la sortie"; + break; + case "fork": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Sur la bifurcation, prendre"; + break; + case "end of road": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "À la fin de la route, prendre"; + break; + case "use lane": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Utiliser la file"; + break; + case "continue": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Continuer"; + break; + case "roundabout": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; + break; + case "rotary": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond-point"; + break; + case "roundabout turn": + data.routeInstructions[data.routeInstructions.length - 1].instruction += "Au rond point, tourner"; + break; + case "notification": + data.routeInstructions[data.routeInstructions.length - 1].instruction += ""; + break; + default: + data.routeInstructions[data.routeInstructions.length - 1].instruction += "?" + step.instruction.type + "?"; + break; + } + + if (step.instruction.modifier) { + switch (step.instruction.modifier) { + case "uturn": + data.routeInstructions[data.routeInstructions.length - 1].instruction = "Faire demi-tour"; + break; + case "sharp right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à droite"; + break; + case "right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " à droite"; + break; + case "slight right": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " légèrement à droite"; + break; + case "straight": + data.routeInstructions[data.routeInstructions.length - 1].instruction = "Continuer tout droit"; + break; + case "slight left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " lègèrement à gauche"; + break; + case "left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " à gauche"; + break; + case "sharp left": + data.routeInstructions[data.routeInstructions.length - 1].instruction += " complètement à gauche"; + break; + default: + data.routeInstructions[data.routeInstructions.length - 1].instruction += " ?" + step.instruction.modifier + "?"; + break; + } + } + + if (step.instruction.exit) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += `${step.instruction.exit}e sortie`; + } + + if (step.attributes.name) { + if (step.attributes.name.nom_1_droite || step.attributes.name.toponyme) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += " sur"; + } + + if (step.attributes.name.nom_1_droite) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += ` ${step.attributes.name.nom_1_droite}`; + } + + if (step.attributes.name.toponyme) { + data.routeInstructions[data.routeInstructions.length - 1].instruction += ` ${step.attributes.name.toponyme}`; + } + } + }); + } + } + + if (!data) { + options.onError.call(options.scope, new ErrorService(MRes.getMessage("SERVICE_RESPONSE_ANALYSE", "json"))); + return; + } + + // Si la réponse contenait une exception renvoyée par le service + if (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); + } +}; + +export default RouteResponseFactory; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js new file mode 100644 index 00000000..bada11b9 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteInstruction.js @@ -0,0 +1,48 @@ + +/** + * Single Route Instruction object. + * + * @property {String} code - Instruction code : + * + * - "F" : Straight forward + * - "B" : U-turn + * - "L" : turn left + * - "R" : turn right + * - "BL" : turn left strongly + * - "BR" : turn right strongly + * - "FL" : turn lightly to the left + * - "FR" : turn lightly to the right + * - "round_about_entry" : round about entry + * - "round_about_exit" : round about exit + * + * @property {String} instruction - Instruction text : translated code + street name + * @property {Object} geometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the street. + * @property {Float} distance - Length of the instruction. Expressed in km or m, depending on distanceUnit parameter. + * @property {Float} duration - Instruction duration in seconds. + * + * @namespace + * @alias Gp.Services.Route.RouteInstruction + */ +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; // FIXME can be null if option 'geometryInInstructions' is false ! +} + +RouteInstruction.prototype = { + + constructor : RouteInstruction + +}; + +export default RouteInstruction; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js new file mode 100644 index 00000000..9ee0208f --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Response/model/RouteResponse.js @@ -0,0 +1,40 @@ +/** + * Response object for {@link module:Services~route Gp.Services.route ()} invocation when successful. Received as the argument of onSuccess callback function. + * + * @property {Gp.BBox} bbox - Bounding Box of the route. Given when provideBBox parameter is used in function call. + * @property {Object} routeGeometry - Geometry (expressed in [GeoJSON]{@link http://geojson.org/}) of the route. + * @property {Array.} routeInstructions - Instructions of the route. + * @property {String} totalDistance - Length of the route. If distanceUnit parameter was set to "km" (default), totalDistance is a string containing the total distance expressed in kilometers, followed by " Km" (e.g. : "19.6 Km"). If distanceUnit parameter was set to "m", totalDistance is a string containing the total distance expressed in meters (e.g. : "19599.14"). + * @property {Float} totalTime - Route duration in seconds. + * + * @namespace + * @alias Gp.Services.RouteResponse + */ +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; // FIXME can be null if option 'geometryInInstructions' is true ! + + this.routeInstructions = []; +} + +RouteResponse.prototype = { + + constructor : RouteResponse + +}; + +export default RouteResponse; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js new file mode 100644 index 00000000..0b584655 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Route/Route.js @@ -0,0 +1,328 @@ + +import Logger from "../../Utils/LoggerByDefault"; +import _ from "../../Utils/MessagesResources"; +import ErrorService from "../../Exceptions/ErrorService"; +import CommonService from "../CommonService"; +import DefaultUrlService from "../DefaultUrlService"; +import RouteRequestFactory from "./Request/RouteRequestFactory"; +import RouteResponseFactory from "./Response/RouteResponseFactory"; + +/** + * @classdesc + * Appel du service d'itinéraire du Géoportail : + * envoi de la requête construite selon les paramètres en options, + * éventuellement parsing et analyse de la réponse, + * retour d'une réponse en paramètre de la fonction onSuccess. + * + * @alias Gp.Services.Route + * @constructor + * @extends {Gp.Services.CommonService} + * @param {Object} options - options spécifiques au service (+ les options heritées) + * + * @param {String} options.resource - La ressource utilisée pour le calcul. Ce paramètre devrait être obligatoire car il l'est dans l'appel au service. Mais il ne l'est pas pour des raisons de rétrocompatibilité. + * + * @param {String} options.outputFormat - Le format de la réponse du service itineraire : 'json' uniquement et par défaut. + * + * @param {String} [options.routePreference = "fastest"] - Mode de calcul à utiliser : + * - le plus rapide « fastest » + * - le plus court « shortest » + * Par défaut : « fastest ». + * + * @param {Object} options.startPoint - Point de départ du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.startPoint.x - Abcisse du point de départ du calcul d'itinéraire. + * @param {Float} options.startPoint.y - Ordonnée du point de départ du calcul d'itinéraire. + * + * @param {Object} options.endPoint - Point d'arrivée du calcul. Coordonnées exprimées en longitudes, latitudes (EPSG:4326) + * @param {Float} options.endPoint.x - Abcisse du point d'arrivée du calcul d'itinéraire. + * @param {Float} options.endPoint.y - Ordonnée du point d'arrivée du calcul d'itinéraire. + * + * @param {Object[]} [options.viaPoints] - Liste de point ({x:Float,y:Float}) intermédaires que l'itinéraire doit emprunter dans l'ordre du tableau. + * Coordonnées exprimées en longitudes, latitudes (EPSG:4326) :{x:float, y:float} + * + * @param {String} [options.graph = "voiture"] - Type de graphe utilisé : "Voiture" ou "Pieton". + * Détermine le profil de vitesses utilisé pour le calcul ainsi que les tronçons autorisés ou non. + * Par défaut, c'est la valeur "Voiture" qui sera utilisée. + * + * @param {String[]} [options.exclusions] - DEPRECATED: Critères d'exclusions à appliquer pour le calcul. (correspond au paramètre "avoidFeature" d'OpenLS) + * On précise ici le type de tronçons que l'on ne veut pas que l'itinéraire emprunte + * (valeurs possibles : « toll » (éviter les péages), « bridge », « tunnel »). + * Ce paramètre est conservé pour une rétrocompatibilité de l'api. Le nouveau paramètre à utiliser est options.constraints + * + * @param {Object[]} [options.constraints] - Critères de contraintes à appliquer sur un itinéraire. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * @param {String} [options.constraints.constraintType] - Type de la contrainte. Généralement "banned". + * @param {String} [options.constraints.key] - Clé de la contrainte. Généralement "wayType". + * @param {String} [options.constraints.operator] - Opérateur de la contrainte. Généralement "=". + * @param {String} [options.constraints.value] - Valeur de la contrainte. Généralement "autoroute". + * + * @param {Boolean} [options.geometryInInstructions = false] - Indique si la géométrie de l'itinéraire doit être reprise morceau par morceau dans les instructions. + * (correspond au paramètre "provideGeometry" d'OpenLS) Par défaut : false. + * + * @param {Boolean} [options.provideBbox = true] - Indique si les instructions doivent être localisées par une bbox dans la réponse. + * Par défaut : true. + * + * @param {String} [options.distanceUnit = "m"] - Indique si la distance doit être exprimée en km ou m dans la réponse. + * Par défaut : m. + * @param {String} [options.timeUnit = "second"] - Indique si la durée doit être exprimée en seconde, minute ou heure dans la réponse. Il peut-être formatté hh:mm::ss avec la valeur standard. + * Les valeurs possibles sont "standard", "second", "minute" ou "hour". + * Par défaut : "standard". + * + * @param {String} [options.srs] - Système de coordonnées dans lequel les paramètres géographiques en entrée et la réponse du service sont exprimés. + * Pas de valeur par défaut. Si le serveur consulté est celui du Géoportail, la valeur par défaut sera donc celle du service : 'EPSG:4326'. + * + * @param {String[]} [options.waysAttributes] - Nom des attributs des voies. Les valeurs disponibles dépendent de la ressource utilisée. Il est donc utile de regarder le getCapabilities. + * + * @example + * var options = { + * // options communes aux services + * apiKey : null, + * serverUrl : 'http://localhost/service/', + * protocol : 'XHR', + * proxyURL : null, + * httpMethod : 'GET', // GET|POST + * timeOut : 10000, // ms + * rawResponse : false, // true|false + * scope : null, // this + * onSuccess : function (response) {}, + * onFailure : function (error) {}, + * // spécifique au service + * resource : 'bdtopo' + * outputFormat : 'json', + * startPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * endPoint : { + * x : 42.1121, + * y : 1.5557 + * }, + * provideBbox : true, + * exclusions : ["Bridge", "Tunnel", "Toll"], + * distanceUnit : "km", + * graph : "Voiture", + * geometryInInstructions : true, + * routePreference : "fastest" + * }; + * + */ +function Route (options) { + if (!(this instanceof Route)) { + throw new TypeError(_.getMessage("CLASS_CONSTRUCTOR", "Route")); + } + + /** + * Nom de la classe (heritage) + */ + this.CLASSNAME = "Route"; + + // appel du constructeur par heritage + CommonService.apply(this, arguments); + + this.logger = Logger.getLogger("Gp.Services.Route"); + this.logger.trace("[Constructeur Route (options)]"); + + if (!options.startPoint) { + throw new Error(_.getMessage("PARAM_MISSING", "startPoint")); + } + + // on lance une exception afin d'eviter au service de le faire... + 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")); + } + + // on lance une exception afin d'eviter au service de le faire... + 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")); + } + + // options par defaut + + // on passe l'option outputFormat en minuscules afin d'éviter des exceptions. + if (options.outputFormat && options.outputFormat !== "json") { + this.logger.warn("options.outputFormat could only be json"); + } + this.options.outputFormat = "json"; + + this.options.resource = options.resource || "bdtopo-osrm"; + this.options.startPoint = options.startPoint; + this.options.endPoint = options.endPoint; + this.options.viaPoints = options.viaPoints || []; + this.options.routePreference = options.routePreference || "fastest"; + /** Gestion des anciennes valeurs de graph */ + if (options.graph) { + if (options.graph === "Voiture") { + this.options.graph = "car"; + } + if (options.graph === "Pieton") { + this.options.graph = "pedestrian"; + } + } else { + this.options.graph = "car"; + } + this.options.constraints = []; + if (options.constraints) { + if (Array.isArray(options.constraints)) { + for (var k = 0; k < options.constraints.length; k++) { + this.options.constraints.push(options.constraints[k]); + } + } else { + throw new Error(_.getMessage("PARAM_TYPE", "constraints")); + } + } + + /** Gestion de l'ancien paramètre exclusion */ + var constraintTunnel = {}; + var constraintPont = {}; + var constraintAutoroute = {}; + if (options.exclusions) { + if (options.exclusions.length !== 0) { + this.logger.warn("options.exclusions is DEPRECATED !!"); + for (var c = 0; c < options.exclusions.length; c++) { + if (typeof options.exclusions[c] === "string") { + options.exclusions[c] = options.exclusions[c].toLowerCase(); + } else { + // on ne crée pas une erreur pour rétro-compatibilité avec les anciennes versions + continue; + } + if (options.exclusions[c] === "toll") { + constraintAutoroute.constraintType = "banned"; + constraintAutoroute.key = "wayType"; + constraintAutoroute.operator = "="; + constraintAutoroute.value = "autoroute"; + this.options.constraints.push(constraintAutoroute); + } + if (options.exclusions[c] === "tunnel") { + constraintTunnel.constraintType = "banned"; + constraintTunnel.key = "wayType"; + constraintTunnel.operator = "="; + constraintTunnel.value = "tunnel"; + this.options.constraints.push(constraintTunnel); + } + if (options.exclusions[c] === "bridge") { + constraintPont.constraintType = "banned"; + constraintPont.key = "wayType"; + constraintPont.operator = "="; + constraintPont.value = "pont"; + this.options.constraints.push(constraintPont); + } + } + } + } + + this.options.geometryInInstructions = options.geometryInInstructions || false; + this.options.provideBbox = options.provideBbox || true; + this.options.distanceUnit = options.distanceUnit || "m"; + this.options.timeUnit = options.timeUnit || "second"; + this.options.expectedStartTime = null; // FIXME not yet implemented ! + this.options.srs = options.srs || "EPSG:4326"; + this.options.waysAttributes = options.waysAttributes || []; + + // gestion de l'url du service par defaut + // si l'url n'est pas renseignée, il faut utiliser les urls par defaut + if (!this.options.serverUrl) { + // Code commenté : Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire + /* var UrlByDefault = DefaultUrlService.Route.newUrl(); + if (this.options.oldRouteService) { + UrlByDefault = DefaultUrlService.Route.url(); + } */ + // Release beta services DIFFUSION uniquement : on tape sur l'anvcien service d'itinéraire + var UrlByDefault = DefaultUrlService.Route.url(); + + if (!UrlByDefault) { + throw new Error("Url by default not found !"); + } + this.options.serverUrl = UrlByDefault; + this.logger.trace("Serveur URL par defaut : " + this.options.serverUrl); + } +} + +/** + * @lends module:Route# + */ +Route.prototype = Object.create(CommonService.prototype, { + // todo + // getter/setter +}); + +/* + * Constructeur (alias) + */ +Route.prototype.constructor = Route; + +/** + * (overwrite) + * Création de la requête + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Route.prototype.buildRequest = function (error, success) { + var options = { + // spécifique au service + resource : this.options.resource, + startPoint : this.options.startPoint, + endPoint : this.options.endPoint, + viaPoints : this.options.viaPoints, + provideBbox : this.options.provideBbox, + constraints : this.options.constraints, + distanceUnit : this.options.distanceUnit, + timeUnit : this.options.timeUnit, + graph : this.options.graph, + geometryInInstructions : this.options.geometryInInstructions, + routePreference : this.options.routePreference, + srs : this.options.srs, + waysAttributes : this.options.waysAttributes + }; + + this.request = RouteRequestFactory.build(options); + + // on teste si la requete a bien été construite ! + if (!this.request) { + error.call(this, new ErrorService(_.getMessage("SERVICE_REQUEST_BUILD"))); + } else { + success.call(this, this.request); + } +}; + +/** + * (overwrite) + * Analyse de la reponse + * + * @param {Function} error - callback des erreurs + * @param {Function} success - callback + */ +Route.prototype.analyzeResponse = function (error, success) { + // INFO + // Factory pour masquer la complexité du retour du service + + if (this.response) { + var options = { + distanceUnit : this.options.distanceUnit, + timeUnit : this.options.timeUnit, + response : this.response, + outputFormat : this.options.outputFormat, // utile pour parser la string en mode XHR : JSON ou XML ! + rawResponse : this.options.rawResponse, + onError : error, + onSuccess : success, + scope : this, + geometryInInstructions : this.options.geometryInInstructions + }; + + RouteResponseFactory.build(options); + } else { + error.call(this, new ErrorService(_.getMessage("SERVICE_RESPONSE_EMPTY"))); + } +}; + +export default Route; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js new file mode 100644 index 00000000..36f7039e --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Services/Services.js @@ -0,0 +1,290 @@ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "point|circle|bbox" }] */ + +/** +* Geoportal web services invocation namespace. +* +* @module Services +* @alias Gp.Services +*/ +import Config from "./Config/Config"; +import Alti from "./Alti/Alti"; +import Geocode from "./Geocode/Geocode"; +import ReverseGeocode from "./Geocode/ReverseGeocode"; +import AutoComplete from "./AutoComplete/AutoComplete"; +import Route from "./Route/Route"; +import ProcessIsoCurve from "./ProcessIsoCurve/ProcessIsoCurve"; + +var Services = { + /** + * Access to Geoportal resources metadata availables with one ore several keys + * + * @method getConfig + * @param {Object} options - Options for function call. + * @param {String} [options.apiKey] - Access key(s) ("," as separator, no spaces) to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web} + * @param {String} [options.customConfigFile] - path to a local config file. Overload the apiKey parameter + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GetConfigResponse} object as a parameter except if "rawResponse" parameter is set to true : a String will be returned. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + */ + getConfig : function (options) { + var configService = new Config(options); + configService.call(); + }, + /** + * Getting elevations in or along of one or several points on french territories using the [elevation services of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/alti.html}.
+ * Two use cases are availables :
+ * 1. getting elevations of the given points : don't use the options.sampling parameter ;
+ * 2. getting a regular set of elevations along the given points : use the options.sampling parameter. + * + * @method getAltitude + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {Array.} options.positions - Array of positions ({lon:float, lat:float}) expressed in CRS:84 coordinates system, where to get elevations. 50 positions maximum may be given. 2 positions minimum are required if you use the options.sampling parameter. + * @param {Number} [options.sampling] - Number of points to use (between 2 and 5000) in order to compute an elevation path. The points given with the options.positions parameter are used to fix the planimetric path along which the elevations will be computed.
+ * If not used, only elevations of these positions will be returned. + * @param {Boolean} [options.zonly=false] - Set this parameter to true if you only want to have elevations returned without corresponding coordinates. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AltiResponse} object as a parameter, except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/alti/rest/elevation.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + * @param {String} [options.api='REST'] - What API to use for interacting with underlying web service : 'REST'. Only use if you know what you are doing. + * @param {String} [options.outputFormat='xml'] - Output format for underlying web service response : 'xml' or 'json'. Only use if you know what you are doing. + */ + getAltitude : function (options) { + var altiService = new Alti(options); + altiService.call(); + }, + /** + * Getting positon of a geographic identifier (places names, address, cadastral parcel, other...) using the [geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage.html}. + * + * @example + * Gp.Services.geocode ({ + * apiKey : "carte", + * location : "73 avenue de Paris, Saint-Mandé", + * // traitement des resultats + * onSuccess : function (result) { + * console.log("found (x:"+result.position.x+", y:"+result.position.y+")") ; + * } + * }) ; + * + * + * @method geocode + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". + * @param {String} options.query - Geographic identifier to locate. + * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. + * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". + *

+ * Properties availables for address search :
+ * "postalCode", "inseeCode" and "city". + *

+ * Properties availables for place names search :
+ * "postalCode", "inseeCode" and "type". + *

+ * Properties availables for cadastral parcels search :
+ * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. + * @param {Boolean} [options.returnTrueGeometry=false] - Set this parameter to true if you wish to have the true geometrie returned. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + geocode : function (options) { + var geocodeService = new Geocode(options); + geocodeService.call(); + }, + /** + * Retrieving geographical identifiers (place names, address, cadastral parcels, ...) near a given position, using the [reverse geocoding web service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/geocodage-inverse.html}. + * + * @method reverseGeocode + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.index="StreetAddress"] - Geographical identifier type to search. Values currently availables are : "PositionOfInterest" for place names, "StreetAddress" for address search, "CadastralParcel" for Cadastral parcels search, "location" for a multi-index search on "StreetAddress" and "PositionOfInterest". Default is "StreetAddress". + * @param {Object} options.position - Reference position where to search geographical identifiers. + * @param {Float} options.position.lon - Longitude + * @param {Float} options.position.lat - Latitude + * @param {Object} [options.filters] - Additional filters to apply to search. The following properties may be given. + * @param {String} [options.filters.[prop]] - Additionnal properties to filter search. Properties depends on options.index, and values type should be "String". + *

+ * Properties availables for address search :
+ * "postalCode", "inseeCode" and "city". + *

+ * Properties availables for place names search :
+ * "postalCode", "inseeCode" and "type". + *

+ * Properties availables for cadastral parcels search :
+ * "codeDepartement", "codeCommune", "nomCommune", "codeCommuneAbs", "codeArrondissement", "section", "numero", "feuille". + * @param {Object} [options.searchGeometry] - Location where to perform the search. + * @param {String} options.searchGeometry.type - Geometry type (Point|Circle|Linestring|Polygon) + * @param {Array.|Array.Array.} options.searchGeometry.coordinates - Coordinates + * @param {Float} [options.searchGeometry.radius] - Radius (only for type 'Circle') + * @param {Number} [options.maximumResponses=20] - Maximum number of responses. Default underlying service value applies (20) if not provided. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.GeocodeResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/geoportail/ols] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + reverseGeocode : function (options) { + var reverseGeocodeService = new ReverseGeocode(options); + reverseGeocodeService.call(); + }, + /** + * Getting suggestions of probable places names or address based on uncomplete texts, using the [autocompletion service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/autocompletion.html} + * + * @method autoComplete + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} options.text - Text input to complete. + * @param {Array.} [options.filterOptions.type = "StreetAddress"] - Suggestion types to provide : address ("StreetAddress") and/or place name ("PositionOfInterest"). + * @param {Array.} [options.filterOptions.territory] - Places where to limit the search of suggestions : "METROPOLE" (Corsica and metropolitan France), "DOMTOM" (French overseas departments and territories), or an INSEE code of a department. No limitation by default. For instance : ['METROPOLE', '31'] + * @param {Number} [options.maximumResponses = 10] - Maximum number of responses. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.AutoCompleteResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/ols/apis/completion] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + autoComplete : function (options) { + var autoCompleteService = new AutoComplete(options); + autoCompleteService.call(); + }, + /** + * Getting a route from one point to another using the [route service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/itineraires.html}. + * + * @method route + * @param {Object} options - Options for function call. + * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} [options.routePreference = "fastest"] - Indicates the way to compute the route : "fastest" (time optimisation) or "shortest" (distance optimisation). Available values are in the GetCapabilities. + * @param {Gp.Point} options.startPoint - Start point of the route. Expressed in CRS:84 coordinates system (startPoint.x corresponds to longitude, startPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {Gp.Point} options.endPoint - End point of the route. Expressed in CRS:84 coordinates system (endPoint.x corresponds to longitude, endPoint.y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {Array.} [options.viaPoints] - Ordered via Points of the route. Expressed in CRS:84 coordinates system (viaPoints[i].x corresponds to longitude, viaPoints[i].y corresponds to latitude). Available bbox are in the GetCapabilities. + * @param {String} [options.graph = "Voiture"] - User profile to use to compute the route : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads the route may use and the average speed. Available bbox are in the GetCapabilities. + * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). + * @param {Boolean} [options.geometryInInstructions = false] - Indicates if route geometry has to be also returned with route instructions. + * @param {Boolean} [options.provideBoundingBox = true] - Indicates if route instructions has to be localised with a BBOX in the response. + * @param {String} [options.distanceUnit = "m"] - The unit used to provide distances in the response ("meter" or "kilometer"). + * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). + * @param {Array.} [options.waysAttributes] - Way Attributes to add in the response. Available values are in the GetCapabilities. + * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.RouteResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.outputFormat='json'] - Output format ("json" or "xml") to use for underlying webService. Only use if you know what you are doing. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/itineraire/rest/route.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + route : function (options) { + var routeService = new Route(options); + routeService.call(); + }, + /** + * Computing a set of places (curve) reachable from a given point (or from where to start to reach a given point) within a time or distance constraint using the [isochrone service of the Geoportal Platform]{@link https://geoservices.ign.fr/documentation/geoservices/isochrones.html}. + * + * @method isoCurve + * @param {Object} options - Options for function call. + * @param {String} options.apiKey - Access key to Geoportal platform, obtained [here]{@link https://geoservices.ign.fr/services-web}. + * @param {String} options.resource - Resource used to compute the route. Available values are in the GetCapabilities. + * @param {Gp.Point} options.position - Start or Arrival (options.reverse===true) Point for the computing. Expressed in CRS:84 coordinates system (position.x corresponds to longitude, position.y corresponds to latitude). + * @param {String} [options.graph = "Voiture"] - User profile to use to compute the isoCurve : "Voiture" (using a vehicule) or "Pieton" (pedestrian). Has an influence on the kind of roads to use and the average speed. Available values are in the GetCapabilities. + * @param {Array.} [options.exclusions] - DEPRECATED: use options.constraints. Indicates if route has to avoid some features ("toll", "bridge" or "tunnel"). + * @param {Array.} [options.constraints] - Constraints used ({'constraintType':'banned','key':'ways_type','operator':'=','value':'autoroute'}). Available values are in the GetCapabilities. + * @param {String} [options.method = "time"] - Computing method to use : "time" (using a duration as a constraint) or "distance" (using a distance as a constraint). Available values are in the GetCapabilities. + * @param {Float} options.time - Maximum duration (expressed in seconds) to use when options.method is set to "time". + * @param {Float} options.distance - Maximum distance (expressed in meters) to use when options.method is set to "distance". + * @param {Boolean} [options.reverse = false] - Set this parameter to true if you want options.position to be the destination (instead of departure) for the computing. + * @param {String} [options.distanceUnit = "km"] - The unit used to provide distances in the response ("m" or "km"). + * @param {String} [options.timeUnit = "second"] - The unit used to provide duration in the response ("standard", "second", "minute", "hour"). + * @param {Boolean} [options.smoothing = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry to be smoothed. + * @param {Boolean} [options.holes = false] - DEPRECATED: Set this parameter to true if you want the resulting geometry (polygon) to have holes if pertinent. + * @param {Function} options.onSuccess - Callback function for getting successful service response. Takes a {@link Gp.Services.IsoCurveResponse} object as a parameter except if "rawResponse" is set to true. + * @param {Function} [options.onFailure] - Callback function for handling unsuccessful service responses (timeOut, missing rights, ...). Takes a {@link Gp.Error} object as parameter. + * @param {Number} [options.timeOut=0] - Number of milliseconds above which a timeOut response will be returned with onFailure callback (see above). Default value is 0 which means timeOut will not be handled. + * @param {String} [options.outputFormat='json'] - Output format ("json") to use for underlying webService. Only use if you know what you are doing. + * @param {String} [options.serverUrl=http (s)://wxs.ign.fr/APIKEY/isochrone/isochrone.json] - Web service URL. If used, options.apiKey parameter is ignored. Only use if you know what you're doing. + * @param {Boolean} [options.ssl = true] - Use of HTTPS or HTTP protocol to request the services. HTTPS by default (ssl=true). + * @param {String} [options.protocol=XHR] - Protocol used to handle dialog with web service. Possible values are 'JSONP' ({@link https://en.wikipedia.org/wiki/JSONP}) and 'XHR' ({@link https://en.wikipedia.org/wiki/XMLHttpRequest}). Only XHR protocol is supported in a NodeJS environment. Only use if you know what you're doing. + * @param {String} [options.proxyURL] - Proxy URL to use when requesting underlying web service. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you're doing. + * @param {String} [options.callbackSuffix] - Callback function name suffix to use in case of a JSONP protocol use (see above), to set your own suffix instead of auto-increment. Ignored when options.protocol is set to 'XHR' value. Only use if you know what you're doing. + * @param {String} [options.httpMethod=GET] - HTTP method to use when requesting underlying web service in case of a XHR protocol use (see above). Possible values are 'GET' and 'POST'. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {String} [options.contentType="application/xml"] - Content-Type to use when requesting underlying web service in case of a XHR protocol use (see above) and if method HTTP is POST. Ignored when options.protocol is set to 'JSONP' value. Only use if you know what you are doing. + * @param {Boolean} [options.rawResponse=false] - Setting this parameter to true implies you want to handle the service response by yourself : it will be returned as an unparsed String in onSuccess callback parameter. Only use if you know what you are doing. + * @param {Function} [options.onBeforeParse] - Callback function for handling service response before parsing (as an unparsed String). Takes a String as a parameter (the raw service response). Returns a String that will be parsed as the service response. Only use if you know what you are doing. + */ + isoCurve : function (options) { + var processIsoCurveService = new ProcessIsoCurve(options); + processIsoCurveService.call(); + } +}; + +/** + * Point object. + * + * @namespace + * @alias Gp.Point + * + * @property {Float} x - Point abscissa + * @property {Float} y - Point ordinate + */ +var point = {}; + +/** + * Circle object. + * + * @namespace + * @alias Gp.Circle + * + * @property {Float} x - Circle center abscissa. + * @property {Float} y - Circle center ordinate. + * @property {Float} radius - Circle radius. + */ +var circle = {}; + +/** + * Bounding box object, expressed with four coordinates. + * + * @namespace + * @alias Gp.BBox + * + * @property {Float} left - minimum abscissa + * @property {Float} right - maximum abscissa + * @property {Float} bottom - minimum ordinate + * @property {Float} top - maximum ordinate + */ +var bbox = {}; + +export default Services; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js new file mode 100644 index 00000000..24cd5dc6 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/Helper.js @@ -0,0 +1,117 @@ +/** + * Classe utilitaire + * + * @module Helper + * @alias Gp.Helper + */ +var Helper = { + + /** + * concatenation des parametres key/value dans les urls + * + * @method normalyzeParameters + * @static + * @param {Object} params - tableau de clef/valeur + * + * @example + * Gp.Utils.Helper.normalyzeParameters ({ + * key1:value1, + * key2:value2, + * key3:value3 + * }); + * // out : "key1=value1&key2=value2&key3=value3" + * + * @returns {String} retourne les paramètres concaténés + */ + 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; + }, + + /** + * Concaténation et encodage des urls. + * + * @method normalyzeUrl + * @static + * @param {String} url - url + * @param {Object|String} params - tableau de clef/valeur ou string + * @param {Boolean} encode - true|false, false par defaut + * + * @example + * Gp.Utils.Helper.normalyzeUrl (url, { + * key1:value1, + * key2=:value2, + * key3:value3 + * }); + * // out : "url?key1=value1&key2=value2&key3=value3" + * + * @returns {String} retourne une url normalisée + */ + normalyzeUrl : function (url, params, encode) { + var myUrl = url; + + if (url) { + var k = url.indexOf("?"); + if (k === -1) { // pas de ? et KVP + myUrl += "?"; + } + + if (k !== -1 && k !== url.length - 1) { // KVP + myUrl += "&"; + } + } + + if (params) { + if (typeof params === "string") { + myUrl += params; + } else { + myUrl += this.normalyzeParameters(params); + } + } + + if (encode) { + // FIXME bonne idée ? + myUrl = encodeURIComponent(myUrl); + } + + return myUrl; + }, + + /** + * Indentation d'une chaine + * + * @method indent + * @static + * @param {Number} n - nombre de tabulation + * @param {String} msg - chaine + * + * @example + * Gp.Utils.Helper.indent (2, "message à indenter") + * // out + * // ........message à indenter + * + * @returns {String} retourne une chaine indentée + */ + indent : function (n, msg) { + var num = n || 0; + return new Array(num + 1).join("\t") + msg; + } +}; + +export default Helper; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js new file mode 100644 index 00000000..9f0b155d --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/LoggerByDefault.js @@ -0,0 +1,21 @@ +import * as Log from "loglevel"; + +var LoggerByDefault = { + /** + * logger statique + * + * @static + * @param {String} name - nom du logger + * @returns {Object} retourne un logger + */ + getLogger : function (name) { + // Substitute global constants configured at compile time + // cf. webpack.config.js + // FIXME howtodo !? DefineWebpackPlugin ? EnvironmentWebpackPlugin ? + ("__PRODUCTION__".match(/true/)) ? Log.disableAll() : Log.enableAll(); + var logname = name || "default"; + return Log.getLogger(logname); + } +}; + +export default LoggerByDefault; diff --git a/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js new file mode 100644 index 00000000..09223cd7 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/src/Utils/MessagesResources.js @@ -0,0 +1,78 @@ +/** + * Classe de gestion des erreurs qui permer d'associer un message d'erreur à l'exception lancée. + * + * @example + * MessagesResources.getMessage("ERROR_PARAM_MISSING", "x", "y", "z"))); + * // --> output : Parameter(s) 'x - y - z' missing + * + * @module MessagesResources + * @alias Gp.Utils.MessagesResources + * @private + */ +var MessagesResources = { + + // Paramètres + 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_NOT_SUPPORT_NODEJS : "Value(s) for parameter(s) '%var%' not supported to NodeJS", + PARAM_UNKNOWN : "Value(s) for parameter(s) '%var%' unknown", + + // Services + // Requête + SERVICE_REQUEST_BUILD : "An error occurred during the request building of the service", + SERVICE_REQUEST_EMPTY : "The request sent to the service is empty", + + // Réponse + 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", + + // Classes + CLASS_CONSTRUCTOR : "'%var%' constructor cannot be called as a function.", + + /** + * Fonction qui va retourner le message d'erreur associé à la clé donnée + * + * @method getMessage + * @param {String} clef - Clef de l'erreur (ex : ERROR_PARAM) + * @param {String[]} parametres - Paramètres/variables concernés par le message d'erreur associé à la clef donnée + * @return {String} message - String contenant le message de l'exception + */ + getMessage : function (clef, parametres) { + // param de la fonction uniquement pour la documentation... + + if (Object.keys(arguments).length === 0) { + 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) { + // error de string.replace() + + } + + return message; + } +}; + +export default MessagesResources;

yuHic2nk^D->{*wFZr#Rr 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�p{&U!(_xscPl>OQibS=;^QF4XM|7zCU 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 diff --git a/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md b/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md new file mode 100644 index 00000000..71697e36 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/LICENCE.md @@ -0,0 +1,47 @@ + +# Geoportal resources access library + +This software is released under the licence CeCILL-B (Free BSD compatible) + +You may obtain a copy of the License at : + +http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt (english) + +http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt (french) + +see http://www.cecill.info/ + +Copyright (c) 2016-2017 IGN + + +## Third party code : + +The Geoportal resources access library includes the following third party code : + +### ES6-Promise + +A tiny implementation of Promises/A+. +Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and cont ributors (Conversion to ES6 API by Jake Archibald) +Licensed under MIT license +See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE +Version v4.2.4 + +> Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors +> +> 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. diff --git a/geoportal-access-lib-3.4.0-beta2/package/README.md b/geoportal-access-lib-3.4.0-beta2/package/README.md new file mode 100644 index 00000000..399a34a3 --- /dev/null +++ b/geoportal-access-lib-3.4.0-beta2/package/README.md @@ -0,0 +1,376 @@ +# Bibliothèque d'accès aux ressources du Géoportail + +[![Build](https://github.com/IGNF/geoportal-access-lib/actions/workflows/build.yml/badge.svg)](https://github.com/IGNF/geoportal-access-lib/actions/workflows/build.yml) +[![GitHub release](https://img.shields.io/github/release/IGNF/geoportal-access-lib.svg)](https://github.com/IGNF/geoportal-access-lib) +[![DeepScan grade](https://deepscan.io/api/teams/12425/projects/15468/branches/309615/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=12425&pid=15468&bid=309615) + + + +La bibliothèque d’accès aux ressources de la plateforme Géoportail est une bibliothèque de fonctions javascript permettant d'accéder aux ressources délivrées par les services web du Géoportail. + +Elle permet plus particulièrement d'effectuer les opérations suivantes utilisant les données de l'IGN : + +* [Géocoder des adresses, toponymes et parcelles cadastrales](#geocode) + +* [Obtenir des suggestions d'adresses ou de toponymes à partir de textes incomplets](#autocomplete) + +* [Obtenir des localisants (toponymes, adresses, parcelles cadastrales) proche d'une position donnée (géocodage inverse)](#reverseGeocode) + +* [Obtenir des altitudes en un ou plusieurs points ou calculer des profils altimétriques](#alti) + +* [Calculer un itinéraire piéton ou routier](#route) + +* [Calculer des isochrones / isodistances autour d'un point](#isoCurve) + +* [Obtenir des informations relatives à un contrat d'accès au Géoportail](#getConfig) + +## Mise en oeuvre + +Vous pouvez récupérer la bibliothèque d'accès soit en la [téléchargeant directement](#t%C3%A9l%C3%A9chargement-direct), soit en utilisant le [gestionnaire de dépendances javascript NPM](#r%C3%A9cup%C3%A9ration-avec-npm). + +Une documentation technique (jsdoc) et un testeur sont disponibles [ici](https://ignf.github.io/geoportal-access-lib/). + +### Téléchargement direct + +Vous pouvez récupérer ici la version compilée et autonome de la bibliothèque d'accès : [GpServices.js](https://github.com/IGNF/geoportal-access-lib/releases/latest), dans la partie "Downloads". + +### Récupération avec NPM + +La bibliothèque d'accès est aussi disponible dans les dépôts [NPM](https://www.npmjs.com/package/geoportal-access-lib). + +Prérequis : [NodeJS](https://nodejs.org/en/) et [npm](https://www.npmjs.com/) installés. + +``` bash +npm install geoportal-access-lib +``` + +#### Accès direct + +Vous pouvez aussi choisir d'utiliser des fichiers hébergés en ligne, pour y accéder directement, lors de vos tests par exemple. Cependant, pour une utilisation en production, nous vous conseillons de télécharger ces fichiers et de les héberger vous-même, sur le même serveur qui héberge votre application. + +Par exemple sur Github Pages : + +``` +https://ignf.github.io/geoportal-access-lib/latest/dist/GpServices.js +https://ignf.github.io/geoportal-access-lib/latest/dist/GpServices-src.js +``` + +### Intégration dans une page web + +Intégrez la bibliothèque d'accès dans votre page WEB classiquement à l'aide d'une balise **script**. + +``` html + +``` + +### Intégration dans [NodeJS](https://nodejs.org/en/) + +Intégrez la bibliothèque d'accès dans votre script à l'aide de la fonction **require**. + +``` js +var Gp = require("chemin/vers/GpServices.js"); +``` + +> **Note :** +Par défaut, les services sont intérrogés en HTTP. On a la possibilité de forcer le HTTPS avec l'option **ssl**. Ce comportement est ignoré dans les environnements clients (navigateur). Les services sont alors interrogés suivant le même protocole que la page en cours. + +``` js +var Gp = require("chemin/vers/GpServices.js"); + +Gp.Services.geocode({ + apiKey : "...", + ssl : true, + location : "...", + onSuccess : function (result) { + ... + } +}); +// --> https://wxs.ign.fr/KEY/geoportail/ols? +``` + +> **Note :** +Dans un environnement **NodeJS**, il faut installer les 2 dépendances suivantes dans votre projet : +- xmldom +- request + +### Intégration dans un module ES6 + +Intégrez la bibliothèque d'accès dans votre page WEB à l'aide d'une balise **script** de type *module*. + +``` html + +``` + +### Intégration dans un front-end type Angular ou React + +Intégrez la bibliothèque d'accès dans votre module à l'aide de la fonction **import**. + +``` js +import * as Gp from "chemin/vers/GpServices.js"; +``` + +> **Note :** +Dans un environnement **Front-End**, il faut installer les 2 dépendances suivantes dans votre projet : +- xmldom +- request + +