wotokol-edm 1.1.58 → 1.1.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80698,6 +80698,14 @@ function cloneSymbol(val) {
80698
80698
  module.exports = clone;
80699
80699
 
80700
80700
 
80701
+ /***/ }),
80702
+
80703
+ /***/ 6153:
80704
+ /***/ (function() {
80705
+
80706
+ (()=>{"use strict";function t(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(t){var e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)}))}var e,r,n;!function(t){t.AJAX_ERROR="ajax",t.RESOURCE_ERROR="resource",t.VUE_ERROR="vue",t.PROMISE_ERROR="promise",t.JS_ERROR="js",t.UNKNOWN_ERROR="unknown"}(e||(e={})),function(t){t.INFO="Info",t.WARNING="Warning",t.ERROR="Error"}(r||(r={})),function(t){t.ERROR="/browser/errorLog",t.ERRORS="/browser/errorLogs",t.PERF="/browser/perfData",t.SEGMENT="/v3/segment",t.SEGMENTS="/v3/segments"}(n||(n={}));var o,i="Http",a="Exit";!function(t){t[t.OPENED=1]="OPENED",t[t.DONE=4]="DONE"}(o||(o={}));var s=10001;const c=function(){function t(t,e){this.url="","ERROR"===t?this.url=e+n.ERROR:"ERRORS"===t?this.url=e+n.ERRORS:"SEGMENT"===t?this.url=e+n.SEGMENT:"SEGMENTS"===t?this.url=e+n.SEGMENTS:"PERF"===t&&(this.url=e+n.PERF)}return t.prototype.sendByFetch=function(t){if(delete t.collector,this.url){var e=new Request(this.url,{method:"POST",body:JSON.stringify(t)});fetch(e).then((function(t){if(t.status>=400||0===t.status)throw new Error("Something went wrong on api server!")})).catch((function(t){console.error(t)}))}},t.prototype.sendByXhr=function(t){if(this.url){var e=new XMLHttpRequest;e.open("post",this.url,!0),e.setRequestHeader("Content-Type","application/json"),e.onreadystatechange=function(){4===e.readyState&&e.status<400&&console.log("Report successfully")},e.send(JSON.stringify(t))}},t.prototype.sendByBeacon=function(t){this.url&&("function"!=typeof navigator.sendBeacon?this.sendByXhr(t):navigator.sendBeacon(this.url,new Blob([JSON.stringify(t)],{type:"application/json"})))},t}(),u=new(function(){function t(){this.queues=[],this.collector=""}return t.prototype.addTask=function(t,e){this.queues.push(t),this.collector=e},t.prototype.fireTasks=function(){this.queues&&this.queues.length&&(new c("ERRORS",this.collector).sendByXhr(this.queues),this.queues=[])},t.prototype.finallyFireTasks=function(){var t=this;window.addEventListener("beforeunload",(function(){t.queues.length&&new c("ERRORS",t.collector).sendByBeacon(t.queues)}))},t}());var l,p={};const f=function(){function t(){this.logInfo={uniqueId:"",service:"",serviceVersion:"",pagePath:"",category:e.UNKNOWN_ERROR,grade:r.INFO,errorUrl:"",line:0,col:0,message:"",firstReportedError:!1,collector:""}}return t.prototype.traceInfo=function(t){var r;this.logInfo=t||this.logInfo;var n=[e.AJAX_ERROR,e.RESOURCE_ERROR,e.UNKNOWN_ERROR];p[location.href]||n.includes(this.logInfo.category)||((r={})[location.href]=!0,p=r,this.logInfo.firstReportedError=!0);var o=this.logInfo.collector;delete this.logInfo.collector,u.addTask(this.logInfo,o),u.finallyFireTasks(),l||(l=setInterval((function(){u.fireTasks()}),6e4))},t}();var h,g=(h=function(t,e){return h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},h(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}h(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),d=function(){return d=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},d.apply(this,arguments)};const v=new(function(n){function o(){var t=null!==n&&n.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return g(o,n),o.prototype.handleErrors=function(n){var o=this;this.infoOpt=n,window.onerror=function(i,a,s,c,u){o.logInfo=d(d({},o.infoOpt),{uniqueId:t(),category:e.JS_ERROR,grade:r.ERROR,errorUrl:a,line:s,col:c,message:i,collector:n.collector,stack:u?u.stack:""}),o.traceInfo()}},o.prototype.setOptions=function(t){this.infoOpt=t},o}(f));var y=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),m=function(){return m=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},m.apply(this,arguments)};const O=new(function(n){function o(){var t=null!==n&&n.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return y(o,n),o.prototype.handleErrors=function(n){var o=this;this.infoOpt=n,window.addEventListener("unhandledrejection",(function(i){try{var a="";if(!i||!i.reason)return;i.reason.config&&i.reason.config.url&&(a=i.reason.config.url),o.logInfo=m(m({},o.infoOpt),{uniqueId:t(),category:e.PROMISE_ERROR,grade:r.ERROR,errorUrl:a||location.href,message:i.reason.message,stack:i.reason.stack,collector:n.collector}),o.traceInfo()}catch(t){console.log(t)}}))},o.prototype.setOptions=function(t){this.infoOpt=t},o}(f));var E=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),w=function(){return w=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},w.apply(this,arguments)};const R=new(function(o){function i(){var t=null!==o&&o.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return E(i,o),i.prototype.handleError=function(o){var i=this;window.XMLHttpRequest&&(this.infoOpt=o,window.addEventListener("xhrReadyStateChange",(function(a){var s=a.detail;4===s.readyState&&s.getRequestConfig[1]!==o.collector+n.ERRORS&&(0!==s.status&&s.status<400||(i.logInfo=w(w({},i.infoOpt),{uniqueId:t(),category:e.AJAX_ERROR,grade:r.ERROR,errorUrl:s.getRequestConfig[1],message:"status: ".concat(s.status,"; statusText: ").concat(s.statusText,";"),collector:o.collector,stack:s.responseText}),i.traceInfo()))})))},i.prototype.setOptions=function(t){this.infoOpt=t},i}(f));var S=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),b=function(){return b=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},b.apply(this,arguments)};const T=new(function(n){function o(){var t=null!==n&&n.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return S(o,n),o.prototype.handleErrors=function(n){var o=this;this.infoOpt=n,window.addEventListener("error",(function(i){try{if(!i)return;var a=i.target;if(!(a instanceof HTMLScriptElement||a instanceof HTMLLinkElement||a instanceof HTMLImageElement))return;o.logInfo=b(b({},o.infoOpt),{uniqueId:t(),category:e.RESOURCE_ERROR,grade:"IMG"===a.tagName?r.WARNING:r.ERROR,errorUrl:a.src||a.href||location.href,message:"load ".concat(a.tagName," resource error"),collector:n.collector,stack:"load ".concat(a.tagName," resource error")}),o.traceInfo()}catch(t){throw t}}))},o.prototype.setOptions=function(t){this.infoOpt=t},o}(f));var I=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),P=function(){return P=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},P.apply(this,arguments)};const x=new(function(n){function o(){var t=null!==n&&n.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return I(o,n),o.prototype.handleErrors=function(n,o){var i=this;this.infoOpt=n,o&&o.config&&(o.config.errorHandler=function(o,a,s){try{i.logInfo=P(P({},i.infoOpt),{uniqueId:t(),category:e.VUE_ERROR,grade:r.ERROR,errorUrl:location.href,message:s,collector:n.collector,stack:o.stack}),i.traceInfo()}catch(o){throw o}})},o.prototype.setOptions=function(t){this.infoOpt=t},o}(f));var _=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),C=function(){return C=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},C.apply(this,arguments)};const A=new(function(n){function o(){var t=null!==n&&n.apply(this,arguments)||this;return t.infoOpt={service:"",pagePath:"",serviceVersion:""},t}return _(o,n),o.prototype.handleErrors=function(n,o){this.infoOpt=n,this.logInfo=C(C({},this.infoOpt),{uniqueId:t(),category:e.JS_ERROR,grade:r.ERROR,errorUrl:o.name||location.href,message:o.message,collector:n.collector||location.origin,stack:o.stack}),this.traceInfo()},o}(f)),N=function(){function t(){}return t.prototype.getPerfTiming=function(){try{var t=window.performance.timing;if("function"==typeof window.PerformanceNavigationTiming){var e=performance.getEntriesByType("navigation")[0];e&&(t=e)}return{redirectTime:void 0!==t.navigationStart?parseInt(String(t.fetchStart-t.navigationStart),10):void 0!==t.redirectEnd?parseInt(String(t.redirectEnd-t.redirectStart),10):0,dnsTime:parseInt(String(t.domainLookupEnd-t.domainLookupStart),10),ttfbTime:parseInt(String(t.responseStart-t.requestStart),10),tcpTime:parseInt(String(t.connectEnd-t.connectStart),10),transTime:parseInt(String(t.responseEnd-t.responseStart),10),domAnalysisTime:parseInt(String(t.domInteractive-t.responseEnd),10),fptTime:parseInt(String(t.responseEnd-t.fetchStart),10),domReadyTime:parseInt(String(t.domContentLoadedEventEnd-t.fetchStart),10),loadPageTime:parseInt(String(t.loadEventStart-t.fetchStart),10),resTime:parseInt(String(t.loadEventStart-t.domContentLoadedEventEnd),10),sslTime:"https:"===location.protocol&&t.secureConnectionStart>0?parseInt(String(t.connectEnd-t.secureConnectionStart),10):void 0,ttlTime:parseInt(String(t.domInteractive-t.fetchStart),10),firstPackTime:parseInt(String(t.responseStart-t.domainLookupStart),10),fmpTime:0}}catch(t){throw t}},t}();var j,k=function(t,e){return window.getComputedStyle?window.getComputedStyle(t,null)[e]:t.currentStyle[e]};!function(t){t[t.SVG=2]="SVG",t[t.IMG=2]="IMG",t[t.CANVAS=4]="CANVAS",t[t.OBJECT=4]="OBJECT",t[t.EMBED=4]="EMBED",t[t.VIDEO=4]="VIDEO"}(j||(j={}));var L=performance.now(),M=["SCRIPT","STYLE","META","HEAD","LINK"],V=window.innerWidth,q=window.innerHeight;const D=function(){function t(){this.fmpTime=0,this.statusCollector=[],this.flag=!0,this.observer=null,this.callbackCount=0,this.entries={},performance&&performance.getEntries?this.initObserver():console.log("your browser do not support performance.getEntries")}return t.prototype.getFirstSnapShot=function(){var t=performance.now(),e=document.body;e&&this.setTag(e,this.callbackCount),this.statusCollector.push({time:t})},t.prototype.initObserver=function(){var t=this;this.getFirstSnapShot(),this.observer=new MutationObserver((function(){t.callbackCount+=1;var e=performance.now(),r=document.body;r&&t.setTag(r,t.callbackCount),t.statusCollector.push({time:e})})),this.observer.observe(document,{childList:!0,subtree:!0}),this.calculateFinalScore()},t.prototype.calculateFinalScore=function(){var t=this;if(this.flag&&MutationObserver)if(this.checkNeedCancel(L)){this.observer.disconnect(),this.flag=!1;for(var e=null,r=0,n=this.getTreeScore(document.body).dpss;r<n.length;r++){var o=n[r];e&&e.st?e.st<o.st&&(e=o):e=o}if(performance.getEntries().forEach((function(e){t.entries[e.name]=e.responseEnd})),!e)return!1;var i=this.filterResult(e.els),a=this.getFmpTime(i);this.fmpTime=a}else setTimeout((function(){t.calculateFinalScore()}),2e3)},t.prototype.getFmpTime=function(t){for(var e=0,r=0,n=t;r<n.length;r++){var o=n[r],i=0;if(1===o.weight){var a=parseInt(o.ele.getAttribute("fmp_c"),10);i=this.statusCollector[a]&&this.statusCollector[a].time}else if(2===o.weight)if("IMG"===o.ele.tagName)i=this.entries[o.ele.src];else if("SVG"===o.ele.tagName)a=parseInt(o.ele.getAttribute("fmp_c"),10),i=this.statusCollector[a]&&this.statusCollector[a].time;else{var s=k(o.ele,"background-image").match(/url\(\"(.*?)\"\)/),c="";s&&s[1]&&((c=s[1]).includes("http")||(c=location.protocol+s[1])),i=this.entries[c]}else 4===o.weight&&("CANVAS"===o.ele.tagName?(a=parseInt(o.ele.getAttribute("fmp_c"),10),i=this.statusCollector[a]&&this.statusCollector[a].time):"VIDEO"===o.ele.tagName&&((i=this.entries[o.ele.src])||(i=this.entries[o.ele.poster])));"number"!=typeof i&&(i=0),e<i&&(e=i)}return e},t.prototype.filterResult=function(t){if(1===t.length)return t;var e=0;t.forEach((function(t){e+=t.st}));var r=e/t.length;return t.filter((function(t){return t.st>r}))},t.prototype.checkNeedCancel=function(t){var e=performance.now()-t,r=this.statusCollector.length>0?this.statusCollector[this.statusCollector.length-1].time:0;return e>3e3||e-r>1e3},t.prototype.getTreeScore=function(t){if(!t)return{};for(var e=[],r=0,n=t.children;r<n.length;r++){var o=n[r];if(o.getAttribute("fmp_c")){var i=this.getTreeScore(o);i.st&&e.push(i)}}return this.calcaulteGrades(t,e)},t.prototype.calcaulteGrades=function(t,e){var r=t.getBoundingClientRect(),n=r.width,o=r.height,i=r.left,a=r.top,s=!0;(q<a||V<i)&&(s=!1);var c=0;e.forEach((function(t){c+=t.st}));var u=Number(j[t.tagName])||1;1===u&&k(t,"background-image")&&"initial"!==k(t,"background-image")&&"none"!==k(t,"background-image")&&(u=j.IMG);var l=s?n*o*u:0,p=[{ele:t,st:l,weight:u}],f=t,h=this.calculateAreaParent(t);if(c>l*h||0===h){l=c,p=[];for(var g=0,d=e;g<d.length;g++){var v=d[g];p=p.concat(v.els)}}return{dpss:e,st:l,els:p,root:f}},t.prototype.calculateAreaParent=function(t){var e=t.getBoundingClientRect(),r=e.left,n=e.right,o=e.top,i=e.bottom,a=e.width,s=e.height,c=V,u=q,l=n-r+(c-0)-(Math.max(n,c)-Math.min(r,0)),p=i-o+(u-0)-(Math.max(i,u)-Math.min(o,0));return l<=0||p<=0?0:l*p/(a*s)},t.prototype.setTag=function(t,e){var r=t.tagName;if(-1===M.indexOf(r)){var n=t.children;if(n&&n.length>0)for(var o=n.length-1;o>=0;o--){var i=n[o];if(null===i.getAttribute("fmp_c")){var a=i.getBoundingClientRect(),s=a.left,c=a.top,u=a.width,l=a.height;if(q<c||V<s||0===u||0===l)continue;i.setAttribute("fmp_c","".concat(e))}this.setTag(i,e)}}},t}();var F=function(){return F=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},F.apply(this,arguments)};const U=new(function(){function t(){this.perfConfig={perfDetail:{}}}return t.prototype.getPerf=function(t){var e=this;this.recordPerf(t),t.enableSPA&&window.addEventListener("hashchange",(function(){e.recordPerf(t)}),!1)},t.prototype.recordPerf=function(t){return e=this,r=void 0,o=function(){var e,r=this;return function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(s){return function(c){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,s[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,n=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){a.label=s[1];break}if(6===s[0]&&a.label<o[1]){a.label=o[1],o=s;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(s);break}o[2]&&a.ops.pop(),a.trys.pop();continue}s=e.call(t,a)}catch(t){s=[6,t],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}(this,(function(n){switch(n.label){case 0:return e={fmpTime:void 0},t.autoTracePerf&&t.useFmp?[4,new D]:[3,2];case 1:e=n.sent(),n.label=2;case 2:return setTimeout((function(){t.autoTracePerf&&(r.perfConfig.perfDetail=(new N).getPerfTiming());var n=t.autoTracePerf?F(F({},r.perfConfig.perfDetail),{fmpTime:t.useFmp?parseInt(String(e.fmpTime),10):void 0}):void 0,o=F(F({},n),{pagePath:t.pagePath,serviceVersion:t.serviceVersion,service:t.service});new c("PERF",t.collector).sendByXhr(o),r.clearPerf()}),6e3),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{c(o.next(t))}catch(t){i(t)}}function s(t){try{c(o.throw(t))}catch(t){i(t)}}function c(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(a,s)}c((o=o.apply(e,r||[])).next())}));var e,r,n,o},t.prototype.clearPerf=function(){window.performance&&window.performance.clearResourceTimings&&(window.performance.clearResourceTimings(),this.perfConfig={perfDetail:{}})},t}()),B="function"==typeof btoa,G="function"==typeof Buffer,H=("function"==typeof TextDecoder&&new TextDecoder,"function"==typeof TextEncoder?new TextEncoder:void 0),X=Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="),W=((t=>{let e={};t.forEach(((t,r)=>e[t]=r))})(X),String.fromCharCode.bind(String)),J=("function"==typeof Uint8Array.from&&Uint8Array.from.bind(Uint8Array),t=>t.replace(/=/g,"").replace(/[+\/]/g,(t=>"+"==t?"-":"_"))),K=B?t=>btoa(t):G?t=>Buffer.from(t,"binary").toString("base64"):t=>{let e,r,n,o,i="";const a=t.length%3;for(let a=0;a<t.length;){if((r=t.charCodeAt(a++))>255||(n=t.charCodeAt(a++))>255||(o=t.charCodeAt(a++))>255)throw new TypeError("invalid character found");e=r<<16|n<<8|o,i+=X[e>>18&63]+X[e>>12&63]+X[e>>6&63]+X[63&e]}return a?i.slice(0,a-3)+"===".substring(a):i},Y=G?t=>Buffer.from(t).toString("base64"):t=>{let e=[];for(let r=0,n=t.length;r<n;r+=4096)e.push(W.apply(null,t.subarray(r,r+4096)));return K(e.join(""))},z=t=>{if(t.length<2)return(e=t.charCodeAt(0))<128?t:e<2048?W(192|e>>>6)+W(128|63&e):W(224|e>>>12&15)+W(128|e>>>6&63)+W(128|63&e);var e=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320);return W(240|e>>>18&7)+W(128|e>>>12&63)+W(128|e>>>6&63)+W(128|63&e)},Q=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,Z=G?t=>Buffer.from(t,"utf8").toString("base64"):H?t=>Y(H.encode(t)):t=>K(t.replace(Q,z)),$=(t,e=!1)=>e?J(Z(t)):Z(t);var tt=function(){return tt=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},tt.apply(this,arguments)},et=function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},rt={};function nt(e,r){ot(e);var c=window.XMLHttpRequest,u=XMLHttpRequest.prototype.send,l=XMLHttpRequest.prototype.open;if(u&&l){c.getRequestConfig=[],window.XMLHttpRequest=function(){var t=new c;return t.addEventListener("readystatechange",(function(){f.call(this,"xhrReadyStateChange")}),!1),t.open=function(t,e,r,n,o){return this.getRequestConfig=arguments,l.apply(this,arguments)},t.send=function(t){return u.apply(this,arguments)},t};var p=[];window.addEventListener("xhrReadyStateChange",(function(e){var c={traceId:"",service:rt.service,spans:[],serviceInstance:rt.serviceVersion,traceSegmentId:""},u=e.detail.readyState,l=e.detail.getRequestConfig,f={};if(l[1].startsWith("http://")||l[1].startsWith("https://")?f=new URL(l[1]):l[1].startsWith("//")?f=new URL("".concat(window.location.protocol).concat(l[1])):(f=new URL(window.location.href)).pathname=l[1],!rt.noTraceOrigins.some((function(t){if("string"==typeof t){if(t===f.origin)return!0}else if(t instanceof RegExp&&t.test(f.origin))return!0}))){var h=new URL(rt.collector),g="/"===h.pathname?f.pathname:f.pathname.replace(new RegExp("^".concat(h.pathname)),"");if(![n.ERROR,n.ERRORS,n.PERF,n.SEGMENTS].includes(g)||rt.traceSDKInternal){if(u===o.OPENED){var d=t(),v=t();p.push({event:e.detail,startTime:(new Date).getTime(),traceId:d,traceSegmentId:v});var y=String($(d)),m=String($(v)),O=String($(c.service)),E=String($(c.serviceInstance)),w=String($(rt.pagePath)),R=String($(f.host)),S=c.spans.length,b="".concat(1,"-").concat(y,"-").concat(m,"-").concat(S,"-").concat(O,"-").concat(E,"-").concat(w,"-").concat(R);e.detail.setRequestHeader("sw8",b)}if(u===o.DONE){for(var T=(new Date).getTime(),I=0;I<p.length;I++)if(p[I].event.readyState===o.DONE){var P={};p[I].event.status&&(P=new URL(p[I].event.responseURL));var x=[{key:"http.method",value:l[0]},{key:"url",value:p[I].event.responseURL||"".concat(f.protocol,"//").concat(f.host).concat(f.pathname)}],_={operationName:rt.pagePath,startTime:p[I].startTime,endTime:T,spanId:c.spans.length,spanLayer:i,spanType:a,isError:0===e.detail.status||e.detail.status>=400,parentSpanId:c.spans.length-1,componentId:s,peer:P.host,tags:rt.detailMode?rt.customTags?et(et([],x,!0),rt.customTags,!0):x:void 0};(c=tt(tt({},c),{traceId:p[I].traceId,traceSegmentId:p[I].traceSegmentId})).spans.push(_),p.splice(I,1)}r.push(c)}}}}))}else console.error("Tracing is not supported");function f(t){var e=new CustomEvent(t,{detail:this});window.dispatchEvent(e)}}function ot(t){rt=tt(tt({},rt),t)}var it=function(){return it=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},it.apply(this,arguments)},at=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{c(n.next(t))}catch(t){i(t)}}function s(t){try{c(n.throw(t))}catch(t){i(t)}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,s)}c((n=n.apply(t,e||[])).next())}))},st=function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(s){return function(c){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,s[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,n=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){a.label=s[1];break}if(6===s[0]&&a.label<o[1]){a.label=o[1],o=s;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(s);break}o[2]&&a.ops.pop(),a.trys.pop();continue}s=e.call(t,a)}catch(t){s=[6,t],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}},ct=function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},ut={};function lt(t){ut=it(it({},ut),t)}function pt(t){ot(t),lt(t)}var ft=function(){return ft=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},ft.apply(this,arguments)};const ht={customOptions:{collector:location.origin,jsErrors:!0,apiErrors:!0,resourceErrors:!0,autoTracePerf:!0,useFmp:!1,enableSPA:!1,traceSDKInternal:!1,detailMode:!0,noTraceOrigins:[],traceTimeInterval:6e4},register:function(o){var u,l;this.customOptions=ft(ft({},this.customOptions),o),this.validateOptions(),this.catchErrors(this.customOptions),this.customOptions.enableSPA||this.performance(this.customOptions),nt(u=this.customOptions,l=[]),function(o,c){var u=this,l=window.fetch;lt(o),window.fetch=function(){for(var o=[],p=0;p<arguments.length;p++)o[p]=arguments[p];return at(u,void 0,void 0,(function(){var u,p,h,g,d,v,y,m,O,E,w,R,S,b,T,I,P,x,_,C,A,N,j,k;return st(this,(function(L){switch(L.label){case 0:return u=(new Date).getTime(),p=t(),h=t(),g={traceId:"",service:ut.service,spans:[],serviceInstance:ut.serviceVersion,traceSegmentId:""},d={},"[object Request]"===Object.prototype.toString.call(o[0])?d=new URL(o[0].url):o[0].startsWith("http://")||o[0].startsWith("https://")?d=new URL(o[0]):o[0].startsWith("//")?d=new URL("".concat(window.location.protocol).concat(o[0])):(d=new URL(window.location.href)).pathname=o[0],v=ut.noTraceOrigins.some((function(t){if("string"==typeof t){if(t===d.origin)return!0}else if(t instanceof RegExp&&t.test(d.origin))return!0})),y=new URL(ut.collector),m="/"===y.pathname?d.pathname:d.pathname.replace(new RegExp("^".concat(y.pathname)),""),O=[n.ERROR,n.ERRORS,n.PERF,n.SEGMENTS],E=O.includes(m),(w=!v||E&&ut.traceSDKInternal)&&(R=String($(p)),S=String($(h)),b=String($(g.service)),T=String($(g.serviceInstance)),I=String($(ut.pagePath)),P=String($(d.host)),x=g.spans.length,_="".concat(1,"-").concat(R,"-").concat(S,"-").concat(x,"-").concat(b,"-").concat(T,"-").concat(I,"-").concat(P),o[0]instanceof Request?o[0].headers.append("sw8",_):(o[1]||(o[1]={}),o[1].headers||(o[1].headers=new Headers),o[1].headers instanceof Headers?o[1].headers.append("sw8",_):o[1].headers.sw8=_)),[4,l.apply(void 0,o)];case 1:C=L.sent();try{C&&(0===C.status||C.status>=400)&&(A={uniqueId:t(),service:ut.service,serviceVersion:ut.serviceVersion,pagePath:ut.pagePath,category:e.AJAX_ERROR,grade:r.ERROR,errorUrl:C&&C.url||"".concat(d.protocol,"//").concat(d.host).concat(d.pathname),message:"status: ".concat(C?C.status:0,"; statusText: ").concat(C&&C.statusText,";"),collector:ut.collector,stack:"Fetch: "+C&&C.statusText},(new f).traceInfo(A)),w&&(N=[{key:"http.method",value:o[1].method||"GET"},{key:"url",value:C&&C.url||"".concat(d.protocol,"//").concat(d.host).concat(d.pathname)}],j=(new Date).getTime(),k={operationName:ut.pagePath,startTime:u,endTime:j,spanId:g.spans.length,spanLayer:i,spanType:a,isError:C&&(0===C.status||C.status>=400),parentSpanId:g.spans.length-1,componentId:s,peer:d.host,tags:ut.detailMode?ut.customTags?ct(ct([],N,!0),ut.customTags,!0):N:void 0},(g=it(it({},g),{traceId:p,traceSegmentId:h})).spans.push(k),c.push(g))}catch(t){throw t}return[2,C.clone()]}}))}))}}(u,l),window.addEventListener("beforeunload",(function(){l.length&&new c("SEGMENTS",u.collector).sendByBeacon(l)})),setInterval((function(){l.length&&(new c("SEGMENTS",u.collector).sendByXhr(l),l.splice(0,l.length))}),u.traceTimeInterval)},performance:function(t){"complete"===document.readyState?U.getPerf(t):window.addEventListener("load",(function(){U.getPerf(t)}),!1)},catchErrors:function(t){var e=t.service,r=t.pagePath,n=t.serviceVersion,o=t.collector;t.jsErrors&&(v.handleErrors({service:e,pagePath:r,serviceVersion:n,collector:o}),O.handleErrors({service:e,pagePath:r,serviceVersion:n,collector:o}),t.vue&&x.handleErrors({service:e,pagePath:r,serviceVersion:n,collector:o},t.vue)),t.apiErrors&&R.handleError({service:e,pagePath:r,serviceVersion:n,collector:o}),t.resourceErrors&&T.handleErrors({service:e,pagePath:r,serviceVersion:n,collector:o})},setPerformance:function(t){this.customOptions=ft(ft(ft({},this.customOptions),t),{useFmp:!1}),this.validateOptions(),this.performance(this.customOptions);var e=this.customOptions,r=e.service,n=e.pagePath,o=e.serviceVersion,i=e.collector;this.customOptions.jsErrors&&(v.setOptions({service:r,pagePath:n,serviceVersion:o,collector:i}),O.setOptions({service:r,pagePath:n,serviceVersion:o,collector:i}),this.customOptions.vue&&x.setOptions({service:r,pagePath:n,serviceVersion:o,collector:i})),this.customOptions.apiErrors&&R.setOptions({service:r,pagePath:n,serviceVersion:o,collector:i}),this.customOptions.resourceErrors&&T.setOptions({service:r,pagePath:n,serviceVersion:o,collector:i}),pt(this.customOptions)},reportFrameErrors:function(t,e){A.handleErrors(t,e)},validateTags:function(t){if(!t)return!1;if(!Array.isArray(t))return this.customOptions.customTags=void 0,console.error("customTags error"),!1;for(var e=!0,r=0,n=t;r<n.length;r++){var o=n[r];o&&o.key&&o.value||(e=!1)}return!!e||(this.customOptions.customTags=void 0,console.error("customTags error"),!1)},validateOptions:function(){var t=this.customOptions,e=t.collector,r=t.service,n=t.pagePath,o=t.serviceVersion,i=t.jsErrors,a=t.apiErrors,s=t.resourceErrors,c=t.autoTracePerf,u=t.useFmp,l=t.enableSPA,p=t.traceSDKInternal,f=t.detailMode,h=t.noTraceOrigins,g=t.traceTimeInterval,d=t.customTags,v=t.vue;this.validateTags(d),"string"!=typeof e&&(this.customOptions.collector=location.origin),"string"!=typeof r&&(this.customOptions.service=""),"string"!=typeof n&&(this.customOptions.pagePath=""),"string"!=typeof o&&(this.customOptions.serviceVersion=""),"boolean"!=typeof i&&(this.customOptions.jsErrors=!0),"boolean"!=typeof a&&(this.customOptions.apiErrors=!0),"boolean"!=typeof s&&(this.customOptions.resourceErrors=!0),"boolean"!=typeof c&&(this.customOptions.autoTracePerf=!0),"boolean"!=typeof u&&(this.customOptions.useFmp=!1),"boolean"!=typeof l&&(this.customOptions.enableSPA=!1),"boolean"!=typeof p&&(this.customOptions.traceSDKInternal=!1),"boolean"!=typeof f&&(this.customOptions.detailMode=!0),"boolean"!=typeof f&&(this.customOptions.detailMode=!0),Array.isArray(h)||(this.customOptions.noTraceOrigins=[]),"number"!=typeof g&&(this.customOptions.traceTimeInterval=6e4),"function"!=typeof v&&(this.customOptions.vue=void 0)},setCustomTags:function(t){var e=ft(ft({},this.customOptions),{customTags:t});this.validateTags(t)&&pt(e)}};window.ClientMonitor=ht})();
80707
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFsQm5ILElBQ1R2TyxLQUFLdVYsY0FBY2hILGVBQWdCLEdBRWYsa0JBQVhDLElBQ1R4TyxLQUFLdVYsY0FBYy9HLFFBQVMsR0FFTCxrQkFBZEgsSUFDVHJPLEtBQUt1VixjQUFjbEgsV0FBWSxHQUVELGtCQUFyQmdGLElBQ1RyVCxLQUFLdVYsY0FBY2xDLGtCQUFtQixHQUVkLGtCQUFmMEIsSUFDVC9VLEtBQUt1VixjQUFjUixZQUFhLEdBRVIsa0JBQWZBLElBQ1QvVSxLQUFLdVYsY0FBY1IsWUFBYSxHQUU3QjNGLE1BQU0ySCxRQUFRaEUsS0FDakIvUyxLQUFLdVYsY0FBY3hDLGVBQWlCLElBRUwsaUJBQXRCNEMsSUFDVDNWLEtBQUt1VixjQUFjSSxrQkFBb0IsS0FFdEIsbUJBQVJnQixJQUNUM1csS0FBS3VWLGNBQWNvQixTQUFNbFEsRUFFN0IsRUFDQXdRLGNBQWEsU0FBQzdDLEdBQ1osSUFBTTFQLEVBQU0sU0FBSzFFLEtBQUt1VixlQUFhLENBQUVQLFdBQVlaLElBQzdDcFUsS0FBSzhXLGFBQWExQyxJQUNwQmtCLEdBQVU1USxFQUVkLEdDM0xEakMsT0FBZXlVLGNBQWdCLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy9zZXJ2aWNlcy91dWlkLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL3NlcnZpY2VzL2NvbnN0YW50LnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL3NlcnZpY2VzL3JlcG9ydC50cyIsIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy9zZXJ2aWNlcy90YXNrLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL3NlcnZpY2VzL2Jhc2UudHMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9zcmMvZXJyb3JzL2pzLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL2Vycm9ycy9wcm9taXNlLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL2Vycm9ycy9hamF4LnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL2Vycm9ycy9yZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy9lcnJvcnMvdnVlLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL2Vycm9ycy9mcmFtZXMudHMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9zcmMvcGVyZm9ybWFuY2UvcGVyZi50cyIsIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy9wZXJmb3JtYW5jZS9mbXAudHMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9zcmMvcGVyZm9ybWFuY2UvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9ub2RlX21vZHVsZXMvanMtYmFzZTY0L2Jhc2U2NC5tanMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9zcmMvdHJhY2UvaW50ZXJjZXB0b3JzL3hoci50cyIsIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy90cmFjZS9pbnRlcmNlcHRvcnMvZmV0Y2gudHMiLCJ3ZWJwYWNrOi8vc2t5d2Fsa2luZy1jbGllbnQtanMvLi9zcmMvdHJhY2Uvc2VnbWVudC50cyIsIndlYnBhY2s6Ly9za3l3YWxraW5nLWNsaWVudC1qcy8uL3NyYy9tb25pdG9yLnRzIiwid2VicGFjazovL3NreXdhbGtpbmctY2xpZW50LWpzLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dWlkKCkge1xuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuXG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cbiIsImltcG9ydCBSZXBvcnQgZnJvbSAnLi9yZXBvcnQnO1xuXG4vKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yc0NhdGVnb3J5IHtcbiAgQUpBWF9FUlJPUiA9ICdhamF4JyxcbiAgUkVTT1VSQ0VfRVJST1IgPSAncmVzb3VyY2UnLFxuICBWVUVfRVJST1IgPSAndnVlJyxcbiAgUFJPTUlTRV9FUlJPUiA9ICdwcm9taXNlJyxcbiAgSlNfRVJST1IgPSAnanMnLFxuICBVTktOT1dOX0VSUk9SID0gJ3Vua25vd24nLFxufVxuZXhwb3J0IGVudW0gR3JhZGVUeXBlRW51bSB7XG4gIElORk8gPSAnSW5mbycsXG4gIFdBUk5JTkcgPSAnV2FybmluZycsXG4gIEVSUk9SID0gJ0Vycm9yJyxcbn1cbmV4cG9ydCBlbnVtIFJlcG9ydFR5cGVzIHtcbiAgRVJST1IgPSAnL2Jyb3dzZXIvZXJyb3JMb2cnLFxuICBFUlJPUlMgPSAnL2Jyb3dzZXIvZXJyb3JMb2dzJyxcbiAgUEVSRiA9ICcvYnJvd3Nlci9wZXJmRGF0YScsXG4gIFNFR01FTlQgPSAnL3YzL3NlZ21lbnQnLFxuICBTRUdNRU5UUyA9ICcvdjMvc2VnbWVudHMnLFxufVxuXG5leHBvcnQgY29uc3QgU3BhbkxheWVyID0gJ0h0dHAnO1xuZXhwb3J0IGNvbnN0IFNwYW5UeXBlID0gJ0V4aXQnO1xuXG5leHBvcnQgZW51bSBSZWFkeVN0YXR1cyB7XG4gIE9QRU5FRCA9IDEsXG4gIERPTkUgPSA0LFxufVxuZXhwb3J0IGNvbnN0IENvbXBvbmVudElkID0gMTAwMDE7IC8vIGFqYXhcbiIsIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgUmVwb3J0VHlwZXMgfSBmcm9tICcuL2NvbnN0YW50JztcbmNsYXNzIFJlcG9ydCB7XG4gIHByaXZhdGUgdXJsOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIGNvbGxlY3Rvcjogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgIHRoaXMudXJsID0gY29sbGVjdG9yICsgUmVwb3J0VHlwZXMuRVJST1I7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnRVJST1JTJykge1xuICAgICAgdGhpcy51cmwgPSBjb2xsZWN0b3IgKyBSZXBvcnRUeXBlcy5FUlJPUlM7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnU0VHTUVOVCcpIHtcbiAgICAgIHRoaXMudXJsID0gY29sbGVjdG9yICsgUmVwb3J0VHlwZXMuU0VHTUVOVDtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTRUdNRU5UUycpIHtcbiAgICAgIHRoaXMudXJsID0gY29sbGVjdG9yICsgUmVwb3J0VHlwZXMuU0VHTUVOVFM7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUEVSRicpIHtcbiAgICAgIHRoaXMudXJsID0gY29sbGVjdG9yICsgUmVwb3J0VHlwZXMuUEVSRjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VuZEJ5RmV0Y2goZGF0YTogYW55KSB7XG4gICAgZGVsZXRlIGRhdGEuY29sbGVjdG9yO1xuICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VuZFJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLnVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSk7XG5cbiAgICBmZXRjaChzZW5kUmVxdWVzdClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIG9uIGFwaSBzZXJ2ZXIhJyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEJ5WGhyKGRhdGE6IGFueSkge1xuICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICB4aHIub3BlbigncG9zdCcsIHRoaXMudXJsLCB0cnVlKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0ICYmIHhoci5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlcG9ydCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kQnlCZWFjb24oZGF0YTogYW55KSB7XG4gICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvci5zZW5kQmVhY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuYXZpZ2F0b3Iuc2VuZEJlYWNvbihcbiAgICAgICAgdGhpcy51cmwsXG4gICAgICAgIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShkYXRhKV0sIHtcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kQnlYaHIoZGF0YSk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlcG9ydDtcbiIsIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRXJyb3JJbmZvRmllbGRzLCBSZXBvcnRGaWVsZHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBSZXBvcnQgZnJvbSAnLi9yZXBvcnQnO1xuXG5jbGFzcyBUYXNrUXVldWUge1xuICBwcml2YXRlIHF1ZXVlczogKChFcnJvckluZm9GaWVsZHMgJiBSZXBvcnRGaWVsZHMpIHwgdW5kZWZpbmVkKVtdID0gW107XG4gIHByaXZhdGUgY29sbGVjdG9yOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgYWRkVGFzayhkYXRhOiBFcnJvckluZm9GaWVsZHMgJiBSZXBvcnRGaWVsZHMsIGNvbGxlY3Rvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWV1ZXMucHVzaChkYXRhKTtcbiAgICB0aGlzLmNvbGxlY3RvciA9IGNvbGxlY3RvcjtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlVGFza3MoKSB7XG4gICAgaWYgKCEodGhpcy5xdWV1ZXMgJiYgdGhpcy5xdWV1ZXMubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5ldyBSZXBvcnQoJ0VSUk9SUycsIHRoaXMuY29sbGVjdG9yKS5zZW5kQnlYaHIodGhpcy5xdWV1ZXMpO1xuICAgIHRoaXMucXVldWVzID0gW107XG4gIH1cblxuICBwdWJsaWMgZmluYWxseUZpcmVUYXNrcygpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnF1ZXVlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbmV3IFJlcG9ydCgnRVJST1JTJywgdGhpcy5jb2xsZWN0b3IpLnNlbmRCeUJlYWNvbih0aGlzLnF1ZXVlcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFRhc2tRdWV1ZSgpO1xuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgVGFzayBmcm9tICcuL3Rhc2snO1xuaW1wb3J0IHsgRXJyb3JzQ2F0ZWdvcnksIEdyYWRlVHlwZUVudW0gfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IEVycm9ySW5mb0ZpZWxkcywgUmVwb3J0RmllbGRzIH0gZnJvbSAnLi90eXBlcyc7XG5cbmxldCBwYWdlSGFzanNFcnJvcjogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbmxldCBpbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQ7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlIHtcbiAgcHVibGljIGxvZ0luZm86IEVycm9ySW5mb0ZpZWxkcyAmIFJlcG9ydEZpZWxkcyAmIHsgY29sbGVjdG9yOiBzdHJpbmcgfSA9IHtcbiAgICB1bmlxdWVJZDogJycsXG4gICAgc2VydmljZTogJycsXG4gICAgc2VydmljZVZlcnNpb246ICcnLFxuICAgIHBhZ2VQYXRoOiAnJyxcbiAgICBjYXRlZ29yeTogRXJyb3JzQ2F0ZWdvcnkuVU5LTk9XTl9FUlJPUixcbiAgICBncmFkZTogR3JhZGVUeXBlRW51bS5JTkZPLFxuICAgIGVycm9yVXJsOiAnJyxcbiAgICBsaW5lOiAwLFxuICAgIGNvbDogMCxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBmaXJzdFJlcG9ydGVkRXJyb3I6IGZhbHNlLFxuICAgIGNvbGxlY3RvcjogJycsXG4gIH07XG5cbiAgcHVibGljIHRyYWNlSW5mbyhsb2dJbmZvPzogRXJyb3JJbmZvRmllbGRzICYgUmVwb3J0RmllbGRzICYgeyBjb2xsZWN0b3I6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5sb2dJbmZvID0gbG9nSW5mbyB8fCB0aGlzLmxvZ0luZm87XG4gICAgY29uc3QgRXhjbHVkZUVycm9yVHlwZXM6IHN0cmluZ1tdID0gW1xuICAgICAgRXJyb3JzQ2F0ZWdvcnkuQUpBWF9FUlJPUixcbiAgICAgIEVycm9yc0NhdGVnb3J5LlJFU09VUkNFX0VSUk9SLFxuICAgICAgRXJyb3JzQ2F0ZWdvcnkuVU5LTk9XTl9FUlJPUixcbiAgICBdO1xuICAgIC8vIG1hcmsganMgZXJyb3IgcHZcbiAgICBpZiAoIXBhZ2VIYXNqc0Vycm9yW2xvY2F0aW9uLmhyZWZdICYmICFFeGNsdWRlRXJyb3JUeXBlcy5pbmNsdWRlcyh0aGlzLmxvZ0luZm8uY2F0ZWdvcnkpKSB7XG4gICAgICBwYWdlSGFzanNFcnJvciA9IHtcbiAgICAgICAgW2xvY2F0aW9uLmhyZWZdOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nSW5mby5maXJzdFJlcG9ydGVkRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0b3IgPSB0aGlzLmxvZ0luZm8uY29sbGVjdG9yO1xuXG4gICAgZGVsZXRlIHRoaXMubG9nSW5mby5jb2xsZWN0b3I7XG4gICAgVGFzay5hZGRUYXNrKHRoaXMubG9nSW5mbywgY29sbGVjdG9yKTtcbiAgICBUYXNrLmZpbmFsbHlGaXJlVGFza3MoKTtcbiAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gcmVwb3J0IGVycm9ycyB3aXRoaW4gMW1pblxuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgVGFzay5maXJlVGFza3MoKTtcbiAgICB9LCA2MDAwMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgdXVpZCBmcm9tICcuLi9zZXJ2aWNlcy91dWlkJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UnO1xuaW1wb3J0IHsgR3JhZGVUeXBlRW51bSwgRXJyb3JzQ2F0ZWdvcnkgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25zdGFudCc7XG5pbXBvcnQgeyBDdXN0b21SZXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuY2xhc3MgSlNFcnJvcnMgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBpbmZvT3B0OiBDdXN0b21SZXBvcnRPcHRpb25zID0ge1xuICAgIHNlcnZpY2U6ICcnLFxuICAgIHBhZ2VQYXRoOiAnJyxcbiAgICBzZXJ2aWNlVmVyc2lvbjogJycsXG4gIH07XG4gIHB1YmxpYyBoYW5kbGVFcnJvcnMob3B0aW9uczogQ3VzdG9tUmVwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuaW5mb09wdCA9IG9wdGlvbnM7XG4gICAgd2luZG93Lm9uZXJyb3IgPSAobWVzc2FnZSwgdXJsLCBsaW5lLCBjb2wsIGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmxvZ0luZm8gPSB7XG4gICAgICAgIC4uLnRoaXMuaW5mb09wdCxcbiAgICAgICAgdW5pcXVlSWQ6IHV1aWQoKSxcbiAgICAgICAgY2F0ZWdvcnk6IEVycm9yc0NhdGVnb3J5LkpTX0VSUk9SLFxuICAgICAgICBncmFkZTogR3JhZGVUeXBlRW51bS5FUlJPUixcbiAgICAgICAgZXJyb3JVcmw6IHVybCxcbiAgICAgICAgbGluZSxcbiAgICAgICAgY29sLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBjb2xsZWN0b3I6IG9wdGlvbnMuY29sbGVjdG9yLFxuICAgICAgICBzdGFjazogZXJyb3IgPyBlcnJvci5zdGFjayA6ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMudHJhY2VJbmZvKCk7XG4gICAgfTtcbiAgfVxuICBzZXRPcHRpb25zKG9wdDogQ3VzdG9tUmVwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuaW5mb09wdCA9IG9wdDtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbmV3IEpTRXJyb3JzKCk7XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHV1aWQgZnJvbSAnLi4vc2VydmljZXMvdXVpZCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9zZXJ2aWNlcy9iYXNlJztcbmltcG9ydCB7IEdyYWRlVHlwZUVudW0sIEVycm9yc0NhdGVnb3J5IH0gZnJvbSAnLi4vc2VydmljZXMvY29uc3RhbnQnO1xuaW1wb3J0IHsgQ3VzdG9tUmVwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuY2xhc3MgUHJvbWlzZUVycm9ycyBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIGluZm9PcHQ6IEN1c3RvbVJlcG9ydE9wdGlvbnMgPSB7XG4gICAgc2VydmljZTogJycsXG4gICAgcGFnZVBhdGg6ICcnLFxuICAgIHNlcnZpY2VWZXJzaW9uOiAnJyxcbiAgfTtcbiAgcHVibGljIGhhbmRsZUVycm9ycyhvcHRpb25zOiBDdXN0b21SZXBvcnRPcHRpb25zKSB7XG4gICAgdGhpcy5pbmZvT3B0ID0gb3B0aW9ucztcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdXJsID0gJyc7XG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlYXNvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucmVhc29uLmNvbmZpZyAmJiBldmVudC5yZWFzb24uY29uZmlnLnVybCkge1xuICAgICAgICAgIHVybCA9IGV2ZW50LnJlYXNvbi5jb25maWcudXJsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nSW5mbyA9IHtcbiAgICAgICAgICAuLi50aGlzLmluZm9PcHQsXG4gICAgICAgICAgdW5pcXVlSWQ6IHV1aWQoKSxcbiAgICAgICAgICBjYXRlZ29yeTogRXJyb3JzQ2F0ZWdvcnkuUFJPTUlTRV9FUlJPUixcbiAgICAgICAgICBncmFkZTogR3JhZGVUeXBlRW51bS5FUlJPUixcbiAgICAgICAgICBlcnJvclVybDogdXJsIHx8IGxvY2F0aW9uLmhyZWYsXG4gICAgICAgICAgbWVzc2FnZTogZXZlbnQucmVhc29uLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2s6IGV2ZW50LnJlYXNvbi5zdGFjayxcbiAgICAgICAgICBjb2xsZWN0b3I6IG9wdGlvbnMuY29sbGVjdG9yLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudHJhY2VJbmZvKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgc2V0T3B0aW9ucyhvcHQ6IEN1c3RvbVJlcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmluZm9PcHQgPSBvcHQ7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IG5ldyBQcm9taXNlRXJyb3JzKCk7XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHV1aWQgZnJvbSAnLi4vc2VydmljZXMvdXVpZCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9zZXJ2aWNlcy9iYXNlJztcbmltcG9ydCB7IEdyYWRlVHlwZUVudW0sIEVycm9yc0NhdGVnb3J5LCBSZXBvcnRUeXBlcyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnN0YW50JztcbmltcG9ydCB7IEN1c3RvbVJlcG9ydE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIEFqYXhFcnJvcnMgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBpbmZvT3B0OiBDdXN0b21SZXBvcnRPcHRpb25zID0ge1xuICAgIHNlcnZpY2U6ICcnLFxuICAgIHBhZ2VQYXRoOiAnJyxcbiAgICBzZXJ2aWNlVmVyc2lvbjogJycsXG4gIH07XG4gIC8vIGdldCBodHRwIGVycm9yIGluZm9cbiAgcHVibGljIGhhbmRsZUVycm9yKG9wdGlvbnM6IEN1c3RvbVJlcG9ydE9wdGlvbnMpIHtcbiAgICAvLyBYTUxIdHRwUmVxdWVzdCBPYmplY3RcbiAgICBpZiAoIXdpbmRvdy5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluZm9PcHQgPSBvcHRpb25zO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ3hoclJlYWR5U3RhdGVDaGFuZ2UnLFxuICAgICAgKGV2ZW50OiBDdXN0b21FdmVudDxYTUxIdHRwUmVxdWVzdCAmIHsgZ2V0UmVxdWVzdENvbmZpZzogYW55W10gfT4pID0+IHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmIChkZXRhaWwucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV0YWlsLmdldFJlcXVlc3RDb25maWdbMV0gPT09IG9wdGlvbnMuY29sbGVjdG9yICsgUmVwb3J0VHlwZXMuRVJST1JTKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXRhaWwuc3RhdHVzICE9PSAwICYmIGRldGFpbC5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0luZm8gPSB7XG4gICAgICAgICAgLi4udGhpcy5pbmZvT3B0LFxuICAgICAgICAgIHVuaXF1ZUlkOiB1dWlkKCksXG4gICAgICAgICAgY2F0ZWdvcnk6IEVycm9yc0NhdGVnb3J5LkFKQVhfRVJST1IsXG4gICAgICAgICAgZ3JhZGU6IEdyYWRlVHlwZUVudW0uRVJST1IsXG4gICAgICAgICAgZXJyb3JVcmw6IGRldGFpbC5nZXRSZXF1ZXN0Q29uZmlnWzFdLFxuICAgICAgICAgIG1lc3NhZ2U6IGBzdGF0dXM6ICR7ZGV0YWlsLnN0YXR1c307IHN0YXR1c1RleHQ6ICR7ZGV0YWlsLnN0YXR1c1RleHR9O2AsXG4gICAgICAgICAgY29sbGVjdG9yOiBvcHRpb25zLmNvbGxlY3RvcixcbiAgICAgICAgICBzdGFjazogZGV0YWlsLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50cmFjZUluZm8oKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICBzZXRPcHRpb25zKG9wdDogQ3VzdG9tUmVwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuaW5mb09wdCA9IG9wdDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQWpheEVycm9ycygpO1xuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB1dWlkIGZyb20gJy4uL3NlcnZpY2VzL3V1aWQnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vc2VydmljZXMvYmFzZSc7XG5pbXBvcnQgeyBHcmFkZVR5cGVFbnVtLCBFcnJvcnNDYXRlZ29yeSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnN0YW50JztcbmltcG9ydCB7IEN1c3RvbVJlcG9ydE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIFJlc291cmNlRXJyb3JzIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgaW5mb09wdDogQ3VzdG9tUmVwb3J0T3B0aW9ucyA9IHtcbiAgICBzZXJ2aWNlOiAnJyxcbiAgICBwYWdlUGF0aDogJycsXG4gICAgc2VydmljZVZlcnNpb246ICcnLFxuICB9O1xuICBwdWJsaWMgaGFuZGxlRXJyb3JzKG9wdGlvbnM6IEN1c3RvbVJlcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmluZm9PcHQgPSBvcHRpb25zO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQ6IGFueSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgaXNFbGVtZW50VGFyZ2V0ID1cbiAgICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2NyaXB0RWxlbWVudCB8fFxuICAgICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxMaW5rRWxlbWVudCB8fFxuICAgICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCFpc0VsZW1lbnRUYXJnZXQpIHtcbiAgICAgICAgICAvLyByZXR1cm4ganMgZXJyb3JcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dJbmZvID0ge1xuICAgICAgICAgIC4uLnRoaXMuaW5mb09wdCxcbiAgICAgICAgICB1bmlxdWVJZDogdXVpZCgpLFxuICAgICAgICAgIGNhdGVnb3J5OiBFcnJvcnNDYXRlZ29yeS5SRVNPVVJDRV9FUlJPUixcbiAgICAgICAgICBncmFkZTogdGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnID8gR3JhZGVUeXBlRW51bS5XQVJOSU5HIDogR3JhZGVUeXBlRW51bS5FUlJPUixcbiAgICAgICAgICBlcnJvclVybDogKHRhcmdldCBhcyBIVE1MU2NyaXB0RWxlbWVudCkuc3JjIHx8ICh0YXJnZXQgYXMgSFRNTExpbmtFbGVtZW50KS5ocmVmIHx8IGxvY2F0aW9uLmhyZWYsXG4gICAgICAgICAgbWVzc2FnZTogYGxvYWQgJHt0YXJnZXQudGFnTmFtZX0gcmVzb3VyY2UgZXJyb3JgLFxuICAgICAgICAgIGNvbGxlY3Rvcjogb3B0aW9ucy5jb2xsZWN0b3IsXG4gICAgICAgICAgc3RhY2s6IGBsb2FkICR7dGFyZ2V0LnRhZ05hbWV9IHJlc291cmNlIGVycm9yYCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50cmFjZUluZm8oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNldE9wdGlvbnMob3B0OiBDdXN0b21SZXBvcnRPcHRpb25zKSB7XG4gICAgdGhpcy5pbmZvT3B0ID0gb3B0O1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBuZXcgUmVzb3VyY2VFcnJvcnMoKTtcbiIsIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgdXVpZCBmcm9tICcuLi9zZXJ2aWNlcy91dWlkJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UnO1xuaW1wb3J0IHsgR3JhZGVUeXBlRW51bSwgRXJyb3JzQ2F0ZWdvcnkgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25zdGFudCc7XG5pbXBvcnQgeyBDdXN0b21SZXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBWdWVFcnJvcnMgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBpbmZvT3B0OiBDdXN0b21SZXBvcnRPcHRpb25zID0ge1xuICAgIHNlcnZpY2U6ICcnLFxuICAgIHBhZ2VQYXRoOiAnJyxcbiAgICBzZXJ2aWNlVmVyc2lvbjogJycsXG4gIH07XG4gIHB1YmxpYyBoYW5kbGVFcnJvcnMob3B0aW9uczogQ3VzdG9tUmVwb3J0T3B0aW9ucywgVnVlOiBhbnkpIHtcbiAgICB0aGlzLmluZm9PcHQgPSBvcHRpb25zO1xuICAgIGlmICghKFZ1ZSAmJiBWdWUuY29uZmlnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBWdWUuY29uZmlnLmVycm9ySGFuZGxlciA9IChlcnJvcjogRXJyb3IsIHZtOiBhbnksIGluZm86IHN0cmluZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2dJbmZvID0ge1xuICAgICAgICAgIC4uLnRoaXMuaW5mb09wdCxcbiAgICAgICAgICB1bmlxdWVJZDogdXVpZCgpLFxuICAgICAgICAgIGNhdGVnb3J5OiBFcnJvcnNDYXRlZ29yeS5WVUVfRVJST1IsXG4gICAgICAgICAgZ3JhZGU6IEdyYWRlVHlwZUVudW0uRVJST1IsXG4gICAgICAgICAgZXJyb3JVcmw6IGxvY2F0aW9uLmhyZWYsXG4gICAgICAgICAgbWVzc2FnZTogaW5mbyxcbiAgICAgICAgICBjb2xsZWN0b3I6IG9wdGlvbnMuY29sbGVjdG9yLFxuICAgICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50cmFjZUluZm8oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgc2V0T3B0aW9ucyhvcHQ6IEN1c3RvbVJlcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmluZm9PcHQgPSBvcHQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFZ1ZUVycm9ycygpO1xuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB1dWlkIGZyb20gJy4uL3NlcnZpY2VzL3V1aWQnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vc2VydmljZXMvYmFzZSc7XG5pbXBvcnQgeyBHcmFkZVR5cGVFbnVtLCBFcnJvcnNDYXRlZ29yeSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnN0YW50JztcbmltcG9ydCB7IEN1c3RvbVJlcG9ydE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIEZyYW1lRXJyb3JzIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgaW5mb09wdDogQ3VzdG9tUmVwb3J0T3B0aW9ucyA9IHtcbiAgICBzZXJ2aWNlOiAnJyxcbiAgICBwYWdlUGF0aDogJycsXG4gICAgc2VydmljZVZlcnNpb246ICcnLFxuICB9O1xuICBwdWJsaWMgaGFuZGxlRXJyb3JzKG9wdGlvbnM6IEN1c3RvbVJlcG9ydE9wdGlvbnMsIGVycm9yOiBFcnJvcikge1xuICAgIHRoaXMuaW5mb09wdCA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dJbmZvID0ge1xuICAgICAgLi4udGhpcy5pbmZvT3B0LFxuICAgICAgdW5pcXVlSWQ6IHV1aWQoKSxcbiAgICAgIGNhdGVnb3J5OiBFcnJvcnNDYXRlZ29yeS5KU19FUlJPUixcbiAgICAgIGdyYWRlOiBHcmFkZVR5cGVFbnVtLkVSUk9SLFxuICAgICAgZXJyb3JVcmw6IGVycm9yLm5hbWUgfHwgbG9jYXRpb24uaHJlZixcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBjb2xsZWN0b3I6IG9wdGlvbnMuY29sbGVjdG9yIHx8IGxvY2F0aW9uLm9yaWdpbixcbiAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VJbmZvKCk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IG5ldyBGcmFtZUVycm9ycygpO1xuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBJUGVyZkRldGFpbCB9IGZyb20gJy4vdHlwZSc7XG5jbGFzcyBQYWdlUGVyZiB7XG4gIHB1YmxpYyBnZXRQZXJmVGltaW5nKCk6IElQZXJmRGV0YWlsIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHsgdGltaW5nIH0gPSB3aW5kb3cucGVyZm9ybWFuY2UgYXMgUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nIHwgYW55OyAvLyBQZXJmb3JtYW5jZVRpbWluZ1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG50MlRpbWluZyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoJ25hdmlnYXRpb24nKVswXTtcblxuICAgICAgICBpZiAobnQyVGltaW5nKSB7XG4gICAgICAgICAgdGltaW5nID0gbnQyVGltaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgcmVkaXJlY3RUaW1lID0gMDtcblxuICAgICAgaWYgKHRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWRpcmVjdFRpbWUgPSBwYXJzZUludChTdHJpbmcodGltaW5nLmZldGNoU3RhcnQgLSB0aW1pbmcubmF2aWdhdGlvblN0YXJ0KSwgMTApO1xuICAgICAgfSBlbHNlIGlmICh0aW1pbmcucmVkaXJlY3RFbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWRpcmVjdFRpbWUgPSBwYXJzZUludChTdHJpbmcodGltaW5nLnJlZGlyZWN0RW5kIC0gdGltaW5nLnJlZGlyZWN0U3RhcnQpLCAxMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWRpcmVjdFRpbWUgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWRpcmVjdFRpbWUsXG4gICAgICAgIGRuc1RpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcuZG9tYWluTG9va3VwRW5kIC0gdGltaW5nLmRvbWFpbkxvb2t1cFN0YXJ0KSwgMTApLFxuICAgICAgICB0dGZiVGltZTogcGFyc2VJbnQoU3RyaW5nKHRpbWluZy5yZXNwb25zZVN0YXJ0IC0gdGltaW5nLnJlcXVlc3RTdGFydCksIDEwKSwgLy8gVGltZSB0byBGaXJzdCBCeXRlXG4gICAgICAgIHRjcFRpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcuY29ubmVjdEVuZCAtIHRpbWluZy5jb25uZWN0U3RhcnQpLCAxMCksXG4gICAgICAgIHRyYW5zVGltZTogcGFyc2VJbnQoU3RyaW5nKHRpbWluZy5yZXNwb25zZUVuZCAtIHRpbWluZy5yZXNwb25zZVN0YXJ0KSwgMTApLFxuICAgICAgICBkb21BbmFseXNpc1RpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcuZG9tSW50ZXJhY3RpdmUgLSB0aW1pbmcucmVzcG9uc2VFbmQpLCAxMCksXG4gICAgICAgIGZwdFRpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcucmVzcG9uc2VFbmQgLSB0aW1pbmcuZmV0Y2hTdGFydCksIDEwKSwgLy8gRmlyc3QgUGFpbnQgVGltZSBvciBCbGFuayBTY3JlZW4gVGltZVxuICAgICAgICBkb21SZWFkeVRpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIC0gdGltaW5nLmZldGNoU3RhcnQpLCAxMCksXG4gICAgICAgIGxvYWRQYWdlVGltZTogcGFyc2VJbnQoU3RyaW5nKHRpbWluZy5sb2FkRXZlbnRTdGFydCAtIHRpbWluZy5mZXRjaFN0YXJ0KSwgMTApLCAvLyBQYWdlIGZ1bGwgbG9hZCB0aW1lXG4gICAgICAgIC8vIFN5bmNocm9ub3VzIGxvYWQgcmVzb3VyY2VzIGluIHRoZSBwYWdlXG4gICAgICAgIHJlc1RpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcubG9hZEV2ZW50U3RhcnQgLSB0aW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kKSwgMTApLFxuICAgICAgICAvLyBPbmx5IHZhbGlkIGZvciBIVFRQU1xuICAgICAgICBzc2xUaW1lOlxuICAgICAgICAgIGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyAmJiB0aW1pbmcuc2VjdXJlQ29ubmVjdGlvblN0YXJ0ID4gMFxuICAgICAgICAgICAgPyBwYXJzZUludChTdHJpbmcodGltaW5nLmNvbm5lY3RFbmQgLSB0aW1pbmcuc2VjdXJlQ29ubmVjdGlvblN0YXJ0KSwgMTApXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgdHRsVGltZTogcGFyc2VJbnQoU3RyaW5nKHRpbWluZy5kb21JbnRlcmFjdGl2ZSAtIHRpbWluZy5mZXRjaFN0YXJ0KSwgMTApLCAvLyB0aW1lIHRvIGludGVyYWN0XG4gICAgICAgIGZpcnN0UGFja1RpbWU6IHBhcnNlSW50KFN0cmluZyh0aW1pbmcucmVzcG9uc2VTdGFydCAtIHRpbWluZy5kb21haW5Mb29rdXBTdGFydCksIDEwKSwgLy8gZmlyc3QgcGFjayB0aW1lXG4gICAgICAgIGZtcFRpbWU6IDAsIC8vIEZpcnN0IE1lYW5pbmdmdWwgUGFpbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFnZVBlcmY7XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IElDYWxTY29yZSwgRWxlbWVudExpc3QgfSBmcm9tICcuL3R5cGUnO1xuXG5jb25zdCBnZXRTdHlsZSA9IChlbGVtZW50OiBFbGVtZW50IHwgYW55LCBhdHRyOiBhbnkpID0+IHtcbiAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpW2F0dHJdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGVtZW50LmN1cnJlbnRTdHlsZVthdHRyXTtcbiAgfVxufTtcbi8vIGVsZW1lbnQgd2VpZ2h0IGZvciBjYWxjdWxhdGUgc2NvcmVcbmVudW0gRUxFX1dFSUdIVCB7XG4gIFNWRyA9IDIsXG4gIElNRyA9IDIsXG4gIENBTlZBUyA9IDQsXG4gIE9CSkVDVCA9IDQsXG4gIEVNQkVEID0gNCxcbiAgVklERU8gPSA0LFxufVxuXG5jb25zdCBTVEFSVF9USU1FOiBudW1iZXIgPSBwZXJmb3JtYW5jZS5ub3coKTtcbmNvbnN0IElHTk9SRV9UQUdfU0VUOiBzdHJpbmdbXSA9IFsnU0NSSVBUJywgJ1NUWUxFJywgJ01FVEEnLCAnSEVBRCcsICdMSU5LJ107XG5jb25zdCBMSU1JVDogbnVtYmVyID0gMzAwMDtcbmNvbnN0IFdXOiBudW1iZXIgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbmNvbnN0IFdIOiBudW1iZXIgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5jb25zdCBERUxBWTogbnVtYmVyID0gMjAwMDsgLy8gZm1wIHJldHJ5IGludGVydmFsXG5cbmNsYXNzIEZNUFRpbWluZyB7XG4gIHB1YmxpYyBmbXBUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHN0YXR1c0NvbGxlY3RvcjogQXJyYXk8eyB0aW1lOiBudW1iZXIgfT4gPSBbXTsgLy8gbm9kZXMgY2hhbmdlIHRpbWVcbiAgcHJpdmF0ZSBmbGFnOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG4gIHByaXZhdGUgY2FsbGJhY2tDb3VudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBlbnRyaWVzOiBhbnkgPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXBlcmZvcm1hbmNlIHx8ICFwZXJmb3JtYW5jZS5nZXRFbnRyaWVzKSB7XG4gICAgICBjb25zb2xlLmxvZygneW91ciBicm93c2VyIGRvIG5vdCBzdXBwb3J0IHBlcmZvcm1hbmNlLmdldEVudHJpZXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcbiAgfVxuICBwcml2YXRlIGdldEZpcnN0U25hcFNob3QoKSB7XG4gICAgY29uc3QgdGltZTogbnVtYmVyID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgJGJvZHk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICBpZiAoJGJvZHkpIHtcbiAgICAgIHRoaXMuc2V0VGFnKCRib2R5LCB0aGlzLmNhbGxiYWNrQ291bnQpO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1c0NvbGxlY3Rvci5wdXNoKHtcbiAgICAgIHRpbWUsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBpbml0T2JzZXJ2ZXIoKSB7XG4gICAgdGhpcy5nZXRGaXJzdFNuYXBTaG90KCk7XG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIHRoaXMuY2FsbGJhY2tDb3VudCArPSAxO1xuICAgICAgY29uc3QgdGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgY29uc3QgJGJvZHk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgIGlmICgkYm9keSkge1xuICAgICAgICB0aGlzLnNldFRhZygkYm9keSwgdGhpcy5jYWxsYmFja0NvdW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdHVzQ29sbGVjdG9yLnB1c2goe1xuICAgICAgICB0aW1lLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gb2JzZXJ2ZSBhbGwgY2hpbGQgbm9kZXNcbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5jYWxjdWxhdGVGaW5hbFNjb3JlKCk7XG4gIH1cbiAgcHJpdmF0ZSBjYWxjdWxhdGVGaW5hbFNjb3JlKCkge1xuICAgIGlmICghdGhpcy5mbGFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja05lZWRDYW5jZWwoU1RBUlRfVElNRSkpIHtcbiAgICAgIC8vIGNhbmNlbCBvYnNlcnZlciBmb3IgZG9tIGNoYW5nZVxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmZsYWcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0VHJlZVNjb3JlKGRvY3VtZW50LmJvZHkpO1xuICAgICAgbGV0IHRwOiBJQ2FsU2NvcmUgPSBudWxsO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlcy5kcHNzKSB7XG4gICAgICAgIGlmICh0cCAmJiB0cC5zdCkge1xuICAgICAgICAgIGlmICh0cC5zdCA8IGl0ZW0uc3QpIHtcbiAgICAgICAgICAgIHRwID0gaXRlbTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHAgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBHZXQgYWxsIG9mIHNvdXJlcyBsb2FkIHRpbWVcbiAgICAgIHBlcmZvcm1hbmNlLmdldEVudHJpZXMoKS5mb3JFYWNoKChpdGVtOiBQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cmllc1tpdGVtLm5hbWVdID0gaXRlbS5yZXNwb25zZUVuZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCF0cCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRFbHM6IEVsZW1lbnRMaXN0ID0gdGhpcy5maWx0ZXJSZXN1bHQodHAuZWxzKTtcbiAgICAgIGNvbnN0IGZtcFRpbWluZzogbnVtYmVyID0gdGhpcy5nZXRGbXBUaW1lKHJlc3VsdEVscyk7XG4gICAgICB0aGlzLmZtcFRpbWUgPSBmbXBUaW1pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUZpbmFsU2NvcmUoKTtcbiAgICAgIH0sIERFTEFZKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRGbXBUaW1lKHJlc3VsdEVsczogRWxlbWVudExpc3QpOiBudW1iZXIge1xuICAgIGxldCBydCA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3VsdEVscykge1xuICAgICAgbGV0IHRpbWU6IG51bWJlciA9IDA7XG4gICAgICBpZiAoaXRlbS53ZWlnaHQgPT09IDEpIHtcbiAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IHBhcnNlSW50KGl0ZW0uZWxlLmdldEF0dHJpYnV0ZSgnZm1wX2MnKSwgMTApO1xuICAgICAgICB0aW1lID0gdGhpcy5zdGF0dXNDb2xsZWN0b3JbaW5kZXhdICYmIHRoaXMuc3RhdHVzQ29sbGVjdG9yW2luZGV4XS50aW1lO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLndlaWdodCA9PT0gMikge1xuICAgICAgICBpZiAoaXRlbS5lbGUudGFnTmFtZSA9PT0gJ0lNRycpIHtcbiAgICAgICAgICB0aW1lID0gdGhpcy5lbnRyaWVzWyhpdGVtLmVsZSBhcyBIVE1MSW1hZ2VFbGVtZW50KS5zcmNdO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZWxlLnRhZ05hbWUgPT09ICdTVkcnKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IHBhcnNlSW50KGl0ZW0uZWxlLmdldEF0dHJpYnV0ZSgnZm1wX2MnKSwgMTApO1xuICAgICAgICAgIHRpbWUgPSB0aGlzLnN0YXR1c0NvbGxlY3RvcltpbmRleF0gJiYgdGhpcy5zdGF0dXNDb2xsZWN0b3JbaW5kZXhdLnRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBnZXRTdHlsZShpdGVtLmVsZSwgJ2JhY2tncm91bmQtaW1hZ2UnKS5tYXRjaCgvdXJsXFwoXFxcIiguKj8pXFxcIlxcKS8pO1xuICAgICAgICAgIGxldCB1cmw6IHN0cmluZyA9ICcnO1xuICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgICAgICAgICAgdXJsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBpZiAoIXVybC5pbmNsdWRlcygnaHR0cCcpKSB7XG4gICAgICAgICAgICAgIHVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRpbWUgPSB0aGlzLmVudHJpZXNbdXJsXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLndlaWdodCA9PT0gNCkge1xuICAgICAgICBpZiAoaXRlbS5lbGUudGFnTmFtZSA9PT0gJ0NBTlZBUycpIHtcbiAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gcGFyc2VJbnQoaXRlbS5lbGUuZ2V0QXR0cmlidXRlKCdmbXBfYycpLCAxMCk7XG4gICAgICAgICAgdGltZSA9IHRoaXMuc3RhdHVzQ29sbGVjdG9yW2luZGV4XSAmJiB0aGlzLnN0YXR1c0NvbGxlY3RvcltpbmRleF0udGltZTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmVsZS50YWdOYW1lID09PSAnVklERU8nKSB7XG4gICAgICAgICAgdGltZSA9IHRoaXMuZW50cmllc1soaXRlbS5lbGUgYXMgSFRNTFZpZGVvRWxlbWVudCkuc3JjXTtcbiAgICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHRpbWUgPSB0aGlzLmVudHJpZXNbKGl0ZW0uZWxlIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnBvc3Rlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRpbWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRpbWUgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHJ0IDwgdGltZSkge1xuICAgICAgICBydCA9IHRpbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydDtcbiAgfVxuICAvKipcbiAgICogVGhlIG5vZGVzIHdpdGggdGhlIGhpZ2hlc3Qgc2NvcmUgaW4gdGhlIHZpc2libGUgYXJlYSBhcmUgY29sbGVjdGVkIGFuZCB0aGUgYXZlcmFnZSB2YWx1ZSBpcyB0YWtlbixcbiAgICogYW5kIHRoZSBsb3cgc2NvcmUgb25lcyBhcmUgZWxpbWluYXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJSZXN1bHQoZWxzOiBFbGVtZW50TGlzdCk6IEVsZW1lbnRMaXN0IHtcbiAgICBpZiAoZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGVscztcbiAgICB9XG4gICAgbGV0IHN1bTogbnVtYmVyID0gMDtcbiAgICBlbHMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBzdW0gKz0gaXRlbS5zdDtcbiAgICB9KTtcbiAgICBjb25zdCBhdmc6IG51bWJlciA9IHN1bSAvIGVscy5sZW5ndGg7XG4gICAgcmV0dXJuIGVscy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW0uc3QgPiBhdmc7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja05lZWRDYW5jZWwoc3RhcnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRpbWU6IG51bWJlciA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgY29uc3QgbGFzdENhbFRpbWU6IG51bWJlciA9XG4gICAgICB0aGlzLnN0YXR1c0NvbGxlY3Rvci5sZW5ndGggPiAwID8gdGhpcy5zdGF0dXNDb2xsZWN0b3JbdGhpcy5zdGF0dXNDb2xsZWN0b3IubGVuZ3RoIC0gMV0udGltZSA6IDA7XG4gICAgcmV0dXJuIHRpbWUgPiBMSU1JVCB8fCB0aW1lIC0gbGFzdENhbFRpbWUgPiAxMDAwO1xuICB9XG4gIHByaXZhdGUgZ2V0VHJlZVNjb3JlKG5vZGU6IEVsZW1lbnQpOiBJQ2FsU2NvcmUgfCBhbnkge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBkcHNzID0gW107XG4gICAgY29uc3QgY2hpbGRyZW46IGFueSA9IG5vZGUuY2hpbGRyZW47XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgLy8gT25seSBjYWxjdWxhdGUgbWFya2VkIGVsZW1lbnRzXG4gICAgICBpZiAoIWNoaWxkLmdldEF0dHJpYnV0ZSgnZm1wX2MnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHMgPSB0aGlzLmdldFRyZWVTY29yZShjaGlsZCk7XG4gICAgICBpZiAocy5zdCkge1xuICAgICAgICBkcHNzLnB1c2gocyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FsY2F1bHRlR3JhZGVzKG5vZGUsIGRwc3MpO1xuICB9XG4gIHByaXZhdGUgY2FsY2F1bHRlR3JhZGVzKGVsZTogRWxlbWVudCwgZHBzczogSUNhbFNjb3JlW10pOiBJQ2FsU2NvcmUge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wIH0gPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGlzSW5WaWV3UG9ydDogYm9vbGVhbiA9IHRydWU7XG4gICAgaWYgKFdIIDwgdG9wIHx8IFdXIDwgbGVmdCkge1xuICAgICAgaXNJblZpZXdQb3J0ID0gZmFsc2U7XG4gICAgfVxuICAgIGxldCBzZHA6IG51bWJlciA9IDA7XG4gICAgZHBzcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIHNkcCArPSBpdGVtLnN0O1xuICAgIH0pO1xuICAgIGxldCB3ZWlnaHQ6IG51bWJlciA9IE51bWJlcihFTEVfV0VJR0hUW2VsZS50YWdOYW1lIGFzIGFueV0pIHx8IDE7XG4gICAgLy8gSWYgdGhlcmUgaXMgYSBjb21tb24gZWxlbWVudCBvZiB0aGUgYmFja2dyb3VuZCBpbWFnZSwgaXQgaXMgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcbiAgICBpZiAoXG4gICAgICB3ZWlnaHQgPT09IDEgJiZcbiAgICAgIGdldFN0eWxlKGVsZSwgJ2JhY2tncm91bmQtaW1hZ2UnKSAmJlxuICAgICAgZ2V0U3R5bGUoZWxlLCAnYmFja2dyb3VuZC1pbWFnZScpICE9PSAnaW5pdGlhbCcgJiZcbiAgICAgIGdldFN0eWxlKGVsZSwgJ2JhY2tncm91bmQtaW1hZ2UnKSAhPT0gJ25vbmUnXG4gICAgKSB7XG4gICAgICB3ZWlnaHQgPSBFTEVfV0VJR0hULklNRztcbiAgICB9XG4gICAgLy8gc2NvcmUgPSB0aGUgYXJlYSBvZiBlbGVtZW50XG4gICAgbGV0IHN0OiBudW1iZXIgPSBpc0luVmlld1BvcnQgPyB3aWR0aCAqIGhlaWdodCAqIHdlaWdodCA6IDA7XG4gICAgbGV0IGVscyA9IFt7IGVsZSwgc3QsIHdlaWdodCB9XTtcbiAgICBjb25zdCByb290ID0gZWxlO1xuICAgIC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIHZpZXdwb3J0XG4gICAgY29uc3QgYXJlYVBlcmNlbnQgPSB0aGlzLmNhbGN1bGF0ZUFyZWFQYXJlbnQoZWxlKTtcbiAgICAvLyBJZiB0aGUgc3VtIG9mIHRoZSBjaGlsZCdzIHdlaWdodHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYXJlbnQncyB0cnVlIHdlaWdodFxuICAgIGlmIChzZHAgPiBzdCAqIGFyZWFQZXJjZW50IHx8IGFyZWFQZXJjZW50ID09PSAwKSB7XG4gICAgICBzdCA9IHNkcDtcbiAgICAgIGVscyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRwc3MpIHtcbiAgICAgICAgZWxzID0gZWxzLmNvbmNhdChpdGVtLmVscyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkcHNzLFxuICAgICAgc3QsXG4gICAgICBlbHMsXG4gICAgICByb290LFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBcmVhUGFyZW50KGVsZTogRWxlbWVudCk6IG51bWJlciB7XG4gICAgY29uc3QgeyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHdpZHRoLCBoZWlnaHQgfSA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3aW5MZWZ0OiBudW1iZXIgPSAwO1xuICAgIGNvbnN0IHdpblRvcDogbnVtYmVyID0gMDtcbiAgICBjb25zdCB3aW5SaWdodDogbnVtYmVyID0gV1c7XG4gICAgY29uc3Qgd2luQm90dG9tOiBudW1iZXIgPSBXSDtcbiAgICBjb25zdCBvdmVybGFwWCA9IHJpZ2h0IC0gbGVmdCArICh3aW5SaWdodCAtIHdpbkxlZnQpIC0gKE1hdGgubWF4KHJpZ2h0LCB3aW5SaWdodCkgLSBNYXRoLm1pbihsZWZ0LCB3aW5MZWZ0KSk7XG4gICAgY29uc3Qgb3ZlcmxhcFkgPSBib3R0b20gLSB0b3AgKyAod2luQm90dG9tIC0gd2luVG9wKSAtIChNYXRoLm1heChib3R0b20sIHdpbkJvdHRvbSkgLSBNYXRoLm1pbih0b3AsIHdpblRvcCkpO1xuXG4gICAgaWYgKG92ZXJsYXBYIDw9IDAgfHwgb3ZlcmxhcFkgPD0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiAob3ZlcmxhcFggKiBvdmVybGFwWSkgLyAod2lkdGggKiBoZWlnaHQpO1xuICB9XG4gIC8vIERlcHRoIGZpcnN0IHRyYXZlcnNhbCB0byBtYXJrIG5vZGVzXG4gIHByaXZhdGUgc2V0VGFnKHRhcmdldDogRWxlbWVudCwgY2FsbGJhY2tDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGFnTmFtZTogc3RyaW5nID0gdGFyZ2V0LnRhZ05hbWU7XG4gICAgaWYgKElHTk9SRV9UQUdfU0VULmluZGV4T2YodGFnTmFtZSkgPT09IC0xKSB7XG4gICAgICBjb25zdCAkY2hpbGRyZW46IEhUTUxDb2xsZWN0aW9uID0gdGFyZ2V0LmNoaWxkcmVuO1xuICAgICAgaWYgKCRjaGlsZHJlbiAmJiAkY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gJGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgJGNoaWxkOiBFbGVtZW50ID0gJGNoaWxkcmVuW2ldO1xuICAgICAgICAgIGNvbnN0IGhhc1NldFRhZyA9ICRjaGlsZC5nZXRBdHRyaWJ1dGUoJ2ZtcF9jJykgIT09IG51bGw7XG4gICAgICAgICAgLy8gSWYgaXQgaXMgbm90IG1hcmtlZCwgd2hldGhlciB0aGUgbWFya2luZyBjb25kaXRpb24gaXMgbWV0IGlzIGRldGVjdGVkXG4gICAgICAgICAgaWYgKCFoYXNTZXRUYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSAkY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZiAoV0ggPCB0b3AgfHwgV1cgPCBsZWZ0IHx8IHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRjaGlsZC5zZXRBdHRyaWJ1dGUoJ2ZtcF9jJywgYCR7Y2FsbGJhY2tDb3VudH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZXRUYWcoJGNoaWxkLCBjYWxsYmFja0NvdW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGTVBUaW1pbmc7XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ3VzdG9tT3B0aW9uc1R5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgUmVwb3J0IGZyb20gJy4uL3NlcnZpY2VzL3JlcG9ydCc7XG5pbXBvcnQgcGFnZVBlcmYgZnJvbSAnLi9wZXJmJztcbmltcG9ydCBGTVAgZnJvbSAnLi9mbXAnO1xuaW1wb3J0IHsgSVBlcmZEZXRhaWwgfSBmcm9tICcuL3R5cGUnO1xuXG5jbGFzcyBUcmFjZVBlcmYge1xuICBwcml2YXRlIHBlcmZDb25maWcgPSB7XG4gICAgcGVyZkRldGFpbDoge30sXG4gIH0gYXMgeyBwZXJmRGV0YWlsOiBJUGVyZkRldGFpbCB9O1xuXG4gIHB1YmxpYyBnZXRQZXJmKG9wdGlvbnM6IEN1c3RvbU9wdGlvbnNUeXBlKSB7XG4gICAgdGhpcy5yZWNvcmRQZXJmKG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLmVuYWJsZVNQQSkge1xuICAgICAgLy8gaGFzaCByb3V0ZXJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnaGFzaGNoYW5nZScsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlY29yZFBlcmYob3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVjb3JkUGVyZihvcHRpb25zOiBDdXN0b21PcHRpb25zVHlwZSkge1xuICAgIGxldCBmbXA6IHsgZm1wVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkIH0gPSB7IGZtcFRpbWU6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChvcHRpb25zLmF1dG9UcmFjZVBlcmYgJiYgb3B0aW9ucy51c2VGbXApIHtcbiAgICAgIGZtcCA9IGF3YWl0IG5ldyBGTVAoKTtcbiAgICB9XG4gICAgLy8gYXV0byByZXBvcnQgcHYgYW5kIHBlcmYgZGF0YVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1RyYWNlUGVyZikge1xuICAgICAgICB0aGlzLnBlcmZDb25maWcucGVyZkRldGFpbCA9IG5ldyBwYWdlUGVyZigpLmdldFBlcmZUaW1pbmcoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBlcmZEZXRhaWwgPSBvcHRpb25zLmF1dG9UcmFjZVBlcmZcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi50aGlzLnBlcmZDb25maWcucGVyZkRldGFpbCxcbiAgICAgICAgICAgIGZtcFRpbWU6IG9wdGlvbnMudXNlRm1wID8gcGFyc2VJbnQoU3RyaW5nKGZtcC5mbXBUaW1lKSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwZXJmSW5mbyA9IHtcbiAgICAgICAgLi4ucGVyZkRldGFpbCxcbiAgICAgICAgcGFnZVBhdGg6IG9wdGlvbnMucGFnZVBhdGgsXG4gICAgICAgIHNlcnZpY2VWZXJzaW9uOiBvcHRpb25zLnNlcnZpY2VWZXJzaW9uLFxuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UsXG4gICAgICB9O1xuICAgICAgbmV3IFJlcG9ydCgnUEVSRicsIG9wdGlvbnMuY29sbGVjdG9yKS5zZW5kQnlYaHIocGVyZkluZm8pO1xuICAgICAgLy8gY2xlYXIgcGVyZiBkYXRhXG4gICAgICB0aGlzLmNsZWFyUGVyZigpO1xuICAgIH0sIDYwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBlcmYoKSB7XG4gICAgaWYgKCEod2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhclJlc291cmNlVGltaW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLmNsZWFyUmVzb3VyY2VUaW1pbmdzKCk7XG4gICAgdGhpcy5wZXJmQ29uZmlnID0ge1xuICAgICAgcGVyZkRldGFpbDoge30sXG4gICAgfSBhcyB7IHBlcmZEZXRhaWw6IElQZXJmRGV0YWlsIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFRyYWNlUGVyZigpO1xuIiwiLyoqXG4gKiAgYmFzZTY0LnRzXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgMy1DbGF1c2UgTGljZW5zZS5cbiAqICAgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqXG4gKiAgUmVmZXJlbmNlczpcbiAqICAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0XG4gKlxuICogQGF1dGhvciBEYW4gS29nYWkgKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaSlcbiAqL1xuY29uc3QgdmVyc2lvbiA9ICczLjcuNSc7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBsb3dlcmNhc2UgYHZlcnNpb25gLlxuICovXG5jb25zdCBWRVJTSU9OID0gdmVyc2lvbjtcbmNvbnN0IF9oYXNhdG9iID0gdHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbic7XG5jb25zdCBfaGFzYnRvYSA9IHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nO1xuY29uc3QgX2hhc0J1ZmZlciA9IHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbic7XG5jb25zdCBfVEQgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDtcbmNvbnN0IF9URSA9IHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RW5jb2RlcigpIDogdW5kZWZpbmVkO1xuY29uc3QgYjY0Y2ggPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuY29uc3QgYjY0Y2hzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYjY0Y2gpO1xuY29uc3QgYjY0dGFiID0gKChhKSA9PiB7XG4gICAgbGV0IHRhYiA9IHt9O1xuICAgIGEuZm9yRWFjaCgoYywgaSkgPT4gdGFiW2NdID0gaSk7XG4gICAgcmV0dXJuIHRhYjtcbn0pKGI2NGNocyk7XG5jb25zdCBiNjRyZSA9IC9eKD86W0EtWmEtelxcZCtcXC9dezR9KSo/KD86W0EtWmEtelxcZCtcXC9dezJ9KD86PT0pP3xbQS1aYS16XFxkK1xcL117M309Pyk/JC87XG5jb25zdCBfZnJvbUNDID0gU3RyaW5nLmZyb21DaGFyQ29kZS5iaW5kKFN0cmluZyk7XG5jb25zdCBfVThBZnJvbSA9IHR5cGVvZiBVaW50OEFycmF5LmZyb20gPT09ICdmdW5jdGlvbidcbiAgICA/IFVpbnQ4QXJyYXkuZnJvbS5iaW5kKFVpbnQ4QXJyYXkpXG4gICAgOiAoaXQpID0+IG5ldyBVaW50OEFycmF5KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0LCAwKSk7XG5jb25zdCBfbWtVcmlTYWZlID0gKHNyYykgPT4gc3JjXG4gICAgLnJlcGxhY2UoLz0vZywgJycpLnJlcGxhY2UoL1srXFwvXS9nLCAobTApID0+IG0wID09ICcrJyA/ICctJyA6ICdfJyk7XG5jb25zdCBfdGlkeUI2NCA9IChzKSA9PiBzLnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXS9nLCAnJyk7XG4vKipcbiAqIHBvbHlmaWxsIHZlcnNpb24gb2YgYGJ0b2FgXG4gKi9cbmNvbnN0IGJ0b2FQb2x5ZmlsbCA9IChiaW4pID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZygncG9seWZpbGxlZCcpO1xuICAgIGxldCB1MzIsIGMwLCBjMSwgYzIsIGFzYyA9ICcnO1xuICAgIGNvbnN0IHBhZCA9IGJpbi5sZW5ndGggJSAzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluLmxlbmd0aDspIHtcbiAgICAgICAgaWYgKChjMCA9IGJpbi5jaGFyQ29kZUF0KGkrKykpID4gMjU1IHx8XG4gICAgICAgICAgICAoYzEgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fFxuICAgICAgICAgICAgKGMyID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGNoYXJhY3RlciBmb3VuZCcpO1xuICAgICAgICB1MzIgPSAoYzAgPDwgMTYpIHwgKGMxIDw8IDgpIHwgYzI7XG4gICAgICAgIGFzYyArPSBiNjRjaHNbdTMyID4+IDE4ICYgNjNdXG4gICAgICAgICAgICArIGI2NGNoc1t1MzIgPj4gMTIgJiA2M11cbiAgICAgICAgICAgICsgYjY0Y2hzW3UzMiA+PiA2ICYgNjNdXG4gICAgICAgICAgICArIGI2NGNoc1t1MzIgJiA2M107XG4gICAgfVxuICAgIHJldHVybiBwYWQgPyBhc2Muc2xpY2UoMCwgcGFkIC0gMykgKyBcIj09PVwiLnN1YnN0cmluZyhwYWQpIDogYXNjO1xufTtcbi8qKlxuICogZG9lcyB3aGF0IGB3aW5kb3cuYnRvYWAgb2Ygd2ViIGJyb3dzZXJzIGRvLlxuICogQHBhcmFtIHtTdHJpbmd9IGJpbiBiaW5hcnkgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqL1xuY29uc3QgX2J0b2EgPSBfaGFzYnRvYSA/IChiaW4pID0+IGJ0b2EoYmluKVxuICAgIDogX2hhc0J1ZmZlciA/IChiaW4pID0+IEJ1ZmZlci5mcm9tKGJpbiwgJ2JpbmFyeScpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICA6IGJ0b2FQb2x5ZmlsbDtcbmNvbnN0IF9mcm9tVWludDhBcnJheSA9IF9oYXNCdWZmZXJcbiAgICA/ICh1OGEpID0+IEJ1ZmZlci5mcm9tKHU4YSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgOiAodThhKSA9PiB7XG4gICAgICAgIC8vIGNmLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjcxMDAwMS9ob3ctdG8tY29udmVydC11aW50OC1hcnJheS10by1iYXNlNjQtZW5jb2RlZC1zdHJpbmcvMTI3MTMzMjYjMTI3MTMzMjZcbiAgICAgICAgY29uc3QgbWF4YXJncyA9IDB4MTAwMDtcbiAgICAgICAgbGV0IHN0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB1OGEubGVuZ3RoOyBpIDwgbDsgaSArPSBtYXhhcmdzKSB7XG4gICAgICAgICAgICBzdHJzLnB1c2goX2Zyb21DQy5hcHBseShudWxsLCB1OGEuc3ViYXJyYXkoaSwgaSArIG1heGFyZ3MpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9idG9hKHN0cnMuam9pbignJykpO1xuICAgIH07XG4vKipcbiAqIGNvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBVUkwtYW5kLWZpbGVuYW1lLXNhZmUgYSBsYSBSRkM0NjQ4IMKnNVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICovXG5jb25zdCBmcm9tVWludDhBcnJheSA9ICh1OGEsIHVybHNhZmUgPSBmYWxzZSkgPT4gdXJsc2FmZSA/IF9ta1VyaVNhZmUoX2Zyb21VaW50OEFycmF5KHU4YSkpIDogX2Zyb21VaW50OEFycmF5KHU4YSk7XG4vLyBUaGlzIHRyaWNrIGlzIGZvdW5kIGJyb2tlbiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMzBcbi8vIGNvbnN0IHV0b2IgPSAoc3JjOiBzdHJpbmcpID0+IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzcmMpKTtcbi8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHBcbmNvbnN0IGNiX3V0b2IgPSAoYykgPT4ge1xuICAgIGlmIChjLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdmFyIGNjID0gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICByZXR1cm4gY2MgPCAweDgwID8gY1xuICAgICAgICAgICAgOiBjYyA8IDB4ODAwID8gKF9mcm9tQ0MoMHhjMCB8IChjYyA+Pj4gNikpXG4gICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpXG4gICAgICAgICAgICAgICAgOiAoX2Zyb21DQygweGUwIHwgKChjYyA+Pj4gMTIpICYgMHgwZikpXG4gICAgICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSlcbiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNjID0gMHgxMDAwMFxuICAgICAgICAgICAgKyAoYy5jaGFyQ29kZUF0KDApIC0gMHhEODAwKSAqIDB4NDAwXG4gICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMSkgLSAweERDMDApO1xuICAgICAgICByZXR1cm4gKF9mcm9tQ0MoMHhmMCB8ICgoY2MgPj4+IDE4KSAmIDB4MDcpKVxuICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiAxMikgJiAweDNmKSlcbiAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSlcbiAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKTtcbiAgICB9XG59O1xuY29uc3QgcmVfdXRvYiA9IC9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZGXXxbXlxceDAwLVxceDdGXS9nO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LlxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyBVVEYtOCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi0xNiBzdHJpbmdcbiAqL1xuY29uc3QgdXRvYiA9ICh1KSA9PiB1LnJlcGxhY2UocmVfdXRvYiwgY2JfdXRvYik7XG4vL1xuY29uc3QgX2VuY29kZSA9IF9oYXNCdWZmZXJcbiAgICA/IChzKSA9PiBCdWZmZXIuZnJvbShzLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIDogX1RFXG4gICAgICAgID8gKHMpID0+IF9mcm9tVWludDhBcnJheShfVEUuZW5jb2RlKHMpKVxuICAgICAgICA6IChzKSA9PiBfYnRvYSh1dG9iKHMpKTtcbi8qKlxuICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBhIEJhc2U2NCBzdHJpbmcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBpZiBgdHJ1ZWAgbWFrZSB0aGUgcmVzdWx0IFVSTC1zYWZlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gKi9cbmNvbnN0IGVuY29kZSA9IChzcmMsIHVybHNhZmUgPSBmYWxzZSkgPT4gdXJsc2FmZVxuICAgID8gX21rVXJpU2FmZShfZW5jb2RlKHNyYykpXG4gICAgOiBfZW5jb2RlKHNyYyk7XG4vKipcbiAqIGNvbnZlcnRzIGEgVVRGLTgtZW5jb2RlZCBzdHJpbmcgdG8gVVJMLXNhZmUgQmFzZTY0IFJGQzQ2NDggwqc1LlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICovXG5jb25zdCBlbmNvZGVVUkkgPSAoc3JjKSA9PiBlbmNvZGUoc3JjLCB0cnVlKTtcbi8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMFxuLy8gY29uc3QgYnRvdSA9IChzcmM6IHN0cmluZykgPT4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzcmMpKTtcbi8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHBcbmNvbnN0IHJlX2J0b3UgPSAvW1xceEMwLVxceERGXVtcXHg4MC1cXHhCRl18W1xceEUwLVxceEVGXVtcXHg4MC1cXHhCRl17Mn18W1xceEYwLVxceEY3XVtcXHg4MC1cXHhCRl17M30vZztcbmNvbnN0IGNiX2J0b3UgPSAoY2NjYykgPT4ge1xuICAgIHN3aXRjaCAoY2NjYy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgdmFyIGNwID0gKCgweDA3ICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxOClcbiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgMTIpXG4gICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMikpIDw8IDYpXG4gICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgzKSksIG9mZnNldCA9IGNwIC0gMHgxMDAwMDtcbiAgICAgICAgICAgIHJldHVybiAoX2Zyb21DQygob2Zmc2V0ID4+PiAxMCkgKyAweEQ4MDApXG4gICAgICAgICAgICAgICAgKyBfZnJvbUNDKChvZmZzZXQgJiAweDNGRikgKyAweERDMDApKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIF9mcm9tQ0MoKCgweDBmICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxMilcbiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgNilcbiAgICAgICAgICAgICAgICB8ICgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gX2Zyb21DQygoKDB4MWYgJiBjY2NjLmNoYXJDb2RlQXQoMCkpIDw8IDYpXG4gICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkpO1xuICAgIH1cbn07XG4vKipcbiAqIEBkZXByZWNhdGVkIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi0xNiBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICovXG5jb25zdCBidG91ID0gKGIpID0+IGIucmVwbGFjZShyZV9idG91LCBjYl9idG91KTtcbi8qKlxuICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYXRvYmBcbiAqL1xuY29uc3QgYXRvYlBvbHlmaWxsID0gKGFzYykgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgYXNjID0gYXNjLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGlmICghYjY0cmUudGVzdChhc2MpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgYmFzZTY0LicpO1xuICAgIGFzYyArPSAnPT0nLnNsaWNlKDIgLSAoYXNjLmxlbmd0aCAmIDMpKTtcbiAgICBsZXQgdTI0LCBiaW4gPSAnJywgcjEsIHIyO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNjLmxlbmd0aDspIHtcbiAgICAgICAgdTI0ID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMThcbiAgICAgICAgICAgIHwgYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMTJcbiAgICAgICAgICAgIHwgKHIxID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pIDw8IDZcbiAgICAgICAgICAgIHwgKHIyID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pO1xuICAgICAgICBiaW4gKz0gcjEgPT09IDY0ID8gX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUpXG4gICAgICAgICAgICA6IHIyID09PSA2NCA/IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSlcbiAgICAgICAgICAgICAgICA6IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSwgdTI0ICYgMjU1KTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbjtcbn07XG4vKipcbiAqIGRvZXMgd2hhdCBgd2luZG93LmF0b2JgIG9mIHdlYiBicm93c2VycyBkby5cbiAqIEBwYXJhbSB7U3RyaW5nfSBhc2MgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiaW5hcnkgc3RyaW5nXG4gKi9cbmNvbnN0IF9hdG9iID0gX2hhc2F0b2IgPyAoYXNjKSA9PiBhdG9iKF90aWR5QjY0KGFzYykpXG4gICAgOiBfaGFzQnVmZmVyID8gKGFzYykgPT4gQnVmZmVyLmZyb20oYXNjLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpXG4gICAgICAgIDogYXRvYlBvbHlmaWxsO1xuLy9cbmNvbnN0IF90b1VpbnQ4QXJyYXkgPSBfaGFzQnVmZmVyXG4gICAgPyAoYSkgPT4gX1U4QWZyb20oQnVmZmVyLmZyb20oYSwgJ2Jhc2U2NCcpKVxuICAgIDogKGEpID0+IF9VOEFmcm9tKF9hdG9iKGEpLnNwbGl0KCcnKS5tYXAoYyA9PiBjLmNoYXJDb2RlQXQoMCkpKTtcbi8qKlxuICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVWludDhBcnJheS5cbiAqL1xuY29uc3QgdG9VaW50OEFycmF5ID0gKGEpID0+IF90b1VpbnQ4QXJyYXkoX3VuVVJJKGEpKTtcbi8vXG5jb25zdCBfZGVjb2RlID0gX2hhc0J1ZmZlclxuICAgID8gKGEpID0+IEJ1ZmZlci5mcm9tKGEsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpXG4gICAgOiBfVERcbiAgICAgICAgPyAoYSkgPT4gX1RELmRlY29kZShfdG9VaW50OEFycmF5KGEpKVxuICAgICAgICA6IChhKSA9PiBidG91KF9hdG9iKGEpKTtcbmNvbnN0IF91blVSSSA9IChhKSA9PiBfdGlkeUI2NChhLnJlcGxhY2UoL1stX10vZywgKG0wKSA9PiBtMCA9PSAnLScgPyAnKycgOiAnLycpKTtcbi8qKlxuICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVVRGLTggc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHNyYyBCYXNlNjQgc3RyaW5nLiAgQm90aCBub3JtYWwgYW5kIFVSTC1zYWZlIGFyZSBzdXBwb3J0ZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICovXG5jb25zdCBkZWNvZGUgPSAoc3JjKSA9PiBfZGVjb2RlKF91blVSSShzcmMpKTtcbi8qKlxuICogY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIEJhc2U2NCBzdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgYSB2YWx1ZSB0byBjaGVja1xuICAqL1xuY29uc3QgaXNWYWxpZCA9IChzcmMpID0+IHtcbiAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzID0gc3JjLnJlcGxhY2UoL1xccysvZywgJycpLnJlcGxhY2UoLz17MCwyfSQvLCAnJyk7XG4gICAgcmV0dXJuICEvW15cXHMwLTlhLXpBLVpcXCsvXS8udGVzdChzKSB8fCAhL1teXFxzMC05YS16QS1aXFwtX10vLnRlc3Qocyk7XG59O1xuLy9cbmNvbnN0IF9ub0VudW0gPSAodikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2LCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH07XG59O1xuLyoqXG4gKiBleHRlbmQgU3RyaW5nLnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHNcbiAqL1xuY29uc3QgZXh0ZW5kU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IF9hZGQgPSAobmFtZSwgYm9keSkgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZy5wcm90b3R5cGUsIG5hbWUsIF9ub0VudW0oYm9keSkpO1xuICAgIF9hZGQoJ2Zyb21CYXNlNjQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGUodGhpcyk7IH0pO1xuICAgIF9hZGQoJ3RvQmFzZTY0JywgZnVuY3Rpb24gKHVybHNhZmUpIHsgcmV0dXJuIGVuY29kZSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgX2FkZCgndG9CYXNlNjRVUkknLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlbmNvZGUodGhpcywgdHJ1ZSk7IH0pO1xuICAgIF9hZGQoJ3RvQmFzZTY0VVJMJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTtcbiAgICBfYWRkKCd0b1VpbnQ4QXJyYXknLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0b1VpbnQ4QXJyYXkodGhpcyk7IH0pO1xufTtcbi8qKlxuICogZXh0ZW5kIFVpbnQ4QXJyYXkucHJvdG90eXBlIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICovXG5jb25zdCBleHRlbmRVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IF9hZGQgPSAobmFtZSwgYm9keSkgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXkucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTtcbiAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgX2FkZCgndG9CYXNlNjRVUkknLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB0cnVlKTsgfSk7XG4gICAgX2FkZCgndG9CYXNlNjRVUkwnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB0cnVlKTsgfSk7XG59O1xuLyoqXG4gKiBleHRlbmQgQnVpbHRpbiBwcm90b3R5cGVzIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICovXG5jb25zdCBleHRlbmRCdWlsdGlucyA9ICgpID0+IHtcbiAgICBleHRlbmRTdHJpbmcoKTtcbiAgICBleHRlbmRVaW50OEFycmF5KCk7XG59O1xuY29uc3QgZ0Jhc2U2NCA9IHtcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgIFZFUlNJT046IFZFUlNJT04sXG4gICAgYXRvYjogX2F0b2IsXG4gICAgYXRvYlBvbHlmaWxsOiBhdG9iUG9seWZpbGwsXG4gICAgYnRvYTogX2J0b2EsXG4gICAgYnRvYVBvbHlmaWxsOiBidG9hUG9seWZpbGwsXG4gICAgZnJvbUJhc2U2NDogZGVjb2RlLFxuICAgIHRvQmFzZTY0OiBlbmNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgZW5jb2RlVVJJOiBlbmNvZGVVUkksXG4gICAgZW5jb2RlVVJMOiBlbmNvZGVVUkksXG4gICAgdXRvYjogdXRvYixcbiAgICBidG91OiBidG91LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGlzVmFsaWQ6IGlzVmFsaWQsXG4gICAgZnJvbVVpbnQ4QXJyYXk6IGZyb21VaW50OEFycmF5LFxuICAgIHRvVWludDhBcnJheTogdG9VaW50OEFycmF5LFxuICAgIGV4dGVuZFN0cmluZzogZXh0ZW5kU3RyaW5nLFxuICAgIGV4dGVuZFVpbnQ4QXJyYXk6IGV4dGVuZFVpbnQ4QXJyYXksXG4gICAgZXh0ZW5kQnVpbHRpbnM6IGV4dGVuZEJ1aWx0aW5zLFxufTtcbi8vIG1ha2VjanM6Q1VUIC8vXG5leHBvcnQgeyB2ZXJzaW9uIH07XG5leHBvcnQgeyBWRVJTSU9OIH07XG5leHBvcnQgeyBfYXRvYiBhcyBhdG9iIH07XG5leHBvcnQgeyBhdG9iUG9seWZpbGwgfTtcbmV4cG9ydCB7IF9idG9hIGFzIGJ0b2EgfTtcbmV4cG9ydCB7IGJ0b2FQb2x5ZmlsbCB9O1xuZXhwb3J0IHsgZGVjb2RlIGFzIGZyb21CYXNlNjQgfTtcbmV4cG9ydCB7IGVuY29kZSBhcyB0b0Jhc2U2NCB9O1xuZXhwb3J0IHsgdXRvYiB9O1xuZXhwb3J0IHsgZW5jb2RlIH07XG5leHBvcnQgeyBlbmNvZGVVUkkgfTtcbmV4cG9ydCB7IGVuY29kZVVSSSBhcyBlbmNvZGVVUkwgfTtcbmV4cG9ydCB7IGJ0b3UgfTtcbmV4cG9ydCB7IGRlY29kZSB9O1xuZXhwb3J0IHsgaXNWYWxpZCB9O1xuZXhwb3J0IHsgZnJvbVVpbnQ4QXJyYXkgfTtcbmV4cG9ydCB7IHRvVWludDhBcnJheSB9O1xuZXhwb3J0IHsgZXh0ZW5kU3RyaW5nIH07XG5leHBvcnQgeyBleHRlbmRVaW50OEFycmF5IH07XG5leHBvcnQgeyBleHRlbmRCdWlsdGlucyB9O1xuLy8gYW5kIGZpbmFsbHksXG5leHBvcnQgeyBnQmFzZTY0IGFzIEJhc2U2NCB9O1xuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnRJZCwgUmVhZHlTdGF0dXMsIFJlcG9ydFR5cGVzLCBTcGFuTGF5ZXIsIFNwYW5UeXBlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uc3RhbnQnO1xuaW1wb3J0IHV1aWQgZnJvbSAnLi4vLi4vc2VydmljZXMvdXVpZCc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdqcy1iYXNlNjQnO1xuaW1wb3J0IHsgQ3VzdG9tT3B0aW9uc1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTZWdtZW50RmllbGRzLCBTcGFuRmllbGRzIH0gZnJvbSAnLi4vdHlwZSc7XG5cbmxldCBjdXN0b21Db25maWc6IEN1c3RvbU9wdGlvbnNUeXBlIHwgYW55ID0ge307XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB4aHJJbnRlcmNlcHRvcihvcHRpb25zOiBDdXN0b21PcHRpb25zVHlwZSwgc2VnbWVudHM6IFNlZ21lbnRGaWVsZHNbXSkge1xuICBzZXRPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBvcmlnaW5hbFhIUiA9IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCBhcyBhbnk7XG4gIGNvbnN0IHhoclNlbmQgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUuc2VuZDtcbiAgY29uc3QgeGhyT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xuXG4gIGlmICghKHhoclNlbmQgJiYgeGhyT3BlbikpIHtcbiAgICBjb25zb2xlLmVycm9yKCdUcmFjaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgb3JpZ2luYWxYSFIuZ2V0UmVxdWVzdENvbmZpZyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGFqYXhFdmVudFRyaWdnZXIoZXZlbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFqYXhFdmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudCwgeyBkZXRhaWw6IHRoaXMgfSk7XG5cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChhamF4RXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3VzdG9taXplZFhIUigpIHtcbiAgICBjb25zdCBsaXZlWEhSID0gbmV3IG9yaWdpbmFsWEhSKCk7XG5cbiAgICBsaXZlWEhSLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAncmVhZHlzdGF0ZWNoYW5nZScsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFqYXhFdmVudFRyaWdnZXIuY2FsbCh0aGlzLCAneGhyUmVhZHlTdGF0ZUNoYW5nZScpO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICBsaXZlWEhSLm9wZW4gPSBmdW5jdGlvbiAoXG4gICAgICBtZXRob2Q6IHN0cmluZyxcbiAgICAgIHVybDogc3RyaW5nLFxuICAgICAgYXN5bmM6IGJvb2xlYW4sXG4gICAgICB1c2VybmFtZT86IHN0cmluZyB8IG51bGwsXG4gICAgICBwYXNzd29yZD86IHN0cmluZyB8IG51bGwsXG4gICAgKSB7XG4gICAgICB0aGlzLmdldFJlcXVlc3RDb25maWcgPSBhcmd1bWVudHM7XG5cbiAgICAgIHJldHVybiB4aHJPcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBsaXZlWEhSLnNlbmQgPSBmdW5jdGlvbiAoYm9keT86IERvY3VtZW50IHwgQm9keUluaXQgfCBudWxsKSB7XG4gICAgICByZXR1cm4geGhyU2VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gbGl2ZVhIUjtcbiAgfVxuXG4gICh3aW5kb3cgYXMgYW55KS5YTUxIdHRwUmVxdWVzdCA9IGN1c3RvbWl6ZWRYSFI7XG5cbiAgY29uc3Qgc2VnQ29sbGVjdG9yOiB7IGV2ZW50OiBYTUxIdHRwUmVxdWVzdDsgc3RhcnRUaW1lOiBudW1iZXI7IHRyYWNlSWQ6IHN0cmluZzsgdHJhY2VTZWdtZW50SWQ6IHN0cmluZyB9W10gPSBbXTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigneGhyUmVhZHlTdGF0ZUNoYW5nZScsIChldmVudDogQ3VzdG9tRXZlbnQ8WE1MSHR0cFJlcXVlc3QgJiB7IGdldFJlcXVlc3RDb25maWc6IGFueVtdIH0+KSA9PiB7XG4gICAgbGV0IHNlZ21lbnQgPSB7XG4gICAgICB0cmFjZUlkOiAnJyxcbiAgICAgIHNlcnZpY2U6IGN1c3RvbUNvbmZpZy5zZXJ2aWNlLFxuICAgICAgc3BhbnM6IFtdLFxuICAgICAgc2VydmljZUluc3RhbmNlOiBjdXN0b21Db25maWcuc2VydmljZVZlcnNpb24sXG4gICAgICB0cmFjZVNlZ21lbnRJZDogJycsXG4gICAgfSBhcyBTZWdtZW50RmllbGRzO1xuICAgIGNvbnN0IHhoclN0YXRlID0gZXZlbnQuZGV0YWlsLnJlYWR5U3RhdGU7XG4gICAgY29uc3QgY29uZmlnID0gZXZlbnQuZGV0YWlsLmdldFJlcXVlc3RDb25maWc7XG4gICAgbGV0IHVybCA9IHt9IGFzIFVSTDtcbiAgICBpZiAoY29uZmlnWzFdLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBjb25maWdbMV0uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgdXJsID0gbmV3IFVSTChjb25maWdbMV0pO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnWzFdLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwoYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfSR7Y29uZmlnWzFdfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIHVybC5wYXRobmFtZSA9IGNvbmZpZ1sxXTtcbiAgICB9XG5cbiAgICBjb25zdCBub1RyYWNlT3JpZ2lucyA9IGN1c3RvbUNvbmZpZy5ub1RyYWNlT3JpZ2lucy5zb21lKChydWxlOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHJ1bGUgPT09IHVybC5vcmlnaW4pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGlmIChydWxlLnRlc3QodXJsLm9yaWdpbikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChub1RyYWNlT3JpZ2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNVUkwgPSBuZXcgVVJMKGN1c3RvbUNvbmZpZy5jb2xsZWN0b3IpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gY1VSTC5wYXRobmFtZSA9PT0gJy8nID8gdXJsLnBhdGhuYW1lIDogdXJsLnBhdGhuYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7Y1VSTC5wYXRobmFtZX1gKSwgJycpO1xuICAgIGNvbnN0IGludGVybmFscyA9IFtSZXBvcnRUeXBlcy5FUlJPUiwgUmVwb3J0VHlwZXMuRVJST1JTLCBSZXBvcnRUeXBlcy5QRVJGLCBSZXBvcnRUeXBlcy5TRUdNRU5UU10gYXMgc3RyaW5nW107XG4gICAgY29uc3QgaXNTREtJbnRlcm5hbCA9IGludGVybmFscy5pbmNsdWRlcyhwYXRobmFtZSk7XG5cbiAgICBpZiAoaXNTREtJbnRlcm5hbCAmJiAhY3VzdG9tQ29uZmlnLnRyYWNlU0RLSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmFsdWVzIG9mIHhoclN0YXRlIGFyZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdC9yZWFkeVN0YXRlXG4gICAgaWYgKHhoclN0YXRlID09PSBSZWFkeVN0YXR1cy5PUEVORUQpIHtcbiAgICAgIGNvbnN0IHRyYWNlSWQgPSB1dWlkKCk7XG4gICAgICBjb25zdCB0cmFjZVNlZ21lbnRJZCA9IHV1aWQoKTtcblxuICAgICAgc2VnQ29sbGVjdG9yLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQuZGV0YWlsLFxuICAgICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICB0cmFjZUlkLFxuICAgICAgICB0cmFjZVNlZ21lbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0cmFjZUlkU3RyID0gU3RyaW5nKGVuY29kZSh0cmFjZUlkKSk7XG4gICAgICBjb25zdCBzZWdtZW50SWQgPSBTdHJpbmcoZW5jb2RlKHRyYWNlU2VnbWVudElkKSk7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gU3RyaW5nKGVuY29kZShzZWdtZW50LnNlcnZpY2UpKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RyaW5nKGVuY29kZShzZWdtZW50LnNlcnZpY2VJbnN0YW5jZSkpO1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBTdHJpbmcoZW5jb2RlKGN1c3RvbUNvbmZpZy5wYWdlUGF0aCkpO1xuICAgICAgY29uc3QgcGVlciA9IFN0cmluZyhlbmNvZGUodXJsLmhvc3QpKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC5zcGFucy5sZW5ndGg7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBgJHsxfS0ke3RyYWNlSWRTdHJ9LSR7c2VnbWVudElkfS0ke2luZGV4fS0ke3NlcnZpY2V9LSR7aW5zdGFuY2V9LSR7ZW5kcG9pbnR9LSR7cGVlcn1gO1xuXG4gICAgICBldmVudC5kZXRhaWwuc2V0UmVxdWVzdEhlYWRlcignc3c4JywgdmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoeGhyU3RhdGUgPT09IFJlYWR5U3RhdHVzLkRPTkUpIHtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnQ29sbGVjdG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWdDb2xsZWN0b3JbaV0uZXZlbnQucmVhZHlTdGF0ZSA9PT0gUmVhZHlTdGF0dXMuRE9ORSkge1xuICAgICAgICAgIGxldCByZXNwb25zZVVSTCA9IHt9IGFzIFVSTDtcbiAgICAgICAgICBpZiAoc2VnQ29sbGVjdG9yW2ldLmV2ZW50LnN0YXR1cykge1xuICAgICAgICAgICAgcmVzcG9uc2VVUkwgPSBuZXcgVVJMKHNlZ0NvbGxlY3RvcltpXS5ldmVudC5yZXNwb25zZVVSTCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRhZ3MgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogJ2h0dHAubWV0aG9kJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGNvbmZpZ1swXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogJ3VybCcsXG4gICAgICAgICAgICAgIHZhbHVlOiBzZWdDb2xsZWN0b3JbaV0uZXZlbnQucmVzcG9uc2VVUkwgfHwgYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdH0ke3VybC5wYXRobmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGNvbnN0IGV4aXRTcGFuOiBTcGFuRmllbGRzID0ge1xuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogY3VzdG9tQ29uZmlnLnBhZ2VQYXRoLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzZWdDb2xsZWN0b3JbaV0uc3RhcnRUaW1lLFxuICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgIHNwYW5JZDogc2VnbWVudC5zcGFucy5sZW5ndGgsXG4gICAgICAgICAgICBzcGFuTGF5ZXI6IFNwYW5MYXllcixcbiAgICAgICAgICAgIHNwYW5UeXBlOiBTcGFuVHlwZSxcbiAgICAgICAgICAgIGlzRXJyb3I6IGV2ZW50LmRldGFpbC5zdGF0dXMgPT09IDAgfHwgZXZlbnQuZGV0YWlsLnN0YXR1cyA+PSA0MDAsIC8vIHdoZW4gcmVxdWVzdHMgZmFpbGVkLCB0aGUgc3RhdHVzIGlzIDBcbiAgICAgICAgICAgIHBhcmVudFNwYW5JZDogc2VnbWVudC5zcGFucy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IENvbXBvbmVudElkLFxuICAgICAgICAgICAgcGVlcjogcmVzcG9uc2VVUkwuaG9zdCxcbiAgICAgICAgICAgIHRhZ3M6IGN1c3RvbUNvbmZpZy5kZXRhaWxNb2RlXG4gICAgICAgICAgICAgID8gY3VzdG9tQ29uZmlnLmN1c3RvbVRhZ3NcbiAgICAgICAgICAgICAgICA/IFsuLi50YWdzLCAuLi5jdXN0b21Db25maWcuY3VzdG9tVGFnc11cbiAgICAgICAgICAgICAgICA6IHRhZ3NcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZWdtZW50ID0ge1xuICAgICAgICAgICAgLi4uc2VnbWVudCxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHNlZ0NvbGxlY3RvcltpXS50cmFjZUlkLFxuICAgICAgICAgICAgdHJhY2VTZWdtZW50SWQ6IHNlZ0NvbGxlY3RvcltpXS50cmFjZVNlZ21lbnRJZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlZ21lbnQuc3BhbnMucHVzaChleGl0U3Bhbik7XG4gICAgICAgICAgc2VnQ29sbGVjdG9yLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0OiBDdXN0b21PcHRpb25zVHlwZSkge1xuICBjdXN0b21Db25maWcgPSB7IC4uLmN1c3RvbUNvbmZpZywgLi4ub3B0IH07XG59XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGVuY29kZSB9IGZyb20gJ2pzLWJhc2U2NCc7XG5pbXBvcnQgdXVpZCBmcm9tICcuLi8uLi9zZXJ2aWNlcy91dWlkJztcbmltcG9ydCB7IFNlZ21lbnRGaWVsZHMsIFNwYW5GaWVsZHMgfSBmcm9tICcuLi90eXBlJztcbmltcG9ydCB7IEN1c3RvbU9wdGlvbnNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vLi4vc2VydmljZXMvYmFzZSc7XG5pbXBvcnQgeyBDb21wb25lbnRJZCwgUmVwb3J0VHlwZXMsIFNwYW5MYXllciwgU3BhblR5cGUsIEVycm9yc0NhdGVnb3J5LCBHcmFkZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uc3RhbnQnO1xubGV0IGN1c3RvbUNvbmZpZzogYW55ID0ge307XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3aW5kb3dGZXRjaChvcHRpb25zOiBDdXN0b21PcHRpb25zVHlwZSwgc2VnbWVudHM6IFNlZ21lbnRGaWVsZHNbXSkge1xuICBjb25zdCBvcmlnaW5GZXRjaDogYW55ID0gd2luZG93LmZldGNoO1xuICBzZXRGZXRjaE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgd2luZG93LmZldGNoID0gYXN5bmMgKC4uLmFyZ3M6IGFueSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB1dWlkKCk7XG4gICAgY29uc3QgdHJhY2VTZWdtZW50SWQgPSB1dWlkKCk7XG4gICAgbGV0IHNlZ21lbnQgPSB7XG4gICAgICB0cmFjZUlkOiAnJyxcbiAgICAgIHNlcnZpY2U6IGN1c3RvbUNvbmZpZy5zZXJ2aWNlLFxuICAgICAgc3BhbnM6IFtdLFxuICAgICAgc2VydmljZUluc3RhbmNlOiBjdXN0b21Db25maWcuc2VydmljZVZlcnNpb24sXG4gICAgICB0cmFjZVNlZ21lbnRJZDogJycsXG4gICAgfSBhcyBTZWdtZW50RmllbGRzO1xuICAgIGxldCB1cmwgPSB7fSBhcyBVUkw7XG4gICAgLy8gZm9yIGFyZ3NbMF0gaXMgUmVxdWVzdCBvYmplY3Qgc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy96aC1DTi9kb2NzL1dlYi9BUEkvZmV0Y2hcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3NbMF0pID09PSAnW29iamVjdCBSZXF1ZXN0XScpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwoYXJnc1swXS51cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJnc1swXS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXJnc1swXS5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgIHVybCA9IG5ldyBVUkwoYXJnc1swXSk7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3NbMF0uc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0ke2FyZ3NbMF19YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdXJsLnBhdGhuYW1lID0gYXJnc1swXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub1RyYWNlT3JpZ2lucyA9IGN1c3RvbUNvbmZpZy5ub1RyYWNlT3JpZ2lucy5zb21lKChydWxlOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHJ1bGUgPT09IHVybC5vcmlnaW4pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChydWxlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGlmIChydWxlLnRlc3QodXJsLm9yaWdpbikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNVUkwgPSBuZXcgVVJMKGN1c3RvbUNvbmZpZy5jb2xsZWN0b3IpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gY1VSTC5wYXRobmFtZSA9PT0gJy8nID8gdXJsLnBhdGhuYW1lIDogdXJsLnBhdGhuYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7Y1VSTC5wYXRobmFtZX1gKSwgJycpO1xuICAgIGNvbnN0IGludGVybmFscyA9IFtSZXBvcnRUeXBlcy5FUlJPUiwgUmVwb3J0VHlwZXMuRVJST1JTLCBSZXBvcnRUeXBlcy5QRVJGLCBSZXBvcnRUeXBlcy5TRUdNRU5UU10gYXMgc3RyaW5nW107XG4gICAgY29uc3QgaXNTREtJbnRlcm5hbCA9IGludGVybmFscy5pbmNsdWRlcyhwYXRobmFtZSk7XG4gICAgY29uc3QgaGFzVHJhY2UgPSAhbm9UcmFjZU9yaWdpbnMgfHwgKGlzU0RLSW50ZXJuYWwgJiYgY3VzdG9tQ29uZmlnLnRyYWNlU0RLSW50ZXJuYWwpO1xuXG4gICAgaWYgKGhhc1RyYWNlKSB7XG4gICAgICBjb25zdCB0cmFjZUlkU3RyID0gU3RyaW5nKGVuY29kZSh0cmFjZUlkKSk7XG4gICAgICBjb25zdCBzZWdtZW50SWQgPSBTdHJpbmcoZW5jb2RlKHRyYWNlU2VnbWVudElkKSk7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gU3RyaW5nKGVuY29kZShzZWdtZW50LnNlcnZpY2UpKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RyaW5nKGVuY29kZShzZWdtZW50LnNlcnZpY2VJbnN0YW5jZSkpO1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBTdHJpbmcoZW5jb2RlKGN1c3RvbUNvbmZpZy5wYWdlUGF0aCkpO1xuICAgICAgY29uc3QgcGVlciA9IFN0cmluZyhlbmNvZGUodXJsLmhvc3QpKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC5zcGFucy5sZW5ndGg7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBgJHsxfS0ke3RyYWNlSWRTdHJ9LSR7c2VnbWVudElkfS0ke2luZGV4fS0ke3NlcnZpY2V9LSR7aW5zdGFuY2V9LSR7ZW5kcG9pbnR9LSR7cGVlcn1gO1xuXG4gICAgICBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgYXJnc1swXS5oZWFkZXJzLmFwcGVuZCgnc3c4JywgdmFsdWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghYXJnc1sxXSkge1xuICAgICAgICAgIGFyZ3NbMV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZ3NbMV0uaGVhZGVycykge1xuICAgICAgICAgIGFyZ3NbMV0uaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3NbMV0uaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgICAgICBhcmdzWzFdLmhlYWRlcnMuYXBwZW5kKCdzdzgnLCB2YWx1ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3NbMV0uaGVhZGVyc1snc3c4J10gPSB2YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9yaWdpbkZldGNoKC4uLmFyZ3MpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiAocmVzcG9uc2Uuc3RhdHVzID09PSAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApKSB7XG4gICAgICAgIGNvbnN0IGxvZ0luZm8gPSB7XG4gICAgICAgICAgdW5pcXVlSWQ6IHV1aWQoKSxcbiAgICAgICAgICBzZXJ2aWNlOiBjdXN0b21Db25maWcuc2VydmljZSxcbiAgICAgICAgICBzZXJ2aWNlVmVyc2lvbjogY3VzdG9tQ29uZmlnLnNlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgIHBhZ2VQYXRoOiBjdXN0b21Db25maWcucGFnZVBhdGgsXG4gICAgICAgICAgY2F0ZWdvcnk6IEVycm9yc0NhdGVnb3J5LkFKQVhfRVJST1IsXG4gICAgICAgICAgZ3JhZGU6IEdyYWRlVHlwZUVudW0uRVJST1IsXG4gICAgICAgICAgZXJyb3JVcmw6IChyZXNwb25zZSAmJiByZXNwb25zZS51cmwpIHx8IGAke3VybC5wcm90b2NvbH0vLyR7dXJsLmhvc3R9JHt1cmwucGF0aG5hbWV9YCxcbiAgICAgICAgICBtZXNzYWdlOiBgc3RhdHVzOiAke3Jlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogMH07IHN0YXR1c1RleHQ6ICR7cmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzVGV4dH07YCxcbiAgICAgICAgICBjb2xsZWN0b3I6IGN1c3RvbUNvbmZpZy5jb2xsZWN0b3IsXG4gICAgICAgICAgc3RhY2s6ICdGZXRjaDogJyArIHJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIH07XG4gICAgICAgIG5ldyBCYXNlKCkudHJhY2VJbmZvKGxvZ0luZm8pO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1RyYWNlKSB7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnaHR0cC5tZXRob2QnLFxuICAgICAgICAgICAgdmFsdWU6IGFyZ3NbMV0ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAndXJsJyxcbiAgICAgICAgICAgIHZhbHVlOiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudXJsKSB8fCBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fSR7dXJsLnBhdGhuYW1lfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBleGl0U3BhbjogU3BhbkZpZWxkcyA9IHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBjdXN0b21Db25maWcucGFnZVBhdGgsXG4gICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICBzcGFuSWQ6IHNlZ21lbnQuc3BhbnMubGVuZ3RoLFxuICAgICAgICAgIHNwYW5MYXllcjogU3BhbkxheWVyLFxuICAgICAgICAgIHNwYW5UeXBlOiBTcGFuVHlwZSxcbiAgICAgICAgICBpc0Vycm9yOiByZXNwb25zZSAmJiAocmVzcG9uc2Uuc3RhdHVzID09PSAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApLCAvLyB3aGVuIHJlcXVlc3RzIGZhaWxlZCwgdGhlIHN0YXR1cyBpcyAwXG4gICAgICAgICAgcGFyZW50U3BhbklkOiBzZWdtZW50LnNwYW5zLmxlbmd0aCAtIDEsXG4gICAgICAgICAgY29tcG9uZW50SWQ6IENvbXBvbmVudElkLFxuICAgICAgICAgIHBlZXI6IHVybC5ob3N0LFxuICAgICAgICAgIHRhZ3M6IGN1c3RvbUNvbmZpZy5kZXRhaWxNb2RlXG4gICAgICAgICAgICA/IGN1c3RvbUNvbmZpZy5jdXN0b21UYWdzXG4gICAgICAgICAgICAgID8gWy4uLnRhZ3MsIC4uLmN1c3RvbUNvbmZpZy5jdXN0b21UYWdzXVxuICAgICAgICAgICAgICA6IHRhZ3NcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBzZWdtZW50ID0ge1xuICAgICAgICAgIC4uLnNlZ21lbnQsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VJZCxcbiAgICAgICAgICB0cmFjZVNlZ21lbnRJZDogdHJhY2VTZWdtZW50SWQsXG4gICAgICAgIH07XG4gICAgICAgIHNlZ21lbnQuc3BhbnMucHVzaChleGl0U3Bhbik7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLmNsb25lKCk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0RmV0Y2hPcHRpb25zKG9wdDogQ3VzdG9tT3B0aW9uc1R5cGUpIHtcbiAgY3VzdG9tQ29uZmlnID0geyAuLi5jdXN0b21Db25maWcsIC4uLm9wdCB9O1xufVxuIiwiLyoqXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB4aHJJbnRlcmNlcHRvciwgeyBzZXRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMveGhyJztcbmltcG9ydCB3aW5kb3dGZXRjaCwgeyBzZXRGZXRjaE9wdGlvbnMgfSBmcm9tICcuL2ludGVyY2VwdG9ycy9mZXRjaCc7XG5pbXBvcnQgUmVwb3J0IGZyb20gJy4uL3NlcnZpY2VzL3JlcG9ydCc7XG5pbXBvcnQgeyBTZWdtZW50RmllbGRzIH0gZnJvbSAnLi90eXBlJztcbmltcG9ydCB7IEN1c3RvbU9wdGlvbnNUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFjZVNlZ21lbnQob3B0aW9uczogQ3VzdG9tT3B0aW9uc1R5cGUpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBbXSBhcyBTZWdtZW50RmllbGRzW107XG4gIC8vIGluamVjdCBpbnRlcmNlcHRvclxuICB4aHJJbnRlcmNlcHRvcihvcHRpb25zLCBzZWdtZW50cyk7XG4gIHdpbmRvd0ZldGNoKG9wdGlvbnMsIHNlZ21lbnRzKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICBpZiAoIXNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgUmVwb3J0KCdTRUdNRU5UUycsIG9wdGlvbnMuY29sbGVjdG9yKS5zZW5kQnlCZWFjb24oc2VnbWVudHMpO1xuICB9KTtcbiAgLy9yZXBvcnQgcGVyIG9wdGlvbnMudHJhY2VUaW1lSW50ZXJ2YWwgbWluXG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAoIXNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgUmVwb3J0KCdTRUdNRU5UUycsIG9wdGlvbnMuY29sbGVjdG9yKS5zZW5kQnlYaHIoc2VnbWVudHMpO1xuICAgIHNlZ21lbnRzLnNwbGljZSgwLCBzZWdtZW50cy5sZW5ndGgpO1xuICB9LCBvcHRpb25zLnRyYWNlVGltZUludGVydmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbmZpZyhvcHQ6IEN1c3RvbU9wdGlvbnNUeXBlKSB7XG4gIHNldE9wdGlvbnMob3B0KTtcbiAgc2V0RmV0Y2hPcHRpb25zKG9wdCk7XG59XG4iLCIvKipcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ3VzdG9tT3B0aW9uc1R5cGUsIEN1c3RvbVJlcG9ydE9wdGlvbnMsIFRhZ09wdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSlNFcnJvcnMsIFByb21pc2VFcnJvcnMsIEFqYXhFcnJvcnMsIFJlc291cmNlRXJyb3JzLCBWdWVFcnJvcnMsIEZyYW1lRXJyb3JzIH0gZnJvbSAnLi9lcnJvcnMvaW5kZXgnO1xuaW1wb3J0IHRyYWNlUGVyZiBmcm9tICcuL3BlcmZvcm1hbmNlL2luZGV4JztcbmltcG9ydCB0cmFjZVNlZ21lbnQsIHsgc2V0Q29uZmlnIH0gZnJvbSAnLi90cmFjZS9zZWdtZW50JztcblxuY29uc3QgQ2xpZW50TW9uaXRvciA9IHtcbiAgY3VzdG9tT3B0aW9uczoge1xuICAgIGNvbGxlY3RvcjogbG9jYXRpb24ub3JpZ2luLCAvLyByZXBvcnQgc2VydmVcbiAgICBqc0Vycm9yczogdHJ1ZSwgLy8gdnVlLCBqcyBhbmQgcHJvbWlzZSBlcnJvcnNcbiAgICBhcGlFcnJvcnM6IHRydWUsXG4gICAgcmVzb3VyY2VFcnJvcnM6IHRydWUsXG4gICAgYXV0b1RyYWNlUGVyZjogdHJ1ZSwgLy8gdHJhY2UgcGVyZm9ybWFuY2UgZGV0YWlsXG4gICAgdXNlRm1wOiBmYWxzZSwgLy8gdXNlIGZpcnN0IG1lYW5pbmdmdWwgcGFpbnRcbiAgICBlbmFibGVTUEE6IGZhbHNlLFxuICAgIHRyYWNlU0RLSW50ZXJuYWw6IGZhbHNlLFxuICAgIGRldGFpbE1vZGU6IHRydWUsXG4gICAgbm9UcmFjZU9yaWdpbnM6IFtdLFxuICAgIHRyYWNlVGltZUludGVydmFsOiA2MDAwMCwgLy8gMW1pblxuICB9IGFzIEN1c3RvbU9wdGlvbnNUeXBlLFxuXG4gIHJlZ2lzdGVyKGNvbmZpZ3M6IEN1c3RvbU9wdGlvbnNUeXBlKSB7XG4gICAgdGhpcy5jdXN0b21PcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5jdXN0b21PcHRpb25zLFxuICAgICAgLi4uY29uZmlncyxcbiAgICB9O1xuICAgIHRoaXMudmFsaWRhdGVPcHRpb25zKCk7XG4gICAgdGhpcy5jYXRjaEVycm9ycyh0aGlzLmN1c3RvbU9wdGlvbnMpO1xuICAgIGlmICghdGhpcy5jdXN0b21PcHRpb25zLmVuYWJsZVNQQSkge1xuICAgICAgdGhpcy5wZXJmb3JtYW5jZSh0aGlzLmN1c3RvbU9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRyYWNlU2VnbWVudCh0aGlzLmN1c3RvbU9wdGlvbnMpO1xuICB9LFxuICBwZXJmb3JtYW5jZShjb25maWdzOiBhbnkpIHtcbiAgICAvLyB0cmFjZSBhbmQgcmVwb3J0IHBlcmYgZGF0YSBhbmQgcHYgdG8gc2VydmUgd2hlbiBwYWdlIGxvYWRlZFxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICB0cmFjZVBlcmYuZ2V0UGVyZihjb25maWdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdsb2FkJyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRyYWNlUGVyZi5nZXRQZXJmKGNvbmZpZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGNhdGNoRXJyb3JzKG9wdGlvbnM6IEN1c3RvbU9wdGlvbnNUeXBlKSB7XG4gICAgY29uc3QgeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9ID0gb3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLmpzRXJyb3JzKSB7XG4gICAgICBKU0Vycm9ycy5oYW5kbGVFcnJvcnMoeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9KTtcbiAgICAgIFByb21pc2VFcnJvcnMuaGFuZGxlRXJyb3JzKHsgc2VydmljZSwgcGFnZVBhdGgsIHNlcnZpY2VWZXJzaW9uLCBjb2xsZWN0b3IgfSk7XG4gICAgICBpZiAob3B0aW9ucy52dWUpIHtcbiAgICAgICAgVnVlRXJyb3JzLmhhbmRsZUVycm9ycyh7IHNlcnZpY2UsIHBhZ2VQYXRoLCBzZXJ2aWNlVmVyc2lvbiwgY29sbGVjdG9yIH0sIG9wdGlvbnMudnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXBpRXJyb3JzKSB7XG4gICAgICBBamF4RXJyb3JzLmhhbmRsZUVycm9yKHsgc2VydmljZSwgcGFnZVBhdGgsIHNlcnZpY2VWZXJzaW9uLCBjb2xsZWN0b3IgfSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlc291cmNlRXJyb3JzKSB7XG4gICAgICBSZXNvdXJjZUVycm9ycy5oYW5kbGVFcnJvcnMoeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9KTtcbiAgICB9XG4gIH0sXG4gIHNldFBlcmZvcm1hbmNlKGNvbmZpZ3M6IEN1c3RvbVJlcG9ydE9wdGlvbnMpIHtcbiAgICAvLyBoaXN0b3J5IHJvdXRlclxuICAgIHRoaXMuY3VzdG9tT3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuY3VzdG9tT3B0aW9ucyxcbiAgICAgIC4uLmNvbmZpZ3MsXG4gICAgICB1c2VGbXA6IGZhbHNlLFxuICAgIH07XG4gICAgdGhpcy52YWxpZGF0ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlKHRoaXMuY3VzdG9tT3B0aW9ucyk7XG4gICAgY29uc3QgeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9ID0gdGhpcy5jdXN0b21PcHRpb25zO1xuICAgIGlmICh0aGlzLmN1c3RvbU9wdGlvbnMuanNFcnJvcnMpIHtcbiAgICAgIEpTRXJyb3JzLnNldE9wdGlvbnMoeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9KTtcbiAgICAgIFByb21pc2VFcnJvcnMuc2V0T3B0aW9ucyh7IHNlcnZpY2UsIHBhZ2VQYXRoLCBzZXJ2aWNlVmVyc2lvbiwgY29sbGVjdG9yIH0pO1xuICAgICAgaWYgKHRoaXMuY3VzdG9tT3B0aW9ucy52dWUpIHtcbiAgICAgICAgVnVlRXJyb3JzLnNldE9wdGlvbnMoeyBzZXJ2aWNlLCBwYWdlUGF0aCwgc2VydmljZVZlcnNpb24sIGNvbGxlY3RvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY3VzdG9tT3B0aW9ucy5hcGlFcnJvcnMpIHtcbiAgICAgIEFqYXhFcnJvcnMuc2V0T3B0aW9ucyh7IHNlcnZpY2UsIHBhZ2VQYXRoLCBzZXJ2aWNlVmVyc2lvbiwgY29sbGVjdG9yIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21PcHRpb25zLnJlc291cmNlRXJyb3JzKSB7XG4gICAgICBSZXNvdXJjZUVycm9ycy5zZXRPcHRpb25zKHsgc2VydmljZSwgcGFnZVBhdGgsIHNlcnZpY2VWZXJzaW9uLCBjb2xsZWN0b3IgfSk7XG4gICAgfVxuICAgIHNldENvbmZpZyh0aGlzLmN1c3RvbU9wdGlvbnMpO1xuICB9LFxuICByZXBvcnRGcmFtZUVycm9ycyhjb25maWdzOiBDdXN0b21SZXBvcnRPcHRpb25zLCBlcnJvcjogRXJyb3IpIHtcbiAgICBGcmFtZUVycm9ycy5oYW5kbGVFcnJvcnMoY29uZmlncywgZXJyb3IpO1xuICB9LFxuICB2YWxpZGF0ZVRhZ3MoY3VzdG9tVGFncz86IFRhZ09wdGlvbltdKSB7XG4gICAgaWYgKCFjdXN0b21UYWdzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjdXN0b21UYWdzKSkge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmN1c3RvbVRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKCdjdXN0b21UYWdzIGVycm9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpc1RhZ3MgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZWxlIG9mIGN1c3RvbVRhZ3MpIHtcbiAgICAgIGlmICghKGVsZSAmJiBlbGUua2V5ICYmIGVsZS52YWx1ZSkpIHtcbiAgICAgICAgaXNUYWdzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNUYWdzKSB7XG4gICAgICB0aGlzLmN1c3RvbU9wdGlvbnMuY3VzdG9tVGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2N1c3RvbVRhZ3MgZXJyb3InKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHZhbGlkYXRlT3B0aW9ucygpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0b3IsXG4gICAgICBzZXJ2aWNlLFxuICAgICAgcGFnZVBhdGgsXG4gICAgICBzZXJ2aWNlVmVyc2lvbixcbiAgICAgIGpzRXJyb3JzLFxuICAgICAgYXBpRXJyb3JzLFxuICAgICAgcmVzb3VyY2VFcnJvcnMsXG4gICAgICBhdXRvVHJhY2VQZXJmLFxuICAgICAgdXNlRm1wLFxuICAgICAgZW5hYmxlU1BBLFxuICAgICAgdHJhY2VTREtJbnRlcm5hbCxcbiAgICAgIGRldGFpbE1vZGUsXG4gICAgICBub1RyYWNlT3JpZ2lucyxcbiAgICAgIHRyYWNlVGltZUludGVydmFsLFxuICAgICAgY3VzdG9tVGFncyxcbiAgICAgIHZ1ZSxcbiAgICB9ID0gdGhpcy5jdXN0b21PcHRpb25zO1xuICAgIHRoaXMudmFsaWRhdGVUYWdzKGN1c3RvbVRhZ3MpO1xuICAgIGlmICh0eXBlb2YgY29sbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmNvbGxlY3RvciA9IGxvY2F0aW9uLm9yaWdpbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZXJ2aWNlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLnNlcnZpY2UgPSAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYWdlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuY3VzdG9tT3B0aW9ucy5wYWdlUGF0aCA9ICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlcnZpY2VWZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLnNlcnZpY2VWZXJzaW9uID0gJyc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YganNFcnJvcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmpzRXJyb3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcGlFcnJvcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmFwaUVycm9ycyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VFcnJvcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLnJlc291cmNlRXJyb3JzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhdXRvVHJhY2VQZXJmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuY3VzdG9tT3B0aW9ucy5hdXRvVHJhY2VQZXJmID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB1c2VGbXAgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLnVzZUZtcCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuYWJsZVNQQSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmN1c3RvbU9wdGlvbnMuZW5hYmxlU1BBID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdHJhY2VTREtJbnRlcm5hbCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmN1c3RvbU9wdGlvbnMudHJhY2VTREtJbnRlcm5hbCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRldGFpbE1vZGUgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmRldGFpbE1vZGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRldGFpbE1vZGUgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLmRldGFpbE1vZGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9UcmFjZU9yaWdpbnMpKSB7XG4gICAgICB0aGlzLmN1c3RvbU9wdGlvbnMubm9UcmFjZU9yaWdpbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0cmFjZVRpbWVJbnRlcnZhbCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY3VzdG9tT3B0aW9ucy50cmFjZVRpbWVJbnRlcnZhbCA9IDYwMDAwO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZ1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5jdXN0b21PcHRpb25zLnZ1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sXG4gIHNldEN1c3RvbVRhZ3ModGFnczogVGFnT3B0aW9uW10pIHtcbiAgICBjb25zdCBvcHQgPSB7IC4uLnRoaXMuY3VzdG9tT3B0aW9ucywgY3VzdG9tVGFnczogdGFncyB9O1xuICAgIGlmICh0aGlzLnZhbGlkYXRlVGFncyh0YWdzKSkge1xuICAgICAgc2V0Q29uZmlnKG9wdCk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2xpZW50TW9uaXRvcjtcbiIsIi8qKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgQ2xpZW50TW9uaXRvciBmcm9tICcuL21vbml0b3InO1xuXG4od2luZG93IGFzIGFueSkuQ2xpZW50TW9uaXRvciA9IENsaWVudE1vbml0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IENsaWVudE1vbml0b3I7XG4iXSwibmFtZXMiOlsidXVpZCIsInJlcGxhY2UiLCJjIiwiciIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsIkVycm9yc0NhdGVnb3J5IiwiR3JhZGVUeXBlRW51bSIsIlJlcG9ydFR5cGVzIiwiUmVhZHlTdGF0dXMiLCJTcGFuTGF5ZXIiLCJTcGFuVHlwZSIsIkNvbXBvbmVudElkIiwidHlwZSIsImNvbGxlY3RvciIsInVybCIsInRoaXMiLCJFUlJPUiIsIkVSUk9SUyIsIlNFR01FTlQiLCJTRUdNRU5UUyIsIlBFUkYiLCJzZW5kQnlGZXRjaCIsImRhdGEiLCJzZW5kUmVxdWVzdCIsIlJlcXVlc3QiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwic3RhdHVzIiwiRXJyb3IiLCJjYXRjaCIsImVycm9yIiwiY29uc29sZSIsInNlbmRCeVhociIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNldFJlcXVlc3RIZWFkZXIiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwibG9nIiwic2VuZCIsInNlbmRCeUJlYWNvbiIsIm5hdmlnYXRvciIsInNlbmRCZWFjb24iLCJCbG9iIiwicXVldWVzIiwiYWRkVGFzayIsInB1c2giLCJmaXJlVGFza3MiLCJsZW5ndGgiLCJmaW5hbGx5RmlyZVRhc2tzIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImludGVydmFsIiwicGFnZUhhc2pzRXJyb3IiLCJsb2dJbmZvIiwidW5pcXVlSWQiLCJzZXJ2aWNlIiwic2VydmljZVZlcnNpb24iLCJwYWdlUGF0aCIsImNhdGVnb3J5IiwiVU5LTk9XTl9FUlJPUiIsImdyYWRlIiwiSU5GTyIsImVycm9yVXJsIiwibGluZSIsImNvbCIsIm1lc3NhZ2UiLCJmaXJzdFJlcG9ydGVkRXJyb3IiLCJ0cmFjZUluZm8iLCJFeGNsdWRlRXJyb3JUeXBlcyIsIkFKQVhfRVJST1IiLCJSRVNPVVJDRV9FUlJPUiIsImxvY2F0aW9uIiwiaHJlZiIsImluY2x1ZGVzIiwic2V0SW50ZXJ2YWwiLCJpbmZvT3B0IiwiaGFuZGxlRXJyb3JzIiwib3B0aW9ucyIsIm9uZXJyb3IiLCJKU19FUlJPUiIsInN0YWNrIiwic2V0T3B0aW9ucyIsIm9wdCIsImV2ZW50IiwicmVhc29uIiwiY29uZmlnIiwiUFJPTUlTRV9FUlJPUiIsImhhbmRsZUVycm9yIiwiZGV0YWlsIiwiZ2V0UmVxdWVzdENvbmZpZyIsInN0YXR1c1RleHQiLCJyZXNwb25zZVRleHQiLCJ0YXJnZXQiLCJIVE1MU2NyaXB0RWxlbWVudCIsIkhUTUxMaW5rRWxlbWVudCIsIkhUTUxJbWFnZUVsZW1lbnQiLCJ0YWdOYW1lIiwiV0FSTklORyIsInNyYyIsIlZ1ZSIsImVycm9ySGFuZGxlciIsInZtIiwiaW5mbyIsIlZVRV9FUlJPUiIsIm5hbWUiLCJvcmlnaW4iLCJnZXRQZXJmVGltaW5nIiwidGltaW5nIiwicGVyZm9ybWFuY2UiLCJQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmciLCJudDJUaW1pbmciLCJnZXRFbnRyaWVzQnlUeXBlIiwicmVkaXJlY3RUaW1lIiwidW5kZWZpbmVkIiwibmF2aWdhdGlvblN0YXJ0IiwicGFyc2VJbnQiLCJTdHJpbmciLCJmZXRjaFN0YXJ0IiwicmVkaXJlY3RFbmQiLCJyZWRpcmVjdFN0YXJ0IiwiZG5zVGltZSIsImRvbWFpbkxvb2t1cEVuZCIsImRvbWFpbkxvb2t1cFN0YXJ0IiwidHRmYlRpbWUiLCJyZXNwb25zZVN0YXJ0IiwicmVxdWVzdFN0YXJ0IiwidGNwVGltZSIsImNvbm5lY3RFbmQiLCJjb25uZWN0U3RhcnQiLCJ0cmFuc1RpbWUiLCJyZXNwb25zZUVuZCIsImRvbUFuYWx5c2lzVGltZSIsImRvbUludGVyYWN0aXZlIiwiZnB0VGltZSIsImRvbVJlYWR5VGltZSIsImRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCIsImxvYWRQYWdlVGltZSIsImxvYWRFdmVudFN0YXJ0IiwicmVzVGltZSIsInNzbFRpbWUiLCJwcm90b2NvbCIsInNlY3VyZUNvbm5lY3Rpb25TdGFydCIsInR0bFRpbWUiLCJmaXJzdFBhY2tUaW1lIiwiZm1wVGltZSIsImUiLCJFTEVfV0VJR0hUIiwiZ2V0U3R5bGUiLCJlbGVtZW50IiwiYXR0ciIsImdldENvbXB1dGVkU3R5bGUiLCJjdXJyZW50U3R5bGUiLCJTVEFSVF9USU1FIiwibm93IiwiSUdOT1JFX1RBR19TRVQiLCJXVyIsImlubmVyV2lkdGgiLCJXSCIsImlubmVySGVpZ2h0Iiwic3RhdHVzQ29sbGVjdG9yIiwiZmxhZyIsIm9ic2VydmVyIiwiY2FsbGJhY2tDb3VudCIsImVudHJpZXMiLCJnZXRFbnRyaWVzIiwiaW5pdE9ic2VydmVyIiwiZ2V0Rmlyc3RTbmFwU2hvdCIsInRpbWUiLCIkYm9keSIsImRvY3VtZW50Iiwic2V0VGFnIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY2FsY3VsYXRlRmluYWxTY29yZSIsImNoZWNrTmVlZENhbmNlbCIsImRpc2Nvbm5lY3QiLCJ0cCIsImdldFRyZWVTY29yZSIsImRwc3MiLCJpdGVtIiwic3QiLCJmb3JFYWNoIiwicmVzdWx0RWxzIiwiZmlsdGVyUmVzdWx0IiwiZWxzIiwiZm1wVGltaW5nIiwiZ2V0Rm1wVGltZSIsInNldFRpbWVvdXQiLCJydCIsIndlaWdodCIsImluZGV4IiwiZWxlIiwiZ2V0QXR0cmlidXRlIiwibWF0Y2giLCJwb3N0ZXIiLCJzdW0iLCJhdmciLCJmaWx0ZXIiLCJzdGFydCIsImxhc3RDYWxUaW1lIiwibm9kZSIsImNoaWxkcmVuIiwiY2hpbGQiLCJzIiwiY2FsY2F1bHRlR3JhZGVzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJsZWZ0IiwidG9wIiwiaXNJblZpZXdQb3J0Iiwic2RwIiwiTnVtYmVyIiwiSU1HIiwicm9vdCIsImFyZWFQZXJjZW50IiwiY2FsY3VsYXRlQXJlYVBhcmVudCIsImNvbmNhdCIsInJpZ2h0IiwiYm90dG9tIiwid2luUmlnaHQiLCJ3aW5Cb3R0b20iLCJvdmVybGFwWCIsIm1heCIsIm1pbiIsIm92ZXJsYXBZIiwiaW5kZXhPZiIsIiRjaGlsZHJlbiIsImkiLCIkY2hpbGQiLCJzZXRBdHRyaWJ1dGUiLCJwZXJmQ29uZmlnIiwicGVyZkRldGFpbCIsImdldFBlcmYiLCJyZWNvcmRQZXJmIiwiZW5hYmxlU1BBIiwiZm1wIiwiYXV0b1RyYWNlUGVyZiIsInVzZUZtcCIsInBlcmZJbmZvIiwiY2xlYXJQZXJmIiwiY2xlYXJSZXNvdXJjZVRpbWluZ3MiLCJfaGFzYnRvYSIsImJ0b2EiLCJfaGFzQnVmZmVyIiwiQnVmZmVyIiwiX1RFIiwiVGV4dERlY29kZXIiLCJUZXh0RW5jb2RlciIsImI2NGNocyIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiX2Zyb21DQyIsImEiLCJ0YWIiLCJmcm9tQ2hhckNvZGUiLCJiaW5kIiwiX21rVXJpU2FmZSIsIlVpbnQ4QXJyYXkiLCJmcm9tIiwibTAiLCJfYnRvYSIsImJpbiIsInUzMiIsImMwIiwiYzEiLCJjMiIsImFzYyIsInBhZCIsImNoYXJDb2RlQXQiLCJUeXBlRXJyb3IiLCJzdWJzdHJpbmciLCJfZnJvbVVpbnQ4QXJyYXkiLCJ1OGEiLCJzdHJzIiwibCIsImFwcGx5Iiwic3ViYXJyYXkiLCJqb2luIiwiY2JfdXRvYiIsImNjIiwicmVfdXRvYiIsIl9lbmNvZGUiLCJlbmNvZGUiLCJ1cmxzYWZlIiwiY3VzdG9tQ29uZmlnIiwieGhySW50ZXJjZXB0b3IiLCJzZWdtZW50cyIsIm9yaWdpbmFsWEhSIiwieGhyU2VuZCIsInhock9wZW4iLCJsaXZlWEhSIiwiYWpheEV2ZW50VHJpZ2dlciIsImFzeW5jIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImFyZ3VtZW50cyIsInNlZ0NvbGxlY3RvciIsInNlZ21lbnQiLCJ0cmFjZUlkIiwic3BhbnMiLCJzZXJ2aWNlSW5zdGFuY2UiLCJ0cmFjZVNlZ21lbnRJZCIsInhoclN0YXRlIiwic3RhcnRzV2l0aCIsIlVSTCIsInBhdGhuYW1lIiwibm9UcmFjZU9yaWdpbnMiLCJzb21lIiwicnVsZSIsIlJlZ0V4cCIsInRlc3QiLCJjVVJMIiwidHJhY2VTREtJbnRlcm5hbCIsIk9QRU5FRCIsInN0YXJ0VGltZSIsIkRhdGUiLCJnZXRUaW1lIiwidHJhY2VJZFN0ciIsInNlZ21lbnRJZCIsImluc3RhbmNlIiwiZW5kcG9pbnQiLCJwZWVyIiwiaG9zdCIsInZhbHVlcyIsIkRPTkUiLCJlbmRUaW1lIiwicmVzcG9uc2VVUkwiLCJ0YWdzIiwia2V5IiwidmFsdWUiLCJleGl0U3BhbiIsIm9wZXJhdGlvbk5hbWUiLCJzcGFuSWQiLCJzcGFuTGF5ZXIiLCJzcGFuVHlwZSIsImlzRXJyb3IiLCJwYXJlbnRTcGFuSWQiLCJjb21wb25lbnRJZCIsImRldGFpbE1vZGUiLCJjdXN0b21UYWdzIiwic3BsaWNlIiwiYWpheEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkaXNwYXRjaEV2ZW50Iiwic2V0RmV0Y2hPcHRpb25zIiwic2V0Q29uZmlnIiwiY3VzdG9tT3B0aW9ucyIsImpzRXJyb3JzIiwiYXBpRXJyb3JzIiwicmVzb3VyY2VFcnJvcnMiLCJ0cmFjZVRpbWVJbnRlcnZhbCIsInJlZ2lzdGVyIiwiY29uZmlncyIsInZhbGlkYXRlT3B0aW9ucyIsImNhdGNoRXJyb3JzIiwib3JpZ2luRmV0Y2giLCJPYmplY3QiLCJhcmdzIiwiaW50ZXJuYWxzIiwiaXNTREtJbnRlcm5hbCIsImhhc1RyYWNlIiwiaGVhZGVycyIsImFwcGVuZCIsIkhlYWRlcnMiLCJjbG9uZSIsIndpbmRvd0ZldGNoIiwidnVlIiwic2V0UGVyZm9ybWFuY2UiLCJyZXBvcnRGcmFtZUVycm9ycyIsInZhbGlkYXRlVGFncyIsImlzQXJyYXkiLCJpc1RhZ3MiLCJzZXRDdXN0b21UYWdzIiwiQ2xpZW50TW9uaXRvciJdLCJzb3VyY2VSb290IjoiIn0=
80708
+
80701
80709
  /***/ }),
80702
80710
 
80703
80711
  /***/ 3820:
@@ -90046,7 +90054,7 @@ function makeAssertionMessage (path, key, type, value, expected) {
90046
90054
  return buf
90047
90055
  }
90048
90056
 
90049
- var Vue; // bind on install
90057
+ var vuex_esm_Vue; // bind on install
90050
90058
 
90051
90059
  var Store = function Store (options) {
90052
90060
  var this$1 = this;
@@ -90055,7 +90063,7 @@ var Store = function Store (options) {
90055
90063
  // Auto install if it is not done yet and `window` has `Vue`.
90056
90064
  // To allow users to avoid auto-installation in some cases,
90057
90065
  // this code should be placed here. See #731
90058
- if (!Vue && typeof window !== 'undefined' && window.Vue) {
90066
+ if (!vuex_esm_Vue && typeof window !== 'undefined' && window.Vue) {
90059
90067
  install(window.Vue);
90060
90068
  }
90061
90069
 
@@ -90073,7 +90081,7 @@ var Store = function Store (options) {
90073
90081
  this._modules = new ModuleCollection(options);
90074
90082
  this._modulesNamespaceMap = Object.create(null);
90075
90083
  this._subscribers = [];
90076
- this._watcherVM = new Vue();
90084
+ this._watcherVM = new vuex_esm_Vue();
90077
90085
  this._makeLocalGettersCache = Object.create(null);
90078
90086
 
90079
90087
  // bind commit and dispatch to self
@@ -90105,7 +90113,7 @@ var Store = function Store (options) {
90105
90113
  // apply plugins
90106
90114
  plugins.forEach(function (plugin) { return plugin(this$1); });
90107
90115
 
90108
- var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;
90116
+ var useDevtools = options.devtools !== undefined ? options.devtools : vuex_esm_Vue.config.devtools;
90109
90117
  if (useDevtools) {
90110
90118
  devtoolPlugin(this);
90111
90119
  }
@@ -90249,7 +90257,7 @@ Store.prototype.unregisterModule = function unregisterModule (path) {
90249
90257
  this._modules.unregister(path);
90250
90258
  this._withCommit(function () {
90251
90259
  var parentState = getNestedState(this$1.state, path.slice(0, -1));
90252
- Vue.delete(parentState, path[path.length - 1]);
90260
+ vuex_esm_Vue.delete(parentState, path[path.length - 1]);
90253
90261
  });
90254
90262
  resetStore(this);
90255
90263
  };
@@ -90325,15 +90333,15 @@ function resetStoreVM (store, state, hot) {
90325
90333
  // use a Vue instance to store the state tree
90326
90334
  // suppress warnings just in case the user has added
90327
90335
  // some funky global mixins
90328
- var silent = Vue.config.silent;
90329
- Vue.config.silent = true;
90330
- store._vm = new Vue({
90336
+ var silent = vuex_esm_Vue.config.silent;
90337
+ vuex_esm_Vue.config.silent = true;
90338
+ store._vm = new vuex_esm_Vue({
90331
90339
  data: {
90332
90340
  $$state: state
90333
90341
  },
90334
90342
  computed: computed
90335
90343
  });
90336
- Vue.config.silent = silent;
90344
+ vuex_esm_Vue.config.silent = silent;
90337
90345
 
90338
90346
  // enable strict mode for new vm
90339
90347
  if (store.strict) {
@@ -90348,7 +90356,7 @@ function resetStoreVM (store, state, hot) {
90348
90356
  oldVm._data.$$state = null;
90349
90357
  });
90350
90358
  }
90351
- Vue.nextTick(function () { return oldVm.$destroy(); });
90359
+ vuex_esm_Vue.nextTick(function () { return oldVm.$destroy(); });
90352
90360
  }
90353
90361
  }
90354
90362
 
@@ -90368,7 +90376,7 @@ function installModule (store, rootState, path, module, hot) {
90368
90376
  var moduleName = path[path.length - 1];
90369
90377
  store._withCommit(function () {
90370
90378
  if ((false)) {}
90371
- Vue.set(parentState, moduleName, module.state);
90379
+ vuex_esm_Vue.set(parentState, moduleName, module.state);
90372
90380
  });
90373
90381
  }
90374
90382
 
@@ -90543,12 +90551,12 @@ function unifyObjectStyle (type, payload, options) {
90543
90551
  }
90544
90552
 
90545
90553
  function install (_Vue) {
90546
- if (Vue && _Vue === Vue) {
90554
+ if (vuex_esm_Vue && _Vue === vuex_esm_Vue) {
90547
90555
  if ((false)) {}
90548
90556
  return
90549
90557
  }
90550
- Vue = _Vue;
90551
- applyMixin(Vue);
90558
+ vuex_esm_Vue = _Vue;
90559
+ applyMixin(vuex_esm_Vue);
90552
90560
  }
90553
90561
 
90554
90562
  /**
@@ -91044,11 +91052,124 @@ function setToken(token) {
91044
91052
  function removeToken() {
91045
91053
  return Cookies.remove(TokenKey);
91046
91054
  }
91055
+ // EXTERNAL MODULE: ./node_modules/skywalking-client-js/lib/index.js
91056
+ var lib = __webpack_require__(6153);
91057
+ ;// ./node_modules/skywalking-client-js/index.js
91058
+ /**
91059
+ * Licensed to the Apache Software Foundation (ASF) under one or more
91060
+ * contributor license agreements. See the NOTICE file distributed with
91061
+ * this work for additional information regarding copyright ownership.
91062
+ * The ASF licenses this file to You under the Apache License, Version 2.0
91063
+ * (the "License"); you may not use this file except in compliance with
91064
+ * the License. You may obtain a copy of the License at
91065
+ *
91066
+ * http://www.apache.org/licenses/LICENSE-2.0
91067
+ *
91068
+ * Unless required by applicable law or agreed to in writing, software
91069
+ * distributed under the License is distributed on an "AS IS" BASIS,
91070
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
91071
+ * See the License for the specific language governing permissions and
91072
+ * limitations under the License.
91073
+ */
91074
+
91075
+
91076
+
91077
+ /* harmony default export */ var skywalking_client_js = (ClientMonitor);
91078
+
91079
+ ;// ./src/utils/skyWalking.js
91080
+
91081
+
91082
+ //注册skywalking
91083
+ skywalking_client_js.register({
91084
+ service: 'wotohubService',
91085
+ //应用名称
91086
+ serviceVersion: '10.1.0',
91087
+ //应用版本号
91088
+ traceSDKInternal: true,
91089
+ //追踪sdk
91090
+ pagePath: location.href,
91091
+ //当前路由地址
91092
+ useFmp: true,
91093
+ //use first meaningful paint
91094
+ collector: location.origin,
91095
+ // report serve
91096
+ jsErrors: true,
91097
+ // vue, js and promise errors
91098
+ apiErrors: true,
91099
+ resourceErrors: true,
91100
+ autoTracePerf: true,
91101
+ // trace performance detail
91102
+ enableSPA: true,
91103
+ detailMode: true,
91104
+ noTraceOrigins: [],
91105
+ vue: (external_commonjs_vue_commonjs2_vue_root_Vue_default()) //vue实例
91106
+ });
91107
+ //上报错误信息方法
91108
+ function reportFrameErrors(error) {
91109
+ skywalking_client_js.reportFrameErrors({
91110
+ service: 'wotohubService',
91111
+ //应用名称
91112
+ serviceVersion: '10.1.0',
91113
+ //应用版本号
91114
+ traceSDKInternal: true,
91115
+ //追踪sdk
91116
+ pagePath: location.href,
91117
+ //当前路由地址
91118
+ useFmp: true,
91119
+ //use first meaningful paint
91120
+ collector: location.origin,
91121
+ // report serve
91122
+ jsErrors: true,
91123
+ // vue, js and promise errors
91124
+ apiErrors: true,
91125
+ resourceErrors: true,
91126
+ autoTracePerf: true,
91127
+ // trace performance detail
91128
+ enableSPA: true,
91129
+ detailMode: true,
91130
+ noTraceOrigins: [],
91131
+ traceTimeInterval: 60000,
91132
+ // 1min
91133
+ vue: (external_commonjs_vue_commonjs2_vue_root_Vue_default()) //vue实例
91134
+ }, error);
91135
+ }
91136
+
91137
+ //上报错误信息方法
91138
+ function setPerformance() {
91139
+ //路由上报到skywalking
91140
+ ClientMonitor.setPerformance({
91141
+ service: 'wotohubService',
91142
+ //应用名称
91143
+ serviceVersion: '10.1.0',
91144
+ //应用版本号
91145
+ traceSDKInternal: true,
91146
+ //追踪sdk
91147
+ pagePath: location.href,
91148
+ //当前路由地址
91149
+ useFmp: true,
91150
+ //use first meaningful paint
91151
+ collector: location.origin,
91152
+ // report serve
91153
+ jsErrors: true,
91154
+ // vue, js and promise errors
91155
+ apiErrors: true,
91156
+ resourceErrors: true,
91157
+ autoTracePerf: true,
91158
+ // trace performance detail
91159
+ enableSPA: true,
91160
+ detailMode: true,
91161
+ noTraceOrigins: [],
91162
+ traceTimeInterval: 60000,
91163
+ // 1min
91164
+ vue: Vue //vue实例
91165
+ });
91166
+ }
91047
91167
  ;// ./src/utils/request-login.js
91048
91168
 
91049
91169
 
91050
91170
 
91051
91171
 
91172
+
91052
91173
  const service = lib_axios.create({
91053
91174
  baseURL: 'https://dss-apis.kuku.info'
91054
91175
  });
@@ -91078,6 +91199,16 @@ service.interceptors.request.use(config => {
91078
91199
  });
91079
91200
  service.interceptors.response.use(response => {
91080
91201
  const res = response.data;
91202
+ try {
91203
+ if (res.data.code != 0) {
91204
+ // 捕获code不为0的接口异常
91205
+ throw new Error(res.request.responseText || res.data.code);
91206
+ }
91207
+ } catch (error) {
91208
+ // 处理错误的代码,例如打印错误信息
91209
+ console.error("An error occurred:", error);
91210
+ reportFrameErrors(error);
91211
+ }
91081
91212
  return Promise.resolve(res);
91082
91213
  }, error => {
91083
91214
  if (error.response.data.code === 100003) {
@@ -96499,7 +96630,7 @@ var JSEncrypt_JSEncrypt = /** @class */ (function () {
96499
96630
  ;// ./node_modules/jsencrypt/lib/index.js
96500
96631
 
96501
96632
 
96502
- /* harmony default export */ var lib = ((/* unused pure expression or super */ null && (JSEncrypt)));
96633
+ /* harmony default export */ var jsencrypt_lib = ((/* unused pure expression or super */ null && (JSEncrypt)));
96503
96634
 
96504
96635
  ;// ./node_modules/uuid/dist/esm-browser/rng.js
96505
96636
  // Unique ID creation requires a high quality random # generator. In the browser we therefore
@@ -97251,6 +97382,7 @@ function testD(str) {
97251
97382
 
97252
97383
 
97253
97384
 
97385
+
97254
97386
  let baseUrl = "";
97255
97387
  let defaultEnv = "";
97256
97388
  function initJavaService(env) {
@@ -97263,33 +97395,6 @@ function initJavaService(env) {
97263
97395
  baseUrl = "https://api-prd.wotohub.com/";
97264
97396
  }
97265
97397
  }
97266
-
97267
- // 替换空值
97268
- function replaceNullWithEmptyMutate(obj) {
97269
- if (obj === null) return;
97270
- if (Array.isArray(obj)) {
97271
- // 修改数组元素
97272
- for (let i = 0; i < obj.length; i++) {
97273
- if (obj[i] === null) {
97274
- obj[i] = undefined; // 直接修改数组元素
97275
- } else if (typeof obj[i] === "object") {
97276
- replaceNullWithEmptyMutate(obj[i]); // 递归处理嵌套结构
97277
- }
97278
- }
97279
- } else if (typeof obj === "object") {
97280
- // 修改对象属性
97281
- for (const key in obj) {
97282
- if (obj.hasOwnProperty(key)) {
97283
- if (obj[key] === null) {
97284
- obj[key] = undefined; // 直接修改属性值
97285
- } else if (typeof obj[key] === "object") {
97286
- replaceNullWithEmptyMutate(obj[key]); // 递归处理嵌套结构
97287
- }
97288
- }
97289
- }
97290
- }
97291
- return obj; // 返回修改后的原对象
97292
- }
97293
97398
  const request_instance = lib_axios.create({
97294
97399
  baseURL: "",
97295
97400
  timeout: 250000
@@ -97300,7 +97405,6 @@ request_instance.interceptors.request.use(function (config) {
97300
97405
  // 设置签名
97301
97406
  let _key = uuid.v4();
97302
97407
  const parameter = config.params || config.data;
97303
- replaceNullWithEmptyMutate(parameter);
97304
97408
  let signatureObj = {};
97305
97409
  let signature = "";
97306
97410
  if (parameter) {
@@ -97366,11 +97470,9 @@ request_instance.interceptors.response.use(function (response) {
97366
97470
  localStorage.removeItem("outboxPage");
97367
97471
  localStorage.removeItem("omaToken");
97368
97472
  localStorage.removeItem("oma_token");
97369
- if (["www.wotohub.com", "pre-hub.kuku.info"].includes(window.location.host)) {
97473
+ if (['www.wotohub.com', 'pre-hub.kuku.info'].includes(window.location.host)) {
97370
97474
  window.location.href = "/login";
97371
97475
  }
97372
- } else if (response.data.code == "1007") {
97373
- Message.error("验签失败!!!" + response.config.url);
97374
97476
  } else if (response.data.message === "用户未登录") {
97375
97477
  localStorage.removeItem("user_info");
97376
97478
  localStorage.removeItem("user_equity");
@@ -97382,11 +97484,21 @@ request_instance.interceptors.response.use(function (response) {
97382
97484
  localStorage.removeItem("outboxPage");
97383
97485
  localStorage.removeItem("omaToken");
97384
97486
  localStorage.removeItem("oma_token");
97385
- if (["www.wotohub.com", "pre-hub.kuku.info"].includes(window.location.host)) {
97487
+ if (['www.wotohub.com', 'pre-hub.kuku.info'].includes(window.location.host)) {
97386
97488
  window.location.href = "/login";
97387
97489
  }
97388
97490
  }
97389
97491
  }
97492
+ try {
97493
+ if (res.data.code != 0) {
97494
+ // 捕获code不为0的接口异常
97495
+ throw new Error(res.request.responseText || res.data.code);
97496
+ }
97497
+ } catch (error) {
97498
+ // 处理错误的代码,例如打印错误信息
97499
+ console.error("An error occurred:", error);
97500
+ reportFrameErrors(error);
97501
+ }
97390
97502
  return response.data;
97391
97503
  }, function (error) {
97392
97504
  // 对响应错误做点什么
@@ -109454,8 +109566,8 @@ var detail_component = normalizeComponent(
109454
109566
  )
109455
109567
 
109456
109568
  /* harmony default export */ var detail = (detail_component.exports);
109457
- ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=template&id=5c3a10f9&scoped=true
109458
- var write_emailvue_type_template_id_5c3a10f9_scoped_true_render = function render() {
109569
+ ;// ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=template&id=1ddcb21d&scoped=true
109570
+ var write_emailvue_type_template_id_1ddcb21d_scoped_true_render = function render() {
109459
109571
  var _vm = this,
109460
109572
  _c = _vm._self._c;
109461
109573
  return _c('div', {
@@ -110217,7 +110329,7 @@ var write_emailvue_type_template_id_5c3a10f9_scoped_true_render = function rende
110217
110329
  }
110218
110330
  }) : _vm._e()], 1);
110219
110331
  };
110220
- var write_emailvue_type_template_id_5c3a10f9_scoped_true_staticRenderFns = [function () {
110332
+ var write_emailvue_type_template_id_1ddcb21d_scoped_true_staticRenderFns = [function () {
110221
110333
  var _vm = this,
110222
110334
  _c = _vm._self._c;
110223
110335
  return _c('div', {
@@ -110238,7 +110350,7 @@ var write_emailvue_type_template_id_5c3a10f9_scoped_true_staticRenderFns = [func
110238
110350
  }, [_c('span', [_vm._v("$4.98")]), _vm._v(" /per ordered item ")]);
110239
110351
  }];
110240
110352
 
110241
- ;// ./src/package/write-email/index.vue?vue&type=template&id=5c3a10f9&scoped=true
110353
+ ;// ./src/package/write-email/index.vue?vue&type=template&id=1ddcb21d&scoped=true
110242
110354
 
110243
110355
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js
110244
110356
  var es_set_difference_v2 = __webpack_require__(7642);
@@ -123318,17 +123430,32 @@ var saveMailTempDialog_component = normalizeComponent(
123318
123430
  }
123319
123431
  },
123320
123432
  updateFilterBloggerArr(isFilterRepeat, isFilterRisk, isFilterCooperate) {
123321
- if (isFilterRepeat && isFilterRisk) {
123322
- this.filterBloggerArr = this.addresseeArr.filter(item => !this.reContactList.some(ele => ele === item.bloggerId) && !this.riskList.some(ele => ele === item.bloggerId));
123323
- } else if (isFilterRepeat && !isFilterRisk) {
123324
- this.filterBloggerArr = this.addresseeArr.filter(item => !this.reContactList.some(ele => ele === item.bloggerId));
123325
- } else if (!isFilterRepeat && isFilterRisk) {
123326
- this.filterBloggerArr = this.addresseeArr.filter(item => !this.riskList.some(ele => ele === item.bloggerId));
123327
- } else {
123328
- this.filterBloggerArr = this.addresseeArr;
123433
+ // if (isFilterRepeat && isFilterRisk) {
123434
+ // this.filterBloggerArr = this.addresseeArr.filter(
123435
+ // item =>
123436
+ // !this.reContactList.some(ele => ele === item.bloggerId) &&
123437
+ // !this.riskList.some(ele => ele === item.bloggerId)
123438
+ // );
123439
+ // } else if (isFilterRepeat && !isFilterRisk) {
123440
+ // this.filterBloggerArr = this.addresseeArr.filter(
123441
+ // item => !this.reContactList.some(ele => ele === item.bloggerId)
123442
+ // );
123443
+ // } else if (!isFilterRepeat && isFilterRisk) {
123444
+ // this.filterBloggerArr = this.addresseeArr.filter(
123445
+ // item => !this.riskList.some(ele => ele === item.bloggerId)
123446
+ // );
123447
+ // } else {
123448
+ // this.filterBloggerArr = this.addresseeArr;
123449
+ // }
123450
+ this.filterBloggerArr = this.addresseeArr;
123451
+ if (isFilterRepeat) {
123452
+ this.filterBloggerArr = this.filterBloggerArr.filter(item => !this.reContactList.some(ele => ele === item.bloggerId));
123453
+ }
123454
+ if (isFilterRisk) {
123455
+ this.filterBloggerArr = this.filterBloggerArr.filter(item => !this.riskList.some(ele => ele === item.bloggerId));
123329
123456
  }
123330
123457
  if (isFilterCooperate) {
123331
- this.filterBloggerArr = this.addresseeArr.filter(item => !this.cooperatedList.some(ele => ele === item.bloggerId));
123458
+ this.filterBloggerArr = this.filterBloggerArr.filter(item => !this.cooperatedList.some(ele => ele === item.bloggerId));
123332
123459
  }
123333
123460
  },
123334
123461
  // 邮件检测第一步--->发件箱选择--->下一步
@@ -124099,15 +124226,15 @@ var saveMailTempDialog_component = normalizeComponent(
124099
124226
  });
124100
124227
  ;// ./src/package/write-email/index.vue?vue&type=script&lang=js
124101
124228
  /* harmony default export */ var package_write_emailvue_type_script_lang_js = (write_emailvue_type_script_lang_js);
124102
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=style&index=0&id=5c3a10f9&prod&lang=scss&scoped=true
124229
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=style&index=0&id=1ddcb21d&prod&lang=scss&scoped=true
124103
124230
  // extracted by mini-css-extract-plugin
124104
124231
 
124105
- ;// ./src/package/write-email/index.vue?vue&type=style&index=0&id=5c3a10f9&prod&lang=scss&scoped=true
124232
+ ;// ./src/package/write-email/index.vue?vue&type=style&index=0&id=1ddcb21d&prod&lang=scss&scoped=true
124106
124233
 
124107
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=style&index=1&id=5c3a10f9&prod&lang=scss
124234
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/package/write-email/index.vue?vue&type=style&index=1&id=1ddcb21d&prod&lang=scss
124108
124235
  // extracted by mini-css-extract-plugin
124109
124236
 
124110
- ;// ./src/package/write-email/index.vue?vue&type=style&index=1&id=5c3a10f9&prod&lang=scss
124237
+ ;// ./src/package/write-email/index.vue?vue&type=style&index=1&id=1ddcb21d&prod&lang=scss
124111
124238
 
124112
124239
  ;// ./src/package/write-email/index.vue
124113
124240
 
@@ -124121,11 +124248,11 @@ var saveMailTempDialog_component = normalizeComponent(
124121
124248
 
124122
124249
  var write_email_component = normalizeComponent(
124123
124250
  package_write_emailvue_type_script_lang_js,
124124
- write_emailvue_type_template_id_5c3a10f9_scoped_true_render,
124125
- write_emailvue_type_template_id_5c3a10f9_scoped_true_staticRenderFns,
124251
+ write_emailvue_type_template_id_1ddcb21d_scoped_true_render,
124252
+ write_emailvue_type_template_id_1ddcb21d_scoped_true_staticRenderFns,
124126
124253
  false,
124127
124254
  null,
124128
- "5c3a10f9",
124255
+ "1ddcb21d",
124129
124256
  null
124130
124257
 
124131
124258
  )
@@ -132138,6 +132265,7 @@ const request_test_put = (url, data) => {
132138
132265
 
132139
132266
  // import { signatureAlgorithm, signatureAlgorithm2 } from "@/plugin/crypto";
132140
132267
  // import { a, getRangeCode } from "@/utils/publicKey";
132268
+
132141
132269
  let baseDssUrl = '';
132142
132270
  let request_dss_defaultEnv = '';
132143
132271
  function initDssService(env) {
@@ -132195,6 +132323,16 @@ request_dss_instance.interceptors.response.use(function (response) {
132195
132323
  if (response.status === 503) {
132196
132324
  alert('服务器不可用,请联系系统管理员');
132197
132325
  }
132326
+ try {
132327
+ if (res.data.code != 0) {
132328
+ // 捕获code不为0的接口异常
132329
+ throw new Error(res.request.responseText || res.data.code);
132330
+ }
132331
+ } catch (error) {
132332
+ // 处理错误的代码,例如打印错误信息
132333
+ console.error("An error occurred:", error);
132334
+ reportFrameErrors(error);
132335
+ }
132198
132336
  return response.data;
132199
132337
  }, function (error) {
132200
132338
  // 对响应错误做点什么