summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2016-02-15 15:56:36 +0100
committerFulup Ar Foll <fulup@iot.bzh>2016-02-15 15:56:36 +0100
commite6d12f74be543056a439259b61ba40a9d0adcf5c (patch)
tree06042b26cc2745b749ea1ff99370acaf58e12223
parentfb1353dbc12ae889c17a6aa1572b917f57de0f9d (diff)
Updated TokenRefresh and AppConfig
-rw-r--r--afb-client/README.md4
-rw-r--r--afb-client/app/Backend/RestApis/TokenMockApi.js8
-rw-r--r--afb-client/app/Frontend/app.js4
-rw-r--r--afb-client/app/Frontend/etc/AppConfig.js (renamed from afb-client/app/Frontend/etc/ConfigApp.js)23
-rw-r--r--afb-client/app/Frontend/pages/Home/HomeModule.js20
-rw-r--r--afb-client/app/Frontend/widgets/FormInput/UploadFiles.js52
-rw-r--r--afb-client/dist.prod/opa/AFBclient.min.js4
7 files changed, 62 insertions, 53 deletions
diff --git a/afb-client/README.md b/afb-client/README.md
index 4e0796f..2eb0f6f 100644
--- a/afb-client/README.md
+++ b/afb-client/README.md
@@ -35,9 +35,9 @@ Install HTML5 development toolchain on your host
};
module.exports = config;
- WARNING: in current version Frontend/services/ConfigApp.js is not updated automatically
+ WARNING: in current version Frontend/services/AppConfig.js is not updated automatically
you should make sure than your backend config fit with your frontend config.
- Note: FCS version should have ConfigApp.js configurated automatically from GULP, but this is for "tomorrow"
+ Note: FCS version should have AppConfig.js configurated automatically from GULP, but this is for "tomorrow"
### Build project
gulp help
diff --git a/afb-client/app/Backend/RestApis/TokenMockApi.js b/afb-client/app/Backend/RestApis/TokenMockApi.js
index 74b565a..9e6406e 100644
--- a/afb-client/app/Backend/RestApis/TokenMockApi.js
+++ b/afb-client/app/Backend/RestApis/TokenMockApi.js
@@ -37,7 +37,7 @@ function NewApi(handle, prefix) {
scope.connected=false;
// Simulate Client Context Session Creation
- handle.app.post(prefix +'/create', function (req, res) {
+ handle.app.get(prefix +'/create', function (req, res) {
handle.trace (scope, 1, "%s/create body=%s", prefix, req.body.action);
var okResponse= '{ "jtype": "AJB_reply"' +
', "request": { "prefix": "afbs", "api": "create", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" }'+
@@ -57,7 +57,7 @@ function NewApi(handle, prefix) {
// Simulate Client Context Check
- handle.app.post(prefix +'/check', function (req, res) {
+ handle.app.get(prefix +'/check', function (req, res) {
handle.trace (scope, 1, "%s/check query=%s", prefix, req.query.token);
var okResponse= '{"jtype":"AJB_reply"'+
',"request":{"prefix":"afbs","api":"check", "status":"processed"}'+
@@ -73,7 +73,7 @@ function NewApi(handle, prefix) {
});
// Simulate Client Context Check
- handle.app.post(prefix +'/refresh', function (req, res) {
+ handle.app.get(prefix +'/refresh', function (req, res) {
handle.trace (scope, 1, "%s/refresh query=%s", prefix, req.query.token);
var okResponse= '{"jtype":"AJB_reply"'+
',"request":{"prefix":"afbs","api":"refresh","uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx","status":"processed"}'+
@@ -89,7 +89,7 @@ function NewApi(handle, prefix) {
});
// Simulate Client Context Session Closing
- handle.app.post(prefix +'/reset', function (req, res) {
+ handle.app.get(prefix +'/reset', function (req, res) {
handle.trace (scope, 1, "%s/reset query=%s", prefix, req.query.token);
var okResponse= '{"jtype":"AJB_reply"'+
',"request":{"prefix":"afbs","api":"reset","uuid": "e4ef5e66-xxxx","status":"processed"}'+
diff --git a/afb-client/app/Frontend/app.js b/afb-client/app/Frontend/app.js
index 6772243..91a8a72 100644
--- a/afb-client/app/Frontend/app.js
+++ b/afb-client/app/Frontend/app.js
@@ -24,7 +24,7 @@
'ui-notification',
// Application Components
- 'ConfigApp',
+ 'AppConfig',
'JQueryEmu',
'HomeModule',
'SampleModule',
@@ -41,7 +41,7 @@
config.$inject = ['$urlRouterProvider', '$locationProvider'];
- function config($urlProvider, $locationProvider, ConfigApp) {
+ function config($urlProvider, $locationProvider, AppConfig) {
$urlProvider.otherwise('/home');
// https://docs.angularjs.org/error/$location/nobase
diff --git a/afb-client/app/Frontend/etc/ConfigApp.js b/afb-client/app/Frontend/etc/AppConfig.js
index a6a0cad..bd1aae0 100644
--- a/afb-client/app/Frontend/etc/ConfigApp.js
+++ b/afb-client/app/Frontend/etc/AppConfig.js
@@ -2,10 +2,10 @@
'use strict';
// _all modules only reference dependencies
- angular.module('ConfigApp', [])
+ angular.module('AppConfig', [])
// Factory is a singleton and share its context within all instances.
- .factory('ConfigApp', function (urlquery) {
+ .factory('AppConfig', function (urlquery) {
var myConfig = {
paths: { // Warning paths should end with /
@@ -14,11 +14,7 @@
audio : 'images/audio/',
appli : 'images/appli/'
},
-
- myapi: { // Warning paths should end with /
- token : '/api/myplugin/xxxx'
- },
-
+
session: { // Those data are updated by session service
create : '/api/token/create',
refresh : '/api/token/refresh',
@@ -34,6 +30,19 @@
};
return myConfig;
+ })
+
+ // Factory is a singleton and share its context within all instances.
+ .factory('AppCall', function ($http, AppConfig) {
+ var myCalls = {
+ get : function(plugin, action, query, callback) {
+ if (!query.token) query.token = AppConfig.session.token; // add token to provided query
+ $http.get('/api/' + plugin + '/' + action , {params: query}).then (callback, callback);
+ }
+
+ };
+ return myCalls;
});
+
})(); \ No newline at end of file
diff --git a/afb-client/app/Frontend/pages/Home/HomeModule.js b/afb-client/app/Frontend/pages/Home/HomeModule.js
index 6a73bdf..fb03ac8 100644
--- a/afb-client/app/Frontend/pages/Home/HomeModule.js
+++ b/afb-client/app/Frontend/pages/Home/HomeModule.js
@@ -1,12 +1,12 @@
(function() {
'use strict';
-// WARNING: make sure than app/frontend/services/ConfigApp.js match your server
+// WARNING: make sure than app/frontend/services/AppConfig.js match your server
// list all rependencies within the page + controler if needed
angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
- .controller('HomeController', function ($http, ConfigApp) {
+ .controller('HomeController', function ($http, AppConfig) {
var scope = this; // I hate JavaScript
scope.uuid ="none";
scope.token ="none";
@@ -22,10 +22,10 @@ angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
scope.request = data.request;
scope.response = data.response;
- // if token was refresh let's update ConfigApp
- if (data.request.token) ConfigApp.session.token = data.request.token;
- if (data.request.uuid) ConfigApp.session.uuid = data.request.uuid;
- if (data.request.timeout) ConfigApp.session.timeout = data.request.timeout;
+ // if token was refresh let's update AppConfig
+ if (data.request.token) AppConfig.session.token = data.request.token;
+ if (data.request.uuid) AppConfig.session.uuid = data.request.uuid;
+ if (data.request.timeout) AppConfig.session.timeout = data.request.timeout;
// Make sure we clean everything when Open/Close is called
if (apiname === "APIcreate" || apiname === "APIreset") {
@@ -56,7 +56,7 @@ angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
scope.OpenSession = function() {
console.log ("OpenSession");
var postdata= {/* any json your application may need */};
- var handler = $http.post(ConfigApp.session.create + '?token='+ConfigApp.session.initial, postdata);
+ var handler = $http.post(AppConfig.session.create + '?token='+AppConfig.session.initial, postdata);
handler.success(scope.ProcessResponse);
handler.error(scope.ProcessError);
@@ -65,7 +65,7 @@ angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
scope.CheckSession = function() {
console.log ("CloseSession");
var postdata= {/* any json your application may need */};
- var handler = $http.post(ConfigApp.session.check + '?token='+ConfigApp.session.token, postdata);
+ var handler = $http.post(AppConfig.session.check + '?token='+AppConfig.session.token, postdata);
handler.success(scope.ProcessResponse);
handler.error(scope.ProcessError);
@@ -74,7 +74,7 @@ angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
scope.RefreshSession = function() {
console.log ("RefreshSession");
var postdata= {/* any json your application may need */};
- var handler = $http.post(ConfigApp.session.refresh + '?token='+ConfigApp.session.token, postdata);
+ var handler = $http.post(AppConfig.session.refresh + '?token='+AppConfig.session.token, postdata);
handler.success(scope.ProcessResponse);
handler.error(scope.ProcessError);
@@ -83,7 +83,7 @@ angular.module('HomeModule', ['SubmitButton', 'TokenRefresh'])
scope.ResetSession = function() {
console.log ("ResetSession");
var postdata= {/* any json your application may need */};
- var handler = $http.post(ConfigApp.session.reset + '?token='+ConfigApp.session.token, postdata);
+ var handler = $http.post(AppConfig.session.reset + '?token='+AppConfig.session.token, postdata);
handler.success(scope.ProcessResponse);
handler.error(scope.ProcessError);
diff --git a/afb-client/app/Frontend/widgets/FormInput/UploadFiles.js b/afb-client/app/Frontend/widgets/FormInput/UploadFiles.js
index 8c0a4c2..a23809f 100644
--- a/afb-client/app/Frontend/widgets/FormInput/UploadFiles.js
+++ b/afb-client/app/Frontend/widgets/FormInput/UploadFiles.js
@@ -126,9 +126,9 @@ function LoadFileSvc (scope, elem, posturl, files, thumbnailCB) {
xmlReq.send(xform);
}
-angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
+angular.module('UploadFiles',['AppConfig', 'ModalNotification', 'RangeSlider'])
-.directive('uploadImage', function(ConfigApp, JQemu, Notification) {
+.directive('uploadImage', function(AppConfig, JQemu, Notification) {
function mymethods(scope, elem, attrs) {
// get widget image handle from template
@@ -152,7 +152,7 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
scope.imgElem[0].src = window.URL.createObjectURL(new Blob([upload.target.result], {type: "image"}));
return true; // true activates post
};
- var posturl = attrs.posturl + "?token=" + ConfigApp.session.token;
+ var posturl = attrs.posturl + "?token=" + AppConfig.session.token;
new LoadFileSvc (scope, elem, posturl, files, readerCB);
};
@@ -163,14 +163,14 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
scope.maxsize= attrs.maxsize || 100; // default max size 100KB
scope.regexp = new RegExp (attrs.accept+ '.*','i');
- if (attrs.thumbnail) scope.thumbnail= ConfigApp.paths[scope.category] + attrs.thumbnail;
- else scope.thumbnail=ConfigApp.paths[scope.category] + 'tux-bzh.png';
+ if (attrs.thumbnail) scope.thumbnail= AppConfig.paths[scope.category] + attrs.thumbnail;
+ else scope.thumbnail=AppConfig.paths[scope.category] + 'tux-bzh.png';
- if (attrs.thumbnail) scope.isnotvalid= ConfigApp.paths[scope.category] + attrs.isnotvalid;
- else scope.isnotvalid=ConfigApp.paths[scope.category] + 'isnotvalid.png';
+ if (attrs.thumbnail) scope.isnotvalid= AppConfig.paths[scope.category] + attrs.isnotvalid;
+ else scope.isnotvalid=AppConfig.paths[scope.category] + 'isnotvalid.png';
- if (attrs.istoobig) scope.istoobig= ConfigApp.paths[scope.category] + attrs.istoobig;
- else scope.istoobig=ConfigApp.paths[scope.category] + 'istoobig.png';
+ if (attrs.istoobig) scope.istoobig= AppConfig.paths[scope.category] + attrs.istoobig;
+ else scope.istoobig=AppConfig.paths[scope.category] + 'istoobig.png';
scope.noslider = attrs.noslider || false;
if (!attrs.posturl) throw new TypeError('file-upload %s posturl=/api/xxxx/xxxx required', scope.attrs);
@@ -185,7 +185,7 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
};
})
-.directive('uploadAudio', function(ConfigApp, JQemu, Notification) {
+.directive('uploadAudio', function(AppConfig, JQemu, Notification) {
function mymethods(scope, elem, attrs) {
// get widget image handle from template
@@ -204,7 +204,7 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
// Upload is delegated to a shared function
scope.UpLoadFile=function (files) {
- var posturl = attrs.posturl + "?token=" + ConfigApp.session.token;
+ var posturl = attrs.posturl + "?token=" + AppConfig.session.token;
new LoadFileSvc (scope, elem, posturl, files, false);
};
@@ -215,14 +215,14 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
scope.maxsize= attrs.maxsize || 10000; // default max size 10MB
scope.regexp = new RegExp (attrs.accept+ '.*','i');
- if (attrs.thumbnail) scope.thumbnail= ConfigApp.paths[scope.category] + attrs.thumbnail;
- else scope.thumbnail=ConfigApp.paths[scope.category] + 'upload-music.png';
+ if (attrs.thumbnail) scope.thumbnail= AppConfig.paths[scope.category] + attrs.thumbnail;
+ else scope.thumbnail=AppConfig.paths[scope.category] + 'upload-music.png';
- if (attrs.thumbnail) scope.isnotvalid= ConfigApp.paths[scope.category] + attrs.isnotvalid;
- else scope.isnotvalid=ConfigApp.paths[scope.category] + 'isnotvalid.png';
+ if (attrs.thumbnail) scope.isnotvalid= AppConfig.paths[scope.category] + attrs.isnotvalid;
+ else scope.isnotvalid=AppConfig.paths[scope.category] + 'isnotvalid.png';
- if (attrs.istoobig) scope.istoobig= ConfigApp.paths[scope.category] + attrs.istoobig;
- else scope.istoobig=ConfigApp.paths[scope.category] + 'istoobig.png';
+ if (attrs.istoobig) scope.istoobig= AppConfig.paths[scope.category] + attrs.istoobig;
+ else scope.istoobig=AppConfig.paths[scope.category] + 'istoobig.png';
scope.noslider = attrs.noslider || false;
if (!attrs.posturl) throw new TypeError('file-upload %s posturl=/api/xxxx/xxxx required', scope.attrs);
@@ -238,7 +238,7 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
})
-.directive('uploadAppli', function(ConfigApp, JQemu, Notification) {
+.directive('uploadAppli', function(AppConfig, JQemu, Notification) {
function mymethods(scope, elem, attrs) {
// get widget image handle from template
@@ -265,14 +265,14 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
// Check is we have a thumbnail within loaded Zipfile
if (!thumbnail) {
console.log ("This is not a valid Application Framework APP");
- scope.thumbnail=ConfigApp.paths[scope.category] + 'isnotvalid.png';
+ scope.thumbnail=AppConfig.paths[scope.category] + 'isnotvalid.png';
scope.$apply('thumbnail'); // we short-circuit Angular resync Image
return false; // do not post zip on binder
}
scope.imgElem[0].src = window.URL.createObjectURL(new Blob([thumbnail.asArrayBuffer()], {type: "image"}));
return true; // true activates post
};
- var posturl = attrs.posturl + "?token=" + ConfigApp.session.token;
+ var posturl = attrs.posturl + "?token=" + AppConfig.session.token;
new LoadFileSvc (scope, elem, posturl, files, readerCB);
};
@@ -283,14 +283,14 @@ angular.module('UploadFiles',['ConfigApp', 'ModalNotification', 'RangeSlider'])
scope.maxsize= attrs.maxsize || 100000; // default max size 100MB
scope.regexp = new RegExp (attrs.accept+ '.*','i');
- if (attrs.thumbnail) scope.thumbnail= ConfigApp.paths[scope.category] + attrs.thumbnail;
- else scope.thumbnail=ConfigApp.paths[scope.category] + 'upload-appli.png';
+ if (attrs.thumbnail) scope.thumbnail= AppConfig.paths[scope.category] + attrs.thumbnail;
+ else scope.thumbnail=AppConfig.paths[scope.category] + 'upload-appli.png';
- if (attrs.thumbnail) scope.isnotvalid= ConfigApp.paths[scope.category] + attrs.isnotvalid;
- else scope.isnotvalid=ConfigApp.paths[scope.category] + 'isnotvalid.png';
+ if (attrs.thumbnail) scope.isnotvalid= AppConfig.paths[scope.category] + attrs.isnotvalid;
+ else scope.isnotvalid=AppConfig.paths[scope.category] + 'isnotvalid.png';
- if (attrs.istoobig) scope.istoobig= ConfigApp.paths[scope.category] + attrs.istoobig;
- else scope.istoobig=ConfigApp.paths[scope.category] + 'istoobig.png';
+ if (attrs.istoobig) scope.istoobig= AppConfig.paths[scope.category] + attrs.istoobig;
+ else scope.istoobig=AppConfig.paths[scope.category] + 'istoobig.png';
scope.noslider = attrs.noslider || false;
if (!attrs.posturl) throw new TypeError('file-upload %s posturl=/api/xxxx/xxxx required', scope.attrs);
diff --git a/afb-client/dist.prod/opa/AFBclient.min.js b/afb-client/dist.prod/opa/AFBclient.min.js
index 67b51ae..f6d5d1c 100644
--- a/afb-client/dist.prod/opa/AFBclient.min.js
+++ b/afb-client/dist.prod/opa/AFBclient.min.js
@@ -1,2 +1,2 @@
-!function(){"use strict";var e='<div ng-click="clicked()"> <span><i class="{{icon}}"></i><span>{{label}}</span></div>';angular.module("SubmitButton",[]).directive("submitButton",function(){function t(e,t,n){e.icon=n.icon||"fi-foot",e.label=n.label||"Next",t.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:t,scope:{clicked:"="}}})}(),function(){"use strict";function e(e){var t=[],n=[];this.getId=function(){return e.sliderid},this.getCbHandle=function(){return e.cbhandle},this.getView=function(a){return a||(a=0),e.value[a]===t[a]?n[a]:(t[a]=e.value[a],e.formatter?n[a]=e.formatter(e.value[a],e.ctrlhandle):n[a]=e.value[a],n[a])},this.updateClass=function(t,n){e.updateClass(t,n)},this.forceRefresh=function(t){e.forceRefresh(t)},this.getValue=function(t){return t||(t=0),e.value[t]},this.getRelative=function(t){return t||(t=0),e.relative[t]},this.setValue=function(t,n){n||(n=0),e.setValue(t,n)},this.setDisable=function(t){e.setDisable(t)}}var t=angular.module("RangeSlider",[]);t.directive("rangeSlider",["$log","$document","$timeout",function(t,n,a){function i(t,i,s,o){t.initWidget=function(e){e.byStep&&(t.byStep=parseInt(e.byStep)),e.notMore&&(t.notMore=parseInt(e.notMore)),e.notLess&&(t.notLess=parseInt(e.notLess)),e.id&&(t.sliderid=e.id),void 0!==e.value&&(t.value=e.value,t.forceRefresh(50))},t.forceRefresh=function(e){var n=t.value;t.value=[void 0,void 0],a(function(){t.setValue(n[0],0),t.dual&&t.setValue(n[1],1)},e)},t.updateClass=function(e,t){t?i.addClass(e):i.removeClass(e)},t.setDisable=function(e){e?(i.addClass("disable"),t.handles[0].css("visibility","hidden"),t.dual&&t.handles[1].css("visibility","hidden")):(i.removeClass("disable"),t.handles[0].css("visibility","visible"),t.dual&&t.handles[1].css("visibility","visible"))},t.normalize=function(e){var n,a=t.notMore-t.notLess,i=e*a;if(t.byStep>0){var s=(i-i%t.byStep)/t.byStep,o=i%t.byStep,l=o>=.5*t.byStep?t.byStep:0;return n=s*t.byStep+l+t.notLess}if(t.byStep<0){var r=Math.pow(10,-1*t.byStep);return n=t.notLess+parseInt(i*r)/r}return i},t.getValue=function(e,n){t.vertical?t.relative[n]=(e-t.bounds.handles[n].getBoundingClientRect().height)/(t.bounds.bar.getBoundingClientRect().height-t.bounds.handles[n].getBoundingClientRect().height):t.relative[n]=e/(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[n].getBoundingClientRect().width);var a=t.normalize(t.relative[n]);a!==t.value[n]&&(a<t.startValue&&(a=t.startValue),a>t.stopValue&&(a=t.stopValue),t.formatter?t.viewValue=t.formatter(a,t.ctrlhandle):t.viewValue=a,t.displays[n]&&t.displays[n].html(t.viewValue),t.value[n]=a,o&&o.$setViewValue(t.viewValue),t.$apply(),a>t.startValue&&a<t.stopValue&&t.translate(e,n))},t.setStart=function(e){var n;e>t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(n=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",n+"px")):(n=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("width",n+"px")),t.startValue=e},t.setStop=function(e){var n;e<t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(n=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",n+"px")):(n=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.stop.css({right:0,width:t.bounds.bar.getBoundingClientRect().width-n+"px"})),t.stopValue=e},t.translate=function(e,n){var a;if(t.vertical){var i=t.bounds.bar.getBoundingClientRect().height-e;if(t.handles[n].css({"-webkit-transform":"translateY("+i+"px)","-moz-transform":"translateY("+i+"px)","-ms-transform":"translateY("+i+"px)","-o-transform":"translateY("+i+"px)",transform:"translateY("+i+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var s=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().height;a=t.relative[0]*t.bounds.bar.getBoundingClientRect().height,t.slider.css({bottom:a+"px",height:s+"px"})}}else t.slider.css("height",e+"px")}else if(t.handles[n].css({"-webkit-transform":"translateX("+e+"px)","-moz-transform":"translateX("+e+"px)","-ms-transform":"translateX("+e+"px)","-o-transform":"translateX("+e+"px)",transform:"translateX("+e+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var o=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().width;a=t.relative[0]*t.bounds.bar.getBoundingClientRect().width,t.slider.css({left:a+"px",width:o+"px"})}}else t.slider.css("width",e+"px")},t.setValue=function(e,n){var a;e!==t.value[n]&&(void 0===e&&(e=0),e>t.notMore&&(e=t.notMore),e<t.notLess&&(e=t.notLess),t.vertical?(t.relative[n]=(e-t.notLess)/(t.notMore-t.notLess),0===n&&(a=t.relative[n]*t.bounds.bar.getBoundingClientRect().height+t.bounds.handles[n].getBoundingClientRect().height/2),1===n&&(a=t.relative[n]*t.bounds.bar.getBoundingClientRect().height)):(t.relative[n]=(e-t.notLess)/(t.notMore-t.notLess),a=t.relative[n]*(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[n].getBoundingClientRect().width)),t.translate(a,n),t.value[n]=e,t.formatter?t.viewValue=t.formatter(e,void 0):t.viewValue=e,o&&o.$setViewValue(t.viewValue),t.displays[n]&&t.displays[n].html(t.viewValue))},t.keydown=function(e){switch(e.keyCode){case 39:case 38:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]+t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]+1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 37:case 40:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]-t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]-1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 27:t.handles[t.actif][0].blur()}},t.moveHandle=function(e,n,a){var i;t.vertical?(i=t.bounds.bar.getBoundingClientRect().bottom-a,i>t.bounds.bar.getBoundingClientRect().height&&(i=t.bounds.bar.getBoundingClientRect().height),i<t.bounds.handles[e].getBoundingClientRect().height&&(i=t.bounds.handles[e].getBoundingClientRect().height)):(i=n-t.bounds.bar.getBoundingClientRect().left,0>i&&(i=0),n+t.bounds.handles[e].getBoundingClientRect().width>t.bounds.bar.getBoundingClientRect().right&&(i=t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[e].getBoundingClientRect().width)),t.getValue(i,e),t.dual&&t.value[0]>t.value[1]&&(0===e?t.setValue(t.value[0],1):t.setValue(t.value[1],0))},t.focusCB=function(e){e?n.on("keydown",t.keydown):n.unbind("keydown",t.keydown)},t.touchBarCB=function(e){var n,a=0,i=e.changedTouches,s=t.value[a];if(e.preventDefault(),t.dual){n=t.vertical?(i[0].pageY-t.bounds.bar.getBoundingClientRect().bottom)/t.bounds.bar.getBoundingClientRect().height:(i[0].pageX-t.bounds.bar.getBoundingClientRect().left)/t.bounds.bar.getBoundingClientRect().width;var o=Math.abs(n-t.relative[0]),l=Math.abs(n-t.relative[1]);o>l&&(a=1)}t.moveHandle(a,i[0].pageX,i[0].pageY),t.callback&&s!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)},t.touchHandleCB=function(e,a){function s(e){e.preventDefault();for(var n=e.changedTouches,i=0;i<n.length;i++)t.moveHandle(a,n[i].pageX,n[i].pageY)}function o(e){n.unbind("touchmove",s),n.unbind("touchend",o),i.on("touchstart",t.touchBarCB),t.callback&&l!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)}var l=t.value[a];e.preventDefault(),n.on("touchmove",s),n.on("touchend",o),i.unbind("touchstart",t.touchBarCB)},t.handleCB=function(e,a){function i(e){t.moveHandle(a,e.clientX,e.clientY)}function o(){n.unbind("mousemove",i),n.unbind("mouseup",o),t.callback&&l!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)}if(!s.automatic){var l=t.value[a];e.preventDefault(),n.on("mousemove",i),n.on("mouseup",o),t.handles[a][0].focus(),t.actif=a}},t.find=function(e,t){var n;n=t?t[0].querySelector(e):i[0].querySelector(e);var a=angular.element(n);return a},t.initialSettings=function(e){var n;t.value=[],t.relative=[],null===t.precision&&(n=(""+t.byStep).match(/\.([\d]*)/),t.precision=n&&n[1]?n[1].length:0),i.on("touchstart",t.touchBarCB),t.handles[0].on("touchstart",function(e){t.touchHandleCB(e,0)}),t.dual&&(t.handles[1].addClass("range-slider-handle"),t.handles[1].on("touchstart",function(e){t.touchHandleCB(e,1)}),t.initvalues||t.setValue(e[1],1)),t.initvalues?t.initWidget(t.initvalues):t.setValue(e[0],0)},t.init=function(){if(t.sliderid=s.id||"slider-"+parseInt(1e3*Math.random()),t.startValue=-(1/0),t.stopValue=1/0,t.byStep=parseInt(s.byStep)||1,t.vertical=s.vertical||!1,t.dual=s.dualHandles||!1,t.trigger_input_change=!1,t.notMore=parseInt(s.notMore)||100,t.notLess=parseInt(s.notLess)||0,t.vertical&&i.addClass("vertical-range"),t.handles=[t.find(".handle-min"),t.find(".handle-max")],t.bar=i,t.slider=t.find(".range-slider-active-segment"),t.start=t.find(".ibz-range-slider-start"),t.stop=t.find(".ibz-range-slider-stop"),t.disable=s.disable||!1,t.ctrlhandle=new e(t),t.bounds={bar:i[0],handles:[t.handles[0][0],t.handles[1][0]]},"true"===s.disable&&t.setDisable(!0),s.displayTarget)switch(s.displayTarget){case!0:case"handle":t.displays=t.handles,t.handles[0].addClass("ibz-range-slider-display"),t.dual&&t.handles[1].addClass("ibz-range-slider-display");break;default:t.displays=[n.getElementById(s.displayTarget)]}else t.displays=[];if(s.initial){var a=s.initial.split(",");t.initial=[void 0!==a[0]?parseInt(a[0]):t.notLess,void 0!==a[1]?parseInt(a[1]):t.notMore]}else t.initial=[t.ngModel,t.ngModel];t.$watch("startAt",function(){t.value<t.startAt,t.startAt&&t.setStart(t.startAt)}),t.$watch("stopAt",function(){t.value>t.stopAt,t.stopAt&&t.setStop(t.stopAt)}),t.initialSettings(t.initial)},t.init(),t.$watch("inithook",function(){t.inithook&&t.inithook(t.ctrlhandle)}),t.$watch("initvalues",function(){t.initvalues&&t.initWidget(t.initvalues)}),t.$watch("ngModel",function(e){t.setValue(e,0)})}var s='<div class="ibz-range-slider range-slider" title="{{title}}"data-slider><span class="range-slider-handle handle-min" ng-mousedown="handleCB($event,0)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="handle-max" ng-mousedown="handleCB($event,1)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="range-slider-active-segment"></span><span class="ibz-range-slider-start" ></span> <span class="ibz-range-slider-stop"></span> <input id={{sliderid}} type="hidden"></div>';return{restrict:"E",scope:{startAt:"=",stopAt:"=",callback:"=",formatter:"=",inithook:"=",cbhandle:"=",initvalues:"=",ngModel:"="},require:"?ngModel",template:s,replace:!0,link:i}}])}(),function(){"use strict";var e='<div class="afb-monitor" ng-click="getping()"><span class="afb-refresh-token" >afb://{{hostname}}:{{httpdport}}</span><i class="{{icon}}"></i></div>';angular.module("TokenRefresh",["ConfigApp","ModalNotification"]).directive("tokenRefresh",["$timeout","$http","$location","Notification","ConfigApp",function(t,n,a,i,s){function o(e,o,l){e.status=void 0,e.online=function(){o.addClass("online"),o.removeClass("offline")},e.offline=function(){o.addClass("offline"),o.removeClass("online")},e.onerror=function(t,n,a){e.status!==!1&&(i.warning({message:"AppFramework Binder Lost",delay:5e3}),e.offline()),e.status=0},e.onsuccess=function(t,n,a,o){e.status!==!0&&(t.request.token&&(s.session.token=t.request.token),t.request.uuid&&(s.session.uuid=t.request.uuid),t.request.timeout&&(s.session.timeout=t.request.timeout),i.success({message:"AppFramework Binder Back to Live",delay:3e3}),e.online()),e.status=1},e.getping=function(){var a=n.get(s.session.ping+"?token="+s.session.token);a.success(e.onsuccess),a.error(e.onerror),t(e.getping,1e3*s.session.pingrate)},e.refresh=function(){var a=n.get(s.session.refresh+"?token="+s.session.token);a.success(e.onsuccess),a.error(e.onerror),t(e.refresh,250*s.session.timeout)},e.tkcreate=function(){var t=n.get(s.session.create+"?token="+s.session.initial);t.success(e.onsuccess),t.error(e.onerror)},e.icon=l.icon||"fi-lightbulb",e.hostname=a.host(),e.httpdport=a.port(),e.autolog=JSON.parse(l.autolog||!1),e.autolog&&e.tkcreate(),t(e.getping,1e3*s.session.pingrate),t(e.refresh,250*s.session.timeout)}return{template:e,scope:{callback:"="},restrict:"E",link:o}}])}(),function(){"use strict";var e='<div class="tip-modal-popup"><i class="{{icon}}"></i><span>{{tip}}</span></span></div>';angular.module("ModalNotification",[]).directive("tipModal",["$timeout",function(t){function n(e,n,a){function i(){function n(){e.show&&e.modal.css({opacity:1,visibility:"visible"})}e.show=!0,e.timeout=t(n,e.delay)}function s(){e.show=!1,e.modal.css({opacity:0,visibility:"hidden"})}e.parent=n.parent(),e.modal=n.find("div"),e.icon=a.icon||"fi-lightbulb",e.parent.addClass("as-modal-tip"),e.parent.bind("click",s),e.parent.bind("focus",i),e.parent.bind("mouseover",i),e.parent.bind("mouseleave",s),e.parent.bind("blur",s),e.delay=a.delay||1e3}return{restrict:"E",template:e,link:n,scope:{tip:"="}}}])}(),function(){"use strict";var e='<span title="Goto: {{href}}" ng-click="clicked()"><i class="{{icon}}"></i><span>{{label}}</span></span>';angular.module("LinkButton",[]).directive("linkButton",["$location",function(t){function n(e,n,a){e.clicked=function(){a.query?t.path(a.href).search(a.query):t.path(a.href)},e.icon=a.icon||"fi-link",e.label=a.label||"Jump",e.href=a.href||"/home",n.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:n,scope:{}}}])}(),function(){"use strict";function e(e,t,n,a,i){var s=new XMLHttpRequest,o=new FormData,l=function(e){i(e)};s.upload.onprogress=function(t){var n=Math.round(t.lengthComputable?100*t.loaded/t.total:0);e.slider&&e.slider.setValue(n)},s.onload=function(){t.addClass("success"),t.removeClass("error");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)},s.onerror=function(){t.addClass("error"),t.removeClass("success");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)},s.onabort=function(){t.addClass("error"),t.removeClass("success");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)};for(var r=0;r<a.length;r++){var u=a[r];if(u.type.match(e.mimetype)){if(u.size>1024*e.maxsize)return e.thumbnail=e.istoobig,void e.$apply("thumbnail");if(isNaN(u.size))return e.thumbnail=e.isnotvalid,void e.$apply("thumbnail");if(e.Basename=u.name.split("/").reverse()[0],e.imgElem[0].file=u,i){var c=new FileReader;c.readAsArrayBuffer(u),c.onload=l}o.append(e.name,u,u.name)}}s.open("POST",n,!0),s.send(o)}var t='<input type="file" name="{{name}}-input" onchange="angular.element(this).scope().UpLoadFile(this.files)" accept="{{mimetype}}" style="display:none"><div class="upload-file" ng-click="imgClicked()"><img id="{{name}}-img" src="{{thumbnail}}"><range-slider ng-show="!noslider" id="{{name}}-slider" automatic=true inithook="SliderInitCB"></range-slider></div>';angular.module("UploadFiles",["ConfigApp","ModalNotification","RangeSlider"]).directive("uploadImage",["ConfigApp","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=function(e){return t.imgElem[0].src=window.URL.createObjectURL(new Blob([e.target.result],{type:"image"})),!0},l=i.posturl+"?token="+n.session.token;new e(t,a,l,s,o)},t.name=i.name||"avatar",t.category=i.category||"image",t.mimetype=(i.accept||"image")+"/*",t.maxsize=i.maxsize||100,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"tux-bzh.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}]).directive("uploadAudio",["ConfigApp","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=i.posturl+"?token="+n.session.token;new e(t,a,o,s,!1)},t.name=i.name||"audio",t.category=i.category||"audio",t.mimetype=(i.accept||"audio")+"/*",t.maxsize=i.maxsize||1e4,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"upload-music.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}]).directive("uploadAppli",["ConfigApp","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=function(e){var a=new JSZip(e.target.result),i=a.file("afa-pkg/thumbnail.jpg");return i?(t.imgElem[0].src=window.URL.createObjectURL(new Blob([i.asArrayBuffer()],{type:"image"})),!0):(t.thumbnail=n.paths[t.category]+"isnotvalid.png",t.$apply("thumbnail"),!1)},l=i.posturl+"?token="+n.session.token;new e(t,a,l,s,o)},t.name=i.name||"appli",t.category=i.category||"appli",t.mimetype=i.accept||".zip",t.maxsize=i.maxsize||1e5,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"upload-appli.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}])}(),function(){"use strict";var e='<tip-modal tip="tip"></tip-modal><label for="{{name}}-intext">{{label}} <i ng-show="required" ng-click="ToBeDefined" class="required {{status}} fi-checkbox" title="Free Value But Mandatory Argument" alt="?"> &nbsp; </i></label><input type="{{type}}" id="{{name}}-intext" placeholder="{{placeholder}}" class="status-{{status}}" ng-model="value" ng-blur="validate()" ng-focus="selected()" ng-model-options="{ updateOn: \'default blur\', debounce: {default: 500, blur: 0} }"><alert data-ng-show="!valid&&errmsg">{{errmsg}}</alert>',t=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;angular.module("InputText",["JQueryEmu"]).directive("inputText",["JQemu",function(n){function a(e,a,i){e.error=!1,e.valid=!1,e.status="untouch",e.input=a.find("input"),e.required=0,"required"in i&&(e.required=1,a.addClass("required")),e.selected=function(){e.error=!1,e.errmsg=!1,e.status="touch"},e.validate=function(){e.parent.removeClass("ng-pristine"),e.value?(e.error=!1,e.value=e.value.trim(),"nospace"in i&&(e.value=e.value.replace(/\s/g,"")),"lowercase"in i&&(e.value=e.value.toLowerCase()),"minlen"in i&&e.value.length<i.minlen&&(e.status="invalid",e.errmsg=e.name+": Mininum Lengh= "+i.minlen+" Characters",e.error=!0),"email"in i&&(t.test(e.value)||(e.status="invalid",e.errmsg="invalid email address",e.error=!0))):e.required&&(e.status="invalid",e.errmsg=e.name+": Required Attribute",e.error=!0),e.error?(e.required&&e.valid&&(e.valid=!1,e.l4acounter.validated>0&&e.l4acounter.validated--),e.callback(i.name,null,e.done)):(e.required&&!e.valid&&e.l4acounter.validated++,e.status="valid",e.valid=!0,e.callback(i.name,e.value,e.done))},e.done=function(t){for(var n in t)e[n]=t[n]},e.label=i.label,e.name=i.name,e.placeholder=i.placeholder,e.type=i.type||"text",e.tip=i.tip,e.parent=n.parent(a,"FORM"),"email"in i&&(i.lowercase=!0,i.nospace=!0,i.minlen=6),e.required&&(e.l4acounter=e.parent.data("l4acounter"),e.l4acounter?e.l4acounter.required++:(e.l4acounter={required:1,validated:0},e.parent.data("l4acounter",e.l4acounter))),e.$watch("value",function(){e.value&&e.validate()})}return{restrict:"E",template:e,link:a,scope:{callback:"=",value:"="}}}])}(),function(){"use strict";var e='<input-text class="password" tip="{{tip1}}" placeholder="{{place1}}"label="{{label1}}" callback="valid1" name="{{name}}-1" value="pass1" required minlen="{{minlen}}" type="password" ></input-text><input-text class="password" tip="tip2" placeholder="{{place2}}"label="{{label2}}" callback="valid2" name="{{name}}-2" value="pass2" required minlen="{{minlen}}" type="password" > </input-text>';angular.module("InputPassword",[]).directive("inputPassword",function(){function t(e,t,n){e.valid1=function(t,n){e.firstpwd=n},e.valid2=function(t,a,i){e.firstpwd!==a?i({valid:!1,status:"invalid",errmsg:"both password should match"}):e.callback(n.name,a)},e.done=function(t){for(var n in t)e[n]=t[n]},e.name=n.name,e.label1=n.label||"Password",e.label2=n.label||"Password Verification",e.place1=n.placeholder1||"User Password",e.tip1=n.tip||"Choose a Password",e.place2=n.placeholder1||"Password Verification",e.tip2=n.tip||"Confirme your Password",e.minlen=n.minlen||10,"required"in n&&(e.required="required")}return{restrict:"E",template:e,link:t,scope:{callback:"="}}})}(),function(){"use strict";angular.module("SampleModule",["SubmitButton","UploadFiles"]).controller("SampleController",["$http",function(e){var t=this;t.FileUploaded=function(e){}}])}(),function(){"use strict";angular.module("HomeModule",["SubmitButton","TokenRefresh"]).controller("HomeController",["$http","ConfigApp",function(e,t){var n=this;n.uuid="none",n.token="none",n.session="none",n.status="err-no",n.ProcessResponse=function(e,a,i,s){var o="API"+e.request.api.replace("-","_");n.status="err-ok",n.errcode=a,n.request=e.request,n.response=e.response,e.request.token&&(t.session.token=e.request.token),e.request.uuid&&(t.session.uuid=e.request.uuid),e.request.timeout&&(t.session.timeout=e.request.timeout),("APIcreate"===o||"APIreset"===o)&&(n.APIreset="",n.APIcreate="",n.APIrefresh="",n.APIcheck=""),n[o]="success",e.request.token&&(n.token=e.request.token)},n.ProcessError=function(e,t,a,i){var s="API"+e.request.api.replace("-","_");n.status="err-fx",n.errcode=t,n.request=e.request,n.response="",n[s]="fail"},n.OpenSession=function(){var a={},i=e.post(t.session.create+"?token="+t.session.initial,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.CheckSession=function(){var a={},i=e.post(t.session.check+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.RefreshSession=function(){var a={},i=e.post(t.session.refresh+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.ResetSession=function(){var a={},i=e.post(t.session.reset+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)}}])}(),function(){"use strict";angular.module("JQueryEmu",[]).factory("JQemu",function(){var e=function(e,t){for(var n=e,a=t.toUpperCase();n[0];){if(a===n[0].tagName)return n;n=n.parent()}},t=function(e,t,n){for(var a=n.toLowerCase(),i=t.toLowerCase()+"Name",s=e.children();s[0];){if(a===s[0][i])return s;s=s.next()}},n=function(e,t){for(var n=t.toLowerCase(),a=e.children();a[0];){if(a.hasClass(n))return a;a=a.next()}},a={FindInParent:e,FindByTag:t,FindByClass:n};return a})}();var foundationRoutes=[{name:"mysample",url:"/sample",controller:"SampleController as ctrl",animationIn:"slideInRight",path:"pages/Sample/Sample.html"},{name:"myhome",url:"/home",controller:"HomeController as ctrl",animationIn:"slideInRight",path:"pages/Home/Home.html"}];!function(){"use strict";angular.module("ConfigApp",[]).factory("ConfigApp",["urlquery",function(e){var t={paths:{image:"images/",avatar:"images/avatars/",audio:"images/audio/",appli:"images/appli/"},myapi:{token:"/api/myplugin/xxxx"},session:{create:"/api/token/create",refresh:"/api/token/refresh",check:"/api/token/check",reset:"/api/token/reset",ping:"/api/token/check",initial:e.token||"123456789",timeout:3600,pingrate:60,uuid:"",token:""}};return t}])}(),function(){"use strict";function e(){var e={};return location.search.substr(1).split("&").forEach(function(t){var n=t.split("=")[0],a=decodeURIComponent(t.split("=")[1]);n in e?e[n].push(a):e[n]=[a]}),e}function t(e,t,n){e.otherwise("/home"),t.html5Mode(!0).hashPrefix("!")}function n(){FastClick.attach(document.body)}angular.module("AFBclient",["ui.router","ngAnimate","foundation","foundation.dynamicRouting","foundation.dynamicRouting.animations","ui-notification","ConfigApp","JQueryEmu","HomeModule","SampleModule","UploadFiles","LinkButton","TokenRefresh","RangeSlider","ModalNotification"]).value("urlquery",e()).config(t).run(n),t.$inject=["$urlRouterProvider","$locationProvider"]}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Sample/Sample.html",'<h1><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px"> Post File Upload</h1><div class="sample-box box-content"><upload-image name="avatar" category="avatar" thumbnail="tux-visitor.png" maxsize="100" posturl="/api/post/upload-image" callback="ctrl.FileUploaded" accept="image" title="Change your Avatar"></upload-image><upload-audio name="music" posturl="/api/post/upload-music" callback="ctrl.FileUploaded" title="Upload your Music"></upload-audio><upload-appli name="appli" posturl="/api/post/upload-appli" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli></div><link-button href="home" icon="fi-home" label="home"></link-button>')}])}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Home/Home.html",'<h3><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px"> App Framework Binder Simple Client</h3><token-refresh autolog="true"></token-refresh><div class="button-box box-content"><submit-button class="session-button {{ctrl.APIcreate}}" icon="fi-unlock" label="Open" clicked="ctrl.OpenSession"></submit-button><submit-button class="session-button {{ctrl.APIcheck}}" icon="fi-checkbox" label="Check" clicked="ctrl.CheckSession"></submit-button><submit-button class="session-button {{ctrl.APIrefresh}}" icon="fi-arrows-compress" label="Refresh" clicked="ctrl.RefreshSession"></submit-button><submit-button class="session-button {{ctrl.APIreset}}" icon="fi-lock" label="Close" clicked="ctrl.ResetSession"></submit-button></div><div class="message-box box-content vertical grid-frame"><div class="response"><span class="grid-content noscroll req {{ctrl.status}}">req= {{ctrl.request}}</span> <span class="grid-content noscroll res {{ctrl.status}}">res= {{ctrl.response}}</span> <span class="grid-content noscroll status {{ctrl.status}}">status= {{ctrl.errcode}}</span></div></div><link-button href="sample" icon="fi-home" label="sample"></link-button>')}])}();
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvQnV0dG9ucy9TdWJtaXRCdXR0b25zL1N1Ym1pdEJ1dHRvbnMuanMiLCJ3aWRnZXRzL1JhbmdlU2xpZGVycy9SYW5nZVNsaWRlck1vZC5qcyIsIndpZGdldHMvTm90aWZpY2F0aW9ucy9Ub2tlblJlZnJlc2hTdmMuanMiLCJ3aWRnZXRzL05vdGlmaWNhdGlvbnMvTW9kYWxOb3RpZmljYXRpb24uanMiLCJ3aWRnZXRzL05hdmlnYXRpb24vTGlua0J1dHRvbi5qcyIsIndpZGdldHMvRm9ybUlucHV0L1VwbG9hZEZpbGVzLmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvSW5wdXRUZXh0LmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvSW5wdXRQYXNzd29yZC5qcyIsInBhZ2VzL1NhbXBsZS9TYW1wbGVNb2R1bGUuanMiLCJwYWdlcy9Ib21lL0hvbWVNb2R1bGUuanMiLCJzZXJ2aWNlcy9KUXVlcnlFbXUuanMiLCJldGMvcm91dGVzLmpzIiwiZXRjL0NvbmZpZ0FwcC5qcyIsImFwcC5qcyIsInBhZ2VzL1NhbXBsZS9TYW1wbGUuanMiLCJwYWdlcy9Ib21lL0hvbWUuanMiXSwibmFtZXMiOlsidG1wbCIsImFuZ3VsYXIiLCJtb2R1bGUiLCJkaXJlY3RpdmUiLCJteW1ldGhvZHMiLCJzY29wZSIsImVsZW0iLCJhdHRycyIsImljb24iLCJsYWJlbCIsImFkZENsYXNzIiwidG9Mb3dlckNhc2UiLCJyZXN0cmljdCIsInRlbXBsYXRlIiwibGluayIsImNsaWNrZWQiLCJSYW5nZVNsaWRlckhhbmRsZSIsImludGVybmFscyIsImV4dGVybmFscyIsInRoaXMiLCJnZXRJZCIsInNsaWRlcmlkIiwiZ2V0Q2JIYW5kbGUiLCJjYmhhbmRsZSIsImdldFZpZXciLCJoYW5kbGUiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImN0cmxoYW5kbGUiLCJ1cGRhdGVDbGFzcyIsImNsYXNzZSIsInN0YXR1cyIsImZvcmNlUmVmcmVzaCIsInRpbWVyIiwiZ2V0VmFsdWUiLCJnZXRSZWxhdGl2ZSIsInJlbGF0aXZlIiwic2V0VmFsdWUiLCJzZXREaXNhYmxlIiwiZmxhZyIsIlJhbmdlU2xpZGVyIiwiJGxvZyIsIiRkb2N1bWVudCIsIiR0aW1lb3V0IiwiZWxlbWVudCIsIm1vZGVsIiwiaW5pdFdpZGdldCIsImluaXR2YWx1ZXMiLCJieVN0ZXAiLCJwYXJzZUludCIsIm5vdE1vcmUiLCJub3RMZXNzIiwiaWQiLCJ1bmRlZmluZWQiLCJkdWFsIiwicmVtb3ZlQ2xhc3MiLCJkaXNhYmxlZCIsImhhbmRsZXMiLCJjc3MiLCJub3JtYWxpemUiLCJyZXN1bHQiLCJyYW5nZSIsInBvaW50IiwibW9kIiwicmVtIiwicm91bmQiLCJwb3dlciIsIk1hdGgiLCJwb3ciLCJvZmZzZXQiLCJ2ZXJ0aWNhbCIsImJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImJhciIsIndpZHRoIiwibmV3dmFsdWUiLCJzdGFydFZhbHVlIiwic3RvcFZhbHVlIiwidmlld1ZhbHVlIiwiZGlzcGxheXMiLCJodG1sIiwiJHNldFZpZXdWYWx1ZSIsIiRhcHBseSIsInRyYW5zbGF0ZSIsInNldFN0YXJ0Iiwic3RhcnQiLCJzZXRTdG9wIiwic3RvcCIsInJpZ2h0Iiwidm9mZnNldCIsIi13ZWJraXQtdHJhbnNmb3JtIiwiLW1vei10cmFuc2Zvcm0iLCItbXMtdHJhbnNmb3JtIiwiLW8tdHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2xpZGVyIiwiYm90dG9tIiwibGVmdCIsImtleWRvd24iLCJlIiwia2V5Q29kZSIsImFjdGlmIiwiY2FsbGJhY2siLCJibHVyIiwibW92ZUhhbmRsZSIsImNsaWVudFgiLCJjbGllbnRZIiwiZm9jdXNDQiIsImluc2lkZSIsIm9uIiwidW5iaW5kIiwidG91Y2hCYXJDQiIsImV2ZW50IiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwib2xkdmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInBhZ2VZIiwicGFnZVgiLCJkaXN0YW5jZTAiLCJhYnMiLCJkaXN0YW5jZTEiLCJ0b3VjaEhhbmRsZUNCIiwidG91Y2hldnQiLCJ0b3VjaG1vdmUiLCJpZHgiLCJsZW5ndGgiLCJ0b3VjaGVuZCIsImhhbmRsZUNCIiwiY2xpY2tldmVudCIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJhdXRvbWF0aWMiLCJmb2N1cyIsImZpbmQiLCJzZWxlY3QiLCJkb21lbGVtIiwicXVlcnlTZWxlY3RvciIsImFuZ2VsZW0iLCJpbml0aWFsU2V0dGluZ3MiLCJpbml0aWFsIiwiZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0IiwicHJlY2lzaW9uIiwibWF0Y2giLCJldnQiLCJpbml0IiwicmFuZG9tIiwiSW5maW5pdHkiLCJkdWFsSGFuZGxlcyIsInRyaWdnZXJfaW5wdXRfY2hhbmdlIiwiZGlzYWJsZSIsImRpc3BsYXlUYXJnZXQiLCJnZXRFbGVtZW50QnlJZCIsInNwbGl0IiwibmdNb2RlbCIsIiR3YXRjaCIsInN0YXJ0QXQiLCJzdG9wQXQiLCJpbml0aG9vayIsIm5ld1ZhbHVlIiwicmVxdWlyZSIsInJlcGxhY2UiLCIkaHR0cCIsIiRsb2NhdGlvbiIsIk5vdGlmaWNhdGlvbiIsIkNvbmZpZ0FwcCIsIm9ubGluZSIsIm9mZmxpbmUiLCJvbmVycm9yIiwiZGF0YSIsImVycmNvZGUiLCJoZWFkZXJzIiwid2FybmluZyIsIm1lc3NhZ2UiLCJkZWxheSIsIm9uc3VjY2VzcyIsImNvbmZpZyIsInJlcXVlc3QiLCJ0b2tlbiIsInNlc3Npb24iLCJ1dWlkIiwidGltZW91dCIsInN1Y2Nlc3MiLCJnZXRwaW5nIiwiaGFuZGxlciIsImdldCIsInBpbmciLCJlcnJvciIsInBpbmdyYXRlIiwicmVmcmVzaCIsInRrY3JlYXRlIiwiY3JlYXRlIiwiaG9zdG5hbWUiLCJob3N0IiwiaHR0cGRwb3J0IiwicG9ydCIsImF1dG9sb2ciLCJKU09OIiwicGFyc2UiLCJkaXNwbGF5IiwiYWN0aW9uIiwic2hvdyIsIm1vZGFsIiwib3BhY2l0eSIsInZpc2liaWxpdHkiLCJjbG9zZSIsInBhcmVudCIsImJpbmQiLCJ0aXAiLCJxdWVyeSIsInBhdGgiLCJocmVmIiwic2VhcmNoIiwiTG9hZEZpbGVTdmMiLCJwb3N0dXJsIiwiZmlsZXMiLCJ0aHVtYm5haWxDQiIsInhtbFJlcSIsIlhNTEh0dHBSZXF1ZXN0IiwieGZvcm0iLCJGb3JtRGF0YSIsIk9uTG9hZENCIiwidGFyZ2V0IiwidXBsb2FkIiwib25wcm9ncmVzcyIsInByb2dyZXNzIiwibGVuZ3RoQ29tcHV0YWJsZSIsImxvYWRlZCIsInRvdGFsIiwib25sb2FkIiwicmVzcG9uc2UiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJvbmFib3J0IiwiaSIsImZpbGUiLCJ0eXBlIiwibWltZXR5cGUiLCJzaXplIiwibWF4c2l6ZSIsInRodW1ibmFpbCIsImlzdG9vYmlnIiwiaXNOYU4iLCJpc25vdHZhbGlkIiwiQmFzZW5hbWUiLCJuYW1lIiwicmV2ZXJzZSIsImltZ0VsZW0iLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJhcHBlbmQiLCJvcGVuIiwic2VuZCIsIkpRZW11IiwiaW5wdXRFbGVtIiwiaW1nQ2xpY2tlZCIsImNsaWNrIiwiU2xpZGVySW5pdENCIiwiVXBMb2FkRmlsZSIsInJlYWRlckNCIiwic3JjIiwid2luZG93IiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImNhdGVnb3J5IiwiYWNjZXB0IiwicmVnZXhwIiwiUmVnRXhwIiwicGF0aHMiLCJub3NsaWRlciIsIlR5cGVFcnJvciIsInppcGFwcCIsIkpTWmlwIiwiYXNBcnJheUJ1ZmZlciIsImVtYWlscGF0ZXJuIiwidmFsaWQiLCJpbnB1dCIsInJlcXVpcmVkIiwic2VsZWN0ZWQiLCJlcnJtc2ciLCJ2YWxpZGF0ZSIsInRyaW0iLCJtaW5sZW4iLCJ0ZXN0IiwibDRhY291bnRlciIsInZhbGlkYXRlZCIsImRvbmUiLCJwbGFjZWhvbGRlciIsImxvd2VyY2FzZSIsIm5vc3BhY2UiLCJ2YWxpZDEiLCJmaXJzdHB3ZCIsInZhbGlkMiIsImxhYmVsMSIsImxhYmVsMiIsInBsYWNlMSIsInBsYWNlaG9sZGVyMSIsInRpcDEiLCJwbGFjZTIiLCJ0aXAyIiwiY29udHJvbGxlciIsIkZpbGVVcGxvYWRlZCIsIlByb2Nlc3NSZXNwb25zZSIsImFwaW5hbWUiLCJhcGkiLCJBUElyZXNldCIsIkFQSWNyZWF0ZSIsIkFQSXJlZnJlc2giLCJBUEljaGVjayIsIlByb2Nlc3NFcnJvciIsIk9wZW5TZXNzaW9uIiwicG9zdGRhdGEiLCJwb3N0IiwiQ2hlY2tTZXNzaW9uIiwiY2hlY2siLCJSZWZyZXNoU2Vzc2lvbiIsIlJlc2V0U2Vzc2lvbiIsInJlc2V0IiwiZmFjdG9yeSIsIkZpbmRJblBhcmVudCIsInNlbGVjdG9yIiwidG9VcHBlckNhc2UiLCJ0YWdOYW1lIiwiRmluZEJ5VGFnIiwidGFnIiwiY2hpbGRyZW4iLCJuZXh0IiwiRmluZEJ5Q2xhc3MiLCJoYXNDbGFzcyIsIm15TWV0aG9kcyIsImZvdW5kYXRpb25Sb3V0ZXMiLCJ1cmwiLCJhbmltYXRpb25JbiIsInVybHF1ZXJ5IiwibXlDb25maWciLCJpbWFnZSIsImF2YXRhciIsImF1ZGlvIiwiYXBwbGkiLCJteWFwaSIsIlBhcnNlUXVlcnlTdHJpbmciLCJxZCIsImxvY2F0aW9uIiwic3Vic3RyIiwiZm9yRWFjaCIsIml0ZW0iLCJrIiwidiIsImRlY29kZVVSSUNvbXBvbmVudCIsInB1c2giLCIkdXJsUHJvdmlkZXIiLCIkbG9jYXRpb25Qcm92aWRlciIsIm90aGVyd2lzZSIsImh0bWw1TW9kZSIsImhhc2hQcmVmaXgiLCJydW4iLCJGYXN0Q2xpY2siLCJhdHRhY2giLCJkb2N1bWVudCIsImJvZHkiLCIkaW5qZWN0IiwiJHRlbXBsYXRlQ2FjaGUiLCJwdXQiXSwibWFwcGluZ3MiOiJDQW9CQSxXQUNBLFlBRUEsSUFBQUEsR0FBQSx3RkFLQUMsU0FBQUMsT0FBQSxtQkFDQUMsVUFBQSxlQUFBLFdBRUEsUUFBQUMsR0FBQUMsRUFBQUMsRUFBQUMsR0FHQUYsRUFBQUcsS0FBQUQsRUFBQUMsTUFBQSxVQUNBSCxFQUFBSSxNQUFBRixFQUFBRSxPQUFBLE9BR0FILEVBQUFJLFNBQUFMLEVBQUFJLE1BQUFFLGVBTUEsT0FDQUMsU0FBQSxJQUNBQyxTQUFBYixFQUNBYyxLQUFBVixFQUNBQyxPQUFBVSxRQUFBLFdDRUEsV0FDQSxZQUlBLFNBQUFDLEdBQUFYLEdBQ0EsR0FBQVksTUFDQUMsSUFFQUMsTUFBQUMsTUFBQSxXQUNBLE1BQUFmLEdBQUFnQixVQUdBRixLQUFBRyxZQUFBLFdBQ0EsTUFBQWpCLEdBQUFrQixVQUdBSixLQUFBSyxRQUFBLFNBQUFDLEdBSUEsTUFIQUEsS0FBQUEsRUFBQSxHQUdBcEIsRUFBQXFCLE1BQUFELEtBQUFSLEVBQUFRLEdBQUFQLEVBQUFPLElBR0FSLEVBQUFRLEdBQUFwQixFQUFBcUIsTUFBQUQsR0FDQXBCLEVBQUFzQixVQUFBVCxFQUFBTyxHQUFBcEIsRUFBQXNCLFVBQUF0QixFQUFBcUIsTUFBQUQsR0FBQXBCLEVBQUF1QixZQUNBVixFQUFBTyxHQUFBcEIsRUFBQXFCLE1BQUFELEdBRUFQLEVBQUFPLEtBR0FOLEtBQUFVLFlBQUEsU0FBQUMsRUFBQUMsR0FDQTFCLEVBQUF3QixZQUFBQyxFQUFBQyxJQUdBWixLQUFBYSxhQUFBLFNBQUFDLEdBQ0E1QixFQUFBMkIsYUFBQUMsSUFHQWQsS0FBQWUsU0FBQSxTQUFBVCxHQUVBLE1BREFBLEtBQUFBLEVBQUEsR0FDQXBCLEVBQUFxQixNQUFBRCxJQUdBTixLQUFBZ0IsWUFBQSxTQUFBVixHQUVBLE1BREFBLEtBQUFBLEVBQUEsR0FDQXBCLEVBQUErQixTQUFBWCxJQUdBTixLQUFBa0IsU0FBQSxTQUFBWCxFQUFBRCxHQUNBQSxJQUFBQSxFQUFBLEdBQ0FwQixFQUFBZ0MsU0FBQVgsRUFBQUQsSUFHQU4sS0FBQW1CLFdBQUEsU0FBQUMsR0FDQWxDLEVBQUFpQyxXQUFBQyxJQXBEQSxHQUFBQyxHQUFBdkMsUUFBQUMsT0FBQSxpQkF3REFzQyxHQUFBckMsVUFBQSxlQUFBLE9BQUEsWUFBQSxXQUFBLFNBQUFzQyxFQUFBQyxFQUFBQyxHQVlBLFFBQUE3QixHQUFBVCxFQUFBdUMsRUFBQXJDLEVBQUFzQyxHQUVBeEMsRUFBQXlDLFdBQUEsU0FBQUMsR0FFQUEsRUFBQUMsU0FBQTNDLEVBQUEyQyxPQUFBQyxTQUFBRixFQUFBQyxTQUNBRCxFQUFBRyxVQUFBN0MsRUFBQTZDLFFBQUFELFNBQUFGLEVBQUFHLFVBQ0FILEVBQUFJLFVBQUE5QyxFQUFBOEMsUUFBQUYsU0FBQUYsRUFBQUksVUFDQUosRUFBQUssS0FBQS9DLEVBQUFnQixTQUFBMEIsRUFBQUssSUFHQUMsU0FBQU4sRUFBQXJCLFFBQ0FyQixFQUFBcUIsTUFBQXFCLEVBQUFyQixNQUNBckIsRUFBQTJCLGFBQUEsTUFLQTNCLEVBQUEyQixhQUFBLFNBQUFDLEdBQ0EsR0FBQVAsR0FBQXJCLEVBQUFxQixLQUNBckIsR0FBQXFCLE9BQUEyQixPQUFBQSxRQUNBVixFQUFBLFdBQ0F0QyxFQUFBZ0MsU0FBQVgsRUFBQSxHQUFBLEdBQ0FyQixFQUFBaUQsTUFBQWpELEVBQUFnQyxTQUFBWCxFQUFBLEdBQUEsSUFDQU8sSUFJQTVCLEVBQUF3QixZQUFBLFNBQUFDLEVBQUFDLEdBRUFBLEVBQUFhLEVBQUFsQyxTQUFBb0IsR0FDQWMsRUFBQVcsWUFBQXpCLElBR0F6QixFQUFBaUMsV0FBQSxTQUFBa0IsR0FFQUEsR0FDQVosRUFBQWxDLFNBQUEsV0FDQUwsRUFBQW9ELFFBQUEsR0FBQUMsSUFBQSxhQUFBLFVBQ0FyRCxFQUFBaUQsTUFDQWpELEVBQUFvRCxRQUFBLEdBQUFDLElBQUEsYUFBQSxZQUdBZCxFQUFBVyxZQUFBLFdBQ0FsRCxFQUFBb0QsUUFBQSxHQUFBQyxJQUFBLGFBQUEsV0FDQXJELEVBQUFpRCxNQUFBakQsRUFBQW9ELFFBQUEsR0FBQUMsSUFBQSxhQUFBLGFBS0FyRCxFQUFBc0QsVUFBQSxTQUFBakMsR0FDQSxHQUFBa0MsR0FDQUMsRUFBQXhELEVBQUE2QyxRQUFBN0MsRUFBQThDLFFBQ0FXLEVBQUFwQyxFQUFBbUMsQ0FHQSxJQUFBeEQsRUFBQTJDLE9BQUEsRUFBQSxDQUNBLEdBQUFlLElBQUFELEVBQUFBLEVBQUF6RCxFQUFBMkMsUUFBQTNDLEVBQUEyQyxPQUNBZ0IsRUFBQUYsRUFBQXpELEVBQUEyQyxPQUVBaUIsRUFBQUQsR0FBQSxHQUFBM0QsRUFBQTJDLE9BQUEzQyxFQUFBMkMsT0FBQSxDQUdBLE9BRkFZLEdBQUFHLEVBQUExRCxFQUFBMkMsT0FBQWlCLEVBQUE1RCxFQUFBOEMsUUFNQSxHQUFBOUMsRUFBQTJDLE9BQUEsRUFBQSxDQUNBLEdBQUFrQixHQUFBQyxLQUFBQyxJQUFBLEdBQUEsR0FBQS9ELEVBQUEyQyxPQUVBLE9BREFZLEdBQUF2RCxFQUFBOEMsUUFBQUYsU0FBQWEsRUFBQUksR0FBQUEsRUFLQSxNQUFBSixJQUlBekQsRUFBQTZCLFNBQUEsU0FBQW1DLEVBQUE1QyxHQUNBcEIsRUFBQWlFLFNBQ0FqRSxFQUFBK0IsU0FBQVgsSUFBQTRDLEVBQUFoRSxFQUFBa0UsT0FBQWQsUUFBQWhDLEdBQUErQyx3QkFBQUMsU0FBQXBFLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUMsT0FBQXBFLEVBQUFrRSxPQUFBZCxRQUFBaEMsR0FBQStDLHdCQUFBQyxRQUVBcEUsRUFBQStCLFNBQUFYLEdBQUE0QyxHQUFBaEUsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBRyxNQUFBdEUsRUFBQWtFLE9BQUFkLFFBQUFoQyxHQUFBK0Msd0JBQUFHLE1BR0EsSUFBQUMsR0FBQXZFLEVBQUFzRCxVQUFBdEQsRUFBQStCLFNBQUFYLEdBSUFtRCxLQUFBdkUsRUFBQXFCLE1BQUFELEtBQ0FtRCxFQUFBdkUsRUFBQXdFLGFBQUFELEVBQUF2RSxFQUFBd0UsWUFDQUQsRUFBQXZFLEVBQUF5RSxZQUFBRixFQUFBdkUsRUFBQXlFLFdBR0F6RSxFQUFBc0IsVUFDQXRCLEVBQUEwRSxVQUFBMUUsRUFBQXNCLFVBQUFpRCxFQUFBdkUsRUFBQXVCLFlBRUF2QixFQUFBMEUsVUFBQUgsRUFFQXZFLEVBQUEyRSxTQUFBdkQsSUFDQXBCLEVBQUEyRSxTQUFBdkQsR0FBQXdELEtBQUE1RSxFQUFBMEUsV0FJQTFFLEVBQUFxQixNQUFBRCxHQUFBbUQsRUFDQS9CLEdBQUFBLEVBQUFxQyxjQUFBN0UsRUFBQTBFLFdBQ0ExRSxFQUFBOEUsU0FDQVAsRUFBQXZFLEVBQUF3RSxZQUFBRCxFQUFBdkUsRUFBQXlFLFdBQUF6RSxFQUFBK0UsVUFBQWYsRUFBQTVDLEtBS0FwQixFQUFBZ0YsU0FBQSxTQUFBM0QsR0FDQSxHQUFBMkMsRUFFQTNDLEdBQUFyQixFQUFBcUIsTUFBQSxLQUNBckIsRUFBQWlELEtBQ0FqRCxFQUFBZ0MsU0FBQVgsRUFBQSxHQURBckIsRUFBQWdDLFNBQUFYLEVBQUEsSUFJQXJCLEVBQUFpRSxVQUNBRCxFQUFBaEUsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxRQUFBL0MsRUFBQXJCLEVBQUE4QyxVQUFBOUMsRUFBQTZDLFFBQUE3QyxFQUFBOEMsU0FDQTlDLEVBQUFpRixNQUFBNUIsSUFBQSxTQUFBVyxFQUFBLFFBRUFBLEVBQUFoRSxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUFHLE9BQUFqRCxFQUFBckIsRUFBQThDLFVBQUE5QyxFQUFBNkMsUUFBQTdDLEVBQUE4QyxTQUNBOUMsRUFBQWlGLE1BQUE1QixJQUFBLFFBQUFXLEVBQUEsT0FHQWhFLEVBQUF3RSxXQUFBbkQsR0FHQXJCLEVBQUFrRixRQUFBLFNBQUE3RCxHQUNBLEdBQUEyQyxFQUVBM0MsR0FBQXJCLEVBQUFxQixNQUFBLEtBQ0FyQixFQUFBaUQsS0FDQWpELEVBQUFnQyxTQUFBWCxFQUFBLEdBREFyQixFQUFBZ0MsU0FBQVgsRUFBQSxJQUlBckIsRUFBQWlFLFVBQ0FELEVBQUFoRSxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUFDLFFBQUEvQyxFQUFBckIsRUFBQThDLFVBQUE5QyxFQUFBNkMsUUFBQTdDLEVBQUE4QyxTQUNBOUMsRUFBQWlGLE1BQUE1QixJQUFBLFNBQUFXLEVBQUEsUUFFQUEsRUFBQWhFLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUcsT0FBQWpELEVBQUFyQixFQUFBOEMsVUFBQTlDLEVBQUE2QyxRQUFBN0MsRUFBQThDLFNBQ0E5QyxFQUFBbUYsS0FBQTlCLEtBQUErQixNQUFBLEVBQUFkLE1BQUF0RSxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUFHLE1BQUFOLEVBQUEsUUFHQWhFLEVBQUF5RSxVQUFBcEQsR0FHQXJCLEVBQUErRSxVQUFBLFNBQUFmLEVBQUE1QyxHQUNBLEdBQUE2RCxFQUVBLElBQUFqRixFQUFBaUUsU0FBQSxDQUVBLEdBQUFvQixHQUFBckYsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxPQUFBSixDQVNBLElBUEFoRSxFQUFBb0QsUUFBQWhDLEdBQUFpQyxLQUNBaUMsb0JBQUEsY0FBQUQsRUFBQSxNQUNBRSxpQkFBQSxjQUFBRixFQUFBLE1BQ0FHLGdCQUFBLGNBQUFILEVBQUEsTUFDQUksZUFBQSxjQUFBSixFQUFBLE1BQ0FLLFVBQUEsY0FBQUwsRUFBQSxRQUVBckYsRUFBQWlELE1BQ0EsR0FBQWpELEVBQUErQixTQUFBLElBQUEvQixFQUFBK0IsU0FBQSxHQUFBLENBQ0EsR0FBQXFDLElBQUFwRSxFQUFBK0IsU0FBQSxHQUFBL0IsRUFBQStCLFNBQUEsSUFBQS9CLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUMsTUFDQWEsR0FBQWpGLEVBQUErQixTQUFBLEdBQUEvQixFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUFDLE9BQ0FwRSxFQUFBMkYsT0FBQXRDLEtBQUF1QyxPQUFBWCxFQUFBLEtBQUFiLE9BQUFBLEVBQUEsWUFKQXBFLEdBQUEyRixPQUFBdEMsSUFBQSxTQUFBVyxFQUFBLFVBZUEsSUFQQWhFLEVBQUFvRCxRQUFBaEMsR0FBQWlDLEtBQ0FpQyxvQkFBQSxjQUFBdEIsRUFBQSxNQUNBdUIsaUJBQUEsY0FBQXZCLEVBQUEsTUFDQXdCLGdCQUFBLGNBQUF4QixFQUFBLE1BQ0F5QixlQUFBLGNBQUF6QixFQUFBLE1BQ0EwQixVQUFBLGNBQUExQixFQUFBLFFBRUFoRSxFQUFBaUQsTUFDQSxHQUFBakQsRUFBQStCLFNBQUEsSUFBQS9CLEVBQUErQixTQUFBLEdBQUEsQ0FDQSxHQUFBdUMsSUFBQXRFLEVBQUErQixTQUFBLEdBQUEvQixFQUFBK0IsU0FBQSxJQUFBL0IsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBRyxLQUNBVyxHQUFBakYsRUFBQStCLFNBQUEsR0FBQS9CLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUcsTUFDQXRFLEVBQUEyRixPQUFBdEMsS0FBQXdDLEtBQUFaLEVBQUEsS0FBQVgsTUFBQUEsRUFBQSxZQUpBdEUsR0FBQTJGLE9BQUF0QyxJQUFBLFFBQUFXLEVBQUEsT0FVQWhFLEVBQUFnQyxTQUFBLFNBQUFYLEVBQUFELEdBQ0EsR0FBQTRDLEVBR0EzQyxLQUFBckIsRUFBQXFCLE1BQUFELEtBQ0E0QixTQUFBM0IsSUFBQUEsRUFBQSxHQUNBQSxFQUFBckIsRUFBQTZDLFVBQUF4QixFQUFBckIsRUFBQTZDLFNBQ0F4QixFQUFBckIsRUFBQThDLFVBQUF6QixFQUFBckIsRUFBQThDLFNBRUE5QyxFQUFBaUUsVUFDQWpFLEVBQUErQixTQUFBWCxJQUFBQyxFQUFBckIsRUFBQThDLFVBQUE5QyxFQUFBNkMsUUFBQTdDLEVBQUE4QyxTQUNBLElBQUExQixJQUFBNEMsRUFBQWhFLEVBQUErQixTQUFBWCxHQUFBcEIsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxPQUFBcEUsRUFBQWtFLE9BQUFkLFFBQUFoQyxHQUFBK0Msd0JBQUFDLE9BQUEsR0FDQSxJQUFBaEQsSUFBQTRDLEVBQUFoRSxFQUFBK0IsU0FBQVgsR0FBQXBCLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUMsVUFHQXBFLEVBQUErQixTQUFBWCxJQUFBQyxFQUFBckIsRUFBQThDLFVBQUE5QyxFQUFBNkMsUUFBQTdDLEVBQUE4QyxTQUNBa0IsRUFBQWhFLEVBQUErQixTQUFBWCxJQUFBcEIsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBRyxNQUFBdEUsRUFBQWtFLE9BQUFkLFFBQUFoQyxHQUFBK0Msd0JBQUFHLFFBR0F0RSxFQUFBK0UsVUFBQWYsRUFBQTVDLEdBQ0FwQixFQUFBcUIsTUFBQUQsR0FBQUMsRUFFQXJCLEVBQUFzQixVQUVBdEIsRUFBQTBFLFVBQUExRSxFQUFBc0IsVUFBQUQsRUFBQTJCLFFBRUFoRCxFQUFBMEUsVUFBQXJELEVBR0FtQixHQUFBQSxFQUFBcUMsY0FBQTdFLEVBQUEwRSxXQUVBMUUsRUFBQTJFLFNBQUF2RCxJQUNBcEIsRUFBQTJFLFNBQUF2RCxHQUFBd0QsS0FBQTVFLEVBQUEwRSxhQU1BMUUsRUFBQThGLFFBQUEsU0FBQUMsR0FFQSxPQUFBQSxFQUFBQyxTQUNBLElBQUEsSUFDQSxJQUFBLElBQ0FoRyxFQUFBMkMsT0FBQSxHQUFBM0MsRUFBQThFLE9BQUE5RSxFQUFBZ0MsU0FBQWhDLEVBQUFxQixNQUFBckIsRUFBQWlHLE9BQUFqRyxFQUFBMkMsT0FBQTNDLEVBQUFpRyxRQUNBakcsRUFBQTJDLE9BQUEsR0FBQTNDLEVBQUE4RSxPQUFBOUUsRUFBQWdDLFNBQUFoQyxFQUFBcUIsTUFBQXJCLEVBQUFpRyxPQUFBLEVBQUFuQyxLQUFBQyxJQUFBLEdBQUEsR0FBQS9ELEVBQUEyQyxRQUFBM0MsRUFBQWlHLFFBQ0FqRyxFQUFBa0csVUFBQWxHLEVBQUFrRyxTQUFBbEcsRUFBQXFCLE1BQUFyQixFQUFBaUcsT0FBQWpHLEVBQUF1QixXQUNBLE1BQ0EsS0FBQSxJQUNBLElBQUEsSUFDQXZCLEVBQUEyQyxPQUFBLEdBQUEzQyxFQUFBOEUsT0FBQTlFLEVBQUFnQyxTQUFBaEMsRUFBQXFCLE1BQUFyQixFQUFBaUcsT0FBQWpHLEVBQUEyQyxPQUFBM0MsRUFBQWlHLFFBQ0FqRyxFQUFBMkMsT0FBQSxHQUFBM0MsRUFBQThFLE9BQUE5RSxFQUFBZ0MsU0FBQWhDLEVBQUFxQixNQUFBckIsRUFBQWlHLE9BQUEsRUFBQW5DLEtBQUFDLElBQUEsR0FBQSxHQUFBL0QsRUFBQTJDLFFBQUEzQyxFQUFBaUcsUUFDQWpHLEVBQUFrRyxVQUFBbEcsRUFBQWtHLFNBQUFsRyxFQUFBcUIsTUFBQXJCLEVBQUFpRyxPQUFBakcsRUFBQXVCLFdBQ0EsTUFDQSxLQUFBLElBQ0F2QixFQUFBb0QsUUFBQXBELEVBQUFpRyxPQUFBLEdBQUFFLFNBSUFuRyxFQUFBb0csV0FBQSxTQUFBaEYsRUFBQWlGLEVBQUFDLEdBQ0EsR0FBQXRDLEVBQ0FoRSxHQUFBaUUsVUFDQUQsRUFBQWhFLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQXlCLE9BQUFVLEVBQ0F0QyxFQUFBaEUsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxTQUFBSixFQUFBaEUsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxRQUNBSixFQUFBaEUsRUFBQWtFLE9BQUFkLFFBQUFoQyxHQUFBK0Msd0JBQUFDLFNBQUFKLEVBQUFoRSxFQUFBa0UsT0FBQWQsUUFBQWhDLEdBQUErQyx3QkFBQUMsVUFFQUosRUFBQXFDLEVBQUFyRyxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUEwQixLQUVBLEVBQUE3QixJQUFBQSxFQUFBLEdBQ0FxQyxFQUFBckcsRUFBQWtFLE9BQUFkLFFBQUFoQyxHQUFBK0Msd0JBQUFHLE1BQUF0RSxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUFpQixRQUNBcEIsRUFBQWhFLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUcsTUFBQXRFLEVBQUFrRSxPQUFBZCxRQUFBaEMsR0FBQStDLHdCQUFBRyxRQUlBdEUsRUFBQTZCLFNBQUFtQyxFQUFBNUMsR0FHQXBCLEVBQUFpRCxNQUFBakQsRUFBQXFCLE1BQUEsR0FBQXJCLEVBQUFxQixNQUFBLEtBQ0EsSUFBQUQsRUFBQXBCLEVBQUFnQyxTQUFBaEMsRUFBQXFCLE1BQUEsR0FBQSxHQUNBckIsRUFBQWdDLFNBQUFoQyxFQUFBcUIsTUFBQSxHQUFBLEtBS0FyQixFQUFBdUcsUUFBQSxTQUFBQyxHQUNBQSxFQUNBbkUsRUFBQW9FLEdBQUEsVUFBQXpHLEVBQUE4RixTQUVBekQsRUFBQXFFLE9BQUEsVUFBQTFHLEVBQUE4RixVQUtBOUYsRUFBQTJHLFdBQUEsU0FBQUMsR0FDQSxHQUNBN0UsR0FEQVgsRUFBQSxFQUVBeUYsRUFBQUQsRUFBQUUsZUFDQUMsRUFBQS9HLEVBQUFxQixNQUFBRCxFQUtBLElBSEF3RixFQUFBSSxpQkFHQWhILEVBQUFpRCxLQUFBLENBQ0FsQixFQUFBL0IsRUFBQWlFLFVBQUE0QyxFQUFBLEdBQUFJLE1BQUFqSCxFQUFBa0UsT0FBQUcsSUFBQUYsd0JBQUF5QixRQUFBNUYsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBQyxRQUNBeUMsRUFBQSxHQUFBSyxNQUFBbEgsRUFBQWtFLE9BQUFHLElBQUFGLHdCQUFBMEIsTUFBQTdGLEVBQUFrRSxPQUFBRyxJQUFBRix3QkFBQUcsS0FFQSxJQUFBNkMsR0FBQXJELEtBQUFzRCxJQUFBckYsRUFBQS9CLEVBQUErQixTQUFBLElBQ0FzRixFQUFBdkQsS0FBQXNELElBQUFyRixFQUFBL0IsRUFBQStCLFNBQUEsR0FDQW9GLEdBQUFFLElBQUFqRyxFQUFBLEdBSUFwQixFQUFBb0csV0FBQWhGLEVBQUF5RixFQUFBLEdBQUFLLE1BQUFMLEVBQUEsR0FBQUksT0FDQWpILEVBQUFrRyxVQUFBYSxJQUFBL0csRUFBQXFCLE1BQUFELElBQUFwQixFQUFBa0csU0FBQWxHLEVBQUFxQixNQUFBRCxHQUFBcEIsRUFBQXVCLGFBSUF2QixFQUFBc0gsY0FBQSxTQUFBQyxFQUFBbkcsR0FRQSxRQUFBb0csR0FBQVosR0FDQUEsRUFBQUksZ0JBRUEsS0FBQSxHQURBSCxHQUFBRCxFQUFBRSxlQUNBVyxFQUFBLEVBQUFBLEVBQUFaLEVBQUFhLE9BQUFELElBQ0F6SCxFQUFBb0csV0FBQWhGLEVBQUF5RixFQUFBWSxHQUFBUCxNQUFBTCxFQUFBWSxHQUFBUixPQUlBLFFBQUFVLEdBQUFmLEdBQ0F2RSxFQUFBcUUsT0FBQSxZQUFBYyxHQUNBbkYsRUFBQXFFLE9BQUEsV0FBQWlCLEdBQ0FwRixFQUFBa0UsR0FBQSxhQUFBekcsRUFBQTJHLFlBR0EzRyxFQUFBa0csVUFBQWEsSUFBQS9HLEVBQUFxQixNQUFBRCxJQUFBcEIsRUFBQWtHLFNBQUFsRyxFQUFBcUIsTUFBQUQsR0FBQXBCLEVBQUF1QixZQXJCQSxHQUFBd0YsR0FBQS9HLEVBQUFxQixNQUFBRCxFQUVBbUcsR0FBQVAsaUJBQ0EzRSxFQUFBb0UsR0FBQSxZQUFBZSxHQUNBbkYsRUFBQW9FLEdBQUEsV0FBQWtCLEdBQ0FwRixFQUFBbUUsT0FBQSxhQUFBMUcsRUFBQTJHLGFBb0JBM0csRUFBQTRILFNBQUEsU0FBQUMsRUFBQXpHLEdBY0EsUUFBQTBHLEdBQUFsQixHQUNBNUcsRUFBQW9HLFdBQUFoRixFQUFBd0YsRUFBQVAsUUFBQU8sRUFBQU4sU0FJQSxRQUFBeUIsS0FDQTFGLEVBQUFxRSxPQUFBLFlBQUFvQixHQUNBekYsRUFBQXFFLE9BQUEsVUFBQXFCLEdBR0EvSCxFQUFBa0csVUFBQWEsSUFBQS9HLEVBQUFxQixNQUFBRCxJQUFBcEIsRUFBQWtHLFNBQUFsRyxFQUFBcUIsTUFBQUQsR0FBQXBCLEVBQUF1QixZQXRCQSxJQUFBckIsRUFBQThILFVBQUEsQ0FFQSxHQUFBakIsR0FBQS9HLEVBQUFxQixNQUFBRCxFQUVBeUcsR0FBQWIsaUJBRUEzRSxFQUFBb0UsR0FBQSxZQUFBcUIsR0FDQXpGLEVBQUFvRSxHQUFBLFVBQUFzQixHQUNBL0gsRUFBQW9ELFFBQUFoQyxHQUFBLEdBQUE2RyxRQUNBakksRUFBQWlHLE1BQUE3RSxJQWtCQXBCLEVBQUFrSSxLQUFBLFNBQUFDLEVBQUFsSSxHQUNBLEdBQUFtSSxFQUVBQSxHQUFBbkksRUFBQUEsRUFBQSxHQUFBb0ksY0FBQUYsR0FDQTVGLEVBQUEsR0FBQThGLGNBQUFGLEVBRUEsSUFBQUcsR0FBQTFJLFFBQUEyQyxRQUFBNkYsRUFDQSxPQUFBLElBS0FwSSxFQUFBdUksZ0JBQUEsU0FBQUMsR0FDQSxHQUFBQyxFQUNBekksR0FBQXFCLFNBQ0FyQixFQUFBK0IsWUFFQSxPQUFBL0IsRUFBQTBJLFlBQ0FELEdBQUEsR0FBQXpJLEVBQUEyQyxRQUFBZ0csTUFBQSxhQUNBM0ksRUFBQTBJLFVBQUFELEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBZixPQUFBLEdBSUFuRixFQUFBa0UsR0FBQSxhQUFBekcsRUFBQTJHLFlBQ0EzRyxFQUFBb0QsUUFBQSxHQUFBcUQsR0FBQSxhQUFBLFNBQUFtQyxHQUFBNUksRUFBQXNILGNBQUFzQixFQUFBLEtBR0E1SSxFQUFBaUQsT0FDQWpELEVBQUFvRCxRQUFBLEdBQUEvQyxTQUFBLHVCQUNBTCxFQUFBb0QsUUFBQSxHQUFBcUQsR0FBQSxhQUFBLFNBQUFtQyxHQUFBNUksRUFBQXNILGNBQUFzQixFQUFBLEtBQ0E1SSxFQUFBMEMsWUFBQTFDLEVBQUFnQyxTQUFBd0csRUFBQSxHQUFBLElBSUF4SSxFQUFBMEMsV0FBQTFDLEVBQUF5QyxXQUFBekMsRUFBQTBDLFlBQ0ExQyxFQUFBZ0MsU0FBQXdHLEVBQUEsR0FBQSxJQUdBeEksRUFBQTZJLEtBQUEsV0E4QkEsR0E3QkE3SSxFQUFBZ0IsU0FBQWQsRUFBQTZDLElBQUEsVUFBQUgsU0FBQSxJQUFBa0IsS0FBQWdGLFVBQ0E5SSxFQUFBd0UsYUFBQXVFLEVBQUFBLEdBQ0EvSSxFQUFBeUUsVUFBQXNFLEVBQUFBLEVBQ0EvSSxFQUFBMkMsT0FBQUMsU0FBQTFDLEVBQUF5QyxTQUFBLEVBQ0EzQyxFQUFBaUUsU0FBQS9ELEVBQUErRCxXQUFBLEVBQ0FqRSxFQUFBaUQsS0FBQS9DLEVBQUE4SSxjQUFBLEVBQ0FoSixFQUFBaUosc0JBQUEsRUFDQWpKLEVBQUE2QyxRQUFBRCxTQUFBMUMsRUFBQTJDLFVBQUEsSUFDQTdDLEVBQUE4QyxRQUFBRixTQUFBMUMsRUFBQTRDLFVBQUEsRUFFQTlDLEVBQUFpRSxVQUFBMUIsRUFBQWxDLFNBQUEsa0JBRUFMLEVBQUFvRCxTQUFBcEQsRUFBQWtJLEtBQUEsZUFBQWxJLEVBQUFrSSxLQUFBLGdCQUNBbEksRUFBQXFFLElBQUE5QixFQUNBdkMsRUFBQTJGLE9BQUEzRixFQUFBa0ksS0FBQSxnQ0FDQWxJLEVBQUFpRixNQUFBakYsRUFBQWtJLEtBQUEsMkJBQ0FsSSxFQUFBbUYsS0FBQW5GLEVBQUFrSSxLQUFBLDBCQUNBbEksRUFBQWtKLFFBQUFoSixFQUFBZ0osVUFBQSxFQUVBbEosRUFBQXVCLFdBQUEsR0FBQVosR0FBQVgsR0FHQUEsRUFBQWtFLFFBQ0FHLElBQUE5QixFQUFBLEdBQ0FhLFNBQUFwRCxFQUFBb0QsUUFBQSxHQUFBLEdBQUFwRCxFQUFBb0QsUUFBQSxHQUFBLEtBR0EsU0FBQWxELEVBQUFnSixTQUFBbEosRUFBQWlDLFlBQUEsR0FFQS9CLEVBQUFpSixjQUNBLE9BQUFqSixFQUFBaUosZUFDQSxLQUFBLEVBQ0EsSUFBQSxTQUNBbkosRUFBQTJFLFNBQUEzRSxFQUFBb0QsUUFDQXBELEVBQUFvRCxRQUFBLEdBQUEvQyxTQUFBLDRCQUNBTCxFQUFBaUQsTUFBQWpELEVBQUFvRCxRQUFBLEdBQUEvQyxTQUFBLDJCQUNBLE1BQ0EsU0FDQUwsRUFBQTJFLFVBQUF0QyxFQUFBK0csZUFBQWxKLEVBQUFpSixvQkFFQW5KLEdBQUEyRSxXQUdBLElBQUF6RSxFQUFBc0ksUUFFQSxDQUNBLEdBQUFBLEdBQUF0SSxFQUFBc0ksUUFBQWEsTUFBQSxJQUNBckosR0FBQXdJLFNBQ0F4RixTQUFBd0YsRUFBQSxHQUFBNUYsU0FBQTRGLEVBQUEsSUFBQXhJLEVBQUE4QyxRQUNBRSxTQUFBd0YsRUFBQSxHQUFBNUYsU0FBQTRGLEVBQUEsSUFBQXhJLEVBQUE2QyxhQUxBN0MsR0FBQXdJLFNBQUF4SSxFQUFBc0osUUFBQXRKLEVBQUFzSixRQVVBdEosR0FBQXVKLE9BQUEsVUFBQSxXQUNBdkosRUFBQXFCLE1BQUFyQixFQUFBd0osUUFHQXhKLEVBQUF3SixTQUFBeEosRUFBQWdGLFNBQUFoRixFQUFBd0osV0FHQXhKLEVBQUF1SixPQUFBLFNBQUEsV0FDQXZKLEVBQUFxQixNQUFBckIsRUFBQXlKLE9BR0F6SixFQUFBeUosUUFBQXpKLEVBQUFrRixRQUFBbEYsRUFBQXlKLFVBSUF6SixFQUFBdUksZ0JBQUF2SSxFQUFBd0ksVUFJQXhJLEVBQUE2SSxPQUdBN0ksRUFBQXVKLE9BQUEsV0FBQSxXQUNBdkosRUFBQTBKLFVBQUExSixFQUFBMEosU0FBQTFKLEVBQUF1QixjQUdBdkIsRUFBQXVKLE9BQUEsYUFBQSxXQUNBdkosRUFBQTBDLFlBQUExQyxFQUFBeUMsV0FBQXpDLEVBQUEwQyxjQUlBMUMsRUFBQXVKLE9BQUEsVUFBQSxTQUFBSSxHQUNBM0osRUFBQWdDLFNBQUEySCxFQUFBLEtBOWVBLEdBQUFuSixHQUFBLGtqQkFrZkEsUUFDQUQsU0FBQSxJQUNBUCxPQUNBd0osUUFBQSxJQUNBQyxPQUFBLElBQ0F2RCxTQUFBLElBQ0E1RSxVQUFBLElBQ0FvSSxTQUFBLElBQ0F4SSxTQUFBLElBQ0F3QixXQUFBLElBQ0E0RyxRQUFBLEtBRUFNLFFBQUEsV0FDQXBKLFNBQUFBLEVBQ0FxSixTQUFBLEVBQ0FwSixLQUFBQSxTQ3psQkEsV0FDQSxZQUVBLElBQUFELEdBQ0EsdUpBT0FaLFNBQUFDLE9BQUEsZ0JBQUEsWUFBQSxzQkFFQUMsVUFBQSxnQkFBQSxXQUFBLFFBQUEsWUFBQSxlQUFBLFlBQUEsU0FBQXdDLEVBQUF3SCxFQUFBQyxFQUFBQyxFQUFBQyxHQUVBLFFBQUFsSyxHQUFBQyxFQUFBQyxFQUFBQyxHQUNBRixFQUFBMEIsT0FBQXNCLE9BR0FoRCxFQUFBa0ssT0FBQSxXQUNBakssRUFBQUksU0FBQSxVQUNBSixFQUFBaUQsWUFBQSxZQUdBbEQsRUFBQW1LLFFBQUEsV0FDQWxLLEVBQUFJLFNBQUEsV0FDQUosRUFBQWlELFlBQUEsV0FHQWxELEVBQUFvSyxRQUFBLFNBQUFDLEVBQUFDLEVBQUFDLEdBQ0F2SyxFQUFBMEIsVUFBQSxJQUNBc0ksRUFBQVEsU0FBQUMsUUFBQSwyQkFBQUMsTUFBQSxNQUNBMUssRUFBQW1LLFdBRUFuSyxFQUFBMEIsT0FBQSxHQUdBMUIsRUFBQTJLLFVBQUEsU0FBQU4sRUFBQUMsRUFBQUMsRUFBQUssR0FDQTVLLEVBQUEwQixVQUFBLElBQ0EySSxFQUFBUSxRQUFBQyxRQUFBYixFQUFBYyxRQUFBRCxNQUFBVCxFQUFBUSxRQUFBQyxPQUNBVCxFQUFBUSxRQUFBRyxPQUFBZixFQUFBYyxRQUFBQyxLQUFBWCxFQUFBUSxRQUFBRyxNQUNBWCxFQUFBUSxRQUFBSSxVQUFBaEIsRUFBQWMsUUFBQUUsUUFBQVosRUFBQVEsUUFBQUksU0FFQWpCLEVBQUFrQixTQUFBVCxRQUFBLG1DQUFBQyxNQUFBLE1BQ0ExSyxFQUFBa0ssVUFFQWxLLEVBQUEwQixPQUFBLEdBSUExQixFQUFBbUwsUUFBQSxXQUVBLEdBQUFDLEdBQUF0QixFQUFBdUIsSUFBQXBCLEVBQUFjLFFBQUFPLEtBQUEsVUFBQXJCLEVBQUFjLFFBQUFELE1BR0FNLEdBQUFGLFFBQUFsTCxFQUFBMkssV0FDQVMsRUFBQUcsTUFBQXZMLEVBQUFvSyxTQUdBOUgsRUFBQXRDLEVBQUFtTCxRQUFBLElBQUFsQixFQUFBYyxRQUFBUyxXQUlBeEwsRUFBQXlMLFFBQUEsV0FDQSxHQUFBTCxHQUFBdEIsRUFBQXVCLElBQUFwQixFQUFBYyxRQUFBVSxRQUFBLFVBQUF4QixFQUFBYyxRQUFBRCxNQUdBTSxHQUFBRixRQUFBbEwsRUFBQTJLLFdBQ0FTLEVBQUFHLE1BQUF2TCxFQUFBb0ssU0FFQTlILEVBQUF0QyxFQUFBeUwsUUFBQSxJQUFBeEIsRUFBQWMsUUFBQUUsVUFJQWpMLEVBQUEwTCxTQUFBLFdBQ0EsR0FBQU4sR0FBQXRCLEVBQUF1QixJQUFBcEIsRUFBQWMsUUFBQVksT0FBQSxVQUFBMUIsRUFBQWMsUUFBQXZDLFFBR0E0QyxHQUFBRixRQUFBbEwsRUFBQTJLLFdBQ0FTLEVBQUFHLE1BQUF2TCxFQUFBb0ssVUFHQXBLLEVBQUFHLEtBQUFELEVBQUFDLE1BQUEsZUFDQUgsRUFBQTRMLFNBQUE3QixFQUFBOEIsT0FDQTdMLEVBQUE4TCxVQUFBL0IsRUFBQWdDLE9BQ0EvTCxFQUFBZ00sUUFBQUMsS0FBQUMsTUFBQWhNLEVBQUE4TCxVQUFBLEdBRUFoTSxFQUFBZ00sU0FBQWhNLEVBQUEwTCxXQUdBcEosRUFBQXRDLEVBQUFtTCxRQUFBLElBQUFsQixFQUFBYyxRQUFBUyxVQUNBbEosRUFBQXRDLEVBQUF5TCxRQUFBLElBQUF4QixFQUFBYyxRQUFBRSxTQUdBLE9BQ0F6SyxTQUFBQSxFQUNBUixPQUNBa0csU0FBQSxLQUVBM0YsU0FBQSxJQUNBRSxLQUFBVixTQzNGQSxXQUNBLFlBRUEsSUFBQUosR0FBQSx3RkFLQUMsU0FBQUMsT0FBQSx3QkFDQUMsVUFBQSxZQUFBLFdBQUEsU0FBQXdDLEdBRUEsUUFBQXZDLEdBQUFDLEVBQUFDLEVBQUFDLEdBTUEsUUFBQWlNLEtBQ0EsUUFBQUMsS0FDQXBNLEVBQUFxTSxNQUFBck0sRUFBQXNNLE1BQUFqSixLQUFBa0osUUFBQSxFQUFBQyxXQUFBLFlBRUF4TSxFQUFBcU0sTUFBQSxFQUNBck0sRUFBQWlMLFFBQUEzSSxFQUFBOEosRUFBQXBNLEVBQUEwSyxPQUdBLFFBQUErQixLQUNBek0sRUFBQXFNLE1BQUEsRUFDQXJNLEVBQUFzTSxNQUFBakosS0FBQWtKLFFBQUEsRUFBQUMsV0FBQSxXQWZBeE0sRUFBQTBNLE9BQUF6TSxFQUFBeU0sU0FDQTFNLEVBQUFzTSxNQUFBck0sRUFBQWlJLEtBQUEsT0FtQkFsSSxFQUFBRyxLQUFBRCxFQUFBQyxNQUFBLGVBR0FILEVBQUEwTSxPQUFBck0sU0FBQSxnQkFDQUwsRUFBQTBNLE9BQUFDLEtBQUEsUUFBQUYsR0FDQXpNLEVBQUEwTSxPQUFBQyxLQUFBLFFBQUFSLEdBQ0FuTSxFQUFBME0sT0FBQUMsS0FBQSxZQUFBUixHQUNBbk0sRUFBQTBNLE9BQUFDLEtBQUEsYUFBQUYsR0FDQXpNLEVBQUEwTSxPQUFBQyxLQUFBLE9BQUFGLEdBRUF6TSxFQUFBMEssTUFBQXhLLEVBQUF3SyxPQUFBLElBR0EsT0FDQW5LLFNBQUEsSUFDQUMsU0FBQWIsRUFDQWMsS0FBQVYsRUFDQUMsT0FBQTRNLElBQUEsWUM3REEsV0FDQSxZQUVBLElBQUFqTixHQUFBLHlHQU1BQyxTQUFBQyxPQUFBLGlCQUNBQyxVQUFBLGNBQUEsWUFBQSxTQUFBaUssR0FFQSxRQUFBaEssR0FBQUMsRUFBQUMsRUFBQUMsR0FFQUYsRUFBQVUsUUFBQSxXQUVBUixFQUFBMk0sTUFDQTlDLEVBQUErQyxLQUFBNU0sRUFBQTZNLE1BQUFDLE9BQUE5TSxFQUFBMk0sT0FEQTlDLEVBQUErQyxLQUFBNU0sRUFBQTZNLE9BS0EvTSxFQUFBRyxLQUFBRCxFQUFBQyxNQUFBLFVBQ0FILEVBQUFJLE1BQUFGLEVBQUFFLE9BQUEsT0FDQUosRUFBQStNLEtBQUE3TSxFQUFBNk0sTUFBQSxRQUdBOU0sRUFBQUksU0FBQUwsRUFBQUksTUFBQUUsZUFHQSxPQUNBQyxTQUFBLElBQ0FDLFNBQUFiLEVBQ0FjLEtBQUFWLEVBQ0FDLGdCQ3ZCQSxXQUNBLFlBV0EsU0FBQWlOLEdBQUFqTixFQUFBQyxFQUFBaU4sRUFBQUMsRUFBQUMsR0FDQSxHQUFBQyxHQUFBLEdBQUFDLGdCQUNBQyxFQUFBLEdBQUFDLFVBRUFDLEVBQUEsU0FBQUMsR0FDQU4sRUFBQU0sR0FJQUwsR0FBQU0sT0FBQUMsV0FBQSxTQUFBaEgsR0FDQSxHQUFBaUgsR0FBQS9KLEtBQUFGLE1BQUFnRCxFQUFBa0gsaUJBQUEsSUFBQWxILEVBQUFtSCxPQUFBbkgsRUFBQW9ILE1BQUEsRUFDQWhPLEdBQUEyRixRQUFBM0YsRUFBQTJGLE9BQUEzRCxTQUFBNkwsSUFJQVIsRUFBQVksT0FBQSxXQUNBaE8sRUFBQUksU0FBQSxXQUNBSixFQUFBaUQsWUFBQSxRQUNBLElBQUFnTCxJQUNBeE0sT0FBQTJMLEVBQUEzTCxPQUNBNkksUUFBQThDLEVBQUFjLHdCQUVBbk8sR0FBQWtHLFNBQUFnSSxJQUdBYixFQUFBakQsUUFBQSxXQUNBbkssRUFBQUksU0FBQSxTQUNBSixFQUFBaUQsWUFBQSxVQUNBLElBQUFnTCxJQUNBeE0sT0FBQTJMLEVBQUEzTCxPQUNBNkksUUFBQThDLEVBQUFjLHdCQUVBbk8sR0FBQWtHLFNBQUFnSSxJQUdBYixFQUFBZSxRQUFBLFdBQ0FuTyxFQUFBSSxTQUFBLFNBQ0FKLEVBQUFpRCxZQUFBLFVBQ0EsSUFBQWdMLElBQ0F4TSxPQUFBMkwsRUFBQTNMLE9BQ0E2SSxRQUFBOEMsRUFBQWMsd0JBRUFuTyxHQUFBa0csU0FBQWdJLEdBR0EsS0FBQSxHQUFBRyxHQUFBLEVBQUFBLEVBQUFsQixFQUFBekYsT0FBQTJHLElBQUEsQ0FDQSxHQUFBQyxHQUFBbkIsRUFBQWtCLEVBQ0EsSUFBQUMsRUFBQUMsS0FBQTVGLE1BQUEzSSxFQUFBd08sVUFBQSxDQU9BLEdBQUFGLEVBQUFHLEtBQUEsS0FBQXpPLEVBQUEwTyxRQUdBLE1BRkExTyxHQUFBMk8sVUFBQTNPLEVBQUE0TyxhQUNBNU8sR0FBQThFLE9BQUEsWUFLQSxJQUFBK0osTUFBQVAsRUFBQUcsTUFHQSxNQUZBek8sR0FBQTJPLFVBQUEzTyxFQUFBOE8sZUFDQTlPLEdBQUE4RSxPQUFBLFlBUUEsSUFKQTlFLEVBQUErTyxTQUFBVCxFQUFBVSxLQUFBM0YsTUFBQSxLQUFBNEYsVUFBQSxHQUNBalAsRUFBQWtQLFFBQUEsR0FBQVosS0FBQUEsRUFHQWxCLEVBQUEsQ0FDQSxHQUFBK0IsR0FBQSxHQUFBQyxXQUNBRCxHQUFBRSxrQkFBQWYsR0FDQWEsRUFBQWxCLE9BQUFSLEVBR0FGLEVBQUErQixPQUFBdFAsRUFBQWdQLEtBQUFWLEVBQUFBLEVBQUFVLE9BS0EzQixFQUFBa0MsS0FBQSxPQUFBckMsR0FBQSxHQUNBRyxFQUFBbUMsS0FBQWpDLEdBM0ZBLEdBQUE1TixHQUFBLHFXQThGQUMsU0FBQUMsT0FBQSxlQUFBLFlBQUEsb0JBQUEsZ0JBRUFDLFVBQUEsZUFBQSxZQUFBLFFBQUEsZUFBQSxTQUFBbUssRUFBQXdGLEVBQUF6RixHQUNBLFFBQUFqSyxHQUFBQyxFQUFBQyxFQUFBQyxHQTRDQSxHQXpDQUYsRUFBQWtQLFFBQUFqUCxFQUFBaUksS0FBQSxPQUNBbEksRUFBQTBQLFVBQUF6UCxFQUFBaUksS0FBQSxTQUdBbEksRUFBQTJQLFdBQUEsV0FDQTNQLEVBQUEwUCxVQUFBLEdBQUFFLFNBSUE1UCxFQUFBNlAsYUFBQSxTQUFBbEssR0FDQTNGLEVBQUEyRixPQUFBQSxHQUlBM0YsRUFBQThQLFdBQUEsU0FBQTNDLEdBQ0EsR0FBQTRDLEdBQUEsU0FBQXBDLEdBR0EsTUFEQTNOLEdBQUFrUCxRQUFBLEdBQUFjLElBQUFDLE9BQUFDLElBQUFDLGdCQUFBLEdBQUFDLE9BQUF6QyxFQUFBRCxPQUFBbkssU0FBQWdMLEtBQUEsWUFDQSxHQUVBckIsRUFBQWhOLEVBQUFnTixRQUFBLFVBQUFqRCxFQUFBYyxRQUFBRCxLQUNBLElBQUFtQyxHQUFBak4sRUFBQUMsRUFBQWlOLEVBQUFDLEVBQUE0QyxJQUlBL1AsRUFBQWdQLEtBQUE5TyxFQUFBOE8sTUFBQSxTQUNBaFAsRUFBQXFRLFNBQUFuUSxFQUFBbVEsVUFBQSxRQUNBclEsRUFBQXdPLFVBQUF0TyxFQUFBb1EsUUFBQSxTQUFBLEtBQ0F0USxFQUFBME8sUUFBQXhPLEVBQUF3TyxTQUFBLElBQ0ExTyxFQUFBdVEsT0FBQSxHQUFBQyxRQUFBdFEsRUFBQW9RLE9BQUEsS0FBQSxLQUVBcFEsRUFBQXlPLFVBQUEzTyxFQUFBMk8sVUFBQTFFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUFuUSxFQUFBeU8sVUFDQTNPLEVBQUEyTyxVQUFBMUUsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQSxjQUVBblEsRUFBQXlPLFVBQUEzTyxFQUFBOE8sV0FBQTdFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUFuUSxFQUFBNE8sV0FDQTlPLEVBQUE4TyxXQUFBN0UsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQSxpQkFFQW5RLEVBQUEwTyxTQUFBNU8sRUFBQTRPLFNBQUEzRSxFQUFBd0csTUFBQXpRLEVBQUFxUSxVQUFBblEsRUFBQTBPLFNBQ0E1TyxFQUFBNE8sU0FBQTNFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUEsZUFDQXJRLEVBQUEwUSxTQUFBeFEsRUFBQXdRLFdBQUEsR0FFQXhRLEVBQUFnTixRQUFBLEtBQUEsSUFBQXlELFdBQUEsaURBQUEzUSxFQUFBRSxPQUVBLE9BQ0FLLFNBQUEsSUFDQUMsU0FBQWIsRUFDQWMsS0FBQVYsRUFDQUMsT0FDQWtHLFNBQUEsU0FLQXBHLFVBQUEsZUFBQSxZQUFBLFFBQUEsZUFBQSxTQUFBbUssRUFBQXdGLEVBQUF6RixHQUNBLFFBQUFqSyxHQUFBQyxFQUFBQyxFQUFBQyxHQXVDQSxHQXBDQUYsRUFBQWtQLFFBQUFqUCxFQUFBaUksS0FBQSxPQUNBbEksRUFBQTBQLFVBQUF6UCxFQUFBaUksS0FBQSxTQUdBbEksRUFBQTJQLFdBQUEsV0FDQTNQLEVBQUEwUCxVQUFBLEdBQUFFLFNBSUE1UCxFQUFBNlAsYUFBQSxTQUFBbEssR0FDQTNGLEVBQUEyRixPQUFBQSxHQUlBM0YsRUFBQThQLFdBQUEsU0FBQTNDLEdBQ0EsR0FBQUQsR0FBQWhOLEVBQUFnTixRQUFBLFVBQUFqRCxFQUFBYyxRQUFBRCxLQUNBLElBQUFtQyxHQUFBak4sRUFBQUMsRUFBQWlOLEVBQUFDLEdBQUEsSUFJQW5OLEVBQUFnUCxLQUFBOU8sRUFBQThPLE1BQUEsUUFDQWhQLEVBQUFxUSxTQUFBblEsRUFBQW1RLFVBQUEsUUFDQXJRLEVBQUF3TyxVQUFBdE8sRUFBQW9RLFFBQUEsU0FBQSxLQUNBdFEsRUFBQTBPLFFBQUF4TyxFQUFBd08sU0FBQSxJQUNBMU8sRUFBQXVRLE9BQUEsR0FBQUMsUUFBQXRRLEVBQUFvUSxPQUFBLEtBQUEsS0FFQXBRLEVBQUF5TyxVQUFBM08sRUFBQTJPLFVBQUExRSxFQUFBd0csTUFBQXpRLEVBQUFxUSxVQUFBblEsRUFBQXlPLFVBQ0EzTyxFQUFBMk8sVUFBQTFFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUEsbUJBRUFuUSxFQUFBeU8sVUFBQTNPLEVBQUE4TyxXQUFBN0UsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQW5RLEVBQUE0TyxXQUNBOU8sRUFBQThPLFdBQUE3RSxFQUFBd0csTUFBQXpRLEVBQUFxUSxVQUFBLGlCQUVBblEsRUFBQTBPLFNBQUE1TyxFQUFBNE8sU0FBQTNFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUFuUSxFQUFBME8sU0FDQTVPLEVBQUE0TyxTQUFBM0UsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQSxlQUNBclEsRUFBQTBRLFNBQUF4USxFQUFBd1EsV0FBQSxHQUVBeFEsRUFBQWdOLFFBQUEsS0FBQSxJQUFBeUQsV0FBQSxpREFBQTNRLEVBQUFFLE9BRUEsT0FDQUssU0FBQSxJQUNBQyxTQUFBYixFQUNBYyxLQUFBVixFQUNBQyxPQUNBa0csU0FBQSxTQU1BcEcsVUFBQSxlQUFBLFlBQUEsUUFBQSxlQUFBLFNBQUFtSyxFQUFBd0YsRUFBQXpGLEdBQ0EsUUFBQWpLLEdBQUFDLEVBQUFDLEVBQUFDLEdBc0RBLEdBbkRBRixFQUFBa1AsUUFBQWpQLEVBQUFpSSxLQUFBLE9BQ0FsSSxFQUFBMFAsVUFBQXpQLEVBQUFpSSxLQUFBLFNBR0FsSSxFQUFBMlAsV0FBQSxXQUNBM1AsRUFBQTBQLFVBQUEsR0FBQUUsU0FJQTVQLEVBQUE2UCxhQUFBLFNBQUFsSyxHQUNBM0YsRUFBQTJGLE9BQUFBLEdBSUEzRixFQUFBOFAsV0FBQSxTQUFBM0MsR0FFQSxHQUFBNEMsR0FBQSxTQUFBcEMsR0FDQSxHQUFBaUQsR0FBQSxHQUFBQyxPQUFBbEQsRUFBQUQsT0FBQW5LLFFBQ0FvTCxFQUFBaUMsRUFBQXRDLEtBQUEsd0JBR0EsT0FBQUssSUFNQTNPLEVBQUFrUCxRQUFBLEdBQUFjLElBQUFDLE9BQUFDLElBQUFDLGdCQUFBLEdBQUFDLE9BQUF6QixFQUFBbUMsa0JBQUF2QyxLQUFBLFlBQ0EsSUFMQXZPLEVBQUEyTyxVQUFBMUUsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQSxpQkFDQXJRLEVBQUE4RSxPQUFBLGNBQ0EsSUFLQW9JLEVBQUFoTixFQUFBZ04sUUFBQSxVQUFBakQsRUFBQWMsUUFBQUQsS0FDQSxJQUFBbUMsR0FBQWpOLEVBQUFDLEVBQUFpTixFQUFBQyxFQUFBNEMsSUFJQS9QLEVBQUFnUCxLQUFBOU8sRUFBQThPLE1BQUEsUUFDQWhQLEVBQUFxUSxTQUFBblEsRUFBQW1RLFVBQUEsUUFDQXJRLEVBQUF3TyxTQUFBdE8sRUFBQW9RLFFBQUEsT0FDQXRRLEVBQUEwTyxRQUFBeE8sRUFBQXdPLFNBQUEsSUFDQTFPLEVBQUF1USxPQUFBLEdBQUFDLFFBQUF0USxFQUFBb1EsT0FBQSxLQUFBLEtBRUFwUSxFQUFBeU8sVUFBQTNPLEVBQUEyTyxVQUFBMUUsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQW5RLEVBQUF5TyxVQUNBM08sRUFBQTJPLFVBQUExRSxFQUFBd0csTUFBQXpRLEVBQUFxUSxVQUFBLG1CQUVBblEsRUFBQXlPLFVBQUEzTyxFQUFBOE8sV0FBQTdFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUFuUSxFQUFBNE8sV0FDQTlPLEVBQUE4TyxXQUFBN0UsRUFBQXdHLE1BQUF6USxFQUFBcVEsVUFBQSxpQkFFQW5RLEVBQUEwTyxTQUFBNU8sRUFBQTRPLFNBQUEzRSxFQUFBd0csTUFBQXpRLEVBQUFxUSxVQUFBblEsRUFBQTBPLFNBQ0E1TyxFQUFBNE8sU0FBQTNFLEVBQUF3RyxNQUFBelEsRUFBQXFRLFVBQUEsZUFDQXJRLEVBQUEwUSxTQUFBeFEsRUFBQXdRLFdBQUEsR0FFQXhRLEVBQUFnTixRQUFBLEtBQUEsSUFBQXlELFdBQUEsaURBQUEzUSxFQUFBRSxPQUVBLE9BQ0FLLFNBQUEsSUFDQUMsU0FBQWIsRUFDQWMsS0FBQVYsRUFDQUMsT0FDQWtHLFNBQUEsWUM1UkEsV0FDQSxZQUVBLElBQUF2RyxHQUFBLHFoQkFTQW9SLEVBQUEsc0hBRUFuUixTQUFBQyxPQUFBLGFBQUEsY0FFQUMsVUFBQSxhQUFBLFFBQUEsU0FBQTJQLEdBQ0EsUUFBQTFQLEdBQUFDLEVBQUFDLEVBQUFDLEdBR0FGLEVBQUF1TCxPQUFBLEVBQ0F2TCxFQUFBZ1IsT0FBQSxFQUNBaFIsRUFBQTBCLE9BQUEsVUFFQTFCLEVBQUFpUixNQUFBaFIsRUFBQWlJLEtBQUEsU0FDQWxJLEVBQUFrUixTQUFBLEVBR0EsWUFBQWhSLEtBQ0FGLEVBQUFrUixTQUFBLEVBQ0FqUixFQUFBSSxTQUFBLGFBSUFMLEVBQUFtUixTQUFBLFdBQ0FuUixFQUFBdUwsT0FBQSxFQUNBdkwsRUFBQW9SLFFBQUEsRUFDQXBSLEVBQUEwQixPQUFBLFNBR0ExQixFQUFBcVIsU0FBQSxXQU1BclIsRUFBQTBNLE9BQUF4SixZQUFBLGVBR0FsRCxFQUFBcUIsT0FDQXJCLEVBQUF1TCxPQUFBLEVBRUF2TCxFQUFBcUIsTUFBQXJCLEVBQUFxQixNQUFBaVEsT0FHQSxXQUFBcFIsS0FDQUYsRUFBQXFCLE1BQUFyQixFQUFBcUIsTUFBQXdJLFFBQUEsTUFBQSxLQUdBLGFBQUEzSixLQUNBRixFQUFBcUIsTUFBQXJCLEVBQUFxQixNQUFBZixlQUlBLFVBQUFKLElBQ0FGLEVBQUFxQixNQUFBcUcsT0FBQXhILEVBQUFxUixTQUNBdlIsRUFBQTBCLE9BQUEsVUFDQTFCLEVBQUFvUixPQUFBcFIsRUFBQWdQLEtBQUEsb0JBQUE5TyxFQUFBcVIsT0FBQSxjQUNBdlIsRUFBQXVMLE9BQUEsR0FJQSxTQUFBckwsS0FDQTZRLEVBQUFTLEtBQUF4UixFQUFBcUIsU0FDQXJCLEVBQUEwQixPQUFBLFVBQ0ExQixFQUFBb1IsT0FBQSx3QkFDQXBSLEVBQUF1TCxPQUFBLEtBS0F2TCxFQUFBa1IsV0FDQWxSLEVBQUEwQixPQUFBLFVBQ0ExQixFQUFBb1IsT0FBQXBSLEVBQUFnUCxLQUFBLHVCQUNBaFAsRUFBQXVMLE9BQUEsR0FLQXZMLEVBQUF1TCxPQUNBdkwsRUFBQWtSLFVBQUFsUixFQUFBZ1IsUUFDQWhSLEVBQUFnUixPQUFBLEVBQ0FoUixFQUFBeVIsV0FBQUMsVUFBQSxHQUFBMVIsRUFBQXlSLFdBQUFDLGFBR0ExUixFQUFBa0csU0FBQWhHLEVBQUE4TyxLQUFBLEtBQUFoUCxFQUFBMlIsUUFHQTNSLEVBQUFrUixXQUFBbFIsRUFBQWdSLE9BQUFoUixFQUFBeVIsV0FBQUMsWUFDQTFSLEVBQUEwQixPQUFBLFFBQ0ExQixFQUFBZ1IsT0FBQSxFQUNBaFIsRUFBQWtHLFNBQUFoRyxFQUFBOE8sS0FBQWhQLEVBQUFxQixNQUFBckIsRUFBQTJSLFFBTUEzUixFQUFBMlIsS0FBQSxTQUFBdEgsR0FFQSxJQUFBLEdBQUFnRSxLQUFBaEUsR0FBQXJLLEVBQUFxTyxHQUFBaEUsRUFBQWdFLElBSUFyTyxFQUFBSSxNQUFBRixFQUFBRSxNQUNBSixFQUFBZ1AsS0FBQTlPLEVBQUE4TyxLQUNBaFAsRUFBQTRSLFlBQUExUixFQUFBMFIsWUFDQTVSLEVBQUF1TyxLQUFBck8sRUFBQXFPLE1BQUEsT0FDQXZPLEVBQUE0TSxJQUFBMU0sRUFBQTBNLElBR0E1TSxFQUFBME0sT0FBQStDLEVBQUEvQyxPQUFBek0sRUFBQSxRQUdBLFNBQUFDLEtBQ0FBLEVBQUEyUixXQUFBLEVBQ0EzUixFQUFBNFIsU0FBQSxFQUNBNVIsRUFBQXFSLE9BQUEsR0FHQXZSLEVBQUFrUixXQUNBbFIsRUFBQXlSLFdBQUF6UixFQUFBME0sT0FBQXJDLEtBQUEsY0FDQXJLLEVBQUF5UixXQU1BelIsRUFBQXlSLFdBQUFQLFlBTEFsUixFQUFBeVIsWUFBQVAsU0FBQSxFQUFBUSxVQUFBLEdBRUExUixFQUFBME0sT0FBQXJDLEtBQUEsYUFBQXJLLEVBQUF5UixjQVFBelIsRUFBQXVKLE9BQUEsUUFBQSxXQUNBdkosRUFBQXFCLE9BQUFyQixFQUFBcVIsYUFLQSxPQUNBOVEsU0FBQSxJQUNBQyxTQUFBYixFQUNBYyxLQUFBVixFQUNBQyxPQUNBa0csU0FBQSxJQUNBN0UsTUFBQSxZQzdKQSxXQUNBLFlBRUEsSUFBQTFCLEdBQUEsMllBT0FDLFNBQUFDLE9BQUEsb0JBRUFDLFVBQUEsZ0JBQUEsV0FDQSxRQUFBQyxHQUFBQyxFQUFBQyxFQUFBQyxHQUVBRixFQUFBK1IsT0FBQSxTQUFBL0MsRUFBQTNOLEdBRUFyQixFQUFBZ1MsU0FBQTNRLEdBR0FyQixFQUFBaVMsT0FBQSxTQUFBakQsRUFBQTNOLEVBQUFzUSxHQUlBM1IsRUFBQWdTLFdBQUEzUSxFQUNBc1EsR0FBQVgsT0FBQSxFQUFBdFAsT0FBQSxVQUFBMFAsT0FBQSwrQkFFQXBSLEVBQUFrRyxTQUFBaEcsRUFBQThPLEtBQUEzTixJQU1BckIsRUFBQTJSLEtBQUEsU0FBQXRILEdBRUEsSUFBQSxHQUFBZ0UsS0FBQWhFLEdBQUFySyxFQUFBcU8sR0FBQWhFLEVBQUFnRSxJQUlBck8sRUFBQWdQLEtBQUE5TyxFQUFBOE8sS0FDQWhQLEVBQUFrUyxPQUFBaFMsRUFBQUUsT0FBQSxXQUNBSixFQUFBbVMsT0FBQWpTLEVBQUFFLE9BQUEsd0JBQ0FKLEVBQUFvUyxPQUFBbFMsRUFBQW1TLGNBQUEsZ0JBQ0FyUyxFQUFBc1MsS0FBQXBTLEVBQUEwTSxLQUFBLG9CQUNBNU0sRUFBQXVTLE9BQUFyUyxFQUFBbVMsY0FBQSx3QkFDQXJTLEVBQUF3UyxLQUFBdFMsRUFBQTBNLEtBQUEseUJBQ0E1TSxFQUFBdVIsT0FBQXJSLEVBQUFxUixRQUFBLEdBRUEsWUFBQXJSLEtBQUFGLEVBQUFrUixTQUFBLFlBSUEsT0FDQTNRLFNBQUEsSUFDQUMsU0FBQWIsRUFDQWMsS0FBQVYsRUFDQUMsT0FDQWtHLFNBQUEsV0N4RUEsV0FDQSxZQUdBdEcsU0FBQUMsT0FBQSxnQkFBQSxlQUFBLGdCQUVBNFMsV0FBQSxvQkFBQSxRQUFBLFNBQUEzSSxHQUNBLEdBQUE5SixHQUFBYyxJQUlBZCxHQUFBMFMsYUFBQSxTQUFBeEUsV0NYQSxXQUNBLFlBS0F0TyxTQUFBQyxPQUFBLGNBQUEsZUFBQSxpQkFFQTRTLFdBQUEsa0JBQUEsUUFBQSxZQUFBLFNBQUEzSSxFQUFBRyxHQUNBLEdBQUFqSyxHQUFBYyxJQUNBZCxHQUFBZ0wsS0FBQSxPQUNBaEwsRUFBQThLLE1BQUEsT0FDQTlLLEVBQUErSyxRQUFBLE9BQ0EvSyxFQUFBMEIsT0FBQSxTQUlBMUIsRUFBQTJTLGdCQUFBLFNBQUF0SSxFQUFBQyxFQUFBQyxFQUFBSyxHQUNBLEdBQUFnSSxHQUFBLE1BQUF2SSxFQUFBUSxRQUFBZ0ksSUFBQWhKLFFBQUEsSUFBQSxJQUNBN0osR0FBQTBCLE9BQUEsU0FDQTFCLEVBQUFzSyxRQUFBQSxFQUNBdEssRUFBQTZLLFFBQUFSLEVBQUFRLFFBQ0E3SyxFQUFBa08sU0FBQTdELEVBQUE2RCxTQUdBN0QsRUFBQVEsUUFBQUMsUUFBQWIsRUFBQWMsUUFBQUQsTUFBQVQsRUFBQVEsUUFBQUMsT0FDQVQsRUFBQVEsUUFBQUcsT0FBQWYsRUFBQWMsUUFBQUMsS0FBQVgsRUFBQVEsUUFBQUcsTUFDQVgsRUFBQVEsUUFBQUksVUFBQWhCLEVBQUFjLFFBQUFFLFFBQUFaLEVBQUFRLFFBQUFJLFVBR0EsY0FBQTJILEdBQUEsYUFBQUEsS0FDQTVTLEVBQUE4UyxTQUFBLEdBQ0E5UyxFQUFBK1MsVUFBQSxHQUNBL1MsRUFBQWdULFdBQUEsR0FDQWhULEVBQUFpVCxTQUFBLElBRUFqVCxFQUFBNFMsR0FBQSxVQUdBdkksRUFBQVEsUUFBQUMsUUFBQTlLLEVBQUE4SyxNQUFBVCxFQUFBUSxRQUFBQyxRQUtBOUssRUFBQWtULGFBQUEsU0FBQTdJLEVBQUFDLEVBQUFDLEVBQUFLLEdBQ0EsR0FBQWdJLEdBQUEsTUFBQXZJLEVBQUFRLFFBQUFnSSxJQUFBaEosUUFBQSxJQUFBLElBQ0E3SixHQUFBMEIsT0FBQSxTQUNBMUIsRUFBQXNLLFFBQUFBLEVBQ0F0SyxFQUFBNkssUUFBQVIsRUFBQVEsUUFDQTdLLEVBQUFrTyxTQUFBLEdBQ0FsTyxFQUFBNFMsR0FBQSxRQUtBNVMsRUFBQW1ULFlBQUEsV0FFQSxHQUFBQyxNQUNBaEksRUFBQXRCLEVBQUF1SixLQUFBcEosRUFBQWMsUUFBQVksT0FBQSxVQUFBMUIsRUFBQWMsUUFBQXZDLFFBQUE0SyxFQUVBaEksR0FBQUYsUUFBQWxMLEVBQUEyUyxpQkFDQXZILEVBQUFHLE1BQUF2TCxFQUFBa1QsZUFHQWxULEVBQUFzVCxhQUFBLFdBRUEsR0FBQUYsTUFDQWhJLEVBQUF0QixFQUFBdUosS0FBQXBKLEVBQUFjLFFBQUF3SSxNQUFBLFVBQUF0SixFQUFBYyxRQUFBRCxNQUFBc0ksRUFFQWhJLEdBQUFGLFFBQUFsTCxFQUFBMlMsaUJBQ0F2SCxFQUFBRyxNQUFBdkwsRUFBQWtULGVBR0FsVCxFQUFBd1QsZUFBQSxXQUVBLEdBQUFKLE1BQ0FoSSxFQUFBdEIsRUFBQXVKLEtBQUFwSixFQUFBYyxRQUFBVSxRQUFBLFVBQUF4QixFQUFBYyxRQUFBRCxNQUFBc0ksRUFFQWhJLEdBQUFGLFFBQUFsTCxFQUFBMlMsaUJBQ0F2SCxFQUFBRyxNQUFBdkwsRUFBQWtULGVBR0FsVCxFQUFBeVQsYUFBQSxXQUVBLEdBQUFMLE1BQ0FoSSxFQUFBdEIsRUFBQXVKLEtBQUFwSixFQUFBYyxRQUFBMkksTUFBQSxVQUFBekosRUFBQWMsUUFBQUQsTUFBQXNJLEVBRUFoSSxHQUFBRixRQUFBbEwsRUFBQTJTLGlCQUNBdkgsRUFBQUcsTUFBQXZMLEVBQUFrVCxxQkNoRUEsV0FDQSxZQUtBdFQsU0FBQUMsT0FBQSxnQkFHQThULFFBQUEsUUFBQSxXQUVBLEdBQUFDLEdBQUEsU0FBQXJSLEVBQUFzUixHQUdBLElBRkEsR0FBQW5ILEdBQUFuSyxFQUNBeUssRUFBQTZHLEVBQUFDLGNBQ0FwSCxFQUFBLElBQUEsQ0FDQSxHQUFBTSxJQUFBTixFQUFBLEdBQUFxSCxRQUNBLE1BQUFySCxFQUVBQSxHQUFBQSxFQUFBQSxXQUlBc0gsRUFBQSxTQUFBelIsRUFBQTBSLEVBQUFKLEdBSUEsSUFIQSxHQUFBN0csR0FBQTZHLEVBQUF2VCxjQUNBaU8sRUFBQTBGLEVBQUEzVCxjQUFBLE9BQ0E0VCxFQUFBM1IsRUFBQTJSLFdBQ0FBLEVBQUEsSUFBQSxDQUNBLEdBQUFsSCxJQUFBa0gsRUFBQSxHQUFBM0YsR0FDQSxNQUFBMkYsRUFFQUEsR0FBQUEsRUFBQUMsU0FJQUMsRUFBQSxTQUFBN1IsRUFBQXNSLEdBR0EsSUFGQSxHQUFBN0csR0FBQTZHLEVBQUF2VCxjQUNBNFQsRUFBQTNSLEVBQUEyUixXQUNBQSxFQUFBLElBQUEsQ0FDQSxHQUFBQSxFQUFBRyxTQUFBckgsR0FDQSxNQUFBa0gsRUFFQUEsR0FBQUEsRUFBQUMsU0FJQUcsR0FDQVYsYUFBQUEsRUFDQUksVUFBQUEsRUFDQUksWUFBQUEsRUFHQSxPQUFBRSxPQzNFQSxJQUFBQyxvQkFBQXZGLEtBQUEsV0FBQXdGLElBQUEsVUFBQS9CLFdBQUEsMkJBQUFnQyxZQUFBLGVBQUEzSCxLQUFBLDZCQUFBa0MsS0FBQSxTQUFBd0YsSUFBQSxRQUFBL0IsV0FBQSx5QkFBQWdDLFlBQUEsZUFBQTNILEtBQUEsMEJDQUEsV0FDQSxZQUdBbE4sU0FBQUMsT0FBQSxnQkFHQThULFFBQUEsYUFBQSxXQUFBLFNBQUFlLEdBRUEsR0FBQUMsSUFDQWxFLE9BQ0FtRSxNQUFBLFVBQ0FDLE9BQUEsa0JBQ0FDLE1BQUEsZ0JBQ0FDLE1BQUEsaUJBR0FDLE9BQ0FsSyxNQUFBLHNCQUdBQyxTQUNBWSxPQUFBLG9CQUNBRixRQUFBLHFCQUNBOEgsTUFBQSxtQkFDQUcsTUFBQSxtQkFDQXBJLEtBQUEsbUJBQ0E5QyxRQUFBa00sRUFBQTVKLE9BQUEsWUFDQUcsUUFBQSxLQUNBTyxTQUFBLEdBQ0FSLEtBQUEsR0FDQUYsTUFBQSxJQUlBLE9BQUE2SixTQ25DQSxXQUNBLFlBRUEsU0FBQU0sS0FDQSxHQUFBQyxLQU1BLE9BTEFDLFVBQUFuSSxPQUFBb0ksT0FBQSxHQUFBL0wsTUFBQSxLQUFBZ00sUUFBQSxTQUFBQyxHQUNBLEdBQUFDLEdBQUFELEVBQUFqTSxNQUFBLEtBQUEsR0FDQW1NLEVBQUFDLG1CQUFBSCxFQUFBak0sTUFBQSxLQUFBLEdBQ0FrTSxLQUFBTCxHQUFBQSxFQUFBSyxHQUFBRyxLQUFBRixHQUFBTixFQUFBSyxJQUFBQyxLQUVBTixFQWlDQSxRQUFBdEssR0FBQStLLEVBQUFDLEVBQUEzTCxHQUNBMEwsRUFBQUUsVUFBQSxTQUdBRCxFQUFBRSxXQUFBLEdBQUFDLFdBQUEsS0FJQSxRQUFBQyxLQUNBQyxVQUFBQyxPQUFBQyxTQUFBQyxNQXZDQXhXLFFBQUFDLE9BQUEsYUFDQSxZQUNBLFlBR0EsYUFDQSw0QkFDQSx1Q0FHQSxrQkFHQSxZQUNBLFlBQ0EsYUFDQSxlQUNBLGNBQ0EsYUFDQSxlQUNBLGNBQ0Esc0JBRUF3QixNQUFBLFdBQUE0VCxLQUNBckssT0FBQUEsR0FDQW9MLElBQUFBLEdBR0FwTCxFQUFBeUwsU0FBQSxxQkFBQSx3QkN6Q0EsV0FBQXpXLFFBQUFDLE9BQUEsYUFBQW1XLEtBQUEsaUJBQUEsU0FBQU0sR0FBQUEsRUFBQUMsSUFBQSwyQkFDQSxxc0JDREEsV0FBQTNXLFFBQUFDLE9BQUEsYUFBQW1XLEtBQUEsaUJBQUEsU0FBQU0sR0FBQUEsRUFBQUMsSUFBQSx1QkFDQSIsImZpbGUiOiJBRkJjbGllbnQubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8ZGl2ICBuZy1jbGljaz1cImNsaWNrZWQoKVwiPiA8c3Bhbj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ1N1Ym1pdEJ1dHRvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgnc3VibWl0QnV0dG9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFqdXN0IGljb24gb3IgdXNlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiA9IGF0dHJzLmljb24gfHwgJ2ZpLWZvb3QnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdOZXh0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBsYWJlbCBhcyBjbGFzc1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzIChzY29wZS5sYWJlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IGNsaWNrZWQgaW4gaW1wb3J0ZWQgYW5kIHdoZW4gdGVtcGxhdGUgaXMgY2xpY2tlZFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGNhbGwgY2xpY2tlZCBtZXRob2QgcGFzc2VkIGluIHBhcmFtLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge2NsaWNrZWQgOiAnPSd9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICogXG4gKiByZWY6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9tb3VzZW92ZXJcbiAqIFxuICogdXNhZ2U6IFxuVXNhZ2UgIDxyYW5nZS1zbGlkZXI+XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIDxyYW5nZS1zbGlkZXJcbiAgICAgIGlkPVwibXktc2xpZGVyLW5hbWVcIiAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXNlIGFzIGFuIGFyZ3VtZW50IHRvIGNhbGxiYWNrXG4gICAgICBjbGFzcz1cIm15LWN1c3RvbS1jbGFzc1wiICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNsYXNzIGlzIGliei1yYW5nZS1zbGlkZXJcbiAgICAgIHBsYWNlaG9sZGVyPVwiVHJhY2sgRGF0ZSBTZWxlY3Rpb25cIiAgICAgIC8vIHBsYWNlIGhvbGRlciBmb3IgZGF0ZSByZWFkb25seSBpbnB1dCB6b25lXG5cbiAgICAgIDwhLS0gRm91bmRhdGlvbiBjbGFzc2VzIC0tPlxuICAgICAgY2xhc3M9XCJyYWRpdXNcIiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgWnVyYiBmb3VuZGF0aW9uIGRvYyBmb3IgZnVydGhlciBpbmZvLlxuICAgICAgY2xhc3M9XCJpYnotaGFuZGxlLWRpc3BsYXlcIiAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgaGFuZGxlIHdpZHRoIHRvIGhvbGQgc2xpZGVyIGN1cnJlbnQgdmFsdWVcblxuICAgICAgPCEtLSBBbmd1bGFyIFNjb3BlIFZhcmlhYmxlcyAtLT5cbiAgICAgIGNhbGxiYWNrPVwibXlDYWxsQmFja1wiICAgICAgICAgICAgICAgICAgICAvLyAkc2NvcGUubXlDYWxsQmFjayhzbGlkZXJoYW5kbGUpIGlzIGNhbGxlZCB3aGVuIGV2ZXIgc2xpZGVyIGhhbmRsZSBibHVyXG4gICAgICBmb3JtYXR0ZXI9XCJTbGlkZXJGb3JtYXRDQlwiICAgICAgICAgICAgICAgLy8gJHNjb3BlLm15Rm9ybWF0dGVyKHZhbHVlLCBzbGlkZXJpZCkgd2hlbiBleGlzdCBpcyBjYWxsIHdoZW4gZXZlciBzbGlkZXIgaGFuZGxlIG1vdmVzLiBTaG91bGQgcmV0dXJuIGV4dGVybmFsIGZvcm0gb2Ygc2xpZGVyIHZhbHVlLlxuICAgICAgbmctbW9kZWw9XCJ4eHh4eHhcIiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHh4eCBNdXN0IGJlIGRlZmluZWQsIHNjcmlwdCB3aWxsIHN0b3JlIGEgbmV3IFJhbmdlck9iamVjdCB3aXRoaW4gcHJvdmlkZWQgbmctbW9kZWwgdmFyaWFibGUuXG4gICAgICBzdGFydC1hdD1cIlNjb3BlVmFyXCIgICAgICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBsaW1pdGF0aW9uIHdoZW4gc2xpZGVyIGlzIGNvbnN0cmFpbnMgYnkgYW4gZXh0ZXJuYWwgY29tcG9uYW50IFtleDogY2hlY2sgaW4vb3V0XVxuICAgICAgc3RvcC1hdD1cIlNjb3BlVmFyXCIgICAgICAgICAgICAgICAgICAgICAgIC8vIElkZW0gYnV0IGZvciBlbmQuXG5cbiAgICAgIDwhLS0gQW5ndWxhciBEaXJlY3RpdmUgQXR0cmlidXRlcyAtLT5cbiAgICAgIG5vdC1sZXNzPVwiaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBzdGFydGluZyB2YWx1ZSBmb3Igc2xpZGVyIFtkZWZhdWx0IDBdXG4gICAgICBub3QtbW9yZT1cImludGVnZXJcIiAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgZW5kIHZhbHVlIGZvciBzbGlkZXJzIFtkZWZhdWx0IDEwMF1cbiAgICAgIGJ5LXN0ZXA9XCIrLWludGVnZXJcIiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBieS1zdGVwIGlzID4wIHRoZW4gc2xpZGVyIHVzZSBpdCBhcyBzdGVwLXZhbHVlLCB3aGVuIG5lZ2F0aXZlIHVzZSBpdCBmb3IgZGVjaW1hbCBwcmVjaXNpb25cbiAgICAgIGRpc3BsYXktdGFyZ2V0PVwiaGFuZGxlXCIgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHNsaWRlciBleHRlcm5hbCBmb3JtYXRlZCB2YWx1ZSBpbiB0aGUgaGFuZGxlIFtyZXF1aXJlciBjYWxzcz1cImliei1oYW5kbGUtZGlzcGxheVwiXVxuICAgICAgZHVhbC1oYW5kbGVzPSd0cnVlJyAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYSBzZWNvbmQgaGFuZGxlIHRvIHNsaWRlciBmb3IgbWluL21heCByYW5nZVxuICAgICAgaW5pdGlhbD0ndmFsdWV8W3N0YXJ0L3N0b3BdJyAgICAgICAgICAgICAvLyBzbGlkZXIgaW5pdGlhbCB2YWx1ZSBbZHVhbC1oYW5kbGVzXSBtYXkgaGF2ZSBpbml0aWFsIHZhbHVlc1xuICAgLz48L3JhbmdlLXNsaWRlcj5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxudmFyIFJhbmdlU2xpZGVyID0gYW5ndWxhci5tb2R1bGUoJ1JhbmdlU2xpZGVyJyxbXSk7XG5cbmZ1bmN0aW9uIFJhbmdlU2xpZGVySGFuZGxlIChzY29wZSkge1xuICAgIHZhciBpbnRlcm5hbHMgPSBbXTtcbiAgICB2YXIgZXh0ZXJuYWxzID0gW107XG5cbiAgICB0aGlzLmdldElkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzY29wZS5zbGlkZXJpZDtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRDYkhhbmRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2NvcGUuY2JoYW5kbGU7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Vmlldz0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcblxuICAgICAgICAvLyBpZiB2YWx1ZSBkaWQgbm90IGNoYW5nZSByZXR1cm4gY3VycmVudCBleHRlcm5hbCByZXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoc2NvcGUudmFsdWVbaGFuZGxlXSA9PT0gaW50ZXJuYWxzW2hhbmRsZV0pIHJldHVybiBleHRlcm5hbHNbaGFuZGxlXTtcblxuICAgICAgICAvLyBidWlsZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgc2F2ZSBpdCBmb3IgZnVydGhlciByZXF1ZXN0c1xuICAgICAgICBpbnRlcm5hbHNbaGFuZGxlXSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG4gICAgICAgIGlmIChzY29wZS5mb3JtYXR0ZXIpIGV4dGVybmFsc1toYW5kbGVdID0gc2NvcGUuZm9ybWF0dGVyKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICBlbHNlICBleHRlcm5hbHNbaGFuZGxlXSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgcmV0dXJuIGV4dGVybmFsc1toYW5kbGVdO1xuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZUNsYXNzID0gZnVuY3Rpb24gKGNsYXNzZSwgc3RhdHVzKSB7XG4gICAgICAgc2NvcGUudXBkYXRlQ2xhc3MgKGNsYXNzZSwgc3RhdHVzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JjZVJlZnJlc2ggPSBmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICBzY29wZS5mb3JjZVJlZnJlc2godGltZXIpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFZhbHVlPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICByZXR1cm4gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRSZWxhdGl2ZT0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcbiAgICAgICAgcmV0dXJuIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV07XG4gICAgfTtcblxuICAgIHRoaXMuc2V0VmFsdWU9IGZ1bmN0aW9uICh2YWx1ZSwgaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICBzY29wZS5zZXRWYWx1ZSAodmFsdWUsIGhhbmRsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0RGlzYWJsZT0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgc2NvcGUuc2V0RGlzYWJsZShmbGFnKTtcbiAgICB9O1xufVxuXG5SYW5nZVNsaWRlci5kaXJlY3RpdmUoJ3JhbmdlU2xpZGVyJywgW1wiJGxvZ1wiLCBcIiRkb2N1bWVudFwiLCBcIiR0aW1lb3V0XCIsIGZ1bmN0aW9uICgkbG9nLCAkZG9jdW1lbnQsICR0aW1lb3V0KSB7XG5cbiAgICB2YXIgdGVtcGxhdGU9ICc8ZGl2IGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlciByYW5nZS1zbGlkZXJcIiB0aXRsZT1cInt7dGl0bGV9fVwiZGF0YS1zbGlkZXI+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInJhbmdlLXNsaWRlci1oYW5kbGUgaGFuZGxlLW1pblwiIG5nLW1vdXNlZG93bj1cImhhbmRsZUNCKCRldmVudCwwKVwiIG5nLWZvY3VzPVwiZm9jdXNDQih0cnVlKVwiIG5nLWJsdXI9XCJmb2N1c0NCKGZhbHNlKVwiIHJvbGU9XCJzbGlkZXJcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImhhbmRsZS1tYXhcIiBuZy1tb3VzZWRvd249XCJoYW5kbGVDQigkZXZlbnQsMSlcIiBuZy1mb2N1cz1cImZvY3VzQ0IodHJ1ZSlcIiBuZy1ibHVyPVwiZm9jdXNDQihmYWxzZSlcIiByb2xlPVwic2xpZGVyXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPicrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJyYW5nZS1zbGlkZXItYWN0aXZlLXNlZ21lbnRcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImliei1yYW5nZS1zbGlkZXItc3RhcnRcIiA+PC9zcGFuPiAnK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlci1zdG9wXCI+PC9zcGFuPiAnK1xuICAgICAgICAgICAgICAgICAgJzxpbnB1dCBpZD17e3NsaWRlcmlkfX0gdHlwZT1cImhpZGRlblwiPicrXG4gICAgICAgICAgICAgICAgICAnPC9kaXY+JztcblxuXG4gICAgZnVuY3Rpb24gbGluayAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBtb2RlbCkge1xuICAgICAgICAvLyBmdWxsIGluaXRpYWxpc2F0aW9uIG9mIHNsaWRlciBmcm9tIGEgc2luZ2xlIG9iamVjdFxuICAgICAgICBzY29wZS5pbml0V2lkZ2V0ID0gZnVuY3Rpb24gKGluaXR2YWx1ZXMpIHtcblxuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMuYnlTdGVwKSAgc2NvcGUuYnlTdGVwICA9IHBhcnNlSW50KGluaXR2YWx1ZXMuYnlTdGVwKTtcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLm5vdE1vcmUpIHNjb3BlLm5vdE1vcmUgPSBwYXJzZUludChpbml0dmFsdWVzLm5vdE1vcmUpO1xuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMubm90TGVzcykgc2NvcGUubm90TGVzcyA9IHBhcnNlSW50KGluaXR2YWx1ZXMubm90TGVzcyk7XG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5pZCkgICAgICBzY29wZS5zbGlkZXJpZD0gaW5pdHZhbHVlcy5pZDtcblxuICAgICAgICAgICAgLy8gaHVnZWx5IGJ1dCBpbiBzb21lIGNhc2UgRE9NIGlzIG5vdCBmaW5pc2ggd2hlbiB3ZSB0cnkgdG8gc2V0IHZhbHVlcyAhISFcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLnZhbHVlICE9PSB1bmRlZmluZWQpICAge1xuICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlID0gaW5pdHZhbHVlcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBzY29wZS5mb3JjZVJlZnJlc2ggKDUwKTsgLy8gd2FpdCA1MG1zIGZvciBET00gdG8gYmUgcmVhZHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHJlY29tcHV0ZSBzbGlkZSBwb3NpdGlvbmluZ1xuICAgICAgICBzY29wZS5mb3JjZVJlZnJlc2ggPSBmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICAgICAgdmFyIHZhbHVlID0gc2NvcGUudmFsdWU7XG4gICAgICAgICAgIHNjb3BlLnZhbHVlID0gW3VuZGVmaW5lZCx1bmRlZmluZWRdO1xuICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICBzY29wZS5zZXRWYWx1ZSh2YWx1ZVswXSwwKTtcbiAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSAgc2NvcGUuc2V0VmFsdWUodmFsdWVbMV0sMSk7XG4gICAgICAgICAgIH0sIHRpbWVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBoYW5kbGVyIHRvIGNoYW5nZSBjbGFzcyBmcm9tIHNsaWRlciBoYW5kbGVcbiAgICAgICAgc2NvcGUudXBkYXRlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NlLCBzdGF0dXMpIHtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cykgZWxlbWVudC5hZGRDbGFzcyAoY2xhc3NlKTtcbiAgICAgICAgICAgIGVsc2UgIGVsZW1lbnQucmVtb3ZlQ2xhc3MgKGNsYXNzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuc2V0RGlzYWJsZSA9IGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzIChcImRpc2FibGVcIik7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5jc3MgKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1sxXS5jc3MgKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzIChcImRpc2FibGVcIik7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5jc3MgKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSBzY29wZS5oYW5kbGVzWzFdLmNzcyAoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5ub3JtYWxpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcztcbiAgICAgICAgICAgIHZhciBwb2ludCA9IHZhbHVlICogcmFuZ2U7XG5cbiAgICAgICAgICAgIC8vIGlmIHN0ZXAgaXMgcG9zaXRpdmUgbGV0J3Mgcm91bmQgc3RlcCBieSBzdGVwXG4gICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gIDApIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kID0gKHBvaW50IC0gKHBvaW50ICUgc2NvcGUuYnlTdGVwKSkgLyBzY29wZS5ieVN0ZXA7XG4gICAgICAgICAgICAgICAgdmFyIHJlbSA9IHBvaW50ICUgc2NvcGUuYnlTdGVwO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJvdW5kID0gKHJlbSA+PSBzY29wZS5ieVN0ZXAgKiAwLjUgPyBzY29wZS5ieVN0ZXAgOiAwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQ9IChtb2QgKiBzY29wZS5ieVN0ZXAgKyByb3VuZCkgKyBzY29wZS5ub3RMZXNzO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cgKFwicmFuZ2U9JWQgdmFsdWU9JWQgcG9pbnQ9JWQgbW9kPSVkIHJlbT0lZCByb3VuZD0lZCByZXN1bHQ9JWRcIiwgcmFuZ2UsIHZhbHVlLCBwb2ludCwgbW9kLCByZW0sIHJvdW5kLCByZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBuZWdhdGl2ZSByZXR1cm4gcm91bmQgdG8gYXNrZWQgZGVjaW1hbFxuICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA8ICAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvd2VyICA9ICBNYXRoLnBvdyAoMTAsKHNjb3BlLmJ5U3RlcCAqIC0xKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2NvcGUubm90TGVzcyArIHBhcnNlSW50IChwb2ludCAqIHBvd2VyKSAvIHBvd2VyO1xuICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBudWxsIHJldHVybiBmdWxsIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gcG9pbnQ7XG4gICAgICAgfTtcblxuICAgICAgICAvLyByZXR1cm4gY3VycmVudCB2YWx1ZVxuICAgICAgICBzY29wZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChvZmZzZXQsIGhhbmRsZSkge1xuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9IChvZmZzZXQgLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgLyAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSBvZmZzZXQgLyAgKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5ld3ZhbHVlID0gc2NvcGUubm9ybWFsaXplIChzY29wZS5yZWxhdGl2ZVtoYW5kbGVdKTtcblxuXG4gICAgICAgICAgICAvLyBpZiBpbnRlcm5hbCB2YWx1ZSBjaGFuZ2UgdXBkYXRlIG9yIG1vZGVsXG4gICAgICAgICAgICBpZiAobmV3dmFsdWUgIT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3dmFsdWUgPCBzY29wZS5zdGFydFZhbHVlKSBuZXd2YWx1ZT1zY29wZS5zdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA+IHNjb3BlLnN0b3BWYWx1ZSkgIG5ld3ZhbHVlPXNjb3BlLnN0b3BWYWx1ZTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSBzY29wZS5mb3JtYXR0ZXIgKG5ld3ZhbHVlLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSBuZXd2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXNbaGFuZGxlXS5odG1sIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICBzY29wZS52YWx1ZVtoYW5kbGVdID0gbmV3dmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGVsKSBtb2RlbC4kc2V0Vmlld1ZhbHVlIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA+IHNjb3BlLnN0YXJ0VmFsdWUgJiYgbmV3dmFsdWUgPCBzY29wZS5zdG9wVmFsdWUpIHNjb3BlLnRyYW5zbGF0ZShvZmZzZXQsIGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICBzY29wZS5zZXRTdGFydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHZhbHVlID4gc2NvcGUudmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwwKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhcnQuY3NzKCdoZWlnaHQnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXJ0LmNzcygnd2lkdGgnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS5zdGFydFZhbHVlPSB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zZXRTdG9wID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzY29wZS52YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDApO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGFydC5jc3MoJ2hlaWdodCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RvcC5jc3MoeydyaWdodCc6IDAsICd3aWR0aCc6IChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICAtIG9mZnNldCkgKyAncHgnfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnN0b3BWYWx1ZT0gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKG9mZnNldCwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIC8vIHRha2UgaGFuZGxlIHNpemUgaW4gYWNjb3VudCB0byBjb21wdXRlIG1pZGRsZVxuICAgICAgICAgICAgICAgIHZhciB2b2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzW2hhbmRsZV0uY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tb3otdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW8tdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KSdcbiAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zbGlkZXIuY3NzKCdoZWlnaHQnLCBvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjb3BlLnJlbGF0aXZlWzFdICYmIHNjb3BlLnJlbGF0aXZlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IChzY29wZS5yZWxhdGl2ZVsxXSAtIHNjb3BlLnJlbGF0aXZlWzBdKSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICBzdGFydCAgPSAoc2NvcGUucmVsYXRpdmVbMF0gKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgIHNjb3BlLnNsaWRlci5jc3MgKHsnYm90dG9tJzogc3RhcnQrJ3B4JywnaGVpZ2h0JzogaGVpZ2h0ICsgJ3B4J30pO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctbW96LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctby10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNsaWRlci5jc3MoJ3dpZHRoJyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29wZS5yZWxhdGl2ZVsxXSAmJiBzY29wZS5yZWxhdGl2ZVswXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSAoc2NvcGUucmVsYXRpdmVbMV0gLSBzY29wZS5yZWxhdGl2ZVswXSkgKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAoc2NvcGUucmVsYXRpdmVbMF0gKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNsaWRlci5jc3MgKHsnbGVmdCc6IHN0YXJ0KydweCcsJ3dpZHRoJzogd2lkdGggKyAncHgnfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIGhhbmRsZSBvbiB0aGUgYmFyIGRlcGVuZGluZyBhIGdpdmVuIHZhbHVlXG4gICAgICAgIHNjb3BlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlICwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuXG4gICAgICAgICAgICAvLyBpZiB2YWx1ZSBkaWQgbm90IGNoYW5nZSBpZ25vcmVcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpICAgdmFsdWU9MDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IHNjb3BlLm5vdE1vcmUpIHZhbHVlPXNjb3BlLm5vdE1vcmU7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzY29wZS5ub3RMZXNzKSB2YWx1ZT1zY29wZS5ub3RMZXNzO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDApIG9mZnNldCA9IChzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpICsgc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQvMjtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09PSAxKSBvZmZzZXQgPSBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9ICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogIChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnRyYW5zbGF0ZSAob2Zmc2V0LGhhbmRsZSk7XG4gICAgICAgICAgICBzY29wZS52YWx1ZVtoYW5kbGVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGNhbGwgdGhyb3VnaCBzZXRWYWx1ZSB3ZSBkbyBub3QgcGFzcyBjYkhhbmRsZVxuICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHNjb3BlLmZvcm1hdHRlciAodmFsdWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobW9kZWwpIG1vZGVsLiRzZXRWaWV3VmFsdWUoIHNjb3BlLnZpZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5kaXNwbGF5c1toYW5kbGVdKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXNbaGFuZGxlXS5odG1sIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgLy8gTWluaW1hbCBrZXlzdHJva2UgaGFuZGxpbmcgdG8gY2xvc2UgcGlja2VyIHdpdGggRVNDIFtzY29wZS5hY3RpZiBpcyBjdXJyZW50IGhhbmRsZSBpbmRleF1cbiAgICAgICAgc2NvcGUua2V5ZG93bj0gIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgICAgICBzd2l0Y2goZS5rZXlDb2RlKXtcbiAgICAgICAgICAgICAgICBjYXNlIDM5OiAvLyBSaWdodFxuICAgICAgICAgICAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdK3Njb3BlLmJ5U3RlcCksIHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdKygxIC8gTWF0aC5wb3coMTAsIHNjb3BlLmJ5U3RlcCotMSkpKSxzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrKSAgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM3OiAvLyBsZWZ0XG4gICAgICAgICAgICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdIC0gc2NvcGUuYnlTdGVwKSwgc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA8IDApIHNjb3BlLiRhcHBseShzY29wZS5zZXRWYWx1ZSAoKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSAtICgxIC8gTWF0aC5wb3coMTAsIHNjb3BlLmJ5U3RlcCotMSkpKSxzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spICBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzogLy8gZXNjXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbc2NvcGUuYWN0aWZdWzBdLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5tb3ZlSGFuZGxlID0gZnVuY3Rpb24gKGhhbmRsZSwgY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gY2xpZW50WTtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNsaWVudFggLSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoKGNsaWVudFggKyBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSA+IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS5nZXRWYWx1ZSAgKG9mZnNldCwgaGFuZGxlKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkdWFsIGhhbmRsZSB0byBjcm9zc1xuICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwgJiYgc2NvcGUudmFsdWUgWzBdID4gc2NvcGUudmFsdWVbMV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09PSAwKSBzY29wZS5zZXRWYWx1ZSAoc2NvcGUudmFsdWVbMF0gLCAxKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNjb3BlLnNldFZhbHVlKHNjb3BlLnZhbHVlWzFdLDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgc2NvcGUuZm9jdXNDQiA9IGZ1bmN0aW9uIChpbnNpZGUpIHtcbiAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQub24oJ2tleWRvd24nLHNjb3BlLmtleWRvd24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdrZXlkb3duJyxzY29wZS5rZXlkb3duKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBiYXIgd2FzIHRvdWNoIGxldCBtb3ZlIGhhbmRsZSB0byB0aGlzIHBvaW50XG4gICAgICAgIHNjb3BlLnRvdWNoQmFyQ0IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGU9MDtcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZTtcbiAgICAgICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXM7XG4gICAgICAgICAgICB2YXIgb2xkdmFsdWUgPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHR3byBoYW5kbGVzIHNlbGVjdCBjbG9zZXN0IG9uZSBmcm9tIHRvdWNoIHBvaW50XG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkgcmVsYXRpdmUgPSAodG91Y2hlc1swXS5wYWdlWSAtIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAvIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGVsc2UgcmVsYXRpdmU9ICh0b3VjaGVzWzBdLnBhZ2VYIC0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSAvIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UwID0gTWF0aC5hYnMocmVsYXRpdmUgLSBzY29wZS5yZWxhdGl2ZVswXSk7XG4gICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlMSA9IE1hdGguYWJzKHJlbGF0aXZlIC0gc2NvcGUucmVsYXRpdmVbMV0pO1xuICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZTEgPCBkaXN0YW5jZTApIGhhbmRsZT0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtb3ZlIGhhbmRsZSB0byBuZXcgcGxhY2VcbiAgICAgICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgKGhhbmRsZSx0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGhhbmRsZSB3YXMgdG91Y2ggYW5kIGRyYWdcbiAgICAgICAgc2NvcGUudG91Y2hIYW5kbGVDQiA9IGZ1bmN0aW9uICh0b3VjaGV2dCwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgb2xkdmFsdWUgPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuXG4gICAgICAgICAgICB0b3VjaGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCd0b3VjaG1vdmUnLHRvdWNobW92ZSk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ3RvdWNoZW5kJyAsdG91Y2hlbmQpO1xuICAgICAgICAgICAgZWxlbWVudC51bmJpbmQoJ3RvdWNoc3RhcnQnLCBzY29wZS50b3VjaEJhckNCKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdG91Y2htb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IHRvdWNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5tb3ZlSGFuZGxlIChoYW5kbGUsdG91Y2hlc1tpZHhdLnBhZ2VYLCB0b3VjaGVzW2lkeF0ucGFnZVkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gdG91Y2hlbmQoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ3RvdWNobW92ZScsdG91Y2htb3ZlKTtcbiAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ3RvdWNoZW5kJyAsdG91Y2hlbmQpO1xuICAgICAgICAgICAgICAgZWxlbWVudC5vbigndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgY2hhbmdlIG5vdGlmeSBhcHBsaWNhdGlvbiBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmhhbmRsZUNCID0gZnVuY3Rpb24gKGNsaWNrZXZlbnQsIGhhbmRsZSkge1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuYXV0b21hdGljKSByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG4gICAgICAgICAgICAvLyByZWdpc3RlciBtb3VzZSBldmVudCB0byB0cmFjayBoYW5kbGVcbiAgICAgICAgICAgIGNsaWNrZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCdtb3VzZW1vdmUnLG1vdXNlbW92ZSk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ21vdXNldXAnLCBtb3VzZXVwKTtcbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXVswXS5mb2N1cygpO1xuICAgICAgICAgICAgc2NvcGUuYWN0aWY9aGFuZGxlO1xuXG4gICAgICAgICAgICAvLyBzbGlkZXIgaGFuZGxlIGlzIG1vdmluZ1xuICAgICAgICAgICAgZnVuY3Rpb24gbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubW92ZUhhbmRsZSAoaGFuZGxlLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbW91c2UgaXMgdXAgZGFucyBsZWF2ZSBzbGlkZXIgc2VuZCByZXNpemUgZXZlbnRzXG4gICAgICAgICAgICBmdW5jdGlvbiBtb3VzZXVwKCkge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ21vdXNlbW92ZScsIG1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgnbW91c2V1cCcsIG1vdXNldXApO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgY2hhbmdlIG5vdGlmeSBhcHBsaWNhdGlvbiBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHNpbXVsYXRlIGpxdWVyeSBmaW5kIGJ5IGNsYXNzZXMgY2FwYWJpbGl0aWVzIFt3YXJuaW5nIG9ubHkgcmV0dXJuIDFzdCBlbGVtZW50c11cbiAgICAgICAgc2NvcGUuZmluZCA9IGZ1bmN0aW9uIChzZWxlY3QsIGVsZW0pIHtcbiAgICAgICAgICAgIHZhciBkb21lbGVtO1xuXG4gICAgICAgICAgICBpZiAoZWxlbSkgZG9tZWxlbSA9IGVsZW1bMF0ucXVlcnlTZWxlY3RvcihzZWxlY3QpO1xuICAgICAgICAgICAgZWxzZSBkb21lbGVtID0gZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgICAgICAgICAgIHZhciBhbmdlbGVtID0gYW5ndWxhci5lbGVtZW50KGRvbWVsZW0pO1xuICAgICAgICAgICAgcmV0dXJuIChhbmdlbGVtKTtcbiAgICAgICAgfTtcblxuXG5cbiAgICAgICAgc2NvcGUuaW5pdGlhbFNldHRpbmdzID0gZnVuY3Rpb24gKGluaXRpYWwpIHtcbiAgICAgICAgICAgIHZhciBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHQ7XG4gICAgICAgICAgICBzY29wZS52YWx1ZT1bXTsgIC8vIHN0b3JlIGxvdy9oZWlnaHQgdmFsdWUgd2hlbiB0d28gaGFuZGxlc1xuICAgICAgICAgICAgc2NvcGUucmVsYXRpdmU9W107XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5wcmVjaXNpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHQgPSAoJycgKyBzY29wZS5ieVN0ZXApLm1hdGNoKC9cXC4oW1xcZF0qKS8pO1xuICAgICAgICAgICAgICAgIHNjb3BlLnByZWNpc2lvbiA9IGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCAmJiBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHRbMV0gPyBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHRbMV0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcG9zaXRpb24gaGFuZGxlIHRvIGluaXRpYWwgdmFsdWUocylcbiAgICAgICAgICAgIGVsZW1lbnQub24oJ3RvdWNoc3RhcnQnLCBzY29wZS50b3VjaEJhckNCKTtcbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0ub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldnQpe3Njb3BlLnRvdWNoSGFuZGxlQ0IoZXZ0LDApO30pO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHNsaWRlciBoYXMgdHdvIGhhbmRsZXMgbG93L2hpZ2h0XG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMV0uYWRkQ2xhc3MoJ3JhbmdlLXNsaWRlci1oYW5kbGUnKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzFdLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oZXZ0KXtzY29wZS50b3VjaEhhbmRsZUNCKGV2dCwxKTt9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmluaXR2YWx1ZXMpIHNjb3BlLnNldFZhbHVlIChpbml0aWFsWzFdLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGluaXRzdGF0ZSBvYmplY3QgYXBwbHkgaXRcbiAgICAgICAgICAgIGlmIChzY29wZS5pbml0dmFsdWVzKSBzY29wZS5pbml0V2lkZ2V0IChzY29wZS5pbml0dmFsdWVzKTtcbiAgICAgICAgICAgIGVsc2UgICBzY29wZS5zZXRWYWx1ZSAoaW5pdGlhbFswXSwwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUuc2xpZGVyaWQgICA9IGF0dHJzLmlkIHx8IFwic2xpZGVyLVwiICsgcGFyc2VJbnQgKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0VmFsdWUgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICBzY29wZS5zdG9wVmFsdWUgID0gSW5maW5pdHk7XG4gICAgICAgICAgICBzY29wZS5ieVN0ZXAgICA9IHBhcnNlSW50KGF0dHJzLmJ5U3RlcCkgfHwgMTtcbiAgICAgICAgICAgIHNjb3BlLnZlcnRpY2FsID0gYXR0cnMudmVydGljYWwgICB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmR1YWwgICAgID0gYXR0cnMuZHVhbEhhbmRsZXN8fCBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLnRyaWdnZXJfaW5wdXRfY2hhbmdlPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLm5vdE1vcmUgID0gcGFyc2VJbnQoYXR0cnMubm90TW9yZSkgICB8fCAxMDA7XG4gICAgICAgICAgICBzY29wZS5ub3RMZXNzICA9IHBhcnNlSW50KGF0dHJzLm5vdExlc3MpICAgfHwgMDtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSBlbGVtZW50LmFkZENsYXNzKFwidmVydGljYWwtcmFuZ2VcIik7XG5cbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXM9IFtzY29wZS5maW5kKCcuaGFuZGxlLW1pbicpLCBzY29wZS5maW5kKCcuaGFuZGxlLW1heCcpXTtcbiAgICAgICAgICAgIHNjb3BlLmJhciAgICA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBzY29wZS5zbGlkZXIgPSBzY29wZS5maW5kKCcucmFuZ2Utc2xpZGVyLWFjdGl2ZS1zZWdtZW50Jyk7XG4gICAgICAgICAgICBzY29wZS5zdGFydCAgPSBzY29wZS5maW5kKCcuaWJ6LXJhbmdlLXNsaWRlci1zdGFydCcpO1xuICAgICAgICAgICAgc2NvcGUuc3RvcCAgID0gc2NvcGUuZmluZCgnLmliei1yYW5nZS1zbGlkZXItc3RvcCcpO1xuICAgICAgICAgICAgc2NvcGUuZGlzYWJsZT0gYXR0cnMuZGlzYWJsZSB8fCBmYWxzZTtcblxuICAgICAgICAgICAgc2NvcGUuY3RybGhhbmRsZSA9IG5ldyBSYW5nZVNsaWRlckhhbmRsZSAoc2NvcGUpO1xuXG4gICAgICAgICAgICAvLyBwcmVwYXJlIERPTSBvYmplY3QgcG9pbnRlciB0byBjb21wdXRlIHNpemUgZHluYW1pY2FsbHlcbiAgICAgICAgICAgIHNjb3BlLmJvdW5kcyA9IHtcbiAgICAgICAgICAgICAgICBiYXIgICAgOiBlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGhhbmRsZXM6IFtzY29wZS5oYW5kbGVzWzBdWzBdLCBzY29wZS5oYW5kbGVzWzFdWzBdXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGF0dHJzLmRpc2FibGUgPT09ICd0cnVlJykgc2NvcGUuc2V0RGlzYWJsZSh0cnVlKTtcblxuICAgICAgICAgICAgaWYgKGF0dHJzLmRpc3BsYXlUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJzLmRpc3BsYXlUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlIDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaGFuZGxlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5cyA9IHNjb3BlLmhhbmRsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmFkZENsYXNzKCdpYnotcmFuZ2Utc2xpZGVyLWRpc3BsYXknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSBzY29wZS5oYW5kbGVzWzFdLmFkZENsYXNzKCdpYnotcmFuZ2Utc2xpZGVyLWRpc3BsYXknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXMgPSAgWyRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAoYXR0cnMuZGlzcGxheVRhcmdldCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBzY29wZS5kaXNwbGF5cz1bXTtcblxuICAgICAgICAgICAgLy8gZXh0cmFjdCBpbml0aWFsIHZhbHVlcyBmcm9tIGF0dHJzIGFuZCBwYXJzZSBpbnRvIGludFxuICAgICAgICAgICAgaWYgKCFhdHRycy5pbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuaW5pdGlhbCAgPSBbc2NvcGUubmdNb2RlbCwgc2NvcGUubmdNb2RlbF07IC8vIGluaXRpYWxpemUgdG8gbW9kZWwgdmFsdWVzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsICA9IGF0dHJzLmluaXRpYWwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBzY29wZS5pbml0aWFsID0gW1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsWzBdICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCAoaW5pdGlhbFswXSkgOiBzY29wZS5ub3RMZXNzLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsWzFdICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCAoaW5pdGlhbFsxXSkgOiBzY29wZS5ub3RNb3JlXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW9uaXRvciBhbnkgY2hhbmdlcyBvbiBzdGFydC9zdG9wIGRhdGVzLlxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdzdGFydEF0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlIDwgc2NvcGUuc3RhcnRBdCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zY29wZS5zZXRWYWx1ZSAoc2NvcGUuc3RhcnRBdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5zdGFydEF0KSBzY29wZS5zZXRTdGFydCAoc2NvcGUuc3RhcnRBdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdzdG9wQXQnICwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlID4gc2NvcGUuc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2NvcGUuc2V0VmFsdWUgKHNjb3BlLnN0b3BBdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5zdG9wQXQpIHNjb3BlLnNldFN0b3AgKHNjb3BlLnN0b3BBdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gZmluaXNoIHdpZGdldCBpbml0aWFsaXNhdGlvblxuICAgICAgICAgICAgc2NvcGUuaW5pdGlhbFNldHRpbmdzIChzY29wZS5pbml0aWFsKTtcblxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmluaXQoKTtcbiAgICAgICAgXG4gICAgICAgICAvLyBzbGlkZXIgaXMgcmVhZHkgcHJvdmlkZSBjb250cm9sIGhhbmRsZSB0byBhcHBsaWNhdGlvbiBjb250cm9sbGVyXG4gICAgICAgIHNjb3BlLiR3YXRjaCAoJ2luaXRob29rJywgZnVuY3Rpb24gKCkgeyAgICAgICAgIC8vIGluaXQgVmFsdWVzIG1heSBhcnJpdmUgbGF0ZVxuICAgICAgICAgICAgaWYgKHNjb3BlLmluaXRob29rKSBzY29wZS5pbml0aG9vayAoc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjb3BlLiR3YXRjaCAoJ2luaXR2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7IFx0Ly8gaW5pdCBWYWx1ZXMgbWF5IGFycml2ZSBsYXRlXG4gICAgICAgICAgICBpZiAoc2NvcGUuaW5pdHZhbHVlcykgc2NvcGUuaW5pdFdpZGdldChzY29wZS5pbml0dmFsdWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdHdvLXdheSBiaW5kaW5nIGlmIG1vZGVsIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgc2NvcGUuJHdhdGNoICgnbmdNb2RlbCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgIHNjb3BlLnNldFZhbHVlKG5ld1ZhbHVlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5yZXR1cm4ge1xuICAgIHJlc3RyaWN0OiBcIkVcIiwgICAgLy8gcmVzdHJpY3QgdG8gPHJhbmdlLXNsaWRlcj4gSFRNTCBlbGVtZW50IG5hbWVcbiAgICBzY29wZToge1xuICAgICAgICBzdGFydEF0ICA6Jz0nLCAgLy8gRmlyc3QgYWNjZXB0YWJsZSBkYXRlXG4gICAgICAgIHN0b3BBdCAgIDonPScsICAvLyBMYXN0IGFjY2VwdGFibGUgZGF0ZVxuICAgICAgICBjYWxsYmFjayA6Jz0nLCAgLy8gQ2FsbGJhY2sgdG8gYWN0aWYgd2hlbiBhIGRhdGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgZm9ybWF0dGVyOic9JywgIC8vIENhbGxiYWNrIGZvciBkcmFnIGV2ZW50IGNhbGwgZWFjaCB0aW1lIGludGVybmFsIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgaW5pdGhvb2sgOic9JywgIC8vIEhvb2sgcG9pbnQgdG8gY29udHJvbCBzbGlkZXIgZnJvbSBBUElcbiAgICAgICAgY2JoYW5kbGUgOic9JywgIC8vIEFyZ3VtZW50IGFkZGVkIHRvIGV2ZXJ5IGNhbGxiYWNrXG4gICAgICAgIGluaXR2YWx1ZXM6Jz0nLCAgIC8vIEluaXRpYWwgdmFsdWVzIGFzIGEgc2luZ2xlIG9iamVjdFxuICAgICAgICBuZ01vZGVsOiAnPScgICAgLy8gdGhlIG1vZGVsIHZhbHVlXG4gICAgfSxcbiAgICByZXF1aXJlOiAnP25nTW9kZWwnLFxuICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgLy8gaHRtbCB0ZW1wbGF0ZSBpcyBidWlsZCBmcm9tIEpTXG4gICAgcmVwbGFjZTogdHJ1ZSwgICAgICAvLyByZXBsYWNlIGN1cnJlbnQgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGUgd2hpbGUgaW5oZXJpdGluZyBvZiBjbGFzc1xuICAgIGxpbms6IGxpbmsgICAgICAgICAgLy8gcGlja2FkYXRlIG9iamVjdCdzIG1ldGhvZHNcbn07XG59XSk7XG5cbmNvbnNvbGUubG9nIChcIlJhbmdlU2xpZGVyIExvYWRlZFwiKTtcblxufSkoKTsiLCIvKlxuIGFsc2EtZ2F0ZXdheSAtLSBwcm92aWRlIGEgUkVTVC9IVFRQIGludGVyZmFjZSB0byBBTFNBLU1peGVyXG5cbiBDb3B5cmlnaHQgKEMpIDIwMTUsIEZ1bHVwIEFyIEZvbGxcblxuIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvclxuIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cbiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiBhbG9uZyB3aXRoIHNjb3BlIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS5cblxuIFJlZmVyZW5jZXM6XG5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0ZW1wbGF0ZSA9XG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJhZmItbW9uaXRvclwiIG5nLWNsaWNrPVwiZ2V0cGluZygpXCI+JyArXG4gICAgICAgICAnPHNwYW4gY2xhc3M9XCJhZmItcmVmcmVzaC10b2tlblwiICA+YWZiOi8ve3tob3N0bmFtZX19Ont7aHR0cGRwb3J0fX08L3NwYW4+JyArXG4gICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4nICtcbiAgICAgICAgICc8L2Rpdj4nO1xuXG5cbi8vIHNjb3BlIG1vZHVsZSBpcyBsb2FkIHN0YXRpY2FsbHkgYmVmb3JlIGFueSByb3V0ZSBpcyBjYXRpdmF0ZWRcbmFuZ3VsYXIubW9kdWxlKCdUb2tlblJlZnJlc2gnLCBbJ0NvbmZpZ0FwcCcsICdNb2RhbE5vdGlmaWNhdGlvbiddKVxuXG4gICAgLmRpcmVjdGl2ZSAoJ3Rva2VuUmVmcmVzaCcsIFtcIiR0aW1lb3V0XCIsIFwiJGh0dHBcIiwgXCIkbG9jYXRpb25cIiwgXCJOb3RpZmljYXRpb25cIiwgXCJDb25maWdBcHBcIiwgZnVuY3Rpb24oJHRpbWVvdXQsICRodHRwLCAkbG9jYXRpb24sIE5vdGlmaWNhdGlvbiwgQ29uZmlnQXBwKSB7XG5cbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIHNjb3BlLnN0YXR1cz11bmRlZmluZWQ7IC8vIG5laXRoZXIgdGh1IG5laXRoZXIgZmFsc2VcbiAgICAgICAgXG4gICAgXG4gICAgICAgIHNjb3BlLm9ubGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgICAgKFwib25saW5lXCIpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJvZmZsaW5lXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm9mZmxpbmUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAgICAoXCJvZmZsaW5lXCIpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJvbmxpbmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5vbmVycm9yID0gZnVuY3Rpb24oZGF0YSwgZXJyY29kZSwgaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKHNjb3BlLnN0YXR1cyAhPT0gZmFsc2UpICB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLndhcm5pbmcgKHttZXNzYWdlOiBcIkFwcEZyYW1ld29yayBCaW5kZXIgTG9zdFwiLCBkZWxheTogNTAwMH0pO1xuICAgICAgICAgICAgICAgIHNjb3BlLm9mZmxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnN0YXR1cyA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihkYXRhLCBlcnJjb2RlLCBoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5zdGF0dXMgIT09IHRydWUpICB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgQ29uZmlnQXBwLnNlc3Npb24udG9rZW4gPSBkYXRhLnJlcXVlc3QudG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC51dWlkKSAgQ29uZmlnQXBwLnNlc3Npb24udXVpZCAgPSBkYXRhLnJlcXVlc3QudXVpZDtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0LnRpbWVvdXQpICBDb25maWdBcHAuc2Vzc2lvbi50aW1lb3V0ICA9IGRhdGEucmVxdWVzdC50aW1lb3V0O1xuXG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnN1Y2Nlc3MgKHttZXNzYWdlOiBcIkFwcEZyYW1ld29yayBCaW5kZXIgQmFjayB0byBMaXZlXCIsIGRlbGF5OiAzMDAwfSk7XG4gICAgICAgICAgICAgICAgc2NvcGUub25saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMgPSAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIEJpbmRlciBzdGF0dXNcbiAgICAgICAgc2NvcGUuZ2V0cGluZyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9ICRodHRwLmdldChDb25maWdBcHAuc2Vzc2lvbi5waW5nKyc/dG9rZW49JysgQ29uZmlnQXBwLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIHJlc3RhcnQgYSBuZXcgdGltZXIgZm9yIG5leHQgcGluZ1xuICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIENvbmZpZ0FwcC5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgQmluZGVyIHN0YXR1c1xuICAgICAgICBzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9ICRodHRwLmdldChDb25maWdBcHAuc2Vzc2lvbi5yZWZyZXNoKyc/dG9rZW49JysgQ29uZmlnQXBwLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG4gICAgICAgICAgICAvLyByZXN0YXJ0IGEgbmV3IHRpbWVyIGZvciBuZXh0IHJlZnJlc2ggdG8gMS80IG9mIHRpbWVvdXQgc2Vzc2lvblxuICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLnJlZnJlc2gsIENvbmZpZ0FwcC5zZXNzaW9uLnRpbWVvdXQgKjI1MCk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsIGNvbm5lY3Rpb25cbiAgICAgICAgc2NvcGUudGtjcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gJGh0dHAuZ2V0KENvbmZpZ0FwcC5zZXNzaW9uLmNyZWF0ZSsnP3Rva2VuPScrIENvbmZpZ0FwcC5zZXNzaW9uLmluaXRpYWwpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUub25zdWNjZXNzKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUub25lcnJvcik7XG4gICAgICAgIH07XG4gXG4gICAgICAgIHNjb3BlLmljb24gICAgICA9IGF0dHJzLmljb24gICB8fCBcImZpLWxpZ2h0YnVsYlwiO1xuICAgICAgICBzY29wZS5ob3N0bmFtZSAgPSAkbG9jYXRpb24uaG9zdCgpO1xuICAgICAgICBzY29wZS5odHRwZHBvcnQgPSAkbG9jYXRpb24ucG9ydCgpO1xuICAgICAgICBzY29wZS5hdXRvbG9nICAgPSBKU09OLnBhcnNlKGF0dHJzLmF1dG9sb2cgfHwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNjb3BlLmF1dG9sb2cpIHNjb3BlLnRrY3JlYXRlKCk7XG5cbiAgICAgICAgLy8gSW5pdCBwaW5nIGFuZCByZWZyZXNoIHByb2Nlc3NcbiAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIENvbmZpZ0FwcC5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICAkdGltZW91dCAoc2NvcGUucmVmcmVzaCwgQ29uZmlnQXBwLnNlc3Npb24udGltZW91dCAqMjUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6IFwiPVwiXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIGxpbms6IG15bWV0aG9kc1xuICAgIH07XG59XSk7XG5cbn0pKCk7XG5jb25zb2xlLmxvZyAoXCJUb2tlbiBSZWZyZXNoIExvYWRlZFwiKTtcblxuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKiBcbiAqIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL21vdXNlb3ZlclxuICogXG4gKiB1c2FnZTogXG4gKiBcbiAqIHRpcE1vZGFsOiBsaXN0ZW4gZXZlbnQgZnJvbSBlbGVtLnBhcmVudCgpIHRvIGRpc3BsYXkgdGlwLW1vZGFsXG4gKiAgICAgIDxkaXYgY2xhc3M9XCJ4eHh4XCI+XG4gKiAgICAgICAgICA8dGlwLW1vZGFsIHRpcD14eHh4PjwvdGlwLW1vZGFsPlxuICogICAgICAgICAgPGlucHV0LXRleHQgLi4uLj48L2lucHV0LXRleHQ+XG4gKiAgICAgIDwvZGl2PlxuICogICAgICBcbiAqIE5vdGU6IHVzZSBDU1MudmlzaWJpbGl0eSB0byBhdm9pZCBkaXNwbGF5IGZsaWNrZXJpbmcgYXQgaW5pdGlhbCBkaXNwbGF5LlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGwgPSAnPGRpdiBjbGFzcz1cInRpcC1tb2RhbC1wb3B1cFwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3t0aXB9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+PC9kaXY+JyA7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnTW9kYWxOb3RpZmljYXRpb24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ3RpcE1vZGFsJywgW1wiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCR0aW1lb3V0KSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudCA9IGVsZW0ucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsICAgID0gZWxlbS5maW5kKFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgdGlwIGRpc3BsYXkgdG8gYXZvaWQgYmxpbmtpbmcgd2hlbiBtb3ZpbmcgbW91c2UgZmFzdFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkaXNwbGF5ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFjdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnNob3cpIHNjb3BlLm1vZGFsLmNzcyh7b3BhY2l0eTogMSwgdmlzaWJpbGl0eTondmlzaWJsZSd9KTsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2hvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS50aW1lb3V0ID0gJHRpbWVvdXQoYWN0aW9uLCBzY29wZS5kZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzY29wZS5zaG93ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuY3NzKHtvcGFjaXR5OiAwLCB2aXNpYmlsaXR5OidoaWRkZW4nfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWp1c3QgaWNvbiBvciB1c2UgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pY29uICA9IGF0dHJzLmljb24gfHwgJ2ZpLWxpZ2h0YnVsYic7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgUGFyZW50IGVsZW1lbnQgdG8gZ2V0IG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5hZGRDbGFzcyAoJ2FzLW1vZGFsLXRpcCcpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnY2xpY2snLCBjbG9zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdmb2N1cycsIGRpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnbW91c2VvdmVyJywgZGlzcGxheSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdtb3VzZWxlYXZlJywgY2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnYmx1cicsIGNsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRlbGF5ID0gYXR0cnMuZGVsYXkgfHwgMTAwMDsgLy8gd2FpdCAxcyBiZWZvcmUgZGlzcGxheWluZyB0aXBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge3RpcDogXCI9XCJ9IC8vIHRpcCBtYXkgbm90IGJlIGRlZmluZWQgd2hlbiB3aWRnZXQgaXMgZGlzcGxheVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8c3BhbiB0aXRsZT1cIkdvdG86IHt7aHJlZn19XCIgbmctY2xpY2s9XCJjbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+JztcblxuXG4gICAgYW5ndWxhci5tb2R1bGUoJ0xpbmtCdXR0b24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ2xpbmtCdXR0b24nLCBbXCIkbG9jYXRpb25cIiwgZnVuY3Rpb24gKCRsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5jbGlja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLnF1ZXJ5KSAkbG9jYXRpb24ucGF0aChhdHRycy5ocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJGxvY2F0aW9uLnBhdGgoYXR0cnMuaHJlZikuc2VhcmNoKGF0dHJzLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhanVzdCBpY29uIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gPSBhdHRycy5pY29uICAgfHwgJ2ZpLWxpbmsnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdKdW1wJztcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaHJlZiAgPSBhdHRycy5ocmVmICB8fCAnL2hvbWUnO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxhYmVsIGFzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKHNjb3BlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqIFxuICogUmVmZXJlbmNlOlxuICogICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvRmlsZVJlYWRlciBcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Vc2luZ19maWxlc19mcm9tX3dlYl9hcHBsaWNhdGlvbnMjVXNpbmdfaGlkZGVuX2ZpbGVfaW5wdXRfZWxlbWVudHNfdXNpbmdfdGhlX2NsaWNrJTI4JTI5X21ldGhvZFxuICogICBodHRwczovL3VuY29ya2Vkc3R1ZGlvcy5jb20vYmxvZy9tdWx0aXBhcnRmb3JtZGF0YS1maWxlLXVwbG9hZC13aXRoLWFuZ3VsYXJqc1xuICogICBodHRwczovL3d3dy50ZXJsaWNpLmNvbS8yMDE1LzA1LzE2L3VwbG9hZGluZy1maWxlcy1sb2NhbGx5Lmh0bWxcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL25lcnZnaC9hbmd1bGFyLWZpbGUtdXBsb2FkL2Jsb2IvbWFzdGVyL3NyYy9zZXJ2aWNlcy9GaWxlVXBsb2FkZXIuanNcbiAqICAgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWxcbiAqICAgaHR0cDovL29uZWh1bmdyeW1pbmQuY29tL3ppcC1wYXJzaW5nLWpzemlwLWFuZ3VsYXIvXG4gKiAgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTUzNDE5MTIvaG93LXRvLWdvLWZyb20tYmxvYi10by1hcnJheWJ1ZmZlclxuICogICBcbiAqICAgQnVnczogemlwIGZpbGUgc2VudCBldmVuIHdoZW4gZmxhZyBhcyBpbnZhbGlkIFxuICovXG5cbiBcblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBXQVJOSU5HOiBBbmd1bGFyIG5nLWNoYW5nZSBkb2VzIG5vdCB3b3JrIG9uIGlucHV0L2ZpbGUuIExldCdzIGhvb2sgb3VyIGNhbGxiYWNrIHRocm91Z2ggc3RhbmRhcmQgSlMgZnVuY3Rpb25cbnZhciB0bXBsID0gICc8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwie3tuYW1lfX0taW5wdXRcIiBvbmNoYW5nZT1cImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLlVwTG9hZEZpbGUodGhpcy5maWxlcylcIiBhY2NlcHQ9XCJ7e21pbWV0eXBlfX1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPicrXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVwbG9hZC1maWxlXCIgbmctY2xpY2s9XCJpbWdDbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aW1nIGlkPVwie3tuYW1lfX0taW1nXCIgc3JjPVwie3t0aHVtYm5haWx9fVwiPicgK1xuICAgICAgICAgICAgJzxyYW5nZS1zbGlkZXIgbmctc2hvdz1cIiFub3NsaWRlclwiIGlkPVwie3tuYW1lfX0tc2xpZGVyXCIgYXV0b21hdGljPXRydWUgaW5pdGhvb2s9XCJTbGlkZXJJbml0Q0JcIj48L3JhbmdlLXNsaWRlcj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxuXG4vLyBTZXJ2aWNlIENyZWF0ZSB4Zm9ybSBpbnNlcnQgZmlsZXMgaW4gYW5kIFBvc3QgaXQgdG8gdXJsXG5mdW5jdGlvbiBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCB0aHVtYm5haWxDQikge1xuICAgIHZhciB4bWxSZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgeGZvcm0gID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgXG4gICAgdmFyIE9uTG9hZENCID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgc3RhdHVzID0gdGh1bWJuYWlsQ0IgKHRhcmdldCk7XG4gICAgICAgIC8vaWYgKHN0YXR1cykgeGZvcm0uYXBwZW5kKHNjb3BlLm5hbWUsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgfTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzbGlkZXIgZHVyaW5nIFVwbG9hZFxuICAgIHhtbFJlcS51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUgPyBldmVudC5sb2FkZWQgKiAxMDAgLyBldmVudC50b3RhbCA6IDApO1xuICAgICAgICBpZiAoc2NvcGUuc2xpZGVyKSBzY29wZS5zbGlkZXIuc2V0VmFsdWUgKHByb2dyZXNzKTtcbiAgICB9O1xuXG4gICAgLy8gVXBsb2FkIGlzIGZpbmlzaCBsZXQncyBub3RpZnkgY29udHJvbGVyIGNhbGxiYWNrXG4gICAgeG1sUmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcImVycm9yXCIpO1xuICAgICAgICB2YXIgcmVzcG9uc2UgPXtcbiAgICAgICAgICAgIHN0YXR1cyA6IHhtbFJlcS5zdGF0dXMsXG4gICAgICAgICAgICBoZWFkZXJzOiB4bWxSZXEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgXG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmNhbGxiYWNrIChyZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHhtbFJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlbGVtLmFkZENsYXNzIChcImVycm9yXCIpO1xuICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgICAgIHZhciByZXNwb25zZSA9e1xuICAgICAgICAgICAgc3RhdHVzIDogeG1sUmVxLnN0YXR1cyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHhtbFJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSBcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHJlc3BvbnNlKTtcbiAgICB9O1xuXG4gICAgeG1sUmVxLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVsZW0uYWRkQ2xhc3MgKFwiZXJyb3JcIik7XG4gICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgdmFyIHJlc3BvbnNlID17XG4gICAgICAgICAgICBzdGF0dXMgOiB4bWxSZXEuc3RhdHVzLFxuICAgICAgICAgICAgaGVhZGVyczogeG1sUmVxLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIFxuICAgICAgICB9O1xuICAgICAgICBzY29wZS5jYWxsYmFjayAocmVzcG9uc2UpO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmaWxlID0gZmlsZXNbaV07XG4gICAgICAgIGlmICghZmlsZS50eXBlLm1hdGNoKHNjb3BlLm1pbWV0eXBlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyAoXCJTZWxlY3RlZCBmaWxlPVwiICsgZmlsZS5uYW1lICsgXCIgc2l6ZT1cIisgZmlsZS5zaXplLzEwMjQgKyBcIiBUeXBlPVwiKyBmaWxlLnR5cGUpO1xuXG4gICAgICAgIC8vIEZpbGUgdG8gdXBsb2FkIGlzIHRvbyBiaWdcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IHNjb3BlLm1heHNpemUqMTAyNCkge1xuICAgICAgICAgICAgc2NvcGUudGh1bWJuYWlsID0gc2NvcGUuaXN0b29iaWc7IC8vIHdhcm5pbmcgaWYgaW1hZ2UgcGF0aCBpcyB3cm9uZyBub3RoaW5nIGhhcHBlblxuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCd0aHVtYm5haWwnKTsgLy8gd2Ugc2hvcnQtY2lyY3VpdCBBbmd1bGFyIHJlc3luYyBJbWFnZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gdXBsb2FkYWJsZSBmaWxlXG4gICAgICAgIGlmKGlzTmFOKGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgICAgIHNjb3BlLnRodW1ibmFpbCA9IHNjb3BlLmlzbm90dmFsaWQ7IFxuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCd0aHVtYm5haWwnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjb3BlLkJhc2VuYW1lPSBmaWxlLm5hbWUuc3BsaXQoJy8nKS5yZXZlcnNlKClbMF07XG4gICAgICAgIHNjb3BlLmltZ0VsZW1bMF0uZmlsZSA9IGZpbGU7XG5cbiAgICAgICAgLy8gSWYgRmlsZSBpcyBhbiBpbWFnZSBsZXQgZGlzcGxheSBpdCBub3dcbiAgICAgICAgaWYgKHRodW1ibmFpbENCKSB7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBPbkxvYWRDQjtcbiAgICAgICAgfSBcbiAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBpcyBPSyBsZXQncyBhZGQgZmlsZSB0byB4Zm9ybVxuICAgICAgICB4Zm9ybS5hcHBlbmQoc2NvcGUubmFtZSwgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9XG5cblxuICAgIC8vIGV2ZXJ5dGhpbmcgbG9va3MgT0sgbGV0J3MgUG9zdCBpdFxuICAgIHhtbFJlcS5vcGVuKFwiUE9TVFwiLCBwb3N0dXJsICwgdHJ1ZSk7XG4gICAgeG1sUmVxLnNlbmQoeGZvcm0pO1xufVxuXG5hbmd1bGFyLm1vZHVsZSgnVXBsb2FkRmlsZXMnLFsnQ29uZmlnQXBwJywgJ01vZGFsTm90aWZpY2F0aW9uJywgJ1JhbmdlU2xpZGVyJ10pXG5cbi5kaXJlY3RpdmUoJ3VwbG9hZEltYWdlJywgW1wiQ29uZmlnQXBwXCIsIFwiSlFlbXVcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24oQ29uZmlnQXBwLCAgSlFlbXUsIE5vdGlmaWNhdGlvbikge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB3aWRnZXQgaW1hZ2UgaGFuZGxlIGZyb20gdGVtcGxhdGVcbiAgICAgICAgc2NvcGUuaW1nRWxlbSAgICA9IGVsZW0uZmluZCgnaW1nJyk7XG4gICAgICAgIHNjb3BlLmlucHV0RWxlbSAgPSBlbGVtLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbWFnZSB3YXMgY2tpY2sgbGV0J3Mgc2ltdWxhdGUgYW4gaW5wdXQgKGZpbGUpIGNsaWNrXG4gICAgICAgIHNjb3BlLmltZ0NsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pbnB1dEVsZW1bMF0uY2xpY2soKTsgLy8gV2FybmluZyBBbmd1bGFyIFRyaWdnZXJFdmVudCBkb2VzIG5vdCB3b3JrISEhXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBTbGlkZXIgY29udHJvbCBoYW5kbGUgcmVnaXN0cmF0aW9uIGFmdGVyIGNyZWF0aW9uXG4gICAgICAgIHNjb3BlLlNsaWRlckluaXRDQj1mdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgICAgICAgIHNjb3BlLnNsaWRlcj0gc2xpZGVyOyBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwbG9hZCBpcyBkZWxlZ2F0ZWQgdG8gYSBzaGFyZWQgZnVuY3Rpb25cbiAgICAgICAgc2NvcGUuVXBMb2FkRmlsZT1mdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXJDQiA9IGZ1bmN0aW9uICh1cGxvYWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzY29wZS50aHVtYm5haWwgPSB1cGxvYWQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzY29wZS5pbWdFbGVtWzBdLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt1cGxvYWQudGFyZ2V0LnJlc3VsdF0sIHt0eXBlOiBcImltYWdlXCJ9KSk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyB0cnVlIGFjdGl2YXRlcyBwb3N0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHBvc3R1cmwgPSBhdHRycy5wb3N0dXJsICsgXCI/dG9rZW49XCIgKyBDb25maWdBcHAuc2Vzc2lvbi50b2tlbjtcbiAgICAgICAgICAgIG5ldyBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCByZWFkZXJDQik7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbGxpemUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGVzIHZhbHVlc1xuICAgICAgICBzY29wZS5uYW1lPSBhdHRycy5uYW1lIHx8ICdhdmF0YXInO1xuICAgICAgICBzY29wZS5jYXRlZ29yeT0gYXR0cnMuY2F0ZWdvcnkgIHx8ICdpbWFnZSc7XG4gICAgICAgIHNjb3BlLm1pbWV0eXBlPSAoYXR0cnMuYWNjZXB0IHx8ICdpbWFnZScpICsgJy8qJztcbiAgICAgICAgc2NvcGUubWF4c2l6ZT0gYXR0cnMubWF4c2l6ZSB8fCAxMDA7IC8vIGRlZmF1bHQgbWF4IHNpemUgMTAwS0JcbiAgICAgICAgc2NvcGUucmVnZXhwID0gbmV3IFJlZ0V4cCAoYXR0cnMuYWNjZXB0KyAnLionLCdpJyk7XG5cbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUudGh1bWJuYWlsPSBDb25maWdBcHAucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLnRodW1ibmFpbDtcbiAgICAgICAgZWxzZSAgc2NvcGUudGh1bWJuYWlsPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAndHV4LWJ6aC5wbmcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUuaXNub3R2YWxpZD0gQ29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc25vdHZhbGlkO1xuICAgICAgICBlbHNlICBzY29wZS5pc25vdHZhbGlkPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXNub3R2YWxpZC5wbmcnO1xuXG4gICAgICAgIGlmIChhdHRycy5pc3Rvb2JpZykgc2NvcGUuaXN0b29iaWc9IENvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXN0b29iaWc7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzdG9vYmlnPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXN0b29iaWcucG5nJztcbiAgICAgICAgc2NvcGUubm9zbGlkZXIgPSBhdHRycy5ub3NsaWRlciB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIWF0dHJzLnBvc3R1cmwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGUtdXBsb2FkICVzIHBvc3R1cmw9L2FwaS94eHh4L3h4eHggcmVxdWlyZWQnLCBzY29wZS5hdHRycyk7ICAgICAgICAgICAgXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbn1dKVxuICAgIFxuLmRpcmVjdGl2ZSgndXBsb2FkQXVkaW8nLCBbXCJDb25maWdBcHBcIiwgXCJKUWVtdVwiLCBcIk5vdGlmaWNhdGlvblwiLCBmdW5jdGlvbihDb25maWdBcHAsICBKUWVtdSwgTm90aWZpY2F0aW9uKSB7XG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICBcbiAgICAgICAgLy8gZ2V0IHdpZGdldCBpbWFnZSBoYW5kbGUgZnJvbSB0ZW1wbGF0ZVxuICAgICAgICBzY29wZS5pbWdFbGVtICAgID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgICAgICAgc2NvcGUuaW5wdXRFbGVtICA9IGVsZW0uZmluZCgnaW5wdXQnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEltYWdlIHdhcyBja2ljayBsZXQncyBzaW11bGF0ZSBhbiBpbnB1dCAoZmlsZSkgY2xpY2tcbiAgICAgICAgc2NvcGUuaW1nQ2xpY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLmlucHV0RWxlbVswXS5jbGljaygpOyAvLyBXYXJuaW5nIEFuZ3VsYXIgVHJpZ2dlckV2ZW50IGRvZXMgbm90IHdvcmshISFcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNsaWRlciBjb250cm9sIGhhbmRsZSByZWdpc3RyYXRpb24gYWZ0ZXIgY3JlYXRpb25cbiAgICAgICAgc2NvcGUuU2xpZGVySW5pdENCPWZ1bmN0aW9uIChzbGlkZXIpIHtcbiAgICAgICAgICAgc2NvcGUuc2xpZGVyPSBzbGlkZXI7IFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVXBsb2FkIGlzIGRlbGVnYXRlZCB0byBhIHNoYXJlZCBmdW5jdGlvblxuICAgICAgICBzY29wZS5VcExvYWRGaWxlPWZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgdmFyIHBvc3R1cmwgPSBhdHRycy5wb3N0dXJsICsgXCI/dG9rZW49XCIgKyBDb25maWdBcHAuc2Vzc2lvbi50b2tlbjtcbiAgICAgICAgICAgIG5ldyBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCBmYWxzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbGxpemUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGVzIHZhbHVlc1xuICAgICAgICBzY29wZS5uYW1lPSBhdHRycy5uYW1lIHx8ICdhdWRpbyc7XG4gICAgICAgIHNjb3BlLmNhdGVnb3J5PSBhdHRycy5jYXRlZ29yeSAgfHwgJ2F1ZGlvJztcbiAgICAgICAgc2NvcGUubWltZXR5cGU9IChhdHRycy5hY2NlcHQgfHwgJ2F1ZGlvJykgKyAnLyonO1xuICAgICAgICBzY29wZS5tYXhzaXplPSBhdHRycy5tYXhzaXplIHx8IDEwMDAwOyAvLyBkZWZhdWx0IG1heCBzaXplIDEwTUJcbiAgICAgICAgc2NvcGUucmVnZXhwID0gbmV3IFJlZ0V4cCAoYXR0cnMuYWNjZXB0KyAnLionLCdpJyk7XG5cbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUudGh1bWJuYWlsPSBDb25maWdBcHAucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLnRodW1ibmFpbDtcbiAgICAgICAgZWxzZSAgc2NvcGUudGh1bWJuYWlsPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAndXBsb2FkLW11c2ljLnBuZyc7XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0cnMudGh1bWJuYWlsKSBzY29wZS5pc25vdHZhbGlkPSBDb25maWdBcHAucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLmlzbm90dmFsaWQ7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzbm90dmFsaWQ9Q29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc25vdHZhbGlkLnBuZyc7XG5cbiAgICAgICAgaWYgKGF0dHJzLmlzdG9vYmlnKSBzY29wZS5pc3Rvb2JpZz0gQ29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc3Rvb2JpZztcbiAgICAgICAgZWxzZSAgc2NvcGUuaXN0b29iaWc9Q29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc3Rvb2JpZy5wbmcnO1xuICAgICAgICBzY29wZS5ub3NsaWRlciA9IGF0dHJzLm5vc2xpZGVyIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICghYXR0cnMucG9zdHVybCkgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZS11cGxvYWQgJXMgcG9zdHVybD0vYXBpL3h4eHgveHh4eCByZXF1aXJlZCcsIHNjb3BlLmF0dHJzKTsgICAgICAgICAgICBcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufV0pXG5cbi5kaXJlY3RpdmUoJ3VwbG9hZEFwcGxpJywgW1wiQ29uZmlnQXBwXCIsIFwiSlFlbXVcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24oQ29uZmlnQXBwLCAgSlFlbXUsIE5vdGlmaWNhdGlvbikge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB3aWRnZXQgaW1hZ2UgaGFuZGxlIGZyb20gdGVtcGxhdGVcbiAgICAgICAgc2NvcGUuaW1nRWxlbSAgICA9IGVsZW0uZmluZCgnaW1nJyk7XG4gICAgICAgIHNjb3BlLmlucHV0RWxlbSAgPSBlbGVtLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbWFnZSB3YXMgY2tpY2sgbGV0J3Mgc2ltdWxhdGUgYW4gaW5wdXQgKGZpbGUpIGNsaWNrXG4gICAgICAgIHNjb3BlLmltZ0NsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pbnB1dEVsZW1bMF0uY2xpY2soKTsgLy8gV2FybmluZyBBbmd1bGFyIFRyaWdnZXJFdmVudCBkb2VzIG5vdCB3b3JrISEhXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBTbGlkZXIgY29udHJvbCBoYW5kbGUgcmVnaXN0cmF0aW9uIGFmdGVyIGNyZWF0aW9uXG4gICAgICAgIHNjb3BlLlNsaWRlckluaXRDQj1mdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgICAgICAgIHNjb3BlLnNsaWRlcj0gc2xpZGVyOyBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwbG9hZCBpcyBkZWxlZ2F0ZWQgdG8gYSBzaGFyZWQgZnVuY3Rpb25cbiAgICAgICAgc2NvcGUuVXBMb2FkRmlsZT1mdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVhZGVyQ0IgPSBmdW5jdGlvbiAodXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHppcGFwcCA9IG5ldyBKU1ppcCh1cGxvYWQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdmFyIHRodW1ibmFpbCA9IHppcGFwcC5maWxlKFwiYWZhLXBrZy90aHVtYm5haWwuanBnXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlzIHdlIGhhdmUgYSB0aHVtYm5haWwgd2l0aGluIGxvYWRlZCBaaXBmaWxlXG4gICAgICAgICAgICAgICAgaWYgKCF0aHVtYm5haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiVGhpcyBpcyBub3QgYSB2YWxpZCBBcHBsaWNhdGlvbiBGcmFtZXdvcmsgQVBQXCIpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS50aHVtYm5haWw9Q29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc25vdHZhbGlkLnBuZyc7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgndGh1bWJuYWlsJyk7IC8vIHdlIHNob3J0LWNpcmN1aXQgQW5ndWxhciByZXN5bmMgSW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkbyBub3QgcG9zdCB6aXAgb24gYmluZGVyXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBzY29wZS5pbWdFbGVtWzBdLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aHVtYm5haWwuYXNBcnJheUJ1ZmZlcigpXSwge3R5cGU6IFwiaW1hZ2VcIn0pKTsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBhY3RpdmF0ZXMgcG9zdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBwb3N0dXJsID0gYXR0cnMucG9zdHVybCArIFwiP3Rva2VuPVwiICsgQ29uZmlnQXBwLnNlc3Npb24udG9rZW47XG4gICAgICAgICAgICBuZXcgTG9hZEZpbGVTdmMgKHNjb3BlLCBlbGVtLCBwb3N0dXJsLCBmaWxlcywgcmVhZGVyQ0IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWxsaXplIGRlZmF1bHQgdmFsdWVzIGZyb20gYXR0cmlidXRlcyB2YWx1ZXNcbiAgICAgICAgc2NvcGUubmFtZT0gYXR0cnMubmFtZSB8fCAnYXBwbGknO1xuICAgICAgICBzY29wZS5jYXRlZ29yeT0gYXR0cnMuY2F0ZWdvcnkgIHx8ICdhcHBsaSc7XG4gICAgICAgIHNjb3BlLm1pbWV0eXBlPSAoYXR0cnMuYWNjZXB0IHx8ICcuemlwJyk7XG4gICAgICAgIHNjb3BlLm1heHNpemU9IGF0dHJzLm1heHNpemUgfHwgMTAwMDAwOyAvLyBkZWZhdWx0IG1heCBzaXplIDEwME1CXG4gICAgICAgIHNjb3BlLnJlZ2V4cCA9IG5ldyBSZWdFeHAgKGF0dHJzLmFjY2VwdCsgJy4qJywnaScpO1xuXG4gICAgICAgIGlmIChhdHRycy50aHVtYm5haWwpIHNjb3BlLnRodW1ibmFpbD0gQ29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy50aHVtYm5haWw7XG4gICAgICAgIGVsc2UgIHNjb3BlLnRodW1ibmFpbD1Db25maWdBcHAucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgJ3VwbG9hZC1hcHBsaS5wbmcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUuaXNub3R2YWxpZD0gQ29uZmlnQXBwLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc25vdHZhbGlkO1xuICAgICAgICBlbHNlICBzY29wZS5pc25vdHZhbGlkPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXNub3R2YWxpZC5wbmcnO1xuXG4gICAgICAgIGlmIChhdHRycy5pc3Rvb2JpZykgc2NvcGUuaXN0b29iaWc9IENvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXN0b29iaWc7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzdG9vYmlnPUNvbmZpZ0FwcC5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXN0b29iaWcucG5nJztcbiAgICAgICAgc2NvcGUubm9zbGlkZXIgPSBhdHRycy5ub3NsaWRlciB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIWF0dHJzLnBvc3R1cmwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGUtdXBsb2FkICVzIHBvc3R1cmw9L2FwaS94eHh4L3h4eHggcmVxdWlyZWQnLCBzY29wZS5hdHRycyk7ICAgICAgICAgICAgXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiVXBsb2FkRmlsZSBMb2FkZWRcIik7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqL1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG1wbCA9ICc8dGlwLW1vZGFsIHRpcD1cInRpcFwiPjwvdGlwLW1vZGFsPicgK1xuICAgICAgICAgICAnPGxhYmVsIGZvcj1cInt7bmFtZX19LWludGV4dFwiPnt7bGFiZWx9fSA8aSBuZy1zaG93PVwicmVxdWlyZWRcIiBuZy1jbGljaz1cIlRvQmVEZWZpbmVkXCIgJyArXG4gICAgICAgICAgICdjbGFzcz1cInJlcXVpcmVkIHt7c3RhdHVzfX0gZmktY2hlY2tib3hcIiB0aXRsZT1cIkZyZWUgVmFsdWUgQnV0IE1hbmRhdG9yeSBBcmd1bWVudFwiIGFsdD1cIj9cIj4gJm5ic3A7IDwvaT48L2xhYmVsPicrICAgICAgICAgIFxuICAgICAgICAgICAnPGlucHV0ICcrXG4gICAgICAgICAgICcgdHlwZT1cInt7dHlwZX19XCIgaWQ9XCJ7e25hbWV9fS1pbnRleHRcIiBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiICBjbGFzcz1cInN0YXR1cy17e3N0YXR1c319XCInK1xuICAgICAgICAgICAnIG5nLW1vZGVsPVwidmFsdWVcIiBuZy1ibHVyPVwidmFsaWRhdGUoKVwiIG5nLWZvY3VzPVwic2VsZWN0ZWQoKVwiICcrXG4gICAgICAgICAgICcgbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246IFxcJ2RlZmF1bHQgYmx1clxcJywgZGVib3VuY2U6IHtkZWZhdWx0OiA1MDAsIGJsdXI6IDB9IH1cIicgK1xuICAgICAgICAgICAnPjxhbGVydCBkYXRhLW5nLXNob3c9XCIhdmFsaWQmJmVycm1zZ1wiPnt7ZXJybXNnfX08L2FsZXJ0Pic7XG5cbnZhciBlbWFpbHBhdGVybiA9IC9eKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcblxuYW5ndWxhci5tb2R1bGUoJ0lucHV0VGV4dCcsWydKUXVlcnlFbXUnXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRUZXh0JywgW1wiSlFlbXVcIiwgZnVuY3Rpb24oSlFlbXUpIHtcbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBhdCAxc3QgcmVuZGVyaW5nXG4gICAgc2NvcGUuZXJyb3IgID0gZmFsc2U7XG4gICAgc2NvcGUudmFsaWQgID0gZmFsc2U7XG4gICAgc2NvcGUuc3RhdHVzID0gJ3VudG91Y2gnO1xuICAgXG4gICAgc2NvcGUuaW5wdXQgPSBlbGVtLmZpbmQgKFwiaW5wdXRcIik7XG4gICAgc2NvcGUucmVxdWlyZWQgPSAwO1xuICAgIFxuICAgIC8vIHJlcXVpcmVyIGlzIHVzZSB0byBpbmNyZW1lbnQgcmVxdWVzdGVkIGNvdW50ZXJcbiAgICBpZiAoXCJyZXF1aXJlZFwiIGluIGF0dHJzKSB7XG4gICAgICAgIHNjb3BlLnJlcXVpcmVkID0gMTtcbiAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJyZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgICAgXG4gICAgIC8vIHVzZXIgZW50ZXIgaW5wdXQgcmVzZXQgZXJyb3Igc3RhdHVzXG4gICAgIHNjb3BlLnNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgIHNjb3BlLmVycm1zZz1mYWxzZTsgXG4gICAgICAgIHNjb3BlLnN0YXR1cyA9ICd0b3VjaCc7XG4gICAgIH07ICAgXG4gICAgICAgICAgICBcbiAgICAgc2NvcGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICBcbiAgICAgICAgIC8vIGdldCB2YWx1ZSBmcm9tIGlucHV0IGZpZWxkIGJ5cGFzc2luZyBBbmd1bGFyIG5nLW1vZGVsXG4gICAgICAgICBjb25zb2xlLmxvZyAoXCJDbGlja2VkIElucHV0VGV4dCBuYW1lPSVzIHZhbHVlPSVzIHZhbGlkPSVzXCIsIHNjb3BlLm5hbWUsIHNjb3BlLnZhbHVlLCBzY29wZS52YWxpZCk7ICAgICAgICBcblxuICAgICAgICAgLy8gZm9ybSBpcyBub3QgdW50b3VjaGVkIGFueW1vcmVcbiAgICAgICAgIHNjb3BlLnBhcmVudC5yZW1vdmVDbGFzcyAoXCJuZy1wcmlzdGluZVwiKTtcblxuICAgICAgICAgLy8gaWYgdmFsdWUgbm90IG51bGwgY2xlYW4gdXAgc3RyaW5nXG4gICAgICAgICBpZiAoc2NvcGUudmFsdWUpIHtcbiAgICAgICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxsaW5nIHNwYWNlXG4gICAgICAgICAgICBzY29wZS52YWx1ZSA9IHNjb3BlLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgIFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBzcGFjZSBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgaWYgKCdub3NwYWNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWU9c2NvcGUudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKTsgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgICAgIGlmICgnbG93ZXJjYXNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBzY29wZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBtaW5pbXVtIGxlbmdodFxuICAgICAgICAgICAgaWYgKFwibWlubGVuXCIgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlLmxlbmd0aCA8IGF0dHJzLm1pbmxlbikge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IE1pbmludW0gTGVuZ2g9ICcgKyBhdHRycy5taW5sZW4gKyAnIENoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJvcj10cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoIWVtYWlscGF0ZXJuLnRlc3QgKHNjb3BlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0naW52YWxpZCc7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJybXNnPSdpbnZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IFJlcXVpcmVkIEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgIC8vIElmIGxvY2FsIGNvbnRyb2wgZmFpbCBsZXQncyByZWZ1c2UgaW5wdXRcbiAgICAgICAgIGlmIChzY29wZS5lcnJvcikge1xuICAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCAmJiBzY29wZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBpZiAoc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgPiAwKSBzY29wZS5sNGFjb3VudGVyLnZhbGlkYXRlZCAtLTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIHVzZSBjYWxsIHRvIHVwZGF0ZSBmb3JtIHNjb3BlIG9uIGZvcm0gY29tcGxldGVuZXNzXG4gICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKGF0dHJzLm5hbWUsIG51bGwsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgLy8gbG9jYWxjaGVjayBpcyBPSyBiYWNrdXAgbWF5IG5ldmVydGhlbGVzcyBjaGFuZ2Ugc3RhdHVzIHRvIGZhbHNlXG4gICAgICAgICAgICBpZiAoc2NvcGUucmVxdWlyZWQgICYmICFzY29wZS52YWxpZCkgc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgKys7XG4gICAgICAgICAgICBzY29wZS5zdGF0dXM9J3ZhbGlkJztcbiAgICAgICAgICAgIHNjb3BlLnZhbGlkPXRydWU7XG4gICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoYXR0cnMubmFtZSwgc2NvcGUudmFsdWUsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubGFiZWwgICAgICAgPSBhdHRycy5sYWJlbDtcbiAgICAgc2NvcGUubmFtZSAgICAgICAgPSBhdHRycy5uYW1lO1xuICAgICBzY29wZS5wbGFjZWhvbGRlciA9IGF0dHJzLnBsYWNlaG9sZGVyO1xuICAgICBzY29wZS50eXBlICAgICAgICA9IGF0dHJzLnR5cGUgfHwgXCJ0ZXh0XCI7XG4gICAgIHNjb3BlLnRpcCAgICAgICAgID0gYXR0cnMudGlwO1xuXG4gICAgIC8vIHNlYXJjaCBmb3IgZm9ybSB3aXRoaW4gcGFyZW50IGVsZW1udHNcbiAgICAgc2NvcGUucGFyZW50ID0gSlFlbXUucGFyZW50IChlbGVtLCBcIkZPUk1cIik7XG5cbiAgICAgLy8gZW1haWwgZW5mb3JjZSBsb3dlcmNhc2UgYW5kIG5vc3BhY2UgICBcbiAgICAgaWYgKFwiZW1haWxcIiBpbiBhdHRycykge1xuICAgICAgICBhdHRycy5sb3dlcmNhc2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm5vc3BhY2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm1pbmxlbj02OyBcbiAgICAgfVxuXG4gICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgc2NvcGUubDRhY291bnRlciA9IHNjb3BlLnBhcmVudC5kYXRhIChcImw0YWNvdW50ZXJcIik7XG4gICAgICAgICBpZiAoIXNjb3BlLmw0YWNvdW50ZXIpIHsgXG4gICAgICAgICAgICBzY29wZS5sNGFjb3VudGVyID0gIHtyZXF1aXJlZDoxLCB2YWxpZGF0ZWQ6MH07XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkIFwiK3Njb3BlLm5hbWUrXCIgaXMgcmVxdWlyZWQgKDFzdClcIik7XG4gICAgICAgICAgICBzY29wZS5wYXJlbnQuZGF0YSAoXCJsNGFjb3VudGVyXCIsIHNjb3BlLmw0YWNvdW50ZXIpOyBcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZCBcIitzY29wZS5uYW1lK1wiIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgIHNjb3BlLmw0YWNvdW50ZXIucmVxdWlyZWQgKys7XG4gICAgICAgICB9XG4gICAgIH1cbiAgICAgICAgIFxuICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gZWFjaCB0aW1lIGNvbnRyb2xlciB1cGRhdGUgdmFsdWVcbiAgICAgc2NvcGUuJHdhdGNoICgndmFsdWUnLCBmdW5jdGlvbigpe1xuICAgICAgICAgaWYoc2NvcGUudmFsdWUpIHNjb3BlLnZhbGlkYXRlKCk7IH1cbiAgICAgKTtcbiAgICBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nLFxuICAgICAgICAgICAgdmFsdWU6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiSW5wdXRUZXh0IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRtcGwgPSAnPGlucHV0LXRleHQgIGNsYXNzPVwicGFzc3dvcmRcIiB0aXA9XCJ7e3RpcDF9fVwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UxfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMX19XCIgY2FsbGJhY2s9XCJ2YWxpZDFcIiBuYW1lPVwie3tuYW1lfX0tMVwiIHZhbHVlPVwicGFzczFcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPicgK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0PicgKyBcbiAgICAgICAgICAgJzxpbnB1dC10ZXh0ICBjbGFzcz1cInBhc3N3b3JkXCIgdGlwPVwidGlwMlwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UyfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMn19XCIgY2FsbGJhY2s9XCJ2YWxpZDJcIiBuYW1lPVwie3tuYW1lfX0tMlwiIHZhbHVlPVwicGFzczJcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPiAnK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0Pic7XG5cbmFuZ3VsYXIubW9kdWxlKCdJbnB1dFBhc3N3b3JkJyxbXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRQYXNzd29yZCcsIGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICBcbiAgICBzY29wZS52YWxpZDEgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMSBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBzY29wZS5maXJzdHB3ZCA9IHZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgc2NvcGUudmFsaWQyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkb25lKSB7ICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMiBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWYgYm90aCBwYXNzd2QgZXF1YWwgdGhlbiBjYWxsIGZvcm0gQ0JcbiAgICAgICAgaWYgKHNjb3BlLmZpcnN0cHdkICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGRvbmUoe3ZhbGlkOiBmYWxzZSwgc3RhdHVzOiAnaW52YWxpZCcsIGVycm1zZzogXCJib3RoIHBhc3N3b3JkIHNob3VsZCBtYXRjaFwifSk7ICBcbiAgICAgICAgfSBlbHNlIHsgIFxuICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChhdHRycy5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubmFtZSAgID0gYXR0cnMubmFtZTtcbiAgICAgc2NvcGUubGFiZWwxID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkJztcbiAgICAgc2NvcGUubGFiZWwyID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnBsYWNlMSA9IGF0dHJzLnBsYWNlaG9sZGVyMSB8fCAnVXNlciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLnRpcDEgICA9IGF0dHJzLnRpcCB8fCAnQ2hvb3NlIGEgUGFzc3dvcmQnO1xuICAgICBzY29wZS5wbGFjZTIgPSBhdHRycy5wbGFjZWhvbGRlcjEgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnRpcDIgICA9IGF0dHJzLnRpcCAgICB8fCAnQ29uZmlybWUgeW91ciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLm1pbmxlbiA9IGF0dHJzLm1pbmxlbiB8fCAxMDtcbiAgICAgXG4gICAgIGlmIChcInJlcXVpcmVkXCIgaW4gYXR0cnMpIHNjb3BlLnJlcXVpcmVkID0gJ3JlcXVpcmVkJztcbiAgICAgICAgIFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiAnPScsXG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5cbmNvbnNvbGUubG9nIChcIklucHV0UGFzc3dvcmQgTG9hZGVkXCIpO1xufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gbGlzdCBhbGwgcmVwZW5kZW5jaWVzIHdpdGhpbiB0aGUgcGFnZSArIGNvbnRyb2xlciBpZiBuZWVkZWRcbmFuZ3VsYXIubW9kdWxlKCdTYW1wbGVNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsJ1VwbG9hZEZpbGVzJ10pXG5cbiAgLmNvbnRyb2xsZXIoJ1NhbXBsZUNvbnRyb2xsZXInLCBbXCIkaHR0cFwiLCBmdW5jdGlvbiAoJGh0dHApIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpczsgLy8gSSBoYXRlIEphdmFTY3JpcHRcblxuICAgICAgICBjb25zb2xlLmxvZyAoXCJzYW1wbGUgSW5pdFwiKTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLkZpbGVVcGxvYWRlZCA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJGaWxlVXBsb2FkZWQgcmVzcG9uc2U9JXNcIiwgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICAgICAgfTtcbiAgIH1dKTtcblxuY29uc29sZS5sb2cgKFwiU2FtcGxlQ29udHJvbGVyIExvYWRlZFwiKTtcbn0pKCk7ICIsIihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gV0FSTklORzogbWFrZSBzdXJlIHRoYW4gYXBwL2Zyb250ZW5kL3NlcnZpY2VzL0NvbmZpZ0FwcC5qcyBtYXRjaCB5b3VyIHNlcnZlclxuXG4vLyBsaXN0IGFsbCByZXBlbmRlbmNpZXMgd2l0aGluIHRoZSBwYWdlICsgY29udHJvbGVyIGlmIG5lZWRlZFxuYW5ndWxhci5tb2R1bGUoJ0hvbWVNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsICdUb2tlblJlZnJlc2gnXSlcblxuICAuY29udHJvbGxlcignSG9tZUNvbnRyb2xsZXInLCBbXCIkaHR0cFwiLCBcIkNvbmZpZ0FwcFwiLCBmdW5jdGlvbiAoJGh0dHAsIENvbmZpZ0FwcCkge1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOyAvLyBJIGhhdGUgSmF2YVNjcmlwdFxuICAgICAgICBzY29wZS51dWlkICAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS50b2tlbiAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zZXNzaW9uPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zdGF0dXMgPVwiZXJyLW5vXCI7XG5cbiAgICAgICAgY29uc29sZS5sb2cgKFwiSG9tZSBDb250cm9sbGVyXCIpO1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuUHJvY2Vzc1Jlc3BvbnNlPSBmdW5jdGlvbihkYXRhLCBlcnJjb2RlLCBoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgICAgIHZhciBhcGluYW1lPSAnQVBJJysgZGF0YS5yZXF1ZXN0LmFwaS5yZXBsYWNlKCctJywnXycpO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzID0gXCJlcnItb2tcIjtcbiAgICAgICAgICAgIHNjb3BlLmVycmNvZGU9IGVycmNvZGU7XG4gICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IGRhdGEucmVxdWVzdDtcbiAgICAgICAgICAgIHNjb3BlLnJlc3BvbnNlID0gZGF0YS5yZXNwb25zZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gaWYgdG9rZW4gd2FzIHJlZnJlc2ggbGV0J3MgdXBkYXRlIENvbmZpZ0FwcFxuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgQ29uZmlnQXBwLnNlc3Npb24udG9rZW4gPSBkYXRhLnJlcXVlc3QudG9rZW47XG4gICAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0LnV1aWQpICBDb25maWdBcHAuc2Vzc2lvbi51dWlkICA9IGRhdGEucmVxdWVzdC51dWlkO1xuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50aW1lb3V0KSAgQ29uZmlnQXBwLnNlc3Npb24udGltZW91dCAgPSBkYXRhLnJlcXVlc3QudGltZW91dDtcblxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsZWFuIGV2ZXJ5dGhpbmcgd2hlbiBPcGVuL0Nsb3NlIGlzIGNhbGxlZFxuICAgICAgICAgICAgaWYgKGFwaW5hbWUgPT09IFwiQVBJY3JlYXRlXCIgfHwgYXBpbmFtZSA9PT0gXCJBUElyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuQVBJcmVzZXQgID0nJztcbiAgICAgICAgICAgICAgICBzY29wZS5BUEljcmVhdGUgPScnO1xuICAgICAgICAgICAgICAgIHNjb3BlLkFQSXJlZnJlc2g9Jyc7XG4gICAgICAgICAgICAgICAgc2NvcGUuQVBJY2hlY2sgID0nJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlW2FwaW5hbWVdPVwic3VjY2Vzc1wiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbmV3IHRva2VuIGxldCdzIHVwZGF0ZSBpdFxuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgc2NvcGUudG9rZW49ZGF0YS5yZXF1ZXN0LnRva2VuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJPSzogXCIrIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLlByb2Nlc3NFcnJvcj0gZnVuY3Rpb24oZGF0YSwgZXJyY29kZSwgaGVhZGVycywgY29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgYXBpbmFtZT0gJ0FQSScrZGF0YS5yZXF1ZXN0LmFwaS5yZXBsYWNlKCctJywnXycpO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzICAgPSBcImVyci1meFwiO1xuICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSBlcnJjb2RlO1xuICAgICAgICAgICAgc2NvcGUucmVxdWVzdCAgPSBkYXRhLnJlcXVlc3Q7XG4gICAgICAgICAgICBzY29wZS5yZXNwb25zZSA9IFwiXCI7XG4gICAgICAgICAgICBzY29wZVthcGluYW1lXT1cImZhaWxcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiRlg6IFwiKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuT3BlblNlc3Npb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIk9wZW5TZXNzaW9uXCIpOyBcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KENvbmZpZ0FwcC5zZXNzaW9uLmNyZWF0ZSArICc/dG9rZW49JytDb25maWdBcHAuc2Vzc2lvbi5pbml0aWFsLCBwb3N0ZGF0YSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhhbmRsZXIuc3VjY2VzcyhzY29wZS5Qcm9jZXNzUmVzcG9uc2UpO1xuICAgICAgICAgICAgaGFuZGxlci5lcnJvcihzY29wZS5Qcm9jZXNzRXJyb3IpO1xuICAgICAgICB9OyAgICAgICAgXG5cbiAgICAgICAgc2NvcGUuQ2hlY2tTZXNzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJDbG9zZVNlc3Npb25cIik7XG4gICAgICAgICAgICB2YXIgcG9zdGRhdGE9IHsvKiBhbnkganNvbiB5b3VyIGFwcGxpY2F0aW9uIG1heSBuZWVkICovfTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gJGh0dHAucG9zdChDb25maWdBcHAuc2Vzc2lvbi5jaGVjayArICc/dG9rZW49JytDb25maWdBcHAuc2Vzc2lvbi50b2tlbiwgcG9zdGRhdGEpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUuUHJvY2Vzc1Jlc3BvbnNlKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUuUHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLlJlZnJlc2hTZXNzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJSZWZyZXNoU2Vzc2lvblwiKTtcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KENvbmZpZ0FwcC5zZXNzaW9uLnJlZnJlc2ggKyAnP3Rva2VuPScrQ29uZmlnQXBwLnNlc3Npb24udG9rZW4sIHBvc3RkYXRhKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaGFuZGxlci5zdWNjZXNzKHNjb3BlLlByb2Nlc3NSZXNwb25zZSk7XG4gICAgICAgICAgICBoYW5kbGVyLmVycm9yKHNjb3BlLlByb2Nlc3NFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5SZXNldFNlc3Npb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIlJlc2V0U2Vzc2lvblwiKTtcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KENvbmZpZ0FwcC5zZXNzaW9uLnJlc2V0ICsgJz90b2tlbj0nK0NvbmZpZ0FwcC5zZXNzaW9uLnRva2VuLCBwb3N0ZGF0YSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhhbmRsZXIuc3VjY2VzcyhzY29wZS5Qcm9jZXNzUmVzcG9uc2UpO1xuICAgICAgICAgICAgaGFuZGxlci5lcnJvcihzY29wZS5Qcm9jZXNzRXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgIH1dKTtcblxuY29uc29sZS5sb2cgKFwiU2FtcGxlQ29udHJvbGVyIExvYWRlZFwiKTtcbn0pKCk7ICIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKiBcbiAqIFVzYWdlOlxuICogXG4gKiAgIC8vIG1vdXNlIGV2ZW50IHByb2JhYmx5IHBvaW50IG9uIGljb24gYW5kIG5vdCBvbiBidXR0b24gZGl2XG4gKiAgIC4uLiBuZy1jbGljaz1cIkxvY2tDaGFubmVsKCRldmVudClcbiAgICAgdmFyIHRhcmdldD0gYW5ndWxhci5lbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICB2YXIgYnV0dG9uPSBKUWVtdS5GaW5kSW5QYXJlbnQgKHRhcmdldCwgJ2RpdicpO1xuICogXG4gKi9cblxuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuXG4gICAgICAgICAgXG4gICAgLy8gX2FsbCBtb2R1bGVzIG9ubHkgcmVmZXJlbmNlIGRlcGVuZGVuY2llc1xuICAgIGFuZ3VsYXIubW9kdWxlKCdKUXVlcnlFbXUnLCBbXSlcblxuICAgICAgICAgICAgLy8gRmFjdG9yeSBpcyBhIHNpbmdsZXRvbiBhbmQgc2hhcmUgaXRzIGNvbnRleHQgd2l0aGluIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgICAgICAuZmFjdG9yeSgnSlFlbXUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgRmluZEluUGFyZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gc2VsZWN0b3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PT0gcGFyZW50WzBdLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gSFRNTERpdkVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeVRhZz0gZnVuY3Rpb24gKGVsZW1lbnQsIHRhZywgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlICAgPSB0YWcudG9Mb3dlckNhc2UoKSsgXCJOYW1lXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09PSBjaGlsZHJlblswXVt0eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeUNsYXNzPSBmdW5jdGlvbiAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uaGFzQ2xhc3Moc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBteU1ldGhvZHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIEZpbmRJblBhcmVudDogRmluZEluUGFyZW50LFxuICAgICAgICAgICAgICAgICAgICBGaW5kQnlUYWc6IEZpbmRCeVRhZyxcbiAgICAgICAgICAgICAgICAgICAgRmluZEJ5Q2xhc3M6IEZpbmRCeUNsYXNzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBteU1ldGhvZHM7XG4gICAgICAgICAgICB9KTtcblxufSkoKTsiLCJ2YXIgZm91bmRhdGlvblJvdXRlcyA9IFt7XCJuYW1lXCI6XCJteXNhbXBsZVwiLFwidXJsXCI6XCIvc2FtcGxlXCIsXCJjb250cm9sbGVyXCI6XCJTYW1wbGVDb250cm9sbGVyIGFzIGN0cmxcIixcImFuaW1hdGlvbkluXCI6XCJzbGlkZUluUmlnaHRcIixcInBhdGhcIjpcInBhZ2VzL1NhbXBsZS9TYW1wbGUuaHRtbFwifSx7XCJuYW1lXCI6XCJteWhvbWVcIixcInVybFwiOlwiL2hvbWVcIixcImNvbnRyb2xsZXJcIjpcIkhvbWVDb250cm9sbGVyIGFzIGN0cmxcIixcImFuaW1hdGlvbkluXCI6XCJzbGlkZUluUmlnaHRcIixcInBhdGhcIjpcInBhZ2VzL0hvbWUvSG9tZS5odG1sXCJ9XTsgXG4iLCIoZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIF9hbGwgbW9kdWxlcyBvbmx5IHJlZmVyZW5jZSBkZXBlbmRlbmNpZXNcbiAgICBhbmd1bGFyLm1vZHVsZSgnQ29uZmlnQXBwJywgW10pXG5cbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0NvbmZpZ0FwcCcsIFtcInVybHF1ZXJ5XCIsIGZ1bmN0aW9uICh1cmxxdWVyeSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIG15Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoczogeyAvLyBXYXJuaW5nIHBhdGhzIHNob3VsZCBlbmQgd2l0aCAvXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA6ICdpbWFnZXMvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogJ2ltYWdlcy9hdmF0YXJzLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA6ICdpbWFnZXMvYXVkaW8vJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpIDogJ2ltYWdlcy9hcHBsaS8nXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBteWFwaTogeyAvLyBXYXJuaW5nIHBhdGhzIHNob3VsZCBlbmQgd2l0aCAvXG4gICAgICAgICAgICAgICAgICAgICAgIHRva2VuIDogJy9hcGkvbXlwbHVnaW4veHh4eCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IHsgLy8gVGhvc2UgZGF0YSBhcmUgdXBkYXRlZCBieSBzZXNzaW9uIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlICA6ICcvYXBpL3Rva2VuL2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggOiAnL2FwaS90b2tlbi9yZWZyZXNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgICA6ICcvYXBpL3Rva2VuL2NoZWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgICA6ICcvYXBpL3Rva2VuL3Jlc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgcGluZyAgICA6ICcvYXBpL3Rva2VuL2NoZWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCA6IHVybHF1ZXJ5LnRva2VuIHx8ICcxMjM0NTY3ODknLCAgLy8gdHlwaWNhbCBkZXYgaW5pdGlhbCB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IDogMzYwMCwgICAgICAgICAvLyB0aW1lb3V0IGlzIHVwZGF0ZWQgY2xpZW50IHNlc3NpbiBjb250ZXh0IGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgIHBpbmdyYXRlOiA2MCwgICAgICAgICAgIC8vIFBpbmcgcmF0ZSB0byBjaGVjayBpZiBzZXJ2ZXIgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgdXVpZCAgICA6ICcnLCAgICAgICAgICAgLy8gdXVpZCBtYXAgd2l0aCBjb29raWUgb3IgbG9uZyB0ZXJtIHNlc3Npb24gYWNjZXNzIGtleVxuICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiAgIDogJycgICAgICAgICAgICAvLyB3aWxsIGJlIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRpb24gICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG15Q29uZmlnO1xuICAgICAgICAgICAgfV0pO1xuXG59KSgpOyIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBcbiAgZnVuY3Rpb24gIFBhcnNlUXVlcnlTdHJpbmcgKCkge1xuICAgICAgdmFyIHFkID0ge307XG4gICAgICBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgayA9IGl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgIHZhciB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0uc3BsaXQoXCI9XCIpWzFdKTsgXG4gICAgICAgICAgaWYgKGsgaW4gcWQpIHFkW2tdLnB1c2godik7IGVsc2UgcWRba10gPSBbdl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxZDtcbiAgfVxuXG4gIGFuZ3VsYXIubW9kdWxlKCdBRkJjbGllbnQnLCBbIC8vIFdhcm5pbmc6IEFwcG5hbWUgc2hvdWxkIGZpdCB3aXRoIGd1bHBmaWxlLmpzICYgaW5kZXguaHRtbFxuICAgICd1aS5yb3V0ZXInLFxuICAgICduZ0FuaW1hdGUnLFxuXG4gICAgLy9mb3VuZGF0aW9uXG4gICAgJ2ZvdW5kYXRpb24nLFxuICAgICdmb3VuZGF0aW9uLmR5bmFtaWNSb3V0aW5nJyxcbiAgICAnZm91bmRhdGlvbi5keW5hbWljUm91dGluZy5hbmltYXRpb25zJyxcbiAgICBcbiAgICAvLyBleHRlcm5hbCBjb21wb25lbnRzXG4gICAgJ3VpLW5vdGlmaWNhdGlvbicsXG4gICAgXG4gICAgLy8gQXBwbGljYXRpb24gQ29tcG9uZW50c1xuICAgICdDb25maWdBcHAnLFxuICAgICdKUXVlcnlFbXUnLFxuICAgICdIb21lTW9kdWxlJyxcbiAgICAnU2FtcGxlTW9kdWxlJyxcbiAgICAnVXBsb2FkRmlsZXMnLFxuICAgICdMaW5rQnV0dG9uJyxcbiAgICAnVG9rZW5SZWZyZXNoJyxcbiAgICAnUmFuZ2VTbGlkZXInLFxuICAgICdNb2RhbE5vdGlmaWNhdGlvbidcbiAgXSlcbiAgICAudmFsdWUgKCd1cmxxdWVyeScsIFBhcnNlUXVlcnlTdHJpbmcoKSlcbiAgICAuY29uZmlnKGNvbmZpZylcbiAgICAucnVuKHJ1bilcbiAgO1xuXG4gIGNvbmZpZy4kaW5qZWN0ID0gWyckdXJsUm91dGVyUHJvdmlkZXInLCAnJGxvY2F0aW9uUHJvdmlkZXInXTtcbiAgXG4gIGZ1bmN0aW9uIGNvbmZpZygkdXJsUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyLCBDb25maWdBcHApIHtcbiAgICAkdXJsUHJvdmlkZXIub3RoZXJ3aXNlKCcvaG9tZScpO1xuXG4gICAgLy8gaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvZXJyb3IvJGxvY2F0aW9uL25vYmFzZVxuICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKS5oYXNoUHJlZml4KCchJyk7XG4gICAgXG4gIH1cblxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgRmFzdENsaWNrLmF0dGFjaChkb2N1bWVudC5ib2R5KTtcbiAgfVxuXG5jb25zb2xlLmxvZyAoXCJvcGE9QUZCY2xpZW50IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7YW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoJ3BhZ2VzL1NhbXBsZS9TYW1wbGUuaHRtbCcsXG4gICAgJzxoMT48aW1nIGNsYXNzPVwibG9nb1wiIHNyYz1cImltYWdlcy9sb2dvL3RyaXNrZWxfaW90X2J6aHgyNTAucG5nXCIgYWx0PVwiSW9ULmJ6aCBMb2dvXCIgc3R5bGU9XCJoZWlnaHQ6MTUwcHhcIj4gUG9zdCBGaWxlIFVwbG9hZDwvaDE+PGRpdiBjbGFzcz1cInNhbXBsZS1ib3ggYm94LWNvbnRlbnRcIj48dXBsb2FkLWltYWdlIG5hbWU9XCJhdmF0YXJcIiBjYXRlZ29yeT1cImF2YXRhclwiIHRodW1ibmFpbD1cInR1eC12aXNpdG9yLnBuZ1wiIG1heHNpemU9XCIxMDBcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1pbWFnZVwiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiBhY2NlcHQ9XCJpbWFnZVwiIHRpdGxlPVwiQ2hhbmdlIHlvdXIgQXZhdGFyXCI+PC91cGxvYWQtaW1hZ2U+PHVwbG9hZC1hdWRpbyBuYW1lPVwibXVzaWNcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1tdXNpY1wiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiB0aXRsZT1cIlVwbG9hZCB5b3VyIE11c2ljXCI+PC91cGxvYWQtYXVkaW8+PHVwbG9hZC1hcHBsaSBuYW1lPVwiYXBwbGlcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1hcHBsaVwiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiB0aXRsZT1cIlVwbG9hZCBBR0wgQXBwXCI+PC91cGxvYWQtYXBwbGk+PC9kaXY+PGxpbmstYnV0dG9uIGhyZWY9XCJob21lXCIgaWNvbj1cImZpLWhvbWVcIiBsYWJlbD1cImhvbWVcIj48L2xpbmstYnV0dG9uPicpO31dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7YW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoJ3BhZ2VzL0hvbWUvSG9tZS5odG1sJyxcbiAgICAnPGgzPjxpbWcgY2xhc3M9XCJsb2dvXCIgc3JjPVwiaW1hZ2VzL2xvZ28vdHJpc2tlbF9pb3RfYnpoeDI1MC5wbmdcIiBhbHQ9XCJJb1QuYnpoIExvZ29cIiBzdHlsZT1cImhlaWdodDoxNTBweFwiPiBBcHAgRnJhbWV3b3JrIEJpbmRlciBTaW1wbGUgQ2xpZW50PC9oMz48dG9rZW4tcmVmcmVzaCBhdXRvbG9nPVwidHJ1ZVwiPjwvdG9rZW4tcmVmcmVzaD48ZGl2IGNsYXNzPVwiYnV0dG9uLWJveCBib3gtY29udGVudFwiPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSWNyZWF0ZX19XCIgaWNvbj1cImZpLXVubG9ja1wiIGxhYmVsPVwiT3BlblwiIGNsaWNrZWQ9XCJjdHJsLk9wZW5TZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSWNoZWNrfX1cIiBpY29uPVwiZmktY2hlY2tib3hcIiBsYWJlbD1cIkNoZWNrXCIgY2xpY2tlZD1cImN0cmwuQ2hlY2tTZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSXJlZnJlc2h9fVwiIGljb249XCJmaS1hcnJvd3MtY29tcHJlc3NcIiBsYWJlbD1cIlJlZnJlc2hcIiBjbGlja2VkPVwiY3RybC5SZWZyZXNoU2Vzc2lvblwiPjwvc3VibWl0LWJ1dHRvbj48c3VibWl0LWJ1dHRvbiBjbGFzcz1cInNlc3Npb24tYnV0dG9uIHt7Y3RybC5BUElyZXNldH19XCIgaWNvbj1cImZpLWxvY2tcIiBsYWJlbD1cIkNsb3NlXCIgY2xpY2tlZD1cImN0cmwuUmVzZXRTZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9XCJtZXNzYWdlLWJveCBib3gtY29udGVudCB2ZXJ0aWNhbCBncmlkLWZyYW1lXCI+PGRpdiBjbGFzcz1cInJlc3BvbnNlXCI+PHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVxIHt7Y3RybC5zdGF0dXN9fVwiPnJlcT0ge3tjdHJsLnJlcXVlc3R9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVzIHt7Y3RybC5zdGF0dXN9fVwiPnJlcz0ge3tjdHJsLnJlc3BvbnNlfX08L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ3JpZC1jb250ZW50IG5vc2Nyb2xsIHN0YXR1cyB7e2N0cmwuc3RhdHVzfX1cIj5zdGF0dXM9IHt7Y3RybC5lcnJjb2RlfX08L3NwYW4+PC9kaXY+PC9kaXY+PGxpbmstYnV0dG9uIGhyZWY9XCJzYW1wbGVcIiBpY29uPVwiZmktaG9tZVwiIGxhYmVsPVwic2FtcGxlXCI+PC9saW5rLWJ1dHRvbj4nKTt9XSk7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
+!function(){"use strict";var e='<div ng-click="clicked()"> <span><i class="{{icon}}"></i><span>{{label}}</span></div>';angular.module("SubmitButton",[]).directive("submitButton",function(){function t(e,t,n){e.icon=n.icon||"fi-foot",e.label=n.label||"Next",t.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:t,scope:{clicked:"="}}})}(),function(){"use strict";function e(e){var t=[],n=[];this.getId=function(){return e.sliderid},this.getCbHandle=function(){return e.cbhandle},this.getView=function(a){return a||(a=0),e.value[a]===t[a]?n[a]:(t[a]=e.value[a],e.formatter?n[a]=e.formatter(e.value[a],e.ctrlhandle):n[a]=e.value[a],n[a])},this.updateClass=function(t,n){e.updateClass(t,n)},this.forceRefresh=function(t){e.forceRefresh(t)},this.getValue=function(t){return t||(t=0),e.value[t]},this.getRelative=function(t){return t||(t=0),e.relative[t]},this.setValue=function(t,n){n||(n=0),e.setValue(t,n)},this.setDisable=function(t){e.setDisable(t)}}var t=angular.module("RangeSlider",[]);t.directive("rangeSlider",["$log","$document","$timeout",function(t,n,a){function i(t,i,s,o){t.initWidget=function(e){e.byStep&&(t.byStep=parseInt(e.byStep)),e.notMore&&(t.notMore=parseInt(e.notMore)),e.notLess&&(t.notLess=parseInt(e.notLess)),e.id&&(t.sliderid=e.id),void 0!==e.value&&(t.value=e.value,t.forceRefresh(50))},t.forceRefresh=function(e){var n=t.value;t.value=[void 0,void 0],a(function(){t.setValue(n[0],0),t.dual&&t.setValue(n[1],1)},e)},t.updateClass=function(e,t){t?i.addClass(e):i.removeClass(e)},t.setDisable=function(e){e?(i.addClass("disable"),t.handles[0].css("visibility","hidden"),t.dual&&t.handles[1].css("visibility","hidden")):(i.removeClass("disable"),t.handles[0].css("visibility","visible"),t.dual&&t.handles[1].css("visibility","visible"))},t.normalize=function(e){var n,a=t.notMore-t.notLess,i=e*a;if(t.byStep>0){var s=(i-i%t.byStep)/t.byStep,o=i%t.byStep,l=o>=.5*t.byStep?t.byStep:0;return n=s*t.byStep+l+t.notLess}if(t.byStep<0){var r=Math.pow(10,-1*t.byStep);return n=t.notLess+parseInt(i*r)/r}return i},t.getValue=function(e,n){t.vertical?t.relative[n]=(e-t.bounds.handles[n].getBoundingClientRect().height)/(t.bounds.bar.getBoundingClientRect().height-t.bounds.handles[n].getBoundingClientRect().height):t.relative[n]=e/(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[n].getBoundingClientRect().width);var a=t.normalize(t.relative[n]);a!==t.value[n]&&(a<t.startValue&&(a=t.startValue),a>t.stopValue&&(a=t.stopValue),t.formatter?t.viewValue=t.formatter(a,t.ctrlhandle):t.viewValue=a,t.displays[n]&&t.displays[n].html(t.viewValue),t.value[n]=a,o&&o.$setViewValue(t.viewValue),t.$apply(),a>t.startValue&&a<t.stopValue&&t.translate(e,n))},t.setStart=function(e){var n;e>t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(n=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",n+"px")):(n=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("width",n+"px")),t.startValue=e},t.setStop=function(e){var n;e<t.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(n=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",n+"px")):(n=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.stop.css({right:0,width:t.bounds.bar.getBoundingClientRect().width-n+"px"})),t.stopValue=e},t.translate=function(e,n){var a;if(t.vertical){var i=t.bounds.bar.getBoundingClientRect().height-e;if(t.handles[n].css({"-webkit-transform":"translateY("+i+"px)","-moz-transform":"translateY("+i+"px)","-ms-transform":"translateY("+i+"px)","-o-transform":"translateY("+i+"px)",transform:"translateY("+i+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var s=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().height;a=t.relative[0]*t.bounds.bar.getBoundingClientRect().height,t.slider.css({bottom:a+"px",height:s+"px"})}}else t.slider.css("height",e+"px")}else if(t.handles[n].css({"-webkit-transform":"translateX("+e+"px)","-moz-transform":"translateX("+e+"px)","-ms-transform":"translateX("+e+"px)","-o-transform":"translateX("+e+"px)",transform:"translateX("+e+"px)"}),t.dual){if(t.relative[1]&&t.relative[0]){var o=(t.relative[1]-t.relative[0])*t.bounds.bar.getBoundingClientRect().width;a=t.relative[0]*t.bounds.bar.getBoundingClientRect().width,t.slider.css({left:a+"px",width:o+"px"})}}else t.slider.css("width",e+"px")},t.setValue=function(e,n){var a;e!==t.value[n]&&(void 0===e&&(e=0),e>t.notMore&&(e=t.notMore),e<t.notLess&&(e=t.notLess),t.vertical?(t.relative[n]=(e-t.notLess)/(t.notMore-t.notLess),0===n&&(a=t.relative[n]*t.bounds.bar.getBoundingClientRect().height+t.bounds.handles[n].getBoundingClientRect().height/2),1===n&&(a=t.relative[n]*t.bounds.bar.getBoundingClientRect().height)):(t.relative[n]=(e-t.notLess)/(t.notMore-t.notLess),a=t.relative[n]*(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[n].getBoundingClientRect().width)),t.translate(a,n),t.value[n]=e,t.formatter?t.viewValue=t.formatter(e,void 0):t.viewValue=e,o&&o.$setViewValue(t.viewValue),t.displays[n]&&t.displays[n].html(t.viewValue))},t.keydown=function(e){switch(e.keyCode){case 39:case 38:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]+t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]+1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 37:case 40:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]-t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]-1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 27:t.handles[t.actif][0].blur()}},t.moveHandle=function(e,n,a){var i;t.vertical?(i=t.bounds.bar.getBoundingClientRect().bottom-a,i>t.bounds.bar.getBoundingClientRect().height&&(i=t.bounds.bar.getBoundingClientRect().height),i<t.bounds.handles[e].getBoundingClientRect().height&&(i=t.bounds.handles[e].getBoundingClientRect().height)):(i=n-t.bounds.bar.getBoundingClientRect().left,0>i&&(i=0),n+t.bounds.handles[e].getBoundingClientRect().width>t.bounds.bar.getBoundingClientRect().right&&(i=t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[e].getBoundingClientRect().width)),t.getValue(i,e),t.dual&&t.value[0]>t.value[1]&&(0===e?t.setValue(t.value[0],1):t.setValue(t.value[1],0))},t.focusCB=function(e){e?n.on("keydown",t.keydown):n.unbind("keydown",t.keydown)},t.touchBarCB=function(e){var n,a=0,i=e.changedTouches,s=t.value[a];if(e.preventDefault(),t.dual){n=t.vertical?(i[0].pageY-t.bounds.bar.getBoundingClientRect().bottom)/t.bounds.bar.getBoundingClientRect().height:(i[0].pageX-t.bounds.bar.getBoundingClientRect().left)/t.bounds.bar.getBoundingClientRect().width;var o=Math.abs(n-t.relative[0]),l=Math.abs(n-t.relative[1]);o>l&&(a=1)}t.moveHandle(a,i[0].pageX,i[0].pageY),t.callback&&s!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)},t.touchHandleCB=function(e,a){function s(e){e.preventDefault();for(var n=e.changedTouches,i=0;i<n.length;i++)t.moveHandle(a,n[i].pageX,n[i].pageY)}function o(e){n.unbind("touchmove",s),n.unbind("touchend",o),i.on("touchstart",t.touchBarCB),t.callback&&l!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)}var l=t.value[a];e.preventDefault(),n.on("touchmove",s),n.on("touchend",o),i.unbind("touchstart",t.touchBarCB)},t.handleCB=function(e,a){function i(e){t.moveHandle(a,e.clientX,e.clientY)}function o(){n.unbind("mousemove",i),n.unbind("mouseup",o),t.callback&&l!==t.value[a]&&t.callback(t.value[a],t.ctrlhandle)}if(!s.automatic){var l=t.value[a];e.preventDefault(),n.on("mousemove",i),n.on("mouseup",o),t.handles[a][0].focus(),t.actif=a}},t.find=function(e,t){var n;n=t?t[0].querySelector(e):i[0].querySelector(e);var a=angular.element(n);return a},t.initialSettings=function(e){var n;t.value=[],t.relative=[],null===t.precision&&(n=(""+t.byStep).match(/\.([\d]*)/),t.precision=n&&n[1]?n[1].length:0),i.on("touchstart",t.touchBarCB),t.handles[0].on("touchstart",function(e){t.touchHandleCB(e,0)}),t.dual&&(t.handles[1].addClass("range-slider-handle"),t.handles[1].on("touchstart",function(e){t.touchHandleCB(e,1)}),t.initvalues||t.setValue(e[1],1)),t.initvalues?t.initWidget(t.initvalues):t.setValue(e[0],0)},t.init=function(){if(t.sliderid=s.id||"slider-"+parseInt(1e3*Math.random()),t.startValue=-(1/0),t.stopValue=1/0,t.byStep=parseInt(s.byStep)||1,t.vertical=s.vertical||!1,t.dual=s.dualHandles||!1,t.trigger_input_change=!1,t.notMore=parseInt(s.notMore)||100,t.notLess=parseInt(s.notLess)||0,t.vertical&&i.addClass("vertical-range"),t.handles=[t.find(".handle-min"),t.find(".handle-max")],t.bar=i,t.slider=t.find(".range-slider-active-segment"),t.start=t.find(".ibz-range-slider-start"),t.stop=t.find(".ibz-range-slider-stop"),t.disable=s.disable||!1,t.ctrlhandle=new e(t),t.bounds={bar:i[0],handles:[t.handles[0][0],t.handles[1][0]]},"true"===s.disable&&t.setDisable(!0),s.displayTarget)switch(s.displayTarget){case!0:case"handle":t.displays=t.handles,t.handles[0].addClass("ibz-range-slider-display"),t.dual&&t.handles[1].addClass("ibz-range-slider-display");break;default:t.displays=[n.getElementById(s.displayTarget)]}else t.displays=[];if(s.initial){var a=s.initial.split(",");t.initial=[void 0!==a[0]?parseInt(a[0]):t.notLess,void 0!==a[1]?parseInt(a[1]):t.notMore]}else t.initial=[t.ngModel,t.ngModel];t.$watch("startAt",function(){t.value<t.startAt,t.startAt&&t.setStart(t.startAt)}),t.$watch("stopAt",function(){t.value>t.stopAt,t.stopAt&&t.setStop(t.stopAt)}),t.initialSettings(t.initial)},t.init(),t.$watch("inithook",function(){t.inithook&&t.inithook(t.ctrlhandle)}),t.$watch("initvalues",function(){t.initvalues&&t.initWidget(t.initvalues)}),t.$watch("ngModel",function(e){t.setValue(e,0)})}var s='<div class="ibz-range-slider range-slider" title="{{title}}"data-slider><span class="range-slider-handle handle-min" ng-mousedown="handleCB($event,0)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="handle-max" ng-mousedown="handleCB($event,1)" ng-focus="focusCB(true)" ng-blur="focusCB(false)" role="slider" tabindex="0"></span><span class="range-slider-active-segment"></span><span class="ibz-range-slider-start" ></span> <span class="ibz-range-slider-stop"></span> <input id={{sliderid}} type="hidden"></div>';return{restrict:"E",scope:{startAt:"=",stopAt:"=",callback:"=",formatter:"=",inithook:"=",cbhandle:"=",initvalues:"=",ngModel:"="},require:"?ngModel",template:s,replace:!0,link:i}}])}(),function(){"use strict";var e='<div class="afb-monitor" ng-click="getping()"><span class="afb-refresh-token" >afb://{{hostname}}:{{httpdport}}</span><i class="{{icon}}"></i></div>';angular.module("TokenRefresh",["AppConfig","ModalNotification"]).directive("tokenRefresh",["$window","$timeout","$location","Notification","AppConfig","AppCall",function(t,n,a,i,s,o){function l(e,l,r){e.logged=void 0,t.onbeforeunload=function(){o.get("token","reset",{},function(){})},e.online=function(){l.addClass("online"),l.removeClass("offline"),e.logged=!0},e.offline=function(){l.addClass("offline"),l.removeClass("online"),e.logged=!1},e.onerror=function(){e.logged!==!1&&(i.warning({message:"AppFramework Binder Lost",delay:5e3}),e.offline()),e.status=0},e.onsuccess=function(t){t.request.token&&(s.session.token=t.request.token),t.request.uuid&&(s.session.uuid=t.request.uuid),t.request.timeout&&(s.session.timeout=t.request.timeout),e.logged!==!0&&(i.success({message:"AppFramework Binder Back to Live",delay:3e3}),e.online(),e.callback&&e.callback(t)),e.status=1},e.getping=function(){o.get("token","ping",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.getping,1e3*s.session.pingrate)})},e.refresh=function(){o.get("token","refresh",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.refresh,250*s.session.timeout)})},e.tkcreate=function(){o.get("token","create",{token:s.session.initial},function(t){200===t.status?e.onsuccess(t.data):e.onerror()})},e.icon=r.icon||"fi-lightbulb",e.hostname=a.host(),e.httpdport=a.port(),e.autolog=JSON.parse(r.autolog||!1),e.autolog&&e.tkcreate(),n(e.getping,1e3*s.session.pingrate),n(e.refresh,250*s.session.timeout)}return{template:e,scope:{callback:"="},restrict:"E",link:l}}])}(),function(){"use strict";var e='<div class="tip-modal-popup"><i class="{{icon}}"></i><span>{{tip}}</span></span></div>';angular.module("ModalNotification",[]).directive("tipModal",["$timeout",function(t){function n(e,n,a){function i(){function n(){e.show&&e.modal.css({opacity:1,visibility:"visible"})}e.show=!0,e.timeout=t(n,e.delay)}function s(){e.show=!1,e.modal.css({opacity:0,visibility:"hidden"})}e.parent=n.parent(),e.modal=n.find("div"),e.icon=a.icon||"fi-lightbulb",e.parent.addClass("as-modal-tip"),e.parent.bind("click",s),e.parent.bind("focus",i),e.parent.bind("mouseover",i),e.parent.bind("mouseleave",s),e.parent.bind("blur",s),e.delay=a.delay||1e3}return{restrict:"E",template:e,link:n,scope:{tip:"="}}}])}(),function(){"use strict";var e='<span title="Goto: {{href}}" ng-click="clicked()"><i class="{{icon}}"></i><span>{{label}}</span></span>';angular.module("LinkButton",[]).directive("linkButton",["$location",function(t){function n(e,n,a){e.clicked=function(){a.query?t.path(a.href).search(a.query):t.path(a.href)},e.icon=a.icon||"fi-link",e.label=a.label||"Jump",e.href=a.href||"/home",n.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:n,scope:{}}}])}(),function(){"use strict";function e(e,t,n,a,i){var s=new XMLHttpRequest,o=new FormData,l=function(e){i(e)};s.upload.onprogress=function(t){var n=Math.round(t.lengthComputable?100*t.loaded/t.total:0);e.slider&&e.slider.setValue(n)},s.onload=function(){t.addClass("success"),t.removeClass("error");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)},s.onerror=function(){t.addClass("error"),t.removeClass("success");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)},s.onabort=function(){t.addClass("error"),t.removeClass("success");var n={status:s.status,headers:s.getAllResponseHeaders()};e.callback(n)};for(var r=0;r<a.length;r++){var u=a[r];if(u.type.match(e.mimetype)){if(u.size>1024*e.maxsize)return e.thumbnail=e.istoobig,void e.$apply("thumbnail");if(isNaN(u.size))return e.thumbnail=e.isnotvalid,void e.$apply("thumbnail");if(e.Basename=u.name.split("/").reverse()[0],e.imgElem[0].file=u,i){var c=new FileReader;c.readAsArrayBuffer(u),c.onload=l}o.append(e.name,u,u.name)}}s.open("POST",n,!0),s.send(o)}var t='<input type="file" name="{{name}}-input" onchange="angular.element(this).scope().UpLoadFile(this.files)" accept="{{mimetype}}" style="display:none"><div class="upload-file" ng-click="imgClicked()"><img id="{{name}}-img" src="{{thumbnail}}"><range-slider ng-show="!noslider" id="{{name}}-slider" automatic=true inithook="SliderInitCB"></range-slider></div>';angular.module("UploadFiles",["AppConfig","ModalNotification","RangeSlider"]).directive("uploadImage",["AppConfig","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=function(e){return t.imgElem[0].src=window.URL.createObjectURL(new Blob([e.target.result],{type:"image"})),!0},l=i.posturl+"?token="+n.session.token;new e(t,a,l,s,o)},t.name=i.name||"avatar",t.category=i.category||"image",t.mimetype=(i.accept||"image")+"/*",t.maxsize=i.maxsize||100,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"tux-bzh.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}]).directive("uploadAudio",["AppConfig","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=i.posturl+"?token="+n.session.token;new e(t,a,o,s,!1)},t.name=i.name||"audio",t.category=i.category||"audio",t.mimetype=(i.accept||"audio")+"/*",t.maxsize=i.maxsize||1e4,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"upload-music.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}]).directive("uploadAppli",["AppConfig","JQemu","Notification",function(n,a,i){function s(t,a,i){if(t.imgElem=a.find("img"),t.inputElem=a.find("input"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var o=function(e){var a=new JSZip(e.target.result),i=a.file("afa-pkg/thumbnail.jpg");return i?(t.imgElem[0].src=window.URL.createObjectURL(new Blob([i.asArrayBuffer()],{type:"image"})),!0):(t.thumbnail=n.paths[t.category]+"isnotvalid.png",t.$apply("thumbnail"),!1)},l=i.posturl+"?token="+n.session.token;new e(t,a,l,s,o)},t.name=i.name||"appli",t.category=i.category||"appli",t.mimetype=i.accept||".zip",t.maxsize=i.maxsize||1e5,t.regexp=new RegExp(i.accept+".*","i"),i.thumbnail?t.thumbnail=n.paths[t.category]+i.thumbnail:t.thumbnail=n.paths[t.category]+"upload-appli.png",i.thumbnail?t.isnotvalid=n.paths[t.category]+i.isnotvalid:t.isnotvalid=n.paths[t.category]+"isnotvalid.png",i.istoobig?t.istoobig=n.paths[t.category]+i.istoobig:t.istoobig=n.paths[t.category]+"istoobig.png",t.noslider=i.noslider||!1,!i.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:s,scope:{callback:"="}}}])}(),function(){"use strict";var e='<tip-modal tip="tip"></tip-modal><label for="{{name}}-intext">{{label}} <i ng-show="required" ng-click="ToBeDefined" class="required {{status}} fi-checkbox" title="Free Value But Mandatory Argument" alt="?"> &nbsp; </i></label><input type="{{type}}" id="{{name}}-intext" placeholder="{{placeholder}}" class="status-{{status}}" ng-model="value" ng-blur="validate()" ng-focus="selected()" ng-model-options="{ updateOn: \'default blur\', debounce: {default: 500, blur: 0} }"><alert data-ng-show="!valid&&errmsg">{{errmsg}}</alert>',t=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;angular.module("InputText",["JQueryEmu"]).directive("inputText",["JQemu",function(n){function a(e,a,i){e.error=!1,e.valid=!1,e.status="untouch",e.input=a.find("input"),e.required=0,"required"in i&&(e.required=1,a.addClass("required")),e.selected=function(){e.error=!1,e.errmsg=!1,e.status="touch"},e.validate=function(){e.parent.removeClass("ng-pristine"),e.value?(e.error=!1,e.value=e.value.trim(),"nospace"in i&&(e.value=e.value.replace(/\s/g,"")),"lowercase"in i&&(e.value=e.value.toLowerCase()),"minlen"in i&&e.value.length<i.minlen&&(e.status="invalid",e.errmsg=e.name+": Mininum Lengh= "+i.minlen+" Characters",e.error=!0),"email"in i&&(t.test(e.value)||(e.status="invalid",e.errmsg="invalid email address",e.error=!0))):e.required&&(e.status="invalid",e.errmsg=e.name+": Required Attribute",e.error=!0),e.error?(e.required&&e.valid&&(e.valid=!1,e.l4acounter.validated>0&&e.l4acounter.validated--),e.callback(i.name,null,e.done)):(e.required&&!e.valid&&e.l4acounter.validated++,e.status="valid",e.valid=!0,e.callback(i.name,e.value,e.done))},e.done=function(t){for(var n in t)e[n]=t[n]},e.label=i.label,e.name=i.name,e.placeholder=i.placeholder,e.type=i.type||"text",e.tip=i.tip,e.parent=n.parent(a,"FORM"),"email"in i&&(i.lowercase=!0,i.nospace=!0,i.minlen=6),e.required&&(e.l4acounter=e.parent.data("l4acounter"),e.l4acounter?e.l4acounter.required++:(e.l4acounter={required:1,validated:0},e.parent.data("l4acounter",e.l4acounter))),e.$watch("value",function(){e.value&&e.validate()})}return{restrict:"E",template:e,link:a,scope:{callback:"=",value:"="}}}])}(),function(){"use strict";var e='<input-text class="password" tip="{{tip1}}" placeholder="{{place1}}"label="{{label1}}" callback="valid1" name="{{name}}-1" value="pass1" required minlen="{{minlen}}" type="password" ></input-text><input-text class="password" tip="tip2" placeholder="{{place2}}"label="{{label2}}" callback="valid2" name="{{name}}-2" value="pass2" required minlen="{{minlen}}" type="password" > </input-text>';angular.module("InputPassword",[]).directive("inputPassword",function(){function t(e,t,n){e.valid1=function(t,n){e.firstpwd=n},e.valid2=function(t,a,i){e.firstpwd!==a?i({valid:!1,status:"invalid",errmsg:"both password should match"}):e.callback(n.name,a)},e.done=function(t){for(var n in t)e[n]=t[n]},e.name=n.name,e.label1=n.label||"Password",e.label2=n.label||"Password Verification",e.place1=n.placeholder1||"User Password",e.tip1=n.tip||"Choose a Password",e.place2=n.placeholder1||"Password Verification",e.tip2=n.tip||"Confirme your Password",e.minlen=n.minlen||10,"required"in n&&(e.required="required")}return{restrict:"E",template:e,link:t,scope:{callback:"="}}})}(),function(){"use strict";angular.module("SampleModule",["SubmitButton","UploadFiles"]).controller("SampleController",["$http",function(e){var t=this;t.FileUploaded=function(e){}}])}(),function(){"use strict";angular.module("HomeModule",["SubmitButton","TokenRefresh"]).controller("HomeController",["$http","AppConfig",function(e,t){var n=this;n.uuid="none",n.token="none",n.session="none",n.status="err-no",n.ProcessResponse=function(e,a,i,s){var o="API"+e.request.api.replace("-","_");n.status="err-ok",n.errcode=a,n.request=e.request,n.response=e.response,e.request.token&&(t.session.token=e.request.token),e.request.uuid&&(t.session.uuid=e.request.uuid),e.request.timeout&&(t.session.timeout=e.request.timeout),("APIcreate"===o||"APIreset"===o)&&(n.APIreset="",n.APIcreate="",n.APIrefresh="",n.APIcheck=""),n[o]="success",e.request.token&&(n.token=e.request.token)},n.ProcessError=function(e,t,a,i){var s="API"+e.request.api.replace("-","_");n.status="err-fx",n.errcode=t,n.request=e.request,n.response="",n[s]="fail"},n.OpenSession=function(){var a={},i=e.post(t.session.create+"?token="+t.session.initial,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.CheckSession=function(){var a={},i=e.post(t.session.check+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.RefreshSession=function(){var a={},i=e.post(t.session.refresh+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)},n.ResetSession=function(){var a={},i=e.post(t.session.reset+"?token="+t.session.token,a);i.success(n.ProcessResponse),i.error(n.ProcessError)}}])}(),function(){"use strict";angular.module("JQueryEmu",[]).factory("JQemu",function(){var e=function(e,t){for(var n=e,a=t.toUpperCase();n[0];){if(a===n[0].tagName)return n;n=n.parent()}},t=function(e,t,n){for(var a=n.toLowerCase(),i=t.toLowerCase()+"Name",s=e.children();s[0];){if(a===s[0][i])return s;s=s.next()}},n=function(e,t){for(var n=t.toLowerCase(),a=e.children();a[0];){if(a.hasClass(n))return a;a=a.next()}},a={FindInParent:e,FindByTag:t,FindByClass:n};return a})}();var foundationRoutes=[{name:"mysample",url:"/sample",controller:"SampleController as ctrl",animationIn:"slideInRight",path:"pages/Sample/Sample.html"},{name:"myhome",url:"/home",controller:"HomeController as ctrl",animationIn:"slideInRight",path:"pages/Home/Home.html"}];!function(){"use strict";angular.module("AppConfig",[]).factory("AppConfig",["urlquery",function(e){var t={paths:{image:"images/",avatar:"images/avatars/",audio:"images/audio/",appli:"images/appli/"},session:{create:"/api/token/create",refresh:"/api/token/refresh",check:"/api/token/check",reset:"/api/token/reset",ping:"/api/token/check",initial:e.token||"123456789",timeout:3600,pingrate:60,uuid:"",token:""}};return t}]).factory("AppCall",["$http","AppConfig",function(e,t){var n={get:function(n,a,i,s){i.token||(i.token=t.session.token),e.get("/api/"+n+"/"+a,{params:i}).then(s,s)}};return n}])}(),function(){"use strict";function e(){var e={};return location.search.substr(1).split("&").forEach(function(t){var n=t.split("=")[0],a=decodeURIComponent(t.split("=")[1]);n in e?e[n].push(a):e[n]=[a]}),e}function t(e,t,n){e.otherwise("/home"),t.html5Mode(!0).hashPrefix("!")}function n(){FastClick.attach(document.body)}angular.module("AFBclient",["ui.router","ngAnimate","foundation","foundation.dynamicRouting","foundation.dynamicRouting.animations","ui-notification","AppConfig","JQueryEmu","HomeModule","SampleModule","UploadFiles","LinkButton","TokenRefresh","RangeSlider","ModalNotification"]).value("urlquery",e()).config(t).run(n),t.$inject=["$urlRouterProvider","$locationProvider"]}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Sample/Sample.html",'<h1><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px"> Post File Upload</h1><div class="sample-box box-content"><upload-image name="avatar" category="avatar" thumbnail="tux-visitor.png" maxsize="100" posturl="/api/post/upload-image" callback="ctrl.FileUploaded" accept="image" title="Change your Avatar"></upload-image><upload-audio name="music" posturl="/api/post/upload-music" callback="ctrl.FileUploaded" title="Upload your Music"></upload-audio><upload-appli name="appli" posturl="/api/post/upload-appli" callback="ctrl.FileUploaded" title="Upload AGL App"></upload-appli></div><link-button href="home" icon="fi-home" label="home"></link-button>')}])}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Home/Home.html",'<h3><img class="logo" src="images/logo/triskel_iot_bzhx250.png" alt="IoT.bzh Logo" style="height:150px"> App Framework Binder Simple Client</h3><token-refresh autolog="true"></token-refresh><div class="button-box box-content"><submit-button class="session-button {{ctrl.APIcreate}}" icon="fi-unlock" label="Open" clicked="ctrl.OpenSession"></submit-button><submit-button class="session-button {{ctrl.APIcheck}}" icon="fi-checkbox" label="Check" clicked="ctrl.CheckSession"></submit-button><submit-button class="session-button {{ctrl.APIrefresh}}" icon="fi-arrows-compress" label="Refresh" clicked="ctrl.RefreshSession"></submit-button><submit-button class="session-button {{ctrl.APIreset}}" icon="fi-lock" label="Close" clicked="ctrl.ResetSession"></submit-button></div><div class="message-box box-content vertical grid-frame"><div class="response"><span class="grid-content noscroll req {{ctrl.status}}">req= {{ctrl.request}}</span> <span class="grid-content noscroll res {{ctrl.status}}">res= {{ctrl.response}}</span> <span class="grid-content noscroll status {{ctrl.status}}">status= {{ctrl.errcode}}</span></div></div><link-button href="sample" icon="fi-home" label="sample"></link-button>')}])}();
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvQnV0dG9ucy9TdWJtaXRCdXR0b25zL1N1Ym1pdEJ1dHRvbnMuanMiLCJ3aWRnZXRzL1JhbmdlU2xpZGVycy9SYW5nZVNsaWRlck1vZC5qcyIsIndpZGdldHMvTm90aWZpY2F0aW9ucy9Ub2tlblJlZnJlc2hTdmMuanMiLCJ3aWRnZXRzL05vdGlmaWNhdGlvbnMvTW9kYWxOb3RpZmljYXRpb24uanMiLCJ3aWRnZXRzL05hdmlnYXRpb24vTGlua0J1dHRvbi5qcyIsIndpZGdldHMvRm9ybUlucHV0L1VwbG9hZEZpbGVzLmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvSW5wdXRUZXh0LmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvSW5wdXRQYXNzd29yZC5qcyIsInBhZ2VzL1NhbXBsZS9TYW1wbGVNb2R1bGUuanMiLCJwYWdlcy9Ib21lL0hvbWVNb2R1bGUuanMiLCJzZXJ2aWNlcy9KUXVlcnlFbXUuanMiLCJldGMvcm91dGVzLmpzIiwiZXRjL0FwcENvbmZpZy5qcyIsImFwcC5qcyIsInBhZ2VzL1NhbXBsZS9TYW1wbGUuanMiLCJwYWdlcy9Ib21lL0hvbWUuanMiXSwibmFtZXMiOlsidG1wbCIsImFuZ3VsYXIiLCJtb2R1bGUiLCJkaXJlY3RpdmUiLCJteW1ldGhvZHMiLCJzY29wZSIsImVsZW0iLCJhdHRycyIsImljb24iLCJsYWJlbCIsImFkZENsYXNzIiwidG9Mb3dlckNhc2UiLCJyZXN0cmljdCIsInRlbXBsYXRlIiwibGluayIsImNsaWNrZWQiLCJSYW5nZVNsaWRlckhhbmRsZSIsImludGVybmFscyIsImV4dGVybmFscyIsInRoaXMiLCJnZXRJZCIsInNsaWRlcmlkIiwiZ2V0Q2JIYW5kbGUiLCJjYmhhbmRsZSIsImdldFZpZXciLCJoYW5kbGUiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImN0cmxoYW5kbGUiLCJ1cGRhdGVDbGFzcyIsImNsYXNzZSIsInN0YXR1cyIsImZvcmNlUmVmcmVzaCIsInRpbWVyIiwiZ2V0VmFsdWUiLCJnZXRSZWxhdGl2ZSIsInJlbGF0aXZlIiwic2V0VmFsdWUiLCJzZXREaXNhYmxlIiwiZmxhZyIsIlJhbmdlU2xpZGVyIiwiJGxvZyIsIiRkb2N1bWVudCIsIiR0aW1lb3V0IiwiZWxlbWVudCIsIm1vZGVsIiwiaW5pdFdpZGdldCIsImluaXR2YWx1ZXMiLCJieVN0ZXAiLCJwYXJzZUludCIsIm5vdE1vcmUiLCJub3RMZXNzIiwiaWQiLCJ1bmRlZmluZWQiLCJkdWFsIiwicmVtb3ZlQ2xhc3MiLCJkaXNhYmxlZCIsImhhbmRsZXMiLCJjc3MiLCJub3JtYWxpemUiLCJyZXN1bHQiLCJyYW5nZSIsInBvaW50IiwibW9kIiwicmVtIiwicm91bmQiLCJwb3dlciIsIk1hdGgiLCJwb3ciLCJvZmZzZXQiLCJ2ZXJ0aWNhbCIsImJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImJhciIsIndpZHRoIiwibmV3dmFsdWUiLCJzdGFydFZhbHVlIiwic3RvcFZhbHVlIiwidmlld1ZhbHVlIiwiZGlzcGxheXMiLCJodG1sIiwiJHNldFZpZXdWYWx1ZSIsIiRhcHBseSIsInRyYW5zbGF0ZSIsInNldFN0YXJ0Iiwic3RhcnQiLCJzZXRTdG9wIiwic3RvcCIsInJpZ2h0Iiwidm9mZnNldCIsIi13ZWJraXQtdHJhbnNmb3JtIiwiLW1vei10cmFuc2Zvcm0iLCItbXMtdHJhbnNmb3JtIiwiLW8tdHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2xpZGVyIiwiYm90dG9tIiwibGVmdCIsImtleWRvd24iLCJlIiwia2V5Q29kZSIsImFjdGlmIiwiY2FsbGJhY2siLCJibHVyIiwibW92ZUhhbmRsZSIsImNsaWVudFgiLCJjbGllbnRZIiwiZm9jdXNDQiIsImluc2lkZSIsIm9uIiwidW5iaW5kIiwidG91Y2hCYXJDQiIsImV2ZW50IiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwib2xkdmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInBhZ2VZIiwicGFnZVgiLCJkaXN0YW5jZTAiLCJhYnMiLCJkaXN0YW5jZTEiLCJ0b3VjaEhhbmRsZUNCIiwidG91Y2hldnQiLCJ0b3VjaG1vdmUiLCJpZHgiLCJsZW5ndGgiLCJ0b3VjaGVuZCIsImhhbmRsZUNCIiwiY2xpY2tldmVudCIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJhdXRvbWF0aWMiLCJmb2N1cyIsImZpbmQiLCJzZWxlY3QiLCJkb21lbGVtIiwicXVlcnlTZWxlY3RvciIsImFuZ2VsZW0iLCJpbml0aWFsU2V0dGluZ3MiLCJpbml0aWFsIiwiZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0IiwicHJlY2lzaW9uIiwibWF0Y2giLCJldnQiLCJpbml0IiwicmFuZG9tIiwiSW5maW5pdHkiLCJkdWFsSGFuZGxlcyIsInRyaWdnZXJfaW5wdXRfY2hhbmdlIiwiZGlzYWJsZSIsImRpc3BsYXlUYXJnZXQiLCJnZXRFbGVtZW50QnlJZCIsInNwbGl0IiwibmdNb2RlbCIsIiR3YXRjaCIsInN0YXJ0QXQiLCJzdG9wQXQiLCJpbml0aG9vayIsIm5ld1ZhbHVlIiwicmVxdWlyZSIsInJlcGxhY2UiLCIkd2luZG93IiwiJGxvY2F0aW9uIiwiTm90aWZpY2F0aW9uIiwiQXBwQ29uZmlnIiwiQXBwQ2FsbCIsImxvZ2dlZCIsIm9uYmVmb3JldW5sb2FkIiwiZ2V0Iiwib25saW5lIiwib2ZmbGluZSIsIm9uZXJyb3IiLCJ3YXJuaW5nIiwibWVzc2FnZSIsImRlbGF5Iiwib25zdWNjZXNzIiwianJlc3AiLCJyZXF1ZXN0IiwidG9rZW4iLCJzZXNzaW9uIiwidXVpZCIsInRpbWVvdXQiLCJzdWNjZXNzIiwiZ2V0cGluZyIsImRhdGEiLCJwaW5ncmF0ZSIsInJlZnJlc2giLCJ0a2NyZWF0ZSIsImhvc3RuYW1lIiwiaG9zdCIsImh0dHBkcG9ydCIsInBvcnQiLCJhdXRvbG9nIiwiSlNPTiIsInBhcnNlIiwiZGlzcGxheSIsImFjdGlvbiIsInNob3ciLCJtb2RhbCIsIm9wYWNpdHkiLCJ2aXNpYmlsaXR5IiwiY2xvc2UiLCJwYXJlbnQiLCJiaW5kIiwidGlwIiwicXVlcnkiLCJwYXRoIiwiaHJlZiIsInNlYXJjaCIsIkxvYWRGaWxlU3ZjIiwicG9zdHVybCIsImZpbGVzIiwidGh1bWJuYWlsQ0IiLCJ4bWxSZXEiLCJYTUxIdHRwUmVxdWVzdCIsInhmb3JtIiwiRm9ybURhdGEiLCJPbkxvYWRDQiIsInRhcmdldCIsInVwbG9hZCIsIm9ucHJvZ3Jlc3MiLCJwcm9ncmVzcyIsImxlbmd0aENvbXB1dGFibGUiLCJsb2FkZWQiLCJ0b3RhbCIsIm9ubG9hZCIsInJlc3BvbnNlIiwiaGVhZGVycyIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsIm9uYWJvcnQiLCJpIiwiZmlsZSIsInR5cGUiLCJtaW1ldHlwZSIsInNpemUiLCJtYXhzaXplIiwidGh1bWJuYWlsIiwiaXN0b29iaWciLCJpc05hTiIsImlzbm90dmFsaWQiLCJCYXNlbmFtZSIsIm5hbWUiLCJyZXZlcnNlIiwiaW1nRWxlbSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNBcnJheUJ1ZmZlciIsImFwcGVuZCIsIm9wZW4iLCJzZW5kIiwiSlFlbXUiLCJpbnB1dEVsZW0iLCJpbWdDbGlja2VkIiwiY2xpY2siLCJTbGlkZXJJbml0Q0IiLCJVcExvYWRGaWxlIiwicmVhZGVyQ0IiLCJzcmMiLCJ3aW5kb3ciLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJCbG9iIiwiY2F0ZWdvcnkiLCJhY2NlcHQiLCJyZWdleHAiLCJSZWdFeHAiLCJwYXRocyIsIm5vc2xpZGVyIiwiVHlwZUVycm9yIiwiemlwYXBwIiwiSlNaaXAiLCJhc0FycmF5QnVmZmVyIiwiZW1haWxwYXRlcm4iLCJlcnJvciIsInZhbGlkIiwiaW5wdXQiLCJyZXF1aXJlZCIsInNlbGVjdGVkIiwiZXJybXNnIiwidmFsaWRhdGUiLCJ0cmltIiwibWlubGVuIiwidGVzdCIsImw0YWNvdW50ZXIiLCJ2YWxpZGF0ZWQiLCJkb25lIiwicGxhY2Vob2xkZXIiLCJsb3dlcmNhc2UiLCJub3NwYWNlIiwidmFsaWQxIiwiZmlyc3Rwd2QiLCJ2YWxpZDIiLCJsYWJlbDEiLCJsYWJlbDIiLCJwbGFjZTEiLCJwbGFjZWhvbGRlcjEiLCJ0aXAxIiwicGxhY2UyIiwidGlwMiIsImNvbnRyb2xsZXIiLCIkaHR0cCIsIkZpbGVVcGxvYWRlZCIsIlByb2Nlc3NSZXNwb25zZSIsImVycmNvZGUiLCJjb25maWciLCJhcGluYW1lIiwiYXBpIiwiQVBJcmVzZXQiLCJBUEljcmVhdGUiLCJBUElyZWZyZXNoIiwiQVBJY2hlY2siLCJQcm9jZXNzRXJyb3IiLCJPcGVuU2Vzc2lvbiIsInBvc3RkYXRhIiwiaGFuZGxlciIsInBvc3QiLCJjcmVhdGUiLCJDaGVja1Nlc3Npb24iLCJjaGVjayIsIlJlZnJlc2hTZXNzaW9uIiwiUmVzZXRTZXNzaW9uIiwicmVzZXQiLCJmYWN0b3J5IiwiRmluZEluUGFyZW50Iiwic2VsZWN0b3IiLCJ0b1VwcGVyQ2FzZSIsInRhZ05hbWUiLCJGaW5kQnlUYWciLCJ0YWciLCJjaGlsZHJlbiIsIm5leHQiLCJGaW5kQnlDbGFzcyIsImhhc0NsYXNzIiwibXlNZXRob2RzIiwiZm91bmRhdGlvblJvdXRlcyIsInVybCIsImFuaW1hdGlvbkluIiwidXJscXVlcnkiLCJteUNvbmZpZyIsImltYWdlIiwiYXZhdGFyIiwiYXVkaW8iLCJhcHBsaSIsInBpbmciLCJteUNhbGxzIiwicGx1Z2luIiwicGFyYW1zIiwidGhlbiIsIlBhcnNlUXVlcnlTdHJpbmciLCJxZCIsImxvY2F0aW9uIiwic3Vic3RyIiwiZm9yRWFjaCIsIml0ZW0iLCJrIiwidiIsImRlY29kZVVSSUNvbXBvbmVudCIsInB1c2giLCIkdXJsUHJvdmlkZXIiLCIkbG9jYXRpb25Qcm92aWRlciIsIm90aGVyd2lzZSIsImh0bWw1TW9kZSIsImhhc2hQcmVmaXgiLCJydW4iLCJGYXN0Q2xpY2siLCJhdHRhY2giLCJkb2N1bWVudCIsImJvZHkiLCIkaW5qZWN0IiwiJHRlbXBsYXRlQ2FjaGUiLCJwdXQiXSwibWFwcGluZ3MiOiJDQW9CQSxXQUNBLFlBRUEsSUFBQUEsR0FBQSx3RkFLQUMsU0FBQUMsT0FBQSxtQkFDQUMsVUFBQSxlQUFBLFdBRUEsUUFB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YUFDQSxlQUNBLGNBQ0Esc0JBRUF3QixNQUFBLFdBQUFvVSxLQUNBNUMsT0FBQUEsR0FDQTJELElBQUFBLEdBR0EzRCxFQUFBZ0UsU0FBQSxxQkFBQSx3QkN6Q0EsV0FBQWpYLFFBQUFDLE9BQUEsYUFBQTJXLEtBQUEsaUJBQUEsU0FBQU0sR0FBQUEsRUFBQUMsSUFBQSwyQkFDQSxxc0JDREEsV0FBQW5YLFFBQUFDLE9BQUEsYUFBQTJXLEtBQUEsaUJBQUEsU0FBQU0sR0FBQUEsRUFBQUMsSUFBQSx1QkFDQSIsImZpbGUiOiJBRkJjbGllbnQubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8ZGl2ICBuZy1jbGljaz1cImNsaWNrZWQoKVwiPiA8c3Bhbj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ1N1Ym1pdEJ1dHRvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgnc3VibWl0QnV0dG9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFqdXN0IGljb24gb3IgdXNlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiA9IGF0dHJzLmljb24gfHwgJ2ZpLWZvb3QnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdOZXh0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBsYWJlbCBhcyBjbGFzc1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzIChzY29wZS5sYWJlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IGNsaWNrZWQgaW4gaW1wb3J0ZWQgYW5kIHdoZW4gdGVtcGxhdGUgaXMgY2xpY2tlZFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGNhbGwgY2xpY2tlZCBtZXRob2QgcGFzc2VkIGluIHBhcmFtLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge2NsaWNrZWQgOiAnPSd9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuICogXG4gKiBCdWdzOiBJbnB1dCB3aXRoIENhbGxiYWNrIFNIT1VMRCBCRSBnZXQgJ3JlcXVpcmVkJyBjbGFzc1xuICogXG4gKiByZWY6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9tb3VzZW92ZXJcbiAqIFxuICogdXNhZ2U6IFxuVXNhZ2UgIDxyYW5nZS1zbGlkZXI+XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIDxyYW5nZS1zbGlkZXJcbiAgICAgIGlkPVwibXktc2xpZGVyLW5hbWVcIiAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXNlIGFzIGFuIGFyZ3VtZW50IHRvIGNhbGxiYWNrXG4gICAgICBjbGFzcz1cIm15LWN1c3RvbS1jbGFzc1wiICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNsYXNzIGlzIGliei1yYW5nZS1zbGlkZXJcbiAgICAgIHBsYWNlaG9sZGVyPVwiVHJhY2sgRGF0ZSBTZWxlY3Rpb25cIiAgICAgIC8vIHBsYWNlIGhvbGRlciBmb3IgZGF0ZSByZWFkb25seSBpbnB1dCB6b25lXG5cbiAgICAgIDwhLS0gRm91bmRhdGlvbiBjbGFzc2VzIC0tPlxuICAgICAgY2xhc3M9XCJyYWRpdXNcIiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgWnVyYiBmb3VuZGF0aW9uIGRvYyBmb3IgZnVydGhlciBpbmZvLlxuICAgICAgY2xhc3M9XCJpYnotaGFuZGxlLWRpc3BsYXlcIiAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgaGFuZGxlIHdpZHRoIHRvIGhvbGQgc2xpZGVyIGN1cnJlbnQgdmFsdWVcblxuICAgICAgPCEtLSBBbmd1bGFyIFNjb3BlIFZhcmlhYmxlcyAtLT5cbiAgICAgIGNhbGxiYWNrPVwibXlDYWxsQmFja1wiICAgICAgICAgICAgICAgICAgICAvLyAkc2NvcGUubXlDYWxsQmFjayhzbGlkZXJoYW5kbGUpIGlzIGNhbGxlZCB3aGVuIGV2ZXIgc2xpZGVyIGhhbmRsZSBibHVyXG4gICAgICBmb3JtYXR0ZXI9XCJTbGlkZXJGb3JtYXRDQlwiICAgICAgICAgICAgICAgLy8gJHNjb3BlLm15Rm9ybWF0dGVyKHZhbHVlLCBzbGlkZXJpZCkgd2hlbiBleGlzdCBpcyBjYWxsIHdoZW4gZXZlciBzbGlkZXIgaGFuZGxlIG1vdmVzLiBTaG91bGQgcmV0dXJuIGV4dGVybmFsIGZvcm0gb2Ygc2xpZGVyIHZhbHVlLlxuICAgICAgbmctbW9kZWw9XCJ4eHh4eHhcIiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHh4eCBNdXN0IGJlIGRlZmluZWQsIHNjcmlwdCB3aWxsIHN0b3JlIGEgbmV3IFJhbmdlck9iamVjdCB3aXRoaW4gcHJvdmlkZWQgbmctbW9kZWwgdmFyaWFibGUuXG4gICAgICBzdGFydC1hdD1cIlNjb3BlVmFyXCIgICAgICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBsaW1pdGF0aW9uIHdoZW4gc2xpZGVyIGlzIGNvbnN0cmFpbnMgYnkgYW4gZXh0ZXJuYWwgY29tcG9uYW50IFtleDogY2hlY2sgaW4vb3V0XVxuICAgICAgc3RvcC1hdD1cIlNjb3BlVmFyXCIgICAgICAgICAgICAgICAgICAgICAgIC8vIElkZW0gYnV0IGZvciBlbmQuXG5cbiAgICAgIDwhLS0gQW5ndWxhciBEaXJlY3RpdmUgQXR0cmlidXRlcyAtLT5cbiAgICAgIG5vdC1sZXNzPVwiaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBzdGFydGluZyB2YWx1ZSBmb3Igc2xpZGVyIFtkZWZhdWx0IDBdXG4gICAgICBub3QtbW9yZT1cImludGVnZXJcIiAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgZW5kIHZhbHVlIGZvciBzbGlkZXJzIFtkZWZhdWx0IDEwMF1cbiAgICAgIGJ5LXN0ZXA9XCIrLWludGVnZXJcIiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBieS1zdGVwIGlzID4wIHRoZW4gc2xpZGVyIHVzZSBpdCBhcyBzdGVwLXZhbHVlLCB3aGVuIG5lZ2F0aXZlIHVzZSBpdCBmb3IgZGVjaW1hbCBwcmVjaXNpb25cbiAgICAgIGRpc3BsYXktdGFyZ2V0PVwiaGFuZGxlXCIgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHNsaWRlciBleHRlcm5hbCBmb3JtYXRlZCB2YWx1ZSBpbiB0aGUgaGFuZGxlIFtyZXF1aXJlciBjYWxzcz1cImliei1oYW5kbGUtZGlzcGxheVwiXVxuICAgICAgZHVhbC1oYW5kbGVzPSd0cnVlJyAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYSBzZWNvbmQgaGFuZGxlIHRvIHNsaWRlciBmb3IgbWluL21heCByYW5nZVxuICAgICAgaW5pdGlhbD0ndmFsdWV8W3N0YXJ0L3N0b3BdJyAgICAgICAgICAgICAvLyBzbGlkZXIgaW5pdGlhbCB2YWx1ZSBbZHVhbC1oYW5kbGVzXSBtYXkgaGF2ZSBpbml0aWFsIHZhbHVlc1xuICAgLz48L3JhbmdlLXNsaWRlcj5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxudmFyIFJhbmdlU2xpZGVyID0gYW5ndWxhci5tb2R1bGUoJ1JhbmdlU2xpZGVyJyxbXSk7XG5cbmZ1bmN0aW9uIFJhbmdlU2xpZGVySGFuZGxlIChzY29wZSkge1xuICAgIHZhciBpbnRlcm5hbHMgPSBbXTtcbiAgICB2YXIgZXh0ZXJuYWxzID0gW107XG5cbiAgICB0aGlzLmdldElkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzY29wZS5zbGlkZXJpZDtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRDYkhhbmRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc2NvcGUuY2JoYW5kbGU7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Vmlldz0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcblxuICAgICAgICAvLyBpZiB2YWx1ZSBkaWQgbm90IGNoYW5nZSByZXR1cm4gY3VycmVudCBleHRlcm5hbCByZXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoc2NvcGUudmFsdWVbaGFuZGxlXSA9PT0gaW50ZXJuYWxzW2hhbmRsZV0pIHJldHVybiBleHRlcm5hbHNbaGFuZGxlXTtcblxuICAgICAgICAvLyBidWlsZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgc2F2ZSBpdCBmb3IgZnVydGhlciByZXF1ZXN0c1xuICAgICAgICBpbnRlcm5hbHNbaGFuZGxlXSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG4gICAgICAgIGlmIChzY29wZS5mb3JtYXR0ZXIpIGV4dGVybmFsc1toYW5kbGVdID0gc2NvcGUuZm9ybWF0dGVyKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICBlbHNlICBleHRlcm5hbHNbaGFuZGxlXSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgcmV0dXJuIGV4dGVybmFsc1toYW5kbGVdO1xuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZUNsYXNzID0gZnVuY3Rpb24gKGNsYXNzZSwgc3RhdHVzKSB7XG4gICAgICAgc2NvcGUudXBkYXRlQ2xhc3MgKGNsYXNzZSwgc3RhdHVzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JjZVJlZnJlc2ggPSBmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICBzY29wZS5mb3JjZVJlZnJlc2godGltZXIpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFZhbHVlPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICByZXR1cm4gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRSZWxhdGl2ZT0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAoIWhhbmRsZSkgaGFuZGxlID0gMDtcbiAgICAgICAgcmV0dXJuIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV07XG4gICAgfTtcblxuICAgIHRoaXMuc2V0VmFsdWU9IGZ1bmN0aW9uICh2YWx1ZSwgaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICBzY29wZS5zZXRWYWx1ZSAodmFsdWUsIGhhbmRsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0RGlzYWJsZT0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgc2NvcGUuc2V0RGlzYWJsZShmbGFnKTtcbiAgICB9O1xufVxuXG5SYW5nZVNsaWRlci5kaXJlY3RpdmUoJ3JhbmdlU2xpZGVyJywgW1wiJGxvZ1wiLCBcIiRkb2N1bWVudFwiLCBcIiR0aW1lb3V0XCIsIGZ1bmN0aW9uICgkbG9nLCAkZG9jdW1lbnQsICR0aW1lb3V0KSB7XG5cbiAgICB2YXIgdGVtcGxhdGU9ICc8ZGl2IGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlciByYW5nZS1zbGlkZXJcIiB0aXRsZT1cInt7dGl0bGV9fVwiZGF0YS1zbGlkZXI+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInJhbmdlLXNsaWRlci1oYW5kbGUgaGFuZGxlLW1pblwiIG5nLW1vdXNlZG93bj1cImhhbmRsZUNCKCRldmVudCwwKVwiIG5nLWZvY3VzPVwiZm9jdXNDQih0cnVlKVwiIG5nLWJsdXI9XCJmb2N1c0NCKGZhbHNlKVwiIHJvbGU9XCJzbGlkZXJcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImhhbmRsZS1tYXhcIiBuZy1tb3VzZWRvd249XCJoYW5kbGVDQigkZXZlbnQsMSlcIiBuZy1mb2N1cz1cImZvY3VzQ0IodHJ1ZSlcIiBuZy1ibHVyPVwiZm9jdXNDQihmYWxzZSlcIiByb2xlPVwic2xpZGVyXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPicrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJyYW5nZS1zbGlkZXItYWN0aXZlLXNlZ21lbnRcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImliei1yYW5nZS1zbGlkZXItc3RhcnRcIiA+PC9zcGFuPiAnK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlci1zdG9wXCI+PC9zcGFuPiAnK1xuICAgICAgICAgICAgICAgICAgJzxpbnB1dCBpZD17e3NsaWRlcmlkfX0gdHlwZT1cImhpZGRlblwiPicrXG4gICAgICAgICAgICAgICAgICAnPC9kaXY+JztcblxuXG4gICAgZnVuY3Rpb24gbGluayAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBtb2RlbCkge1xuICAgICAgICAvLyBmdWxsIGluaXRpYWxpc2F0aW9uIG9mIHNsaWRlciBmcm9tIGEgc2luZ2xlIG9iamVjdFxuICAgICAgICBzY29wZS5pbml0V2lkZ2V0ID0gZnVuY3Rpb24gKGluaXR2YWx1ZXMpIHtcblxuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMuYnlTdGVwKSAgc2NvcGUuYnlTdGVwICA9IHBhcnNlSW50KGluaXR2YWx1ZXMuYnlTdGVwKTtcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLm5vdE1vcmUpIHNjb3BlLm5vdE1vcmUgPSBwYXJzZUludChpbml0dmFsdWVzLm5vdE1vcmUpO1xuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMubm90TGVzcykgc2NvcGUubm90TGVzcyA9IHBhcnNlSW50KGluaXR2YWx1ZXMubm90TGVzcyk7XG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5pZCkgICAgICBzY29wZS5zbGlkZXJpZD0gaW5pdHZhbHVlcy5pZDtcblxuICAgICAgICAgICAgLy8gaHVnZWx5IGJ1dCBpbiBzb21lIGNhc2UgRE9NIGlzIG5vdCBmaW5pc2ggd2hlbiB3ZSB0cnkgdG8gc2V0IHZhbHVlcyAhISFcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLnZhbHVlICE9PSB1bmRlZmluZWQpICAge1xuICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlID0gaW5pdHZhbHVlcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBzY29wZS5mb3JjZVJlZnJlc2ggKDUwKTsgLy8gd2FpdCA1MG1zIGZvciBET00gdG8gYmUgcmVhZHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHJlY29tcHV0ZSBzbGlkZSBwb3NpdGlvbmluZ1xuICAgICAgICBzY29wZS5mb3JjZVJlZnJlc2ggPSBmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICAgICAgdmFyIHZhbHVlID0gc2NvcGUudmFsdWU7XG4gICAgICAgICAgIHNjb3BlLnZhbHVlID0gW3VuZGVmaW5lZCx1bmRlZmluZWRdO1xuICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICBzY29wZS5zZXRWYWx1ZSh2YWx1ZVswXSwwKTtcbiAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSAgc2NvcGUuc2V0VmFsdWUodmFsdWVbMV0sMSk7XG4gICAgICAgICAgIH0sIHRpbWVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBoYW5kbGVyIHRvIGNoYW5nZSBjbGFzcyBmcm9tIHNsaWRlciBoYW5kbGVcbiAgICAgICAgc2NvcGUudXBkYXRlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NlLCBzdGF0dXMpIHtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cykgZWxlbWVudC5hZGRDbGFzcyAoY2xhc3NlKTtcbiAgICAgICAgICAgIGVsc2UgIGVsZW1lbnQucmVtb3ZlQ2xhc3MgKGNsYXNzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuc2V0RGlzYWJsZSA9IGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzIChcImRpc2FibGVcIik7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5jc3MgKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1sxXS5jc3MgKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzIChcImRpc2FibGVcIik7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5jc3MgKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSBzY29wZS5oYW5kbGVzWzFdLmNzcyAoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5ub3JtYWxpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcztcbiAgICAgICAgICAgIHZhciBwb2ludCA9IHZhbHVlICogcmFuZ2U7XG5cbiAgICAgICAgICAgIC8vIGlmIHN0ZXAgaXMgcG9zaXRpdmUgbGV0J3Mgcm91bmQgc3RlcCBieSBzdGVwXG4gICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gIDApIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kID0gKHBvaW50IC0gKHBvaW50ICUgc2NvcGUuYnlTdGVwKSkgLyBzY29wZS5ieVN0ZXA7XG4gICAgICAgICAgICAgICAgdmFyIHJlbSA9IHBvaW50ICUgc2NvcGUuYnlTdGVwO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJvdW5kID0gKHJlbSA+PSBzY29wZS5ieVN0ZXAgKiAwLjUgPyBzY29wZS5ieVN0ZXAgOiAwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQ9IChtb2QgKiBzY29wZS5ieVN0ZXAgKyByb3VuZCkgKyBzY29wZS5ub3RMZXNzO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cgKFwicmFuZ2U9JWQgdmFsdWU9JWQgcG9pbnQ9JWQgbW9kPSVkIHJlbT0lZCByb3VuZD0lZCByZXN1bHQ9JWRcIiwgcmFuZ2UsIHZhbHVlLCBwb2ludCwgbW9kLCByZW0sIHJvdW5kLCByZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBuZWdhdGl2ZSByZXR1cm4gcm91bmQgdG8gYXNrZWQgZGVjaW1hbFxuICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA8ICAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvd2VyICA9ICBNYXRoLnBvdyAoMTAsKHNjb3BlLmJ5U3RlcCAqIC0xKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2NvcGUubm90TGVzcyArIHBhcnNlSW50IChwb2ludCAqIHBvd2VyKSAvIHBvd2VyO1xuICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBudWxsIHJldHVybiBmdWxsIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gcG9pbnQ7XG4gICAgICAgfTtcblxuICAgICAgICAvLyByZXR1cm4gY3VycmVudCB2YWx1ZVxuICAgICAgICBzY29wZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChvZmZzZXQsIGhhbmRsZSkge1xuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9IChvZmZzZXQgLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgLyAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSBvZmZzZXQgLyAgKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5ld3ZhbHVlID0gc2NvcGUubm9ybWFsaXplIChzY29wZS5yZWxhdGl2ZVtoYW5kbGVdKTtcblxuXG4gICAgICAgICAgICAvLyBpZiBpbnRlcm5hbCB2YWx1ZSBjaGFuZ2UgdXBkYXRlIG9yIG1vZGVsXG4gICAgICAgICAgICBpZiAobmV3dmFsdWUgIT09IHNjb3BlLnZhbHVlW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3dmFsdWUgPCBzY29wZS5zdGFydFZhbHVlKSBuZXd2YWx1ZT1zY29wZS5zdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA+IHNjb3BlLnN0b3BWYWx1ZSkgIG5ld3ZhbHVlPXNjb3BlLnN0b3BWYWx1ZTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSBzY29wZS5mb3JtYXR0ZXIgKG5ld3ZhbHVlLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS52aWV3VmFsdWUgPSBuZXd2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXNbaGFuZGxlXS5odG1sIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICBzY29wZS52YWx1ZVtoYW5kbGVdID0gbmV3dmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGVsKSBtb2RlbC4kc2V0Vmlld1ZhbHVlIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA+IHNjb3BlLnN0YXJ0VmFsdWUgJiYgbmV3dmFsdWUgPCBzY29wZS5zdG9wVmFsdWUpIHNjb3BlLnRyYW5zbGF0ZShvZmZzZXQsIGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICBzY29wZS5zZXRTdGFydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHZhbHVlID4gc2NvcGUudmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwwKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhcnQuY3NzKCdoZWlnaHQnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXJ0LmNzcygnd2lkdGgnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS5zdGFydFZhbHVlPSB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zZXRTdG9wID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzY29wZS52YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDApO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGFydC5jc3MoJ2hlaWdodCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RvcC5jc3MoeydyaWdodCc6IDAsICd3aWR0aCc6IChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICAtIG9mZnNldCkgKyAncHgnfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnN0b3BWYWx1ZT0gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKG9mZnNldCwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIC8vIHRha2UgaGFuZGxlIHNpemUgaW4gYWNjb3VudCB0byBjb21wdXRlIG1pZGRsZVxuICAgICAgICAgICAgICAgIHZhciB2b2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzW2hhbmRsZV0uY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tb3otdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW8tdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KSdcbiAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zbGlkZXIuY3NzKCdoZWlnaHQnLCBvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjb3BlLnJlbGF0aXZlWzFdICYmIHNjb3BlLnJlbGF0aXZlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IChzY29wZS5yZWxhdGl2ZVsxXSAtIHNjb3BlLnJlbGF0aXZlWzBdKSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICBzdGFydCAgPSAoc2NvcGUucmVsYXRpdmVbMF0gKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgIHNjb3BlLnNsaWRlci5jc3MgKHsnYm90dG9tJzogc3RhcnQrJ3B4JywnaGVpZ2h0JzogaGVpZ2h0ICsgJ3B4J30pO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctbW96LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctby10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJ3B4KSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNsaWRlci5jc3MoJ3dpZHRoJyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29wZS5yZWxhdGl2ZVsxXSAmJiBzY29wZS5yZWxhdGl2ZVswXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSAoc2NvcGUucmVsYXRpdmVbMV0gLSBzY29wZS5yZWxhdGl2ZVswXSkgKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAoc2NvcGUucmVsYXRpdmVbMF0gKiAgc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNsaWRlci5jc3MgKHsnbGVmdCc6IHN0YXJ0KydweCcsJ3dpZHRoJzogd2lkdGggKyAncHgnfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIGhhbmRsZSBvbiB0aGUgYmFyIGRlcGVuZGluZyBhIGdpdmVuIHZhbHVlXG4gICAgICAgIHNjb3BlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlICwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuXG4gICAgICAgICAgICAvLyBpZiB2YWx1ZSBkaWQgbm90IGNoYW5nZSBpZ25vcmVcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpICAgdmFsdWU9MDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IHNjb3BlLm5vdE1vcmUpIHZhbHVlPXNjb3BlLm5vdE1vcmU7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzY29wZS5ub3RMZXNzKSB2YWx1ZT1zY29wZS5ub3RMZXNzO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDApIG9mZnNldCA9IChzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpICsgc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQvMjtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09PSAxKSBvZmZzZXQgPSBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9ICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdICogIChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnRyYW5zbGF0ZSAob2Zmc2V0LGhhbmRsZSk7XG4gICAgICAgICAgICBzY29wZS52YWx1ZVtoYW5kbGVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGNhbGwgdGhyb3VnaCBzZXRWYWx1ZSB3ZSBkbyBub3QgcGFzcyBjYkhhbmRsZVxuICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHNjb3BlLmZvcm1hdHRlciAodmFsdWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobW9kZWwpIG1vZGVsLiRzZXRWaWV3VmFsdWUoIHNjb3BlLnZpZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5kaXNwbGF5c1toYW5kbGVdKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXNbaGFuZGxlXS5odG1sIChzY29wZS52aWV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgLy8gTWluaW1hbCBrZXlzdHJva2UgaGFuZGxpbmcgdG8gY2xvc2UgcGlja2VyIHdpdGggRVNDIFtzY29wZS5hY3RpZiBpcyBjdXJyZW50IGhhbmRsZSBpbmRleF1cbiAgICAgICAgc2NvcGUua2V5ZG93bj0gIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgICAgICBzd2l0Y2goZS5rZXlDb2RlKXtcbiAgICAgICAgICAgICAgICBjYXNlIDM5OiAvLyBSaWdodFxuICAgICAgICAgICAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdK3Njb3BlLmJ5U3RlcCksIHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdKygxIC8gTWF0aC5wb3coMTAsIHNjb3BlLmJ5U3RlcCotMSkpKSxzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrKSAgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM3OiAvLyBsZWZ0XG4gICAgICAgICAgICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwID4gMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdIC0gc2NvcGUuYnlTdGVwKSwgc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmJ5U3RlcCA8IDApIHNjb3BlLiRhcHBseShzY29wZS5zZXRWYWx1ZSAoKHNjb3BlLnZhbHVlW3Njb3BlLmFjdGlmXSAtICgxIC8gTWF0aC5wb3coMTAsIHNjb3BlLmJ5U3RlcCotMSkpKSxzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spICBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzogLy8gZXNjXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbc2NvcGUuYWN0aWZdWzBdLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5tb3ZlSGFuZGxlID0gZnVuY3Rpb24gKGhhbmRsZSwgY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gY2xpZW50WTtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNsaWVudFggLSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoKGNsaWVudFggKyBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSA+IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS5nZXRWYWx1ZSAgKG9mZnNldCwgaGFuZGxlKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkdWFsIGhhbmRsZSB0byBjcm9zc1xuICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwgJiYgc2NvcGUudmFsdWUgWzBdID4gc2NvcGUudmFsdWVbMV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlID09PSAwKSBzY29wZS5zZXRWYWx1ZSAoc2NvcGUudmFsdWVbMF0gLCAxKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNjb3BlLnNldFZhbHVlKHNjb3BlLnZhbHVlWzFdLDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgc2NvcGUuZm9jdXNDQiA9IGZ1bmN0aW9uIChpbnNpZGUpIHtcbiAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQub24oJ2tleWRvd24nLHNjb3BlLmtleWRvd24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdrZXlkb3duJyxzY29wZS5rZXlkb3duKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBiYXIgd2FzIHRvdWNoIGxldCBtb3ZlIGhhbmRsZSB0byB0aGlzIHBvaW50XG4gICAgICAgIHNjb3BlLnRvdWNoQmFyQ0IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGU9MDtcbiAgICAgICAgICAgIHZhciByZWxhdGl2ZTtcbiAgICAgICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXM7XG4gICAgICAgICAgICB2YXIgb2xkdmFsdWUgPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHR3byBoYW5kbGVzIHNlbGVjdCBjbG9zZXN0IG9uZSBmcm9tIHRvdWNoIHBvaW50XG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkgcmVsYXRpdmUgPSAodG91Y2hlc1swXS5wYWdlWSAtIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAvIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGVsc2UgcmVsYXRpdmU9ICh0b3VjaGVzWzBdLnBhZ2VYIC0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSAvIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UwID0gTWF0aC5hYnMocmVsYXRpdmUgLSBzY29wZS5yZWxhdGl2ZVswXSk7XG4gICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlMSA9IE1hdGguYWJzKHJlbGF0aXZlIC0gc2NvcGUucmVsYXRpdmVbMV0pO1xuICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZTEgPCBkaXN0YW5jZTApIGhhbmRsZT0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtb3ZlIGhhbmRsZSB0byBuZXcgcGxhY2VcbiAgICAgICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgKGhhbmRsZSx0b3VjaGVzWzBdLnBhZ2VYLCB0b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGhhbmRsZSB3YXMgdG91Y2ggYW5kIGRyYWdcbiAgICAgICAgc2NvcGUudG91Y2hIYW5kbGVDQiA9IGZ1bmN0aW9uICh0b3VjaGV2dCwgaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgb2xkdmFsdWUgPSBzY29wZS52YWx1ZVtoYW5kbGVdO1xuXG4gICAgICAgICAgICB0b3VjaGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCd0b3VjaG1vdmUnLHRvdWNobW92ZSk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ3RvdWNoZW5kJyAsdG91Y2hlbmQpO1xuICAgICAgICAgICAgZWxlbWVudC51bmJpbmQoJ3RvdWNoc3RhcnQnLCBzY29wZS50b3VjaEJhckNCKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdG91Y2htb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IHRvdWNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5tb3ZlSGFuZGxlIChoYW5kbGUsdG91Y2hlc1tpZHhdLnBhZ2VYLCB0b3VjaGVzW2lkeF0ucGFnZVkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gdG91Y2hlbmQoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ3RvdWNobW92ZScsdG91Y2htb3ZlKTtcbiAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ3RvdWNoZW5kJyAsdG91Y2hlbmQpO1xuICAgICAgICAgICAgICAgZWxlbWVudC5vbigndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgY2hhbmdlIG5vdGlmeSBhcHBsaWNhdGlvbiBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmhhbmRsZUNCID0gZnVuY3Rpb24gKGNsaWNrZXZlbnQsIGhhbmRsZSkge1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuYXV0b21hdGljKSByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG4gICAgICAgICAgICAvLyByZWdpc3RlciBtb3VzZSBldmVudCB0byB0cmFjayBoYW5kbGVcbiAgICAgICAgICAgIGNsaWNrZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgJGRvY3VtZW50Lm9uKCdtb3VzZW1vdmUnLG1vdXNlbW92ZSk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ21vdXNldXAnLCBtb3VzZXVwKTtcbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXVswXS5mb2N1cygpO1xuICAgICAgICAgICAgc2NvcGUuYWN0aWY9aGFuZGxlO1xuXG4gICAgICAgICAgICAvLyBzbGlkZXIgaGFuZGxlIGlzIG1vdmluZ1xuICAgICAgICAgICAgZnVuY3Rpb24gbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubW92ZUhhbmRsZSAoaGFuZGxlLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbW91c2UgaXMgdXAgZGFucyBsZWF2ZSBzbGlkZXIgc2VuZCByZXNpemUgZXZlbnRzXG4gICAgICAgICAgICBmdW5jdGlvbiBtb3VzZXVwKCkge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ21vdXNlbW92ZScsIG1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgnbW91c2V1cCcsIG1vdXNldXApO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgY2hhbmdlIG5vdGlmeSBhcHBsaWNhdGlvbiBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjayAmJiBvbGR2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLnZhbHVlW2hhbmRsZV0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHNpbXVsYXRlIGpxdWVyeSBmaW5kIGJ5IGNsYXNzZXMgY2FwYWJpbGl0aWVzIFt3YXJuaW5nIG9ubHkgcmV0dXJuIDFzdCBlbGVtZW50c11cbiAgICAgICAgc2NvcGUuZmluZCA9IGZ1bmN0aW9uIChzZWxlY3QsIGVsZW0pIHtcbiAgICAgICAgICAgIHZhciBkb21lbGVtO1xuXG4gICAgICAgICAgICBpZiAoZWxlbSkgZG9tZWxlbSA9IGVsZW1bMF0ucXVlcnlTZWxlY3RvcihzZWxlY3QpO1xuICAgICAgICAgICAgZWxzZSBkb21lbGVtID0gZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgICAgICAgICAgIHZhciBhbmdlbGVtID0gYW5ndWxhci5lbGVtZW50KGRvbWVsZW0pO1xuICAgICAgICAgICAgcmV0dXJuIChhbmdlbGVtKTtcbiAgICAgICAgfTtcblxuXG5cbiAgICAgICAgc2NvcGUuaW5pdGlhbFNldHRpbmdzID0gZnVuY3Rpb24gKGluaXRpYWwpIHtcbiAgICAgICAgICAgIHZhciBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHQ7XG4gICAgICAgICAgICBzY29wZS52YWx1ZT1bXTsgIC8vIHN0b3JlIGxvdy9oZWlnaHQgdmFsdWUgd2hlbiB0d28gaGFuZGxlc1xuICAgICAgICAgICAgc2NvcGUucmVsYXRpdmU9W107XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5wcmVjaXNpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHQgPSAoJycgKyBzY29wZS5ieVN0ZXApLm1hdGNoKC9cXC4oW1xcZF0qKS8pO1xuICAgICAgICAgICAgICAgIHNjb3BlLnByZWNpc2lvbiA9IGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCAmJiBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHRbMV0gPyBkZWNpbWFsX3BsYWNlc19tYXRjaF9yZXN1bHRbMV0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcG9zaXRpb24gaGFuZGxlIHRvIGluaXRpYWwgdmFsdWUocylcbiAgICAgICAgICAgIGVsZW1lbnQub24oJ3RvdWNoc3RhcnQnLCBzY29wZS50b3VjaEJhckNCKTtcbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0ub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldnQpe3Njb3BlLnRvdWNoSGFuZGxlQ0IoZXZ0LDApO30pO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHNsaWRlciBoYXMgdHdvIGhhbmRsZXMgbG93L2hpZ2h0XG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMV0uYWRkQ2xhc3MoJ3JhbmdlLXNsaWRlci1oYW5kbGUnKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzFdLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oZXZ0KXtzY29wZS50b3VjaEhhbmRsZUNCKGV2dCwxKTt9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmluaXR2YWx1ZXMpIHNjb3BlLnNldFZhbHVlIChpbml0aWFsWzFdLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGluaXRzdGF0ZSBvYmplY3QgYXBwbHkgaXRcbiAgICAgICAgICAgIGlmIChzY29wZS5pbml0dmFsdWVzKSBzY29wZS5pbml0V2lkZ2V0IChzY29wZS5pbml0dmFsdWVzKTtcbiAgICAgICAgICAgIGVsc2UgICBzY29wZS5zZXRWYWx1ZSAoaW5pdGlhbFswXSwwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUuc2xpZGVyaWQgICA9IGF0dHJzLmlkIHx8IFwic2xpZGVyLVwiICsgcGFyc2VJbnQgKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0VmFsdWUgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICBzY29wZS5zdG9wVmFsdWUgID0gSW5maW5pdHk7XG4gICAgICAgICAgICBzY29wZS5ieVN0ZXAgICA9IHBhcnNlSW50KGF0dHJzLmJ5U3RlcCkgfHwgMTtcbiAgICAgICAgICAgIHNjb3BlLnZlcnRpY2FsID0gYXR0cnMudmVydGljYWwgICB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmR1YWwgICAgID0gYXR0cnMuZHVhbEhhbmRsZXN8fCBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLnRyaWdnZXJfaW5wdXRfY2hhbmdlPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLm5vdE1vcmUgID0gcGFyc2VJbnQoYXR0cnMubm90TW9yZSkgICB8fCAxMDA7XG4gICAgICAgICAgICBzY29wZS5ub3RMZXNzICA9IHBhcnNlSW50KGF0dHJzLm5vdExlc3MpICAgfHwgMDtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSBlbGVtZW50LmFkZENsYXNzKFwidmVydGljYWwtcmFuZ2VcIik7XG5cbiAgICAgICAgICAgIHNjb3BlLmhhbmRsZXM9IFtzY29wZS5maW5kKCcuaGFuZGxlLW1pbicpLCBzY29wZS5maW5kKCcuaGFuZGxlLW1heCcpXTtcbiAgICAgICAgICAgIHNjb3BlLmJhciAgICA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBzY29wZS5zbGlkZXIgPSBzY29wZS5maW5kKCcucmFuZ2Utc2xpZGVyLWFjdGl2ZS1zZWdtZW50Jyk7XG4gICAgICAgICAgICBzY29wZS5zdGFydCAgPSBzY29wZS5maW5kKCcuaWJ6LXJhbmdlLXNsaWRlci1zdGFydCcpO1xuICAgICAgICAgICAgc2NvcGUuc3RvcCAgID0gc2NvcGUuZmluZCgnLmliei1yYW5nZS1zbGlkZXItc3RvcCcpO1xuICAgICAgICAgICAgc2NvcGUuZGlzYWJsZT0gYXR0cnMuZGlzYWJsZSB8fCBmYWxzZTtcblxuICAgICAgICAgICAgc2NvcGUuY3RybGhhbmRsZSA9IG5ldyBSYW5nZVNsaWRlckhhbmRsZSAoc2NvcGUpO1xuXG4gICAgICAgICAgICAvLyBwcmVwYXJlIERPTSBvYmplY3QgcG9pbnRlciB0byBjb21wdXRlIHNpemUgZHluYW1pY2FsbHlcbiAgICAgICAgICAgIHNjb3BlLmJvdW5kcyA9IHtcbiAgICAgICAgICAgICAgICBiYXIgICAgOiBlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGhhbmRsZXM6IFtzY29wZS5oYW5kbGVzWzBdWzBdLCBzY29wZS5oYW5kbGVzWzFdWzBdXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGF0dHJzLmRpc2FibGUgPT09ICd0cnVlJykgc2NvcGUuc2V0RGlzYWJsZSh0cnVlKTtcblxuICAgICAgICAgICAgaWYgKGF0dHJzLmRpc3BsYXlUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJzLmRpc3BsYXlUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlIDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaGFuZGxlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5cyA9IHNjb3BlLmhhbmRsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmFkZENsYXNzKCdpYnotcmFuZ2Utc2xpZGVyLWRpc3BsYXknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSBzY29wZS5oYW5kbGVzWzFdLmFkZENsYXNzKCdpYnotcmFuZ2Utc2xpZGVyLWRpc3BsYXknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGlzcGxheXMgPSAgWyRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAoYXR0cnMuZGlzcGxheVRhcmdldCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBzY29wZS5kaXNwbGF5cz1bXTtcblxuICAgICAgICAgICAgLy8gZXh0cmFjdCBpbml0aWFsIHZhbHVlcyBmcm9tIGF0dHJzIGFuZCBwYXJzZSBpbnRvIGludFxuICAgICAgICAgICAgaWYgKCFhdHRycy5pbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuaW5pdGlhbCAgPSBbc2NvcGUubmdNb2RlbCwgc2NvcGUubmdNb2RlbF07IC8vIGluaXRpYWxpemUgdG8gbW9kZWwgdmFsdWVzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsICA9IGF0dHJzLmluaXRpYWwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBzY29wZS5pbml0aWFsID0gW1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsWzBdICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCAoaW5pdGlhbFswXSkgOiBzY29wZS5ub3RMZXNzLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsWzFdICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCAoaW5pdGlhbFsxXSkgOiBzY29wZS5ub3RNb3JlXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW9uaXRvciBhbnkgY2hhbmdlcyBvbiBzdGFydC9zdG9wIGRhdGVzLlxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdzdGFydEF0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlIDwgc2NvcGUuc3RhcnRBdCApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zY29wZS5zZXRWYWx1ZSAoc2NvcGUuc3RhcnRBdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5zdGFydEF0KSBzY29wZS5zZXRTdGFydCAoc2NvcGUuc3RhcnRBdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdzdG9wQXQnICwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlID4gc2NvcGUuc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2NvcGUuc2V0VmFsdWUgKHNjb3BlLnN0b3BBdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY29wZS5zdG9wQXQpIHNjb3BlLnNldFN0b3AgKHNjb3BlLnN0b3BBdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gZmluaXNoIHdpZGdldCBpbml0aWFsaXNhdGlvblxuICAgICAgICAgICAgc2NvcGUuaW5pdGlhbFNldHRpbmdzIChzY29wZS5pbml0aWFsKTtcblxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmluaXQoKTtcbiAgICAgICAgXG4gICAgICAgICAvLyBzbGlkZXIgaXMgcmVhZHkgcHJvdmlkZSBjb250cm9sIGhhbmRsZSB0byBhcHBsaWNhdGlvbiBjb250cm9sbGVyXG4gICAgICAgIHNjb3BlLiR3YXRjaCAoJ2luaXRob29rJywgZnVuY3Rpb24gKCkgeyAgICAgICAgIC8vIGluaXQgVmFsdWVzIG1heSBhcnJpdmUgbGF0ZVxuICAgICAgICAgICAgaWYgKHNjb3BlLmluaXRob29rKSBzY29wZS5pbml0aG9vayAoc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjb3BlLiR3YXRjaCAoJ2luaXR2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7IFx0Ly8gaW5pdCBWYWx1ZXMgbWF5IGFycml2ZSBsYXRlXG4gICAgICAgICAgICBpZiAoc2NvcGUuaW5pdHZhbHVlcykgc2NvcGUuaW5pdFdpZGdldChzY29wZS5pbml0dmFsdWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdHdvLXdheSBiaW5kaW5nIGlmIG1vZGVsIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgc2NvcGUuJHdhdGNoICgnbmdNb2RlbCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgIHNjb3BlLnNldFZhbHVlKG5ld1ZhbHVlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5yZXR1cm4ge1xuICAgIHJlc3RyaWN0OiBcIkVcIiwgICAgLy8gcmVzdHJpY3QgdG8gPHJhbmdlLXNsaWRlcj4gSFRNTCBlbGVtZW50IG5hbWVcbiAgICBzY29wZToge1xuICAgICAgICBzdGFydEF0ICA6Jz0nLCAgLy8gRmlyc3QgYWNjZXB0YWJsZSBkYXRlXG4gICAgICAgIHN0b3BBdCAgIDonPScsICAvLyBMYXN0IGFjY2VwdGFibGUgZGF0ZVxuICAgICAgICBjYWxsYmFjayA6Jz0nLCAgLy8gQ2FsbGJhY2sgdG8gYWN0aWYgd2hlbiBhIGRhdGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgZm9ybWF0dGVyOic9JywgIC8vIENhbGxiYWNrIGZvciBkcmFnIGV2ZW50IGNhbGwgZWFjaCB0aW1lIGludGVybmFsIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgaW5pdGhvb2sgOic9JywgIC8vIEhvb2sgcG9pbnQgdG8gY29udHJvbCBzbGlkZXIgZnJvbSBBUElcbiAgICAgICAgY2JoYW5kbGUgOic9JywgIC8vIEFyZ3VtZW50IGFkZGVkIHRvIGV2ZXJ5IGNhbGxiYWNrXG4gICAgICAgIGluaXR2YWx1ZXM6Jz0nLCAgIC8vIEluaXRpYWwgdmFsdWVzIGFzIGEgc2luZ2xlIG9iamVjdFxuICAgICAgICBuZ01vZGVsOiAnPScgICAgLy8gdGhlIG1vZGVsIHZhbHVlXG4gICAgfSxcbiAgICByZXF1aXJlOiAnP25nTW9kZWwnLFxuICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgLy8gaHRtbCB0ZW1wbGF0ZSBpcyBidWlsZCBmcm9tIEpTXG4gICAgcmVwbGFjZTogdHJ1ZSwgICAgICAvLyByZXBsYWNlIGN1cnJlbnQgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGUgd2hpbGUgaW5oZXJpdGluZyBvZiBjbGFzc1xuICAgIGxpbms6IGxpbmsgICAgICAgICAgLy8gcGlja2FkYXRlIG9iamVjdCdzIG1ldGhvZHNcbn07XG59XSk7XG5cbmNvbnNvbGUubG9nIChcIlJhbmdlU2xpZGVyIExvYWRlZFwiKTtcblxufSkoKTsiLCIvKlxuIGFsc2EtZ2F0ZXdheSAtLSBwcm92aWRlIGEgUkVTVC9IVFRQIGludGVyZmFjZSB0byBBTFNBLU1peGVyXG5cbiBDb3B5cmlnaHQgKEMpIDIwMTUsIEZ1bHVwIEFyIEZvbGxcblxuIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvclxuIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cbiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiBhbG9uZyB3aXRoIHNjb3BlIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS5cblxuIFJlZmVyZW5jZXM6XG5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0ZW1wbGF0ZSA9XG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJhZmItbW9uaXRvclwiIG5nLWNsaWNrPVwiZ2V0cGluZygpXCI+JyArXG4gICAgICAgICAnPHNwYW4gY2xhc3M9XCJhZmItcmVmcmVzaC10b2tlblwiICA+YWZiOi8ve3tob3N0bmFtZX19Ont7aHR0cGRwb3J0fX08L3NwYW4+JyArXG4gICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4nICtcbiAgICAgICAgICc8L2Rpdj4nO1xuXG5cbi8vIHNjb3BlIG1vZHVsZSBpcyBsb2FkIHN0YXRpY2FsbHkgYmVmb3JlIGFueSByb3V0ZSBpcyBjYXRpdmF0ZWRcbmFuZ3VsYXIubW9kdWxlKCdUb2tlblJlZnJlc2gnLCBbJ0FwcENvbmZpZycsICdNb2RhbE5vdGlmaWNhdGlvbiddKVxuXG4gICAgLmRpcmVjdGl2ZSAoJ3Rva2VuUmVmcmVzaCcsIFtcIiR3aW5kb3dcIiwgXCIkdGltZW91dFwiLCBcIiRsb2NhdGlvblwiLCBcIk5vdGlmaWNhdGlvblwiLCBcIkFwcENvbmZpZ1wiLCBcIkFwcENhbGxcIiwgZnVuY3Rpb24oJHdpbmRvdywgJHRpbWVvdXQsICRsb2NhdGlvbiwgTm90aWZpY2F0aW9uLCBBcHBDb25maWcsIEFwcENhbGwpIHtcblxuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgc2NvcGUubG9nZ2VkPXVuZGVmaW5lZDsgLy8gbmVpdGhlciB0aHUgbmVpdGhlciBmYWxzZVxuICAgICAgICBcbiAgICAgICAgJHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcInRva2VuXCIsIFwicmVzZXRcIiwgey8qcXVlcnkqL30sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiT1BBIEV4aXQgUmVxdWVzdGVkXCIpOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgc2NvcGUub25saW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAgICAoXCJvbmxpbmVcIik7XG4gICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcIm9mZmxpbmVcIik7XG4gICAgICAgICAgICBzY29wZS5sb2dnZWQ9dHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5vZmZsaW5lID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgICAgKFwib2ZmbGluZVwiKTtcbiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwib25saW5lXCIpO1xuICAgICAgICAgICAgc2NvcGUubG9nZ2VkPWZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHNjb3BlLmxvZ2dlZCAhPT0gZmFsc2UpICB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLndhcm5pbmcgKHttZXNzYWdlOiBcIkFwcEZyYW1ld29yayBCaW5kZXIgTG9zdFwiLCBkZWxheTogNTAwMH0pO1xuICAgICAgICAgICAgICAgIHNjb3BlLm9mZmxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnN0YXR1cyA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihqcmVzcCkge1xuICAgICAgICAgICAgaWYgKGpyZXNwLnJlcXVlc3QudG9rZW4pIEFwcENvbmZpZy5zZXNzaW9uLnRva2VuID0ganJlc3AucmVxdWVzdC50b2tlbjtcbiAgICAgICAgICAgIGlmIChqcmVzcC5yZXF1ZXN0LnV1aWQpICBBcHBDb25maWcuc2Vzc2lvbi51dWlkICA9IGpyZXNwLnJlcXVlc3QudXVpZDtcbiAgICAgICAgICAgIGlmIChqcmVzcC5yZXF1ZXN0LnRpbWVvdXQpICBBcHBDb25maWcuc2Vzc2lvbi50aW1lb3V0ICA9IGpyZXNwLnJlcXVlc3QudGltZW91dDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNjb3BlLmxvZ2dlZCAhPT0gdHJ1ZSkgIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uc3VjY2VzcyAoe21lc3NhZ2U6IFwiQXBwRnJhbWV3b3JrIEJpbmRlciBCYWNrIHRvIExpdmVcIiwgZGVsYXk6IDMwMDB9KTtcbiAgICAgICAgICAgICAgICBzY29wZS5vbmxpbmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spIHNjb3BlLmNhbGxiYWNrKGpyZXNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnN0YXR1cyA9IDE7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ2hlY2sgQmluZGVyIHN0YXR1c1xuICAgICAgICBzY29wZS5nZXRwaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcInRva2VuXCIsIFwicGluZ1wiLCB7LypxdWVyeSovfSxmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMjAwKSBzY29wZS5vbnN1Y2Nlc3MgKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICBlbHNlICBzY29wZS5vbmVycm9yKCk7XG4gICAgICAgICAgICAgICAgLy8gcmVzdGFydCBhIG5ldyB0aW1lciBmb3IgbmV4dCBwaW5nXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIEFwcENvbmZpZy5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBCaW5kZXIgc3RhdHVzXG4gICAgICAgIHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwidG9rZW5cIiwgXCJyZWZyZXNoXCIsIHsvKnF1ZXJ5Ki99LGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHNjb3BlLm9uc3VjY2VzcyAocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGVsc2UgIHNjb3BlLm9uZXJyb3IoKTtcbiAgICAgICAgICAgICAgICAvLyByZXN0YXJ0IGEgbmV3IHRpbWVyIGZvciBuZXh0IHJlZnJlc2hcbiAgICAgICAgICAgICAgICAkdGltZW91dCAoc2NvcGUucmVmcmVzaCwgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAqMjUwKTtcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgIFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gSW5pdGlhbCBjb25uZWN0aW9uXG4gICAgICAgIHNjb3BlLnRrY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcInRva2VuXCIsIFwiY3JlYXRlXCIsIHt0b2tlbjogQXBwQ29uZmlnLnNlc3Npb24uaW5pdGlhbH0sZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDIwMCkgc2NvcGUub25zdWNjZXNzIChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgZWxzZSAgc2NvcGUub25lcnJvcigpO1xuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIH07XG4gXG4gICAgICAgIHNjb3BlLmljb24gICAgICA9IGF0dHJzLmljb24gICB8fCBcImZpLWxpZ2h0YnVsYlwiO1xuICAgICAgICBzY29wZS5ob3N0bmFtZSAgPSAkbG9jYXRpb24uaG9zdCgpO1xuICAgICAgICBzY29wZS5odHRwZHBvcnQgPSAkbG9jYXRpb24ucG9ydCgpO1xuICAgICAgICBzY29wZS5hdXRvbG9nICAgPSBKU09OLnBhcnNlKGF0dHJzLmF1dG9sb2cgfHwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNjb3BlLmF1dG9sb2cpIHNjb3BlLnRrY3JlYXRlKCk7XG5cbiAgICAgICAgLy8gSW5pdCBwaW5nIGFuZCByZWZyZXNoIHByb2Nlc3NcbiAgICAgICAgJHRpbWVvdXQgKHNjb3BlLmdldHBpbmcsIEFwcENvbmZpZy5zZXNzaW9uLnBpbmdyYXRlKjEwMDApO1xuICAgICAgICAkdGltZW91dCAoc2NvcGUucmVmcmVzaCwgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAqMjUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6IFwiPVwiXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIGxpbms6IG15bWV0aG9kc1xuICAgIH07XG59XSk7XG5cbn0pKCk7XG5jb25zb2xlLmxvZyAoXCJUb2tlbiBSZWZyZXNoIExvYWRlZFwiKTtcblxuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKiBcbiAqIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL21vdXNlb3ZlclxuICogXG4gKiB1c2FnZTogXG4gKiBcbiAqIHRpcE1vZGFsOiBsaXN0ZW4gZXZlbnQgZnJvbSBlbGVtLnBhcmVudCgpIHRvIGRpc3BsYXkgdGlwLW1vZGFsXG4gKiAgICAgIDxkaXYgY2xhc3M9XCJ4eHh4XCI+XG4gKiAgICAgICAgICA8dGlwLW1vZGFsIHRpcD14eHh4PjwvdGlwLW1vZGFsPlxuICogICAgICAgICAgPGlucHV0LXRleHQgLi4uLj48L2lucHV0LXRleHQ+XG4gKiAgICAgIDwvZGl2PlxuICogICAgICBcbiAqIE5vdGU6IHVzZSBDU1MudmlzaWJpbGl0eSB0byBhdm9pZCBkaXNwbGF5IGZsaWNrZXJpbmcgYXQgaW5pdGlhbCBkaXNwbGF5LlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRtcGwgPSAnPGRpdiBjbGFzcz1cInRpcC1tb2RhbC1wb3B1cFwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3t0aXB9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+PC9kaXY+JyA7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnTW9kYWxOb3RpZmljYXRpb24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ3RpcE1vZGFsJywgW1wiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCR0aW1lb3V0KSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudCA9IGVsZW0ucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsICAgID0gZWxlbS5maW5kKFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgdGlwIGRpc3BsYXkgdG8gYXZvaWQgYmxpbmtpbmcgd2hlbiBtb3ZpbmcgbW91c2UgZmFzdFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkaXNwbGF5ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFjdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnNob3cpIHNjb3BlLm1vZGFsLmNzcyh7b3BhY2l0eTogMSwgdmlzaWJpbGl0eTondmlzaWJsZSd9KTsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2hvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS50aW1lb3V0ID0gJHRpbWVvdXQoYWN0aW9uLCBzY29wZS5kZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzY29wZS5zaG93ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuY3NzKHtvcGFjaXR5OiAwLCB2aXNpYmlsaXR5OidoaWRkZW4nfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWp1c3QgaWNvbiBvciB1c2UgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pY29uICA9IGF0dHJzLmljb24gfHwgJ2ZpLWxpZ2h0YnVsYic7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgUGFyZW50IGVsZW1lbnQgdG8gZ2V0IG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5hZGRDbGFzcyAoJ2FzLW1vZGFsLXRpcCcpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnY2xpY2snLCBjbG9zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdmb2N1cycsIGRpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnbW91c2VvdmVyJywgZGlzcGxheSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdtb3VzZWxlYXZlJywgY2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnQuYmluZCgnYmx1cicsIGNsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRlbGF5ID0gYXR0cnMuZGVsYXkgfHwgMTAwMDsgLy8gd2FpdCAxcyBiZWZvcmUgZGlzcGxheWluZyB0aXBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgICAgICAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBzY29wZToge3RpcDogXCI9XCJ9IC8vIHRpcCBtYXkgbm90IGJlIGRlZmluZWQgd2hlbiB3aWRnZXQgaXMgZGlzcGxheVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8c3BhbiB0aXRsZT1cIkdvdG86IHt7aHJlZn19XCIgbmctY2xpY2s9XCJjbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L3NwYW4+JztcblxuXG4gICAgYW5ndWxhci5tb2R1bGUoJ0xpbmtCdXR0b24nLCBbXSlcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoJ2xpbmtCdXR0b24nLCBbXCIkbG9jYXRpb25cIiwgZnVuY3Rpb24gKCRsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5jbGlja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLnF1ZXJ5KSAkbG9jYXRpb24ucGF0aChhdHRycy5ocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJGxvY2F0aW9uLnBhdGgoYXR0cnMuaHJlZikuc2VhcmNoKGF0dHJzLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhanVzdCBpY29uIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gPSBhdHRycy5pY29uICAgfHwgJ2ZpLWxpbmsnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmxhYmVsIHx8ICdKdW1wJztcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaHJlZiAgPSBhdHRycy5ocmVmICB8fCAnL2hvbWUnO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxhYmVsIGFzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKHNjb3BlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqIFxuICogUmVmZXJlbmNlOlxuICogICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9BUEkvRmlsZVJlYWRlciBcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Vc2luZ19maWxlc19mcm9tX3dlYl9hcHBsaWNhdGlvbnMjVXNpbmdfaGlkZGVuX2ZpbGVfaW5wdXRfZWxlbWVudHNfdXNpbmdfdGhlX2NsaWNrJTI4JTI5X21ldGhvZFxuICogICBodHRwczovL3VuY29ya2Vkc3R1ZGlvcy5jb20vYmxvZy9tdWx0aXBhcnRmb3JtZGF0YS1maWxlLXVwbG9hZC13aXRoLWFuZ3VsYXJqc1xuICogICBodHRwczovL3d3dy50ZXJsaWNpLmNvbS8yMDE1LzA1LzE2L3VwbG9hZGluZy1maWxlcy1sb2NhbGx5Lmh0bWxcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL25lcnZnaC9hbmd1bGFyLWZpbGUtdXBsb2FkL2Jsb2IvbWFzdGVyL3NyYy9zZXJ2aWNlcy9GaWxlVXBsb2FkZXIuanNcbiAqICAgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWxcbiAqICAgaHR0cDovL29uZWh1bmdyeW1pbmQuY29tL3ppcC1wYXJzaW5nLWpzemlwLWFuZ3VsYXIvXG4gKiAgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTUzNDE5MTIvaG93LXRvLWdvLWZyb20tYmxvYi10by1hcnJheWJ1ZmZlclxuICogICBcbiAqICAgQnVnczogemlwIGZpbGUgc2VudCBldmVuIHdoZW4gZmxhZyBhcyBpbnZhbGlkIFxuICovXG5cbiBcblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBXQVJOSU5HOiBBbmd1bGFyIG5nLWNoYW5nZSBkb2VzIG5vdCB3b3JrIG9uIGlucHV0L2ZpbGUuIExldCdzIGhvb2sgb3VyIGNhbGxiYWNrIHRocm91Z2ggc3RhbmRhcmQgSlMgZnVuY3Rpb25cbnZhciB0bXBsID0gICc8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPVwie3tuYW1lfX0taW5wdXRcIiBvbmNoYW5nZT1cImFuZ3VsYXIuZWxlbWVudCh0aGlzKS5zY29wZSgpLlVwTG9hZEZpbGUodGhpcy5maWxlcylcIiBhY2NlcHQ9XCJ7e21pbWV0eXBlfX1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPicrXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVwbG9hZC1maWxlXCIgbmctY2xpY2s9XCJpbWdDbGlja2VkKClcIj4nICtcbiAgICAgICAgICAgICc8aW1nIGlkPVwie3tuYW1lfX0taW1nXCIgc3JjPVwie3t0aHVtYm5haWx9fVwiPicgK1xuICAgICAgICAgICAgJzxyYW5nZS1zbGlkZXIgbmctc2hvdz1cIiFub3NsaWRlclwiIGlkPVwie3tuYW1lfX0tc2xpZGVyXCIgYXV0b21hdGljPXRydWUgaW5pdGhvb2s9XCJTbGlkZXJJbml0Q0JcIj48L3JhbmdlLXNsaWRlcj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxuXG4vLyBTZXJ2aWNlIENyZWF0ZSB4Zm9ybSBpbnNlcnQgZmlsZXMgaW4gYW5kIFBvc3QgaXQgdG8gdXJsXG5mdW5jdGlvbiBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCB0aHVtYm5haWxDQikge1xuICAgIHZhciB4bWxSZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgeGZvcm0gID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgXG4gICAgdmFyIE9uTG9hZENCID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgc3RhdHVzID0gdGh1bWJuYWlsQ0IgKHRhcmdldCk7XG4gICAgICAgIC8vaWYgKHN0YXR1cykgeGZvcm0uYXBwZW5kKHNjb3BlLm5hbWUsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgfTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzbGlkZXIgZHVyaW5nIFVwbG9hZFxuICAgIHhtbFJlcS51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUgPyBldmVudC5sb2FkZWQgKiAxMDAgLyBldmVudC50b3RhbCA6IDApO1xuICAgICAgICBpZiAoc2NvcGUuc2xpZGVyKSBzY29wZS5zbGlkZXIuc2V0VmFsdWUgKHByb2dyZXNzKTtcbiAgICB9O1xuXG4gICAgLy8gVXBsb2FkIGlzIGZpbmlzaCBsZXQncyBub3RpZnkgY29udHJvbGVyIGNhbGxiYWNrXG4gICAgeG1sUmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcImVycm9yXCIpO1xuICAgICAgICB2YXIgcmVzcG9uc2UgPXtcbiAgICAgICAgICAgIHN0YXR1cyA6IHhtbFJlcS5zdGF0dXMsXG4gICAgICAgICAgICBoZWFkZXJzOiB4bWxSZXEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgXG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmNhbGxiYWNrIChyZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHhtbFJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlbGVtLmFkZENsYXNzIChcImVycm9yXCIpO1xuICAgICAgICBlbGVtLnJlbW92ZUNsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgICAgIHZhciByZXNwb25zZSA9e1xuICAgICAgICAgICAgc3RhdHVzIDogeG1sUmVxLnN0YXR1cyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHhtbFJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSBcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHJlc3BvbnNlKTtcbiAgICB9O1xuXG4gICAgeG1sUmVxLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVsZW0uYWRkQ2xhc3MgKFwiZXJyb3JcIik7XG4gICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgdmFyIHJlc3BvbnNlID17XG4gICAgICAgICAgICBzdGF0dXMgOiB4bWxSZXEuc3RhdHVzLFxuICAgICAgICAgICAgaGVhZGVyczogeG1sUmVxLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIFxuICAgICAgICB9O1xuICAgICAgICBzY29wZS5jYWxsYmFjayAocmVzcG9uc2UpO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmaWxlID0gZmlsZXNbaV07XG4gICAgICAgIGlmICghZmlsZS50eXBlLm1hdGNoKHNjb3BlLm1pbWV0eXBlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyAoXCJTZWxlY3RlZCBmaWxlPVwiICsgZmlsZS5uYW1lICsgXCIgc2l6ZT1cIisgZmlsZS5zaXplLzEwMjQgKyBcIiBUeXBlPVwiKyBmaWxlLnR5cGUpO1xuXG4gICAgICAgIC8vIEZpbGUgdG8gdXBsb2FkIGlzIHRvbyBiaWdcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IHNjb3BlLm1heHNpemUqMTAyNCkge1xuICAgICAgICAgICAgc2NvcGUudGh1bWJuYWlsID0gc2NvcGUuaXN0b29iaWc7IC8vIHdhcm5pbmcgaWYgaW1hZ2UgcGF0aCBpcyB3cm9uZyBub3RoaW5nIGhhcHBlblxuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCd0aHVtYm5haWwnKTsgLy8gd2Ugc2hvcnQtY2lyY3VpdCBBbmd1bGFyIHJlc3luYyBJbWFnZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gdXBsb2FkYWJsZSBmaWxlXG4gICAgICAgIGlmKGlzTmFOKGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgICAgIHNjb3BlLnRodW1ibmFpbCA9IHNjb3BlLmlzbm90dmFsaWQ7IFxuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCd0aHVtYm5haWwnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjb3BlLkJhc2VuYW1lPSBmaWxlLm5hbWUuc3BsaXQoJy8nKS5yZXZlcnNlKClbMF07XG4gICAgICAgIHNjb3BlLmltZ0VsZW1bMF0uZmlsZSA9IGZpbGU7XG5cbiAgICAgICAgLy8gSWYgRmlsZSBpcyBhbiBpbWFnZSBsZXQgZGlzcGxheSBpdCBub3dcbiAgICAgICAgaWYgKHRodW1ibmFpbENCKSB7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBPbkxvYWRDQjtcbiAgICAgICAgfSBcbiAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBpcyBPSyBsZXQncyBhZGQgZmlsZSB0byB4Zm9ybVxuICAgICAgICB4Zm9ybS5hcHBlbmQoc2NvcGUubmFtZSwgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9XG5cblxuICAgIC8vIGV2ZXJ5dGhpbmcgbG9va3MgT0sgbGV0J3MgUG9zdCBpdFxuICAgIHhtbFJlcS5vcGVuKFwiUE9TVFwiLCBwb3N0dXJsICwgdHJ1ZSk7XG4gICAgeG1sUmVxLnNlbmQoeGZvcm0pO1xufVxuXG5hbmd1bGFyLm1vZHVsZSgnVXBsb2FkRmlsZXMnLFsnQXBwQ29uZmlnJywgJ01vZGFsTm90aWZpY2F0aW9uJywgJ1JhbmdlU2xpZGVyJ10pXG5cbi5kaXJlY3RpdmUoJ3VwbG9hZEltYWdlJywgW1wiQXBwQ29uZmlnXCIsIFwiSlFlbXVcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24oQXBwQ29uZmlnLCAgSlFlbXUsIE5vdGlmaWNhdGlvbikge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB3aWRnZXQgaW1hZ2UgaGFuZGxlIGZyb20gdGVtcGxhdGVcbiAgICAgICAgc2NvcGUuaW1nRWxlbSAgICA9IGVsZW0uZmluZCgnaW1nJyk7XG4gICAgICAgIHNjb3BlLmlucHV0RWxlbSAgPSBlbGVtLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbWFnZSB3YXMgY2tpY2sgbGV0J3Mgc2ltdWxhdGUgYW4gaW5wdXQgKGZpbGUpIGNsaWNrXG4gICAgICAgIHNjb3BlLmltZ0NsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pbnB1dEVsZW1bMF0uY2xpY2soKTsgLy8gV2FybmluZyBBbmd1bGFyIFRyaWdnZXJFdmVudCBkb2VzIG5vdCB3b3JrISEhXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBTbGlkZXIgY29udHJvbCBoYW5kbGUgcmVnaXN0cmF0aW9uIGFmdGVyIGNyZWF0aW9uXG4gICAgICAgIHNjb3BlLlNsaWRlckluaXRDQj1mdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgICAgICAgIHNjb3BlLnNsaWRlcj0gc2xpZGVyOyBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwbG9hZCBpcyBkZWxlZ2F0ZWQgdG8gYSBzaGFyZWQgZnVuY3Rpb25cbiAgICAgICAgc2NvcGUuVXBMb2FkRmlsZT1mdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXJDQiA9IGZ1bmN0aW9uICh1cGxvYWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzY29wZS50aHVtYm5haWwgPSB1cGxvYWQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzY29wZS5pbWdFbGVtWzBdLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt1cGxvYWQudGFyZ2V0LnJlc3VsdF0sIHt0eXBlOiBcImltYWdlXCJ9KSk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyB0cnVlIGFjdGl2YXRlcyBwb3N0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHBvc3R1cmwgPSBhdHRycy5wb3N0dXJsICsgXCI/dG9rZW49XCIgKyBBcHBDb25maWcuc2Vzc2lvbi50b2tlbjtcbiAgICAgICAgICAgIG5ldyBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCByZWFkZXJDQik7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbGxpemUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGVzIHZhbHVlc1xuICAgICAgICBzY29wZS5uYW1lPSBhdHRycy5uYW1lIHx8ICdhdmF0YXInO1xuICAgICAgICBzY29wZS5jYXRlZ29yeT0gYXR0cnMuY2F0ZWdvcnkgIHx8ICdpbWFnZSc7XG4gICAgICAgIHNjb3BlLm1pbWV0eXBlPSAoYXR0cnMuYWNjZXB0IHx8ICdpbWFnZScpICsgJy8qJztcbiAgICAgICAgc2NvcGUubWF4c2l6ZT0gYXR0cnMubWF4c2l6ZSB8fCAxMDA7IC8vIGRlZmF1bHQgbWF4IHNpemUgMTAwS0JcbiAgICAgICAgc2NvcGUucmVnZXhwID0gbmV3IFJlZ0V4cCAoYXR0cnMuYWNjZXB0KyAnLionLCdpJyk7XG5cbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUudGh1bWJuYWlsPSBBcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLnRodW1ibmFpbDtcbiAgICAgICAgZWxzZSAgc2NvcGUudGh1bWJuYWlsPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAndHV4LWJ6aC5wbmcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUuaXNub3R2YWxpZD0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc25vdHZhbGlkO1xuICAgICAgICBlbHNlICBzY29wZS5pc25vdHZhbGlkPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXNub3R2YWxpZC5wbmcnO1xuXG4gICAgICAgIGlmIChhdHRycy5pc3Rvb2JpZykgc2NvcGUuaXN0b29iaWc9IEFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXN0b29iaWc7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzdG9vYmlnPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXN0b29iaWcucG5nJztcbiAgICAgICAgc2NvcGUubm9zbGlkZXIgPSBhdHRycy5ub3NsaWRlciB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIWF0dHJzLnBvc3R1cmwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGUtdXBsb2FkICVzIHBvc3R1cmw9L2FwaS94eHh4L3h4eHggcmVxdWlyZWQnLCBzY29wZS5hdHRycyk7ICAgICAgICAgICAgXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbn1dKVxuICAgIFxuLmRpcmVjdGl2ZSgndXBsb2FkQXVkaW8nLCBbXCJBcHBDb25maWdcIiwgXCJKUWVtdVwiLCBcIk5vdGlmaWNhdGlvblwiLCBmdW5jdGlvbihBcHBDb25maWcsICBKUWVtdSwgTm90aWZpY2F0aW9uKSB7XG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICBcbiAgICAgICAgLy8gZ2V0IHdpZGdldCBpbWFnZSBoYW5kbGUgZnJvbSB0ZW1wbGF0ZVxuICAgICAgICBzY29wZS5pbWdFbGVtICAgID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgICAgICAgc2NvcGUuaW5wdXRFbGVtICA9IGVsZW0uZmluZCgnaW5wdXQnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEltYWdlIHdhcyBja2ljayBsZXQncyBzaW11bGF0ZSBhbiBpbnB1dCAoZmlsZSkgY2xpY2tcbiAgICAgICAgc2NvcGUuaW1nQ2xpY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLmlucHV0RWxlbVswXS5jbGljaygpOyAvLyBXYXJuaW5nIEFuZ3VsYXIgVHJpZ2dlckV2ZW50IGRvZXMgbm90IHdvcmshISFcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNsaWRlciBjb250cm9sIGhhbmRsZSByZWdpc3RyYXRpb24gYWZ0ZXIgY3JlYXRpb25cbiAgICAgICAgc2NvcGUuU2xpZGVySW5pdENCPWZ1bmN0aW9uIChzbGlkZXIpIHtcbiAgICAgICAgICAgc2NvcGUuc2xpZGVyPSBzbGlkZXI7IFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVXBsb2FkIGlzIGRlbGVnYXRlZCB0byBhIHNoYXJlZCBmdW5jdGlvblxuICAgICAgICBzY29wZS5VcExvYWRGaWxlPWZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgdmFyIHBvc3R1cmwgPSBhdHRycy5wb3N0dXJsICsgXCI/dG9rZW49XCIgKyBBcHBDb25maWcuc2Vzc2lvbi50b2tlbjtcbiAgICAgICAgICAgIG5ldyBMb2FkRmlsZVN2YyAoc2NvcGUsIGVsZW0sIHBvc3R1cmwsIGZpbGVzLCBmYWxzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbGxpemUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBhdHRyaWJ1dGVzIHZhbHVlc1xuICAgICAgICBzY29wZS5uYW1lPSBhdHRycy5uYW1lIHx8ICdhdWRpbyc7XG4gICAgICAgIHNjb3BlLmNhdGVnb3J5PSBhdHRycy5jYXRlZ29yeSAgfHwgJ2F1ZGlvJztcbiAgICAgICAgc2NvcGUubWltZXR5cGU9IChhdHRycy5hY2NlcHQgfHwgJ2F1ZGlvJykgKyAnLyonO1xuICAgICAgICBzY29wZS5tYXhzaXplPSBhdHRycy5tYXhzaXplIHx8IDEwMDAwOyAvLyBkZWZhdWx0IG1heCBzaXplIDEwTUJcbiAgICAgICAgc2NvcGUucmVnZXhwID0gbmV3IFJlZ0V4cCAoYXR0cnMuYWNjZXB0KyAnLionLCdpJyk7XG5cbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUudGh1bWJuYWlsPSBBcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLnRodW1ibmFpbDtcbiAgICAgICAgZWxzZSAgc2NvcGUudGh1bWJuYWlsPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAndXBsb2FkLW11c2ljLnBuZyc7XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0cnMudGh1bWJuYWlsKSBzY29wZS5pc25vdHZhbGlkPSBBcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgIGF0dHJzLmlzbm90dmFsaWQ7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzbm90dmFsaWQ9QXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc25vdHZhbGlkLnBuZyc7XG5cbiAgICAgICAgaWYgKGF0dHJzLmlzdG9vYmlnKSBzY29wZS5pc3Rvb2JpZz0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc3Rvb2JpZztcbiAgICAgICAgZWxzZSAgc2NvcGUuaXN0b29iaWc9QXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc3Rvb2JpZy5wbmcnO1xuICAgICAgICBzY29wZS5ub3NsaWRlciA9IGF0dHJzLm5vc2xpZGVyIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICghYXR0cnMucG9zdHVybCkgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZS11cGxvYWQgJXMgcG9zdHVybD0vYXBpL3h4eHgveHh4eCByZXF1aXJlZCcsIHNjb3BlLmF0dHJzKTsgICAgICAgICAgICBcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufV0pXG5cbi5kaXJlY3RpdmUoJ3VwbG9hZEFwcGxpJywgW1wiQXBwQ29uZmlnXCIsIFwiSlFlbXVcIiwgXCJOb3RpZmljYXRpb25cIiwgZnVuY3Rpb24oQXBwQ29uZmlnLCAgSlFlbXUsIE5vdGlmaWNhdGlvbikge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB3aWRnZXQgaW1hZ2UgaGFuZGxlIGZyb20gdGVtcGxhdGVcbiAgICAgICAgc2NvcGUuaW1nRWxlbSAgICA9IGVsZW0uZmluZCgnaW1nJyk7XG4gICAgICAgIHNjb3BlLmlucHV0RWxlbSAgPSBlbGVtLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbWFnZSB3YXMgY2tpY2sgbGV0J3Mgc2ltdWxhdGUgYW4gaW5wdXQgKGZpbGUpIGNsaWNrXG4gICAgICAgIHNjb3BlLmltZ0NsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pbnB1dEVsZW1bMF0uY2xpY2soKTsgLy8gV2FybmluZyBBbmd1bGFyIFRyaWdnZXJFdmVudCBkb2VzIG5vdCB3b3JrISEhXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBTbGlkZXIgY29udHJvbCBoYW5kbGUgcmVnaXN0cmF0aW9uIGFmdGVyIGNyZWF0aW9uXG4gICAgICAgIHNjb3BlLlNsaWRlckluaXRDQj1mdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgICAgICAgIHNjb3BlLnNsaWRlcj0gc2xpZGVyOyBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwbG9hZCBpcyBkZWxlZ2F0ZWQgdG8gYSBzaGFyZWQgZnVuY3Rpb25cbiAgICAgICAgc2NvcGUuVXBMb2FkRmlsZT1mdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVhZGVyQ0IgPSBmdW5jdGlvbiAodXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHppcGFwcCA9IG5ldyBKU1ppcCh1cGxvYWQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdmFyIHRodW1ibmFpbCA9IHppcGFwcC5maWxlKFwiYWZhLXBrZy90aHVtYm5haWwuanBnXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlzIHdlIGhhdmUgYSB0aHVtYm5haWwgd2l0aGluIGxvYWRlZCBaaXBmaWxlXG4gICAgICAgICAgICAgICAgaWYgKCF0aHVtYm5haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiVGhpcyBpcyBub3QgYSB2YWxpZCBBcHBsaWNhdGlvbiBGcmFtZXdvcmsgQVBQXCIpO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS50aHVtYm5haWw9QXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICdpc25vdHZhbGlkLnBuZyc7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgndGh1bWJuYWlsJyk7IC8vIHdlIHNob3J0LWNpcmN1aXQgQW5ndWxhciByZXN5bmMgSW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkbyBub3QgcG9zdCB6aXAgb24gYmluZGVyXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBzY29wZS5pbWdFbGVtWzBdLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aHVtYm5haWwuYXNBcnJheUJ1ZmZlcigpXSwge3R5cGU6IFwiaW1hZ2VcIn0pKTsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBhY3RpdmF0ZXMgcG9zdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBwb3N0dXJsID0gYXR0cnMucG9zdHVybCArIFwiP3Rva2VuPVwiICsgQXBwQ29uZmlnLnNlc3Npb24udG9rZW47XG4gICAgICAgICAgICBuZXcgTG9hZEZpbGVTdmMgKHNjb3BlLCBlbGVtLCBwb3N0dXJsLCBmaWxlcywgcmVhZGVyQ0IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWxsaXplIGRlZmF1bHQgdmFsdWVzIGZyb20gYXR0cmlidXRlcyB2YWx1ZXNcbiAgICAgICAgc2NvcGUubmFtZT0gYXR0cnMubmFtZSB8fCAnYXBwbGknO1xuICAgICAgICBzY29wZS5jYXRlZ29yeT0gYXR0cnMuY2F0ZWdvcnkgIHx8ICdhcHBsaSc7XG4gICAgICAgIHNjb3BlLm1pbWV0eXBlPSAoYXR0cnMuYWNjZXB0IHx8ICcuemlwJyk7XG4gICAgICAgIHNjb3BlLm1heHNpemU9IGF0dHJzLm1heHNpemUgfHwgMTAwMDAwOyAvLyBkZWZhdWx0IG1heCBzaXplIDEwME1CXG4gICAgICAgIHNjb3BlLnJlZ2V4cCA9IG5ldyBSZWdFeHAgKGF0dHJzLmFjY2VwdCsgJy4qJywnaScpO1xuXG4gICAgICAgIGlmIChhdHRycy50aHVtYm5haWwpIHNjb3BlLnRodW1ibmFpbD0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy50aHVtYm5haWw7XG4gICAgICAgIGVsc2UgIHNjb3BlLnRodW1ibmFpbD1BcHBDb25maWcucGF0aHNbc2NvcGUuY2F0ZWdvcnldICsgJ3VwbG9hZC1hcHBsaS5wbmcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUuaXNub3R2YWxpZD0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc25vdHZhbGlkO1xuICAgICAgICBlbHNlICBzY29wZS5pc25vdHZhbGlkPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXNub3R2YWxpZC5wbmcnO1xuXG4gICAgICAgIGlmIChhdHRycy5pc3Rvb2JpZykgc2NvcGUuaXN0b29iaWc9IEFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXN0b29iaWc7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzdG9vYmlnPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXN0b29iaWcucG5nJztcbiAgICAgICAgc2NvcGUubm9zbGlkZXIgPSBhdHRycy5ub3NsaWRlciB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIWF0dHJzLnBvc3R1cmwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGUtdXBsb2FkICVzIHBvc3R1cmw9L2FwaS94eHh4L3h4eHggcmVxdWlyZWQnLCBzY29wZS5hdHRycyk7ICAgICAgICAgICAgXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiVXBsb2FkRmlsZSBMb2FkZWRcIik7XG59KSgpO1xuIiwiXG4vKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLi5cbiAqL1xuXG5cblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG1wbCA9ICc8dGlwLW1vZGFsIHRpcD1cInRpcFwiPjwvdGlwLW1vZGFsPicgK1xuICAgICAgICAgICAnPGxhYmVsIGZvcj1cInt7bmFtZX19LWludGV4dFwiPnt7bGFiZWx9fSA8aSBuZy1zaG93PVwicmVxdWlyZWRcIiBuZy1jbGljaz1cIlRvQmVEZWZpbmVkXCIgJyArXG4gICAgICAgICAgICdjbGFzcz1cInJlcXVpcmVkIHt7c3RhdHVzfX0gZmktY2hlY2tib3hcIiB0aXRsZT1cIkZyZWUgVmFsdWUgQnV0IE1hbmRhdG9yeSBBcmd1bWVudFwiIGFsdD1cIj9cIj4gJm5ic3A7IDwvaT48L2xhYmVsPicrICAgICAgICAgIFxuICAgICAgICAgICAnPGlucHV0ICcrXG4gICAgICAgICAgICcgdHlwZT1cInt7dHlwZX19XCIgaWQ9XCJ7e25hbWV9fS1pbnRleHRcIiBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiICBjbGFzcz1cInN0YXR1cy17e3N0YXR1c319XCInK1xuICAgICAgICAgICAnIG5nLW1vZGVsPVwidmFsdWVcIiBuZy1ibHVyPVwidmFsaWRhdGUoKVwiIG5nLWZvY3VzPVwic2VsZWN0ZWQoKVwiICcrXG4gICAgICAgICAgICcgbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246IFxcJ2RlZmF1bHQgYmx1clxcJywgZGVib3VuY2U6IHtkZWZhdWx0OiA1MDAsIGJsdXI6IDB9IH1cIicgK1xuICAgICAgICAgICAnPjxhbGVydCBkYXRhLW5nLXNob3c9XCIhdmFsaWQmJmVycm1zZ1wiPnt7ZXJybXNnfX08L2FsZXJ0Pic7XG5cbnZhciBlbWFpbHBhdGVybiA9IC9eKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcblxuYW5ndWxhci5tb2R1bGUoJ0lucHV0VGV4dCcsWydKUXVlcnlFbXUnXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRUZXh0JywgW1wiSlFlbXVcIiwgZnVuY3Rpb24oSlFlbXUpIHtcbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBhdCAxc3QgcmVuZGVyaW5nXG4gICAgc2NvcGUuZXJyb3IgID0gZmFsc2U7XG4gICAgc2NvcGUudmFsaWQgID0gZmFsc2U7XG4gICAgc2NvcGUuc3RhdHVzID0gJ3VudG91Y2gnO1xuICAgXG4gICAgc2NvcGUuaW5wdXQgPSBlbGVtLmZpbmQgKFwiaW5wdXRcIik7XG4gICAgc2NvcGUucmVxdWlyZWQgPSAwO1xuICAgIFxuICAgIC8vIHJlcXVpcmVyIGlzIHVzZSB0byBpbmNyZW1lbnQgcmVxdWVzdGVkIGNvdW50ZXJcbiAgICBpZiAoXCJyZXF1aXJlZFwiIGluIGF0dHJzKSB7XG4gICAgICAgIHNjb3BlLnJlcXVpcmVkID0gMTtcbiAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJyZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgICAgXG4gICAgIC8vIHVzZXIgZW50ZXIgaW5wdXQgcmVzZXQgZXJyb3Igc3RhdHVzXG4gICAgIHNjb3BlLnNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgIHNjb3BlLmVycm1zZz1mYWxzZTsgXG4gICAgICAgIHNjb3BlLnN0YXR1cyA9ICd0b3VjaCc7XG4gICAgIH07ICAgXG4gICAgICAgICAgICBcbiAgICAgc2NvcGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICBcbiAgICAgICAgIC8vIGdldCB2YWx1ZSBmcm9tIGlucHV0IGZpZWxkIGJ5cGFzc2luZyBBbmd1bGFyIG5nLW1vZGVsXG4gICAgICAgICBjb25zb2xlLmxvZyAoXCJDbGlja2VkIElucHV0VGV4dCBuYW1lPSVzIHZhbHVlPSVzIHZhbGlkPSVzXCIsIHNjb3BlLm5hbWUsIHNjb3BlLnZhbHVlLCBzY29wZS52YWxpZCk7ICAgICAgICBcblxuICAgICAgICAgLy8gZm9ybSBpcyBub3QgdW50b3VjaGVkIGFueW1vcmVcbiAgICAgICAgIHNjb3BlLnBhcmVudC5yZW1vdmVDbGFzcyAoXCJuZy1wcmlzdGluZVwiKTtcblxuICAgICAgICAgLy8gaWYgdmFsdWUgbm90IG51bGwgY2xlYW4gdXAgc3RyaW5nXG4gICAgICAgICBpZiAoc2NvcGUudmFsdWUpIHtcbiAgICAgICAgICAgICBzY29wZS5lcnJvcj1mYWxzZTsgXG4gICAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxsaW5nIHNwYWNlXG4gICAgICAgICAgICBzY29wZS52YWx1ZSA9IHNjb3BlLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgIFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBzcGFjZSBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgaWYgKCdub3NwYWNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWU9c2NvcGUudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKTsgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgICAgIGlmICgnbG93ZXJjYXNlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBzY29wZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBtaW5pbXVtIGxlbmdodFxuICAgICAgICAgICAgaWYgKFwibWlubGVuXCIgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgaWYgKHNjb3BlLnZhbHVlLmxlbmd0aCA8IGF0dHJzLm1pbmxlbikge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IE1pbmludW0gTGVuZ2g9ICcgKyBhdHRycy5taW5sZW4gKyAnIENoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJvcj10cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoIWVtYWlscGF0ZXJuLnRlc3QgKHNjb3BlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0naW52YWxpZCc7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJybXNnPSdpbnZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS5zdGF0dXM9J2ludmFsaWQnO1xuICAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9c2NvcGUubmFtZSArICc6IFJlcXVpcmVkIEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgIC8vIElmIGxvY2FsIGNvbnRyb2wgZmFpbCBsZXQncyByZWZ1c2UgaW5wdXRcbiAgICAgICAgIGlmIChzY29wZS5lcnJvcikge1xuICAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCAmJiBzY29wZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICBzY29wZS52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBpZiAoc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgPiAwKSBzY29wZS5sNGFjb3VudGVyLnZhbGlkYXRlZCAtLTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIHVzZSBjYWxsIHRvIHVwZGF0ZSBmb3JtIHNjb3BlIG9uIGZvcm0gY29tcGxldGVuZXNzXG4gICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKGF0dHJzLm5hbWUsIG51bGwsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgLy8gbG9jYWxjaGVjayBpcyBPSyBiYWNrdXAgbWF5IG5ldmVydGhlbGVzcyBjaGFuZ2Ugc3RhdHVzIHRvIGZhbHNlXG4gICAgICAgICAgICBpZiAoc2NvcGUucmVxdWlyZWQgICYmICFzY29wZS52YWxpZCkgc2NvcGUubDRhY291bnRlci52YWxpZGF0ZWQgKys7XG4gICAgICAgICAgICBzY29wZS5zdGF0dXM9J3ZhbGlkJztcbiAgICAgICAgICAgIHNjb3BlLnZhbGlkPXRydWU7XG4gICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoYXR0cnMubmFtZSwgc2NvcGUudmFsdWUsIHNjb3BlLmRvbmUpO1xuICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubGFiZWwgICAgICAgPSBhdHRycy5sYWJlbDtcbiAgICAgc2NvcGUubmFtZSAgICAgICAgPSBhdHRycy5uYW1lO1xuICAgICBzY29wZS5wbGFjZWhvbGRlciA9IGF0dHJzLnBsYWNlaG9sZGVyO1xuICAgICBzY29wZS50eXBlICAgICAgICA9IGF0dHJzLnR5cGUgfHwgXCJ0ZXh0XCI7XG4gICAgIHNjb3BlLnRpcCAgICAgICAgID0gYXR0cnMudGlwO1xuXG4gICAgIC8vIHNlYXJjaCBmb3IgZm9ybSB3aXRoaW4gcGFyZW50IGVsZW1udHNcbiAgICAgc2NvcGUucGFyZW50ID0gSlFlbXUucGFyZW50IChlbGVtLCBcIkZPUk1cIik7XG5cbiAgICAgLy8gZW1haWwgZW5mb3JjZSBsb3dlcmNhc2UgYW5kIG5vc3BhY2UgICBcbiAgICAgaWYgKFwiZW1haWxcIiBpbiBhdHRycykge1xuICAgICAgICBhdHRycy5sb3dlcmNhc2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm5vc3BhY2U9dHJ1ZTsgXG4gICAgICAgIGF0dHJzLm1pbmxlbj02OyBcbiAgICAgfVxuXG4gICAgIGlmIChzY29wZS5yZXF1aXJlZCkge1xuICAgICAgICAgc2NvcGUubDRhY291bnRlciA9IHNjb3BlLnBhcmVudC5kYXRhIChcImw0YWNvdW50ZXJcIik7XG4gICAgICAgICBpZiAoIXNjb3BlLmw0YWNvdW50ZXIpIHsgXG4gICAgICAgICAgICBzY29wZS5sNGFjb3VudGVyID0gIHtyZXF1aXJlZDoxLCB2YWxpZGF0ZWQ6MH07XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkIFwiK3Njb3BlLm5hbWUrXCIgaXMgcmVxdWlyZWQgKDFzdClcIik7XG4gICAgICAgICAgICBzY29wZS5wYXJlbnQuZGF0YSAoXCJsNGFjb3VudGVyXCIsIHNjb3BlLmw0YWNvdW50ZXIpOyBcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWVsZCBcIitzY29wZS5uYW1lK1wiIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgIHNjb3BlLmw0YWNvdW50ZXIucmVxdWlyZWQgKys7XG4gICAgICAgICB9XG4gICAgIH1cbiAgICAgICAgIFxuICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gZWFjaCB0aW1lIGNvbnRyb2xlciB1cGRhdGUgdmFsdWVcbiAgICAgc2NvcGUuJHdhdGNoICgndmFsdWUnLCBmdW5jdGlvbigpe1xuICAgICAgICAgaWYoc2NvcGUudmFsdWUpIHNjb3BlLnZhbGlkYXRlKCk7IH1cbiAgICAgKTtcbiAgICBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nLFxuICAgICAgICAgICAgdmFsdWU6ICc9J1xuICAgICAgICB9XG4gICAgfTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiSW5wdXRUZXh0IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRtcGwgPSAnPGlucHV0LXRleHQgIGNsYXNzPVwicGFzc3dvcmRcIiB0aXA9XCJ7e3RpcDF9fVwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UxfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMX19XCIgY2FsbGJhY2s9XCJ2YWxpZDFcIiBuYW1lPVwie3tuYW1lfX0tMVwiIHZhbHVlPVwicGFzczFcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPicgK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0PicgKyBcbiAgICAgICAgICAgJzxpbnB1dC10ZXh0ICBjbGFzcz1cInBhc3N3b3JkXCIgdGlwPVwidGlwMlwiICBwbGFjZWhvbGRlcj1cInt7cGxhY2UyfX1cIicgK1xuICAgICAgICAgICAnbGFiZWw9XCJ7e2xhYmVsMn19XCIgY2FsbGJhY2s9XCJ2YWxpZDJcIiBuYW1lPVwie3tuYW1lfX0tMlwiIHZhbHVlPVwicGFzczJcIiByZXF1aXJlZCBtaW5sZW49XCJ7e21pbmxlbn19XCIgdHlwZT1cInBhc3N3b3JkXCIgPiAnK1xuICAgICAgICAgICAnPC9pbnB1dC10ZXh0Pic7XG5cbmFuZ3VsYXIubW9kdWxlKCdJbnB1dFBhc3N3b3JkJyxbXSlcblxuLmRpcmVjdGl2ZSgnaW5wdXRQYXNzd29yZCcsIGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICBcbiAgICBzY29wZS52YWxpZDEgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMSBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBzY29wZS5maXJzdHB3ZCA9IHZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgc2NvcGUudmFsaWQyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkb25lKSB7ICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2cgKFwiQ2xpY2tlZCBJbnB1dFBhc3N3b3JkMiBuYW1lPSVzIHZhbHVlPSVzXCIsIG5hbWUsIHZhbHVlKTsgICAgICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWYgYm90aCBwYXNzd2QgZXF1YWwgdGhlbiBjYWxsIGZvcm0gQ0JcbiAgICAgICAgaWYgKHNjb3BlLmZpcnN0cHdkICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGRvbmUoe3ZhbGlkOiBmYWxzZSwgc3RhdHVzOiAnaW52YWxpZCcsIGVycm1zZzogXCJib3RoIHBhc3N3b3JkIHNob3VsZCBtYXRjaFwifSk7ICBcbiAgICAgICAgfSBlbHNlIHsgIFxuICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChhdHRycy5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbnRyb2xsZXIgdG8gdXBkYXRlIHdpZGdldCBzdGF0dXNcbiAgICAgc2NvcGUuZG9uZT1mdW5jdGlvbiAoZGF0YSkge1xuICAgICAgIGNvbnNvbGUubG9nIChcIlRleHQtSW5wdXQgQ2FsbGJhY2sgSUQ9XCIrIGF0dHJzLm5hbWUgKyBcIiBkYXRhPVwiLCBkYXRhKTtcbiAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHNjb3BlW2ldID0gZGF0YVtpXTsgICAgICAgICBcbiAgICAgfTtcbiAgICAgXG4gICAgIC8vIEV4cG9ydCBzb21lIGF0dHJpYnV0ZXMgd2l0aGluIGRpcmVjdGl2ZSBzY29wZSBmb3IgdGVtcGxhdGVcbiAgICAgc2NvcGUubmFtZSAgID0gYXR0cnMubmFtZTtcbiAgICAgc2NvcGUubGFiZWwxID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkJztcbiAgICAgc2NvcGUubGFiZWwyID0gYXR0cnMubGFiZWwgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnBsYWNlMSA9IGF0dHJzLnBsYWNlaG9sZGVyMSB8fCAnVXNlciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLnRpcDEgICA9IGF0dHJzLnRpcCB8fCAnQ2hvb3NlIGEgUGFzc3dvcmQnO1xuICAgICBzY29wZS5wbGFjZTIgPSBhdHRycy5wbGFjZWhvbGRlcjEgfHwgJ1Bhc3N3b3JkIFZlcmlmaWNhdGlvbic7XG4gICAgIHNjb3BlLnRpcDIgICA9IGF0dHJzLnRpcCAgICB8fCAnQ29uZmlybWUgeW91ciBQYXNzd29yZCc7XG4gICAgIHNjb3BlLm1pbmxlbiA9IGF0dHJzLm1pbmxlbiB8fCAxMDtcbiAgICAgXG4gICAgIGlmIChcInJlcXVpcmVkXCIgaW4gYXR0cnMpIHNjb3BlLnJlcXVpcmVkID0gJ3JlcXVpcmVkJztcbiAgICAgICAgIFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiAnPScsXG4gICAgICAgIH1cbiAgICB9O1xufSk7XG5cbmNvbnNvbGUubG9nIChcIklucHV0UGFzc3dvcmQgTG9hZGVkXCIpO1xufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gbGlzdCBhbGwgcmVwZW5kZW5jaWVzIHdpdGhpbiB0aGUgcGFnZSArIGNvbnRyb2xlciBpZiBuZWVkZWRcbmFuZ3VsYXIubW9kdWxlKCdTYW1wbGVNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsJ1VwbG9hZEZpbGVzJ10pXG5cbiAgLmNvbnRyb2xsZXIoJ1NhbXBsZUNvbnRyb2xsZXInLCBbXCIkaHR0cFwiLCBmdW5jdGlvbiAoJGh0dHApIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpczsgLy8gSSBoYXRlIEphdmFTY3JpcHRcblxuICAgICAgICBjb25zb2xlLmxvZyAoXCJzYW1wbGUgSW5pdFwiKTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLkZpbGVVcGxvYWRlZCA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJGaWxlVXBsb2FkZWQgcmVzcG9uc2U9JXNcIiwgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICAgICAgfTtcbiAgIH1dKTtcblxuY29uc29sZS5sb2cgKFwiU2FtcGxlQ29udHJvbGVyIExvYWRlZFwiKTtcbn0pKCk7ICIsIihmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gV0FSTklORzogbWFrZSBzdXJlIHRoYW4gYXBwL2Zyb250ZW5kL3NlcnZpY2VzL0FwcENvbmZpZy5qcyBtYXRjaCB5b3VyIHNlcnZlclxuXG4vLyBsaXN0IGFsbCByZXBlbmRlbmNpZXMgd2l0aGluIHRoZSBwYWdlICsgY29udHJvbGVyIGlmIG5lZWRlZFxuYW5ndWxhci5tb2R1bGUoJ0hvbWVNb2R1bGUnLCBbJ1N1Ym1pdEJ1dHRvbicsICdUb2tlblJlZnJlc2gnXSlcblxuICAuY29udHJvbGxlcignSG9tZUNvbnRyb2xsZXInLCBbXCIkaHR0cFwiLCBcIkFwcENvbmZpZ1wiLCBmdW5jdGlvbiAoJGh0dHAsIEFwcENvbmZpZykge1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOyAvLyBJIGhhdGUgSmF2YVNjcmlwdFxuICAgICAgICBzY29wZS51dWlkICAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS50b2tlbiAgPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zZXNzaW9uPVwibm9uZVwiO1xuICAgICAgICBzY29wZS5zdGF0dXMgPVwiZXJyLW5vXCI7XG5cbiAgICAgICAgY29uc29sZS5sb2cgKFwiSG9tZSBDb250cm9sbGVyXCIpO1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuUHJvY2Vzc1Jlc3BvbnNlPSBmdW5jdGlvbihkYXRhLCBlcnJjb2RlLCBoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgICAgIHZhciBhcGluYW1lPSAnQVBJJysgZGF0YS5yZXF1ZXN0LmFwaS5yZXBsYWNlKCctJywnXycpO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzID0gXCJlcnItb2tcIjtcbiAgICAgICAgICAgIHNjb3BlLmVycmNvZGU9IGVycmNvZGU7XG4gICAgICAgICAgICBzY29wZS5yZXF1ZXN0ICA9IGRhdGEucmVxdWVzdDtcbiAgICAgICAgICAgIHNjb3BlLnJlc3BvbnNlID0gZGF0YS5yZXNwb25zZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gaWYgdG9rZW4gd2FzIHJlZnJlc2ggbGV0J3MgdXBkYXRlIEFwcENvbmZpZ1xuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4gPSBkYXRhLnJlcXVlc3QudG9rZW47XG4gICAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0LnV1aWQpICBBcHBDb25maWcuc2Vzc2lvbi51dWlkICA9IGRhdGEucmVxdWVzdC51dWlkO1xuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50aW1lb3V0KSAgQXBwQ29uZmlnLnNlc3Npb24udGltZW91dCAgPSBkYXRhLnJlcXVlc3QudGltZW91dDtcblxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsZWFuIGV2ZXJ5dGhpbmcgd2hlbiBPcGVuL0Nsb3NlIGlzIGNhbGxlZFxuICAgICAgICAgICAgaWYgKGFwaW5hbWUgPT09IFwiQVBJY3JlYXRlXCIgfHwgYXBpbmFtZSA9PT0gXCJBUElyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuQVBJcmVzZXQgID0nJztcbiAgICAgICAgICAgICAgICBzY29wZS5BUEljcmVhdGUgPScnO1xuICAgICAgICAgICAgICAgIHNjb3BlLkFQSXJlZnJlc2g9Jyc7XG4gICAgICAgICAgICAgICAgc2NvcGUuQVBJY2hlY2sgID0nJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlW2FwaW5hbWVdPVwic3VjY2Vzc1wiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbmV3IHRva2VuIGxldCdzIHVwZGF0ZSBpdFxuICAgICAgICAgICAgaWYgKGRhdGEucmVxdWVzdC50b2tlbikgc2NvcGUudG9rZW49ZGF0YS5yZXF1ZXN0LnRva2VuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJPSzogXCIrIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLlByb2Nlc3NFcnJvcj0gZnVuY3Rpb24oZGF0YSwgZXJyY29kZSwgaGVhZGVycywgY29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgYXBpbmFtZT0gJ0FQSScrZGF0YS5yZXF1ZXN0LmFwaS5yZXBsYWNlKCctJywnXycpO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzICAgPSBcImVyci1meFwiO1xuICAgICAgICAgICAgc2NvcGUuZXJyY29kZSAgPSBlcnJjb2RlO1xuICAgICAgICAgICAgc2NvcGUucmVxdWVzdCAgPSBkYXRhLnJlcXVlc3Q7XG4gICAgICAgICAgICBzY29wZS5yZXNwb25zZSA9IFwiXCI7XG4gICAgICAgICAgICBzY29wZVthcGluYW1lXT1cImZhaWxcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiRlg6IFwiKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuT3BlblNlc3Npb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIk9wZW5TZXNzaW9uXCIpOyBcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KEFwcENvbmZpZy5zZXNzaW9uLmNyZWF0ZSArICc/dG9rZW49JytBcHBDb25maWcuc2Vzc2lvbi5pbml0aWFsLCBwb3N0ZGF0YSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhhbmRsZXIuc3VjY2VzcyhzY29wZS5Qcm9jZXNzUmVzcG9uc2UpO1xuICAgICAgICAgICAgaGFuZGxlci5lcnJvcihzY29wZS5Qcm9jZXNzRXJyb3IpO1xuICAgICAgICB9OyAgICAgICAgXG5cbiAgICAgICAgc2NvcGUuQ2hlY2tTZXNzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJDbG9zZVNlc3Npb25cIik7XG4gICAgICAgICAgICB2YXIgcG9zdGRhdGE9IHsvKiBhbnkganNvbiB5b3VyIGFwcGxpY2F0aW9uIG1heSBuZWVkICovfTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gJGh0dHAucG9zdChBcHBDb25maWcuc2Vzc2lvbi5jaGVjayArICc/dG9rZW49JytBcHBDb25maWcuc2Vzc2lvbi50b2tlbiwgcG9zdGRhdGEpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBoYW5kbGVyLnN1Y2Nlc3Moc2NvcGUuUHJvY2Vzc1Jlc3BvbnNlKTtcbiAgICAgICAgICAgIGhhbmRsZXIuZXJyb3Ioc2NvcGUuUHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLlJlZnJlc2hTZXNzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJSZWZyZXNoU2Vzc2lvblwiKTtcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KEFwcENvbmZpZy5zZXNzaW9uLnJlZnJlc2ggKyAnP3Rva2VuPScrQXBwQ29uZmlnLnNlc3Npb24udG9rZW4sIHBvc3RkYXRhKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaGFuZGxlci5zdWNjZXNzKHNjb3BlLlByb2Nlc3NSZXNwb25zZSk7XG4gICAgICAgICAgICBoYW5kbGVyLmVycm9yKHNjb3BlLlByb2Nlc3NFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5SZXNldFNlc3Npb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIlJlc2V0U2Vzc2lvblwiKTtcbiAgICAgICAgICAgIHZhciBwb3N0ZGF0YT0gey8qIGFueSBqc29uIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgKi99O1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSAkaHR0cC5wb3N0KEFwcENvbmZpZy5zZXNzaW9uLnJlc2V0ICsgJz90b2tlbj0nK0FwcENvbmZpZy5zZXNzaW9uLnRva2VuLCBwb3N0ZGF0YSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGhhbmRsZXIuc3VjY2VzcyhzY29wZS5Qcm9jZXNzUmVzcG9uc2UpO1xuICAgICAgICAgICAgaGFuZGxlci5lcnJvcihzY29wZS5Qcm9jZXNzRXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgIH1dKTtcblxuY29uc29sZS5sb2cgKFwiU2FtcGxlQ29udHJvbGVyIExvYWRlZFwiKTtcbn0pKCk7ICIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKiBcbiAqIFVzYWdlOlxuICogXG4gKiAgIC8vIG1vdXNlIGV2ZW50IHByb2JhYmx5IHBvaW50IG9uIGljb24gYW5kIG5vdCBvbiBidXR0b24gZGl2XG4gKiAgIC4uLiBuZy1jbGljaz1cIkxvY2tDaGFubmVsKCRldmVudClcbiAgICAgdmFyIHRhcmdldD0gYW5ndWxhci5lbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICB2YXIgYnV0dG9uPSBKUWVtdS5GaW5kSW5QYXJlbnQgKHRhcmdldCwgJ2RpdicpO1xuICogXG4gKi9cblxuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuXG4gICAgICAgICAgXG4gICAgLy8gX2FsbCBtb2R1bGVzIG9ubHkgcmVmZXJlbmNlIGRlcGVuZGVuY2llc1xuICAgIGFuZ3VsYXIubW9kdWxlKCdKUXVlcnlFbXUnLCBbXSlcblxuICAgICAgICAgICAgLy8gRmFjdG9yeSBpcyBhIHNpbmdsZXRvbiBhbmQgc2hhcmUgaXRzIGNvbnRleHQgd2l0aGluIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgICAgICAuZmFjdG9yeSgnSlFlbXUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgRmluZEluUGFyZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gc2VsZWN0b3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PT0gcGFyZW50WzBdLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gSFRNTERpdkVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeVRhZz0gZnVuY3Rpb24gKGVsZW1lbnQsIHRhZywgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlICAgPSB0YWcudG9Mb3dlckNhc2UoKSsgXCJOYW1lXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09PSBjaGlsZHJlblswXVt0eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgIEZpbmRCeUNsYXNzPSBmdW5jdGlvbiAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHNlbGVjdG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uaGFzQ2xhc3Moc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEhUTUxEaXZFbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBteU1ldGhvZHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIEZpbmRJblBhcmVudDogRmluZEluUGFyZW50LFxuICAgICAgICAgICAgICAgICAgICBGaW5kQnlUYWc6IEZpbmRCeVRhZyxcbiAgICAgICAgICAgICAgICAgICAgRmluZEJ5Q2xhc3M6IEZpbmRCeUNsYXNzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBteU1ldGhvZHM7XG4gICAgICAgICAgICB9KTtcblxufSkoKTsiLCJ2YXIgZm91bmRhdGlvblJvdXRlcyA9IFt7XCJuYW1lXCI6XCJteXNhbXBsZVwiLFwidXJsXCI6XCIvc2FtcGxlXCIsXCJjb250cm9sbGVyXCI6XCJTYW1wbGVDb250cm9sbGVyIGFzIGN0cmxcIixcImFuaW1hdGlvbkluXCI6XCJzbGlkZUluUmlnaHRcIixcInBhdGhcIjpcInBhZ2VzL1NhbXBsZS9TYW1wbGUuaHRtbFwifSx7XCJuYW1lXCI6XCJteWhvbWVcIixcInVybFwiOlwiL2hvbWVcIixcImNvbnRyb2xsZXJcIjpcIkhvbWVDb250cm9sbGVyIGFzIGN0cmxcIixcImFuaW1hdGlvbkluXCI6XCJzbGlkZUluUmlnaHRcIixcInBhdGhcIjpcInBhZ2VzL0hvbWUvSG9tZS5odG1sXCJ9XTsgXG4iLCIoZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIF9hbGwgbW9kdWxlcyBvbmx5IHJlZmVyZW5jZSBkZXBlbmRlbmNpZXNcbiAgICBhbmd1bGFyLm1vZHVsZSgnQXBwQ29uZmlnJywgW10pXG5cbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0FwcENvbmZpZycsIFtcInVybHF1ZXJ5XCIsIGZ1bmN0aW9uICh1cmxxdWVyeSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIG15Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoczogeyAvLyBXYXJuaW5nIHBhdGhzIHNob3VsZCBlbmQgd2l0aCAvXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA6ICdpbWFnZXMvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogJ2ltYWdlcy9hdmF0YXJzLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA6ICdpbWFnZXMvYXVkaW8vJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpIDogJ2ltYWdlcy9hcHBsaS8nXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IHsgLy8gVGhvc2UgZGF0YSBhcmUgdXBkYXRlZCBieSBzZXNzaW9uIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlICA6ICcvYXBpL3Rva2VuL2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggOiAnL2FwaS90b2tlbi9yZWZyZXNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgICA6ICcvYXBpL3Rva2VuL2NoZWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgICA6ICcvYXBpL3Rva2VuL3Jlc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgcGluZyAgICA6ICcvYXBpL3Rva2VuL2NoZWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCA6IHVybHF1ZXJ5LnRva2VuIHx8ICcxMjM0NTY3ODknLCAgLy8gdHlwaWNhbCBkZXYgaW5pdGlhbCB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IDogMzYwMCwgICAgICAgICAvLyB0aW1lb3V0IGlzIHVwZGF0ZWQgY2xpZW50IHNlc3NpbiBjb250ZXh0IGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgIHBpbmdyYXRlOiA2MCwgICAgICAgICAgIC8vIFBpbmcgcmF0ZSB0byBjaGVjayBpZiBzZXJ2ZXIgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgdXVpZCAgICA6ICcnLCAgICAgICAgICAgLy8gdXVpZCBtYXAgd2l0aCBjb29raWUgb3IgbG9uZyB0ZXJtIHNlc3Npb24gYWNjZXNzIGtleVxuICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiAgIDogJycgICAgICAgICAgICAvLyB3aWxsIGJlIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRpb24gICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG15Q29uZmlnO1xuICAgICAgICAgICAgfV0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0FwcENhbGwnLCBbXCIkaHR0cFwiLCBcIkFwcENvbmZpZ1wiLCBmdW5jdGlvbiAoJGh0dHAsIEFwcENvbmZpZykge1xuICAgICAgICAgICAgICAgIHZhciBteUNhbGxzID0ge1xuICAgICAgICAgICAgICAgICAgICBnZXQgOiBmdW5jdGlvbihwbHVnaW4sIGFjdGlvbiwgcXVlcnksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5LnRva2VuKSBxdWVyeS50b2tlbiA9IEFwcENvbmZpZy5zZXNzaW9uLnRva2VuOyAvLyBhZGQgdG9rZW4gdG8gcHJvdmlkZWQgcXVlcnkgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICRodHRwLmdldCgnL2FwaS8nICsgcGx1Z2luICsgJy8nICsgYWN0aW9uICwge3BhcmFtczogcXVlcnl9KS50aGVuIChjYWxsYmFjaywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBteUNhbGxzO1xuICAgICAgICAgICAgfV0pO1xuICAgIFxuXG59KSgpOyIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBcbiAgZnVuY3Rpb24gIFBhcnNlUXVlcnlTdHJpbmcgKCkge1xuICAgICAgdmFyIHFkID0ge307XG4gICAgICBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgayA9IGl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgIHZhciB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0uc3BsaXQoXCI9XCIpWzFdKTsgXG4gICAgICAgICAgaWYgKGsgaW4gcWQpIHFkW2tdLnB1c2godik7IGVsc2UgcWRba10gPSBbdl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxZDtcbiAgfVxuXG4gIGFuZ3VsYXIubW9kdWxlKCdBRkJjbGllbnQnLCBbIC8vIFdhcm5pbmc6IEFwcG5hbWUgc2hvdWxkIGZpdCB3aXRoIGd1bHBmaWxlLmpzICYgaW5kZXguaHRtbFxuICAgICd1aS5yb3V0ZXInLFxuICAgICduZ0FuaW1hdGUnLFxuXG4gICAgLy9mb3VuZGF0aW9uXG4gICAgJ2ZvdW5kYXRpb24nLFxuICAgICdmb3VuZGF0aW9uLmR5bmFtaWNSb3V0aW5nJyxcbiAgICAnZm91bmRhdGlvbi5keW5hbWljUm91dGluZy5hbmltYXRpb25zJyxcbiAgICBcbiAgICAvLyBleHRlcm5hbCBjb21wb25lbnRzXG4gICAgJ3VpLW5vdGlmaWNhdGlvbicsXG4gICAgXG4gICAgLy8gQXBwbGljYXRpb24gQ29tcG9uZW50c1xuICAgICdBcHBDb25maWcnLFxuICAgICdKUXVlcnlFbXUnLFxuICAgICdIb21lTW9kdWxlJyxcbiAgICAnU2FtcGxlTW9kdWxlJyxcbiAgICAnVXBsb2FkRmlsZXMnLFxuICAgICdMaW5rQnV0dG9uJyxcbiAgICAnVG9rZW5SZWZyZXNoJyxcbiAgICAnUmFuZ2VTbGlkZXInLFxuICAgICdNb2RhbE5vdGlmaWNhdGlvbidcbiAgXSlcbiAgICAudmFsdWUgKCd1cmxxdWVyeScsIFBhcnNlUXVlcnlTdHJpbmcoKSlcbiAgICAuY29uZmlnKGNvbmZpZylcbiAgICAucnVuKHJ1bilcbiAgO1xuXG4gIGNvbmZpZy4kaW5qZWN0ID0gWyckdXJsUm91dGVyUHJvdmlkZXInLCAnJGxvY2F0aW9uUHJvdmlkZXInXTtcbiAgXG4gIGZ1bmN0aW9uIGNvbmZpZygkdXJsUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyLCBBcHBDb25maWcpIHtcbiAgICAkdXJsUHJvdmlkZXIub3RoZXJ3aXNlKCcvaG9tZScpO1xuXG4gICAgLy8gaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvZXJyb3IvJGxvY2F0aW9uL25vYmFzZVxuICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKS5oYXNoUHJlZml4KCchJyk7XG4gICAgXG4gIH1cblxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgRmFzdENsaWNrLmF0dGFjaChkb2N1bWVudC5ib2R5KTtcbiAgfVxuXG5jb25zb2xlLmxvZyAoXCJvcGE9QUZCY2xpZW50IExvYWRlZFwiKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7YW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoJ3BhZ2VzL1NhbXBsZS9TYW1wbGUuaHRtbCcsXG4gICAgJzxoMT48aW1nIGNsYXNzPVwibG9nb1wiIHNyYz1cImltYWdlcy9sb2dvL3RyaXNrZWxfaW90X2J6aHgyNTAucG5nXCIgYWx0PVwiSW9ULmJ6aCBMb2dvXCIgc3R5bGU9XCJoZWlnaHQ6MTUwcHhcIj4gUG9zdCBGaWxlIFVwbG9hZDwvaDE+PGRpdiBjbGFzcz1cInNhbXBsZS1ib3ggYm94LWNvbnRlbnRcIj48dXBsb2FkLWltYWdlIG5hbWU9XCJhdmF0YXJcIiBjYXRlZ29yeT1cImF2YXRhclwiIHRodW1ibmFpbD1cInR1eC12aXNpdG9yLnBuZ1wiIG1heHNpemU9XCIxMDBcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1pbWFnZVwiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiBhY2NlcHQ9XCJpbWFnZVwiIHRpdGxlPVwiQ2hhbmdlIHlvdXIgQXZhdGFyXCI+PC91cGxvYWQtaW1hZ2U+PHVwbG9hZC1hdWRpbyBuYW1lPVwibXVzaWNcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1tdXNpY1wiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiB0aXRsZT1cIlVwbG9hZCB5b3VyIE11c2ljXCI+PC91cGxvYWQtYXVkaW8+PHVwbG9hZC1hcHBsaSBuYW1lPVwiYXBwbGlcIiBwb3N0dXJsPVwiL2FwaS9wb3N0L3VwbG9hZC1hcHBsaVwiIGNhbGxiYWNrPVwiY3RybC5GaWxlVXBsb2FkZWRcIiB0aXRsZT1cIlVwbG9hZCBBR0wgQXBwXCI+PC91cGxvYWQtYXBwbGk+PC9kaXY+PGxpbmstYnV0dG9uIGhyZWY9XCJob21lXCIgaWNvbj1cImZpLWhvbWVcIiBsYWJlbD1cImhvbWVcIj48L2xpbmstYnV0dG9uPicpO31dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7YW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoJ3BhZ2VzL0hvbWUvSG9tZS5odG1sJyxcbiAgICAnPGgzPjxpbWcgY2xhc3M9XCJsb2dvXCIgc3JjPVwiaW1hZ2VzL2xvZ28vdHJpc2tlbF9pb3RfYnpoeDI1MC5wbmdcIiBhbHQ9XCJJb1QuYnpoIExvZ29cIiBzdHlsZT1cImhlaWdodDoxNTBweFwiPiBBcHAgRnJhbWV3b3JrIEJpbmRlciBTaW1wbGUgQ2xpZW50PC9oMz48dG9rZW4tcmVmcmVzaCBhdXRvbG9nPVwidHJ1ZVwiPjwvdG9rZW4tcmVmcmVzaD48ZGl2IGNsYXNzPVwiYnV0dG9uLWJveCBib3gtY29udGVudFwiPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSWNyZWF0ZX19XCIgaWNvbj1cImZpLXVubG9ja1wiIGxhYmVsPVwiT3BlblwiIGNsaWNrZWQ9XCJjdHJsLk9wZW5TZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSWNoZWNrfX1cIiBpY29uPVwiZmktY2hlY2tib3hcIiBsYWJlbD1cIkNoZWNrXCIgY2xpY2tlZD1cImN0cmwuQ2hlY2tTZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjxzdWJtaXQtYnV0dG9uIGNsYXNzPVwic2Vzc2lvbi1idXR0b24ge3tjdHJsLkFQSXJlZnJlc2h9fVwiIGljb249XCJmaS1hcnJvd3MtY29tcHJlc3NcIiBsYWJlbD1cIlJlZnJlc2hcIiBjbGlja2VkPVwiY3RybC5SZWZyZXNoU2Vzc2lvblwiPjwvc3VibWl0LWJ1dHRvbj48c3VibWl0LWJ1dHRvbiBjbGFzcz1cInNlc3Npb24tYnV0dG9uIHt7Y3RybC5BUElyZXNldH19XCIgaWNvbj1cImZpLWxvY2tcIiBsYWJlbD1cIkNsb3NlXCIgY2xpY2tlZD1cImN0cmwuUmVzZXRTZXNzaW9uXCI+PC9zdWJtaXQtYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9XCJtZXNzYWdlLWJveCBib3gtY29udGVudCB2ZXJ0aWNhbCBncmlkLWZyYW1lXCI+PGRpdiBjbGFzcz1cInJlc3BvbnNlXCI+PHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVxIHt7Y3RybC5zdGF0dXN9fVwiPnJlcT0ge3tjdHJsLnJlcXVlc3R9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVzIHt7Y3RybC5zdGF0dXN9fVwiPnJlcz0ge3tjdHJsLnJlc3BvbnNlfX08L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ3JpZC1jb250ZW50IG5vc2Nyb2xsIHN0YXR1cyB7e2N0cmwuc3RhdHVzfX1cIj5zdGF0dXM9IHt7Y3RybC5lcnJjb2RlfX08L3NwYW4+PC9kaXY+PC9kaXY+PGxpbmstYnV0dG9uIGhyZWY9XCJzYW1wbGVcIiBpY29uPVwiZmktaG9tZVwiIGxhYmVsPVwic2FtcGxlXCI+PC9saW5rLWJ1dHRvbj4nKTt9XSk7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9