hotstaq 0.6.21 → 0.6.23

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.
@@ -1,2 +1,2 @@
1
- var HotStaqWeb;(()=>{var __webpack_modules__={230:t=>{t.exports="object"==typeof self?self.FormData:window.FormData},646:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)t[o]=n[o]}return t}return function e(n,o){function r(e,r,s){if("undefined"!=typeof document){"number"==typeof(s=t({},o,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var l in s)s[l]&&(i+="; "+l,!0!==s[l]&&(i+="="+s[l].split(";")[0]));return document.cookie=e+"="+n.write(r,e)+i}}return Object.create({set:r,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],o={},r=0;r<e.length;r++){var s=e[r].split("="),i=s.slice(1).join("=");try{var l=decodeURIComponent(s[0]);if(o[l]=n.read(i,l),t===l)break}catch(t){}}return t?o[t]:o}},remove:function(e,n){r(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(o)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},300:(t,e)=>{"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==n)return n;throw new Error("unable to locate global object")}();t.exports=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response},507:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Hot=exports.DeveloperMode=void 0;const HotFile_1=__webpack_require__(732),HotStaq_1=__webpack_require__(243),HotTestElement_1=__webpack_require__(967),js_cookie_1=__importDefault(__webpack_require__(646)),node_fetch_1=__importDefault(__webpack_require__(300));var DeveloperMode;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(DeveloperMode=exports.DeveloperMode||(exports.DeveloperMode={}));class Hot{static include(t,e=null){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq_1.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}Hot.echo(yield Hot.getFile(t,e))}))}static includeJS(file){return __awaiter(this,void 0,void 0,(function*(){const res=yield Hot.httpRequest(file),output=yield res.text();!0===HotStaq_1.HotStaq.isWeb?eval.apply(window,[output]):eval(output)}))}static runFile(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=Hot.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let o=yield n.process(e);Hot.echo(o)}))}static getFile(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=null;return"string"==typeof t?(n=new HotFile_1.HotFile,!0===HotStaq_1.HotStaq.isWeb?n.url=t:n.localFile=t):n=t,yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n="POST",o={}){return __awaiter(this,void 0,void 0,(function*(){let r=null;if(null==Hot.CurrentPage)throw new Error("Current page is null!");if(null==Hot.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==Hot.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=Hot.CurrentPage.processor.api&&(r=yield Hot.CurrentPage.processor.api.makeCall(t,e,n,o)),r}))}static jsonRequest(t,e=null,n="POST"){return __awaiter(this,void 0,void 0,(function*(){try{let o={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};"POST"===n&&(o.body=JSON.stringify(e));let r=yield(0,node_fetch_1.default)(t,o);if(!1===r.ok)throw new Error(`${r.status}: ${r.statusText}`);return yield r.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return __awaiter(this,void 0,void 0,(function*(){return yield(0,node_fetch_1.default)(t,e)}))}static echo(t){Hot.Output+=t}static displayCSS(){for(let t=0;t<Hot.CSS.length;t++){let e=Hot.CSS[t],n=Hot.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),Hot.echo(n)}}static displayJSFiles(){for(let t=0;t<Hot.JSFiles.length;t++){let e=Hot.JSFiles[t],n=Hot.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),Hot.echo(n)}}static displayJSScripts(){for(let t=0;t<Hot.JSScripts.length;t++){let e=Hot.JSScripts[t],n=Hot.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),Hot.echo(n)}}}exports.Hot=Hot,Hot.CurrentPage=null,Hot.Arguments=null,Hot.DeveloperMode=DeveloperMode,Hot.HotTestElement=HotTestElement_1.HotTestElement,Hot.Mode=DeveloperMode.Production,Hot.API=null,Hot.TesterAPI=null,Hot.Output="",Hot.Data={},Hot.Cookies=js_cookie_1.default,Hot.PublicKeys={},Hot.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',Hot.CSS=[],Hot.JSFiles=[],Hot.JSScripts=[],Hot.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',Hot.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},233:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))},r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const s=r(n(300)),i=r(n(230)),l=n(810),a=n(761),u=n(70);var h;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(h=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e=null,n=null){this.connection=e,this.description="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=h.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let o="";if(t instanceof a.HotRoute?(o=t.route,this.routes[t.route]=t):(o=t,null==this.routes[o]&&(this.routes[o]=new a.HotRoute(this.connection,o)),e instanceof u.HotRouteMethod?this.routes[o].addMethod(e):this.routes[o].addMethod(new u.HotRouteMethod(this.routes[o],e,n))),this.routes[o].connection=this.connection,!0===this.createFunctions){let t=this[o];null==t&&(t={});for(let e=0;e<this.routes[o].methods.length;e++){let n=this.routes[o],r=this.routes[o].methods[e];t[r.name]=(t,e)=>{let o=r.type,s="";""!==n.version&&(s+=`/${n.version}`),""!==n.route&&(s+=`/${n.route}`),""!==r.name&&(s+=`/${r.name}`);let i=null;if(null!=this.authCredentials&&(i=this.authCredentials),null!=r.authCredentials?i=r.authCredentials:null!=r.route.authCredentials&&(i=r.route.authCredentials),null==i&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(i=Hot.API[n.route].authCredentials),null!=i)for(let e in i){let n=i[e];null==t[e]&&(t[e]=n)}let l=[s,t,o,e];return this.makeCall.apply(this,l)}}this[o]=t}}registerRoute(t){return o(this,void 0,void 0,(function*(){this.connection instanceof l.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return o(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n="POST",r={}){return o(this,void 0,void 0,(function*(){let l=this.baseUrl;if(n=n.toUpperCase(),"/"===l[l.length-1]&&(l=l.substr(0,l.length-1)),"/"!==t[0]&&(l+="/"),l+=t,Object.keys(r).length>0){if("POST"!==n)throw new Error("To upload files, you must set the httpMethod to POST.");const o=new i.default;for(let t in r)o.append(t,r[t]);let a=yield(0,s.default)(l,{method:"POST",body:o}),u=yield a.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=u.hotstaq.uploads.uploadId,yield this.makeCall(t,e,n)}let a={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};return"GET"!==n&&"HEAD"!==n&&(a.body=JSON.stringify(e)),new Promise(((t,e)=>{(0,s.default)(l,a).then((e=>o(this,void 0,void 0,(function*(){let n=yield e.json();t(n)})))).catch((t=>{throw new Error(`${l}: ${t.message}`)}))}))}))}}},957:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const o=n(810);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=o.HotServerType.HTTP,this.logger=t.logger}}},260:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const r=n(243);e.HotComponent=class{constructor(t,e=null){t instanceof r.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return o(this,void 0,void 0,(function*(){return t}))}}},732:function(t,e,n){"use strict";var o=this&&this.__createBinding||(Object.create?function(t,e,n,o){void 0===o&&(o=n),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,o){void 0===o&&(o=n),t[o]=e[n]}),r=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&o(e,t,n);return r(e,t),e},i=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const a=s(n(351)),u=l(n(300)),h=n(507);class c{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield c.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{a.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let o=n.toString();this.content=o,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,o,r=2,s=2){let i=e.exec(t),l=0,a="";for(;null!=i;){let u=i.index-r,h=e.lastIndex+s,c=t.substr(l,u-l);l=h,a+=o(c),a+=n(i[0]),i=e.exec(t)}return a+=o(t.substr(l)),a}static processNestedContent(t,e,n,o,r,s,i=2,l=1){let a=t.indexOf(e),u=0,h=t.indexOf(o,a),c="";for(;a>-1;){let p=t.indexOf(n,a),d=0;if(""!==o){let e=t.lastIndexOf(o,p-l);for(;e>-1&&e!==h;)e=t.lastIndexOf(o,e-l),d++}if(d>0){let o=t.indexOf(n,p+l),r=o;for(;o>-1&&d>0&&!(r<0)&&!(t.lastIndexOf(e,r-l)>o);)o=r,r=t.indexOf(n,o+l),d--;p=o}c+=s(t.substr(u,a-u)),c+=r(t.substr(a+i,p-(a+i))),a=t.indexOf(e,p+l),h=t.indexOf(o,a),u=p+l}return c+=s(t.substr(u)),c}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let o="JSON.stringify (",r=")";return!1===n.allowStringify&&(o="",r=""),c.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=c.processNestedContent(t,"!{","}","{",(t=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=c.processNestedContent(s,"STR{","}","{",(t=>{let s="";return s=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${o}${t}${r}, ${e});*&!#%@!@*!`,s}),(t=>t),4,1),l=c.processNestedContent(i,"${","}","{",(t=>{let o="";return!0===n.outputCommands?(o=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo ("");}*&!#%@!@*!`,!0===e&&(o=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):o=`*&&%*%@#@!${t}*&!#%@!@*!`,o}),(t=>t)),a="";h.Hot.Mode===h.DeveloperMode.Production&&(a=c.processNestedContent(l,"?(",")","(",(t=>""),(t=>t))),h.Hot.Mode===h.DeveloperMode.Development&&(a=c.processNestedContent(l,"?(",")","(",(t=>{let e="";try{JSON.parse(t),e=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(n){e=`${t}`}let o="";if(!0===n.outputCommands)o=`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new h.Hot.HotTestElement(n)),n instanceof Array&&(e=new h.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new h.Hot.HotTestElement(n)),null!=h.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${h.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const n=t(e);o=`*&&%*%@#@!data-test-object-name = "${n.name}" data-test-object-func = "${n.func}" data-test-object-value = "${n.value}"*&!#%@!@*!`}return o}),(t=>t)));let u=c.processNestedContent(a,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",(t=>t),(t=>{let o="";o=!0===n.allowStringify?JSON.stringify(t):t;let r="";return r=!0===n.outputCommands?`echoOutput (${o}, ${e});\n`:o,r}),"*&&%*%@#@!".length,"*&!#%@!@*!".length);return u=u.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),u=u.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),u}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;h.Hot.Mode=this.page.processor.mode,h.Hot.Arguments=t,h.Hot.CurrentPage=this.page,h.Hot.PublicKeys=this.page.processor.publicKeys,h.Hot.API=this.page.getAPI(),h.Hot.TesterAPI=this.page.getTesterAPI();let n=c.parseContent(e,this.throwAllErrors),o=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let o="",r=t[n];o=`var ${n} = ${JSON.stringify(r)};\n`,e+=o}let r=this.name;""===r&&(r=this.localFile),""===r&&(r=this.url),e+='\n\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=n,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);o=yield s.apply(this,[h.Hot,this])}catch(t){throw SyntaxError,t}h.Hot.Data=o.hot.Data;let r=o.output;return h.Hot.Output="",r}))}}e.HotFile=c},802:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t){this.logLevel===n.Verbose&&console.info(t)}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},136:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const r=n(507),s=n(243);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="",this.testerMap="",this.route="",this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"",this.testerMap=t.testerMap||"",this.route=t.route||"",this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return o(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return o(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return o(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let o=this.files[n];r.Hot.Output="",o.page=this,e+=(yield o.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},761:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const o=n(70);class r{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:r.createError("Not authorized."),no_server_execute_function:r.createError("Missing server execute function.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=o.HTTPMethod.POST,r=null){"string"==typeof t&&(t=new o.HotRouteMethod(this,t,e,n,null,null,null,r)),t instanceof o.HotRouteMethod||(null==t.route&&(t.route=this),t=new o.HotRouteMethod(t)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let o=this.methods[n];if(o.name===t){e=o;break}}return e}}e.HotRoute=r},70:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.HTTPMethod=void 0;const o=n(507),r=n(761),s=n(810);var i;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json"}(i=e.HTTPMethod||(e.HTTPMethod={})),e.HotRouteMethod=class{constructor(t,e="",n=null,l=i.POST,a=null,u=null,h=null,c=null){let p=null;if(t instanceof r.HotRoute)p=t;else{if(p=t.route,null!=t.type&&(l=t.type),null!=t.name&&(e=t.name),null!=t.description&&(this.description=t.description),null!=t.returns&&("string"==typeof t.returns?this.returns={type:"string",required:!0,description:t.returns}:this.returns=t.returns),null!=t.parameters){this.parameters={};for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?this.parameters[e]={type:n,required:!1,description:""}:(null==n.type&&(n.type="string"),this.parameters[e]=n)}}null!=t.authCredentials&&(h=t.authCredentials),null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(a=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(this.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(this.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(this.onClientExecute=t.onClientExecute),null!=t.testCases&&(c=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(this.route=p,this.name=e,this.type=l,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=h,this.onServerAuthorize=a,this.onRegister=u,this.testCases={},this.route.connection.processor.mode===o.DeveloperMode.Development&&null!=c)if(c instanceof Array)for(let t=0;t<c.length;t++){let e=c[t];if("string"==typeof e){const n=e,o=c[t+1];this.addTestCase(n,o),t++}else this.addTestCase(e)}else for(let t in c){let e=c[t];this.addTestCase(e)}this.route.connection instanceof s.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,o=e;return void(this.testCases[n]={name:n,func:o})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,o=t;return void(this.testCases[n]={name:n,func:o})}const n=t;this.testCases[n.name]=n}}},810:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const r=n(243);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof r.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:80,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:80,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return o(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},243:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,o){void 0===o&&(o=n),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,o){void 0===o&&(o=n),t[o]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const fs=__importStar(__webpack_require__(351)),ppath=__importStar(__webpack_require__(606)),node_fetch_1=__importDefault(__webpack_require__(300)),validate_npm_package_name_1=__importDefault(__webpack_require__(651)),HotPage_1=__webpack_require__(136),HotFile_1=__webpack_require__(732),HotComponent_1=__webpack_require__(260),HotLog_1=__webpack_require__(802),Hot_1=__webpack_require__(507),HotClient_1=__webpack_require__(957),HotTesterAPI_1=__webpack_require__(414),HotTestMap_1=__webpack_require__(985);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\twindow.HotStaq = HotStaqWeb.HotStaq;\n\t\twindow.HotClient = HotStaqWeb.HotClient;\n\t\twindow.HotAPI = HotStaqWeb.HotAPI;\n\t\twindow.Hot = HotStaqWeb.Hot;\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tfunction hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%load_hot_site%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.None),this.publicKeys={},this.testers={}}static parseBoolean(t){if("true"===(t=t.toLowerCase()))return!0;if("false"===t)return!1;if("yes"===t)return!0;if("no"===t)return!1;if("yep"===t)return!0;if("nah"===t)return!1;try{if(0!=parseInt(t))return!0}catch(t){}return!1}static getParam(t,e,n=!0,o=!0){let r=e[t];if(null==r&&!0===n&&!0===o)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof r&&!0===n&&""===r&&!0===o)throw new Error(`Missing required parameter ${t}.`);return r}static getParamDefault(t,e,n){let o=e[t];return null==o||"string"==typeof o&&""===o?n:o}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t){if(null==this.files[t])throw new Error(`Unable to find file ${t}`);return this.files[t]}static keepContext(t,e,n){return function(){var o=Array.prototype.slice.call(arguments);return null!=n&&o.push(n),null==e?t.apply(this,o):t.apply(e,o)}}addComponent(t,e=null,n){let o=this.api;null!=e&&(o=e);let r=new t(this,o);if(null!=this.components[r.tag])throw new Error(`Component ${r.tag} already exists!`);this.components[r.tag]={componentType:t,processor:this,api:o},this.registerComponent(r.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let o="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,o="tbody"),"th"===e&&(t=`<table>${t}</table>`,o=e)}return{fixedStr:t,querySelector:o}}registerComponent(t,e){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];this.component=new e.componentType(e.processor,e.api)}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),o=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))o.body.appendChild(t);for(let t of Array.from(o.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return o}get observedAttributes(){return this.component.observedAttributes}connectedCallback(){return __awaiter(this,void 0,void 0,(function*(){if(this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)yield this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),o=e.value;if("id"===n&&(this.component.name=o),"name"===n&&(this.component.name=o),"value"===n&&(this.component.value=o),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=o}}if(null!=this.component.onPreOutput&&!1===(yield this.component.onPreOutput()))return;let t=yield this.component.output();null!=this.component.onPostOutput&&(t=yield this.component.onPostOutput(t));let e=[];"string"==typeof t?e.push({html:t}):e=t instanceof Array?t:[t];for(let t=0;t<e.length;t++){let n=e[t],o=n.html,r="";null!=n.addFunctionsTo&&(r=n.addFunctionsTo);let s=HotFile_1.HotFile.parseContent(o,!0,{outputCommands:!1});null!=this.component.onParsed&&(s=yield this.component.onParsed(s));let i={fixedStr:"",querySelector:""};i=null!=this.component.onFixHTML?yield this.component.onFixHTML(s):HotStaq.fixHTML(s);let l=null,a=null;if(l=null!=this.component.onParseDOM?yield this.component.onParseDOM(i.fixedStr):(new DOMParser).parseFromString(i.fixedStr,"text/html"),l.body.children.length<1)throw new Error(`No component output from ${this.component.name}`);if(l.body.children.length>1){let t=!0;for(let e=0;e<l.body.children.length;e++){let n=l.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){a=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}a=""===i.querySelector?l.body.children[0]:l.querySelector(i.querySelector);let u=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];u.push(this.removeChild(e))}this.replaceWith(a),null!=this.component.click&&(a.onclick=this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];a.addEventListener(e.type,e.func,e.options)}let h=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<h.length;t++){let e=h[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in HotComponent_1.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(a[e]=HotStaq.keepContext(this.component[e],this.component),""!==r)&&(document.querySelector(r)[e]=HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(a=yield this.component.onPrePlace(a));let c=yield this.component.onCreated(a);if(null!=this.component.onParentPlace&&(c.onParentPlace=this.component.onParentPlace),c.hotComponent=this.component,this.component.htmlElements.push(c),null!=n.parentSelector){let t=document.querySelector(n.parentSelector);c.parentElement.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c))}if(null!=n.placeHereParent){let t=c.parentNode,e=0;for(;e<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let o=t.querySelectorAll(`hot-place-here[name="${n.placeHereParent}"]`);if(o.length>0){let t=o[0];c.parentNode.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c));break}if(o.length<1){let e=t.querySelectorAll(`[hot-place-here="${n.placeHereParent}"]`);if(e.length>0){let t=e[0];c.parentNode.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c));break}}t=t.parentNode,e++}}for(let t=0;t<u.length;t++){const e=u[t];c.appendChild(e),null!=e.onParentPlace&&(yield e.hotComponent.onParentPlace(c,e))}null!=this.component.onPostPlace&&(c=yield this.component.onPostPlace(c.parentNode,c))}}))}},e)}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let o=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),o=(new DOMParser).parseFromString(t.fixedStr,"text/html"),r=null;r=""===t.querySelector?o.body.children:o.querySelector(t.querySelector).children;let s=[];for(let t=0;t<r.length;t++){let e=r[t];s.push(n.appendChild(e))}return s}return o=n.appendChild(e),o}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t);return null!=n.errors&&n.errors.length>0&&(()=>{if(!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`)})(),!0}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let o=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==o[n]){o=null;break}o=o[n]}null!=o&&(n=o)}return n}processHotSite(){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes,testerUrl="http://127.0.0.1:8182",tester=null,driver=null;if(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development&&null!=this.hotSite.testing){let t=t=>{let e=!0;null!=t.createNewTester&&(e=t.createNewTester);let n="Tester";if(null!=t.tester&&(n=t.tester),null!=t.testerName&&(n=t.testerName),!0===e?(HotTesterMocha=Object(function(){var t=new Error("Cannot find module './HotTesterMocha'");throw t.code="MODULE_NOT_FOUND",t}()),HotTesterMochaSelenium=Object(function(){var t=new Error("Cannot find module './HotTesterMochaSelenium'");throw t.code="MODULE_NOT_FOUND",t}()),HotTestSeleniumDriver=Object(function(){var t=new Error("Cannot find module './HotTestSeleniumDriver'");throw t.code="MODULE_NOT_FOUND",t}()),""===t.testerAPIUrl&&(testerUrl=t.testerAPIUrl),"HotTestSeleniumDriver"===t.driver&&(driver=new HotTestSeleniumDriver),"HotTesterMocha"===t.tester&&(tester=new HotTesterMocha(this,n,testerUrl,driver)),"HotTesterMochaSelenium"===t.tester&&(tester=new HotTesterMochaSelenium(this,n,testerUrl))):tester=this.testers[n],null==tester.driver)throw new Error(`Tester ${n} does not have a driver set!`);null!=t.commandDelay&&(tester.driver.commandDelay=t.commandDelay)};null!=this.hotSite.testing.web&&t(this.hotSite.testing.web),null!=this.hotSite.testing.api&&t(this.hotSite.testing.api)}if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),o=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let o=e.map[n];t.push(new HotTestMap_1.HotTestDestination(o))}}else{t={};for(let n in e.map){let o=e.map[n];t[n]=new HotTestMap_1.HotTestDestination(o)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(o)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,o=new HotTestMap_1.HotTestMap;o.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];o.destinations.push(new HotTestMap_1.HotTestDestination(n))}if(null==tester)throw new Error("A tester was not created first! You must specify one in the CLI or in HotSite.json.");tester.testMaps[n]=o}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester)}))}loadHotSite(t){return __awaiter(this,void 0,void 0,(function*(){let e="";if(!0===HotStaq.isWeb){this.logger.info(`Downloading HotSite ${t}`);let n=yield(0,node_fetch_1.default)(t);this.logger.info(`Downloaded site ${t}`),e=n.text()}else t=ppath.normalize(t),this.logger.info(`Accessing HotSite ${t}`),e=yield new Promise(((e,n)=>{fs.readFile(t,((n,o)=>{if(null!=n)throw n;let r=o.toString();this.logger.info(`Accessed site ${t}`),e(r)}))}));this.hotSite=JSON.parse(e),this.hotSite.hotsitePath=t}))}loadHotFiles(t,e=!1){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let n in t){let o=t[n],r=null;HotStaq.isWeb,r=new HotFile_1.HotFile({name:n}),null!=o.url&&(r.url=o.url),!1===HotStaq.isWeb&&null!=o.localFile&&(r.localFile=o.localFile);let s=!0;if(null!=o.content&&(r.content=o.content,s=!1),!0===e&&(s=!0),!0===s){let t="";""!==r.url&&(t=r.url),""!==r.localFile&&(t=r.localFile),this.logger.verbose(`Loading Hott file: ${t}`),yield r.load(),this.logger.verbose(`Finished loading Hott file: ${t}`)}this.addFile(r)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",o="./js/HotStaq.min.js",r=!0,s=null){let i="",l="",a="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),l+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let o=this.apiContent;o=o.replace(/\%api\_name\%/g,t.apiName),o=o.replace(/\%api\_exported\_name\%/g,t.libraryName),o=o.replace(/\%base\_url\%/g,n),l+=o}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(o=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let o=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(o.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}a+=`processor.publicKeys["${t}"] = ${e};\n`}}let u=this.pageContent;return u=(u=>{let h="",c="";this.mode===Hot_1.DeveloperMode.Development&&(h="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(c=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),c=c.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=`"${e.url}"`,o="";if(""!==e.content){let t=JSON.stringify(e.content);t=t.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),t=t.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),o=`, "content": ${t}`}p+=`\t\t\tfiles["${t}"] = { "url": ${n}${o} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===r&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(u=u.replace(/\%args\%/g,JSON.stringify(s)));let d=t,m="",f="",g="Tester";return null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.tester&&(g=this.hotSite.testing.web.tester),null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(m=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(f=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name),(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%hotstaq\_js\_src\%/g,o)).replace(/\%developer\_mode\%/g,h)).replace(/\%tester\_api\%/g,c)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_hot\_site\%/g,"")).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,l)).replace(/\%public\_secrets\%/g,a)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${m}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${f}"`)})(u),u}createExpressRoutes(t,e="./js/HotStaq.min.js"){for(let n in this.pages){let o=this.pages[n];const r=this.generateContent(o.route,o.name,o.files[0].url,e);t.get(o.route,((t,e)=>{e.send(r)}))}}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let o=e[n];yield this.executeTests(t,o)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let o=e[n];yield this.executeTests(t,o)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let o=new HotStaq,r=new HotFile_1.HotFile({localFile:t});yield r.load();let s=new HotPage_1.HotPage({processor:o,name:e,files:[r]});return o.addPage(s),yield o.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((o,r)=>{n.onload=()=>{o()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&o()}))}}}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),o=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);o.connection.api=o,t.testerAPI=o}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static displayUrl(t,e=null,n=null,o=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((r,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==o&&null!=t.args&&(o=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=o,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),r(n)}))))}))}))}static displayContent(t,e=null,n=null,o=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((r,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==o&&null!=t.args&&(o=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=o;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),r(n)}))))}))}))}}if(exports.HotStaq=HotStaq,HotStaq.version="0.6.21",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.errors={},"undefined"!=typeof document){let loadHotStaqSite=function(){let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq.isWeb=!0,void 0!==HotStaqWeb&&(window.HotStaq=HotStaqWeb.HotStaq,window.HotClient=HotStaqWeb.HotClient,window.HotAPI=HotStaqWeb.HotAPI,window.Hot=HotStaqWeb.Hot,window.HotComponent=HotStaqWeb.HotComponent),hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let o=e[n];if(null!=t.getAttribute(o))return t.getAttribute(o);if(null!=t.getAttribute(`data-${o}`))return t.getAttribute(`data-${o}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[];null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),o=getAttr(e,["unsupported-browser-redirect"]);null!=o?HotStaq.errors.unsupportedBrowser={redirectToUrl:o}:HotStaq.errors[`${n}`]={redirectToUrl:o}}try{eval("async () => {}")}catch(t){HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],o=getAttr(n,["name"]),r=getAttr(n,["serve-local","serveLocally"]);if(o===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),o=getAttr(e,["base"]),r=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,base:o||void 0,src:r||void 0}}}let t=window.location.pathname;if(null!=r){const e=r.toLowerCase();if("true"===e||"yes"===e||"1"===e){const e=t.lastIndexOf("/");e>-1&&(t=t.substring(e))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],o=n.replace("*","");if(t.indexOf(o)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(""===apiUrl)throw new Error("api-url was not set!");let e=window;null!=apiLibrary&&(e=window[apiLibrary]);let n=new e[apiName](apiUrl,t);n.connection.api=n,processor.api=n}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq.displayUrl(options)}else HotStaq.displayContent(options)}))}),50)}};window.ethereum22=window.ethereum,window.addEventListener("load",loadHotStaqSite)}},628:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0;const r=n(243),s=n(967);e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.persistentData={}}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let o=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(o=t=t.replace(/\>/,"")),o}wait(t){return o(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return o(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return o(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}assert(t,e=""){return o(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}run(t){return o(this,void 0,void 0,(function*(){let e=[];for(let n=0;n<t.length;n++){let o=t[n],i=null,l="",a="";if("string"==typeof o){if(i=this.page.testElements[o],null==i)throw new Error(`HotTestDriver: Unable to find test element ${o}`);l=i.func,a=i.value}if(o instanceof Array){let t=o[0];i=this.page.testElements[t],null==i?(i=new s.HotTestElement(t),l=o[1],a=o[2]):(l=i.func,a=i.value,o.length>1&&(l=o[1]),o.length>2&&(a=o[2]))}i.func=l,i.value=a;let u=yield this.runCommand(i);yield r.HotStaq.wait(this.commandDelay),e.push(u)}return e}))}}},967:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},985:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n,e.HotTestMap=class{constructor(t=[],e={},o=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let o=t[e];this.destinations.push(new n(o))}}else{this.destinations={};for(let e in t){let o=t[e];this.destinations[e]=new n(o)}}this.destinationOrder=o,this.pages=e}}},677:function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const r=n(243);class s{constructor(t,e,n,o,r={}){this.processor=t,this.name=e,this.baseUrl=n,this.testMaps=r,this.driver=o,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}waitForData(){return o(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield r.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},o=e.destination.split(/\-\>/g),r=o[0];if(r.length<2)return null;if("/"===r[0]&&"/"===r[1])return null;let s=(t,e)=>{let n=t.indexOf(e),o="";return n>-1&&(o=t.substr(n+e.length),o=o.trim()),o};n.page=s(r,"page:"),n.api=s(r,"api:");for(let t=1;t<o.length;t++){let e=o[t],r={cmd:"",dest:"",path:""};e=e.trim(),r.dest=s(e,"dest:"),r.cmd=s(e,"cmd:"),r.path=s(e,"path:"),""==r.dest&&""==r.cmd&&""==r.path&&(r.path=e),n.paths.push(r)}return n}executeTestAPIPath(t,e,n,r=!1,s=!1){return o(this,void 0,void 0,(function*(){let o=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===r&&null!=this.onTestAPIPathStart&&(o=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===o){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===r&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return o(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let o=0;o<t.paths.length;o+=2){let r=t.paths[o].path,s=n.getMethod(r),i=t.paths[o+1].path;if(null==s)throw new Error(`Unable to find method related to path ${r} in map ${t.mapName}`);let l=yield this.executeTestAPIPath(t,s,i);e.push(l)}return e}))}executeTestPagePath(t,e,n=!1,r=!1){return o(this,void 0,void 0,(function*(){let o=!0,s=this.testMaps[t.mapName];if(null==s)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);let i=s.pages[t.page];if(null==i)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=i;let l=e.path,a=i.testPaths[l];!1===n&&null!=this.onTestPagePathStart&&(o=yield this.onTestPagePathStart(t,i,e,r));let u=null;if(!0===o){if(null==a)throw new Error(`HotTester: Test path ${l} does not have a function!`);u=yield a(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,a,u,r)),u}))}executeCommand(t,e,n,s){return o(this,void 0,void 0,(function*(){let i=(t,e,o)=>{let r=!1;n.cmd===e&&(r=!0);const s=n.cmd.indexOf("(");return s>-1&&n.cmd.substr(0,s)===e&&(r=!0),r},l=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},a=null,u=[];if(!0===i(n.cmd,"waitForTesterAPIData")&&(a=t=>o(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===i(n.cmd,"wait")&&(u=l(n.cmd),a=t=>o(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield r.HotStaq.wait(e)}))),!0===i(n.cmd,"url")&&(u=l(n.cmd),a=t=>o(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.navigateToUrl(e)}))),!0===i(n.cmd,"print")&&(u=l(n.cmd),a=t=>o(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===i(n.cmd,"println")&&(u=l(n.cmd),a=t=>o(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===i(n.cmd,"waitForTestObject")&&(u=l(n.cmd),a=t=>o(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield this.driver.waitForTestElement(e)}))),null==a)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,s,u,a)}))}executeTestPagePaths(t,e=!1){return o(this,void 0,void 0,(function*(){let n=[],o=this.testMaps[t.mapName];if(null==o)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);for(let r=0;r<t.paths.length;r++){let i=t.paths[r],l=null,a=o.pages[t.page];if(null==a)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==i.dest){if(o.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=o.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(l=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,a,i,i.cmd)),""!==i.path&&(l=yield this.executeTestPagePath(t,i,!1,e)),n.push(l)}return n}))}execute(t){return o(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);let n=this.processor.getRouteKeyFromName(t),r="";""!==n&&(r=`${this.baseUrl}${n}`);let i=(e,n="")=>o(this,void 0,void 0,(function*(){if(!1===e.autoStart)return;let o=s.interpretDestination(t,e),i=!1,l=!0;""!==o.page&&(i=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(i,r,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(l=yield this.onTestStart(o,r,n)),!0===l&&(""!==o.page&&(yield this.executeTestPagePaths(o)),""!==o.api&&(yield this.executeTestAPIPaths(o))),null!=this.onTestEnd&&(yield this.onTestEnd(o)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield i(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let o=e.destinationOrder[n],r=e.destinations[o];if(null==r)throw new Error(`HotTester: Destination ${o} does not exist!`);t.push(o),yield i(r,o)}for(let n in e.destinations){let o=!0;for(let e=0;e<t.length;e++)if(t[e]===n){o=!1;break}if(!0===o){let t=e.destinations[n];yield i(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield i(n,t)}}))}}e.HotTester=s},414:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,s){function i(t){try{a(o.next(t))}catch(t){s(t)}}function l(t){try{a(o.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((o=o.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(233),HotRoute_1=__webpack_require__(761),HotRouteMethod_1=__webpack_require__(70);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let o=new HotRoute_1.HotRoute(e,"tester");o.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),o.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),o.addMethod({name:"heartbeat",type:HotRouteMethod_1.HTTPMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(o)}pageLoaded(req,res,authorizedValue,jsonObj,queryObj){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:jsonObj.testerName,testerMap:jsonObj.testerMap,pageName:jsonObj.pageName,testElements:jsonObj.testElements,testPathsStrs:jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerMap} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t,e,n,o,r){return __awaiter(this,void 0,void 0,(function*(){let t=o.testerName,e=o.testerMap;if(null==t||null==e)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===t||""===e)throw new Error("TesterAPI: Not all required json objects were passed.");let n=this.connection;return null!=n.executeTests&&(yield n.executeTests(t,e)),!0}))}heartbeat(t,e,n,o,r){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},859:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const o=n(243),r=n(507),s=n(260),i=n(732),l=n(802),a=n(136),u=n(233),h=n(761),c=n(70),p=n(810),d=n(957),m=n(628),f=n(967),g=n(677),_=n(414),H=n(985);o.HotStaq.isWeb=!0,t.exports.HotStaq=o.HotStaq,t.exports.Hot=r.Hot,t.exports.DeveloperMode=r.DeveloperMode,t.exports.HotComponent=s.HotComponent,t.exports.HotAPI=u.HotAPI,t.exports.EventExecutionType=u.EventExecutionType,t.exports.HotFile=i.HotFile,t.exports.HotLog=l.HotLog,t.exports.HotLogLevel=l.HotLogLevel,t.exports.HotPage=a.HotPage,t.exports.HotRoute=h.HotRoute,t.exports.HotRouteMethod=c.HotRouteMethod,t.exports.HTTPMethod=c.HTTPMethod,t.exports.HotServer=p.HotServer,t.exports.HotServerType=p.HotServerType,t.exports.HotClient=d.HotClient,t.exports.HotTester=g.HotTester,t.exports.HotTesterAPI=_.HotTesterAPI,t.exports.HotTestMap=H.HotTestMap,t.exports.HotTestDestination=H.HotTestDestination,t.exports.HotTestElement=f.HotTestElement,t.exports.HotTestElementOptions=f.HotTestElementOptions,t.exports.HotTestDriver=m.HotTestDriver},651:t=>{"use strict";t.exports={}},351:()=>{},606:()=>{}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}var __webpack_exports__=__webpack_require__(859);HotStaqWeb=__webpack_exports__})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQU9DLFFBQVAsZUFBbUMsRUFBQW9KLGVBQ25DckosRUFBT0MsUUFBUCxXQUErQixFQUFBNFMsV0FDL0I3UyxFQUFPQyxRQUFQLFVBQThCLEVBQUFnSyxVQUM5QmpLLEVBQU9DLFFBQVAsY0FBa0MsRUFBQW1MLGNBQ2xDcEwsRUFBT0MsUUFBUCxVQUE4QixFQUFBMmlCLFVBQzlCNWlCLEVBQU9DLFFBQVAsVUFBOEIsRUFBQW9uQixVQUM5QnJuQixFQUFPQyxRQUFQLGFBQWlDLEVBQUE0aUIsYUFDakM3aUIsRUFBT0MsUUFBUCxXQUErQixFQUFBMGQsV0FDL0IzZCxFQUFPQyxRQUFQLG1CQUF1QyxFQUFBNmQsbUJBQ3ZDOWQsRUFBT0MsUUFBUCxlQUFtQyxFQUFBc0gsZUFDbkN2SCxFQUFPQyxRQUFQLHNCQUEwQyxFQUFBMnJCLHNCQUMxQzVyQixFQUFPQyxRQUFQLGNBQWtDLEVBQUE0ckIsYSx1QkNoRGxDN3JCLEVBQU9DLFFBQVUsQ0FBQyxDLHlCQ0NkNnJCLHlCQUEyQixDQUFDLEVBR2hDLFNBQVNDLG9CQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgseUJBQXlCRSxHQUM1QyxRQUFxQnJnQixJQUFqQnNnQixFQUNILE9BQU9BLEVBQWFoc0IsUUFHckIsSUFBSUQsRUFBUzhyQix5QkFBeUJFLEdBQVksQ0FHakQvckIsUUFBUyxDQUFDLEdBT1gsT0FIQWlzQixvQkFBb0JGLEdBQVV0VixLQUFLMVcsRUFBT0MsUUFBU0QsRUFBUUEsRUFBT0MsUUFBUzhyQixxQkFHcEUvckIsRUFBT0MsT0FDZixDQ25CQSxJQUFJa3NCLG9CQUFzQkosb0JBQW9CLEsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEFQSS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdENsaWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdENvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEZpbGUudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RMb2cudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RQYWdlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Um91dGUudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RSb3V0ZU1ldGhvZC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFNlcnZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXEudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RHJpdmVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdEVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0TWFwLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdGVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdGVyQVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvYXBpLXdlYi50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL2V4dGVybmFsIHZhciBcInt9XCIiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHtcblx0Ly8gdGhlIG9ubHkgcmVsaWFibGUgbWVhbnMgdG8gZ2V0IHRoZSBnbG9iYWwgb2JqZWN0IGlzXG5cdC8vIGBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpYFxuXHQvLyBIb3dldmVyLCB0aGlzIGNhdXNlcyBDU1AgdmlvbGF0aW9ucyBpbiBDaHJvbWUgYXBwcy5cblx0aWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyByZXR1cm4gc2VsZjsgfVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIHdpbmRvdzsgfVxuXHRpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGdsb2JhbDsgfVxuXHR0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdCcpO1xufVxuXG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGdsb2JhbC5mZXRjaDtcblxuLy8gTmVlZGVkIGZvciBUeXBlU2NyaXB0IGFuZCBXZWJwYWNrLlxuaWYgKGdsb2JhbC5mZXRjaCkge1xuXHRleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuZmV0Y2guYmluZChnbG9iYWwpO1xufVxuXG5leHBvcnRzLkhlYWRlcnMgPSBnbG9iYWwuSGVhZGVycztcbmV4cG9ydHMuUmVxdWVzdCA9IGdsb2JhbC5SZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IGdsb2JhbC5SZXNwb25zZTsiLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBkZXZlbG9wZXIgbW9kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIERldmVsb3Blck1vZGVcbntcblx0LyoqXG5cdCAqIFRoZSBkZWZhdWx0IGRldmVsb3BlciBtb2RlLiBObyB0ZXN0cyB3aWxsIGJlIGV4ZWN1dGVkIGFuZCBcblx0ICogYW55IHRlc3QgcmVsYXRlZCBkYXRhIHdpbGwgYmUgaWdub3JlZC5cblx0ICovXG5cdFByb2R1Y3Rpb24sXG5cdC8qKlxuXHQgKiBGb3IgdXNlIGR1cmluZyBkZXZlbG9wbWVudC9kZWJ1Z2dpbmcuIEFsbCB0ZXN0IGRhdGEgd2lsbCBcblx0ICogYmUgY29sbGVjdGVkIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHREZXZlbG9wbWVudFxufVxuXG4vKipcbiAqIEEgQ1NTIG9iamVjdCB0byBlbWJlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NPYmplY3Rcbntcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIENTUyBmaWxlIHRvIGVtYmVkLlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgaW50ZWdyaXR5IGhhc2ggdG8gZ2VuZXJhdGUgZHVyaW5nIGluaXRpYWwgY29tcGlsYXRpb24uXG5cdCAqL1xuXHRpbnRlZ3JpdHlIYXNoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGFwaSB1c2VkIGR1cmluZyBwcm9jZXNzaW5nLlxuICovXG5leHBvcnQgY2xhc3MgSG90XG57XG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudGx5IGdlbmVyYXRlZCBwYWdlIGJlaW5nIGRpc3BsYXllZC4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQ3VycmVudFBhZ2U6IEhvdFBhZ2UgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIGFyZ3VtZW50cyBwYXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQXJndW1lbnRzOiBhbnkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiBJZiBpdCdzIHNldCB0byBkZXZlbG9wbWVudCBtb2RlLCBhbGwgdGVzdGluZ1xuXHQgKiByZWxhdGVkIGRhdGEgd2lsbCBiZSBjb2xsZWN0ZWQsIHBhcnNlZCwgYW5kIGV4ZWN1dGVkIGlmIG5lY2Vzc2FyeS5cblx0ICovXG5cdHN0YXRpYyBEZXZlbG9wZXJNb2RlID0gRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgSG90VGVzdEVsZW1lbnQgPSBIb3RUZXN0RWxlbWVudDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgTW9kZTogRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0LyoqXG5cdCAqVGhlIGN1cnJlbnQgQVBJIHVzZWQgb24gdGhpcyBwYWdlLiBUaGlzIGlzIGNsZWFyZWQgYmV0d2VlbiBldmVyeSBmaWxlIHByb2Nlc3NlZC5cblx0ICovXG5cdHN0YXRpYyBBUEk6IEhvdEFQSSA9IG51bGw7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIGJlaW5nIHVzZWQgYnkgdGhlIHRlc3Rlci5cblx0ICovXG5cdHN0YXRpYyBUZXN0ZXJBUEk6IEhvdEFQSSA9IG51bGw7XG5cdC8qKlxuXHQgKiBDb250YWlucyB0aGUgYnVmZmVyIHRvIG91dHB1dC4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgT3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXHQvKipcblx0ICogVGhlIGRhdGEgdG8gc2hhcmUgYWNyb3NzIGFsbCB0aGUgZGlmZmVyZW50IGZpbGVzIGFuZCBwYWdlcy4gVGhpcyBkYXRhIHdpbGwgYmUgcHVibGljLlxuXHQgKi9cblx0c3RhdGljIERhdGE6IGFueSA9IHt9O1xuXHQvKipcblx0ICogVGhlIGNvb2tpZXMgdG8gdXNlIGJldHdlZW4gcGFnZXMuXG5cdCAqL1xuXHRzdGF0aWMgQ29va2llczogQ29va2llcy5Db29raWVzU3RhdGljID0gQ29va2llcztcblx0LyoqXG5cdCAqIEFueSBwdWJsaWMga2V5cyB0aGF0IG5lZWQgdG8gYmUgc2hvd24uIFRoZXNlIGNhbiBiZSBwYXNzZWQgZnJvbSBIb3RTaXRlLmpzb24uXG5cdCAqL1xuXHRzdGF0aWMgUHVibGljS2V5czogYW55ID0ge307XG5cdC8qKlxuXHQgKiBUaGUgQ1NTIHN0cmluZyB0byB1c2Ugd2hlbiBlY2hvaW5nIG91dCB0aGUgQ1NTIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGNzc1N0cjogc3RyaW5nID0gYDxsaW5rIHJlbCA9IFwic3R5bGVzaGVldFwiIGhyZWYgPSBcIiVDU1NfRklMRSVcIiAvPmA7XG5cdC8qKlxuXHQgKiBUaGUgQ1NTIGZpbGVzIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICogXG5cdCAqIEB0b2RvIE1ha2UgdGhpcyBhIFwic3RyaW5nIHwgQ1NTT2JqZWN0XCIgZGF0YSB0eXBlIHNvIGl0IGNhbiBhbHNvIGluY2x1ZGUgXG5cdCAqIHRoZSBpbnRlZ3JpdHkgaGFzaGVzIGFzIHdlbGwuXG5cdCAqL1xuXHRzdGF0aWMgQ1NTOiBzdHJpbmdbXSA9IFtdO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgZmlsZXMgdG8gdXNlIGluIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKiBcblx0ICogQHRvZG8gTWFrZSB0aGlzIGEgXCJzdHJpbmcgfCBKU0ZpbGVPYmplY3RcIiBkYXRhIHR5cGUgc28gaXQgY2FuIGFsc28gaW5jbHVkZSBcblx0ICogdGhlIGludGVncml0eSBoYXNoZXMgYXMgd2VsbC5cblx0ICovXG5cdHN0YXRpYyBKU0ZpbGVzOiBhbnlbXSA9IFtdO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgaW5saW5lIGNvZGUgdG8gdXNlIGluIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIEpTU2NyaXB0czogYW55W10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IHN0cmluZyB0byB1c2Ugd2hlbiBlY2hvaW5nIG91dCB0aGUgU2NyaXB0cyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBqc0ZpbGVTdHI6IHN0cmluZyA9IGA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJUpTX0ZJTEUlXCI+PC9zY3JpcHQ+YDtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IHN0cmluZyB0byB1c2Ugd2hlbiBlY2hvaW5nIG91dCB0aGUgU2NyaXB0cyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBqc1NjcmlwdHNTdHI6IHN0cmluZyA9IGA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPiVKU19DT0RFJTwvc2NyaXB0PmA7XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGEgZmlsZSBhbmQgZWNobyBvdXQgaXQncyBjb250ZW50cy5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBpbmNsdWRlIChmaWxlOiBIb3RGaWxlIHwgc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAodHlwZW9mIChmaWxlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgbG93ZXJGaWxlOiBzdHJpbmcgPSBmaWxlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBmaWxlIHRvIGJlIGluY2x1ZGVkIGRvZXMgbm90IGhhdmUgYSBuYWhmYW0sIGFkZCBpdC4gVGhpcyBcblx0XHRcdFx0Ly8gd2lsbCBlbnN1cmUgdGhlIHNlcnZlciBzZW5kcyBvbmx5IHRoZSBmaWxlIGNvbnRlbnQuXG5cdFx0XHRcdGlmIChsb3dlckZpbGUuaW5kZXhPZiAoXCIuaG90dFwiKSA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIm5haGZhbVwiKSA8IDApXG5cdFx0XHRcdFx0XHRmaWxlICs9IFwiP2hzdHFzZXJ2ZT1uYWhmYW1cIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEhvdC5lY2hvIChhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSwgYXJncykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluY2x1ZGUgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBmb3IgdXNlIHdoZW4gcnVubmluZyB0aGUgcHJlcHJvY2Vzc29yLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGVKUyAoZmlsZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRjb25zdCByZXMgPSBhd2FpdCBIb3QuaHR0cFJlcXVlc3QgKGZpbGUpO1xuXHRcdGNvbnN0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgcmVzLnRleHQgKCk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdGV2YWwuYXBwbHkgKHdpbmRvdywgW291dHB1dF0pO1xuXHRcdGVsc2Vcblx0XHRcdGV2YWwgKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIGFuIGFscmVhZHkgbG9hZGVkIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcnVuRmlsZSAoZmlsZU5hbWU6IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldEZpbGUgKGZpbGVOYW1lKTtcblx0XHQvLy8gQGZpeG1lIERvZXMgdGhlIGZpbGUgbmVlZCB0byBiZSBkZWVwIGNsb25lZCBmaXJzdD9cblx0XHQvL2xldCBjbG9uZWRGaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKE9iamVjdC5hc3NpZ24gKHt9LCBmaWxlKSk7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gZmlsZTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdEhvdC5lY2hvIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGdldEZpbGUgKHBhdGg6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhdGgpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRlbXBGaWxlID0gbmV3IEhvdEZpbGUgKCk7XG5cblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHR0ZW1wRmlsZS51cmwgPSBwYXRoO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0ZW1wRmlsZS5sb2NhbEZpbGUgPSBwYXRoO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0ZW1wRmlsZSA9IHBhdGg7XG5cblx0XHRhd2FpdCB0ZW1wRmlsZS5sb2FkICgpO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGFuIGFwaSBjYWxsLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGFwaUNhbGwgKHJvdXRlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwsIFxuXHRcdGh0dHBNZXRob2Q6IHN0cmluZyA9IFwiUE9TVFwiLCBcblx0XHRmaWxlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJDdXJyZW50IHBhZ2UgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBhcGkgaXMgbnVsbCEgRGlkIHlvdSBmb3JnZXQgdG8gc2V0IHRoZSBBUEkgbmFtZSBvciBVUkw/XCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0cmVzdWx0ID0gYXdhaXQgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkubWFrZUNhbGwgKHJvdXRlLCBcblx0XHRcdFx0XHRcdFx0ZGF0YSwgaHR0cE1ldGhvZCwgZmlsZXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCBKU09OIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIEpTT04uc3RyaW5naWZ5IGFuZCBzZW5kLlxuXHQgKiBAcGFyYW0gaHR0cE1ldGhvZCBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIHRvIHNlbmQgdGhlIGRhdGEuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGpzb25SZXF1ZXN0ICh1cmw6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgaHR0cE1ldGhvZDogc3RyaW5nID0gXCJQT1NUXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCBmZXRjaE9iaiA9IHtcblx0XHRcdFx0XCJtZXRob2RcIjogaHR0cE1ldGhvZCxcblx0XHRcdFx0XCJoZWFkZXJzXCI6IHtcblx0XHRcdFx0XHRcdFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuXHRcdFx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcblx0XHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChodHRwTWV0aG9kID09PSBcIlBPU1RcIilcblx0XHRcdHtcblx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCwgZmV0Y2hPYmopO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHdyYXBwZXIgZm9yIGZldGNoLlxuXHQgKiBcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0ge1JlcXVlc3RJbml0fSByZXF1ZXN0SW5pdCBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIHNlbmQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgSFRUUCByZXNwb25zZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIHJlcXVlc3RJbml0OiBhbnkgPSB1bmRlZmluZWQpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsLCByZXF1ZXN0SW5pdCk7XG5cblx0XHRyZXR1cm4gKHJlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgc29tZSBvdXRwdXQuXG5cdCAqL1xuXHRzdGF0aWMgZWNobyAobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0SG90Lk91dHB1dCArPSBtZXNzYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBDU1MgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlDU1MgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkNTUy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgY3NzRmlsZTogc3RyaW5nID0gSG90LkNTU1tpSWR4XTtcblx0XHRcdGxldCBjc3NPdXQ6IHN0cmluZyA9IEhvdC5jc3NTdHI7XG5cblx0XHRcdGNzc091dCA9IGNzc091dC5yZXBsYWNlICgvXFwlQ1NTX0ZJTEVcXCUvZywgY3NzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChjc3NPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgZmlsZXMgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlKU0ZpbGVzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU0ZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc0ZpbGU6IHN0cmluZyA9IEhvdC5KU0ZpbGVzW2lJZHhdO1xuXHRcdFx0bGV0IGpzRmlsZU91dDogc3RyaW5nID0gSG90LmpzRmlsZVN0cjtcblxuXHRcdFx0anNGaWxlT3V0ID0ganNGaWxlT3V0LnJlcGxhY2UgKC9cXCVKU19GSUxFXFwlL2csIGpzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChqc0ZpbGVPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgc2NyaXB0cyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTU2NyaXB0cyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuSlNTY3JpcHRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc1NjcmlwdDogc3RyaW5nID0gSG90LkpTU2NyaXB0c1tpSWR4XTtcblx0XHRcdGxldCBqc1NjcmlwdE91dDogc3RyaW5nID0gSG90LmpzU2NyaXB0c1N0cjtcblxuXHRcdFx0anNTY3JpcHRPdXQgPSBqc1NjcmlwdE91dC5yZXBsYWNlICgvXFwlSlNfQ09ERVxcJS9nLCBqc1NjcmlwdCk7XG5cblx0XHRcdEhvdC5lY2hvIChqc1NjcmlwdE91dCk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuXG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3REQiB9IGZyb20gXCIuL0hvdERCXCI7XG5cbmltcG9ydCB7IEhvdERCU2NoZW1hIH0gZnJvbSBcIi4vc2NoZW1hcy9Ib3REQlNjaGVtYVwiO1xuXG4vKipcbiAqIFRoZSBBUEkgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IHR5cGUgQVBJdG9Mb2FkID0ge1xuXHRleHBvcnRlZENsYXNzTmFtZTogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG4gfTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBvYmplY3QgdG8gdXNlIGR1cmluZyBldmVudCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZW51bSBFdmVudEV4ZWN1dGlvblR5cGVcbntcblx0SG90Um91dGUsXG5cdEhvdE1ldGhvZCxcblx0SG90QVBJXG59XG5cbi8qKlxuICogVGhlIEFQSSB0byB1c2UuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RBUElcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgY29ubmVjdGlvbi5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVBJLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHNlcnZlci5cblx0ICovXG5cdGJhc2VVcmw6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCwgdGhpcyB3aWxsIGNyZWF0ZSB0aGUgcm91dGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIFxuXHQgKiBlYXN5IGNsaWVudC9zZXJ2ZXIgY2FsbGluZy5cblx0ICovXG5cdGNyZWF0ZUZ1bmN0aW9uczogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0ZXhlY3V0ZUV2ZW50c1VzaW5nOiBFdmVudEV4ZWN1dGlvblR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGRiOiBIb3REQjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi4gSWYgdXNpbmcgXG5cdCAqIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGZvciBIVFRQIHJlcXVlc3RzLCBiZSBzdXJlIHRvIG92ZXJyaWRlIHRoZSBcblx0ICogYHRvQXV0aG9yaXphdGlvbkhlYWRlclN0cmluZ2AgaW4gdGhpcyBvYmplY3QuXG5cdCAqIFxuXHQgKiBFeGFtcGxlIG9mIHRoaXMgb2JqZWN0OlxuXHQgKiBgYGB0c1xuXHQgKiB0aGlzLmF1dGhDcmVkZW50aWFscyA9IHtcblx0ICogXHRcdHVzZXI6IFwidXNlcm5hbWVcIixcblx0ICogXHRcdHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG5cdCAqIFx0XHR0b0F1dGhvcml6YXRpb25IZWFkZXJTdHJpbmc6IGZ1bmN0aW9uICgpXG5cdCAqIFx0XHRcdHtcblx0ICogXHRcdFx0XHRyZXR1cm4gKGJ0b2EgKHRoaXMudXNlciArIFwiOlwiICsgdGhpcy5wYXNzd29yZCkpO1xuXHQgKiBcdFx0XHR9XG5cdCAqIFx0fTtcblx0ICogYGBgXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB1c2VkIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuXHQgKi9cblx0dXNlckF1dGg6IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0cm91dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZSB9O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGUgQVBJIGlzIGFib3V0IHRvIHN0YXJ0IHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaGFzIGZpbmlzaGVkIHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCA9IG51bGwsIGRiOiBIb3REQiA9IG51bGwpXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBcIlwiO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy5jcmVhdGVGdW5jdGlvbnMgPSB0cnVlO1xuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdFJvdXRlO1xuXHRcdHRoaXMuZGIgPSBkYjtcblx0XHR0aGlzLmF1dGhDcmVkZW50aWFscyA9IG51bGw7XG5cdFx0dGhpcy51c2VyQXV0aCA9IG51bGw7XG5cdFx0dGhpcy5yb3V0ZXMgPSB7fTtcblx0XHR0aGlzLm9uUHJlUmVnaXN0ZXIgPSBudWxsO1xuXHRcdHRoaXMub25Qb3N0UmVnaXN0ZXIgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciB1c2UuXG5cdCAqL1xuXHRzZXREQlNjaGVtYSAoc2NoZW1hOiBIb3REQlNjaGVtYSk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBBUEkgaGFzIGJlZW4gc2V0IWApO1xuXG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0dGhpcy5jb25uZWN0aW9uLmFwaS5kYi5zY2hlbWEgPSBzY2hlbWE7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBiZWluZyB1c2VkLlxuXHQgKi9cblx0Z2V0REIgKCk6IEhvdERCXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQlNjaGVtYSAoKTogSG90REJTY2hlbWFcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYi5zY2hlbWEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHJvdXRlLiBJZiB0aGlzLmNyZWF0ZUZ1bmN0aW9ucyBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHRha2UgdGhlIGluY29taW5nIFxuXHQgKiByb3V0ZSBhbmQgY3JlYXRlIGFuIG9iamVjdCBpbiB0aGlzIEhvdEFQSSBvYmplY3QgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLiBJZiB0aGVyZSdzIFxuXHQgKiBhbnkgSG90Um91dGVNZXRob2RzIGluc2lkZSBvZiB0aGUgaW5jb21pbmcgSG90Um91dGUsIGl0IHdpbGwgY3JlYXRlIHRoZSBtZXRob2RzIFxuXHQgKiBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSG90Um91dGUgb2JqZWN0LlxuXHQgKiBcblx0ICogRXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIGV4cG9ydCBjbGFzcyBVc2VycyBleHRlbmRzIEhvdFJvdXRlXG5cdCAqIHtcblx0ICogXHRcdGNvbnN0cnVjdG9yIChhcGk6IEZyZWVMaWdodEFQSSlcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIgKGFwaS5jb25uZWN0aW9uLCBcInVzZXJcIik7XG5cdCAqIFxuXHQgKiBcdFx0XHR0aGlzLmFkZE1ldGhvZCAoXCJjcmVhdGVcIiwgdGhpcy5fY3JlYXRlLCBIVFRQTWV0aG9kLlBPU1QpO1xuXHQgKiBcdFx0fVxuXHQgKiBcblx0ICogXHRcdHByb3RlY3RlZCBhc3luYyBfY3JlYXRlIChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpOiBQcm9taXNlPGFueT5cblx0ICogXHRcdHtcblx0ICogXHRcdFx0cmV0dXJuICh0cnVlKTtcblx0ICogXHRcdH1cblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIFRoaXMgaW4gdHVybiBjb3VsZCBiZSB1c2VkIGxpa2Ugc286XG5cdCAqIGBgYFxuXHQgKiBIb3QuQVBJLnVzZXIuY3JlYXRlICh7fSk7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogQWRkaXRpb25hbGx5IGl0IHdvdWxkIGNyZWF0ZSB0aGUgZW5kcG9pbnQ6IGBgYGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS91c2VyL2NyZWF0ZWBgYFxuXHQgKiBcblx0ICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBhZGQuIENhbiBiZSBlaXRoZXIgYSBmdWxsIEhvdFJvdXRlIG9iamVjdCwgb3IganVzdCBcblx0ICogdGhlIHJvdXRlJ3MgbmFtZS4gSWYgYSBIb3RSb3V0ZSBvYmplY3QgaXMgc3VwcGxpZWQsIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIFxuXHQgKiB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSByb3V0ZU1ldGhvZCBUaGUgcm91dGUncyBtZXRob2QgdG8gYWRkLiBJZiB0aGUgcm91dGUgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLCBcblx0ICogaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgcm91dGUncyBuYW1lLCBhbmQgdGhpcyB3aWxsIGJlIHRoZSBtZXRob2QgYWRkZWQgdG8gXG5cdCAqIHRoZSBuZXcgcm91dGUuXG5cdCAqIEBwYXJhbSBleGVjdXRlRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiByb3V0ZU1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIEFQSS5cblx0ICovXG5cdGFkZFJvdXRlIChcblx0XHRyb3V0ZTogSG90Um91dGUgfCBzdHJpbmcsXG5cdFx0cm91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kIHwgc3RyaW5nID0gbnVsbCxcblx0XHRleGVjdXRlRnVuY3Rpb246IChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpID0+IFByb21pc2U8YW55PiA9IG51bGxcblx0XHQpOiB2b2lkXG5cdHtcblx0XHRsZXQgcm91dGVOYW1lOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHJvdXRlIGluc3RhbmNlb2YgSG90Um91dGUpXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGUucm91dGU7XG5cdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZS5yb3V0ZV0gPSByb3V0ZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJvdXRlTmFtZSA9IHJvdXRlO1xuXG5cdFx0XHRpZiAodGhpcy5yb3V0ZXNbcm91dGVOYW1lXSA9PSBudWxsKVxuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID0gbmV3IEhvdFJvdXRlICh0aGlzLmNvbm5lY3Rpb24sIHJvdXRlTmFtZSk7XG5cblx0XHRcdGlmIChyb3V0ZU1ldGhvZCBpbnN0YW5jZW9mIEhvdFJvdXRlTWV0aG9kKVxuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAocm91dGVNZXRob2QpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAobmV3IEhvdFJvdXRlTWV0aG9kIChcblx0XHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLCByb3V0ZU1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5jb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSByb3V0ZSBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIvY2xpZW50LlxuXHRcdGlmICh0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgbmV3Um91dGU6IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB0aGlzW3JvdXRlTmFtZV07XG5cblx0XHRcdGlmIChuZXdSb3V0ZSA9PSBudWxsKVxuXHRcdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0XHRsZXQgbmV3Um91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRcdC8qXG5cdFx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHRcdC8vLyBlc3BlY2lhbGx5IGZvciBhY2NydWF0ZSB0ZXN0aW5nLlxuXHRcdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSovXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdC8vLyBAZml4bWUgSXMgb25DbGllbnRFeGVjdXRlIG5lY2Vzc2FyeT8gSSdtIHRoaW5raW5nIHRoZSBkZXYgY2FuIGp1c3Qgc2ltcGx5IGNyZWF0ZSBcblx0XHRcdFx0XHQvLy8gdGhlaXIgb3duIGZ1bmN0aW9uIHRvIGNhbGwuXG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vbkNsaWVudEV4ZWN1dGU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHsqL1xuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSAoZGF0YTogYW55LCBmaWxlczogYW55KTogYW55ID0+XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25zdHJ1Y3QgdGhlIHVybCBoZXJlLiBCYXNlICsgcm91dGUgKyByb3V0ZSBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoY3VycmVudFJvdXRlLnZlcnNpb24gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3V0ZVN0ciArPSBgLyR7Y3VycmVudFJvdXRlLnZlcnNpb259YDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Um91dGUucm91dGUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3V0ZVN0ciArPSBgLyR7Y3VycmVudFJvdXRlLnJvdXRlfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QubmFtZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtuZXdSb3V0ZU1ldGhvZC5uYW1lfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWxzOiBhbnkgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gR2V0dGluZyB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyBmcm9tIHRoZSBBUEkgaXMgdGhlIGxvd2VzdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBwcmlvcml0eSBmb3IgZ2V0dGluZyBjcmVkZW50aWFscy4gVGhlIHByaW9yaXRpZXMgYXJlIGluIHRoaXMgb3JkZXI6IFxuXHRcdFx0XHRcdFx0XHRcdC8vIDEuIEhvdFJvdXRlTWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMi4gSG90Um91dGVcblx0XHRcdFx0XHRcdFx0XHQvLyAzLiBIb3RBUElcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IHRoaXMuYXV0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmluZCB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscy4gUHJpb3JpdGl6ZSB0aGVtIHdoZW4gdGhleSdyZSBcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgbWV0aG9kLiBPbmx5IGFkZCB0aGUgb25lcyBmcm9tIHRoZSByb3V0ZSBpZiB0aGUgb25lcyBmcm9tIFxuXHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBtZXRob2QgYXJlIG1pc3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2Qucm91dGUuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IG5ld1JvdXRlTWV0aG9kLnJvdXRlLmF1dGhDcmVkZW50aWFscztcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoSG90KSAhPT0gXCJ1bmRlZmluZWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5BUEkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0uYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEFkZCB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byB0aGUgZGF0YSBiZWluZyBzZW50LlxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIGF1dGhDcmVkZW50aWFscylcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGF1dGhDcmVkZW50aWFsOiBhbnkgPSBhdXRoQ3JlZGVudGlhbHNba2V5XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEbyBub3Qgb3ZlcndyaXRlIGFueSBleGlzdGluZyBrZXlzIGluIHRoZSBkYXRhIGFib3V0IFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBiZSBzZW50LlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVtrZXldID0gYXV0aENyZWRlbnRpYWw7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGFyZ3M6IGFueVtdID0gW3JvdXRlU3RyLCBkYXRhLCBodHRwTWV0aG9kLCBmaWxlc107XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKHRoaXMubWFrZUNhbGwuYXBwbHkgKHRoaXMsIGFyZ3MpKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHQvL31cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR0aGlzW3JvdXRlTmFtZV0gPSBuZXdSb3V0ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYSByb3V0ZSB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlIChyb3V0ZTogSG90Um91dGUpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0YXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlZ2lzdGVyUm91dGUgKHJvdXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhbGwgcm91dGVzIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGVzICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5yb3V0ZXMpXG5cdFx0e1xuXHRcdFx0bGV0IHJvdXRlOiBIb3RSb3V0ZSA9IHRoaXMucm91dGVzW2tleV07XG5cblx0XHRcdGF3YWl0IHRoaXMucmVnaXN0ZXJSb3V0ZSAocm91dGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgY2FsbCB0byB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgbWFrZUNhbGwgKHJvdXRlOiBzdHJpbmcsIGRhdGE6IGFueSwgaHR0cE1ldGhvZDogc3RyaW5nID0gXCJQT1NUXCIsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRodHRwTWV0aG9kID0gaHR0cE1ldGhvZC50b1VwcGVyQ2FzZSAoKTtcblxuXHRcdGlmICh1cmxbKHVybC5sZW5ndGggLSAxKV0gPT09IFwiL1wiKVxuXHRcdFx0dXJsID0gdXJsLnN1YnN0ciAoMCwgKHVybC5sZW5ndGggLSAxKSk7XG5cblx0XHRpZiAocm91dGVbMF0gIT09IFwiL1wiKVxuXHRcdFx0dXJsICs9IFwiL1wiO1xuXG5cdFx0dXJsICs9IHJvdXRlO1xuXG5cdFx0Y29uc3QgbnVtRmlsZXM6IG51bWJlciA9IE9iamVjdC5rZXlzIChmaWxlcykubGVuZ3RoO1xuXG5cdFx0aWYgKG51bUZpbGVzID4gMClcblx0XHR7XG5cdFx0XHRpZiAoaHR0cE1ldGhvZCAhPT0gXCJQT1NUXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRvIHVwbG9hZCBmaWxlcywgeW91IG11c3Qgc2V0IHRoZSBodHRwTWV0aG9kIHRvIFBPU1QuYCk7XG5cblx0XHRcdGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdFx0XHRmb3JtRGF0YS5hcHBlbmQgKGtleSwgZmlsZXNba2V5XSk7XG5cblx0XHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsLCB7XG5cdFx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Ym9keTogZm9ybURhdGFcblx0XHRcdFx0fSk7XG5cdFx0XHRsZXQganNvblJlczogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXSA9PSBudWxsKVxuXHRcdFx0XHRkYXRhW1wiaG90c3RhcVwiXSA9IHt9O1xuXG5cdFx0XHRpZiAoZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXSA9IHt9O1xuXG5cdFx0XHRkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl1bXCJ1cGxvYWRJZFwiXSA9IFxuXHRcdFx0XHRcdGpzb25SZXNbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdO1xuXG5cdFx0XHQvLyBBZnRlciB0aGUgdXBsb2FkLCBtYWtlIHRoZSBhY3R1YWwgSlNPTiBjYWxsLiBEbyBub3QgcGFzcyBmaWxlcyBhZ2Fpbi5cblx0XHRcdGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5tYWtlQ2FsbCAocm91dGUsIGRhdGEsIGh0dHBNZXRob2QpO1xuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0bGV0IGZldGNoT2JqOiBhbnkgPSB7XG5cdFx0XHRcdG1ldGhvZDogaHR0cE1ldGhvZCxcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoKGh0dHBNZXRob2QgIT09IFwiR0VUXCIpICYmIFxuXHRcdFx0KGh0dHBNZXRob2QgIT09IFwiSEVBRFwiKSlcblx0XHR7XG5cdFx0XHRmZXRjaE9ialtcImJvZHlcIl0gPSBKU09OLnN0cmluZ2lmeSAoZGF0YSk7XG5cdFx0fVxuXG5cdFx0bGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT4gXG5cdFx0XHR7XG5cdFx0XHRcdGZldGNoICh1cmwsIGZldGNoT2JqKS50aGVuIChhc3luYyAocmVzKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBqc29uT2JqOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblx0XHRcblx0XHRcdFx0XHRcdHJlc29sdmUgKGpzb25PYmopO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoICgocmVhc29uOiBhbnkpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHt1cmx9OiAke3JlYXNvbi5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gKHByb21pc2UpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXJUeXBlIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcblxuLyoqXG4gKiBBIGNsaWVudCBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RDbGllbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIEFQSSB0byB1c2UuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgQVBJIHRvIHVzZS5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdHRoaXMudGVzdGVyQVBJID0gbnVsbDtcblx0XHR0aGlzLnR5cGUgPSBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdENvbXBvbmVudE91dHB1dFxue1xuXHQvKipcblx0ICogVGhlIEhUTUwgdG8gb3V0cHV0LlxuXHQgKi9cblx0aHRtbDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIGFkZCB0aGlzIGNvbXBvbmVudCdzIGZ1bmN0aW9ucyB0by5cblx0ICogXG5cdCAqIEBleGFtcGxlICNvYmplY3RJZFxuXHQgKi9cblx0YWRkRnVuY3Rpb25zVG8/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGxhY2UgaGVyZSBwYXJlbnQgbmFtZSB0byBhdHRhY2ggdGhpcyBodG1sIHRvLlxuXHQgKiBcblx0ICogQGV4YW1wbGUgdG9wXG5cdCAqL1xuXHRwbGFjZUhlcmVQYXJlbnQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBBcHBlbmQgdGhlIG91dHB1dCB0byBhbiBleGlzdGluZyBlbGVtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgZGl2IC50ZXN0Q2xhc3Ncblx0ICovXG5cdHBhcmVudFNlbGVjdG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBIVE1MRWxlbWVudHMuXG5cdCAqL1xuXHRodG1sRWxlbWVudHM/OiBIVE1MRWxlbWVudFtdO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRhZy5cblx0ICovXG5cdHRhZz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpPzogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG9wdGlvbnMgdG8gaW5jbHVkZSB3aXRoIHJlZ2lzdGVyaW5nIHRoaXMgY29tcG9uZW50LlxuXHQgKi9cblx0ZWxlbWVudE9wdGlvbnM/OiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnM7XG5cdC8qKlxuXHQgKiBBbnkgZXh0cmEgYXR0cmlidXRlcyB0byByZWdpc3Rlci5cblx0ICovXG5cdG9ic2VydmVkQXR0cmlidXRlcz86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgY29tcG9uZW50LlxuXHQgKi9cblx0dHlwZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0dmFsdWU/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgaW5uZXIgSFRNTCBvciB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0aW5uZXI6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBldmVudHMgdG8gdHJpZ2dlci5cblx0ICovXG5cdGV2ZW50cz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0ZnVuYzogRnVuY3Rpb247XG5cdFx0XHRcdG9wdGlvbnM/OiBhbnk7XG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gb3V0cHV0LlxuXHQgKiBcblx0ICogQHJldHVybnMgSWYgc2V0IHRvIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZU91dHB1dD86ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIGdldHRpbmcgdGhlIG91dHB1dCwgYnV0IGJlZm9yZSB0aGUgRE9NIHBhcnNpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGxhc3QgdGltZSBwcmlvciB0byBcblx0ICogYmVpbmcgcGFyc2VkIGludG8gYSBET00gZWxlbWVudC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBmaW5hbCBvdXRwdXQgdG8gYmUgcGFyc2VkIGFzIGEgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblBvc3RPdXRwdXQ/OiAob3V0cHV0OiAoc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W10pKSA9PiBQcm9taXNlPChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk+O1xuXHQvKipcblx0ICogRXhlY3V0ZSB3aGVuIGl0cyB0aW1lIHRvIGZpeCB0aGUgSFRNTCBwcmlvciB0byBET00gcGFyc2luZy4gVGhpcyB3aWxsIHNraXAgdGhlIEhvdFN0YXEgZGVmYXVsdCBmaXhpbmcuXG5cdCAqL1xuXHRvbkZpeEhUTUw/OiAob3V0cHV0OiBzdHJpbmcpID0+IFByb21pc2U8eyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH0+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhIGN1c3RvbSBET00gcGFyc2VyLlxuXHQgKi9cblx0b25QYXJzZURPTT86IChvdXRwdXQ6IHN0cmluZykgPT4gUHJvbWlzZTxEb2N1bWVudD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHRoZSBvdXRwdXQgaGFzIGJlZW4gcGFyc2VkIGFuZCBpcyByZWFkeSB0byBiZSBwbGFjZWQgaW50byB0aGUgRE9NLlxuXHQgKi9cblx0b25QYXJzZWQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25QcmVQbGFjZT86IChodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IFByb21pc2U8SFRNTEVsZW1lbnQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgZmluYWwgdGltZSBwcmlvciB0byBiZWluZyByZW5kZXJlZC5cblx0ICovXG5cdG9uUG9zdFBsYWNlPzogKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBQcm9taXNlPEhUTUxFbGVtZW50Pjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgRE9NIGVsZW1lbnQgb250byB0aGUgbmV3bHkgY3JlYXRlZCBwYXJlbnQuXG5cdCAqL1xuXHRvblBhcmVudFBsYWNlPzogKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RDb21wb25lbnQgaW1wbGVtZW50cyBJSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIEhUTUxFbGVtZW50cy5cblx0ICovXG5cdGh0bWxFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIEFQSS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG9wdGlvbnMgdG8gaW5jbHVkZSB3aXRoIHJlZ2lzdGVyaW5nIHRoaXMgY29tcG9uZW50LlxuXHQgKi9cblx0ZWxlbWVudE9wdGlvbnM6IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIEFueSBleHRyYSBhdHRyaWJ1dGVzIHRvIHJlZ2lzdGVyLlxuXHQgKi9cblx0b2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudC5cblx0ICovXG5cdHR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0dmFsdWU6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBpbm5lciBIVE1MIG9yIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRpbm5lcjogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9uczogYW55O1xuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIG91dHB1dC5cblx0ICogXG5cdCAqIEByZXR1cm5zIElmIHNldCB0byBmYWxzZSwgdGhlIGNvbXBvbmVudCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVPdXRwdXQ/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBnZXR0aW5nIHRoZSBvdXRwdXQsIGJ1dCBiZWZvcmUgdGhlIERPTSBwYXJzaW5nLlxuXHQgKiBcblx0ICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBsYXN0IHRpbWUgcHJpb3IgdG8gXG5cdCAqIGJlaW5nIHBhcnNlZCBpbnRvIGEgRE9NIGVsZW1lbnQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgZmluYWwgb3V0cHV0IHRvIGJlIHBhcnNlZCBhcyBhIERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25Qb3N0T3V0cHV0PzogKG91dHB1dDogKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKSkgPT4gUHJvbWlzZTwoc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W10pPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgd2hlbiBpdHMgdGltZSB0byBmaXggdGhlIEhUTUwgcHJpb3IgdG8gRE9NIHBhcnNpbmcuIFRoaXMgd2lsbCBza2lwIHRoZSBIb3RTdGFxIGRlZmF1bHQgZml4aW5nLlxuXHQgKi9cblx0b25GaXhIVE1MPzogKG91dHB1dDogc3RyaW5nKSA9PiBQcm9taXNlPHsgZml4ZWRTdHI6IHN0cmluZywgcXVlcnlTZWxlY3Rvcjogc3RyaW5nOyB9Pjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYSBjdXN0b20gRE9NIHBhcnNlci5cblx0ICovXG5cdG9uUGFyc2VET00/OiAob3V0cHV0OiBzdHJpbmcpID0+IFByb21pc2U8RG9jdW1lbnQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciB0aGUgb3V0cHV0IGhhcyBiZWVuIHBhcnNlZCBhbmQgaXMgcmVhZHkgdG8gYmUgcGxhY2VkIGludG8gdGhlIERPTS5cblx0ICovXG5cdG9uUGFyc2VkPzogKG91dHB1dDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUHJlUGxhY2U/OiAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBQcm9taXNlPEhUTUxFbGVtZW50Pjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGZpbmFsIHRpbWUgcHJpb3IgdG8gYmVpbmcgcmVuZGVyZWQuXG5cdCAqL1xuXHRvblBvc3RQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gUHJvbWlzZTxIVE1MRWxlbWVudD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIERPTSBlbGVtZW50IG9udG8gdGhlIG5ld2x5IGNyZWF0ZWQgcGFyZW50LlxuXHQgKi9cblx0b25QYXJlbnRQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJID0gbnVsbClcblx0e1xuXHRcdGlmICgoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpIHx8IChjb3B5ID09IG51bGwpKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMuaHRtbEVsZW1lbnRzID0gW107XG5cdFx0XHR0aGlzLm5hbWUgPSBcIlwiO1xuXHRcdFx0dGhpcy50YWcgPSBcIlwiO1xuXHRcdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdFx0dGhpcy5lbGVtZW50T3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMub2JzZXJ2ZWRBdHRyaWJ1dGVzID0gW107XG5cdFx0XHR0aGlzLnR5cGUgPSBcIlwiO1xuXHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHR0aGlzLmlubmVyID0gbnVsbDtcblx0XHRcdHRoaXMuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHkucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudHMgPSBjb3B5Lmh0bWxFbGVtZW50cyB8fCBbXTtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50YWcgPSBjb3B5LnRhZyB8fCB0aGlzLm5hbWU7XG5cdFx0XHR0aGlzLmFwaSA9IGNvcHkuYXBpIHx8IG51bGw7XG5cdFx0XHR0aGlzLmVsZW1lbnRPcHRpb25zID0gY29weS5lbGVtZW50T3B0aW9ucyB8fCB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLm9ic2VydmVkQXR0cmlidXRlcyA9IGNvcHkub2JzZXJ2ZWRBdHRyaWJ1dGVzIHx8IFtdO1xuXHRcdFx0dGhpcy50eXBlID0gY29weS50eXBlIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gY29weS52YWx1ZSB8fCBudWxsO1xuXHRcdFx0dGhpcy5pbm5lciA9IGNvcHkuaW5uZXIgfHwgbnVsbDtcblx0XHRcdHRoaXMuZXZlbnRzID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKGFwaSAhPSBudWxsKVxuXHRcdFx0dGhpcy5hcGkgPSBhcGk7XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgdGhhdCdzIGNhbGxlZCB3aGVuIHRoaXMgY29tcG9uZW50J3MgRE9NIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBET00gZWxlbWVudC5cblx0ICovXG5cdGFzeW5jIG9uQ3JlYXRlZCAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHJldHVybiAoZWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIHRoZSBhdHRyaWJ1dGVzIG1hbnVhbGx5LlxuXHQgKi9cblx0YXN5bmMgaGFuZGxlQXR0cmlidXRlcz8gKGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhIGNsaWNrIGV2ZW50LlxuXHQgKi9cblx0YWJzdHJhY3QgY2xpY2s/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBPdXRwdXQgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGFic3RyYWN0IG91dHB1dCAoKTogUHJvbWlzZTxzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXT47XG59IiwiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5cbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuXG5pbXBvcnQgeyBEZXZlbG9wZXJNb2RlLCBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5cbi8qKlxuICogQSBmaWxlIHRvIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdEZpbGVcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U/OiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHR1cmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHRsb2NhbEZpbGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvcmNlIGFsbCBlcnJvcnMgdG8gYmUgdGhyb3duLlxuXHQgKi9cblx0dGhyb3dBbGxFcnJvcnM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcnNlciBvcHRpb25zIGZvciB3aGVuIHByb2Nlc3NpbmcgYSBzdHJpbmcgb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZXJPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBPdXRwdXQgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBmcm9tIHByb2Nlc3NpbmcuIERlZmF1bHQ6IHRydWVcblx0ICovXG5cdG91dHB1dENvbW1hbmRzPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEFsbG93IEpTT04uc3RyaW5naWZ5IHRvIGJlIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcuIERlZmF1bHQ6IHRydWVcblx0ICovXG5cdGFsbG93U3RyaW5naWZ5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGZpbGUgdG8gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdEZpbGUgaW1wbGVtZW50cyBJSG90RmlsZVxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCBwYWdlLlxuXHQgKi9cblx0cGFnZTogSG90UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHR1cmw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIGdldC5cblx0ICovXG5cdGxvY2FsRmlsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGNvbnRlbnQ6IHN0cmluZztcblx0LyoqXG5cdCAqIEZvcmNlIGFsbCBlcnJvcnMgdG8gYmUgdGhyb3duLlxuXHQgKi9cblx0dGhyb3dBbGxFcnJvcnM6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RGaWxlID0ge30pXG5cdHtcblx0XHR0aGlzLnBhZ2UgPSBjb3B5LnBhZ2UgfHwgbnVsbDtcblx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHR0aGlzLnVybCA9IGNvcHkudXJsIHx8IFwiXCI7XG5cdFx0dGhpcy5sb2NhbEZpbGUgPSBjb3B5LmxvY2FsRmlsZSB8fCBcIlwiO1xuXHRcdHRoaXMuY29udGVudCA9IGNvcHkuY29udGVudCB8fCBcIlwiO1xuXHRcdHRoaXMudGhyb3dBbGxFcnJvcnMgPSBjb3B5LnRocm93QWxsRXJyb3JzIHx8IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgY29udGVudCBvZiB0aGlzIGZpbGUuXG5cdCAqL1xuXHRzZXRDb250ZW50IChjb250ZW50OiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgY29udGVudCBvZiB0aGlzIGZpbGUuXG5cdCAqL1xuXHRnZXRDb250ZW50ICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAodGhpcy5jb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCBnZXQgcmVxdWVzdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwR2V0ICh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwpO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHJlcy50ZXh0ICgpO1xuXG5cdFx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0cmV0dXJuIChKU09OLnN0cmluZ2lmeSAoeyBcImVycm9yXCI6IGAke2V4Lm1lc3NhZ2V9IC0gQ291bGQgbm90IGZldGNoICR7dXJsfWAgfSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIHVybC5cblx0ICovXG5cdGFzeW5jIGxvYWRVcmwgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0dGhpcy5jb250ZW50ID0gYXdhaXQgSG90RmlsZS5odHRwR2V0ICh0aGlzLnVybCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBjb250ZW50IGZyb20gYSBsb2NhbCBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZExvY2FsRmlsZSAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgcHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gbmV3IFByb21pc2UgKFxuXHRcdFx0KHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpOiB2b2lkID0+XG5cdFx0XHR7XG5cdFx0XHRcdGZzLnJlYWRGaWxlICh0aGlzLmxvY2FsRmlsZSwgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uLCBkYXRhOiBCdWZmZXIpOiB2b2lkID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGVyciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnI7XG5cblx0XHRcdFx0XHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nICgpO1xuXHRcdFx0XHRcdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblxuXHRcdFx0XHRcdFx0cmVzb2x2ZSAodGhpcy5jb250ZW50KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChwcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS5cblx0ICovXG5cdGFzeW5jIGxvYWQgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy51cmwgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkVXJsICgpO1xuXG5cdFx0aWYgKHRoaXMubG9jYWxGaWxlICE9PSBcIlwiKVxuXHRcdFx0Y29udGVudCA9IGF3YWl0IHRoaXMubG9hZExvY2FsRmlsZSAoKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBzdHJpbmcgY29udGVudC4gVGhpcyB3aWxsIHRha2UgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIFxuXHQgKiBwYXJzZSB0aGUgY29udGVudCBiYXNlZCBvbiB0aGUgcmVnZXguIFdoZW4gdGhlIHJlZ2V4IGNvbnRlbnQgaXMgZm91bmQgXG5cdCAqIGNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBleGVjdXRlZCB3aXRoIHRoZSByZWdleCBjb250ZW50IGZvdW5kLiBXaGVuIFxuXHQgKiB0aGUgcmVnZXggY29udGVudCBpcyBub3QgZm91bmQsIG9mZkNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBjYWxsZWQgd2l0aCBcblx0ICogdGhlIGNvbnRlbnQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIFxuXHQgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIGNvbnRlbnRSZWdleCBUaGUgcmVnZXggdG8gdXNlIHRvIHBhcnNlIHRoZSBjb250ZW50LlxuXHQgKiBAcGFyYW0gY29udGVudFByb2Nlc3NvciBUaGUgY29udGVudCBmb3VuZCBpbnNpZGUgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gb2ZmQ29udGVudFByb2Nlc3NvciBUaGUgY29udGVudCBmb3VuZCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21CZWdpbm5pbmcgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBcblx0ICogYmVnaW5uaW5nIG9mIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUVuZCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIGVuZCBvZiBcblx0ICogdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqL1xuXHRzdGF0aWMgcHJvY2Vzc0NvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZywgY29udGVudFJlZ2V4OiBSZWdFeHAsXG5cdFx0Y29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDIpOiBzdHJpbmdcblx0e1xuXHRcdGxldCByZXN1bHQ6IFJlZ0V4cEV4ZWNBcnJheSA9IGNvbnRlbnRSZWdleC5leGVjIChjb250ZW50KTtcblx0XHRsZXQgcHJldmlvdXNJbmRleDogbnVtYmVyID0gMDtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHJlc3VsdCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBzdGFydDogbnVtYmVyID0gcmVzdWx0LmluZGV4IC0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZztcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnRSZWdleC5sYXN0SW5kZXggKyBudW1SZW1vdmVGcm9tRW5kO1xuXG5cdFx0XHQvLyBHZXQgdGhlIHByZXZpb3VzIHNlY3Rpb24uXG5cdFx0XHRsZXQgcHJldkNvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAoc3RhcnQgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRwcmV2aW91c0luZGV4ID0gZW5kO1xuXG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAocHJldkNvbnRlbnQpO1xuXG5cdFx0XHQvLyBQcm9jZXNzIHRoZSBjb250ZW50IGZvdW5kIGZyb20gdGhlIHJlZ2V4XG5cdFx0XHRsZXQgY29udGVudEZvdW5kOiBzdHJpbmcgPSByZXN1bHRbMF07XG5cdFx0XHRvdXRwdXQgKz0gY29udGVudFByb2Nlc3NvciAoY29udGVudEZvdW5kKTtcblxuXHRcdFx0Ly8gTW92ZSBvbiB0byB0aGUgbmV4dCBzZWN0aW9uIHRvIHBhcnNlLlxuXHRcdFx0cmVzdWx0ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFueSBjb250ZW50IHRoYXQgY291bGQgaGF2ZSBuZXN0ZWQgdmFsdWVzLiBUaGlzIHdpbGwgXG5cdCAqIHRha2UgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIFxuXHQgKiBwYXJzZSB0aGUgY29udGVudCBiYXNlZCBvbiB0aGUgcmVnZXguIFdoZW4gdGhlIHJlZ2V4IGNvbnRlbnQgaXMgZm91bmQgXG5cdCAqIGNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBleGVjdXRlZCB3aXRoIHRoZSByZWdleCBjb250ZW50IGZvdW5kLiBXaGVuIFxuXHQgKiB0aGUgcmVnZXggY29udGVudCBpcyBub3QgZm91bmQsIG9mZkNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBjYWxsZWQgd2l0aCBcblx0ICogdGhlIGNvbnRlbnQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIFxuXHQgKiBAZml4bWUgTmVlZHMgdG8gYmUgYWJsZSB0byBpZ25vcmUgYW55IGNoYXJhY3RlcnMgZm91bmQgaW5zaWRlIGNvbW1lbnRzIFxuXHQgKiBvciBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmb2xsb3dpbmcgaXMgdXNlZCBgYGAke1wiVGVzdCB9XCJ9YGBgIEl0IFxuXHQgKiB3aWxsIGVycm9yIG91dC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzTmVzdGVkQ29udGVudCAoY29udGVudDogc3RyaW5nLCBzdGFydENoYXJzOiBzdHJpbmcsIGVuZENoYXJzOiBzdHJpbmcsIFxuXHRcdHRyaWdnZXJDaGFyOiBzdHJpbmcsIGNvbnRlbnRQcm9jZXNzb3I6IChyZWdleEZvdW5kOiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBzdGFydFRyaWdnZXJQb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBwb3MpO1xuXHRcdFx0bGV0IG5lc3RlZENvdW50ZXI6IG51bWJlciA9IDA7XG5cblx0XHRcdGlmICh0cmlnZ2VyQ2hhciAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmV2ZXJzZSBzZWFyY2ggdGhlIHRyaWdnZXIgY2hhcmFjdGVycyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBcblx0XHRcdFx0Ly8gb2NjdXJyZW5jZXMuXG5cdFx0XHRcdGxldCBycG9zOiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgZW5kIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cblx0XHRcdFx0d2hpbGUgKHJwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChycG9zID09PSBzdGFydFRyaWdnZXJQb3MpXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdHJwb3MgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgcnBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRcdG5lc3RlZENvdW50ZXIrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5lc3RlZCB0cmlnZ2VyIGNoYXJhY3RlcnMsIGdldCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxuXHRcdFx0Ly8gdGhlIGVuZCBjaGFyYWN0ZXIuXG5cdFx0XHRpZiAobmVzdGVkQ291bnRlciA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBlcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0bGV0IHRlbXBlcG9zOiBudW1iZXIgPSBlcG9zO1xuXG5cdFx0XHRcdHdoaWxlICgoZXBvcyA+IC0xKSAmJiAobmVzdGVkQ291bnRlciA+IDApKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRlbXBlcG9zIDwgMClcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGFyZW4ndCBkaXNjb3ZlcmluZyBlbmRDaGFycyB0aGF0IHdlIHNob3VsZG4ndCBiZS5cblx0XHRcdFx0XHRsZXQgcG9zT3V0c2lkZU9mQ29udGVudDogbnVtYmVyID0gY29udGVudC5sYXN0SW5kZXhPZiAoc3RhcnRDaGFycywgdGVtcGVwb3MgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHRcdGlmIChwb3NPdXRzaWRlT2ZDb250ZW50ID4gZXBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZXBvcyA9IHRlbXBlcG9zO1xuXG5cdFx0XHRcdFx0dGVtcGVwb3MgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlcG9zICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlci0tO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZW5kID0gZXBvcztcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9mZkNvbnRlbnRTdHI6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAocG9zIC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKG9mZkNvbnRlbnRTdHIpO1xuXG5cdFx0XHRsZXQgZm91bmRDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAoXG5cdFx0XHRcdHBvcyArIG51bVJlbW92ZUZyb21CZWdpbm5pbmcsIChlbmQgLSAocG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZykpKTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChmb3VuZENvbnRlbnQpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG5leHQgY29udGVudFxuXHRcdFx0cG9zID0gY29udGVudC5pbmRleE9mIChzdGFydENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdHN0YXJ0VHJpZ2dlclBvcyA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0XHRwcmV2aW91c0luZGV4ID0gZW5kICsgbnVtUmVtb3ZlRnJvbUVuZDtcblx0XHR9XG5cblx0XHQvLyBBcHBlbmQgd2hhdGV2ZXIgZWxzZSBpcyBhZnRlciB0aGUgbGFzdCBwYXJzZWQgc2VjdGlvbi5cblx0XHRsZXQgbGFzdENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4KTtcblxuXHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChsYXN0Q29udGVudCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgY29udGVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0aGlzQ29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIHRocm93QWxsRXJyb3JzIElmIHNldCB0byB0cnVlLCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMgd2lsbCBiZSB0aHJvd24gYXMgYW4gZXhjZXB0aW9uLlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBwYXJzaW5nIHRoZSBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHBhcnNlQ29udGVudCAodGhpc0NvbnRlbnQ6IHN0cmluZywgdGhyb3dBbGxFcnJvcnM6IGJvb2xlYW4sIHBhcnNlck9wdGlvbnM6IFBhcnNlck9wdGlvbnMgPSBudWxsKTogc3RyaW5nXG5cdHtcblx0XHRpZiAocGFyc2VyT3B0aW9ucyA9PSBudWxsKVxuXHRcdHtcblx0XHRcdHBhcnNlck9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0b3V0cHV0Q29tbWFuZHM6IHRydWUsXG5cdFx0XHRcdFx0YWxsb3dTdHJpbmdpZnk6IHRydWVcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRsZXQgU1RSSU5HSUZZX1NUQVJUOiBzdHJpbmcgPSBcIkpTT04uc3RyaW5naWZ5IChcIjtcblx0XHRsZXQgU1RSSU5HSUZZX0VORDogc3RyaW5nID0gXCIpXCI7XG5cblx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0U1RSSU5HSUZZX1NUQVJUID0gXCJcIjtcblx0XHRcdFNUUklOR0lGWV9FTkQgPSBcIlwiO1xuXHRcdH1cblxuXHRcdC8vIEFzc2VtYmxlIHRoZSBKUyB0byBldmFsdWF0ZS4gVGhpcyB3aWxsIHRha2UgYWxsIGNvbnRlbnQgb3V0c2lkZSBvZiBcblx0XHQvLyA8KiBhbmQgKj4gYW5kIHdyYXAgYSBIb3QuZWNobyBhcm91bmQgaXQuIEFueSBKUyBmb3VuZCBpbnNpZGUgb2YgdGhlIFxuXHRcdC8vIDwqIGFuZCAqPiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlzLlxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc0NvbnRlbnQgKHRoaXNDb250ZW50LCBcblx0XHRcdG5ldyBSZWdFeHAgKFwiKD89XFxcXDxcXFxcKikoW1xcXFxzXFxcXFNdKj8pKD89XFxcXCpcXFxcPilcIiwgXCJnXCIpLCBcblx0XHRcdChyZWdleEZvdW5kOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdHJlZ2V4Rm91bmQgPSByZWdleEZvdW5kLnN1YnN0ciAoMik7XG5cblx0XHRcdFx0cmV0dXJuIChgJHtyZWdleEZvdW5kfWApO1xuXHRcdFx0fSwgXG5cdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmIChvZmZDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdG9mZkNvbnRlbnQsIFwiIXtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGAqJiYlKiVAI0AhJHtyZWdleEZvdW5kMn0qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0Mjogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0dGVtcE91dHB1dCwgXCJTVFJ7XCIsIFwifVwiLCBcIntcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCFlY2hvT3V0cHV0IChKU09OLnN0cmluZ2lmeSgke3JlZ2V4Rm91bmQyfSksICR7dGhyb3dBbGxFcnJvcnN9KTsqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCEke1NUUklOR0lGWV9TVEFSVH0ke3JlZ2V4Rm91bmQyfSR7U1RSSU5HSUZZX0VORH0sICR7dGhyb3dBbGxFcnJvcnN9KTsqJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0fSwgNCwgMSk7XG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0Mzogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0dGVtcE91dHB1dDIsIFwiJHtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXRyeSB7IEhvdC5lY2hvICgke3JlZ2V4Rm91bmQyfSk7IH1jYXRjaCAoZXgpe0hvdC5lY2hvIChcIlwiKTt9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRocm93QWxsRXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdC8qbGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcE91dHB1dDQgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIj8oXCIsIFwiKVwiLCBcIihcIiwgXG5cdFx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoSG90Lk1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDMsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBmb3VuZFN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCBiZSBwYXJzZWQuIElmIHNvLCBzdHJpbmdpZnkgaXQuXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZSAocmVnZXhGb3VuZDIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMuYWxsb3dTdHJpbmdpZnkgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IEpTT04uc3RyaW5naWZ5IChyZWdleEZvdW5kMik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBgJHtyZWdleEZvdW5kMn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIElmIHZhbGlkIEpTT04gaXMgbm90IHJlY2VpdmVkLCBkb24ndCB3b3JyeSBhYm91dCBpdCwgcGFzcyBpdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBhbG9uZyB0byB0aGUgZnVuY3Rpb24gYmVsb3cgZm9yIGl0IHRvIGJlIHBhcnNlZCBpbiB0aGUgcGFnZS5cblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gdGhlcmUgaW5zdGVhZC5cblx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IGAke3JlZ2V4Rm91bmQyfWA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIE1ha2UgdGhpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIGFuZCBwYXNzIGZvdW5kU3RyLCBldGMuXG5cdFx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXtcbmNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoJHtmb3VuZFN0cn0pO1xuSG90LmVjaG8gKFxcYGRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiXFwke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIlxcJHt0ZXN0RWxtLmZ1bmN9XCIgZGF0YS10ZXN0LW9iamVjdC12YWx1ZSA9IFwiXFwke3Rlc3RFbG0udmFsdWV9XCJcXGApO1xufSomISMlQCFAKiFcXG5gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVUZXN0RWxlbWVudCA9IChmb3VuZFN0cjI6IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHIyO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGZvdW5kU3RyMikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIyKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgJHtmb3VuZFN0cjJ9IGluICR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogJHtleC5tZXNzYWdlfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKHRlc3RFbG0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoZm91bmRTdHIpO1xuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhZGF0YS10ZXN0LW9iamVjdC1uYW1lID0gXCIke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIiR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIiR7dGVzdEVsbS52YWx1ZX1cIiomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDU6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0LCBcIiomJiUqJUAjQCFcIiwgXCIqJiEjJUAhQCohXCIsIFwiKiYmJSolQCNAIVwiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChyZWdleEZvdW5kKTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudCk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gb2ZmQ29udGVudDtcblxuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdG91dCA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG91dCA9IGVzY2FwZWRDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XCIqJiYlKiVAI0AhXCIubGVuZ3RoLCBcIiomISMlQCFAKiFcIi5sZW5ndGgpO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGVtcG9yYXJ5IGhhY2suIFRoZXNlIGRlbGltaXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0ZW1wT3V0cHV0IHdoZW4gXG5cdFx0XHRcdC8vLyBleGVjdXRpbmcgcHJvY2Vzc05lc3RlZENvbnRlbnQuXG5cdFx0XHRcdHRlbXBPdXRwdXQ1ID0gdGVtcE91dHB1dDUucmVwbGFjZSAoL1xcKlxcJlxcJlxcJVxcKlxcJVxcQFxcI1xcQFxcIS9nLCBcIlwiKTtcblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwhXFwjXFwlXFxAXFwhXFxAXFwqXFwhL2csIFwiXCIpO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcE91dHB1dDUpO1xuXHRcdFx0fSwgMCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgY29udGVudCBpbiB0aGlzIGZpbGUuIFRoaXMgdHJlYXRzIGVhY2ggZmlsZSBhcyBvbmUgbGFyZ2UgSmF2YVNjcmlwdFxuXHQgKiBmaWxlLiBBbnkgdGV4dCBvdXRzaWRlIG9mIHRoZSA8KiAqPiBhcmVhcyB3aWxsIGJlIHRyZWF0ZWQgYXM6XG5cdCAqIFxuXHQgKiBcdFx0SG90LmVjaG8gKFwidGV4dFwiKTtcblx0ICogXG5cdCAqIEBmaXhtZSBUaGUgcmVnZXgncyBpbiB0aGUgb2ZmQ29udGVudCBmdW5jdGlvbnMgbmVlZCB0byBiZSBmaXhlZC4gVGhlcmUncyBzZXZlcmFsIFxuXHQgKiB0ZXN0IGNhc2VzIHdoZXJlIHRoZXkgd2lsbCBmYWlsLlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRoaXNDb250ZW50OiBzdHJpbmcgPSB0aGlzLmNvbnRlbnQ7XG5cblx0XHRIb3QuTW9kZSA9IHRoaXMucGFnZS5wcm9jZXNzb3IubW9kZTtcblx0XHRIb3QuQXJndW1lbnRzID0gYXJncztcblx0XHRIb3QuQ3VycmVudFBhZ2UgPSB0aGlzLnBhZ2U7XG5cdFx0SG90LlB1YmxpY0tleXMgPSB0aGlzLnBhZ2UucHJvY2Vzc29yLnB1YmxpY0tleXM7XG5cdFx0SG90LkFQSSA9IHRoaXMucGFnZS5nZXRBUEkgKCk7XG5cdFx0SG90LlRlc3RlckFQSSA9IHRoaXMucGFnZS5nZXRUZXN0ZXJBUEkgKCk7XG5cblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBIb3RGaWxlLnBhcnNlQ29udGVudCAodGhpc0NvbnRlbnQsIHRoaXMudGhyb3dBbGxFcnJvcnMpO1xuXG5cdFx0Ly8gRXhlY3V0ZSB0aGUgYXNzZW1ibGVkIEpTIGZpbGUuXG5cdFx0bGV0IHJldHVybmVkT3V0cHV0OiBhbnkgPSBudWxsO1xuXG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0bGV0IGV4ZWN1dGlvbkNvbnRlbnQ6IHN0cmluZyA9IGBcblx0XHRcdHZhciBIb3QgPSBhcmd1bWVudHNbMF07XG5cdFx0XHR2YXIgUGFzc2VkSG90RmlsZSA9IGFyZ3VtZW50c1sxXTtcblxuXHRcdFx0YDtcblxuXHRcdFx0Ly8gT3V0cHV0IHRoZSBhcmd1bWVudHMgc28gaXQncyB1c2FibGUgaW4gdGhlIGVudGlyZSBkb2N1bWVudC5cblx0XHRcdGlmICh0eXBlb2YgKGFyZ3MpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUaGUgcGFzc2luZyBhcmd1bWVudHMgY2Fubm90IGJlIGEgc3RyaW5nIWApO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gYXJncylcblx0XHRcdHtcblx0XHRcdFx0bGV0IG5ld1Zhcjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlOiBhbnkgPSBhcmdzW2tleV07XG5cdFx0XHRcdGxldCBuZXdWYXJWYWx1ZVN0cjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG5ld1ZhclZhbHVlKTtcblxuXHRcdFx0XHRuZXdWYXIgPSBgdmFyICR7a2V5fSA9ICR7bmV3VmFyVmFsdWVTdHJ9O1xcbmA7XG5cblx0XHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBuZXdWYXI7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjb250ZW50TmFtZTogc3RyaW5nID0gdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoY29udGVudE5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdGNvbnRlbnROYW1lID0gdGhpcy5sb2NhbEZpbGU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLnVybDtcblxuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBgXG5cblx0XHRcdGZ1bmN0aW9uIGVjaG9PdXRwdXQgKGNvbnRlbnQsIHRocm93RXJyb3JzKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFcnJvcnMgPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvd0Vycm9ycyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGNyZWF0ZVRlc3RFbGVtZW50IChmb3VuZFN0cilcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoZm91bmRTdHIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcXGBUZXN0IGVsZW1lbnQgXFwke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhXFxgKTtcblxuXHRcdFx0XHRcdEhvdC5DdXJyZW50UGFnZS5hZGRUZXN0RWxlbWVudCAodGVzdEVsbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFxcYEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50IFxcJHtmb3VuZFN0cn0gaW4gXFwke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6IFxcJHtleC5tZXNzYWdlfVxcYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodGVzdEVsbSk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbnRlbnQgKEN1cnJlbnRIb3RGaWxlKVxuXHRcdFx0e1xcbmA7XG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG91dHB1dDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gYFxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJ1bkNvbnRlbnQgKFBhc3NlZEhvdEZpbGUpLnRoZW4gKCgpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoe1xuXHRcdFx0XHRcdFx0aG90OiBIb3QsXG5cdFx0XHRcdFx0XHRvdXRwdXQ6IEhvdC5PdXRwdXQsXG5cdFx0XHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSAoSG90LkRhdGEpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7YDtcblxuXHRcdFx0Ly8vIEBmaXhtZSBQcmlvciB0byBleGVjdXRpb24gY29tcGlsZSBhbnkgVHlwZVNjcmlwdCBhbmQgbWFrZSBpdCBFUzUgY29tcGF0aWJsZS5cblx0XHRcdGxldCBmdW5jOiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbiAoZXhlY3V0aW9uQ29udGVudCk7XG5cdFx0XHRyZXR1cm5lZE91dHB1dCA9IGF3YWl0IGZ1bmMuYXBwbHkgKHRoaXMsIFtIb3QsIHRoaXNdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yKVxuXHRcdFx0e1xuXHRcdFx0XHQvLy8gQGZpeG1lIFB1dCB3aGF0J3MgaW4gdGhlIGNvbnRlbnQgdmFyaWFibGUgaW50byBhIHByZXYgY29udGVudCB2YXJpYWJsZT9cblx0XHRcdFx0Ly8vIFRoZW4gb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhbnkgc3ludGF4IGVycm9ycyBiZWluZyB0aHJvd24sIGV4ZWN1dGUgdGhlIFxuXHRcdFx0XHQvLy8gY29kZT8gVGhpcyB3b3VsZCBhbHNvIHJlcXVpcmUgc2F2aW5nIGFueSBIVE1MIG91dHNpZGUgb2YgdGhlICo+IGFuZCA8KiBcblx0XHRcdFx0Ly8vIHRoZW4gZWNob2luZyBpdCBvdXQuIFRoZSB0aHJvdyBiZWxvdyB3b3VsZCBoYXZlIHRvIGJlIHJlbW92ZWQgYXMgd2VsbC5cblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93IGV4O1xuXHRcdH1cblxuXHRcdEhvdC5EYXRhID0gcmV0dXJuZWRPdXRwdXQuaG90LkRhdGE7XG5cdFx0bGV0IGZpbmFsT3V0cHV0OiBzdHJpbmcgPSByZXR1cm5lZE91dHB1dC5vdXRwdXQ7XG5cdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdExvZ0xldmVsXG57XG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBpbmZvIG1lc3NhZ2VzLlxuXHQgKi9cblx0SW5mbyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IHdhcm5pbmcgbWVzc2FnZXMuXG5cdCAqL1xuXHRXYXJuaW5nLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgZXJyb3IgbWVzc2FnZXMuXG5cdCAqL1xuXHRFcnJvcixcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMuXG5cdCAqL1xuXHRWZXJib3NlLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcywgZXhjZXB0IHZlcmJvc2UuXG5cdCAqL1xuXHRBbGwsXG5cdC8qKlxuXHQgKiBEb2Vzbid0IHByaW50IGFueSBtZXNzYWdlLlxuXHQgKi9cblx0Tm9uZVxufVxuXG4vKipcbiAqIFRoZSBsb2dnZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RMb2dcbntcblx0LyoqXG5cdCAqIFRoZSBsb2dnaW5nIGxldmVsLlxuXHQgKi9cblx0bG9nTGV2ZWw6IEhvdExvZ0xldmVsO1xuXG5cdGNvbnN0cnVjdG9yIChsb2dMZXZlbDogSG90TG9nTGV2ZWwgPSBIb3RMb2dMZXZlbC5BbGwpXG5cdHtcblx0XHR0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgbWVzc2FnZS5cblx0ICovXG5cdGxvZyAobGV2ZWw6IEhvdExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSlcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAoKGxldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKSB8fCBcblx0XHRcdFx0KGxldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5pbmZvIChtZXNzYWdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0XHRcdHRoaXMud2FybmluZyAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHRcdFx0dGhpcy5pbmZvIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHRcdFx0dGhpcy5pbmZvIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgdmVyYm9zZSBtZXNzYWdlLlxuXHQgKi9cblx0dmVyYm9zZSAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0XHRjb25zb2xlLmluZm8gKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRpbmZvIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5pbmZvIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgd2FybmluZy5cblx0ICovXG5cdHdhcm5pbmcgKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKSlcblx0XHR7XG5cdFx0XHRjb25zb2xlLndhcm4gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGVycm9yIChtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcilcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcikpXG5cdFx0e1xuXHRcdFx0bGV0IG1zZzogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdG1zZyA9IG1lc3NhZ2U7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChtZXNzYWdlLm1lc3NhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLm1lc3NhZ2U7XG5cblx0XHRcdFx0aWYgKG1lc3NhZ2Uuc3RhY2sgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLnN0YWNrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLmVycm9yIChtc2cpO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLiBGaWxlIG9yZGVyaW5nIG1hdHRlcnMgaGVyZS5cblx0ICogRXZlcnkgZmlsZSBpcyBwcm9jZXNzZWQgaW5jcmVtZW50YWxseS5cblx0ICovXG5cdGZpbGVzPzogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuIEZpbGUgb3JkZXJpbmcgbWF0dGVycyBoZXJlLlxuXHQgKiBFdmVyeSBmaWxlIGlzIHByb2Nlc3NlZCBpbmNyZW1lbnRhbGx5LlxuXHQgKi9cblx0ZmlsZXM6IEhvdEZpbGVbXTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIHRlc3RlciBuYW1lLlxuXHQgKi9cblx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RWxlbWVudDsgfTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhdGhzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFBhZ2UgfCBIb3RTdGFxKVxuXHR7XG5cdFx0aWYgKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IFwiXCI7XG5cdFx0XHR0aGlzLmZpbGVzID0gW107XG5cdFx0XHR0aGlzLnRlc3RFbGVtZW50cyA9IHt9O1xuXHRcdFx0dGhpcy50ZXN0UGF0aHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weS5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IGNvcHkudGVzdGVyTmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBjb3B5LnRlc3Rlck1hcCB8fCBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IGNvcHkucm91dGUgfHwgXCJcIjtcblx0XHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IFtdO1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGFkZFRlc3RFbGVtZW50IChlbG06IEhvdFRlc3RFbGVtZW50KTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW2VsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7ZWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdID0gZWxtO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGdldFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcpOiBIb3RUZXN0RWxlbWVudFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtuYW1lfSBkb2VzdCBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSB0ZXN0IHBhdGguXG5cdCAqL1xuXHRjcmVhdGVUZXN0UGF0aCAocGF0aE5hbWU6IHN0cmluZywgZHJpdmVyRnVuYzogSG90VGVzdFBhdGgpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0UGF0aHNbcGF0aE5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IHBhdGggJHtwYXRoTmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gPSBkcml2ZXJGdW5jO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgSFRUUE1ldGhvZCwgSUhvdFJvdXRlTWV0aG9kLCBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiwgVGVzdENhc2VGdW5jdGlvbiwgVGVzdENhc2VPYmplY3QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcblxuLyoqXG4gKiBUaGUgcm91dGUgdG8gdXNlLlxuICovXG5leHBvcnQgY2xhc3MgSG90Um91dGVcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdGhhdCBtYWludGFpbnMgdGhlIGNvbm5lY3Rpb25zLlxuXHQgKi9cblx0Y29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBUaGUgcm91dGUuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS5cblx0ICovXG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmVyc2lvbi5cblx0ICovXG5cdHZlcnNpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwcmVmaXggdG8gYWRkIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByb3V0ZSBtZXRob2QuXG5cdCAqL1xuXHRwcmVmaXg6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBcblx0ICogd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBjYWxscyB0aGF0IGNhbiBiZSBtYWRlLlxuXHQgKi9cblx0bWV0aG9kczogSG90Um91dGVNZXRob2RbXTtcblx0LyoqXG5cdCAqIFRoZSBlcnJvcnMgYW5kIHRoZWlyIEpTT04gdGhhdCBjYW4gYmUgdGhyb3duLiBDYW4gYmU6XG5cdCAqICogbm90X2F1dGhvcml6ZWRcblx0ICogKiBub19zZXJ2ZXJfZXhlY3V0ZV9mdW5jdGlvblxuXHQgKi9cblx0ZXJyb3JzOiB7IFtlcnJvcjogc3RyaW5nXTogYW55IH07XG5cblx0Y29uc3RydWN0b3IgKGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCwgcm91dGU6IHN0cmluZywgbWV0aG9kczogSG90Um91dGVNZXRob2RbXSA9IFtdKVxuXHR7XG5cdFx0dGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblx0XHR0aGlzLmxvZ2dlciA9IG51bGw7XG5cblx0XHRpZiAodGhpcy5jb25uZWN0aW9uICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5sb2dnZXIgPSB0aGlzLmNvbm5lY3Rpb24ucHJvY2Vzc29yLmxvZ2dlcjtcblx0XHR9XG5cblx0XHR0aGlzLnJvdXRlID0gcm91dGU7XG5cdFx0dGhpcy5kZXNjcmlwdGlvbiA9IFwiXCI7XG5cdFx0dGhpcy52ZXJzaW9uID0gXCJ2MVwiO1xuXHRcdHRoaXMucHJlZml4ID0gXCJcIjtcblx0XHR0aGlzLmF1dGhDcmVkZW50aWFscyA9IG51bGw7XG5cdFx0dGhpcy5tZXRob2RzID0gbWV0aG9kcztcblx0XHR0aGlzLmVycm9ycyA9IHtcblx0XHRcdFx0XCJub3RfYXV0aG9yaXplZFwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJOb3QgYXV0aG9yaXplZC5cIiksXG5cdFx0XHRcdFwibm9fc2VydmVyX2V4ZWN1dGVfZnVuY3Rpb25cIjogSG90Um91dGUuY3JlYXRlRXJyb3IgKFwiTWlzc2luZyBzZXJ2ZXIgZXhlY3V0ZSBmdW5jdGlvbi5cIiksXG5cdFx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbiBlcnJvciBKU09OIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyBjcmVhdGVFcnJvciAobWVzc2FnZTogc3RyaW5nKTogYW55XG5cdHtcblx0XHRyZXR1cm4gKHsgZXJyb3I6IG1lc3NhZ2UgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuIEFQSSBtZXRob2QgdG8gdGhpcyByb3V0ZS5cblx0ICogXG5cdCAqIEBwYXJhbSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBhZGQuIElmIGEgSG90Um91dGVNZXRob2QgaXMgc3VwcGxpZWQsIHRoZSBcblx0ICogcmVzdCBvZiB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIHdpbGwgYmUgaWdub3JlZC5cblx0ICovXG5cdGFkZE1ldGhvZCAoXG5cdFx0bWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCB8IElIb3RSb3V0ZU1ldGhvZCB8IHN0cmluZyxcblx0XHRleGVjdXRlRnVuY3Rpb246IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gbnVsbCxcblx0XHR0eXBlOiBIVFRQTWV0aG9kID0gSFRUUE1ldGhvZC5QT1NULFxuXHRcdHRlc3RDYXNlczogKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG1ldGhvZCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRtZXRob2QgPSBuZXcgSG90Um91dGVNZXRob2QgKHRoaXMsIG1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uLCB0eXBlLCBudWxsLCBudWxsLCBudWxsLCB0ZXN0Q2FzZXMpO1xuXG5cdFx0aWYgKG1ldGhvZCBpbnN0YW5jZW9mIEhvdFJvdXRlTWV0aG9kKVxuXHRcdFx0dGhpcy5tZXRob2RzLnB1c2ggKG1ldGhvZCk7XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChtZXRob2Qucm91dGUgPT0gbnVsbClcblx0XHRcdFx0bWV0aG9kLnJvdXRlID0gdGhpcztcblxuXHRcdFx0bWV0aG9kID0gbmV3IEhvdFJvdXRlTWV0aG9kIChtZXRob2QpO1xuXHRcdFx0dGhpcy5tZXRob2RzLnB1c2ggKCg8SG90Um91dGVNZXRob2Q+bWV0aG9kKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIG1ldGhvZCBieSBpdCdzIG5hbWUuXG5cdCAqL1xuXHRnZXRNZXRob2QgKG5hbWU6IHN0cmluZyk6IEhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRsZXQgZm91bmRNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gbnVsbDtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5tZXRob2RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRpZiAobWV0aG9kLm5hbWUgPT09IG5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdGZvdW5kTWV0aG9kID0gbWV0aG9kO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoZm91bmRNZXRob2QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgcm91dGUgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm91dGUgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlIGluIHRoZSBcblx0ICogY2FsbGVkIEhvdFJvdXRlTWV0aG9kLiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gXG5cdCAqIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICovXG5cdG9uQXV0aG9yaXplVXNlcjogKHJlcTogYW55LCByZXM6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbDtcbn0iLCJpbXBvcnQgeyBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5cbi8qKlxuICogQXZhaWxhYmxlIEhUVFAgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGVudW0gSFRUUE1ldGhvZFxue1xuXHQvKipcblx0ICogQSBIVFRQIEdFVCByZXF1ZXN0LlxuXHQgKi9cblx0R0VUID0gXCJnZXRcIixcblx0LyoqXG5cdCAqIEEgSFRUUCBQT1NUIHJlcXVlc3QuXG5cdCAqL1xuXHRQT1NUID0gXCJwb3N0XCIsXG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgdXBsb2FkIGEgZmlsZSwgdGhlbiBwb3N0IHRoZSBqc29uIHJlcXVlc3QgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdEZJTEVfVVBMT0FEID0gXCJmaWxlX3VwbG9hZF90aGVuX3Bvc3RfanNvblwiXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHdpdGggRXhwcmVzcy5cbiAqIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhpcyByb3V0ZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb24gPSAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IFxuXHQocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55LCBmaWxlcz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgdHlwZSBDbGllbnRFeGVjdXRpb25GdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIGZvciBhdXRob3JpemF0aW9uLiBBbnkgdmFsdWUgXG4gKiByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLlxuICogSWYgYW4gdW5kZWZpbmVkIHZhbHVlIGlzIHJldHVybmVkLCB0aGlzIGluZGljYXRlcyB0aGUgc2VydmVyIHdhcyBub3QgYWJsZSBcbiAqIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgc28gdGhlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHdpbGwgbm90IGJlIFxuICogZXhlY3V0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiA9IChyZXE6IGFueSwgcmVzOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RDYXNlRnVuY3Rpb24gPSAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gUHJvbWlzZTxhbnk+KSB8ICgoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBhbnkpO1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIG9iamVjdCB0byBwYXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDYXNlT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgbWV0aG9kIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlclxue1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgcGFyYW1ldGVyLiBEZWZhdWx0OiBzdHJpbmdcblx0ICogQ2FuIGJlOlxuXHQgKiAqIHN0cmluZ1xuXHQgKiAqIGludGVnZXJcblx0ICogKiBudW1iZXJcblx0ICogKiBib29sZWFuXG5cdCAqICogYXJyYXlcblx0ICogKiBvYmplY3Rcblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlci4gRGVmYXVsdDogXCJcIlxuXHQgKi9cblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZD8gRGVmYXVsdDogZmFsc2Vcblx0ICovXG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBvYmplY3QuXG5cdCAqL1xuXHRwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXI7IH07XG59XG5cbi8qKlxuICogQW4gQVBJIG1ldGhvZCB0byBtYWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHJvdXRlPzogSG90Um91dGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmV0dXJucyBmcm9tIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cmV0dXJucz86IHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyO1xuXHQvKipcblx0ICogVGhlIHBhcmFtZXRlcnMgaW4gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXI7IH07XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdHR5cGU/OiBIVFRQTWV0aG9kO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFscz86IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IGNhc2Ugb2JqZWN0cyB0byBleGVjdXRlIGR1cmluZyB0ZXN0cy5cblx0ICovXG5cdHRlc3RDYXNlcz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiBUZXN0Q2FzZU9iamVjdDtcblx0XHR9IHwgKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyBtZXRob2Qgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbWV0aG9kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyPzogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC4gSWYgdGhpcyBtZXRob2QgXG5cdCAqIGlzIHNldCwgdGhpcyB3aWxsIG5vdCBjYWxsIG9uQXV0aG9yaXplIGZvciB0aGUgcGFyZW50IEhvdFJvdXRlLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZS4gXG5cdCAqIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIHNlcnZlciBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIHNlcnZlciBzaWRlLiBcblx0ICogVGhpcyB3aWxsIHN0cmluZ2lmeSBhbnkgSlNPTiBvYmplY3QgYW5kIHNlbmQgaXQgYXMgYSBKU09OIHJlc3BvbnNlLiBcblx0ICogSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLiBcblx0ICogU28gdGhlIGRldmVsb3BlciB3b3VsZCBoYXZlIHRvIHNlbmQgYSByZXNwb25zZSB1c2luZyBcInJlc1wiLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJFeGVjdXRlPzogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgY2xpZW50IHNpZGUuXG5cdCAqIEBmaXhtZSBJcyB0aGlzIG5lY2Vzc2FyeT9cblx0ICovXG5cdG9uQ2xpZW50RXhlY3V0ZT86IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlTWV0aG9kIGltcGxlbWVudHMgSUhvdFJvdXRlTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHJvdXRlLlxuXHQgKi9cblx0cm91dGU6IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmV0dXJucyBmcm9tIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cmV0dXJuczogSG90Um91dGVNZXRob2RQYXJhbWV0ZXI7XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHBhcmFtZXRlcnM6IHsgW25hbWU6IHN0cmluZ106IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlOiBIVFRQTWV0aG9kO1xuXHQvKipcblx0ICogSGFzIHRoaXMgbWV0aG9kIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2ZXI/IFRoaXMgXG5cdCAqIHByZXZlbnRzIHRoZSBtZXRob2QgZnJvbSBiZWluZyByZXJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRpc1JlZ2lzdGVyZWQ6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGV4ZWN1dGVTZXR1cDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBcblx0ICogd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IGNhc2Ugb2JqZWN0cyB0byBleGVjdXRlIGR1cmluZyB0ZXN0cy5cblx0ICovXG5cdHRlc3RDYXNlczoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0O1xuXHRcdH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIG1ldGhvZCB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI/OiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZCBcblx0ICogaXMgc2V0LCB0aGlzIHdpbGwgbm90IGNhbGwgb25BdXRob3JpemUgZm9yIHRoZSBwYXJlbnQgSG90Um91dGUuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlLiBcblx0ICogVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyQXV0aG9yaXplPzogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgc2VydmVyIHNpZGUuIFxuXHQgKiBUaGlzIHdpbGwgc3RyaW5naWZ5IGFueSBKU09OIG9iamVjdCBhbmQgc2VuZCBpdCBhcyBhIEpTT04gcmVzcG9uc2UuIFxuXHQgKiBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQgbm8gcmVzcG9uc2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFxuXHQgKiBTbyB0aGUgZGV2ZWxvcGVyIHdvdWxkIGhhdmUgdG8gc2VuZCBhIHJlc3BvbnNlIHVzaW5nIFwicmVzXCIuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIHNlcnZlciBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckV4ZWN1dGU/OiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBjbGllbnQgc2lkZS5cblx0ICogQGZpeG1lIElzIHRoaXMgbmVjZXNzYXJ5P1xuXHQgKi9cblx0b25DbGllbnRFeGVjdXRlPzogQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb247XG5cblx0Y29uc3RydWN0b3IgKHJvdXRlOiBIb3RSb3V0ZSB8IElIb3RSb3V0ZU1ldGhvZCwgbmFtZTogc3RyaW5nID0gXCJcIiwgXG5cdFx0b25FeGVjdXRlOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB8IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0dHlwZTogSFRUUE1ldGhvZCA9IEhUVFBNZXRob2QuUE9TVCwgb25TZXJ2ZXJBdXRob3JpemU6IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiA9IG51bGwsIFxuXHRcdG9uUmVnaXN0ZXI6IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uID0gbnVsbCwgYXV0aENyZWRlbnRpYWxzOiBhbnkgPSBudWxsLCBcblx0XHR0ZXN0Q2FzZXM6IHsgW25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0OyB9IHwgKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbClcblx0e1xuXHRcdGxldCBuZXdSb3V0ZTogSG90Um91dGUgPSBudWxsO1xuXG5cdFx0aWYgKHJvdXRlIGluc3RhbmNlb2YgSG90Um91dGUpXG5cdFx0XHRuZXdSb3V0ZSA9IHJvdXRlO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRuZXdSb3V0ZSA9IHJvdXRlLnJvdXRlO1xuXG5cdFx0XHRpZiAocm91dGUudHlwZSAhPSBudWxsKVxuXHRcdFx0XHR0eXBlID0gcm91dGUudHlwZTtcblxuXHRcdFx0aWYgKHJvdXRlLm5hbWUgIT0gbnVsbClcblx0XHRcdFx0bmFtZSA9IHJvdXRlLm5hbWU7XG5cblx0XHRcdGlmIChyb3V0ZS5kZXNjcmlwdGlvbiAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmRlc2NyaXB0aW9uID0gcm91dGUuZGVzY3JpcHRpb247XG5cblx0XHRcdGlmIChyb3V0ZS5yZXR1cm5zICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0eXBlb2YgKHJvdXRlLnJldHVybnMpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5yZXR1cm5zID0ge1xuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IHJvdXRlLnJldHVybnNcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMucmV0dXJucyA9IHJvdXRlLnJldHVybnM7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb3V0ZS5wYXJhbWV0ZXJzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMucGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiByb3V0ZS5wYXJhbWV0ZXJzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHBhcmFtID0gcm91dGUucGFyYW1ldGVyc1trZXldO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAocGFyYW0pID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRoaXMucGFyYW1ldGVyc1trZXldID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBwYXJhbSxcblx0XHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJcIlxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHBhcmFtLnR5cGUgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cGFyYW0udHlwZSA9IFwic3RyaW5nXCI7XG5cblx0XHRcdFx0XHRcdHRoaXMucGFyYW1ldGVyc1trZXldID0gcGFyYW07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb3V0ZS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gcm91dGUuYXV0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAocm91dGUub25TZXJ2ZXJFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdG9uRXhlY3V0ZSA9IHJvdXRlLm9uU2VydmVyRXhlY3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyQXV0aG9yaXplICE9IG51bGwpXG5cdFx0XHRcdG9uU2VydmVyQXV0aG9yaXplID0gcm91dGUub25TZXJ2ZXJBdXRob3JpemU7XG5cblx0XHRcdGlmIChyb3V0ZS5vblJlZ2lzdGVyICE9IG51bGwpXG5cdFx0XHRcdG9uUmVnaXN0ZXIgPSByb3V0ZS5vblJlZ2lzdGVyO1xuXG5cdFx0XHRpZiAocm91dGUub25Qb3N0UmVnaXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IHJvdXRlLm9uUG9zdFJlZ2lzdGVyO1xuXG5cdFx0XHRpZiAocm91dGUub25TZXJ2ZXJFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdHRoaXMub25TZXJ2ZXJFeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25DbGllbnRFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdHRoaXMub25DbGllbnRFeGVjdXRlID0gcm91dGUub25DbGllbnRFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUudGVzdENhc2VzICE9IG51bGwpXG5cdFx0XHRcdHRlc3RDYXNlcyA9IHJvdXRlLnRlc3RDYXNlcztcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gXCJcIilcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEFsbCByb3V0ZSBtZXRob2RzIG11c3QgaGF2ZSBhIG5hbWUhYCk7XG5cblx0XHR0aGlzLnJvdXRlID0gbmV3Um91dGU7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMuaXNSZWdpc3RlcmVkID0gZmFsc2U7XG5cdFx0dGhpcy5leGVjdXRlU2V0dXAgPSBmYWxzZTtcblx0XHR0aGlzLmF1dGhDcmVkZW50aWFscyA9IGF1dGhDcmVkZW50aWFscztcblx0XHR0aGlzLm9uU2VydmVyQXV0aG9yaXplID0gb25TZXJ2ZXJBdXRob3JpemU7XG5cdFx0dGhpcy5vblJlZ2lzdGVyID0gb25SZWdpc3Rlcjtcblx0XHR0aGlzLnRlc3RDYXNlcyA9IHt9O1xuXG5cdFx0aWYgKHRoaXMucm91dGUuY29ubmVjdGlvbi5wcm9jZXNzb3IubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHR7XG5cdFx0XHRpZiAodGVzdENhc2VzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0Q2FzZXMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGVzdENhc2VzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvYmogPSB0ZXN0Q2FzZXNbaUlkeF07XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRlc3RDYXNlTmFtZTogc3RyaW5nID0gb2JqO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gKDxUZXN0Q2FzZUZ1bmN0aW9uPnRlc3RDYXNlc1tpSWR4ICsgMV0pO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWRkVGVzdENhc2UgKHRlc3RDYXNlTmFtZSwgZnVuYyk7XG5cdFx0XHRcdFx0XHRcdGlJZHgrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRlc3RDYXNlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2tleV07XG5cblx0XHRcdFx0XHRcdHRoaXMuYWRkVGVzdENhc2UgKG9iaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucm91dGUuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdHRoaXMub25TZXJ2ZXJFeGVjdXRlID0gb25FeGVjdXRlO1xuXHRcdC8vZWxzZVxuXHRcdFx0Ly90aGlzLm9uQ2xpZW50RXhlY3V0ZSA9IG9uRXhlY3V0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgdGVzdCBjYXNlLlxuXHQgKi9cblx0YWRkVGVzdENhc2UgKG5ld1Rlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCB8IHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24sIFxuXHRcdFx0dGVzdENhc2VGdW5jdGlvbjogVGVzdENhc2VGdW5jdGlvbiA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHRpZiAodHlwZW9mIChuZXdUZXN0Q2FzZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gbmV3VGVzdENhc2U7XG5cdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gdGVzdENhc2VGdW5jdGlvbjtcblxuXHRcdFx0dGhpcy50ZXN0Q2FzZXNbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRmdW5jOiBmdW5jXG5cdFx0XHRcdH07XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIChuZXdUZXN0Q2FzZSkgPT09IFwiZnVuY3Rpb25cIilcblx0XHR7XG5cdFx0XHRjb25zdCB0ZXN0Q2FzZUlkOiBudW1iZXIgPSBPYmplY3Qua2V5cyAodGhpcy50ZXN0Q2FzZXMpLmxlbmd0aDtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IGAke3RoaXMucm91dGUucm91dGV9LyR7dGhpcy5uYW1lfSB0ZXN0IGNhc2UgJHt0ZXN0Q2FzZUlkfWA7XG5cdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gKDxUZXN0Q2FzZUZ1bmN0aW9uPm5ld1Rlc3RDYXNlKTtcblxuXHRcdFx0dGhpcy50ZXN0Q2FzZXNbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRmdW5jOiBmdW5jXG5cdFx0XHRcdH07XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB0ZXN0Q2FzZTogVGVzdENhc2VPYmplY3QgPSAoPFRlc3RDYXNlT2JqZWN0Pm5ld1Rlc3RDYXNlKTtcblx0XHR0aGlzLnRlc3RDYXNlc1t0ZXN0Q2FzZS5uYW1lXSA9IHRlc3RDYXNlO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5cbi8qKlxuICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuICovXG5leHBvcnQgZW51bSBIb3RTZXJ2ZXJUeXBlXG57XG5cdEhUVFAsXG5cdFdlYlNvY2tldHMsXG5cdEdlbmVyYXRlXG59XG5cbi8qKlxuICogVGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90U2VydmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdHlwZS5cblx0ICovXG5cdHNlcnZlclR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgbmV0d29yayBhZGRyZXNzIHRvIGxpc3RlbiBvbi5cblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqL1xuXHRsaXN0ZW5BZGRyZXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHQgKi9cblx0cG9ydHM6IHtcblx0XHRcdGh0dHA6IG51bWJlcjtcblx0XHRcdGh0dHBzOiBudW1iZXI7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFNTTCBzZXR0aW5ncy5cblx0ICovXG5cdHNzbDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2VydDogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIGtleSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGtleTogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIENBIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2E6IHN0cmluZztcblx0XHR9O1xuXHQvKipcblx0ICogUmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTLlxuXHQgKi9cblx0cmVkaXJlY3RIVFRQdG9IVFRQUzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuXG5cdCAqL1xuXHRzZWNyZXRzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSB8IEhvdFNlcnZlcilcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHtcblx0XHRcdFx0XHRodHRwOiA4MCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHtcblx0XHRcdFx0XHRjZXJ0OiBcIlwiLFxuXHRcdFx0XHRcdGtleTogXCJcIixcblx0XHRcdFx0XHRjYTogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWRpcmVjdEhUVFB0b0hUVFBTID0gdHJ1ZTtcblx0XHRcdHRoaXMudHlwZSA9IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0XHRcdHRoaXMuc2VjcmV0cyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3IucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gcHJvY2Vzc29yLnNlcnZlclR5cGUgfHwgXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gcHJvY2Vzc29yLmFwaSB8fCBudWxsO1xuXHRcdFx0dGhpcy5saXN0ZW5BZGRyZXNzID0gcHJvY2Vzc29yLmxpc3RlbkFkZHJlc3MgfHwgXCIwLjAuMC4wXCI7XG5cdFx0XHR0aGlzLnBvcnRzID0gcHJvY2Vzc29yLnBvcnRzIHx8IHtcblx0XHRcdFx0XHRodHRwOiA4MCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHByb2Nlc3Nvci5zc2wgfHwge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSBwcm9jZXNzb3IucmVkaXJlY3RIVFRQdG9IVFRQUyAhPSBudWxsID8gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgOiB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gcHJvY2Vzc29yLnR5cGUgfHwgSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0gcHJvY2Vzc29yLnNlY3JldHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbiBBUEkgdG8gdGhpcyBzZXJ2ZXIuIFRoaXMgd2lsbCBhbHNvIHNldCB0aGUgYXNzb2NpYXRlZCBcblx0ICogcHJvY2Vzc29yIHRvIHRoaXMgQVBJIGFzIHdlbGwuXG5cdCAqL1xuXHRhc3luYyBzZXRBUEkgKGFwaTogSG90QVBJKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IuYXBpID0gYXBpO1xuXHRcdHRoaXMuYXBpID0gYXBpO1xuXG5cdFx0Ly9pZiAocmVnaXN0ZXJSb3V0ZXMgPT09IHRydWUpXG5cdFx0XHQvL2F3YWl0IHRoaXMuYXBpLnJlZ2lzdGVyUm91dGVzICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZT8gKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTaHV0ZG93biB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgc2h1dGRvd24/ICgpOiBQcm9taXNlPHZvaWQ+O1xufSIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgdmFsaWRhdGVNb2R1bGVOYW1lIGZyb20gXCJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1uYW1lXCI7XG5cbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuXG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCwgSUhvdENvbXBvbmVudCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG90TG9nLCBIb3RMb2dMZXZlbCB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IERldmVsb3Blck1vZGUsIEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5cbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyQVBJIH0gZnJvbSBcIi4vSG90VGVzdGVyQVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0TWFwIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgU2VydmFibGVGaWxlRXh0ZW5zaW9uIH0gZnJvbSBcIi4vSG90SFRUUFNlcnZlclwiO1xuXG52YXIgSG90VGVzdGVyTW9jaGE6IGFueSA9IG51bGw7XG52YXIgSG90VGVzdGVyTW9jaGFTZWxlbml1bTogYW55ID0gbnVsbDtcbnZhciBIb3RUZXN0U2VsZW5pdW1Ecml2ZXI6IGFueSA9IG51bGw7XG5cbi8qKlxuICogQSBtYXAgcGF0aCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTaXRlTWFwUGF0aFxue1xuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBzdGFydCBhdXRvbWF0aWNhbGx5IHdoZW4gdGVzdHMgc3RhcnQuXG5cdCAqIFRoZSBkZWZhdWx0IGlzIHRydWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIFxuXHQgKi9cblx0cGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJvdXRlIHVzZWQgaW4gYSBIb3RTaXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFNpdGVSb3V0ZVxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHJvdXRlLiBXaWxsIGFwcGVhciBpbiB0aGUgdGl0bGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGxvYWQuXG5cdCAqL1xuXHR1cmw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBBUEkgdG8gaW50ZXJmYWNlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggZGVzdGluYXRpb25zIGFyZSBzdXBwb3NlZCB0byBleGVjdXRlLiBUaGlzIGlzIFxuXHQgKiBpZ25vcmVkIGlmIHRoZSBkZXN0aW5hdGlvbnMgYXJlIGFuIGFycmF5LlxuXHQgKi9cblx0ZGVzdGluYXRpb25PcmRlcj86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIEhvdFRlc3Rlck1hcCB0byB1c2UuIFRoaXMgY2FuIGJlIHRoZSBuYW1lIG9mIGFuIFxuXHQgKiBleGlzdGluZyBvbmUgYXR0YWNoZWQgdG8gdGhlIHNlbGVjdGVkIHRlc3Rlciwgb3IgXG5cdCAqIGNhbiBiZSBhbiBhcnJheSBvZiBkZXN0aW5hdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gXG5cdCAqIGNyZWF0ZSBhIG5ldyBtYXAuXG5cdCAqL1xuXHRtYXA/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IEhvdFNpdGVNYXBQYXRoOyB9IHwgSG90U2l0ZU1hcFBhdGhbXTtcbn1cblxuLyoqXG4gKiBBIEhvdFNpdGUgdG8gbG9hZC4gVGhpcyBTSE9VTEQgTk9UIGNvbnRhaW4gYW55IHByaXZhdGUgc2VjcmV0IGtleXMsIHBhc3N3b3JkcywgXG4gKiBvciBkYXRhYmFzZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHNlcnZlci4gQXMgc3VjaCwgZnV0dXJlIFxuICogdmVyc2lvbnMgb2YgdGhlIEhvdFNpdGUgaW50ZXJmYWNlIHNob3VsZCBub3QgY29udGFpbiBhbnkgZGF0YWJhc2UgcmVsYXRlZCBcbiAqIGNvbm5lY3Rpb24gaW5mby5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTaXRlXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGlzIEhvdFNpdGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIEhvdFNpdGUuXG5cdCAqL1xuXHR2ZXJzaW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgSG90U2l0ZS5cblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgSG90U2l0ZS4gVGhpcyBpcyBmaWxsZWQgaW4gZHVyaW5nIHBhcnNpbmcuXG5cdCAqL1xuXHRob3RzaXRlUGF0aD86IHN0cmluZztcblx0LyoqXG5cdCAqIEFkZGl0aW9uYWwgd2ViIHNlcnZlciBjb25maWd1cmF0aW9uLlxuXHQgKi9cblx0c2VydmVyPzoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgZGVmYXVsdCBuYW1lIGZvciBhIHNlcnZlZCBIb3R0IGZpbGUuXG5cdFx0XHQgKi9cblx0XHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgc2VydmUgQUxMIGZpbGVzLCBpbmNsdWRpbmcgcG90ZW50aWFsbHkgc2VjcmV0IGZpbGVzLlxuXHRcdFx0ICovXG5cdFx0XHRzZXJ2ZVNlY3JldEZpbGVzPzogYm9vbGVhbjtcblx0XHRcdC8qKlxuXHRcdFx0ICogU2VydmUgdGhlIGZvbGxvd2luZyBmaWxlIGV4dGVuc2lvbnMgd2hlbiByZXF1ZXN0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdHNlcnZlRmlsZUV4dGVuc2lvbnM/OiAoc3RyaW5nIHwgU2VydmFibGVGaWxlRXh0ZW5zaW9uKVtdO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgQVBJIHRvIGludGVyZmFjZSB3aXRoIGFjcm9zcyBhbGwgcGFnZXMuXG5cdFx0XHQgKi9cblx0XHRcdGdsb2JhbEFwaT86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGJhc2UgdXJsIGZvciB0aGUgc2VydmVyLlxuXHRcdFx0ICovXG5cdFx0XHR1cmw/OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBKYXZhU2NyaXB0IHNvdXJjZSBwYXRoLlxuXHRcdFx0ICovXG5cdFx0XHRqc1NyY1BhdGg/OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdHBvcnRzPzoge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSB3ZWIgSFRUUCBwb3J0IHRvIHNlcnZlIG9uLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGh0dHA/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHdlYiBIVFRQUyBwb3J0IHRvIHNlcnZlIG9uLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGh0dHBzPzogbnVtYmVyO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgcmVkaXJlY3QgZnJvbSBIVFRQIHRvIEhUVFBTIGZvciBhIHdlYiBhbmQgd2ViLWFwaSBzZXJ2ZXIuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cmVkaXJlY3RIVFRQdG9IVFRQUz86IGJvb2xlYW47XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIGFwaSBIVFRQIHBvcnQgdG8gc2VydmUgb24uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YXBpSHR0cD86IG51bWJlcjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgYXBpIEhUVFBTIHBvcnQgdG8gc2VydmUgb24uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YXBpSHR0cHM/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCByZWRpcmVjdCBmcm9tIEhUVFAgdG8gSFRUUFMgZm9yIGFuIGFwaSBzZXJ2ZXIuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YXBpUmVkaXJlY3RIVFRQdG9IVFRQUz86IGJvb2xlYW47XG5cdFx0XHRcdH07XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBsaXN0IG9mIGRpcmVjdG9yeSB0byBzZXJ2ZSB0byB0aGUgY2xpZW50IGZyb20gdGhlIHNlcnZlci5cblx0XHRcdCAqL1xuXHRcdFx0c2VydmVEaXJlY3Rvcmllcz86IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgd2ViIHJvdXRlIHRvIHRha2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cm91dGU6IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgbG9jYWwgZmlsZXN5c3RlbSBwYXRoIHRvIHNlcnZlIHBhZ2VzIGZyb20uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bG9jYWxQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdH1bXTtcblx0XHRcdC8qKlxuXHRcdFx0ICogSG93IHRvIGhhbmRsZSBlcnJvcnMuXG5cdFx0XHQgKi9cblx0XHRcdGVycm9ycz86IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIE9uIGEgNDA0LCBzZXJ2ZSBhIGxvY2FsIGZpbGUuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRvbjQwND86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIE9uIGFuIGVycm9yIG90aGVyIHRoYW4gYSA0MDQsIHNlcnZlIGEgbG9jYWwgZmlsZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdG9uT3RoZXI/OiBzdHJpbmc7XG5cdFx0XHR9O1xuXHRcdH07XG5cdC8qKlxuXHQgKiBUZXN0aW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cblx0ICovXG5cdHRlc3Rpbmc/OiB7XG5cdFx0XHR3ZWI/OiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdGVzdGVyIGNsYXNzIHRvIHVzZS4gRVg6IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3Rlcj86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgY3JlYXRlIGEgbmV3IHRlc3Rlci5cblx0XHRcdFx0ICogRGVmYXVsdCBWYWx1ZTogdHJ1ZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y3JlYXRlTmV3VGVzdGVyPzogYm9vbGVhbjtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB1cmwgdGhhdCBjb25uZWN0cyB0byB0aGUgdGVzdGVyIGFwaSBzZXJ2ZXIuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJBUElVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBkcml2ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0ZHJpdmVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBuZXh0IGNvbW1hbmQuXG5cdFx0XHRcdCAqIERlZmF1bHQgaXMgc2V0IHRvIDIwLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y29tbWFuZERlbGF5PzogbnVtYmVyO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGVzLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bGF1bmNocGFkVXJsPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG1hcHMgdG8gdGVzdCBpbiBvcmRlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdG1hcHM/OiBzdHJpbmdbXTtcblx0XHRcdH0sXG5cdFx0XHRhcGk/OiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdGVzdGVyIGNsYXNzIHRvIHVzZS4gRVg6IEhvdFRlc3Rlck1vY2hhXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXI/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIHRvIHVzZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3Rlck5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB0ZXN0ZXIuXG5cdFx0XHRcdCAqIERlZmF1bHQgVmFsdWU6IHRydWVcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNyZWF0ZU5ld1Rlc3Rlcj86IGJvb2xlYW47XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdXJsIHRoYXQgY29ubmVjdHMgdG8gdGhlIHRlc3RlciBhcGkgc2VydmVyLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyQVBJVXJsPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgZHJpdmVyIHRvIHVzZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGRyaXZlcj86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB1cmwgdG8gdGhlIGh0bWwgdGhhdCBsb2FkcyB0aGUgaG90dCBmaWxlcy5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGxhdW5jaHBhZFVybD86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBtYXBzIHRvIHRlc3QgaW4gb3JkZXIuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRtYXBzPzogc3RyaW5nW107XG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSByb3V0ZXMgdG8gbG9hZC5cblx0ICovXG5cdHJvdXRlcz86IHtcblx0XHRcdFtyb3V0ZU5hbWU6IHN0cmluZ106IEhvdFNpdGVSb3V0ZTtcblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGF2YWlsYWJsZSBBUElzIG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgbXVzdCBhbHJlYWR5IGhhdmUgdGhlc2UgXG5cdCAqIGxvYWRlZC5cblx0ICovXG5cdGFwaXM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBKUyBBUEkgZmlsZSB0byBsb2FkLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGpzYXBpPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBleHBvcnRlZCBKUyBsaWJyYXJ5IG5hbWUgdG8gdXNlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBhcGkgdG8gdXNlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGFwaU5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHBvcnQgdG8gdXNlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHBvcnQ/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHB1YmxpYyBiYXNlIHVybCBmb3IgdGhlIGFwaS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHR1cmw/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHNlcnZlci1zaWRlIGZpbGVwYXRoIGZvciB0aGUgYXBpLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGZpbGVwYXRoPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBtYXBzIHRvIHRlc3QgaW4gb3JkZXIuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bWFwPzogc3RyaW5nW107XG5cdFx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIFB1YmxpYyBrZXlzIHRoYXQgYXJlIGVtYmVkZGVkIGludG8gdGhlIHBhZ2UuXG5cdCAqL1xuXHRwdWJsaWNLZXlzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHN0cmluZyB8IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUga2V5IG9mIGFuIEFQSSBzZWNyZXQgdG8gcGFzcyB0byB0aGUgc2l0ZSB0byBcblx0XHRcdFx0XHQgKiBiZSB1c2VkIHB1YmxpY2x5LlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHBhc3NTZWNyZXRGcm9tQVBJPzogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEdldCB0aGUgcHVibGljIHNlY3JldCBmcm9tIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGVudj86IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdG8gbG9hZCBhbmQgcmVnaXN0ZXIuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBjb21wb25lbnQgdG8gbG9hZCBhbmQgcmVnaXN0ZXIuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dXJsOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0byBsb2FkIGFuZCBzYXZlIGluIG1lbW9yeS5cblx0ICovXG5cdGZpbGVzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGxvYWQuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0dXJsOiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgZGlzYWJsZSBsb2FkaW5nIGZpbGVzIGludG8gbWVtb3J5LlxuXHQgKi9cblx0ZGlzYWJsZUZpbGVMb2FkaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBzdGFydGluZyBhIHBhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U3RhcnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBUaGUgSG90dCBzaXRlIHRvIGxvYWQuXG5cdCAqL1xuXHR1cmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCB0byBkaXNwbGF5LlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlIHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UgdG8gbG9hZCB0aGUgcGFnZS5cblx0ICovXG5cdHByb2Nlc3Nvcj86IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBBbnkgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG5ldyBwYWdlLlxuXHQgKi9cblx0YXJncz86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgbWFwIHRvIHVzZS5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHRlc3RlciBhcGkuXG5cdCAqL1xuXHR0ZXN0ZXJBUElCYXNlVXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGUgdGhhdCdzIFxuXHQgKiBwb2ludGVkIGF0IHRoZSB1cmwgYWJvdmUuXG5cdCAqL1xuXHR0ZXN0ZXJMYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdGNvbXBvbmVudHM/OiB7XG5cdFx0W3RhZ05hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0Y29tcG9uZW50VHlwZTogKG5ldyAgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk/OiBIb3RBUEkpID0+IEhvdENvbXBvbmVudCksIFxuXHRcdFx0XHRwcm9jZXNzb3I6IEhvdFN0YXEsIFxuXHRcdFx0XHRhcGk6IEhvdEFQSVxuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgZmlsZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGZvciBsYXRlciB1c2UuXG5cdCAqL1xuXHRmaWxlcz86IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU/OiBIb3RTaXRlO1xufVxuXG4vKipcbiAqIFRoZSBtYWluIGNsYXNzIHRoYXQgaGFuZGxlcyBhbGwgSFRNTCBwcmVwcm9jZXNzaW5nLCB0aGVuIG91dHB1dHMgdGhlIFxuICogcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFN0YXEgaW1wbGVtZW50cyBJSG90U3RhcVxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBIb3RTdGFxLlxuXHQgKi9cblx0c3RhdGljIHZlcnNpb246IHN0cmluZyA9IFwiMC42LjIxXCI7XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIHdlYiBidWlsZC5cblx0ICovXG5cdHN0YXRpYyBpc1dlYjogYm9vbGVhbiA9IGZhbHNlO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqL1xuXHRzdGF0aWMgaXNSZWFkeUZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoaXMgZXZlbnQgd2hlbiB0aGlzIHBhZ2UgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqL1xuXHRzdGF0aWMgb25SZWFkeUZvclRlc3Rpbmc6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogRXJyb3JzIHRvIGV4ZWN1dGUgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZy5cblx0ICovXG5cdHN0YXRpYyBlcnJvcnM6IHsgW25hbWU6IHN0cmluZ106IHsgcmVkaXJlY3RUb1VybD86IHN0cmluZzsgZnVuYz86IChlcnJUeXBlOiBzdHJpbmcpID0+IHZvaWQ7IH07IH0gPSB7fTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGF0IHR5cGUgb2YgZXhlY3V0aW9uIHRoaXMgaXMuXG5cdCAqL1xuXHRtb2RlOiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZXMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRwYWdlczogeyBbbmFtZTogc3RyaW5nXTogSG90UGFnZSB9O1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRjb21wb25lbnRzOiB7XG5cdFx0W3RhZ05hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0Y29tcG9uZW50VHlwZTogKG5ldyAgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk/OiBIb3RBUEkpID0+IEhvdENvbXBvbmVudCksIFxuXHRcdFx0XHRwcm9jZXNzb3I6IEhvdFN0YXEsIFxuXHRcdFx0XHRhcGk6IEhvdEFQSVxuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgZmlsZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGZvciBsYXRlciB1c2UuXG5cdCAqL1xuXHRmaWxlczogeyBbbmFtZTogc3RyaW5nXTogSG90RmlsZSB9O1xuXHQvKipcblx0ICogVGhlIGxvYWRlZCBob3RzaXRlLlxuXHQgKi9cblx0aG90U2l0ZTogSG90U2l0ZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHRhcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHRlc3RlckFwaUNvbnRlbnQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYWdlIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0cGFnZUNvbnRlbnQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIFRoZSBwdWJsaWMga2V5cyB0byBiZSBleHBvc2VkLlxuXHQgKi9cblx0cHVibGljS2V5czogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3RlcnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdHRlc3RlcnM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RlciB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90U3RhcSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5hcGkgPSBjb3B5LmFwaSB8fCBudWxsO1xuXHRcdHRoaXMudGVzdGVyQVBJID0gY29weS50ZXN0ZXJBUEkgfHwgbnVsbDtcblx0XHR0aGlzLm1vZGUgPSBjb3B5Lm1vZGUgfHwgRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uO1xuXHRcdHRoaXMucGFnZXMgPSBjb3B5LnBhZ2VzIHx8IHt9O1xuXHRcdHRoaXMuY29tcG9uZW50cyA9IGNvcHkuY29tcG9uZW50cyB8fCB7fTtcblx0XHR0aGlzLmZpbGVzID0gY29weS5maWxlcyB8fCB7fTtcblx0XHR0aGlzLmhvdFNpdGUgPSBjb3B5LmhvdFNpdGUgfHwgbnVsbDtcblx0XHR0aGlzLmFwaUNvbnRlbnQgPSBgXG5cdFx0XHR7XG5cdFx0XHRcdHZhciAlYXBpX25hbWUlID0gJWFwaV9leHBvcnRlZF9uYW1lJS4lYXBpX25hbWUlO1xuXHRcdFx0XHR2YXIgbmV3SG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0dmFyIG5ld2FwaSA9IG5ldyAlYXBpX25hbWUlICglYmFzZV91cmwlLCBuZXdIb3RDbGllbnQpO1xuXHRcdFx0XHRuZXdIb3RDbGllbnQuYXBpID0gbmV3YXBpO1xuXHRcdFx0XHRwcm9jZXNzb3IuYXBpID0gbmV3YXBpO1xuXHRcdFx0fWA7XG5cdFx0dGhpcy50ZXN0ZXJBcGlDb250ZW50ID0gYFxuXHRcdFx0dmFyIEhvdFRlc3RlckFQSSA9IEhvdFN0YXFXZWIuSG90VGVzdGVyQVBJO1xuXHRcdFx0dmFyIG5ld0hvdFRlc3RlckNsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cdFx0XHR2YXIgbmV3dGVzdGVyYXBpID0gbmV3IEhvdFRlc3RlckFQSSAoJWJhc2VfdGVzdGVyX3VybCUsIG5ld0hvdFRlc3RlckNsaWVudCk7XG5cdFx0XHRuZXdIb3RUZXN0ZXJDbGllbnQudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO1xuXHRcdFx0cHJvY2Vzc29yLnRlc3RlckFQSSA9IG5ld3Rlc3RlcmFwaTtgO1xuXHRcdHRoaXMucGFnZUNvbnRlbnQgPSBcbmA8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuXG48aGVhZD5cblx0PHRpdGxlPiV0aXRsZSU8L3RpdGxlPlxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIlaG90c3RhcV9qc19zcmMlXCI+PC9zY3JpcHQ+XG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0d2luZG93LkhvdFN0YXEgPSBIb3RTdGFxV2ViLkhvdFN0YXE7XG5cdFx0d2luZG93LkhvdENsaWVudCA9IEhvdFN0YXFXZWIuSG90Q2xpZW50O1xuXHRcdHdpbmRvdy5Ib3RBUEkgPSBIb3RTdGFxV2ViLkhvdEFQSTtcblx0XHR3aW5kb3cuSG90ID0gSG90U3RhcVdlYi5Ib3Q7XG5cdDwvc2NyaXB0PlxuXG4lYXBpc190b19sb2FkJVxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0ZnVuY3Rpb24gaG90c3RhcV9zdGFydEFwcCAoKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdGlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcblx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblxuXHRcdFx0JWxvYWRfaG90X3NpdGUlXG5cblx0XHRcdHZhciBwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRcdHZhciBwcm9taXNlcyA9IFtdO1xuXHRcdFx0JWRldmVsb3Blcl9tb2RlJVxuXG5cdFx0XHQlYXBpX2NvZGUlXG5cblx0XHRcdCVwdWJsaWNfc2VjcmV0cyVcblx0XHRcdCV0ZXN0ZXJfYXBpJVxuXHRcdFx0JWxvYWRfZmlsZXMlXG5cblx0XHRcdHByb2Nlc3Nvci5tb2RlID0gdGVtcE1vZGU7XG5cblx0XHRcdFByb21pc2UuYWxsIChwcm9taXNlcykudGhlbiAoZnVuY3Rpb24gKClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheVVybCAoe1xuXHRcdFx0XHRcdFx0XHR1cmw6IFwiJXVybCVcIixcblx0XHRcdFx0XHRcdFx0bmFtZTogXCIldGl0bGUlXCIsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcdFx0XHRhcmdzOiAlYXJncyUsXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWU6ICV0ZXN0ZXJfbmFtZSUsXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck1hcDogJXRlc3Rlcl9tYXAlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElCYXNlVXJsOiAldGVzdGVyX2FwaV9iYXNlX3VybCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckxhdW5jaHBhZFVybDogJXRlc3Rlcl9sYXVuY2hwYWRfdXJsJVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGhvdHN0YXFfc3RhcnRBcHAgKCk7XG5cdDwvc2NyaXB0PlxuPC9oZWFkPlxuXG48Ym9keT5cbjwvYm9keT5cblxuPC9odG1sPmA7XG5cdFx0dGhpcy5sb2dnZXIgPSBuZXcgSG90TG9nIChIb3RMb2dMZXZlbC5Ob25lKTtcblx0XHR0aGlzLnB1YmxpY0tleXMgPSB7fTtcblx0XHR0aGlzLnRlc3RlcnMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIGJvb2xlYW4gdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VCb29sZWFuICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhblxuXHR7XG5cdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcImZhbHNlXCIpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ5ZXNcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwibm9cIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllcFwiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJuYWhcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0aWYgKHBhcnNlSW50ICh2YWx1ZSkgIT0gMClcblx0XHRcdFx0cmV0dXJuICh0cnVlKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCByZXF1aXJlZDogYm9vbGVhbiA9IHRydWUsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gdHJ1ZSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtRGVmYXVsdCAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgZGVmYXVsdFZhbHVlOiBhbnkpOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gb2JqV2l0aFBhcmFtW25hbWVdO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gKGRlZmF1bHRWYWx1ZSk7XG5cblx0XHRpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlID09PSBcIlwiKVxuXHRcdFx0XHRyZXR1cm4gKGRlZmF1bHRWYWx1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBlcnJvci4gVGhpcyBjYW5ub3QgYmUgYW4gYXN5bmMgZnVuY3Rpb24gZHVlIHRvIHRoZSBuYXR1cmUgb2YgaG93IHRoaXMgd29ya3MuXG5cdCAqL1xuXHRzdGF0aWMgZXhlY3V0ZUVycm9yIChlcnJUeXBlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSBIb3RTdGFxLmVycm9yc1tlcnJUeXBlXS5yZWRpcmVjdFRvVXJsO1xuXG5cdFx0XHRpZiAodXJsICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh1cmwgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZnVuYyA9IEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdLmZ1bmM7XG5cblx0XHRcdGlmIChmdW5jICE9IG51bGwpXG5cdFx0XHRcdGZ1bmMgKGVyclR5cGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBwYWdlLlxuXHQgKi9cblx0YWRkUGFnZSAocGFnZTogSG90UGFnZSk6IHZvaWRcblx0e1xuXHRcdHRoaXMucGFnZXNbcGFnZS5uYW1lXSA9IHBhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcGFnZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Z2V0UGFnZSAocGFnZU5hbWU6IHN0cmluZyk6IEhvdFBhZ2Vcblx0e1xuXHRcdHJldHVybiAodGhpcy5wYWdlc1twYWdlTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUuXG5cdCAqL1xuXHRhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogdm9pZFxuXHR7XG5cdFx0bGV0IG5hbWU6IHN0cmluZyA9IGZpbGUubmFtZTtcblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0bmFtZSA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS51cmw7XG5cblx0XHR0aGlzLmZpbGVzW25hbWVdID0gZmlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBmaWxlLlxuXHQgKi9cblx0Z2V0RmlsZSAobmFtZTogc3RyaW5nKTogSG90RmlsZVxuXHR7XG5cdFx0aWYgKHRoaXMuZmlsZXNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGZpbGUgJHtuYW1lfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmZpbGVzW25hbWVdKTtcblx0fVxuXG5cdC8qKiBcblx0ICogS2VlcCB0aGUgY29udGV4dCB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBpbi5cblx0ICogXG5cdCAqIEBwYXJhbSBmdW5jIFRoZSBkb2N1bWVudCBlbGVtZW50J3MgaWQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBvYmplY3QgdG8gcmVtYWluIGluIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBbdmFsPXVuZGVmaW5lZF0gQW4gYWRkaXRpb25hbCB2YWx1ZSB0byBwYXNzIHRvIHRoZSBjb250ZXh0LlxuXHQgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCByZXN1bHQgZnJvbSB0aGUgZnVuY3Rpb24gZnVuYy5cblx0ICovXG5cdHN0YXRpYyBrZWVwQ29udGV4dChmdW5jOiBGdW5jdGlvbiwgY29udGV4dDogYW55LCB2YWw/OiBhbnkpOiBhbnlcblx0e1xuXHRcdHZhciBvYmpSZXR1cm4gPSBmdW5jdGlvbigpXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBhcnlBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuXHRcdFx0XHRpZiAodmFsICE9IHVuZGVmaW5lZClcblx0XHRcdFx0XHRhcnlBcmdzLnB1c2godmFsKTtcblxuXHRcdFx0XHRpZiAoY29udGV4dCA9PSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyeUFyZ3MpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJ5QXJncyk7XG5cdFx0XHR9O1xuXG5cdFx0cmV0dXJuIG9ialJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW5kIHJlZ2lzdGVyIGEgY29tcG9uZW50LlxuXHQgKi9cblx0YWRkQ29tcG9uZW50IChDb21wb25lbnRUeXBlOiAobmV3ICAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaT86IEhvdEFQSSkgPT4gSG90Q29tcG9uZW50KSwgYXBpOiBIb3RBUEkgPSBudWxsLCBcblx0XHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zID0gdW5kZWZpbmVkKTogdm9pZFxuXHR7XG5cdFx0bGV0IHRlbXBBcGkgPSB0aGlzLmFwaVxuXHRcdFxuXHRcdGlmIChhcGkgIT0gbnVsbClcblx0XHRcdHRlbXBBcGkgPSBhcGk7XG5cblx0XHRsZXQgdGVtcENvbXBvbmVudE9iaiA9IG5ldyBDb21wb25lbnRUeXBlICh0aGlzLCB0ZW1wQXBpKTtcblxuXHRcdGlmICh0aGlzLmNvbXBvbmVudHNbdGVtcENvbXBvbmVudE9iai50YWddICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDb21wb25lbnQgJHt0ZW1wQ29tcG9uZW50T2JqLnRhZ30gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLmNvbXBvbmVudHNbdGVtcENvbXBvbmVudE9iai50YWddID0geyBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLCBwcm9jZXNzb3I6IHRoaXMsIGFwaTogdGVtcEFwaSB9O1xuXHRcdHRoaXMucmVnaXN0ZXJDb21wb25lbnQgKHRlbXBDb21wb25lbnRPYmoudGFnLCBlbGVtZW50T3B0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVjdCBhbnkgSFRNTCBwcmlvciB0byBET00gcGFyc2luZy4gVGhpcyBvbmx5IGFjY291bnRzIGZvciA8dHI+IGN1cnJlbnRseS5cblx0ICovXG5cdHByb3RlY3RlZCBzdGF0aWMgZml4SFRNTCAoc3RyOiBzdHJpbmcpOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfVxuXHR7XG5cdFx0Ly8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBYTUwgYW5kIEhUTUwuXG5cdFx0Y29uc3QgdGVtcFN0cjogc3RyaW5nID0gc3RyLnJlcGxhY2UoLyBcXC8+L2csICc+JykucmVwbGFjZShcblx0XHRcdC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdGNvbnN0IHBhcnNlZFhNTCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChgPHhtbD4ke3RlbXBTdHJ9PC94bWw+YCwgXCJ0ZXh0L3htbFwiKTtcblx0XHRsZXQgcXVlcnlTZWxlY3Rvcjogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwYXJzZWRYTUwuZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Y29uc3QgdGFnTmFtZTogc3RyaW5nID0gcGFyc2VkWE1MLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlblswXS50YWdOYW1lLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJ0clwiKVxuXHRcdFx0e1xuXHRcdFx0XHRzdHIgPSBgPHRhYmxlPiR7c3RyfTwvdGFibGU+YDtcblx0XHRcdFx0cXVlcnlTZWxlY3RvciA9IFwidGJvZHlcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwidGhcIilcblx0XHRcdHtcblx0XHRcdFx0c3RyID0gYDx0YWJsZT4ke3N0cn08L3RhYmxlPmA7XG5cdFx0XHRcdHF1ZXJ5U2VsZWN0b3IgPSB0YWdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoeyBmaXhlZFN0cjogc3RyLCBxdWVyeVNlbGVjdG9yOiBxdWVyeVNlbGVjdG9yIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZvciB1c2UgYXMgYSBIVE1MIHRhZy5cblx0ICovXG5cdHByb3RlY3RlZCByZWdpc3RlckNvbXBvbmVudCAodGFnOiBzdHJpbmcsIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG5cdHtcblx0XHRpZiAoKHRhZyA9PSBudWxsKSB8fCAodGFnID09PSBcIlwiKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEFsbCBjb21wb25lbnRzIG11c3QgaGF2ZSBhIHRhZyFgKTtcblxuXHRcdGlmIChjdXN0b21FbGVtZW50cy5nZXQgKHRhZykgIT09IHVuZGVmaW5lZClcblx0XHR7XG5cdFx0XHQvLy8gQGZpeG1lIFRoaXMgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIFNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yIG9yIHdhcm5pbmc/IEkgZG9uJ3QgdGhpbmsgaXQgc2hvdWxkLi4uXG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgcHJvY2Vzc29yQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cztcblxuXHRcdGN1c3RvbUVsZW1lbnRzLmRlZmluZSAodGFnLCBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50XG5cdFx0XHR7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgY29ubmVjdGVkIEhvdENvbXBvbmVudC5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGNvbXBvbmVudDogSG90Q29tcG9uZW50O1xuXHRcdFx0XG5cdFx0XHRcdGNvbnN0cnVjdG9yICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzdXBlciAoKTtcblxuXHRcdFx0XHRcdGxldCBjb21wb25lbnRJbmZvID0gcHJvY2Vzc29yQ29tcG9uZW50c1t0YWddO1xuXHRcdFx0XHRcdHRoaXMuY29tcG9uZW50ID0gbmV3IGNvbXBvbmVudEluZm8uY29tcG9uZW50VHlwZSAoY29tcG9uZW50SW5mby5wcm9jZXNzb3IsIGNvbXBvbmVudEluZm8uYXBpKTtcblx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGlzIGhlbHBzIHBhcnNlIDx0cj4gYW5kIG90aGVyIHRhZ3MgdGhhdCBkbyBub3QgaGF2ZSBhIHBhcmVudC5cblx0XHRcdFx0ICogXG5cdFx0XHRcdCAqIFRoYW5rcyBCcmFuZG9uIE1jQ29ubmVsbCFcblx0XHRcdFx0ICogXG5cdFx0XHRcdCAqIEZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY3MzEzNDc5L21ha2UtcGFyc2Vmcm9tc3RyaW5nLXBhcnNlLXdpdGhvdXQtdmFsaWRhdGlvblxuXHRcdFx0XHQgKiBcblx0XHRcdFx0ICogQHRvZG8gTWF5IHJlbW92ZSB0aGlzIGFzIGl0IGRvZXMgbm90IHNlZW0gdG8gd29yayB3ZWxsIGluIGEgbG90IG9mIGVkZ2UgY2FzZXMuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRwcm90ZWN0ZWQgbG9vc2VQYXJzZUZyb21TdHJpbmcgKHBhcnNlcjogRE9NUGFyc2VyLCBzdHI6IHN0cmluZykge1xuXHRcdFx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKC8gXFwvPi9nLCAnPicpLnJlcGxhY2UoLyg8KGFyZWF8YmFzZXxicnxjb2x8Y29tbWFuZHxlbWJlZHxocnxpbWd8aW5wdXR8a2V5Z2VufGxpbmt8bWV0YXxwYXJhbXxzb3VyY2V8dHJhY2t8d2JyKS4qPz4pL2csICckMTwvJDI+Jyk7XG5cdFx0XHRcdFx0Y29uc3QgeGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoJzx4bWw+JytzdHIrJzwveG1sPicsICd0ZXh0L3htbCcpO1xuXHRcdFx0XHRcdGNvbnN0IGhkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCcnLCAndGV4dC9odG1sJyk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgZWxlbSBvZiBBcnJheS5mcm9tKHhkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuKSkge1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGhkb20uYm9keS5hcHBlbmRDaGlsZChlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yIChsZXQgZWxlbSBvZiBBcnJheS5mcm9tKGhkb20ucXVlcnlTZWxlY3RvckFsbCgnYXJlYSxiYXNlLGJyLGNvbCxjb21tYW5kLGVtYmVkLGhyLGltZyxpbnB1dCxrZXlnZW4sbGluayxtZXRhLHBhcmFtLHNvdXJjZSx0cmFjayx3YnInKSkpIHtcblx0XHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRlbGVtLm91dGVySFRNTCA9ICc8JytlbGVtLm91dGVySFRNTC5zbGljZSgxKS5zcGxpdCgnPCcpWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gaGRvbTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKTogc3RyaW5nW10gLy8vIEBmaXhtZSBEb2VzIHRoaXMgUkVBTExZIGhhdmUgdG8gYmUgc3RhdGljPyBBd2Z1bCBpZiBpdCBkb2VzLi4uXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXR1cm4gKHRoaXMuY29tcG9uZW50Lm9ic2VydmVkQXR0cmlidXRlcyk7XG5cdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRhc3luYyBjb25uZWN0ZWRDYWxsYmFjayAoKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGNvbXBIdG1sRWxlbWVudCA9IHRoaXM7XG5cdFx0XHRcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50LmhvdENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50O1xuXHRcdFx0XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzID0gW2NvbXBIdG1sRWxlbWVudF07XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaW5uZXIgPSB0aGlzLmlubmVySFRNTDtcblx0XHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICh0aGlzLmF0dHJpYnV0ZXMpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0cjogQXR0ciA9IHRoaXMuYXR0cmlidXRlc1tpSWR4XTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0ck5hbWU6IHN0cmluZyA9IGF0dHIubmFtZS50b0xvd2VyQ2FzZSAoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0clZhbHVlOiBzdHJpbmcgPSBhdHRyLnZhbHVlO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZSA9PT0gXCJpZFwiKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcIm5hbWVcIilcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudC5uYW1lID0gYXR0clZhbHVlO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZSA9PT0gXCJ2YWx1ZVwiKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50LnZhbHVlID0gYXR0clZhbHVlO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZS5pbmRleE9mIChcImhvdC1cIikgPiAtMSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJUZW1wTmFtZTogc3RyaW5nID0gYXR0ck5hbWUuc3Vic3RyaW5nICg0KTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnRbYXR0clRlbXBOYW1lXSA9IGF0dHJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblByZU91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChhd2FpdCB0aGlzLmNvbXBvbmVudC5vblByZU91dHB1dCAoKSA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRsZXQgb3V0cHV0cyA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm91dHB1dCAoKTtcblx0XHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBvc3RPdXRwdXQgIT0gbnVsbClcblx0XHRcdFx0XHRcdG91dHB1dHMgPSBhd2FpdCB0aGlzLmNvbXBvbmVudC5vblBvc3RPdXRwdXQgKG91dHB1dHMpO1xuXHRcdFx0XG5cdFx0XHRcdFx0bGV0IGNvbXBvbmVudE91dHB1dHM6IEhvdENvbXBvbmVudE91dHB1dFtdID0gW107XG5cdFx0XHRcblx0XHRcdFx0XHRpZiAodHlwZW9mIChvdXRwdXRzKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMucHVzaCAoeyBodG1sOiBvdXRwdXRzIH0pO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0cyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRPdXRwdXRzID0gb3V0cHV0cztcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cyA9IFtvdXRwdXRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRmb3IgKGxldCBpS2R4ID0gMDsgaUtkeCA8IGNvbXBvbmVudE91dHB1dHMubGVuZ3RoOyBpS2R4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dHB1dCA9IGNvbXBvbmVudE91dHB1dHNbaUtkeF07XG5cdFx0XHRcdFx0XHRsZXQgaHRtbFN0cjogc3RyaW5nID0gb3V0cHV0Lmh0bWw7XG5cdFx0XHRcdFx0XHRsZXQgYWRkRnVuY3Rpb25zVG86IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmIChvdXRwdXQuYWRkRnVuY3Rpb25zVG8gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0YWRkRnVuY3Rpb25zVG8gPSBvdXRwdXQuYWRkRnVuY3Rpb25zVG87XG5cdFx0XHRcblx0XHRcdFx0XHRcdGxldCBzdHI6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50IChodG1sU3RyLCB0cnVlLCB7IFwib3V0cHV0Q29tbWFuZHNcIjogZmFsc2UgfSk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRzdHIgPSBhd2FpdCB0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAoc3RyKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0bGV0IGh0bWxIYW5kbGVyOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfSA9IHsgZml4ZWRTdHI6IFwiXCIsIHF1ZXJ5U2VsZWN0b3I6IFwiXCIgfTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAoc3RyKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0aHRtbEhhbmRsZXIgPSBIb3RTdGFxLmZpeEhUTUwgKHN0cik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRcdGxldCBuZXdPYmo6IEhUTUxFbGVtZW50ID0gbnVsbDtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0bmV3RE9NID0gYXdhaXQgdGhpcy5jb21wb25lbnQub25QYXJzZURPTSAoaHRtbEhhbmRsZXIuZml4ZWRTdHIpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHQvL25ld0RPTSA9IHRoaXMubG9vc2VQYXJzZUZyb21TdHJpbmcgKG5ldyBET01QYXJzZXIgKCksIHN0cik7XG5cdFx0XHRcdFx0XHRcdG5ld0RPTSA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBjb21wb25lbnQgb3V0cHV0IGZyb20gJHt0aGlzLmNvbXBvbmVudC5uYW1lfWApO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAobmV3RE9NLmJvZHkuY2hpbGRyZW4ubGVuZ3RoID4gMSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHRocm93RXJyOiBib29sZWFuID0gdHJ1ZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNoaWxkID0gbmV3RE9NLmJvZHkuY2hpbGRyZW5baUlkeF07XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSAoKSA9PT0gXCJwYXJzZXJlcnJvclwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRuZXdPYmogPSBjaGlsZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnIgPSBmYWxzZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAodGhyb3dFcnIgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgT25seSBhIHNpbmdsZSBodG1sIGVsZW1lbnQgY2FuIGNvbWUgZnJvbSBjb21wb25lbnQgJHt0aGlzLmNvbXBvbmVudC5uYW1lfSwgbXVsdGlwbGUgZWxlbWVudHMgd2VyZSBkZXRlY3RlZC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdG5ld09iaiA9ICg8SFRNTEVsZW1lbnQ+bmV3RE9NLmJvZHkuY2hpbGRyZW5bMF0pO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRuZXdPYmogPSBuZXdET00ucXVlcnlTZWxlY3RvciAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3Rvcik7XG5cblx0XHRcdFx0XHRcdGxldCBjaGlsZHJlblRvUmVhZGQ6IE5vZGVbXSA9IFtdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBTYXZlIHRoZSBjaGlsZHJlbiBmcm9tIGJlaW5nIHJlcGxhY2VkLlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9ICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpOyBpSWR4ID4gLTE7IGlJZHgtLSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGNoaWxkOiBOb2RlID0gdGhpcy5jaGlsZHJlbltpSWR4XTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRjaGlsZHJlblRvUmVhZGQucHVzaCAodGhpcy5yZW1vdmVDaGlsZCAoY2hpbGQpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0dGhpcy5yZXBsYWNlV2l0aCAobmV3T2JqKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmNsaWNrICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdG5ld09iai5vbmNsaWNrID0gdGhpcy5jb21wb25lbnQuY2xpY2suYmluZCAodGhpcy5jb21wb25lbnQpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5jb21wb25lbnQuZXZlbnRzKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZXZlbnQgPSB0aGlzLmNvbXBvbmVudC5ldmVudHNba2V5XTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdG5ld09iai5hZGRFdmVudExpc3RlbmVyIChldmVudC50eXBlLCBldmVudC5mdW5jLCBldmVudC5vcHRpb25zKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0bGV0IG9iamVjdEZ1bmN0aW9uczogc3RyaW5nW10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAodGhpcy5jb21wb25lbnQuY29uc3RydWN0b3IucHJvdG90eXBlKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gQXNzb2NpYXRlIGFueSBmdW5jdGlvbnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgb2JqZWN0RnVuY3Rpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgb2JqRnVuYzogc3RyaW5nID0gb2JqZWN0RnVuY3Rpb25zW2lJZHhdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBcImNvbnN0cnVjdG9yXCIpXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRsZXQgcHJvcCA9IHRoaXMuY29tcG9uZW50W29iakZ1bmNdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHByb3ApID09PSBcImZ1bmN0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaXNOZXdGdW5jdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGJhc2UgSG90Q29tcG9uZW50IGFuZCBzZWUgXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlcmUncyBhbnkgbWF0Y2hlcy4gSWYgdGhlcmUncyBhIG1hdGNoLCB0aGF0IG1lYW5zIFxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlJ3JlIHRyeWluZyB0byBhZGQgYW4gZXhpc3RpbmcgZnVuY3Rpb24sIGFuZCB3ZSBkb24ndFxuXHRcdFx0XHRcdFx0XHRcdC8vIHdhbm5hIGRvIHRoYXQuIFNraXAgaXQuXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5MiBpbiBIb3RDb21wb25lbnQucHJvdG90eXBlKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBrZXkyKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc05ld0Z1bmN0aW9uID0gZmFsc2U7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGlzTmV3RnVuY3Rpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3T2JqW29iakZ1bmNdID0gSG90U3RhcS5rZWVwQ29udGV4dCAodGhpcy5jb21wb25lbnRbb2JqRnVuY10sIHRoaXMuY29tcG9uZW50KTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFkZEZ1bmN0aW9uc1RvICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcXVlcnk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAoYWRkRnVuY3Rpb25zVG8pO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0cXVlcnlbb2JqRnVuY10gPSBIb3RTdGFxLmtlZXBDb250ZXh0ICh0aGlzLmNvbXBvbmVudFtvYmpGdW5jXSwgdGhpcy5jb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25QcmVQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRuZXdPYmogPSBhd2FpdCB0aGlzLmNvbXBvbmVudC5vblByZVBsYWNlIChuZXdPYmopO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRsZXQgY29tcEh0bWxFbGVtZW50MjogSFRNTEVsZW1lbnQgPSBhd2FpdCB0aGlzLmNvbXBvbmVudC5vbkNyZWF0ZWQgKG5ld09iaik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlID0gdGhpcy5jb21wb25lbnQub25QYXJlbnRQbGFjZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lmh0bWxFbGVtZW50cy5wdXNoIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKG91dHB1dC5wYXJlbnRTZWxlY3RvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZTogTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKG91dHB1dC5wYXJlbnRTZWxlY3Rvcik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgY29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKG91dHB1dC5wbGFjZUhlcmVQYXJlbnQgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHBhcmVudE5vZGVUb0NoZWNrID0gY29tcEh0bWxFbGVtZW50Mi5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZUNoZWNrQ291bnRlcjogbnVtYmVyID0gMDtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50Tm9kZUNoZWNrQ291bnRlciA8IDEwKSAvLy8gQHRvZG8gTWFrZSB0aGlzIGNvbnRyb2xsYWJsZSB3aXRoIGEgdmFyaWFibGUgZnJvbSB0aGUgY29tcG9uZW50LlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayBpbnN0YW5jZW9mIEhUTUxIdG1sRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGhvdC1wbGFjZS1oZXJlIGV4aXN0cywgcGxhY2UgdGhlIGNoaWxkcmVuIHRoZXJlLiBJZiBub3QsIHBsYWNlIGl0IHVuZGVyIHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLyBuZXcgZWxlbWVudC5cblx0XHRcdFx0XHRcdFx0XHRsZXQgcGxhY2VIZXJlQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgaG90LXBsYWNlLWhlcmVbbmFtZT1cIiR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH1cIl1gKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBcnJheVswXTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb21wSHRtbEVsZW1lbnQyLm9uUGFyZW50UGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBjb21wSHRtbEVsZW1lbnQyLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwbGFjZUhlcmUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoIDwgMSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcGxhY2VIZXJlQXR0ckFycmF5ID0gcGFyZW50Tm9kZVRvQ2hlY2sucXVlcnlTZWxlY3RvckFsbCAoYFtob3QtcGxhY2UtaGVyZT1cIiR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH1cIl1gKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUF0dHJBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcGxhY2VIZXJlID0gcGxhY2VIZXJlQXR0ckFycmF5WzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBsYWNlSGVyZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlVG9DaGVjayA9IHBhcmVudE5vZGVUb0NoZWNrLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZUNoZWNrQ291bnRlcisrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdC8vIEFwcGVuZCB0aGUgY2hpbGRyZW4gdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSFRNTCBlbGVtZW50LlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGlsZHJlblRvUmVhZGQubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkOiBOb2RlID0gY2hpbGRyZW5Ub1JlYWRkW2lJZHhdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuYXBwZW5kQ2hpbGQgKGNoaWxkKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGlmIChjaGlsZC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgY2hpbGQuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIsIGNoaWxkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50MiA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uUG9zdFBsYWNlIChjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgZWxlbWVudE9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBIVE1MIGVsZW1lbnQocykgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG5cdCAqL1xuXHRzdGF0aWMgYWRkSHRtbCAocGFyZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgaHRtbDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W11cblx0e1xuXHRcdGxldCBmb3VuZFBhcmVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGFyZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdGZvdW5kUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAocGFyZW50KTtcblx0XHRlbHNlXG5cdFx0XHRmb3VuZFBhcmVudCA9IHBhcmVudDtcblxuXHRcdGlmIChmb3VuZFBhcmVudCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50ICR7cGFyZW50fSFgKTtcblxuXHRcdGxldCByZXN1bHQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKGh0bWwpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGxldCBodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoaHRtbCk7XG5cdFx0XHRsZXQgbmV3RE9NOiBEb2N1bWVudCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRsZXQgY2hpbGRyZW46IGFueSA9IG51bGw7XG5cblx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5ib2R5LmNoaWxkcmVuO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5xdWVyeVNlbGVjdG9yIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yKS5jaGlsZHJlbjtcblxuXHRcdFx0bGV0IHJlc3VsdHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+Y2hpbGRyZW5baUlkeF0pO1xuXG5cdFx0XHRcdHJlc3VsdHMucHVzaCAoZm91bmRQYXJlbnQuYXBwZW5kQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdCA9IGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChodG1sKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIEhvdFNpdGUncyBuYW1lIGlzIHZhbGlkLlxuXHQgKi9cblx0c3RhdGljIGNoZWNrSG90U2l0ZU5hbWUgKGhvdHNpdGVOYW1lOiBzdHJpbmcsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuXG5cdHtcblx0XHRsZXQgdGhyb3dUaGVFeGNlcHRpb24gPSAoKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke2hvdHNpdGVOYW1lfSBoYXMgYW4gaW52YWxpZCBuYW1lISBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkgYW5kIG11c3QgaGF2ZSBhIHZhbGlkIE5QTSBtb2R1bGUgbmFtZS5gKTtcblx0XHRcdH07XG5cblx0XHRsZXQgcmVzdWx0cyA9IHZhbGlkYXRlTW9kdWxlTmFtZSAoaG90c2l0ZU5hbWUpO1xuXG5cdFx0aWYgKHJlc3VsdHMuZXJyb3JzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlc3VsdHMuZXJyb3JzLmxlbmd0aCA+IDApXG5cdFx0XHRcdHRocm93VGhlRXhjZXB0aW9uICgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW4gdGhlIHN1cHBsaWVkIGNvbnRlbnQsIHJlcGxhY2UgYSBrZXkgaW4gYSAke0tFWX0gd2l0aCBhIHZhbHVlLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGNvbnRlbnQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuXG5cdCAqL1xuXHRzdGF0aWMgcmVwbGFjZUtleSAoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0Y29uc3QgZmluYWxTdHI6IHN0cmluZyA9IGNvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoYFxcXFwkXFxcXHske2tleX1cXFxcfWAsIFwiZ1wiKSwgdmFsdWUpO1xuXG5cdFx0cmV0dXJuIChmaW5hbFN0cik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdmFsdWUgZnJvbSBhIEhvdFNpdGUgb2JqZWN0LlxuXHQgKiBcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgaG90c2l0ZSBvYmplY3QuIFJldHVybnMgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0c3RhdGljIGdldFZhbHVlRnJvbUhvdFNpdGVPYmogKGhvdHNpdGU6IEhvdFNpdGUsIHBhcmFtczogc3RyaW5nW10pOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gbnVsbDtcblxuXHRcdGlmIChob3RzaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHByZXZWYWx1ZTogYW55ID0gaG90c2l0ZTtcblxuXHRcdFx0Ly8gR28gdGhyb3VnaCBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBcblx0XHRcdC8vIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpbmFsIHBhcmFtZXRlci5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcGFyYW1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcGFyYW06IHN0cmluZyA9IHBhcmFtc1tpSWR4XTtcblxuXHRcdFx0XHRpZiAocHJldlZhbHVlW3BhcmFtXSA9PSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cHJldlZhbHVlID0gbnVsbDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJldlZhbHVlID0gcHJldlZhbHVlW3BhcmFtXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByZXZWYWx1ZSAhPSBudWxsKVxuXHRcdFx0XHR2YWx1ZSA9IHByZXZWYWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgSG90U2l0ZS5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3NIb3RTaXRlICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRIb3RTdGFxLmNoZWNrSG90U2l0ZU5hbWUgKHRoaXMuaG90U2l0ZS5uYW1lLCB0cnVlKTtcblxuXHRcdGxldCByb3V0ZXMgPSB0aGlzLmhvdFNpdGUucm91dGVzO1xuXHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gbnVsbDtcblx0XHRsZXQgZHJpdmVyOiBIb3RUZXN0RHJpdmVyID0gbnVsbDtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZXR1cFRlc3RlciA9IChwYXJlbnRPYmo6IGFueSkgPT4gXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVOZXdUZXN0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLmNyZWF0ZU5ld1Rlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZU5ld1Rlc3RlciA9IHBhcmVudE9iai5jcmVhdGVOZXdUZXN0ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIlRlc3RlclwiO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSBwYXJlbnRPYmoudGVzdGVyO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0gcGFyZW50T2JqLnRlc3Rlck5hbWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChjcmVhdGVOZXdUZXN0ZXIgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEZpbmQgYSB3YXkgdG8gc2VjdXJlbHkgYWxsb3cgZGV2cyB0byB1c2UgdGhlaXIgb3duIGRyaXZlcnMgYW5kIHRlc3RlcnMuLi5cblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEhhY2sgZm9yIGRlYWxpbmcgd2l0aCBXZWJQYWNrJ3MgYnMuXG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGEgPSByZXF1aXJlIChcIi4vSG90VGVzdGVyTW9jaGFcIikuSG90VGVzdGVyTW9jaGE7XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGFTZWxlbml1bSA9IHJlcXVpcmUgKFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCIpLkhvdFRlc3Rlck1vY2hhU2VsZW5pdW07XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdFNlbGVuaXVtRHJpdmVyID0gcmVxdWlyZSAoXCIuL0hvdFRlc3RTZWxlbml1bURyaXZlclwiKS5Ib3RUZXN0U2VsZW5pdW1Ecml2ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXJBUElVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSBwYXJlbnRPYmoudGVzdGVyQVBJVXJsO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmouZHJpdmVyID09PSBcIkhvdFRlc3RTZWxlbml1bURyaXZlclwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJpdmVyID0gbmV3IEhvdFRlc3RTZWxlbml1bURyaXZlciAoKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciA9PT0gXCJIb3RUZXN0ZXJNb2NoYVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhICh0aGlzLCB0ZXN0ZXJOYW1lLCB0ZXN0ZXJVcmwsIGRyaXZlcik7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXIgPT09IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gKHRoaXMsIHRlc3Rlck5hbWUsIHRlc3RlclVybCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGVzdGVyLmRyaXZlciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGhhdmUgYSBkcml2ZXIgc2V0IWApO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmouY29tbWFuZERlbGF5ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyLmRyaXZlci5jb21tYW5kRGVsYXkgPSBwYXJlbnRPYmouY29tbWFuZERlbGF5O1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdHNldHVwVGVzdGVyICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c2V0dXBUZXN0ZXIgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocm91dGVzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHJvdXRlcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHJvdXRlOiBIb3RTaXRlUm91dGUgPSByb3V0ZXNba2V5XTtcblx0XHRcdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAocm91dGUpO1xuXHRcdFx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMsXG5cdFx0XHRcdFx0XHRuYW1lOiByb3V0ZS5uYW1lIHx8IFwiXCIsXG5cdFx0XHRcdFx0XHRyb3V0ZToga2V5LFxuXHRcdFx0XHRcdFx0ZmlsZXM6IFtmaWxlXVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IHJvdXRlLm5hbWU7XG5cdFx0XHRcdFx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IG51bGw7XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5tYXAgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocm91dGUubWFwKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0ZXN0ZXIudGVzdE1hcHNbcm91dGUubWFwXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBtYXAgJHtyb3V0ZS5tYXB9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdGVyLnRlc3RNYXBzW3JvdXRlLm1hcF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dGVzdE1hcCA9IG5ldyBIb3RUZXN0TWFwICgpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uIH0gPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlLm1hcCBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHJvdXRlLm1hcC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGRlc3QgPSByb3V0ZS5tYXBbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucyA9IHt9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkyIGluIHJvdXRlLm1hcClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGRlc3QgPSByb3V0ZS5tYXBba2V5Ml07XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zW2tleTJdID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBkZXN0aW5hdGlvbnM7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0TWFwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocm91dGUuZGVzdGluYXRpb25PcmRlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0uZGVzdGluYXRpb25PcmRlciA9IHJvdXRlLmRlc3RpbmF0aW9uT3JkZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5hZGRQYWdlIChwYWdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLmFwaXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBhcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1trZXldO1xuXG5cdFx0XHRcdGlmIChhcGkubWFwID09IG51bGwpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblxuXHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhcGkubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgbWFwOiBzdHJpbmcgPSBhcGkubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKG1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEEgdGVzdGVyIHdhcyBub3QgY3JlYXRlZCBmaXJzdCEgWW91IG11c3Qgc3BlY2lmeSBvbmUgaW4gdGhlIENMSSBvciBpbiBIb3RTaXRlLmpzb24uYCk7XG5cblx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8vIEBmaXhtZSBBbGxvdyB0aGlzIHRvIHdvcmsgZm9yIHNlcnZlci1zaWRlIGFzIHdlbGwuLi5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLmNvbXBvbmVudHMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjb21wb25lbnQgPSB0aGlzLmhvdFNpdGUuY29tcG9uZW50c1trZXldO1xuXHRcdFx0XHRsZXQgY29tcG9uZW50VXJsOiBzdHJpbmcgPSBjb21wb25lbnQudXJsO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgQ3JlYXRlIHVuaXQgdGVzdCBmb3IgZmV0Y2hpbmcsIGxvYWRpbmcsIGFuZCByZWdpc3RlcmluZy5cblx0XHRcdFx0bGV0IHJlczogYW55ID0gYXdhaXQgZmV0Y2ggKGNvbXBvbmVudFVybCk7XG5cdFx0XHRcdGxldCBDb21wb25lbnRDbGFzcyA9IGV2YWwgKHJlcyk7XG5cblx0XHRcdFx0dGhpcy5hZGRDb21wb25lbnQgKENvbXBvbmVudENsYXNzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyA9PSBudWxsKVxuXHRcdFx0dGhpcy5ob3RTaXRlLnJvdXRlcyA9IHt9O1xuXG5cdFx0bGV0IGRpc2FibGVGaWxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS5kaXNhYmxlRmlsZUxvYWRpbmcgIT0gbnVsbClcblx0XHRcdGRpc2FibGVGaWxlTG9hZGluZyA9IHRoaXMuaG90U2l0ZS5kaXNhYmxlRmlsZUxvYWRpbmc7XG5cblx0XHRpZiAoZGlzYWJsZUZpbGVMb2FkaW5nID09PSBmYWxzZSlcblx0XHRcdGF3YWl0IHRoaXMubG9hZEhvdEZpbGVzICh0aGlzLmhvdFNpdGUuZmlsZXMpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBIb3RzaXRlIGhhcyBmaWxlIGxvYWRpbmcgZGlzYWJsZWQuLi5gKTtcblxuXHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdHRoaXMuYWRkVGVzdGVyICh0ZXN0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgZnJvbSBhIEhvdFNpdGUuanNvbiBmaWxlLiBCZSBzdXJlIHRvIGxvYWQgYW5kIGF0dGFjaCBhbnkgdGVzdGVycyBiZWZvcmUgXG5cdCAqIGxvYWRpbmcgYSBIb3RTaXRlLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhvdFNpdGUgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBqc29uU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYERvd25sb2FkaW5nIEhvdFNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRsZXQgcmVzOiBhbnkgPSBhd2FpdCBmZXRjaCAocGF0aCk7XG5cblx0XHRcdHRoaXMubG9nZ2VyLmluZm8gKGBEb3dubG9hZGVkIHNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRqc29uU3RyID0gcmVzLnRleHQgKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRwYXRoID0gcHBhdGgubm9ybWFsaXplIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYEFjY2Vzc2luZyBIb3RTaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0anNvblN0ciA9IGF3YWl0IG5ldyBQcm9taXNlIChcblx0XHRcdFx0KHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpOiB2b2lkID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmcy5yZWFkRmlsZSAocGF0aCwgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uLCBkYXRhOiBCdWZmZXIpOiB2b2lkID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmIChlcnIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBlcnI7XG5cdFxuXHRcdFx0XHRcdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gZGF0YS50b1N0cmluZyAoKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgQWNjZXNzZWQgc2l0ZSAke3BhdGh9YCk7XG5cdFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlIChjb250ZW50KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLmhvdFNpdGUgPSBKU09OLnBhcnNlIChqc29uU3RyKTtcblx0XHR0aGlzLmhvdFNpdGUuaG90c2l0ZVBhdGggPSBwYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIElmIGEgZmlsZSBhbHJlYWR5IGhhcyBjb250ZW50LCBpdCB3aWxsIG5vdCBiZSByZWxvYWRlZCBcblx0ICogdW5sZXNzIGZvcmNlQ29udGVudExvYWRpbmcgaXMgc2V0IHRvIHRydWUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90RmlsZXMgKGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHVybD86IHN0cmluZzsgbG9jYWxGaWxlPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9IH0sIFxuXHRcdFx0Zm9yY2VDb250ZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlcy4uLmApO1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlID0gZmlsZXNba2V5XTtcblx0XHRcdGxldCBuZXdGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFx0XHRcdFwibmFtZVwiOiBrZXlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZpbGUudXJsICE9IG51bGwpXG5cdFx0XHRcdG5ld0ZpbGUudXJsID0gZmlsZS51cmw7XG5cblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKGZpbGUubG9jYWxGaWxlICE9IG51bGwpXG5cdFx0XHRcdFx0bmV3RmlsZS5sb2NhbEZpbGUgPSBmaWxlLmxvY2FsRmlsZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGxvYWRDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGZpbGUuY29udGVudCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlLmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG5cdFx0XHRcdGxvYWRDb250ZW50ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChmb3JjZUNvbnRlbnRMb2FkaW5nID09PSB0cnVlKVxuXHRcdFx0XHRsb2FkQ29udGVudCA9IHRydWU7XG5cblx0XHRcdGlmIChsb2FkQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IGZpbGVwYXRoOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChuZXdGaWxlLnVybCAhPT0gXCJcIilcblx0XHRcdFx0XHRmaWxlcGF0aCA9IG5ld0ZpbGUudXJsO1xuXG5cdFx0XHRcdGlmIChuZXdGaWxlLmxvY2FsRmlsZSAhPT0gXCJcIilcblx0XHRcdFx0XHRmaWxlcGF0aCA9IG5ld0ZpbGUubG9jYWxGaWxlO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBMb2FkaW5nIEhvdHQgZmlsZTogJHtmaWxlcGF0aH1gKTtcblx0XHRcdFx0YXdhaXQgbmV3RmlsZS5sb2FkICgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRmluaXNoZWQgbG9hZGluZyBIb3R0IGZpbGU6ICR7ZmlsZXBhdGh9YCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYWRkRmlsZSAobmV3RmlsZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEZpbmlzaGVkIGxvYWRpbmcgSG90dCBmaWxlcy4uLmApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlIHRoZSBjb250ZW50IHRvIHNlbmQgdG8gYSBjbGllbnQuXG5cdCAqL1xuXHRnZW5lcmF0ZUNvbnRlbnQgKHJvdXRlS2V5OiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IFwiXCIsIHVybDogc3RyaW5nID0gXCIuL1wiLFxuXHRcdFx0anNTcmNQYXRoOiBzdHJpbmcgPSBcIi4vanMvSG90U3RhcS5taW4uanNcIiwgcGFzc0FyZ3M6IGJvb2xlYW4gPSB0cnVlLCBcblx0XHRcdGFyZ3M6IGFueSA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBhcGlTY3JpcHRzOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBhcGlDb2RlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBwdWJsaWNLZXlzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0Ly8vIEB0b2RvIE9wdGltaXplIHRoaXMgZnVuY3Rpb24gYXMgbXVjaCBhcyBwb3NzaWJsZS5cblxuXHRcdC8vIExvYWQgdGhlIEFQSSBzdHJpbmcuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBnbG9iYWxBcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1t0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaV07XG5cblx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGV4aXN0IWApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBsaWJyYXJ5TmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuYXBpTmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7Z2xvYmFsQXBpLmpzYXBpfVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7Z2xvYmFsQXBpLnVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cblx0XHRcdFx0aWYgKHJvdXRlICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocm91dGUuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3JvdXRlLmFwaV07XG5cblx0XHRcdFx0XHRcdGlmIChhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgQVBJICR7cm91dGUuYXBpfWApO1xuXG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChhcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEganNhcGkgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGpzYXBpcGF0aCA9IGFwaS5qc2FwaTtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7anNhcGlwYXRofVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAoYXBpLnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7YXBpLnVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgYXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgYXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5qc1NyY1BhdGggIT0gbnVsbClcblx0XHRcdFx0XHRqc1NyY1BhdGggPSB0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucHVibGljS2V5cylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZWNyZXQgPSB0aGlzLmhvdFNpdGUucHVibGljS2V5c1trZXldO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoc2VjcmV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHZhbHVlID0gSlNPTi5zdHJpbmdpZnkgKHNlY3JldCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkuY29ubmVjdGlvbiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHBhc3Mgc2VjcmV0cyBmcm9tIHRoZSBBUEkgaWYgdGhlcmUncyBubyBjb25uZWN0aW9uIWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlckNvbm46IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuYXBpLmNvbm5lY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5wYXNzU2VjcmV0RnJvbUFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VydmVyQ29ubi5zZWNyZXRzW2tleV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5lbnYgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgQHNlY3Z1bCBJcyB0aGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eT8gTmVlZCB0byB2ZXJpZnkgdGhhdCBcblx0XHRcdFx0XHRcdFx0XHQvLy8gb25seSB0aGUgc2VydmVyIGhhcyBhY2Nlc3MgdG8gdGhpcy4gQXQgdGhpcyBwb2ludCwgSSB0aGluayBvbmx5IHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLy8gc2VydmVyIGhhcyBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW52S2V5OiBzdHJpbmcgPSBzZWNyZXQuZW52O1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAocHJvY2Vzcy5lbnZbZW52S2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwdWJsaWNLZXlzICs9IGBwcm9jZXNzb3IucHVibGljS2V5c1tcIiR7a2V5fVwiXSA9ICR7dmFsdWV9O1xcbmA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gdGhpcy5wYWdlQ29udGVudDtcblx0XHRsZXQgZml4Q29udGVudCA9ICh0ZW1wQ29udGVudDogc3RyaW5nKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGV2ZWxvcGVyTW9kZVN0cjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckFQSVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGV2ZWxvcGVyTW9kZVN0ciA9IGB0ZW1wTW9kZSA9IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudDtgO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0aGlzLnRlc3RlckFwaUNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0ZXN0ZXJBUElTdHIucmVwbGFjZSAoL1xcJWJhc2VcXF90ZXN0ZXJcXF91cmxcXCUvZywgYFxcXCIke3RoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmx9XFxcImApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGxvYWRGaWxlczogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMgKHRoaXMuZmlsZXMpLmxlbmd0aCA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYHZhciBmaWxlcyA9IHt9O1xcblxcbmA7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5maWxlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZSA9IHRoaXMuZmlsZXNba2V5XTtcblx0XHRcdFx0XHRcdGxldCBmaWxlVXJsOiBzdHJpbmcgPSBgXCIke2ZpbGUudXJsfVwiYDtcblx0XHRcdFx0XHRcdGxldCBmaWxlQ29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbGUuY29udGVudCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAoZmlsZS5jb250ZW50KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBGaW5kIGFueSBzY3JpcHQgdGFncyBhbmQgaW50ZXJydXB0IHRoZW0gc28gdGhlIEhUTUwgcGFyc2VycyBcblx0XHRcdFx0XHRcdFx0Ly8gZG9uJ3QgZ2V0IGNvbmZ1c2VkLlxuXHRcdFx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKFwiXFxcXDxzY3JpcHRcIiwgXCJnbWlcIiksIFwiPHNjclxcXCIgKyBcXFwiaXB0XCIpO1xuXHRcdFx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKFwiXFxcXDxcXFxcL3NjcmlwdFwiLCBcImdtaVwiKSwgXCI8L3NjclxcXCIgKyBcXFwiaXB0XCIpO1xuXG5cdFx0XHRcdFx0XHRcdGZpbGVDb250ZW50ID0gYCwgXCJjb250ZW50XCI6ICR7ZXNjYXBlZENvbnRlbnR9YDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bG9hZEZpbGVzICs9IGBcXHRcXHRcXHRmaWxlc1tcIiR7a2V5fVwiXSA9IHsgXCJ1cmxcIjogJHtmaWxlVXJsfSR7ZmlsZUNvbnRlbnR9IH07XFxuYDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdHByb21pc2VzLnB1c2ggKHByb2Nlc3Nvci5sb2FkSG90RmlsZXMgKGZpbGVzKSk7XFxuYDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRpdGxlXFwlL2csIG5hbWUpO1xuXG5cdFx0XHRcdGlmIChwYXNzQXJncyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIFwiSG90LkFyZ3VtZW50c1wiKTtcblxuXHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFyZ3NcXCUvZywgSlNPTi5zdHJpbmdpZnkgKGFyZ3MpKTtcblxuXHRcdFx0XHRsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSByb3V0ZUtleTtcblx0XHRcdFx0bGV0IHRlc3RlclVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckxhdW5jaHBhZFVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IFwiVGVzdGVyXCI7XG5cblx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyTmFtZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlclVybCA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5sYXVuY2hwYWRVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubGF1bmNocGFkVXJsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldO1xuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXAgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWhvdHN0YXFcXF9qc1xcX3NyY1xcJS9nLCBqc1NyY1BhdGgpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVkZXZlbG9wZXJcXF9tb2RlXFwlL2csIGRldmVsb3Blck1vZGVTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXCUvZywgdGVzdGVyQVBJU3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpc1xcX3RvXFxfbG9hZFxcJS9nLCBhcGlTY3JpcHRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9hZFxcX2hvdFxcX3NpdGVcXCUvZywgXCJcIik7IC8vLyBAZml4bWUgU2hvdWxkIHRoaXMgb25seSBiZSBkb25lIHNlcnZlci1zaWRlP1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfZmlsZXNcXCUvZywgbG9hZEZpbGVzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfY29kZVxcJS9nLCBhcGlDb2RlKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlcHVibGljXFxfc2VjcmV0c1xcJS9nLCBwdWJsaWNLZXlzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldXJsXFwlL2csIHVybCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX25hbWVcXCUvZywgYFwiJHt0ZXN0ZXJOYW1lfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX21hcFxcJS9nLCBgXCIke3Rlc3Rlck1hcH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXF9iYXNlXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyVXJsfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2xhdW5jaHBhZFxcX3VybFxcJS9nLCBgXCIke3Rlc3RlckxhdW5jaHBhZFVybH1cImApO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcENvbnRlbnQpO1xuXHRcdFx0fTtcblx0XHRjb250ZW50ID0gZml4Q29udGVudCAoY29udGVudCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgRXhwcmVzcyByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcGFnZXMuIEJlIHN1cmUgdG8gbG9hZCB0aGUgXG5cdCAqIHBhZ2VzIGZpcnN0IGJlZm9yZSBkb2luZyB0aGlzLiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBcblx0ICogY3VzdG9taXplZCBFeHByZXNzIGFwcGxpY2F0aW9ucy4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsb2FkZWQgcm91dGVzIFxuXHQgKiBmcm9tIHRoaXMgSG90U3RhcSBvYmplY3Qgd2l0aCBIb3RIVFRQU2VydmVyLCBiZSBzdXJlIHRvIHVzZSBcblx0ICogdGhlIGxvYWRIb3RTaXRlIG1ldGhvZCBpbiBIb3RIVFRQU2VydmVyLlxuXHQgKi9cblx0Y3JlYXRlRXhwcmVzc1JvdXRlcyAoZXhwcmVzc0FwcDogYW55LCBqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucGFnZXMpXG5cdFx0e1xuXHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLnBhZ2VzW2tleV07XG5cdFx0XHRjb25zdCBjb250ZW50OiBzdHJpbmcgPSB0aGlzLmdlbmVyYXRlQ29udGVudCAocGFnZS5yb3V0ZSwgcGFnZS5uYW1lLCBwYWdlLmZpbGVzWzBdLnVybCwganNTcmNQYXRoKTtcblxuXHRcdFx0ZXhwcmVzc0FwcC5nZXQgKHBhZ2Uucm91dGUsIChyZXE6IGFueSwgcmVzOiBhbnkpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXMuc2VuZCAoY29udGVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSB0ZXN0ZXIgZm9yIHVzZSBsYXRlci5cblx0ICovXG5cdGFkZFRlc3RlciAodGVzdGVyOiBIb3RUZXN0ZXIpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnRlc3RlcnNbdGVzdGVyLm5hbWVdID0gdGVzdGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBtYXBzIGZvciB0ZXN0aW5nIGZyb20gdGhlIEhvdFNpdGUuXG5cdCAqL1xuXHRnZXRXZWJUZXN0aW5nTWFwcyAoKTogc3RyaW5nW11cblx0e1xuXHRcdGlmICh0aGlzLmhvdFNpdGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJObyBIb3RTaXRlIHdhcyBsb2FkZWQhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyB3ZWIgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIHRlc3Rpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG1hcHMhXCIpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldEFQSVRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIGFwaSBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSdzIGtleSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5yb3V0ZXMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNba2V5XTtcblxuXHRcdFx0XHRcdGlmIChyb3V0ZS5uYW1lID09PSBuYW1lKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZvdW5kS2V5ID0ga2V5O1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogSG90U2l0ZVJvdXRlXG5cdHtcblx0XHRsZXQgZm91bmRSb3V0ZTogSG90U2l0ZVJvdXRlID0gbnVsbDtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IHRoaXMuZ2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZSk7XG5cblx0XHRpZiAoZm91bmRLZXkgIT09IFwiXCIpXG5cdFx0XHRmb3VuZFJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tmb3VuZEtleV07XG5cblx0XHRyZXR1cm4gKGZvdW5kUm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGVzdHMuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKiBAcGFyYW0gbWFwTmFtZSBUaGUgbWFwIG9yIG1hcHMgdG8gdXNlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZywgbWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuICh0ZXN0ZXIuZXhlY3V0ZSAobWFwTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHdlYiB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3Rpbmcgd2ViIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsV2ViVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0V2ViVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIGFwaSB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3RpbmcgYXBpIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsQVBJVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0QVBJVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBwYWdlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3MgKHBhZ2VOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gdGhpcy5nZXRQYWdlIChwYWdlTmFtZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcGFnZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgbG9jYWwgZmlsZSBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0xvY2FsRmlsZSAobG9jYWxGaWxlcGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBsb2NhbEZpbGVwYXRoLCBhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbmV3IEhvdFN0YXEgKCk7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJsb2NhbEZpbGVcIjogbG9jYWxGaWxlcGF0aFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IHByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdXG5cdFx0XHR9KTtcblx0XHRwcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MgKG5hbWUsIGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSB1cmwgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NVcmwgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJ1cmxcIjogb3B0aW9ucy51cmxcblx0XHR9KTtcblxuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXSxcblx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IG9wdGlvbnMudGVzdGVyTmFtZSxcblx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjogb3B0aW9ucy50ZXN0ZXJNYXBcblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGNvbnRlbnQgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NDb250ZW50IChvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFwiY29udGVudFwiOiBvcHRpb25zLmNvbnRlbnRcblx0XHR9KTtcblx0XHRhd2FpdCBmaWxlLmxvYWQgKCk7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcInByb2Nlc3NvclwiOiBvcHRpb25zLnByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG9wdGlvbnMubmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSB3aW5kb3cgaGFzIGZpbmlzaGVkIGxvYWRpbmcsIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5IChyZWFkeUZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkXG5cdHtcblx0XHRpZiAoKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikgfHwgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiaW50ZXJhY3RpdmVcIikpXG5cdFx0XHRyZWFkeUZ1bmMgKCk7XG5cdFx0ZWxzZVxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKFwibG9hZFwiLCByZWFkeUZ1bmMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIG91dHB1dC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgdXNlT3V0cHV0IChvdXRwdXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdFx0bGV0IHBhcnNlciA9IG5ldyBET01QYXJzZXIgKCk7XG5cdFx0XHRsZXQgY2hpbGQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nIChvdXRwdXQsIFwidGV4dC9odG1sXCIpO1xuXHRcdFx0bGV0IGh0bWxPYmo6IEhUTUxIdG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07XG5cblx0XHRcdGh0bWxPYmouaW5uZXJIVE1MID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5pbm5lckhUTUw7XG5cblx0XHRcdC8vIFRoYW5rcyB0byBuZXdmdXJuaXR1cmV5IGF0OiBcblx0XHRcdC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyOTQ1ODg0L2RvbXBhcnNlci1hcHBlbmRpbmctc2NyaXB0LXRhZ3MtdG8taGVhZC1ib2R5LWJ1dC1ub3QtZXhlY3V0aW5nXG5cdFx0XHRsZXQgdG1wU2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcblx0XHRcdGlmICh0bXBTY3JpcHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly8gcHVzaCBhbGwgb2YgdGhlIGRvY3VtZW50J3Mgc2NyaXB0IHRhZ3MgaW50byBhbiBhcnJheVxuXHRcdFx0XHQvLyAodG8gcHJldmVudCBkb20gbWFuaXB1bGF0aW9uIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGRvbSBub2Rlcylcblx0XHRcdFx0bGV0IHNjcmlwdHM6IEhUTUxTY3JpcHRFbGVtZW50W10gPSBbXTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0bXBTY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKHRtcFNjcmlwdHNbaV0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBzY3JpcHQgdGFncyBhbmQgY3JlYXRlIGR1cGxpY2F0ZSB0YWdzIGZvciBlYWNoXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGxldCBzOiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0XHRcdFx0Ly8gYWRkIHRoZSBuZXcgbm9kZSB0byB0aGUgcGFnZVxuXHRcdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzKTtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB0aGUgb3JpZ2luYWwgKG5vbi1leGVjdXRpbmcpIG5vZGUgZnJvbSB0aGUgcGFnZVxuXHRcdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRzW2ldKTtcblxuXHRcdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+ICgocmVzb2x2ZTIsIHJlamVjdDIpID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHMub25sb2FkID0gKCkgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlMiAoKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdGxldCBoYXNTcmM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwic3JjXCIpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwic3JjXCIpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHMuc2V0QXR0cmlidXRlIChcInNyY1wiLCBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aGFzU3JjID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRzLnNldEF0dHJpYnV0ZSAoXCJ0eXBlXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cy5pbm5lckhUTUwgPSBzY3JpcHRzW2ldLmlubmVySFRNTDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaGFzU3JjID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlMiAoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgdGVzdGVycyB0byBsb2FkLlxuXHQgKiBcblx0ICogQGZpeG1lIFRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgQUxMIHRlc3RlcnMgdG8gZmluaXNoIGxvYWRpbmcuIE9ubHkgXG5cdCAqIHRoZSBmaXJzdCBvbmUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdEZvclRlc3RlcnMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHdoaWxlIChIb3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID09PSBmYWxzZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAoMTApO1xuXG5cdFx0aWYgKEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgIT0gbnVsbClcblx0XHRcdGF3YWl0IEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0dXAgdGhlIHRlc3RlcnMgYXBpLCBpZiBhbnkuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEsIG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucylcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHR7XG5cdFx0XHRpZiAocHJvY2Vzc29yLnRlc3RlckFQSSA9PSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJcIjtcblxuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09PSBcIlwiKVxuXHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0bGV0IGNsaWVudDogSG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0bGV0IHRlc3RlckFQSTogSG90VGVzdGVyQVBJID0gbmV3IEhvdFRlc3RlckFQSSAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsLCBjbGllbnQpO1xuXHRcdFx0XHR0ZXN0ZXJBUEkuY29ubmVjdGlvbi5hcGkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHRcdHByb2Nlc3Nvci50ZXN0ZXJBUEkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHVwIHRoZSB0ZXN0ZXJzIGFwaSBvbiB0aGUgY2xpZW50LCBpZiBuZWVkZWQuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBDbGllbnRUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0b3V0cHV0ICs9IFxuYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5mdW5jdGlvbiBob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKVxue1xuaWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxue1xuaWYgKEhvdC5Nb2RlID09PSBIb3RTdGFxV2ViLkRldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG57XG5sZXQgZnVuYyA9IGZ1bmN0aW9uICgpXG5cdHtcblx0XHRpZiAoSG90LlRlc3RlckFQSSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCB0ZXN0UGF0aHMgPSB7fTtcblx0XHRcdGxldCB0ZXN0RWxlbWVudHMgPSBKU09OLnN0cmluZ2lmeSAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50cyk7XG5cdFx0XHRsZXQgdGVzdE1hcHMgPSBKU09OLnN0cmluZ2lmeSAoSG90LkN1cnJlbnRQYWdlLnRlc3RNYXBzKTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIEhvdC5DdXJyZW50UGFnZS50ZXN0UGF0aHMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0UGF0aCA9IEhvdC5DdXJyZW50UGFnZS50ZXN0UGF0aHNba2V5XTtcblxuXHRcdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoLnRvU3RyaW5nICgpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgdGVzdFBhdGhzU3RyID0gSlNPTi5zdHJpbmdpZnkgKHRlc3RQYXRocyk7XG5cblx0XHRcdEhvdC5UZXN0ZXJBUEkudGVzdGVyLnBhZ2VMb2FkZWQgKHtcblx0XHRcdFx0XHR0ZXN0ZXJOYW1lOiBIb3QuQ3VycmVudFBhZ2UudGVzdGVyTmFtZSxcblx0XHRcdFx0XHR0ZXN0ZXJNYXA6IEhvdC5DdXJyZW50UGFnZS50ZXN0ZXJNYXAsXG5cdFx0XHRcdFx0cGFnZU5hbWU6IEhvdC5DdXJyZW50UGFnZS5uYW1lLFxuXHRcdFx0XHRcdHRlc3RFbGVtZW50czogdGVzdEVsZW1lbnRzLFxuXHRcdFx0XHRcdHRlc3RQYXRoczogdGVzdFBhdGhzU3RyXG5cdFx0XHRcdH0pLnRoZW4gKGZ1bmN0aW9uIChyZXNwKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAocmVzcC5lcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdEhvdFN0YXFXZWIuSG90U3RhcS5pc1JlYWR5Rm9yVGVzdGluZyA9IHRydWU7XG5cdFx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5pZiAoKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikgfHwgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiaW50ZXJhY3RpdmVcIikpXG5cdGZ1bmMgKCk7XG5lbHNlXG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jKTtcbn1cbn1cbn1cblxuaG90c3RhcV9pc0RvY3VtZW50UmVhZHkgKCk7XG48L3NjcmlwdD5gO1xuXHRcdH1cblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBob3R0IHNjcmlwdCBmcm9tIHRoZSBnaXZlbiB1cmwuXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGRpc3BsYXlVcmwgKHVybDogc3RyaW5nIHwgSG90U3RhcnRPcHRpb25zLCBuYW1lOiBzdHJpbmcgPSBudWxsLCBcblx0XHRwcm9jZXNzb3I6IEhvdFN0YXEgPSBudWxsLCBhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxIb3RTdGFxPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTxIb3RTdGFxPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0SG90U3RhcS5vblJlYWR5IChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ1cmxcIjogXCJcIlxuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRpZiAobmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mICh1cmwpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IHVybDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IHVybC5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBuYW1lO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mICh1cmwpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IHVybDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IHVybC5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mICh1cmwpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCA9IHVybDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSB1cmwudXJsO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh1cmwucHJvY2Vzc29yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSB1cmwucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh1cmwuYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IHVybC5hcmdzO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHVybC50ZXN0ZXJNYXAgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IHVybC50ZXN0ZXJNYXA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHVybC50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJOYW1lID0gdXJsLnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHVybC50ZXN0ZXJBUElCYXNlVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdXJsLnRlc3RlckFQSUJhc2VVcmw7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEuc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3IsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRvcHRpb25zLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdG9wdGlvbnMuYXJncyA9IGFyZ3M7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLnVybC5pbmRleE9mIChcImhzdHFzZXJ2ZVwiKSA8IDApXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsICs9IFwiP2hzdHFzZXJ2ZT1uYWhmYW1cIjtcblxuXHRcdFx0XHRcdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90U3RhcS5wcm9jZXNzVXJsIChvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3V0cHV0ICs9IEhvdFN0YXEuc2V0dXBDbGllbnRUZXN0ZXJzIChwcm9jZXNzb3IpO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBIb3RTdGFxLnVzZU91dHB1dCAob3V0cHV0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUgKHByb2Nlc3Nvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbmQgcmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgaG90dCBzY3JpcHQuXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGRpc3BsYXlDb250ZW50IChjb250ZW50OiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbCwgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8SG90U3RhcT5cblx0e1xuXHRcdHJldHVybiAobmV3IFByb21pc2U8SG90U3RhcT4gKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdEhvdFN0YXEub25SZWFkeSAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwiY29udGVudFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBjb250ZW50Lm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7IC8vLyBAZml4bWUgSXMgdGhpcyBvayB0byBkbz9cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IGNvbnRlbnQubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoY29udGVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQuY29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IGNvbnRlbnQucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBjb250ZW50LmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJNYXAgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IGNvbnRlbnQudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSBjb250ZW50LnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0SG90U3RhcS5zZXR1cFRlc3RlcnMgKHByb2Nlc3Nvciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG9wdGlvbnMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5hcmdzID0gYXJncztcblxuXHRcdFx0XHRcdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90U3RhcS5wcm9jZXNzQ29udGVudCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxufVxuXG5pZiAodHlwZW9mIChkb2N1bWVudCkgIT09IFwidW5kZWZpbmVkXCIpXG57XG5cdGxldCBsb2FkSG90U3RhcVNpdGUgPSBmdW5jdGlvbiAoKVxuXHR7XG5cdFx0bGV0IGhvdHN0YXFFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcVwiKTtcblxuXHRcdC8vIFNldCB0aGlzIHRvIHRydWUsIGp1c3QgaW4gY2FzZS4uLlxuXHRcdEhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHR5cGVvZiAoSG90U3RhcVdlYikgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0d2luZG93LkhvdFN0YXEgPSBIb3RTdGFxV2ViLkhvdFN0YXE7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3cuSG90Q2xpZW50ID0gSG90U3RhcVdlYi5Ib3RDbGllbnQ7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3cuSG90QVBJID0gSG90U3RhcVdlYi5Ib3RBUEk7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3cuSG90ID0gSG90U3RhcVdlYi5Ib3Q7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3cuSG90Q29tcG9uZW50ID0gSG90U3RhcVdlYi5Ib3RDb21wb25lbnQ7XG5cdFx0fVxuXG5cdFx0aWYgKGhvdHN0YXFFbG1zLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IGhvdHN0YXFFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcUVsbXNbMF07XG5cblx0XHRcdHNldFRpbWVvdXQgKGFzeW5jIGZ1bmN0aW9uICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZ2V0QXR0ciA9IChlbG06IEhUTUxFbGVtZW50LCBhdHRyTmFtZXM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dHJOYW1lcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdHRyTmFtZTogc3RyaW5nID0gYXR0ck5hbWVzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGF0dHJOYW1lKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChhdHRyTmFtZSkpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGBkYXRhLSR7YXR0ck5hbWV9YCkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0bGV0IGxvYWRQYWdlOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJsb2FkLXBhZ2VcIiwgXCJsb2FkUGFnZVwiLCBcInNyY1wiXSkgfHwgXCJcIjtcblx0XHRcdFx0XHRsZXQgcm91dGVyOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJyb3V0ZXJcIl0pIHx8IFwiXCI7XG5cdFx0XHRcdFx0bGV0IG5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcIm5hbWVcIl0pIHx8IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRcdGxldCBhcmdzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcmdzXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRcdGxldCBhcGlMaWJyYXJ5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbGlicmFyeVwiLCBcImFwaUxpYnJhcnlcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IGFwaU5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFwaS1uYW1lXCIsIFwiYXBpTmFtZVwiXSkgfHwgbnVsbDtcblx0XHRcdFx0XHRsZXQgYXBpVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktdXJsXCIsIFwiYXBpVXJsXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbmFtZVwiLCBcInRlc3Rlck5hbWVcIl0pIHx8IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0XHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1tYXBcIiwgXCJ0ZXN0ZXJNYXBcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IHRlc3RlckFwaUJhc2VVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1hcGktYmFzZS11cmxcIiwgXCJ0ZXN0ZXJBcGlCYXNlVXJsXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1sYXVuY2hwYWQtdXJsXCIsIFwidGVzdGVyTGF1bmNocGFkVXJsXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRcdGxldCBkb250UmV1c2VQcm9jZXNzb3I6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcGFzc1Jhd1VybDogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBodG1sU291cmNlOiBzdHJpbmcgPSBob3RzdGFxRWxtLmlubmVySFRNTCB8fCBcIlwiO1xuXHRcdFx0XHRcdGxldCByb3V0ZXJNYW5hZ2VyOiB7IFtwYXRoOiBzdHJpbmddOiB7IHJlZGlyZWN0OiBzdHJpbmc7IGJhc2U6IHN0cmluZzsgc3JjOiBzdHJpbmc7IH0gfSA9IHt9O1xuXHRcdFx0XHRcdGxldCByb3V0ZXJXaWxkY2FyZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0XHRpZiAoZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wic3JjXCJdKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bG9hZFBhZ2UgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pO1xuXG5cdFx0XHRcdFx0aWYgKGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInBhc3NSYXdVcmxcIl0pICE9IG51bGwpXG5cdFx0XHRcdFx0XHRwYXNzUmF3VXJsID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcblx0XHRcdFx0XHRcdGRvbnRSZXVzZVByb2Nlc3NvciA9IHRydWU7XG5cblx0XHRcdFx0XHRsZXQgaG90c3RhcUVycm9ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImhvdHN0YXEtZXJyb3JcIik7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFFcnJvcnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0bGV0IGhvdHN0YXFFcnJvckVsbTogSFRNTEVsZW1lbnQgPSBob3RzdGFxRXJyb3JzW2lJZHhdO1xuXHRcdFx0XHRcdFx0bGV0IGVycm9yU3RhdHVzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInN0YXR1c1wiXSk7XG5cdFx0XHRcdFx0XHRsZXQgdW5zdXBwb3J0ZWRCcm93c2VyOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInVuc3VwcG9ydGVkLWJyb3dzZXItcmVkaXJlY3RcIl0pO1xuXG5cdFx0XHRcdFx0XHRpZiAodW5zdXBwb3J0ZWRCcm93c2VyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdEhvdFN0YXEuZXJyb3JzW1widW5zdXBwb3J0ZWRCcm93c2VyXCJdID0geyByZWRpcmVjdFRvVXJsOiB1bnN1cHBvcnRlZEJyb3dzZXIgfTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0SG90U3RhcS5lcnJvcnNbYCR7ZXJyb3JTdGF0dXN9YF0gPSB7IHJlZGlyZWN0VG9Vcmw6IHVuc3VwcG9ydGVkQnJvd3NlciB9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIENoZWNrIGlmIGFzeW5jL2F3YWl0IGlzIGF2YWlsYWJsZS5cblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRldmFsIChcImFzeW5jICgpID0+IHt9XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0SG90U3RhcS5leGVjdXRlRXJyb3IgKFwidW5zdXBwb3J0ZWRCcm93c2VyXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyb3V0ZXIgIT09IFwiXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGhvdHN0YXFSb3V0ZXJFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcS1yb3V0ZXJcIik7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaG90c3RhcVJvdXRlckVsbXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0bGV0IGhvdHN0YXFSb3V0ZXJFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcVJvdXRlckVsbXNbaUlkeF07XG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxUm91dGVyRWxtLCBbXCJuYW1lXCJdKTtcblx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlTG9jYWxseTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcVJvdXRlckVsbSwgW1wic2VydmUtbG9jYWxcIiwgXCJzZXJ2ZUxvY2FsbHlcIl0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlck5hbWUgPT09IHJvdXRlcilcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIExvYWQgYWxsIHJvdXRlcyBmcm9tIHRoZSByb3V0ZXIuXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUpkeCA9IDA7IGlKZHggPCBob3RzdGFxUm91dGVyRWxtLmNoaWxkTm9kZXMubGVuZ3RoOyBpSmR4KyspXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlckVsbTogSFRNTEVsZW1lbnQgPSBob3RzdGFxUm91dGVyRWxtLmNoaWxkTm9kZXNbaUpkeF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJFbG0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlckVsbS50YWdOYW1lLnRvVXBwZXJDYXNlICgpID09PSBcIlJPVVRFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyUGF0aDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJwYXRoXCJdKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcmVkaXJlY3Q6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wicmVkaXJlY3RcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcImJhc2VcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZXJTcmM6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wic3JjXCJdKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJQYXRoLmluZGV4T2YgKFwiKlwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyTWFuYWdlcltyb3V0ZXJQYXRoXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVkaXJlY3Q6IHJlZGlyZWN0IHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJhc2U6IGJhc2UgfHwgdW5kZWZpbmVkLCBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3JjOiByb3V0ZXJTcmMgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHRlbXBQYXRobmFtZTogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxvd2VyU2VydmVMb2NhbGx5OiBzdHJpbmcgPSBzZXJ2ZUxvY2FsbHkudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICgobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwidHJ1ZVwiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwieWVzXCIpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCIxXCIpKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBsYXN0U2xhc2hQb3M6IG51bWJlciA9IHRlbXBQYXRobmFtZS5sYXN0SW5kZXhPZiAoXCIvXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0U2xhc2hQb3MgPiAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZW1wUGF0aG5hbWUgPSB0ZW1wUGF0aG5hbWUuc3Vic3RyaW5nIChsYXN0U2xhc2hQb3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJXaWxkY2FyZHMubGVuZ3RoID4gMClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTZXJ2ZSBsb2NhbGx5IGRvZXNuJ3QgcmVhbGx5IHdvcmsgd2l0aCB3aWxkY2FyZHNcblx0XHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgVGhpcyBpc24ndCBhY3R1YWxseSB3b3JraW5nIGxpa2UgYSB3aWxkY2FyZCBzaG91bGQuIFRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSmR4ID0gMDsgaUpkeCA8IHJvdXRlcldpbGRjYXJkcy5sZW5ndGg7IGlKZHgrKylcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlV2lsZGNhcmQ6IHN0cmluZyA9IHJvdXRlcldpbGRjYXJkc1tpSmR4XTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHRlbXBSb3V0ZVdpbGRjYXJkOiBzdHJpbmcgPSByb3V0ZVdpbGRjYXJkLnJlcGxhY2UgKFwiKlwiLCBcIlwiKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGVtcFBhdGhuYW1lLmluZGV4T2YgKHRlbXBSb3V0ZVdpbGRjYXJkKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVtcFBhdGhuYW1lID0gcm91dGVXaWxkY2FyZDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmluZCB0aGUgY29ycmVjdCByb3V0ZSBhbmQgbG9hZCBpdC5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyTWFuYWdlclt0ZW1wUGF0aG5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlck1hbmFnZXJbdGVtcFBhdGhuYW1lXS5yZWRpcmVjdCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJvdXRlck1hbmFnZXJbdGVtcFBhdGhuYW1lXS5yZWRpcmVjdDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW3RlbXBQYXRobmFtZV0uc3JjICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxvYWRQYWdlID0gcm91dGVyTWFuYWdlclt0ZW1wUGF0aG5hbWVdLnNyYztcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChhcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhcmdzID0gSlNPTi5wYXJzZSAoYXJncyk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0YXJncyA9IEhvdC5Bcmd1bWVudHM7XG5cblx0XHRcdFx0XHRsZXQgaGFzSHRtbFNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKGh0bWxTb3VyY2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgaHRtbFNvdXJjZUNoZWNrOiBzdHJpbmcgPSBodG1sU291cmNlLnJlcGxhY2UgKC9cXHMvZywnJyk7XG5cblx0XHRcdFx0XHRcdGlmIChodG1sU291cmNlQ2hlY2sgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGhhc0h0bWxTb3VyY2UgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0aWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblx0XHRcdFxuXHRcdFx0XHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBudWxsO1xuXG5cdFx0XHRcdFx0aWYgKGRvbnRSZXVzZVByb2Nlc3NvciA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoSG90KSAhPT0gXCJ1bmRlZmluZWRcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdHByb2Nlc3Nvci5tb2RlID0gdGVtcE1vZGU7XG5cblx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHByb2Nlc3Nvcixcblx0XHRcdFx0XHRcdFx0YXJnczogYXJnc1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChsb2FkUGFnZSAhPT0gXCJcIilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAocGFzc1Jhd1VybCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmIChsb2FkUGFnZS5pbmRleE9mIChcImhzdHFzZXJ2ZVwiKSA8IDApXG5cdFx0XHRcdFx0XHRcdFx0bG9hZFBhZ2UgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRvcHRpb25zLnVybCA9IGxvYWRQYWdlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0ZXN0ZXJNYXAgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IHRlc3Rlck1hcDtcblx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHRlc3Rlck5hbWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRpZiAodGVzdGVyQXBpQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdGVzdGVyQXBpQmFzZVVybDtcblxuXHRcdFx0XHRcdGlmICh0ZXN0ZXJMYXVuY2hwYWRVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTGF1bmNocGFkVXJsID0gdGVzdGVyTGF1bmNocGFkVXJsO1xuXG5cdFx0XHRcdFx0aWYgKGFwaU5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblxuXHRcdFx0XHRcdFx0aWYgKGFwaVVybCA9PT0gXCJcIilcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgYXBpLXVybCB3YXMgbm90IHNldCFgKTtcblxuXHRcdFx0XHRcdFx0bGV0IHBhcmVudExpYjogYW55ID0gd2luZG93O1xuXG5cdFx0XHRcdFx0XHRpZiAoYXBpTGlicmFyeSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHBhcmVudExpYiA9IHdpbmRvd1thcGlMaWJyYXJ5XTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IG5ld0FQSSA9IG5ldyBwYXJlbnRMaWJbYXBpTmFtZV0gKGFwaVVybCwgY2xpZW50KTtcblx0XHRcdFx0XHRcdG5ld0FQSS5jb25uZWN0aW9uLmFwaSA9IG5ld0FQSTtcblx0XHRcdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdBUEk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGhhc0h0bWxTb3VyY2UgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChsb2FkUGFnZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIGhvdHN0YXEgdGFnIG11c3QgaGF2ZSBhIHNyYywgSFRNTCBjb250ZW50cyBpbnNpZGUgaXQsIG9yIGEgcm91dGVyIHNldC5gKTtcblxuXHRcdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5VXJsIChvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheUNvbnRlbnQgKG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgNTApO1xuXHRcdH1cblx0fTtcblxuXHQvLy8gQHRzLWlnbm9yZVxuXHR3aW5kb3cuZXRoZXJldW0yMiA9IHdpbmRvdy5ldGhlcmV1bTtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKFwibG9hZFwiLCBsb2FkSG90U3RhcVNpdGUpO1xufVxuIiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbi8qKlxuICogVGhpcyBhY3R1YWxseSBleGVjdXRlcyB0aGUgdGVzdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RUZXN0RHJpdmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFRlc3RQYWdlO1xuXHQvKipcblx0ICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGVhY2ggZXhlY3V0ZWQgY29tbWFuZC5cblx0ICovXG5cdGNvbW1hbmREZWxheTogbnVtYmVyO1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBzYXZlZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdGVzdGluZyBydW5zLlxuXHQgKi9cblx0cGVyc2lzdGVudERhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBwYWdlOiBIb3RUZXN0UGFnZSA9IG51bGwpXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLnBhZ2UgPSBwYWdlO1xuXHRcdHRoaXMuY29tbWFuZERlbGF5ID0gMjA7XG5cdFx0dGhpcy5wZXJzaXN0ZW50RGF0YSA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3Qgb2JqZWN0IGJ5IGl0J3MgbmFtZS4gSWYgYSAqIGlzIHVzZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyBhIFxuXHQgKiB3aWxkY2FyZCBmb3IgdGhlIG9iamVjdCdzIG5hbWUuIElmIGEgPiBpcyB1c2VkLCB0aGVuIHRoZSBuYW1lIHdpbGwgXG5cdCAqIGJlIHRyZWF0ZWQgYXMgYSBDU1Mgc2VsZWN0b3IuXG5cdCAqL1xuXHRwYXJzZVRlc3RPYmplY3QgKG5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHBvczogbnVtYmVyID0gbmFtZS5pbmRleE9mIChcIipcIik7XG5cdFx0bGV0IHdpbGRjYXJkOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UgKC9cXCovLCBcIlwiKTtcblx0XHRcdHdpbGRjYXJkID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0bGV0IHNlbGVjdG9yOiBzdHJpbmcgPSBgW2RhdGEtdGVzdC1vYmplY3QtbmFtZSR7d2lsZGNhcmR9PScke25hbWV9J11gO1xuXHRcdHBvcyA9IG5hbWUuaW5kZXhPZiAoXCI+XCIpO1xuXG5cdFx0aWYgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UgKC9cXD4vLCBcIlwiKTtcblx0XHRcdHNlbGVjdG9yID0gbmFtZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHNlbGVjdG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRhc3luYyB3YWl0IChudW1NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHJldHVybiAoYXdhaXQgbmV3IFByb21pc2UgKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHNldFRpbWVvdXQgKCgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoKTtcblx0XHRcdFx0XHR9LCBudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZS5cblx0ICovXG5cdGFzeW5jIHByaW50IChtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZSAobWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgYSBtZXNzYWdlIGxpbmUuXG5cdCAqL1xuXHRhc3luYyBwcmludGxuIChtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRhd2FpdCB0aGlzLnByaW50IChgJHttZXNzYWdlfVxcbmApO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgdGhpcyBzZXJ2ZXIgb3IgZGVzdHJveSBhbnl0aGluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBIb3RUZXN0RHJpdmVyLlxuXHQgKi9cblx0YWJzdHJhY3QgZGVzdHJveSAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogTmF2aWdhdGUgdG8gYSB1cmwuXG5cdCAqL1xuXHRhYnN0cmFjdCBuYXZpZ2F0ZVRvVXJsICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIEhvdFRlc3RFbGVtZW50IHRvIGxvYWQuXG5cdCAqL1xuXHRhYnN0cmFjdCB3YWl0Rm9yVGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogRmluZCBhIEhvdFRlc3RFbGVtZW50IHRvIHV0aWxpemUuXG5cdCAqL1xuXHRhYnN0cmFjdCBmaW5kVGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogUnVuIGEgSG90VGVzdEVsZW1lbnQgY29tbWFuZC5cblx0ICovXG5cdGFic3RyYWN0IHJ1bkNvbW1hbmQgKHRlc3RFbG06IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBmdW5jTmFtZT86IHN0cmluZywgdmFsdWVTdHI/OiBzdHJpbmcpOiBQcm9taXNlPGFueT47XG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhYnN0cmFjdCBhc3NlcnRFbGVtZW50VmFsdWUgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCB2YWx1ZTogYW55LCBcblx0XHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBIb3RUZXN0RWxlbWVudE9wdGlvbnMpOiBQcm9taXNlPGFueT47XG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhc3luYyBhc3NlcnQgKHZhbHVlOiBhbnksIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0aWYgKCEgKHZhbHVlKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoZXJyb3JNZXNzYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYSBzZXJpZXMgb2YgdGVzdCBlbGVtZW50cy5cblx0ICovXG5cdGFzeW5jIHJ1biAoZXhlY3V0aW9uczogc3RyaW5nW10gfCBzdHJpbmdbXVtdKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBleGVjdXRpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBleGVjdXRpb246IGFueSA9IGV4ZWN1dGlvbnNbaUlkeF07XG5cdFx0XHRsZXQgdGVzdEVsbTogSG90VGVzdEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0bGV0IGZ1bmM6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdGlmICh0eXBlb2YgKGV4ZWN1dGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHRlc3RFbG0gPSB0aGlzLnBhZ2UudGVzdEVsZW1lbnRzW2V4ZWN1dGlvbl07XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUaGlzIGlzIGdvaW5nIHRvIHdyZWNrIHNlbGVjdGluZyB0ZXN0IGVsZW1lbnRzIGJ5IHdpbGRjYXJkcy5cblx0XHRcdFx0aWYgKHRlc3RFbG0gPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0RHJpdmVyOiBVbmFibGUgdG8gZmluZCB0ZXN0IGVsZW1lbnQgJHtleGVjdXRpb259YCk7XG5cblx0XHRcdFx0ZnVuYyA9IHRlc3RFbG0uZnVuYztcblx0XHRcdFx0dmFsdWUgPSB0ZXN0RWxtLnZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXhlY3V0aW9uIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBuYW1lOiBzdHJpbmcgPSBleGVjdXRpb25bMF07XG5cdFx0XHRcdHRlc3RFbG0gPSB0aGlzLnBhZ2UudGVzdEVsZW1lbnRzW25hbWVdO1xuXG5cdFx0XHRcdC8vIFRoaXMgbnVsbCBjYXRjaCBpcyBzcGVjaWZpY2FsbHkgdG8gaGVscCBmaW5kIHdpbGRjYXJkIHRlc3QgZWxlbWVudHMuXG5cdFx0XHRcdGlmICh0ZXN0RWxtID09IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdFRlc3RFbGVtZW50IChuYW1lKTtcblx0XHRcdFx0XHRmdW5jID0gZXhlY3V0aW9uWzFdO1xuXHRcdFx0XHRcdHZhbHVlID0gZXhlY3V0aW9uWzJdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZ1bmMgPSB0ZXN0RWxtLmZ1bmM7XG5cdFx0XHRcdFx0dmFsdWUgPSB0ZXN0RWxtLnZhbHVlO1xuXG5cdFx0XHRcdFx0aWYgKGV4ZWN1dGlvbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdFx0ZnVuYyA9IGV4ZWN1dGlvblsxXTtcblxuXHRcdFx0XHRcdGlmIChleGVjdXRpb24ubGVuZ3RoID4gMilcblx0XHRcdFx0XHRcdHZhbHVlID0gZXhlY3V0aW9uWzJdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRlc3RFbG0uZnVuYyA9IGZ1bmM7XG5cdFx0XHR0ZXN0RWxtLnZhbHVlID0gdmFsdWU7XG5cblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmQgKHRlc3RFbG0pO1xuXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKHRoaXMuY29tbWFuZERlbGF5KTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cbn0iLCIvKipcbiAqIEhvdCB0ZXN0IGVsZW1lbnQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90VGVzdEVsZW1lbnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdCBlbGVtZW50IG11c3QgYmUgdmlzaWJsZSBpbiBcblx0ICogb3JkZXIgdG8gc2VsZWN0IGl0LlxuXHQgKi9cblx0bXVzdEJlVmlzaWJsZT86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBJZiB0aGUgdGVzdCBlbGVtZW50IGlzIG1pc3NpbmcsIGlnbm9yZSB0aGUgZXJyb3IuIFRoaXMgXG5cdCAqIHdpbGwgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbW1lZGlhdGVseSBcblx0ICogd2l0aG91dCBhbnkgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3QgdGVzdCBlbGVtZW50IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RWxlbWVudE9wdGlvbnMgaW1wbGVtZW50cyBJSG90VGVzdEVsZW1lbnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdCBlbGVtZW50IG11c3QgYmUgdmlzaWJsZSBpbiBcblx0ICogb3JkZXIgdG8gc2VsZWN0IGl0LlxuXHQgKi9cblx0bXVzdEJlVmlzaWJsZTogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHRoZSB0ZXN0IGVsZW1lbnQgaXMgbWlzc2luZywgaWdub3JlIHRoZSBlcnJvci4gVGhpcyBcblx0ICogd2lsbCBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IFxuXHQgKiB3aXRob3V0IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93bi5cblx0ICovXG5cdGlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3I6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RUZXN0RWxlbWVudE9wdGlvbnMgPSB7fSlcblx0e1xuXHRcdHRoaXMubXVzdEJlVmlzaWJsZSA9IGNvcHkubXVzdEJlVmlzaWJsZSB8fCB0cnVlO1xuXHRcdHRoaXMuaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciA9IGNvcHkuaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciB8fCBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEEgdGVzdCBlbGVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RUZXN0RWxlbWVudFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBcblx0ICogd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0LlxuXHQgKi9cblx0ZnVuYz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0byB1c2UuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcbn1cblxuLyoqXG4gKiBBIHRlc3QgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFRlc3RFbGVtZW50IGltcGxlbWVudHMgSUhvdFRlc3RFbGVtZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIFxuXHQgKiB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QuXG5cdCAqL1xuXHRmdW5jOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgdG8gdXNlLlxuXHQgKi9cblx0dmFsdWU6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nIHwgSUhvdFRlc3RFbGVtZW50LCBmdW5jOiBzdHJpbmcgPSBcIlwiLCB2YWx1ZTogYW55ID0gbnVsbClcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5hbWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0XHR0aGlzLmZ1bmMgPSBmdW5jO1xuXHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5uYW1lID0gbmFtZS5uYW1lO1xuXHRcdFx0dGhpcy5mdW5jID0gbmFtZS5mdW5jIHx8IGZ1bmM7XG5cdFx0XHR0aGlzLnZhbHVlID0gbmFtZS52YWx1ZSB8fCB2YWx1ZTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVzdCBwYXRoIGZvciBsYXRlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEhvdFRlc3RQYXRoID0gKGRyaXZlcjogSG90VGVzdERyaXZlciwgLi4uYXJnczogYW55KSA9PiBQcm9taXNlPGFueT47XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHRvIHRha2UgaW4gYSBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlLlxuXHQgKi9cblx0ZGVzdGluYXRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBleGVjdXRpbmcgaXQncyBcblx0ICogdGVzdHMgd2hlbiBpdCdzIHRpbWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGRlc3RpbmF0aW9uOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb24gfCBIb3RTaXRlTWFwUGF0aCA9IFwiXCIsIGF1dG9TdGFydDogYm9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRpZiAodHlwZW9mIChkZXN0aW5hdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuXHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBIb3RUZXN0RGVzdGluYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5kZXN0aW5hdGlvbjtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5wYXRoO1xuXHRcdFx0XHR0aGlzLmF1dG9TdGFydCA9IGRlc3RpbmF0aW9uLmF1dG9TdGFydDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBIHBhZ2UgY29udGFpbmluZyBvbmx5IHRlc3QgcmVsYXRlZCBpbmZvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFRlc3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIG1hcC5cblx0ICovXG5cdHRlc3RFbGVtZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdEVsZW1lbnQ7IH07XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBwYXRocyB0byB0ZXN0IG9uIHRoaXMgbWFwLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBNYXBzIHRoZSBwYXRocyB0aGF0IGFyZSB0YWtlbiB0byBjb21wbGV0ZSBhIHRlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0TWFwXG57XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggcGF0aHMgYXJlIHRvIGJlIHRha2VuLiBFYWNoIGRlc3RpbmF0aW9uIGlzIGEgc3RyaW5nIFxuXHQgKiBpbiBhIHR5cGUgLT4gcGF0aCBvcmRlci4gVGhlIHR5cGUgY291bGQgYmUgZWl0aGVyIGEgcGFnZSBvciBhcGkgcm91dGUuIFxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFtcblx0ICogICAgICBcInBhZ2U6c2lnbmluX3BhZ2UgLT4gc2lnbmluX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV91c2VybmFtZV9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfcGFzc3dvcmRfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX25hbWVfcGF0aCAtPiBjaGFuZ2VfYWRkcmVzc19wYXRoXCIsXG5cdCAqIFx0XHRcInBhZ2U6YWNjb3VudF9wYWdlIC0+IHNpZ25vdXRfcGF0aFwiLFxuXHQgKiBcdFx0XCJhcGk6YWNjb3VudF9hcGlfcm91dGUgLT4gc2lnbm91dF9yb3V0ZV9tZXRob2QgLT4gc2lnbm91dF90ZXN0X3BhdGhcIlxuXHQgKiBdXG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhlIGZpcnN0IHN0cmluZyB0byB0aGUgbGVmdCBvZiB0aGUgLT4gd2lsbCBhbHdheXMgYmUgdGhlIHR5cGUsIHN1Y2ggYXMgYSBcblx0ICogcGFnZSBvciBhbiBhcGkgcm91dGUuIEFueSBzdHJpbmdzIHRvIHRoZSByaWdodCBvZiB0aGUgLT4gd2lsbCBiZSBhIHBhdGgsIGV2ZW4gXG5cdCAqIHdoZW4gY2hhaW5pbmcgYWRkdGlvbmFsIC0+J3MuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGFnZXMgdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhZ2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhZ2Vcblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbnM6IHN0cmluZ1tdIHwgSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb247IH0gPSBbXSwgXG5cdFx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlIH0gPSB7fSwgZGVzdGluYXRpb25PcmRlcjogc3RyaW5nW10gPSBbXSlcblx0e1xuXHRcdC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgYW55IHN0cmluZ3MgaW50byBIb3RUZXN0RGVzdGluYXRpb25zLlxuXHRcdGlmIChkZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGRlc3RpbmF0aW9ucylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNba2V5XTtcblxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uc1trZXldID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0aW5hdGlvbk9yZGVyID0gZGVzdGluYXRpb25PcmRlcjtcblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIFRlc3RDYXNlT2JqZWN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24sIEhvdFRlc3RNYXAsIEhvdFRlc3RQYWdlLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcblxuLyoqXG4gKiBUaGUgdGVzdCBzdG9wIHRoYXQgaXMgZXhlY3V0ZWQgYXMgZWl0aGVyIGEgZGVzdGluYXRpb24gb3IgXG4gKiBhIHBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90VGVzdFN0b3Bcbntcblx0LyoqXG5cdCAqIEEgY29tbWFuZCB0byBleGVjdXRlLiBDYW4gYmU6XG5cdCAqICogcHJpbnQoeClcblx0ICogICAqIFByaW50IGEgbWVzc2FnZSB0byB0aGUgc2VydmVyJ3MgY29uc29sZS5cblx0ICogKiBwcmludGxuKHgpXG5cdCAqICAgKiBQcmludCBhIG1lc3NhZ2Ugd2l0aCBhIG5ldyBsaW5lIHRvIHRoZSBzZXJ2ZXIncyBjb25zb2xlLlxuXHQgKiAqIHVybCh4KVxuXHQgKiAgICogT3BlbiBhIHVybC4gTXVzdCBiZSBhbiBhYnNvbHV0ZSB1cmwuXG5cdCAqICogd2FpdEZvclRlc3RlckFQSURhdGFcblx0ICogICAqIFRoaXMgd2lsbCB3YWl0IGZvciB0aGUgdGVzdGVyIEFQSSB0byByZWNlaXZlIGRhdGEuXG5cdCAqICogd2FpdCh4KVxuXHQgKiAgICogVGhpcyB3aWxsIHdhaXQgZm9yIHggbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cblx0ICogKiB3YWl0Rm9yVGVzdE9iamVjdCh4KVxuXHQgKiAgICogVGhpcyB3aWxsIHdhaXQgZm9yIGEgdGVzdCBvYmplY3QgdG8gYmUgbG9hZGVkLlxuXHQgKi9cblx0Y21kOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzdGluYXRpb24gdG8gZXhlY3V0ZS5cblx0ICovXG5cdGRlc3Q6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIGZvciBhIHRlc3QgdG8gdGFrZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3REZXN0aW5hdGlvblxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIG1hcC5cblx0ICovXG5cdG1hcE5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYWdlIHRvIHN0YXJ0IGF0LlxuXHQgKi9cblx0cGFnZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIEFQSSByb3V0ZSB0byBzdGFydCB1c2luZy5cblx0ICovXG5cdGFwaTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGhzIHRvIHRha2Ugb24gdGhlIHBhZ2UuXG5cdCAqL1xuXHRwYXRoczogSG90VGVzdFN0b3BbXTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0ZXN0cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdFRlc3Rlclxue1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBuYW1lLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRoYXQgd2lsbCBjb25zdHJ1Y3QgZnV0dXJlIHVybHMuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBwcm9jZXNzb3IuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBtYXBzIHRvIHRlc3QuXG5cdCAqL1xuXHR0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfTtcblx0LyoqXG5cdCAqIFRoZSBkcml2ZXIgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cy5cblx0ICovXG5cdGRyaXZlcjogSG90VGVzdERyaXZlcjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBsb2FkaW5nP1xuXHQgKi9cblx0ZmluaXNoZWRMb2FkaW5nOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgc2V0dGluZyB1cD9cblx0ICovXG5cdGhhc0JlZW5EZXN0cm95ZWQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSwgbmFtZTogc3RyaW5nLCBiYXNlVXJsOiBzdHJpbmcsIFxuXHRcdGRyaXZlcjogSG90VGVzdERyaXZlciwgdGVzdE1hcHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RNYXA7IH0gPSB7fSlcblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0XHR0aGlzLnRlc3RNYXBzID0gdGVzdE1hcHM7XG5cdFx0dGhpcy5kcml2ZXIgPSBkcml2ZXI7XG5cdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gc2V0dGluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YWJzdHJhY3Qgc2V0dXAgKGlzV2ViUm91dGU6IGJvb2xlYW4sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGRlc3Ryb3lpbmcgdXAgdGhlIHRlc3Rlci5cblx0ICovXG5cdGFic3RyYWN0IGRlc3Ryb3kgKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGVzdHMgYXJlIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyB0cnVlLCBpdCB3aWxsIFxuXHQgKiBjb250aW51ZSBhbmQgZXhlY3V0ZSBhbGwgdGVzdCBwYXRocy4gSWYgdGhpcyByZXR1cm5zIGl0IHdpbGwgXG5cdCAqIHNraXAgYWxsIHRlc3QgcGF0aHMgYW5kIGV4ZWN1dGUgb25UZXN0RW5kIGluc3RlYWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RTdGFydD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgdXJsOiBzdHJpbmcsIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYW4gQVBJIHRlc3QgcGF0aCBoYXMgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIGZhbHNlLCBcblx0ICogdGhlIHRlc3RQYXRoIHdpbGwgbm90IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIGFmdGVyd2FyZHMuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RBUElQYXRoU3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIEFQSSB0ZXN0IHBhdGggaGFzIGVuZGVkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0QVBJUGF0aEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgcmVzdWx0OiBhbnksIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHBhZ2UgdGVzdHMgYXJlIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHRlc3RQYXRoIHdpbGwgbm90IGJlIFxuXHQgKiBpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlcndhcmRzLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0UGFnZVBhdGhTdGFydD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgcGFnZTogSG90VGVzdFBhZ2UsIFxuXHRcdHN0b3A6IEhvdFRlc3RTdG9wLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIHBhZ2UgdGVzdCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgdGVzdFBhdGg6IEhvdFRlc3RQYXRoLCBcblx0XHRyZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYSBjb21tYW5kIGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0YXN5bmMgb25Db21tYW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIFxuXHRcdGNtZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY21kRnVuYzogKChjbWRBcmdzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPikpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0ZXN0cyBhcmUgZmluaXNoZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoaXMgdGVzdGVyIGhhcyBiZWVuIGV4ZWN1dGVkIGZyb20gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIG9uRXhlY3V0ZT8gKCk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoaXMgdGVzdGVyIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGFsbCBkYXRhIGZyb20gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIG9uRmluaXNoZWRMb2FkaW5nPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogV2FpdHMgZm9yIHRoZSBBUEkgdG8gZmluaXNoIGxvYWRpbmcgYWxsIGRhdGEuXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yRGF0YSAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0d2hpbGUgKHRoaXMuZmluaXNoZWRMb2FkaW5nID09PSBmYWxzZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAoMTApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgcGFnZS5cblx0ICovXG5cdGdldFRlc3RQYWdlIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBIb3RUZXN0UGFnZVxuXHR7XG5cdFx0bGV0IHBhZ2UgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXG5cdFx0cmV0dXJuIChwYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IHBhdGguXG5cdCAqL1xuXHRnZXRUZXN0UGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYXRoTmFtZTogc3RyaW5nKTogSG90VGVzdFBhdGhcblx0e1xuXHRcdGxldCBwYWdlID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXS5wYWdlc1tkZXN0aW5hdGlvbi5wYWdlXTtcblxuXHRcdHJldHVybiAocGFnZS50ZXN0UGF0aHNbcGF0aE5hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBkZXN0aW5hdGlvbiBKU09OIG9iamVjdCB0byB1c2UuXG5cdCAqL1xuXHRzdGF0aWMgaW50ZXJwcmV0RGVzdGluYXRpb24gKG1hcE5hbWU6IHN0cmluZywgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbik6IEhvdERlc3RpbmF0aW9uXG5cdHtcblx0XHRsZXQgZGVzdGluYXRpb246IHN0cmluZyA9IHRlc3REZXN0LmRlc3RpbmF0aW9uO1xuXHRcdGxldCBuZXdEZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSB7XG5cdFx0XHRcdG1hcE5hbWU6IG1hcE5hbWUsXG5cdFx0XHRcdHBhZ2U6IFwiXCIsXG5cdFx0XHRcdGFwaTogXCJcIixcblx0XHRcdFx0cGF0aHM6IFtdXG5cdFx0XHR9O1xuXHRcdGxldCBzdHJzOiBzdHJpbmdbXSA9IGRlc3RpbmF0aW9uLnNwbGl0ICgvXFwtXFw+L2cpO1xuXHRcdGxldCB0eXBlOiBzdHJpbmcgPSBzdHJzWzBdO1xuXG5cdFx0aWYgKHR5cGUubGVuZ3RoIDwgMilcblx0XHRcdHJldHVybiAobnVsbCk7XG5cblx0XHRpZiAoKHR5cGVbMF0gPT09IFwiL1wiKSAmJiAodHlwZVsxXSA9PT0gXCIvXCIpKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdGxldCBnZXRUeXBlOiAodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpID0+IHN0cmluZyA9IFxuXHRcdFx0KHR5cGVTdHI6IHN0cmluZywgdHlwZURlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwb3M6IG51bWJlciA9IHR5cGVTdHIuaW5kZXhPZiAodHlwZURlbGltaXRlcik7XG5cdFx0XHRcdGxldCB0eXBlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cdFx0XG5cdFx0XHRcdGlmIChwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVTdHIuc3Vic3RyIChwb3MgKyB0eXBlRGVsaW1pdGVyLmxlbmd0aCk7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVZhbHVlLnRyaW0gKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHR5cGVWYWx1ZSk7XG5cdFx0XHR9O1xuXG5cdFx0bmV3RGVzdGluYXRpb24ucGFnZSA9IGdldFR5cGUgKHR5cGUsIFwicGFnZTpcIik7XG5cdFx0bmV3RGVzdGluYXRpb24uYXBpID0gZ2V0VHlwZSAodHlwZSwgXCJhcGk6XCIpO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDE7IGlJZHggPCBzdHJzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBuZXdQYXRoU3RyOiBzdHJpbmcgPSBzdHJzW2lJZHhdO1xuXHRcdFx0bGV0IG5ld1BhdGg6IEhvdFRlc3RTdG9wID0ge1xuXHRcdFx0XHRcdGNtZDogXCJcIixcblx0XHRcdFx0XHRkZXN0OiBcIlwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblxuXHRcdFx0bmV3UGF0aFN0ciA9IG5ld1BhdGhTdHIudHJpbSAoKTtcblx0XHRcdG5ld1BhdGguZGVzdCA9IGdldFR5cGUgKG5ld1BhdGhTdHIsIFwiZGVzdDpcIik7XG5cdFx0XHRuZXdQYXRoLmNtZCA9IGdldFR5cGUgKG5ld1BhdGhTdHIsIFwiY21kOlwiKTtcblx0XHRcdG5ld1BhdGgucGF0aCA9IGdldFR5cGUgKG5ld1BhdGhTdHIsIFwicGF0aDpcIik7XG5cblx0XHRcdGlmICgobmV3UGF0aC5kZXN0ID09IFwiXCIpICYmIChuZXdQYXRoLmNtZCA9PSBcIlwiKSAmJiAobmV3UGF0aC5wYXRoID09IFwiXCIpKVxuXHRcdFx0XHRuZXdQYXRoLnBhdGggPSBuZXdQYXRoU3RyO1xuXG5cdFx0XHRuZXdEZXN0aW5hdGlvbi5wYXRocy5wdXNoIChuZXdQYXRoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG5ld0Rlc3RpbmF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFuIEFQSSdzIHRlc3QgcGF0aC5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0QVBJUGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCBza2lwRXZlbnRDYWxsczogYm9vbGVhbiA9IGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgcnVuVGVzdFBhdGg6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0aWYgKG1ldGhvZCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVHJ5aW5nIHRvIGFjY2VzcyBudWxsIG1ldGhvZCBvbiBkZXN0aW5hdGlvbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfS5gKTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RBUElQYXRoU3RhcnQgKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChydW5UZXN0UGF0aCA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRsZXQgdGVzdENhc2VPYmplY3Q6IFRlc3RDYXNlT2JqZWN0ID0gbWV0aG9kLnRlc3RDYXNlc1t0ZXN0TmFtZV07XG5cblx0XHRcdGlmICh0ZXN0Q2FzZU9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgY2FzZSBvYmplY3QgJHt0ZXN0TmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRlc3RDYXNlT2JqZWN0LmZ1bmMgKHRoaXMuZHJpdmVyKTtcblx0XHR9XG5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RBUElQYXRoRW5kIChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgcmVzdWx0LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMgaW4gYW4gQVBJIHJvdXRlLlxuXHQgKiBcblx0ICogQGZpeG1lIFRoaXMgbmVlZHMgYSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0QVBJUGF0aHMgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGlmICh0aGlzLnByb2Nlc3Nvci5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQXNzb2NpYXRlZCBwcm9jZXNzb3IgZG9lcyBub3QgaGF2ZSBhbiBBUEkhYCk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5wcm9jZXNzb3IuYXBpLnJvdXRlc1tkZXN0aW5hdGlvbi5hcGldO1xuXG5cdFx0aWYgKHJvdXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBkb2VzIG5vdCBoYXZlIHJvdXRlICR7ZGVzdGluYXRpb24uYXBpfSFgKTtcblxuXHRcdC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBhdGggaW4gdGhlIGRlc3RpbmF0aW9uIHVudGlsIGNvbXBsZXRlLlxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZGVzdGluYXRpb24ucGF0aHMubGVuZ3RoOyBpSWR4ICs9IDIpXG5cdFx0e1xuXHRcdFx0bGV0IHN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeF07XG5cdFx0XHRsZXQgcGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gcm91dGUuZ2V0TWV0aG9kIChwYXRoTmFtZSk7XG5cdFx0XHRsZXQgbmV4dFN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeCArIDFdO1xuXHRcdFx0bGV0IHRlc3ROYW1lOiBzdHJpbmcgPSBuZXh0U3RvcC5wYXRoO1xuXG5cdFx0XHRpZiAobWV0aG9kID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIG1ldGhvZCByZWxhdGVkIHRvIHBhdGggJHtwYXRoTmFtZX0gaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHRlc3QgcGFnZSBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0c2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0bGV0IHBhZ2U6IEhvdFRlc3RQYWdlID0gdGVzdE1hcC5wYWdlc1tkZXN0aW5hdGlvbi5wYWdlXTtcblxuXHRcdGlmIChwYWdlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFBhZ2UgJHtkZXN0aW5hdGlvbi5wYWdlfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRoaXMuZHJpdmVyLnBhZ2UgPSBwYWdlO1xuXG5cdFx0bGV0IHRlc3RQYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdGxldCB0ZXN0UGF0aDogSG90VGVzdFBhdGggPSBwYWdlLnRlc3RQYXRoc1t0ZXN0UGF0aE5hbWVdO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgcGFnZSwgc3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RQYXRoID09IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogVGVzdCBwYXRoICR7dGVzdFBhdGhOYW1lfSBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24hYCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRlc3RQYXRoICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aEVuZCAhPSBudWxsKVxuXHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdFBhZ2VQYXRoRW5kIChkZXN0aW5hdGlvbiwgdGVzdFBhdGgsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY29tbWFuZC5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVDb21tYW5kIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBzdG9wOiBIb3RUZXN0U3RvcCwgY21kOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHQvKipcblx0XHQgKiBDaGVjayBpZiB0aGUgaW5wdXQgY29tbWFuZCBtYXRjaGVzLlxuXHRcdCAqL1xuXHRcdGxldCBoYXNDbWQ6IChpbnB1dDogc3RyaW5nLCBjbWQ6IHN0cmluZywgaGFzQXJndW1lbnRzOiBib29sZWFuKSA9PiBib29sZWFuID0gXG5cdFx0XHQoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbik6IGJvb2xlYW4gPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChzdG9wLmNtZCA9PT0gY21kKVxuXHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cblx0XHRcdFx0Y29uc3QgcG9zOiBudW1iZXIgPSBzdG9wLmNtZC5pbmRleE9mIChcIihcIik7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUncyBwYXJlbnRoZXNpcywgZ2V0IHRoZSBpbmNvbWluZyBjb21tYW5kLlxuXHRcdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXRDbWQ6IHN0cmluZyA9IHN0b3AuY21kLnN1YnN0ciAoMCwgcG9zKTtcblxuXHRcdFx0XHRcdGlmIChpbnB1dENtZCA9PT0gY21kKVxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHRcdH07XG5cdFx0LyoqXG5cdFx0ICogR2V0IHRoZSBhcmd1bWVudHMgaW4gYSBjb21tYW5kLiBUaGlzIHdpbGwgb25seSByZXR1cm4gYSBcblx0XHQgKiBzaW5nbGUgYXJndW1lbnQgZm9yIG5vdy5cblx0XHQgKiBcblx0XHQgKiBAZml4bWUgQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGFyZ3VtZW50cy5cblx0XHQgKi9cblx0XHRsZXQgZ2V0Q21kQXJnczogKGlucHV0OiBzdHJpbmcpID0+IHN0cmluZ1tdID0gXG5cdFx0XHQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZ1tdID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoICgvKD89XFwoKSguKj8pKD89XFwpKS9nKTtcblxuXHRcdFx0XHRpZiAobWF0Y2hlcyAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlbXBNYXRjaCA9IG1hdGNoZXNbMF07XG5cblx0XHRcdFx0XHQvLyBBIGxpdHRsZSBoYWNrLCBzaW5jZSBJIHN1Y2sgYXQgUmVnZXggOihcblx0XHRcdFx0XHR0ZW1wTWF0Y2ggPSB0ZW1wTWF0Y2guc3Vic3RyICgyLCB0ZW1wTWF0Y2gubGVuZ3RoKTtcblxuXHRcdFx0XHRcdHJlc3VsdHMucHVzaCAodGVtcE1hdGNoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRzLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBDb21tYW5kICR7aW5wdXR9IHJlcXVpcmVzIGFyZ3VtZW50cywgYnV0IG5vbmUgd2VyZSBzdXBwbGllZC5gKTtcblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHRcdFx0fTtcblxuXHRcdGxldCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSA9IG51bGw7XG5cdFx0bGV0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ3YWl0Rm9yVGVzdGVyQVBJRGF0YVwiLCBmYWxzZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuZmluaXNoZWRMb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy53YWl0Rm9yRGF0YSAoKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ3YWl0XCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgbnVtTWlsbGlzZWNvbmRzOiBudW1iZXIgPSBwYXJzZUludCAoY21kQXJnc1swXSk7XG5cblx0XHRcdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwidXJsXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5uYXZpZ2F0ZVRvVXJsIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwicHJpbnRcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBpbnB1dDogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZHJpdmVyLnByaW50IChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwicHJpbnRsblwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIucHJpbnRsbiAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRGb3JUZXN0T2JqZWN0XCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgdGVzdE9iamVjdDogc3RyaW5nID0gSlNPTi5wYXJzZSAoY21kQXJnc1swXSk7XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKHRlc3RPYmplY3QpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChjbWRGdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IENvbW1hbmQgJHtzdG9wLmNtZH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRhd2FpdCB0aGlzLm9uQ29tbWFuZCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIGNtZCwgYXJncywgY21kRnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgdGVzdCBwYXRocyBpbiBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXTtcblxuXHRcdC8vLyBAZml4bWUgRm9yIHNvbWUgcmVhc29uIHRoZSBlcnJvcnMgYmVpbmcgdGhyb3duIGhlcmUgYXJlIG5vdCBiZWluZyB0aHJvd24uXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHQvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXRoIGluIHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBjb21wbGV0ZS5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9uLnBhdGhzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBzdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHhdO1xuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblx0XHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cdFxuXHRcdFx0aWYgKHBhZ2UgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdGlmIChzdG9wLmRlc3QgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0TWFwLmRlc3RpbmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2hlbiB1c2luZyB0eXBlICdkZXN0JyBpbiBhIGRlc3RpbmF0aW9uIHN0cmluZywgYWxsIGRlc3RpbmF0aW9ucyBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBtdXN0IGJlIG5hbWVkLmApO1xuXG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gdGVzdE1hcC5kZXN0aW5hdGlvbnNbc3RvcC5kZXN0XTtcblx0XHRcdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IEhvdFRlc3Rlci5pbnRlcnByZXREZXN0aW5hdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uLm1hcE5hbWUsIHRlc3REZXN0KTtcblxuXHRcdFx0XHRpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbClcblx0XHRcdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChuZXdEZXN0aW5hdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdG9wLmNtZCAhPT0gXCJcIilcblx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIHN0b3AuY21kKTtcblxuXHRcdFx0aWYgKHN0b3AucGF0aCAhPT0gXCJcIilcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbiwgc3RvcCwgZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlIChtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1ttYXBOYW1lXTtcblxuXHRcdGlmIChtYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7bWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHQvLyBQcm9jZXNzIHJvdXRlcyB0ZXN0aW5nIGZpcnN0LlxuXHRcdGxldCByb3V0ZUtleTogc3RyaW5nID0gdGhpcy5wcm9jZXNzb3IuZ2V0Um91dGVLZXlGcm9tTmFtZSAobWFwTmFtZSk7XG5cdFx0bGV0IHVybDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChyb3V0ZUtleSAhPT0gXCJcIilcblx0XHRcdHVybCA9IGAke3RoaXMuYmFzZVVybH0ke3JvdXRlS2V5fWA7XG5cblx0XHRsZXQgZXhlY3V0ZURlc3RpbmF0aW9uOiAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4gPSBcblx0XHRcdGFzeW5jICh0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbktleTogc3RyaW5nID0gXCJcIikgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3REZXN0LmF1dG9TdGFydCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGxldCBkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKG1hcE5hbWUsIHRlc3REZXN0KTtcblx0XHRcdFx0bGV0IGlzV2ViUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRcdFx0bGV0IHJ1blRlc3RQYXRoczogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0aXNXZWJSb3V0ZSA9IHRydWU7XG5cdFxuXHRcdFx0XHRpZiAodGhpcy5zZXR1cCAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGFzQmVlblNldHVwID09PSBmYWxzZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnNldHVwIChpc1dlYlJvdXRlLCB1cmwsIGRlc3RpbmF0aW9uS2V5KTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcblx0XHRcdFx0aWYgKHRoaXMub25UZXN0U3RhcnQgIT0gbnVsbClcblx0XHRcdFx0XHRydW5UZXN0UGF0aHMgPSBhd2FpdCB0aGlzLm9uVGVzdFN0YXJ0IChkZXN0aW5hdGlvbiwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFxuXHRcdFx0XHRpZiAocnVuVGVzdFBhdGhzID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFxuXHRcdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5hcGkgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0QVBJUGF0aHMgKGRlc3RpbmF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRpZiAodGhpcy5vblRlc3RFbmQgIT0gbnVsbClcblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEVuZCAoZGVzdGluYXRpb24pO1xuXHRcblx0XHRcdFx0aWYgKHRoaXMuZGVzdHJveSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZXN0cm95ICgpO1xuXHRcdFx0XHRcdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIG1hcCBkZXN0aW5hdGlvbnMgYXJlIGluIGFuIGFycmF5LCBqdXN0IGV4ZWN1dGUgdGhvc2UgaW4gb3JkZXIuXG5cdFx0aWYgKG1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcC5kZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tpSWR4XTtcblxuXHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBvcmRlciwgdXNlIHRoYXQuXG5cdFx0XHRpZiAobWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGhhc0V4ZWN1dGVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRcdFx0XHQvLyBHbyB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBvcmRlciBhbmQgZXhlY3V0ZSBlYWNoIG9uZS5cblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25PcmRlci5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvcmRlcktleTogc3RyaW5nID0gbWFwLmRlc3RpbmF0aW9uT3JkZXJbaUlkeF07XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW29yZGVyS2V5XTtcblxuXHRcdFx0XHRcdGlmICh0ZXN0RGVzdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEZXN0aW5hdGlvbiAke29yZGVyS2V5fSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdGhhc0V4ZWN1dGVkS2V5cy5wdXNoIChvcmRlcktleSk7XG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwgb3JkZXJLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCB5ZXQuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4ZWN1dGVEZXN0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaGFzRXhlY3V0ZWRLZXlzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBleGVjdXRlZEtleTogc3RyaW5nID0gaGFzRXhlY3V0ZWRLZXlzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXhlY3V0ZWRLZXkgPT09IGtleSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZXhlY3V0ZURlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0ZURlc3QgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGRlc3RpbmF0aW9ucyBpbiBhbnkgb3JkZXIuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRW5kIG9mIHJvdXRlcyB0ZXN0aW5nXG5cblx0XHQvLyBTdGFydCBvZiBBUEkgdGVzdGluZ1xuXG5cdH1cbn0iLCJpbXBvcnQgeyBFdmVudEV4ZWN1dGlvblR5cGUsIEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoLCBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhUVFBNZXRob2QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuXG5leHBvcnQgY2xhc3MgSG90VGVzdGVyQVBJIGV4dGVuZHMgSG90QVBJXG57XG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCA9IG51bGwsIGRiOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIoYmFzZVVybCwgY29ubmVjdGlvbiwgZGIpO1xuXG5cdFx0dGhpcy5leGVjdXRlRXZlbnRzVXNpbmcgPSBFdmVudEV4ZWN1dGlvblR5cGUuSG90QVBJO1xuXG5cdFx0bGV0IHJvdXRlOiBIb3RSb3V0ZSA9IG5ldyBIb3RSb3V0ZSAoY29ubmVjdGlvbiwgXCJ0ZXN0ZXJcIik7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcInBhZ2VMb2FkZWRcIiwgXG5cdFx0XHRcdFwib25TZXJ2ZXJFeGVjdXRlXCI6IHRoaXMucGFnZUxvYWRlZCxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcdFwidGVzdGVyTmFtZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwicGFnZU5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHBhZ2UgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJ0ZXN0RWxlbWVudHNcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcImFycmF5XCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdCBlbGVtZW50cyBvbiB0aGUgcGFnZS5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwidGVzdFBhdGhzXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJhcnJheVwiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3QgcGF0aHMgb24gdGhlIHBhZ2UuXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcInJldHVybnNcIjogXCJSZXR1cm5zIHRydWUgYXMgYW4gYWNrbm93bGVkZ2VtZW50LlwiXG5cdFx0XHR9KTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKHtcblx0XHRcdFx0XCJuYW1lXCI6IFwiZXhlY3V0ZVRlc3RzXCIsXG5cdFx0XHRcdFwib25TZXJ2ZXJFeGVjdXRlXCI6IHRoaXMuZXhlY3V0ZVRlc3RzLFxuXHRcdFx0XHRcInBhcmFtZXRlcnNcIjoge1xuXHRcdFx0XHRcdFwidGVzdGVyTmFtZVwiOiB7XG5cdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3RlciBtYXAgdG8gZXhlY3V0ZS5cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIHdoZW4gdGVzdHMgYXJlIGNvbXBsZXRlLlwiXG5cdFx0XHR9KTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKHtcblx0XHRcdFx0XCJuYW1lXCI6IFwiaGVhcnRiZWF0XCIsXG5cdFx0XHRcdFwidHlwZVwiOiBIVFRQTWV0aG9kLkdFVCxcblx0XHRcdFx0XCJvblNlcnZlckV4ZWN1dGVcIjogdGhpcy5oZWFydGJlYXQsXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSBhcyBhbiBhY2tub3dsZWRnZW1lbnQuXCJcblx0XHRcdH0pO1xuXHRcdHRoaXMuYWRkUm91dGUgKHJvdXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGluIGRldmVsb3BtZW50IG1vZGUuXG5cdCAqL1xuXHRhc3luYyBwYWdlTG9hZGVkIChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0ZXJNYXA6IHN0cmluZztcblx0XHRcdFx0cGFnZU5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiBhbnk7XG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGFueTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IGpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdLFxuXHRcdFx0XHR0ZXN0ZXJNYXA6IGpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl0sXG5cdFx0XHRcdHBhZ2VOYW1lOiBqc29uT2JqW1wicGFnZU5hbWVcIl0sXG5cdFx0XHRcdHRlc3RFbGVtZW50czoganNvbk9ialtcInRlc3RFbGVtZW50c1wiXSxcblx0XHRcdFx0dGVzdFBhdGhzU3RyczoganNvbk9ialtcInRlc3RQYXRoc1wiXVxuXHRcdFx0fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmopXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHRlc3RPYmo6IGFueSA9IHRlc3Rlck9ialtrZXldO1xuXHRcdFx0bGV0IHRocm93RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRlc3RPYmogPT0gbnVsbClcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cblx0XHRcdGlmICgodGVzdGVyT2JqLnRlc3Rlck5hbWUgPT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdGVyTWFwID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0RWxlbWVudHMgPT09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMgPT09IFwiXCIpKVxuXHRcdFx0e1xuXHRcdFx0XHR0aHJvd0Vycm9yID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRocm93RXJyb3IgPT09IHRydWUpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogT2JqZWN0ICR7a2V5fSB3YXMgbm90IHBhc3NlZC5gKTtcblx0XHR9XG5cblx0XHR0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RFbGVtZW50cyk7XG5cdFx0dGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMgPSBKU09OLnBhcnNlICh0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycyk7XG5cblx0XHRsZXQgdGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzKVxuXHRcdHtcblx0XHRcdGxldCB0ZXN0UGF0aDogKGRyaXZlcjogSG90VGVzdERyaXZlciwgLi4uYXJnczogYW55KSA9PiBQcm9taXNlPGFueT4gPSBcblx0XHRcdFx0ZXZhbCAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnNba2V5XSk7XG5cblx0XHRcdHRlc3RQYXRoc1trZXldID0gdGVzdFBhdGg7XG5cdFx0fVxuXG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy5jb25uZWN0aW9uLnByb2Nlc3Nvci50ZXN0ZXJzW3Rlc3Rlck9iai50ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogVGVzdGVyICR7dGVzdGVyT2JqLnRlc3Rlck1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRlc3Rlci50ZXN0TWFwc1t0ZXN0ZXJPYmoudGVzdGVyTWFwXTtcblxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciBtYXAgJHt0ZXN0ZXJPYmoudGVzdGVyTWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXSA9IHtcblx0XHRcdFx0XCJ0ZXN0RWxlbWVudHNcIjoge30sXG5cdFx0XHRcdFwidGVzdFBhdGhzXCI6IHt9XG5cdFx0XHR9O1xuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXS50ZXN0RWxlbWVudHMgPSB0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzO1xuXHRcdHRlc3RNYXAucGFnZXNbdGVzdGVyT2JqLnBhZ2VOYW1lXS50ZXN0UGF0aHMgPSB0ZXN0UGF0aHM7XG5cblx0XHR0ZXN0ZXIuZmluaXNoZWRMb2FkaW5nID0gdHJ1ZTtcblxuXHRcdGlmICh0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgIT0gbnVsbClcblx0XHRcdGF3YWl0IHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAoKTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMgZm9yIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0ganNvbk9ialtcInRlc3Rlck5hbWVcIl07XG5cdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0ganNvbk9ialtcInRlc3Rlck1hcFwiXTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PSBudWxsKSB8fCAodGVzdGVyTWFwID09IG51bGwpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRlc3RlckFQSTogTm90IGFsbCByZXF1aXJlZCBqc29uIG9iamVjdHMgd2VyZSBwYXNzZWQuXCIpO1xuXG5cdFx0aWYgKCh0ZXN0ZXJOYW1lID09PSBcIlwiKSB8fCAodGVzdGVyTWFwID09PSBcIlwiKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGxldCBzZXJ2ZXI6IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuY29ubmVjdGlvbik7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHNlcnZlci5leGVjdXRlVGVzdHMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRhd2FpdCBzZXJ2ZXIuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCB0ZXN0ZXJNYXApO1xuXHRcdH1cblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVzcG9uZHMgd2l0aCB0cnVlIHRvIGhlYXJ0YmVhdCByZXF1ZXN0cy5cblx0ICovXG5cdGFzeW5jIGhlYXJ0YmVhdCAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBJSG90U3RhcSwgXG5cdEhvdFNpdGUsIEhvdFNpdGVSb3V0ZSwgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3QsIERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENvbXBvbmVudCwgSUhvdENvbXBvbmVudCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdExvZywgSG90TG9nTGV2ZWwgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5cbi8vIFNlcnZlciBzdHVmZlxuaW1wb3J0IHsgSG90QVBJLCBFdmVudEV4ZWN1dGlvblR5cGUsIEFQSXRvTG9hZCB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIEhUVFBNZXRob2QsIFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiwgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90U2VydmVyLCBIb3RTZXJ2ZXJUeXBlIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcblxuLy8gVGVzdGluZyBzdHVmZlxuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IElIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50T3B0aW9ucywgSUhvdFRlc3RFbGVtZW50T3B0aW9ucyB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXIsIEhvdFRlc3RTdG9wLCBIb3REZXN0aW5hdGlvbiB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyQVBJIH0gZnJvbSBcIi4vSG90VGVzdGVyQVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0RGVzdGluYXRpb24sIEhvdFRlc3RQYXRoLCBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcblxuSG90U3RhcS5pc1dlYiA9IHRydWU7XG5cbi8vIENhbid0IGV4cG9ydCBpbnRlcmZhY2VzIGZyb20gaGVyZSA6KFxuXG5tb2R1bGUuZXhwb3J0c1tcIkhvdFN0YXFcIl0gPSBIb3RTdGFxO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RcIl0gPSBIb3Q7XG5tb2R1bGUuZXhwb3J0c1tcIkRldmVsb3Blck1vZGVcIl0gPSBEZXZlbG9wZXJNb2RlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RDb21wb25lbnRcIl0gPSBIb3RDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdEFQSVwiXSA9IEhvdEFQSTtcbm1vZHVsZS5leHBvcnRzW1wiRXZlbnRFeGVjdXRpb25UeXBlXCJdID0gRXZlbnRFeGVjdXRpb25UeXBlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RGaWxlXCJdID0gSG90RmlsZTtcbm1vZHVsZS5leHBvcnRzW1wiSG90TG9nXCJdID0gSG90TG9nO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RMb2dMZXZlbFwiXSA9IEhvdExvZ0xldmVsO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RQYWdlXCJdID0gSG90UGFnZTtcbm1vZHVsZS5leHBvcnRzW1wiSG90Um91dGVcIl0gPSBIb3RSb3V0ZTtcbm1vZHVsZS5leHBvcnRzW1wiSG90Um91dGVNZXRob2RcIl0gPSBIb3RSb3V0ZU1ldGhvZDtcbm1vZHVsZS5leHBvcnRzW1wiSFRUUE1ldGhvZFwiXSA9IEhUVFBNZXRob2Q7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFNlcnZlclwiXSA9IEhvdFNlcnZlcjtcbm1vZHVsZS5leHBvcnRzW1wiSG90U2VydmVyVHlwZVwiXSA9IEhvdFNlcnZlclR5cGU7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdENsaWVudFwiXSA9IEhvdENsaWVudDtcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdGVyXCJdID0gSG90VGVzdGVyO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0ZXJBUElcIl0gPSBIb3RUZXN0ZXJBUEk7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3RNYXBcIl0gPSBIb3RUZXN0TWFwO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0RGVzdGluYXRpb25cIl0gPSBIb3RUZXN0RGVzdGluYXRpb247XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3RFbGVtZW50XCJdID0gSG90VGVzdEVsZW1lbnQ7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3RFbGVtZW50T3B0aW9uc1wiXSA9IEhvdFRlc3RFbGVtZW50T3B0aW9ucztcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdERyaXZlclwiXSA9IEhvdFRlc3REcml2ZXI7IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSB1c2VkICdtb2R1bGUnIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTkpO1xuIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJzZWxmIiwiRm9ybURhdGEiLCJ3aW5kb3ciLCJhc3NpZ24iLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiaW5pdCIsImNvbnZlcnRlciIsImRlZmF1bHRBdHRyaWJ1dGVzIiwic2V0IiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwiZG9jdW1lbnQiLCJleHBpcmVzIiwiRGF0ZSIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInN0cmluZ2lmaWVkQXR0cmlidXRlcyIsImF0dHJpYnV0ZU5hbWUiLCJzcGxpdCIsImNvb2tpZSIsIndyaXRlIiwiT2JqZWN0IiwiY3JlYXRlIiwiZ2V0IiwiY29va2llcyIsImphciIsInBhcnRzIiwic2xpY2UiLCJqb2luIiwiZm91bmRLZXkiLCJyZWFkIiwiZSIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwidGhpcyIsIndpdGhDb252ZXJ0ZXIiLCJmcmVlemUiLCJwYXRoIiwiZmFjdG9yeSIsImdsb2JhbCIsIkVycm9yIiwiZ2V0R2xvYmFsIiwiZmV0Y2giLCJiaW5kIiwiSGVhZGVycyIsIlJlcXVlc3QiLCJSZXNwb25zZSIsIkRldmVsb3Blck1vZGUiLCJIb3QiLCJzdGF0aWMiLCJmaWxlIiwiYXJncyIsIkhvdFN0YXEiLCJpc1dlYiIsImxvd2VyRmlsZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImVjaG8iLCJnZXRGaWxlIiwicmVzIiwiaHR0cFJlcXVlc3QiLCJvdXRwdXQiLCJ0ZXh0IiwiZXZhbCIsImFwcGx5IiwiZmlsZU5hbWUiLCJ0ZW1wRmlsZSIsIkN1cnJlbnRQYWdlIiwicHJvY2Vzc29yIiwicGFnZSIsImNvbnRlbnQiLCJwcm9jZXNzIiwiSG90RmlsZSIsInVybCIsImxvY2FsRmlsZSIsImxvYWQiLCJyb3V0ZSIsImRhdGEiLCJodHRwTWV0aG9kIiwiZmlsZXMiLCJyZXN1bHQiLCJhcGkiLCJtYWtlQ2FsbCIsImZldGNoT2JqIiwiSlNPTiIsInN0cmluZ2lmeSIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImpzb24iLCJleCIsIm1lc3NhZ2UiLCJyZXF1ZXN0SW5pdCIsIk91dHB1dCIsImlJZHgiLCJDU1MiLCJjc3NGaWxlIiwiY3NzT3V0IiwiY3NzU3RyIiwiSlNGaWxlcyIsImpzRmlsZSIsImpzRmlsZU91dCIsImpzRmlsZVN0ciIsIkpTU2NyaXB0cyIsImpzU2NyaXB0IiwianNTY3JpcHRPdXQiLCJqc1NjcmlwdHNTdHIiLCJBcmd1bWVudHMiLCJIb3RUZXN0RWxlbWVudCIsIk1vZGUiLCJQcm9kdWN0aW9uIiwiQVBJIiwiVGVzdGVyQVBJIiwiRGF0YSIsIkNvb2tpZXMiLCJQdWJsaWNLZXlzIiwiRXZlbnRFeGVjdXRpb25UeXBlIiwiY29uc3RydWN0b3IiLCJiYXNlVXJsIiwiY29ubmVjdGlvbiIsImRiIiwiZGVzY3JpcHRpb24iLCJjcmVhdGVGdW5jdGlvbnMiLCJleGVjdXRlRXZlbnRzVXNpbmciLCJIb3RSb3V0ZSIsImF1dGhDcmVkZW50aWFscyIsInVzZXJBdXRoIiwicm91dGVzIiwib25QcmVSZWdpc3RlciIsIm9uUG9zdFJlZ2lzdGVyIiwic2V0REJTY2hlbWEiLCJzY2hlbWEiLCJnZXREQiIsImdldERCU2NoZW1hIiwiYWRkUm91dGUiLCJyb3V0ZU1ldGhvZCIsImV4ZWN1dGVGdW5jdGlvbiIsInJvdXRlTmFtZSIsIkhvdFJvdXRlTWV0aG9kIiwiYWRkTWV0aG9kIiwibmV3Um91dGUiLCJtZXRob2RzIiwiY3VycmVudFJvdXRlIiwibmV3Um91dGVNZXRob2QiLCJuYW1lIiwidHlwZSIsInJvdXRlU3RyIiwidmVyc2lvbiIsImF1dGhDcmVkZW50aWFsIiwicmVnaXN0ZXJSb3V0ZSIsIkhvdFNlcnZlciIsInJlZ2lzdGVyUm91dGVzIiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJrZXlzIiwiZm9ybURhdGEiLCJhcHBlbmQiLCJtZXRob2QiLCJib2R5IiwianNvblJlcyIsImhlYWRlcnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInRoZW4iLCJqc29uT2JqIiwiY2F0Y2giLCJyZWFzb24iLCJ0ZXN0ZXJBUEkiLCJIb3RTZXJ2ZXJUeXBlIiwiSFRUUCIsImxvZ2dlciIsImNvcHkiLCJodG1sRWxlbWVudHMiLCJ0YWciLCJlbGVtZW50T3B0aW9ucyIsInVuZGVmaW5lZCIsIm9ic2VydmVkQXR0cmlidXRlcyIsImlubmVyIiwiZXZlbnRzIiwib25DcmVhdGVkIiwiZWxlbWVudCIsInRocm93QWxsRXJyb3JzIiwic2V0Q29udGVudCIsImdldENvbnRlbnQiLCJsb2FkVXJsIiwiaHR0cEdldCIsImxvYWRMb2NhbEZpbGUiLCJmcyIsInJlYWRGaWxlIiwiZXJyIiwidG9TdHJpbmciLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwiZXhlYyIsInByZXZpb3VzSW5kZXgiLCJzdGFydCIsImluZGV4IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJzdGFydENoYXJzIiwiZW5kQ2hhcnMiLCJ0cmlnZ2VyQ2hhciIsInBvcyIsInN0YXJ0VHJpZ2dlclBvcyIsIm5lc3RlZENvdW50ZXIiLCJycG9zIiwibGFzdEluZGV4T2YiLCJlcG9zIiwidGVtcGVwb3MiLCJ0aGlzQ29udGVudCIsInBhcnNlck9wdGlvbnMiLCJvdXRwdXRDb21tYW5kcyIsImFsbG93U3RyaW5naWZ5IiwiU1RSSU5HSUZZX1NUQVJUIiwiU1RSSU5HSUZZX0VORCIsInByb2Nlc3NDb250ZW50IiwiUmVnRXhwIiwicmVnZXhGb3VuZCIsIm9mZkNvbnRlbnQiLCJ0ZW1wT3V0cHV0IiwicHJvY2Vzc05lc3RlZENvbnRlbnQiLCJyZWdleEZvdW5kMiIsIm9mZkNvbnRlbnQzIiwidGVtcE91dHB1dDIiLCJvdXQiLCJ0ZW1wT3V0cHV0MyIsInRlbXBPdXRwdXQ0IiwiRGV2ZWxvcG1lbnQiLCJmb3VuZFN0ciIsInBhcnNlIiwiY3JlYXRlVGVzdEVsZW1lbnQiLCJmb3VuZFN0cjIiLCJ0ZXN0RWxtIiwib2JqIiwiQXJyYXkiLCJ0ZXN0RWxlbWVudHMiLCJmdW5jIiwidGVtcE91dHB1dDUiLCJlc2NhcGVkQ29udGVudCIsIm1vZGUiLCJwdWJsaWNLZXlzIiwiZ2V0QVBJIiwiZ2V0VGVzdGVyQVBJIiwicGFyc2VDb250ZW50IiwicmV0dXJuZWRPdXRwdXQiLCJleGVjdXRpb25Db250ZW50IiwibmV3VmFyIiwibmV3VmFyVmFsdWUiLCJjb250ZW50TmFtZSIsIkZ1bmN0aW9uIiwiU3ludGF4RXJyb3IiLCJob3QiLCJmaW5hbE91dHB1dCIsIkhvdExvZ0xldmVsIiwibG9nTGV2ZWwiLCJBbGwiLCJsb2ciLCJsZXZlbCIsIlZlcmJvc2UiLCJlcnJvciIsIldhcm5pbmciLCJ3YXJuaW5nIiwiSW5mbyIsImluZm8iLCJ2ZXJib3NlIiwiY29uc29sZSIsIndhcm4iLCJtc2ciLCJzdGFjayIsInRlc3Rlck5hbWUiLCJ0ZXN0ZXJNYXAiLCJ0ZXN0UGF0aHMiLCJhZGRGaWxlIiwicHVzaCIsImFkZFRlc3RFbGVtZW50IiwiZWxtIiwiZ2V0VGVzdEVsZW1lbnQiLCJjcmVhdGVUZXN0UGF0aCIsInBhdGhOYW1lIiwiZHJpdmVyRnVuYyIsIm9uUmVnaXN0ZXIiLCJvbkF1dGhvcml6ZVVzZXIiLCJwcmVmaXgiLCJlcnJvcnMiLCJjcmVhdGVFcnJvciIsIkhUVFBNZXRob2QiLCJQT1NUIiwidGVzdENhc2VzIiwiZ2V0TWV0aG9kIiwiZm91bmRNZXRob2QiLCJvbkV4ZWN1dGUiLCJvblNlcnZlckF1dGhvcml6ZSIsInJldHVybnMiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJvblNlcnZlckV4ZWN1dGUiLCJvbkNsaWVudEV4ZWN1dGUiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJ0ZXN0Q2FzZU5hbWUiLCJhZGRUZXN0Q2FzZSIsIm5ld1Rlc3RDYXNlIiwidGVzdENhc2VGdW5jdGlvbiIsInRlc3RDYXNlSWQiLCJ0ZXN0Q2FzZSIsInNlcnZlclR5cGUiLCJsaXN0ZW5BZGRyZXNzIiwicG9ydHMiLCJodHRwIiwiaHR0cHMiLCJzc2wiLCJjZXJ0IiwiY2EiLCJyZWRpcmVjdEhUVFB0b0hUVFBTIiwic2VjcmV0cyIsInNldEFQSSIsIkhvdFRlc3Rlck1vY2hhIiwiSG90VGVzdGVyTW9jaGFTZWxlbml1bSIsIkhvdFRlc3RTZWxlbml1bURyaXZlciIsInBhZ2VzIiwiY29tcG9uZW50cyIsImhvdFNpdGUiLCJhcGlDb250ZW50IiwidGVzdGVyQXBpQ29udGVudCIsInBhZ2VDb250ZW50IiwiSG90TG9nIiwiTm9uZSIsInRlc3RlcnMiLCJwYXJzZUludCIsIm9ialdpdGhQYXJhbSIsInJlcXVpcmVkIiwidGhyb3dFeGNlcHRpb24iLCJkZWZhdWx0VmFsdWUiLCJlcnJUeXBlIiwicmVkaXJlY3RUb1VybCIsImxvY2F0aW9uIiwiaHJlZiIsIm51bU1pbGxpc2Vjb25kcyIsInNldFRpbWVvdXQiLCJhZGRQYWdlIiwiZ2V0UGFnZSIsInBhZ2VOYW1lIiwiY29udGV4dCIsInZhbCIsImFyeUFyZ3MiLCJwcm90b3R5cGUiLCJjYWxsIiwiYWRkQ29tcG9uZW50IiwiQ29tcG9uZW50VHlwZSIsInRlbXBBcGkiLCJ0ZW1wQ29tcG9uZW50T2JqIiwiY29tcG9uZW50VHlwZSIsInJlZ2lzdGVyQ29tcG9uZW50Iiwic3RyIiwidGVtcFN0ciIsInBhcnNlZFhNTCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInF1ZXJ5U2VsZWN0b3IiLCJkb2N1bWVudEVsZW1lbnQiLCJjaGlsZHJlbiIsInRhZ05hbWUiLCJmaXhlZFN0ciIsImN1c3RvbUVsZW1lbnRzIiwicHJvY2Vzc29yQ29tcG9uZW50cyIsImRlZmluZSIsIkhUTUxFbGVtZW50Iiwic3VwZXIiLCJjb21wb25lbnRJbmZvIiwiY29tcG9uZW50IiwibG9vc2VQYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJ4ZG9tIiwiaGRvbSIsImVsZW0iLCJmcm9tIiwiYXBwZW5kQ2hpbGQiLCJxdWVyeVNlbGVjdG9yQWxsIiwib3V0ZXJIVE1MIiwiY29ubmVjdGVkQ2FsbGJhY2siLCJob3RDb21wb25lbnQiLCJpbm5lckhUTUwiLCJoYW5kbGVBdHRyaWJ1dGVzIiwiYXR0ciIsImF0dHJOYW1lIiwiYXR0clZhbHVlIiwiYXR0clRlbXBOYW1lIiwic3Vic3RyaW5nIiwib25QcmVPdXRwdXQiLCJvdXRwdXRzIiwib25Qb3N0T3V0cHV0IiwiY29tcG9uZW50T3V0cHV0cyIsImh0bWwiLCJpS2R4IiwiaHRtbFN0ciIsImFkZEZ1bmN0aW9uc1RvIiwib25QYXJzZWQiLCJodG1sSGFuZGxlciIsIm9uRml4SFRNTCIsImZpeEhUTUwiLCJuZXdET00iLCJuZXdPYmoiLCJvblBhcnNlRE9NIiwidGhyb3dFcnIiLCJjaGlsZCIsImNoaWxkcmVuVG9SZWFkZCIsInJlbW92ZUNoaWxkIiwicmVwbGFjZVdpdGgiLCJjbGljayIsIm9uY2xpY2siLCJldmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJvcHRpb25zIiwib2JqZWN0RnVuY3Rpb25zIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIm9iakZ1bmMiLCJpc05ld0Z1bmN0aW9uIiwia2V5MiIsIkhvdENvbXBvbmVudCIsImtlZXBDb250ZXh0Iiwib25QcmVQbGFjZSIsImNvbXBIdG1sRWxlbWVudDIiLCJvblBhcmVudFBsYWNlIiwicGFyZW50U2VsZWN0b3IiLCJwYXJlbnROb2RlIiwicGFyZW50RWxlbWVudCIsInBsYWNlSGVyZVBhcmVudCIsInBhcmVudE5vZGVUb0NoZWNrIiwicGFyZW50Tm9kZUNoZWNrQ291bnRlciIsIkhUTUxIdG1sRWxlbWVudCIsInBsYWNlSGVyZUFycmF5IiwicGxhY2VIZXJlIiwicGxhY2VIZXJlQXR0ckFycmF5Iiwib25Qb3N0UGxhY2UiLCJwYXJlbnQiLCJmb3VuZFBhcmVudCIsInJlc3VsdHMiLCJob3RzaXRlTmFtZSIsInRocm93VGhlRXhjZXB0aW9uIiwiaG90c2l0ZSIsInBhcmFtcyIsInByZXZWYWx1ZSIsInByb2Nlc3NIb3RTaXRlIiwiY2hlY2tIb3RTaXRlTmFtZSIsInRlc3RlclVybCIsInRlc3RlciIsImRyaXZlciIsInRlc3RpbmciLCJzZXR1cFRlc3RlciIsInBhcmVudE9iaiIsImNyZWF0ZU5ld1Rlc3RlciIsInRlc3RlckFQSVVybCIsImNvbW1hbmREZWxheSIsIndlYiIsIkhvdFBhZ2UiLCJtYXBOYW1lIiwidGVzdE1hcCIsIm1hcCIsInRlc3RNYXBzIiwiSG90VGVzdE1hcCIsImRlc3RpbmF0aW9ucyIsImRlc3QiLCJIb3RUZXN0RGVzdGluYXRpb24iLCJkZXN0aW5hdGlvbk9yZGVyIiwiYXBpcyIsImNvbXBvbmVudFVybCIsIkNvbXBvbmVudENsYXNzIiwiZGlzYWJsZUZpbGVMb2FkaW5nIiwibG9hZEhvdEZpbGVzIiwiYWRkVGVzdGVyIiwibG9hZEhvdFNpdGUiLCJqc29uU3RyIiwicHBhdGgiLCJub3JtYWxpemUiLCJob3RzaXRlUGF0aCIsImZvcmNlQ29udGVudExvYWRpbmciLCJuZXdGaWxlIiwibG9hZENvbnRlbnQiLCJmaWxlcGF0aCIsImdlbmVyYXRlQ29udGVudCIsInJvdXRlS2V5IiwianNTcmNQYXRoIiwicGFzc0FyZ3MiLCJhcGlTY3JpcHRzIiwiYXBpQ29kZSIsInNlcnZlciIsImdsb2JhbEFwaSIsInNlbmRKU0NvbnRlbnQiLCJqc2FwaSIsImxpYnJhcnlOYW1lIiwiYXBpTmFtZSIsInRlbXBBUElDb250ZW50IiwianNhcGlwYXRoIiwic2VjcmV0Iiwic2VydmVyQ29ubiIsInBhc3NTZWNyZXRGcm9tQVBJIiwiZW52IiwiZW52S2V5IiwidGVtcENvbnRlbnQiLCJkZXZlbG9wZXJNb2RlU3RyIiwidGVzdGVyQVBJU3RyIiwibG9hZEZpbGVzIiwiZmlsZVVybCIsImZpbGVDb250ZW50IiwidGVzdGVyTGF1bmNocGFkVXJsIiwibGF1bmNocGFkVXJsIiwiZml4Q29udGVudCIsImNyZWF0ZUV4cHJlc3NSb3V0ZXMiLCJleHByZXNzQXBwIiwicmVxIiwic2VuZCIsImdldFdlYlRlc3RpbmdNYXBzIiwibWFwcyIsImdldEFQSVRlc3RpbmdNYXBzIiwiZ2V0Um91dGVLZXlGcm9tTmFtZSIsImdldFJvdXRlRnJvbU5hbWUiLCJmb3VuZFJvdXRlIiwiZXhlY3V0ZVRlc3RzIiwiZXhlY3V0ZSIsImV4ZWN1dGVBbGxXZWJUZXN0cyIsImV4ZWN1dGVBbGxBUElUZXN0cyIsImxvY2FsRmlsZXBhdGgiLCJyZWFkeUZ1bmMiLCJyZWFkeVN0YXRlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ0bXBTY3JpcHRzIiwic2NyaXB0cyIsInMiLCJjcmVhdGVFbGVtZW50IiwicmVzb2x2ZTIiLCJyZWplY3QyIiwib25sb2FkIiwiaGFzU3JjIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiaXNSZWFkeUZvclRlc3RpbmciLCJ3YWl0Iiwib25SZWFkeUZvclRlc3RpbmciLCJ0ZXN0ZXJBUElCYXNlVXJsIiwiY2xpZW50IiwiSG90Q2xpZW50IiwiSG90VGVzdGVyQVBJIiwib25SZWFkeSIsInNldHVwVGVzdGVycyIsInByb2Nlc3NVcmwiLCJzZXR1cENsaWVudFRlc3RlcnMiLCJ1c2VPdXRwdXQiLCJsb2FkSG90U3RhcVNpdGUiLCJob3RzdGFxRWxtcyIsIkhvdFN0YXFXZWIiLCJIb3RBUEkiLCJob3RzdGFxRWxtIiwiZ2V0QXR0ciIsImF0dHJOYW1lcyIsImxvYWRQYWdlIiwicm91dGVyIiwiYXBpTGlicmFyeSIsImFwaVVybCIsInRlc3RlckFwaUJhc2VVcmwiLCJkb250UmV1c2VQcm9jZXNzb3IiLCJwYXNzUmF3VXJsIiwiaHRtbFNvdXJjZSIsInJvdXRlck1hbmFnZXIiLCJyb3V0ZXJXaWxkY2FyZHMiLCJob3RzdGFxRXJyb3JzIiwiaG90c3RhcUVycm9yRWxtIiwiZXJyb3JTdGF0dXMiLCJ1bnN1cHBvcnRlZEJyb3dzZXIiLCJleGVjdXRlRXJyb3IiLCJob3RzdGFxUm91dGVyRWxtcyIsImhvdHN0YXFSb3V0ZXJFbG0iLCJyb3V0ZXJOYW1lIiwic2VydmVMb2NhbGx5IiwiaUpkeCIsImNoaWxkTm9kZXMiLCJyb3V0ZXJFbG0iLCJyb3V0ZXJQYXRoIiwicmVkaXJlY3QiLCJiYXNlIiwicm91dGVyU3JjIiwic3JjIiwidGVtcFBhdGhuYW1lIiwicGF0aG5hbWUiLCJsb3dlclNlcnZlTG9jYWxseSIsImxhc3RTbGFzaFBvcyIsInJvdXRlV2lsZGNhcmQiLCJ0ZW1wUm91dGVXaWxkY2FyZCIsImhhc0h0bWxTb3VyY2UiLCJodG1sU291cmNlQ2hlY2siLCJ0ZW1wTW9kZSIsInBhcmVudExpYiIsIm5ld0FQSSIsImRpc3BsYXlVcmwiLCJkaXNwbGF5Q29udGVudCIsImV0aGVyZXVtMjIiLCJldGhlcmV1bSIsInBlcnNpc3RlbnREYXRhIiwicGFyc2VUZXN0T2JqZWN0Iiwid2lsZGNhcmQiLCJzZWxlY3RvciIsInByaW50Iiwic3Rkb3V0IiwicHJpbnRsbiIsImFzc2VydCIsImVycm9yTWVzc2FnZSIsInJ1biIsImV4ZWN1dGlvbnMiLCJleGVjdXRpb24iLCJydW5Db21tYW5kIiwibXVzdEJlVmlzaWJsZSIsImlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IiLCJkZXN0aW5hdGlvbiIsImF1dG9TdGFydCIsIkhvdFRlc3RlciIsImZpbmlzaGVkTG9hZGluZyIsImhhc0JlZW5TZXR1cCIsImhhc0JlZW5EZXN0cm95ZWQiLCJ3YWl0Rm9yRGF0YSIsImdldFRlc3RQYWdlIiwiZ2V0VGVzdFBhdGgiLCJ0ZXN0RGVzdCIsIm5ld0Rlc3RpbmF0aW9uIiwicGF0aHMiLCJzdHJzIiwiZ2V0VHlwZSIsInR5cGVTdHIiLCJ0eXBlRGVsaW1pdGVyIiwidHlwZVZhbHVlIiwidHJpbSIsIm5ld1BhdGhTdHIiLCJuZXdQYXRoIiwiY21kIiwiZXhlY3V0ZVRlc3RBUElQYXRoIiwidGVzdE5hbWUiLCJza2lwRXZlbnRDYWxscyIsImNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlIiwicnVuVGVzdFBhdGgiLCJvblRlc3RBUElQYXRoU3RhcnQiLCJ0ZXN0Q2FzZU9iamVjdCIsIm9uVGVzdEFQSVBhdGhFbmQiLCJleGVjdXRlVGVzdEFQSVBhdGhzIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aCIsInN0b3AiLCJ0ZXN0UGF0aE5hbWUiLCJ0ZXN0UGF0aCIsIm9uVGVzdFBhZ2VQYXRoU3RhcnQiLCJvblRlc3RQYWdlUGF0aEVuZCIsImV4ZWN1dGVDb21tYW5kIiwiaGFzQ21kIiwiaW5wdXQiLCJoYXNBcmd1bWVudHMiLCJnZXRDbWRBcmdzIiwibWF0Y2hlcyIsIm1hdGNoIiwidGVtcE1hdGNoIiwiY21kRnVuYyIsImNtZEFyZ3MiLCJuYXZpZ2F0ZVRvVXJsIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsIm9uQ29tbWFuZCIsImV4ZWN1dGVUZXN0UGFnZVBhdGhzIiwiaW50ZXJwcmV0RGVzdGluYXRpb24iLCJleGVjdXRlRGVzdGluYXRpb24iLCJkZXN0aW5hdGlvbktleSIsImlzV2ViUm91dGUiLCJydW5UZXN0UGF0aHMiLCJzZXR1cCIsIm9uVGVzdFN0YXJ0Iiwib25UZXN0RW5kIiwiZGVzdHJveSIsImhhc0V4ZWN1dGVkS2V5cyIsIm9yZGVyS2V5IiwiZXhlY3V0ZURlc3QiLCJwYWdlTG9hZGVkIiwiR0VUIiwiaGVhcnRiZWF0IiwiYXV0aG9yaXplZFZhbHVlIiwicXVlcnlPYmoiLCJ0ZXN0ZXJPYmoiLCJ0ZXN0UGF0aHNTdHJzIiwidGVzdE9iaiIsInRocm93RXJyb3IiLCJvbkZpbmlzaGVkTG9hZGluZyIsIkhvdFRlc3RFbGVtZW50T3B0aW9ucyIsIkhvdFRlc3REcml2ZXIiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiX193ZWJwYWNrX2V4cG9ydHNfXyJdLCJzb3VyY2VSb290IjoiIn0=
1
+ var HotStaqWeb;(()=>{var __webpack_modules__={230:t=>{t.exports="object"==typeof self?self.FormData:window.FormData},646:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var l in s)s[l]&&(i+="; "+l,!0!==s[l]&&(i+="="+s[l].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var l=decodeURIComponent(s[0]);if(r[l]=n.read(i,l),t===l)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},300:(t,e)=>{"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==n)return n;throw new Error("unable to locate global object")}();t.exports=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response},507:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Hot=exports.DeveloperMode=void 0;const HotFile_1=__webpack_require__(732),HotStaq_1=__webpack_require__(243),HotTestElement_1=__webpack_require__(967),js_cookie_1=__importDefault(__webpack_require__(646)),node_fetch_1=__importDefault(__webpack_require__(300));var DeveloperMode;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(DeveloperMode=exports.DeveloperMode||(exports.DeveloperMode={}));class Hot{static include(t,e=null){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq_1.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}Hot.echo(yield Hot.getFile(t,e))}))}static includeJS(file){return __awaiter(this,void 0,void 0,(function*(){const res=yield Hot.httpRequest(file),output=yield res.text();!0===HotStaq_1.HotStaq.isWeb?eval.apply(window,[output]):eval(output)}))}static runFile(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=Hot.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);Hot.echo(r)}))}static getFile(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=null;return"string"==typeof t?(n=new HotFile_1.HotFile,!0===HotStaq_1.HotStaq.isWeb?n.url=t:n.localFile=t):n=t,yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n="POST",r={}){return __awaiter(this,void 0,void 0,(function*(){let o=null;if(null==Hot.CurrentPage)throw new Error("Current page is null!");if(null==Hot.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==Hot.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=Hot.CurrentPage.processor.api&&(o=yield Hot.CurrentPage.processor.api.makeCall(t,e,n,r)),o}))}static jsonRequest(t,e=null,n="POST"){return __awaiter(this,void 0,void 0,(function*(){try{let r={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};"POST"===n&&(r.body=JSON.stringify(e));let o=yield(0,node_fetch_1.default)(t,r);if(!1===o.ok)throw new Error(`${o.status}: ${o.statusText}`);return yield o.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return __awaiter(this,void 0,void 0,(function*(){return yield(0,node_fetch_1.default)(t,e)}))}static echo(t){Hot.Output+=t}static displayCSS(){for(let t=0;t<Hot.CSS.length;t++){let e=Hot.CSS[t],n=Hot.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),Hot.echo(n)}}static displayJSFiles(){for(let t=0;t<Hot.JSFiles.length;t++){let e=Hot.JSFiles[t],n=Hot.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),Hot.echo(n)}}static displayJSScripts(){for(let t=0;t<Hot.JSScripts.length;t++){let e=Hot.JSScripts[t],n=Hot.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),Hot.echo(n)}}}exports.Hot=Hot,Hot.CurrentPage=null,Hot.Arguments=null,Hot.DeveloperMode=DeveloperMode,Hot.HotTestElement=HotTestElement_1.HotTestElement,Hot.Mode=DeveloperMode.Production,Hot.API=null,Hot.TesterAPI=null,Hot.Output="",Hot.Data={},Hot.Cookies=js_cookie_1.default,Hot.PublicKeys={},Hot.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',Hot.CSS=[],Hot.JSFiles=[],Hot.JSScripts=[],Hot.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',Hot.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},233:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const s=o(n(300)),i=o(n(230)),l=n(810),a=n(761),u=n(70);var h;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(h=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e=null,n=null){this.connection=e,this.description="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=h.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";if(t instanceof a.HotRoute?(r=t.route,this.routes[t.route]=t):(r=t,null==this.routes[r]&&(this.routes[r]=new a.HotRoute(this.connection,r)),e instanceof u.HotRouteMethod?this.routes[r].addMethod(e):this.routes[r].addMethod(new u.HotRouteMethod(this.routes[r],e,n))),this.routes[r].connection=this.connection,!0===this.createFunctions){let t=this[r];null==t&&(t={});for(let e=0;e<this.routes[r].methods.length;e++){let n=this.routes[r],o=this.routes[r].methods[e];t[o.name]=(t,e)=>{let r=o.type,s="";""!==n.version&&(s+=`/${n.version}`),""!==n.route&&(s+=`/${n.route}`),""!==o.name&&(s+=`/${o.name}`);let i=null;if(null!=this.authCredentials&&(i=this.authCredentials),null!=o.authCredentials?i=o.authCredentials:null!=o.route.authCredentials&&(i=o.route.authCredentials),null==i&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(i=Hot.API[n.route].authCredentials),null!=i)for(let e in i){let n=i[e];null==t[e]&&(t[e]=n)}let l=[s,t,r,e];return this.makeCall.apply(this,l)}}this[r]=t}}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof l.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n="POST",o={}){return r(this,void 0,void 0,(function*(){let l=this.baseUrl;if(n=n.toUpperCase(),"/"===l[l.length-1]&&(l=l.substr(0,l.length-1)),"/"!==t[0]&&(l+="/"),l+=t,Object.keys(o).length>0){if("POST"!==n)throw new Error("To upload files, you must set the httpMethod to POST.");const r=new i.default;for(let t in o)r.append(t,o[t]);let a=yield(0,s.default)(l,{method:"POST",body:r}),u=yield a.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=u.hotstaq.uploads.uploadId,yield this.makeCall(t,e,n)}let a={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};return"GET"!==n&&"HEAD"!==n&&(a.body=JSON.stringify(e)),new Promise(((t,e)=>{(0,s.default)(l,a).then((e=>r(this,void 0,void 0,(function*(){let n=yield e.json();t(n)})))).catch((t=>{throw new Error(`${l}: ${t.message}`)}))}))}))}}},957:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(810);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},260:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const o=n(243);e.HotComponent=class{constructor(t,e=null){t instanceof o.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return r(this,void 0,void 0,(function*(){return t}))}}},732:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const a=s(n(351)),u=l(n(300)),h=n(507);class c{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield c.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{a.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),l=0,a="";for(;null!=i;){let u=i.index-o,h=e.lastIndex+s,c=t.substr(l,u-l);l=h,a+=r(c),a+=n(i[0]),i=e.exec(t)}return a+=r(t.substr(l)),a}static processNestedContent(t,e,n,r,o,s,i=2,l=1){let a=t.indexOf(e),u=0,h=t.indexOf(r,a),c="";for(;a>-1;){let p=t.indexOf(n,a),d=0;if(""!==r){let e=t.lastIndexOf(r,p-l);for(;e>-1&&e!==h;)e=t.lastIndexOf(r,e-l),d++}if(d>0){let r=t.indexOf(n,p+l),o=r;for(;r>-1&&d>0&&!(o<0)&&!(t.lastIndexOf(e,o-l)>r);)r=o,o=t.indexOf(n,r+l),d--;p=r}c+=s(t.substr(u,a-u)),c+=o(t.substr(a+i,p-(a+i))),a=t.indexOf(e,p+l),h=t.indexOf(r,a),u=p+l}return c+=s(t.substr(u)),c}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let r="JSON.stringify (",o=")";return!1===n.allowStringify&&(r="",o=""),c.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=c.processNestedContent(t,"!{","}","{",(t=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=c.processNestedContent(s,"STR{","}","{",(t=>{let s="";return s=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${r}${t}${o}, ${e});*&!#%@!@*!`,s}),(t=>t),4,1),l=c.processNestedContent(i,"${","}","{",(t=>{let r="";return!0===n.outputCommands?(r=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo ("");}*&!#%@!@*!`,!0===e&&(r=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):r=`*&&%*%@#@!${t}*&!#%@!@*!`,r}),(t=>t)),a="";h.Hot.Mode===h.DeveloperMode.Production&&(a=c.processNestedContent(l,"?(",")","(",(t=>""),(t=>t))),h.Hot.Mode===h.DeveloperMode.Development&&(a=c.processNestedContent(l,"?(",")","(",(t=>{let e="";try{JSON.parse(t),e=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(n){e=`${t}`}let r="";if(!0===n.outputCommands)r=`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new h.Hot.HotTestElement(n)),n instanceof Array&&(e=new h.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new h.Hot.HotTestElement(n)),null!=h.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${h.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const n=t(e);r=`*&&%*%@#@!data-test-object-name = "${n.name}" data-test-object-func = "${n.func}" data-test-object-value = "${n.value}"*&!#%@!@*!`}return r}),(t=>t)));let u=c.processNestedContent(a,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",(t=>t),(t=>{let r="";r=!0===n.allowStringify?JSON.stringify(t):t;let o="";return o=!0===n.outputCommands?`echoOutput (${r}, ${e});\n`:r,o}),"*&&%*%@#@!".length,"*&!#%@!@*!".length);return u=u.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),u=u.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),u}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;h.Hot.Mode=this.page.processor.mode,h.Hot.Arguments=t,h.Hot.CurrentPage=this.page,h.Hot.PublicKeys=this.page.processor.publicKeys,h.Hot.API=this.page.getAPI(),h.Hot.TesterAPI=this.page.getTesterAPI();let n=c.parseContent(e,this.throwAllErrors),r=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let r="",o=t[n];r=`var ${n} = ${JSON.stringify(o)};\n`,e+=r}let o=this.name;""===o&&(o=this.localFile),""===o&&(o=this.url),e+='\n\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=n,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);r=yield s.apply(this,[h.Hot,this])}catch(t){throw SyntaxError,t}h.Hot.Data=r.hot.Data;let o=r.output;return h.Hot.Output="",o}))}}e.HotFile=c},802:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t){this.logLevel===n.Verbose&&console.info(t)}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},136:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(507),s=n(243);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="",this.testerMap="",this.route="",this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"",this.testerMap=t.testerMap||"",this.route=t.route||"",this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},761:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(70);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:o.createError("Not authorized."),no_server_execute_function:o.createError("Missing server execute function.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=r.HTTPMethod.POST,o=null){"string"==typeof t&&(t=new r.HotRouteMethod(this,t,e,n,null,null,null,o)),t instanceof r.HotRouteMethod||(null==t.route&&(t.route=this),t=new r.HotRouteMethod(t)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},70:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.HTTPMethod=void 0;const r=n(507),o=n(761),s=n(810);var i;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json"}(i=e.HTTPMethod||(e.HTTPMethod={})),e.HotRouteMethod=class{constructor(t,e="",n=null,l=i.POST,a=null,u=null,h=null,c=null){let p=null;if(t instanceof o.HotRoute)p=t;else{if(p=t.route,null!=t.type&&(l=t.type),null!=t.name&&(e=t.name),null!=t.description&&(this.description=t.description),null!=t.returns&&("string"==typeof t.returns?this.returns={type:"string",required:!0,description:t.returns}:this.returns=t.returns),null!=t.parameters){this.parameters={};for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?this.parameters[e]={type:n,required:!1,description:""}:(null==n.type&&(n.type="string"),this.parameters[e]=n)}}null!=t.authCredentials&&(h=t.authCredentials),null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(a=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(this.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(this.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(this.onClientExecute=t.onClientExecute),null!=t.testCases&&(c=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(this.route=p,this.name=e,this.type=l,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=h,this.onServerAuthorize=a,this.onRegister=u,this.testCases={},this.route.connection.processor.mode===r.DeveloperMode.Development&&null!=c)if(c instanceof Array)for(let t=0;t<c.length;t++){let e=c[t];if("string"==typeof e){const n=e,r=c[t+1];this.addTestCase(n,r),t++}else this.addTestCase(e)}else for(let t in c){let e=c[t];this.addTestCase(e)}this.route.connection instanceof s.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}}},810:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(243);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:80,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:80,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},243:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const fs=__importStar(__webpack_require__(351)),ppath=__importStar(__webpack_require__(606)),node_fetch_1=__importDefault(__webpack_require__(300)),validate_npm_package_name_1=__importDefault(__webpack_require__(651)),HotPage_1=__webpack_require__(136),HotFile_1=__webpack_require__(732),HotComponent_1=__webpack_require__(260),HotLog_1=__webpack_require__(802),Hot_1=__webpack_require__(507),HotClient_1=__webpack_require__(957),HotTesterAPI_1=__webpack_require__(414),HotTestMap_1=__webpack_require__(985);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\twindow.HotStaq = HotStaqWeb.HotStaq;\n\t\twindow.HotClient = HotStaqWeb.HotClient;\n\t\twindow.HotAPI = HotStaqWeb.HotAPI;\n\t\twindow.Hot = HotStaqWeb.Hot;\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tfunction hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%load_hot_site%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.None),this.publicKeys={},this.testers={}}static parseBoolean(t){if("true"===(t=t.toLowerCase()))return!0;if("false"===t)return!1;if("yes"===t)return!0;if("no"===t)return!1;if("yep"===t)return!0;if("nah"===t)return!1;try{if(0!=parseInt(t))return!0}catch(t){}return!1}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t){if(null==this.files[t])throw new Error(`Unable to find file ${t}`);return this.files[t]}static keepContext(t,e,n){return function(){var r=Array.prototype.slice.call(arguments);return null!=n&&r.push(n),null==e?t.apply(this,r):t.apply(e,r)}}addComponent(t,e=null,n){let r=this.api;null!=e&&(r=e);let o=new t(this,r);if(null!=this.components[o.tag])throw new Error(`Component ${o.tag} already exists!`);this.components[o.tag]={componentType:t,processor:this,api:r},this.registerComponent(o.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let r="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,r="tbody"),"th"===e&&(t=`<table>${t}</table>`,r=e)}return{fixedStr:t,querySelector:r}}registerComponent(t,e){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];this.component=new e.componentType(e.processor,e.api)}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),r=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))r.body.appendChild(t);for(let t of Array.from(r.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return r}get observedAttributes(){return this.component.observedAttributes}connectedCallback(){return __awaiter(this,void 0,void 0,(function*(){if(this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)yield this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),r=e.value;if("id"===n&&(this.component.name=r),"name"===n&&(this.component.name=r),"value"===n&&(this.component.value=r),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=r}}if(null!=this.component.onPreOutput&&!1===(yield this.component.onPreOutput()))return;let t=yield this.component.output();null!=this.component.onPostOutput&&(t=yield this.component.onPostOutput(t));let e=[];"string"==typeof t?e.push({html:t}):e=t instanceof Array?t:[t];for(let t=0;t<e.length;t++){let n=e[t],r=n.html,o="";null!=n.addFunctionsTo&&(o=n.addFunctionsTo);let s=HotFile_1.HotFile.parseContent(r,!0,{outputCommands:!1});null!=this.component.onParsed&&(s=yield this.component.onParsed(s));let i={fixedStr:"",querySelector:""};i=null!=this.component.onFixHTML?yield this.component.onFixHTML(s):HotStaq.fixHTML(s);let l=null,a=null;if(l=null!=this.component.onParseDOM?yield this.component.onParseDOM(i.fixedStr):(new DOMParser).parseFromString(i.fixedStr,"text/html"),l.body.children.length<1)throw new Error(`No component output from ${this.component.name}`);if(l.body.children.length>1){let t=!0;for(let e=0;e<l.body.children.length;e++){let n=l.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){a=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}a=""===i.querySelector?l.body.children[0]:l.querySelector(i.querySelector);let u=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];u.push(this.removeChild(e))}this.replaceWith(a),null!=this.component.click&&(a.onclick=this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];a.addEventListener(e.type,e.func,e.options)}let h=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<h.length;t++){let e=h[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in HotComponent_1.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(a[e]=HotStaq.keepContext(this.component[e],this.component),""!==o)&&(document.querySelector(o)[e]=HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(a=yield this.component.onPrePlace(a));let c=yield this.component.onCreated(a);if(null!=this.component.onParentPlace&&(c.onParentPlace=this.component.onParentPlace),c.hotComponent=this.component,this.component.htmlElements.push(c),null!=n.parentSelector){let t=document.querySelector(n.parentSelector);c.parentElement.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c))}if(null!=n.placeHereParent){let t=c.parentNode,e=0;for(;e<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let r=t.querySelectorAll(`hot-place-here[name="${n.placeHereParent}"]`);if(r.length>0){let t=r[0];c.parentNode.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c));break}if(r.length<1){let e=t.querySelectorAll(`[hot-place-here="${n.placeHereParent}"]`);if(e.length>0){let t=e[0];c.parentNode.removeChild(c),t.appendChild(c),null!=c.onParentPlace&&(yield c.hotComponent.onParentPlace(t,c));break}}t=t.parentNode,e++}}for(let t=0;t<u.length;t++){const e=u[t];c.appendChild(e),null!=e.onParentPlace&&(yield e.hotComponent.onParentPlace(c,e))}null!=this.component.onPostPlace&&(c=yield this.component.onPostPlace(c.parentNode,c))}}))}},e)}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),r=(new DOMParser).parseFromString(t.fixedStr,"text/html"),o=null;o=""===t.querySelector?r.body.children:r.querySelector(t.querySelector).children;let s=[];for(let t=0;t<o.length;t++){let e=o[t];s.push(n.appendChild(e))}return s}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t);return null!=n.errors&&n.errors.length>0&&(()=>{if(!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`)})(),!0}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}processHotSite(){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes,testerUrl="http://127.0.0.1:8182",tester=null,driver=null;if(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development&&null!=this.hotSite.testing){let t=t=>{let e=!0;null!=t.createNewTester&&(e=t.createNewTester);let n="Tester";if(null!=t.tester&&(n=t.tester),null!=t.testerName&&(n=t.testerName),!0===e?(HotTesterMocha=Object(function(){var t=new Error("Cannot find module './HotTesterMocha'");throw t.code="MODULE_NOT_FOUND",t}()),HotTesterMochaSelenium=Object(function(){var t=new Error("Cannot find module './HotTesterMochaSelenium'");throw t.code="MODULE_NOT_FOUND",t}()),HotTestSeleniumDriver=Object(function(){var t=new Error("Cannot find module './HotTestSeleniumDriver'");throw t.code="MODULE_NOT_FOUND",t}()),""===t.testerAPIUrl&&(testerUrl=t.testerAPIUrl),"HotTestSeleniumDriver"===t.driver&&(driver=new HotTestSeleniumDriver),"HotTesterMocha"===t.tester&&(tester=new HotTesterMocha(this,n,testerUrl,driver)),"HotTesterMochaSelenium"===t.tester&&(tester=new HotTesterMochaSelenium(this,n,testerUrl))):tester=this.testers[n],null==tester.driver)throw new Error(`Tester ${n} does not have a driver set!`);null!=t.commandDelay&&(tester.driver.commandDelay=t.commandDelay)};null!=this.hotSite.testing.web&&t(this.hotSite.testing.web),null!=this.hotSite.testing.api&&t(this.hotSite.testing.api)}if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestMap_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestMap_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestMap_1.HotTestDestination(n))}if(null==tester)throw new Error("A tester was not created first! You must specify one in the CLI or in HotSite.json.");tester.testMaps[n]=r}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester)}))}loadHotSite(t){return __awaiter(this,void 0,void 0,(function*(){let e="";if(!0===HotStaq.isWeb){this.logger.info(`Downloading HotSite ${t}`);let n=yield(0,node_fetch_1.default)(t);this.logger.info(`Downloaded site ${t}`),e=n.text()}else t=ppath.normalize(t),this.logger.info(`Accessing HotSite ${t}`),e=yield new Promise(((e,n)=>{fs.readFile(t,((n,r)=>{if(null!=n)throw n;let o=r.toString();this.logger.info(`Accessed site ${t}`),e(o)}))}));this.hotSite=JSON.parse(e),this.hotSite.hotsitePath=t}))}loadHotFiles(t,e=!1){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let n in t){let r=t[n],o=null;HotStaq.isWeb,o=new HotFile_1.HotFile({name:n}),null!=r.url&&(o.url=r.url),!1===HotStaq.isWeb&&null!=r.localFile&&(o.localFile=r.localFile);let s=!0;if(null!=r.content&&(o.content=r.content,s=!1),!0===e&&(s=!0),!0===s){let t="";""!==o.url&&(t=o.url),""!==o.localFile&&(t=o.localFile),this.logger.verbose(`Loading Hott file: ${t}`),yield o.load(),this.logger.verbose(`Finished loading Hott file: ${t}`)}this.addFile(o)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",r="./js/HotStaq.min.js",o=!0,s=null){let i="",l="",a="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),l+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),l+=r}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(r.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}a+=`processor.publicKeys["${t}"] = ${e};\n`}}let u=this.pageContent;return u=(u=>{let h="",c="";this.mode===Hot_1.DeveloperMode.Development&&(h="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(c=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),c=c.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=`"${e.url}"`,r="";if(""!==e.content){let t=JSON.stringify(e.content);t=t.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),t=t.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=`, "content": ${t}`}p+=`\t\t\tfiles["${t}"] = { "url": ${n}${r} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===o&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(u=u.replace(/\%args\%/g,JSON.stringify(s)));let d=t,m="",f="",g="Tester";return null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.tester&&(g=this.hotSite.testing.web.tester),null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(m=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(f=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name),(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,h)).replace(/\%tester\_api\%/g,c)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_hot\_site\%/g,"")).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,l)).replace(/\%public\_secrets\%/g,a)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${m}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${f}"`)})(u),u}createExpressRoutes(t,e="./js/HotStaq.min.js"){for(let n in this.pages){let r=this.pages[n];const o=this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,((t,e)=>{e.send(o)}))}}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((r,o)=>{n.onload=()=>{r()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&r()}))}}}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),r=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);r.connection.api=r,t.testerAPI=r}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),o(n)}))))}))}))}static displayContent(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),o(n)}))))}))}))}}if(exports.HotStaq=HotStaq,HotStaq.version="0.6.23",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.errors={},"undefined"!=typeof document){let loadHotStaqSite=function(){let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq.isWeb=!0,void 0!==HotStaqWeb&&(window.HotStaq=HotStaqWeb.HotStaq,window.HotClient=HotStaqWeb.HotClient,window.HotAPI=HotStaqWeb.HotAPI,window.Hot=HotStaqWeb.Hot,window.HotComponent=HotStaqWeb.HotComponent),hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let r=e[n];if(null!=t.getAttribute(r))return t.getAttribute(r);if(null!=t.getAttribute(`data-${r}`))return t.getAttribute(`data-${r}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[],search=new URLSearchParams(window.location.search);null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hstqbaseredirect=search.get("hstqbaseredirect");null!=hstqbaseredirect&&(hstqbaseredirect=decodeURI(hstqbaseredirect),window.history.replaceState("","",hstqbaseredirect),loadPage=hstqbaseredirect);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),r=getAttr(e,["unsupported-browser-redirect"]);null!=r?HotStaq.errors.unsupportedBrowser={redirectToUrl:r}:HotStaq.errors[`${n}`]={redirectToUrl:r}}try{eval("async () => {}")}catch(t){HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],r=getAttr(n,["name"]),o=getAttr(n,["serve-local","serveLocally"]);if(r===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),r=getAttr(e,["base-redirect","baseRedirect"]),o=getAttr(e,["base"]),s=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,baseRedirect:r||void 0,base:o||void 0,src:s||void 0}}}let t=window.location.pathname,e=window.location.pathname;if(null!=o){const n=o.toLowerCase();if("true"===n||"yes"===n||"1"===n){const n=t.lastIndexOf("/");n>-1&&(t=t.substring(n),e=e.substring(n))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],r=n.replace("*","");if(t.indexOf(r)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);if(null!=routerManager[t].baseRedirect)return void(window.location.href=`${routerManager[t].baseRedirect}?hstqbaseredirect=${encodeURI(e)}`);null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(""===apiUrl)throw new Error("api-url was not set!");let e=window;null!=apiLibrary&&(e=window[apiLibrary]);let n=new e[apiName](apiUrl,t);n.connection.api=n,processor.api=n}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq.displayUrl(options)}else HotStaq.displayContent(options)}))}),50)}};window.ethereum22=window.ethereum,window.addEventListener("load",loadHotStaqSite)}},628:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0;const o=n(243),s=n(967);e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.persistentData={}}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let r=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(r=t=t.replace(/\>/,"")),r}wait(t){return r(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return r(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return r(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}assert(t,e=""){return r(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}run(t){return r(this,void 0,void 0,(function*(){let e=[];for(let n=0;n<t.length;n++){let r=t[n],i=null,l="",a="";if("string"==typeof r){if(i=this.page.testElements[r],null==i)throw new Error(`HotTestDriver: Unable to find test element ${r}`);l=i.func,a=i.value}if(r instanceof Array){let t=r[0];i=this.page.testElements[t],null==i?(i=new s.HotTestElement(t),l=r[1],a=r[2]):(l=i.func,a=i.value,r.length>1&&(l=r[1]),r.length>2&&(a=r[2]))}i.func=l,i.value=a;let u=yield this.runCommand(i);yield o.HotStaq.wait(this.commandDelay),e.push(u)}return e}))}}},967:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},985:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n,e.HotTestMap=class{constructor(t=[],e={},r=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let r=t[e];this.destinations.push(new n(r))}}else{this.destinations={};for(let e in t){let r=t[e];this.destinations[e]=new n(r)}}this.destinationOrder=r,this.pages=e}}},677:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(243);class s{constructor(t,e,n,r,o={}){this.processor=t,this.name=e,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0];if(o.length<2)return null;if("/"===o[0]&&"/"===o[1])return null;let s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.page=s(o,"page:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path;if(null==s)throw new Error(`Unable to find method related to path ${o} in map ${t.mapName}`);let l=yield this.executeTestAPIPath(t,s,i);e.push(l)}return e}))}executeTestPagePath(t,e,n=!1,o=!1){return r(this,void 0,void 0,(function*(){let r=!0,s=this.testMaps[t.mapName];if(null==s)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);let i=s.pages[t.page];if(null==i)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=i;let l=e.path,a=i.testPaths[l];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,i,e,o));let u=null;if(!0===r){if(null==a)throw new Error(`HotTester: Test path ${l} does not have a function!`);u=yield a(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,a,u,o)),u}))}executeCommand(t,e,n,s){return r(this,void 0,void 0,(function*(){let i=(t,e,r)=>{let o=!1;n.cmd===e&&(o=!0);const s=n.cmd.indexOf("(");return s>-1&&n.cmd.substr(0,s)===e&&(o=!0),o},l=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},a=null,u=[];if(!0===i(n.cmd,"waitForTesterAPIData")&&(a=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===i(n.cmd,"wait")&&(u=l(n.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===i(n.cmd,"url")&&(u=l(n.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.navigateToUrl(e)}))),!0===i(n.cmd,"print")&&(u=l(n.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===i(n.cmd,"println")&&(u=l(n.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===i(n.cmd,"waitForTestObject")&&(u=l(n.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield this.driver.waitForTestElement(e)}))),null==a)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,s,u,a)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],l=null,a=r.pages[t.page];if(null==a)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(l=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,a,i,i.cmd)),""!==i.path&&(l=yield this.executeTestPagePath(t,i,!1,e)),n.push(l)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);let n=this.processor.getRouteKeyFromName(t),o="";""!==n&&(o=`${this.baseUrl}${n}`);let i=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1===e.autoStart)return;let r=s.interpretDestination(t,e),i=!1,l=!0;""!==r.page&&(i=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(i,o,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(l=yield this.onTestStart(r,o,n)),!0===l&&(""!==r.page&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield i(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let r=e.destinationOrder[n],o=e.destinations[r];if(null==o)throw new Error(`HotTester: Destination ${r} does not exist!`);t.push(r),yield i(o,r)}for(let n in e.destinations){let r=!0;for(let e=0;e<t.length;e++)if(t[e]===n){r=!1;break}if(!0===r){let t=e.destinations[n];yield i(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield i(n,t)}}))}}e.HotTester=s},414:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(233),HotRoute_1=__webpack_require__(761),HotRouteMethod_1=__webpack_require__(70);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),r.addMethod({name:"heartbeat",type:HotRouteMethod_1.HTTPMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(r)}pageLoaded(req,res,authorizedValue,jsonObj,queryObj){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:jsonObj.testerName,testerMap:jsonObj.testerMap,pageName:jsonObj.pageName,testElements:jsonObj.testElements,testPathsStrs:jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerMap} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t,e,n,r,o){return __awaiter(this,void 0,void 0,(function*(){let t=r.testerName,e=r.testerMap;if(null==t||null==e)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===t||""===e)throw new Error("TesterAPI: Not all required json objects were passed.");let n=this.connection;return null!=n.executeTests&&(yield n.executeTests(t,e)),!0}))}heartbeat(t,e,n,r,o){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},859:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(243),o=n(507),s=n(260),i=n(732),l=n(802),a=n(136),u=n(233),h=n(761),c=n(70),p=n(810),d=n(957),m=n(628),f=n(967),g=n(677),_=n(414),H=n(985);r.HotStaq.isWeb=!0,t.exports.HotStaq=r.HotStaq,t.exports.Hot=o.Hot,t.exports.DeveloperMode=o.DeveloperMode,t.exports.HotComponent=s.HotComponent,t.exports.HotAPI=u.HotAPI,t.exports.EventExecutionType=u.EventExecutionType,t.exports.HotFile=i.HotFile,t.exports.HotLog=l.HotLog,t.exports.HotLogLevel=l.HotLogLevel,t.exports.HotPage=a.HotPage,t.exports.HotRoute=h.HotRoute,t.exports.HotRouteMethod=c.HotRouteMethod,t.exports.HTTPMethod=c.HTTPMethod,t.exports.HotServer=p.HotServer,t.exports.HotServerType=p.HotServerType,t.exports.HotClient=d.HotClient,t.exports.HotTester=g.HotTester,t.exports.HotTesterAPI=_.HotTesterAPI,t.exports.HotTestMap=H.HotTestMap,t.exports.HotTestDestination=H.HotTestDestination,t.exports.HotTestElement=f.HotTestElement,t.exports.HotTestElementOptions=f.HotTestElementOptions,t.exports.HotTestDriver=m.HotTestDriver},651:t=>{"use strict";t.exports={}},351:()=>{},606:()=>{}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}var __webpack_exports__=__webpack_require__(859);HotStaqWeb=__webpack_exports__})();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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OWdCLElBQWpCK2dCLEVBQ0gsT0FBT0EsRUFBYXpzQixRQUdyQixJQUFJRCxFQUFTdXNCLHlCQUF5QkUsR0FBWSxDQUdqRHhzQixRQUFTLENBQUMsR0FPWCxPQUhBMHNCLG9CQUFvQkYsR0FBVS9WLEtBQUsxVyxFQUFPQyxRQUFTRCxFQUFRQSxFQUFPQyxRQUFTdXNCLHFCQUdwRXhzQixFQUFPQyxPQUNmLENDbkJBLElBQUkyc0Isb0JBQXNCSixvQkFBb0IsSyIsInNvdXJjZXMiOlsid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZm9ybS1kYXRhL2xpYi9icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvbm9kZS1mZXRjaC9icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q2xpZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90RmlsZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdExvZy50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFBhZ2UudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RSb3V0ZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlTWV0aG9kLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U2VydmVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3REcml2ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RWxlbWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RNYXAudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXJBUEkudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9hcGktd2ViLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvZXh0ZXJuYWwgdmFyIFwie31cIiIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyA/IHNlbGYuRm9ybURhdGEgOiB3aW5kb3cuRm9ybURhdGE7XG4iLCIvKiEganMtY29va2llIHYzLjAuMSB8IE1JVCAqL1xuO1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBnbG9iYWwuQ29va2llcztcbiAgICB2YXIgZXhwb3J0cyA9IGdsb2JhbC5Db29raWVzID0gZmFjdG9yeSgpO1xuICAgIGV4cG9ydHMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsgZ2xvYmFsLkNvb2tpZXMgPSBjdXJyZW50OyByZXR1cm4gZXhwb3J0czsgfTtcbiAgfSgpKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbiAgZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIHZhciBkZWZhdWx0Q29udmVydGVyID0ge1xuICAgIHJlYWQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgIH0sXG4gICAgd3JpdGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgICAgLyUoMlszNDZCRl18M1tBQy1GXXw0MHw1W0JERV18NjB8N1tCQ0RdKS9nLFxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnRcbiAgICAgIClcbiAgICB9XG4gIH07XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbiAgZnVuY3Rpb24gaW5pdCAoY29udmVydGVyLCBkZWZhdWx0QXR0cmlidXRlcykge1xuICAgIGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICAgIHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcbiAgICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcbiAgICAgICAgLy8gLi4uXG4gICAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgICAgLy8gICAgIGNoYXJhY3RlcjpcbiAgICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIC4uLlxuICAgICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgIGtleSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwga2V5KSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQgKGtleSkge1xuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIWtleSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcbiAgICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICAgIHZhciBqYXIgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBmb3VuZEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgICAgamFyW2ZvdW5kS2V5XSA9IGNvbnZlcnRlci5yZWFkKHZhbHVlLCBmb3VuZEtleSk7XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSBmb3VuZEtleSkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXkgPyBqYXJba2V5XSA6IGphclxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBzZXQ6IHNldCxcbiAgICAgICAgZ2V0OiBnZXQsXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgIHNldChcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xuICAgICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhDb252ZXJ0ZXI6IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICAgIGNvbnZlcnRlcjogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShjb252ZXJ0ZXIpIH1cbiAgICAgIH1cbiAgICApXG4gIH1cblxuICB2YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbiAgLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuICByZXR1cm4gYXBpO1xuXG59KSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgZ2V0R2xvYmFsID0gZnVuY3Rpb24gKCkge1xuXHQvLyB0aGUgb25seSByZWxpYWJsZSBtZWFucyB0byBnZXQgdGhlIGdsb2JhbCBvYmplY3QgaXNcblx0Ly8gYEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKClgXG5cdC8vIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIENTUCB2aW9sYXRpb25zIGluIENocm9tZSBhcHBzLlxuXHRpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBzZWxmOyB9XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgeyByZXR1cm4gd2luZG93OyB9XG5cdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZ2xvYmFsOyB9XG5cdHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG59XG5cbnZhciBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZ2xvYmFsLmZldGNoO1xuXG4vLyBOZWVkZWQgZm9yIFR5cGVTY3JpcHQgYW5kIFdlYnBhY2suXG5pZiAoZ2xvYmFsLmZldGNoKSB7XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGdsb2JhbC5mZXRjaC5iaW5kKGdsb2JhbCk7XG59XG5cbmV4cG9ydHMuSGVhZGVycyA9IGdsb2JhbC5IZWFkZXJzO1xuZXhwb3J0cy5SZXF1ZXN0ID0gZ2xvYmFsLlJlcXVlc3Q7XG5leHBvcnRzLlJlc3BvbnNlID0gZ2xvYmFsLlJlc3BvbnNlOyIsImltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuXG5pbXBvcnQgQ29va2llcyBmcm9tIFwianMtY29va2llXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcblxuLyoqXG4gKiBUaGUgYXZhaWxhYmxlIGRldmVsb3BlciBtb2Rlcy5cbiAqL1xuZXhwb3J0IGVudW0gRGV2ZWxvcGVyTW9kZVxue1xuXHQvKipcblx0ICogVGhlIGRlZmF1bHQgZGV2ZWxvcGVyIG1vZGUuIE5vIHRlc3RzIHdpbGwgYmUgZXhlY3V0ZWQgYW5kIFxuXHQgKiBhbnkgdGVzdCByZWxhdGVkIGRhdGEgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKi9cblx0UHJvZHVjdGlvbixcblx0LyoqXG5cdCAqIEZvciB1c2UgZHVyaW5nIGRldmVsb3BtZW50L2RlYnVnZ2luZy4gQWxsIHRlc3QgZGF0YSB3aWxsIFxuXHQgKiBiZSBjb2xsZWN0ZWQgYW5kIGV4ZWN1dGVkIGlmIG5lY2Vzc2FyeS5cblx0ICovXG5cdERldmVsb3BtZW50XG59XG5cbi8qKlxuICogQSBDU1Mgb2JqZWN0IHRvIGVtYmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENTU09iamVjdFxue1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgQ1NTIGZpbGUgdG8gZW1iZWQuXG5cdCAqL1xuXHR1cmw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBpbnRlZ3JpdHkgaGFzaCB0byBnZW5lcmF0ZSBkdXJpbmcgaW5pdGlhbCBjb21waWxhdGlvbi5cblx0ICovXG5cdGludGVncml0eUhhc2g6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgYXBpIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3Rcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50bHkgZ2VuZXJhdGVkIHBhZ2UgYmVpbmcgZGlzcGxheWVkLiBUaGlzIGlzIGNsZWFyZWQgYmV0d2VlbiBldmVyeSBmaWxlIHByb2Nlc3NlZC5cblx0ICovXG5cdHN0YXRpYyBDdXJyZW50UGFnZTogSG90UGFnZSA9IG51bGw7XG5cdC8qKlxuXHQgKiBUaGUgYXJndW1lbnRzIHBhc3NlZC5cblx0ICovXG5cdHN0YXRpYyBBcmd1bWVudHM6IGFueSA9IG51bGw7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiBJZiBpdCdzIHNldCB0byBkZXZlbG9wbWVudCBtb2RlLCBhbGwgdGVzdGluZ1xuXHQgKiByZWxhdGVkIGRhdGEgd2lsbCBiZSBjb2xsZWN0ZWQsIHBhcnNlZCwgYW5kIGV4ZWN1dGVkIGlmIG5lY2Vzc2FyeS5cblx0ICovXG5cdHN0YXRpYyBIb3RUZXN0RWxlbWVudCA9IEhvdFRlc3RFbGVtZW50O1xuXHQvKipcblx0ICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiBJZiBpdCdzIHNldCB0byBkZXZlbG9wbWVudCBtb2RlLCBhbGwgdGVzdGluZ1xuXHQgKiByZWxhdGVkIGRhdGEgd2lsbCBiZSBjb2xsZWN0ZWQsIHBhcnNlZCwgYW5kIGV4ZWN1dGVkIGlmIG5lY2Vzc2FyeS5cblx0ICovXG5cdHN0YXRpYyBNb2RlOiBEZXZlbG9wZXJNb2RlID0gRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uO1xuXHQvKipcblx0ICpUaGUgY3VycmVudCBBUEkgdXNlZCBvbiB0aGlzIHBhZ2UuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFQSTogSG90QVBJID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBBUEkgYmVpbmcgdXNlZCBieSB0aGUgdGVzdGVyLlxuXHQgKi9cblx0c3RhdGljIFRlc3RlckFQSTogSG90QVBJID0gbnVsbDtcblx0LyoqXG5cdCAqIENvbnRhaW5zIHRoZSBidWZmZXIgdG8gb3V0cHV0LiBUaGlzIGlzIGNsZWFyZWQgYmV0d2VlbiBldmVyeSBmaWxlIHByb2Nlc3NlZC5cblx0ICovXG5cdHN0YXRpYyBPdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YSB0byBzaGFyZSBhY3Jvc3MgYWxsIHRoZSBkaWZmZXJlbnQgZmlsZXMgYW5kIHBhZ2VzLiBUaGlzIGRhdGEgd2lsbCBiZSBwdWJsaWMuXG5cdCAqL1xuXHRzdGF0aWMgRGF0YTogYW55ID0ge307XG5cdC8qKlxuXHQgKiBUaGUgY29va2llcyB0byB1c2UgYmV0d2VlbiBwYWdlcy5cblx0ICovXG5cdHN0YXRpYyBDb29raWVzOiBDb29raWVzLkNvb2tpZXNTdGF0aWMgPSBDb29raWVzO1xuXHQvKipcblx0ICogQW55IHB1YmxpYyBrZXlzIHRoYXQgbmVlZCB0byBiZSBzaG93bi4gVGhlc2UgY2FuIGJlIHBhc3NlZCBmcm9tIEhvdFNpdGUuanNvbi5cblx0ICovXG5cdHN0YXRpYyBQdWJsaWNLZXlzOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBDU1Mgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBDU1MgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMgY3NzU3RyOiBzdHJpbmcgPSBgPGxpbmsgcmVsID0gXCJzdHlsZXNoZWV0XCIgaHJlZiA9IFwiJUNTU19GSUxFJVwiIC8+YDtcblx0LyoqXG5cdCAqIFRoZSBDU1MgZmlsZXMgdG8gdXNlIGluIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKiBcblx0ICogQHRvZG8gTWFrZSB0aGlzIGEgXCJzdHJpbmcgfCBDU1NPYmplY3RcIiBkYXRhIHR5cGUgc28gaXQgY2FuIGFsc28gaW5jbHVkZSBcblx0ICogdGhlIGludGVncml0eSBoYXNoZXMgYXMgd2VsbC5cblx0ICovXG5cdHN0YXRpYyBDU1M6IHN0cmluZ1tdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IEpTRmlsZU9iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIEpTRmlsZXM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBpbmxpbmUgY29kZSB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgSlNTY3JpcHRzOiBhbnlbXSA9IFtdO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzRmlsZVN0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIlSlNfRklMRSVcIj48L3NjcmlwdD5gO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzU2NyaXB0c1N0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+JUpTX0NPREUlPC9zY3JpcHQ+YDtcblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGUgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBsb3dlckZpbGU6IHN0cmluZyA9IGZpbGUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgZG9lcyBub3QgaGF2ZSBhIG5haGZhbSwgYWRkIGl0LiBUaGlzIFxuXHRcdFx0XHQvLyB3aWxsIGVuc3VyZSB0aGUgc2VydmVyIHNlbmRzIG9ubHkgdGhlIGZpbGUgY29udGVudC5cblx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIi5ob3R0XCIpID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwibmFoZmFtXCIpIDwgMClcblx0XHRcdFx0XHRcdGZpbGUgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0SG90LmVjaG8gKGF3YWl0IEhvdC5nZXRGaWxlIChmaWxlLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5jbHVkZSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGZvciB1c2Ugd2hlbiBydW5uaW5nIHRoZSBwcmVwcm9jZXNzb3IuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW5jbHVkZUpTIChmaWxlOiBzdHJpbmcpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGNvbnN0IHJlcyA9IGF3YWl0IEhvdC5odHRwUmVxdWVzdCAoZmlsZSk7XG5cdFx0Y29uc3Qgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCByZXMudGV4dCAoKTtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0ZXZhbC5hcHBseSAod2luZG93LCBbb3V0cHV0XSk7XG5cdFx0ZWxzZVxuXHRcdFx0ZXZhbCAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYW4gYWxyZWFkeSBsb2FkZWQgZmlsZSBhbmQgZWNobyBvdXQgaXQncyBjb250ZW50cy5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBydW5GaWxlIChmaWxlTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0RmlsZSAoZmlsZU5hbWUpO1xuXHRcdC8vLyBAZml4bWUgRG9lcyB0aGUgZmlsZSBuZWVkIHRvIGJlIGRlZXAgY2xvbmVkIGZpcnN0P1xuXHRcdC8vbGV0IGNsb25lZEZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoT2JqZWN0LmFzc2lnbiAoe30sIGZpbGUpKTtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBmaWxlO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgY29udGVudCBvZiBhIGZpbGUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZ2V0RmlsZSAocGF0aDogSG90RmlsZSB8IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGF0aCkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGVtcEZpbGUgPSBuZXcgSG90RmlsZSAoKTtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHRcdHRlbXBGaWxlLnVybCA9IHBhdGg7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRlbXBGaWxlLmxvY2FsRmlsZSA9IHBhdGg7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRlbXBGaWxlID0gcGF0aDtcblxuXHRcdGF3YWl0IHRlbXBGaWxlLmxvYWQgKCk7XG5cblx0XHR0ZW1wRmlsZS5wYWdlID0gdGhpcy5DdXJyZW50UGFnZTtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGVtcEZpbGUucHJvY2VzcyAoYXJncyk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYW4gYXBpIGNhbGwuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgYXBpQ2FsbCAocm91dGU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgXG5cdFx0aHR0cE1ldGhvZDogc3RyaW5nID0gXCJQT1NUXCIsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGlzIG51bGwhXCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGFwaSBpcyBudWxsISBEaWQgeW91IGZvcmdldCB0byBzZXQgdGhlIEFQSSBuYW1lIG9yIFVSTD9cIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRyZXN1bHQgPSBhd2FpdCBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaS5tYWtlQ2FsbCAocm91dGUsIFxuXHRcdFx0XHRcdFx0XHRkYXRhLCBodHRwTWV0aG9kLCBmaWxlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIEpTT04gcmVxdWVzdC5cblx0ICogXG5cdCAqIEBwYXJhbSB1cmwgVGhlIGZ1bGwgdXJsIHRvIG1ha2UgdGhlIEhUVFAgY2FsbC5cblx0ICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gSlNPTi5zdHJpbmdpZnkgYW5kIHNlbmQuXG5cdCAqIEBwYXJhbSBodHRwTWV0aG9kIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgdG8gc2VuZCB0aGUgZGF0YS5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJzZWQgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMganNvblJlcXVlc3QgKHVybDogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBodHRwTWV0aG9kOiBzdHJpbmcgPSBcIlBPU1RcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0bGV0IGZldGNoT2JqID0ge1xuXHRcdFx0XHRcIm1ldGhvZFwiOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRcImhlYWRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGh0dHBNZXRob2QgPT09IFwiUE9TVFwiKVxuXHRcdFx0e1xuXHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRmZXRjaE9ialtcImJvZHlcIl0gPSBKU09OLnN0cmluZ2lmeSAoZGF0YSk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsLCBmZXRjaE9iaik7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0cmV0dXJuIChKU09OLnN0cmluZ2lmeSAoeyBcImVycm9yXCI6IGAke2V4Lm1lc3NhZ2V9IC0gQ291bGQgbm90IGZldGNoICR7dXJsfWAgfSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCByZXF1ZXN0LiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBmb3IgZmV0Y2guXG5cdCAqIFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSB7UmVxdWVzdEluaXR9IHJlcXVlc3RJbml0IFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gc2VuZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBIVFRQIHJlc3BvbnNlLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGh0dHBSZXF1ZXN0ICh1cmw6IHN0cmluZywgcmVxdWVzdEluaXQ6IGFueSA9IHVuZGVmaW5lZCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHJlcXVlc3RJbml0KTtcblxuXHRcdHJldHVybiAocmVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCBzb21lIG91dHB1dC5cblx0ICovXG5cdHN0YXRpYyBlY2hvIChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRIb3QuT3V0cHV0ICs9IG1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgdGhlIENTUyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUNTUyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuQ1NTLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjc3NGaWxlOiBzdHJpbmcgPSBIb3QuQ1NTW2lJZHhdO1xuXHRcdFx0bGV0IGNzc091dDogc3RyaW5nID0gSG90LmNzc1N0cjtcblxuXHRcdFx0Y3NzT3V0ID0gY3NzT3V0LnJlcGxhY2UgKC9cXCVDU1NfRklMRVxcJS9nLCBjc3NGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGNzc091dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBmaWxlcyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTRmlsZXMgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkpTRmlsZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzRmlsZTogc3RyaW5nID0gSG90LkpTRmlsZXNbaUlkeF07XG5cdFx0XHRsZXQganNGaWxlT3V0OiBzdHJpbmcgPSBIb3QuanNGaWxlU3RyO1xuXG5cdFx0XHRqc0ZpbGVPdXQgPSBqc0ZpbGVPdXQucmVwbGFjZSAoL1xcJUpTX0ZJTEVcXCUvZywganNGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGpzRmlsZU91dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBzY3JpcHRzIGZvciB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwbGF5SlNTY3JpcHRzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU1NjcmlwdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzU2NyaXB0OiBzdHJpbmcgPSBIb3QuSlNTY3JpcHRzW2lJZHhdO1xuXHRcdFx0bGV0IGpzU2NyaXB0T3V0OiBzdHJpbmcgPSBIb3QuanNTY3JpcHRzU3RyO1xuXG5cdFx0XHRqc1NjcmlwdE91dCA9IGpzU2NyaXB0T3V0LnJlcGxhY2UgKC9cXCVKU19DT0RFXFwlL2csIGpzU2NyaXB0KTtcblxuXHRcdFx0SG90LmVjaG8gKGpzU2NyaXB0T3V0KTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCBGb3JtRGF0YSBmcm9tIFwiZm9ybS1kYXRhXCI7XG5cbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdERCIH0gZnJvbSBcIi4vSG90REJcIjtcblxuaW1wb3J0IHsgSG90REJTY2hlbWEgfSBmcm9tIFwiLi9zY2hlbWFzL0hvdERCU2NoZW1hXCI7XG5cbi8qKlxuICogVGhlIEFQSSB0byBsb2FkLlxuICovXG5leHBvcnQgdHlwZSBBUEl0b0xvYWQgPSB7XG5cdGV4cG9ydGVkQ2xhc3NOYW1lOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbiB9O1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIG9iamVjdCB0byB1c2UgZHVyaW5nIGV2ZW50IGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50RXhlY3V0aW9uVHlwZVxue1xuXHRIb3RSb3V0ZSxcblx0SG90TWV0aG9kLFxuXHRIb3RBUElcbn1cblxuLyoqXG4gKiBUaGUgQVBJIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdEFQSVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciBjb25uZWN0aW9uLlxuXHQgKi9cblx0Y29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50O1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBBUEkuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIGZvciB0aGUgc2VydmVyLlxuXHQgKi9cblx0YmFzZVVybDogc3RyaW5nO1xuXHQvKipcblx0ICogSWYgc2V0LCB0aGlzIHdpbGwgY3JlYXRlIHRoZSByb3V0ZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBmb3IgXG5cdCAqIGVhc3kgY2xpZW50L3NlcnZlciBjYWxsaW5nLlxuXHQgKi9cblx0Y3JlYXRlRnVuY3Rpb25zOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRleGVjdXRlRXZlbnRzVXNpbmc6IEV2ZW50RXhlY3V0aW9uVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0ZGI6IEhvdERCO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gdXNlIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLiBJZiB1c2luZyBcblx0ICogYmFzaWMgYXV0aGVudGljYXRpb24gZm9yIEhUVFAgcmVxdWVzdHMsIGJlIHN1cmUgdG8gb3ZlcnJpZGUgdGhlIFxuXHQgKiBgdG9BdXRob3JpemF0aW9uSGVhZGVyU3RyaW5nYCBpbiB0aGlzIG9iamVjdC5cblx0ICogXG5cdCAqIEV4YW1wbGUgb2YgdGhpcyBvYmplY3Q6XG5cdCAqIGBgYHRzXG5cdCAqIHRoaXMuYXV0aENyZWRlbnRpYWxzID0ge1xuXHQgKiBcdFx0dXNlcjogXCJ1c2VybmFtZVwiLFxuXHQgKiBcdFx0cGFzc3dvcmQ6IFwicGFzc3dvcmRcIixcblx0ICogXHRcdHRvQXV0aG9yaXphdGlvbkhlYWRlclN0cmluZzogZnVuY3Rpb24gKClcblx0ICogXHRcdFx0e1xuXHQgKiBcdFx0XHRcdHJldHVybiAoYnRvYSAodGhpcy51c2VyICsgXCI6XCIgKyB0aGlzLnBhc3N3b3JkKSk7XG5cdCAqIFx0XHRcdH1cblx0ICogXHR9O1xuXHQgKiBgYGBcblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uXG5cdCAqL1xuXHR1c2VyQXV0aDogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyb3V0ZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFJvdXRlIH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaXMgYWJvdXQgdG8gc3RhcnQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhlIEFQSSBoYXMgZmluaXNoZWQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IEhvdERCID0gbnVsbClcblx0e1xuXHRcdHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cdFx0dGhpcy5kZXNjcmlwdGlvbiA9IFwiXCI7XG5cdFx0dGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0XHR0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9IHRydWU7XG5cdFx0dGhpcy5leGVjdXRlRXZlbnRzVXNpbmcgPSBFdmVudEV4ZWN1dGlvblR5cGUuSG90Um91dGU7XG5cdFx0dGhpcy5kYiA9IGRiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLnVzZXJBdXRoID0gbnVsbDtcblx0XHR0aGlzLnJvdXRlcyA9IHt9O1xuXHRcdHRoaXMub25QcmVSZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgZm9yIHVzZS5cblx0ICovXG5cdHNldERCU2NoZW1hIChzY2hlbWE6IEhvdERCU2NoZW1hKTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIEFQSSBoYXMgYmVlbiBzZXQhYCk7XG5cblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSA9IHNjaGVtYTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQiAoKTogSG90REJcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCU2NoZW1hICgpOiBIb3REQlNjaGVtYVxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm91dGUuIElmIHRoaXMuY3JlYXRlRnVuY3Rpb25zIGlzIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgdGFrZSB0aGUgaW5jb21pbmcgXG5cdCAqIHJvdXRlIGFuZCBjcmVhdGUgYW4gb2JqZWN0IGluIHRoaXMgSG90QVBJIG9iamVjdCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuIElmIHRoZXJlJ3MgXG5cdCAqIGFueSBIb3RSb3V0ZU1ldGhvZHMgaW5zaWRlIG9mIHRoZSBpbmNvbWluZyBIb3RSb3V0ZSwgaXQgd2lsbCBjcmVhdGUgdGhlIG1ldGhvZHMgXG5cdCAqIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUgbmV3bHkgY3JlYXRlZCBIb3RSb3V0ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBFeGFtcGxlOlxuXHQgKiBgYGBcblx0ICogZXhwb3J0IGNsYXNzIFVzZXJzIGV4dGVuZHMgSG90Um91dGVcblx0ICoge1xuXHQgKiBcdFx0Y29uc3RydWN0b3IgKGFwaTogRnJlZUxpZ2h0QVBJKVxuXHQgKiBcdFx0e1xuXHQgKiBcdFx0XHRzdXBlciAoYXBpLmNvbm5lY3Rpb24sIFwidXNlclwiKTtcblx0ICogXG5cdCAqIFx0XHRcdHRoaXMuYWRkTWV0aG9kIChcImNyZWF0ZVwiLCB0aGlzLl9jcmVhdGUsIEhUVFBNZXRob2QuUE9TVCk7XG5cdCAqIFx0XHR9XG5cdCAqIFxuXHQgKiBcdFx0cHJvdGVjdGVkIGFzeW5jIF9jcmVhdGUgKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSk6IFByb21pc2U8YW55PlxuXHQgKiBcdFx0e1xuXHQgKiBcdFx0XHRyZXR1cm4gKHRydWUpO1xuXHQgKiBcdFx0fVxuXHQgKiB9XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhpcyBpbiB0dXJuIGNvdWxkIGJlIHVzZWQgbGlrZSBzbzpcblx0ICogYGBgXG5cdCAqIEhvdC5BUEkudXNlci5jcmVhdGUgKHt9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBBZGRpdGlvbmFsbHkgaXQgd291bGQgY3JlYXRlIHRoZSBlbmRwb2ludDogYGBgaHR0cDovLzEyNy4wLjAuMTo4MDgwL3YxL3VzZXIvY3JlYXRlYGBgXG5cdCAqIFxuXHQgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGFkZC4gQ2FuIGJlIGVpdGhlciBhIGZ1bGwgSG90Um91dGUgb2JqZWN0LCBvciBqdXN0IFxuXHQgKiB0aGUgcm91dGUncyBuYW1lLiBJZiBhIEhvdFJvdXRlIG9iamVjdCBpcyBzdXBwbGllZCwgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgXG5cdCAqIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHBhcmFtIHJvdXRlTWV0aG9kIFRoZSByb3V0ZSdzIG1ldGhvZCB0byBhZGQuIElmIHRoZSByb3V0ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIFxuXHQgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoZSByb3V0ZSdzIG5hbWUsIGFuZCB0aGlzIHdpbGwgYmUgdGhlIG1ldGhvZCBhZGRlZCB0byBcblx0ICogdGhlIG5ldyByb3V0ZS5cblx0ICogQHBhcmFtIGV4ZWN1dGVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHJvdXRlTWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgQVBJLlxuXHQgKi9cblx0YWRkUm91dGUgKFxuXHRcdHJvdXRlOiBIb3RSb3V0ZSB8IHN0cmluZyxcblx0XHRyb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgfCBzdHJpbmcgPSBudWxsLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGxldCByb3V0ZU5hbWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocm91dGUgaW5zdGFuY2VvZiBIb3RSb3V0ZSlcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZS5yb3V0ZTtcblx0XHRcdHRoaXMucm91dGVzW3JvdXRlLnJvdXRlXSA9IHJvdXRlO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGU7XG5cblx0XHRcdGlmICh0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID09IG51bGwpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPSBuZXcgSG90Um91dGUgKHRoaXMuY29ubmVjdGlvbiwgcm91dGVOYW1lKTtcblxuXHRcdFx0aWYgKHJvdXRlTWV0aG9kIGluc3RhbmNlb2YgSG90Um91dGVNZXRob2QpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChyb3V0ZU1ldGhvZCk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChuZXcgSG90Um91dGVNZXRob2QgKFxuXHRcdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0sIHJvdXRlTWV0aG9kLCBleGVjdXRlRnVuY3Rpb24pKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb247XG5cblx0XHQvLyBDcmVhdGUgdGhlIHJvdXRlIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci9jbGllbnQuXG5cdFx0aWYgKHRoaXMuY3JlYXRlRnVuY3Rpb25zID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCBuZXdSb3V0ZTogeyBbbmFtZTogc3RyaW5nXTogRnVuY3Rpb24gfSA9IHRoaXNbcm91dGVOYW1lXTtcblxuXHRcdFx0aWYgKG5ld1JvdXRlID09IG51bGwpXG5cdFx0XHRcdG5ld1JvdXRlID0ge307XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY3VycmVudFJvdXRlOiBIb3RSb3V0ZSA9IHRoaXMucm91dGVzW3JvdXRlTmFtZV07XG5cdFx0XHRcdGxldCBuZXdSb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLm1ldGhvZHNbaUlkeF07XG5cblx0XHRcdFx0Lypcblx0XHRcdFx0Ly8vIEBmaXhtZSBJcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/IEEgSFRUUCBjYWxsIGlzIG11Y2ggbW9yZSBwcmVmZXJhYmxlLCBcblx0XHRcdFx0Ly8vIGVzcGVjaWFsbHkgZm9yIGFjY3J1YXRlIHRlc3RpbmcuXG5cdFx0XHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2Qub25TZXJ2ZXJFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlKi9cblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0Ly8vIEBmaXhtZSBJcyBvbkNsaWVudEV4ZWN1dGUgbmVjZXNzYXJ5PyBJJ20gdGhpbmtpbmcgdGhlIGRldiBjYW4ganVzdCBzaW1wbHkgY3JlYXRlIFxuXHRcdFx0XHRcdC8vLyB0aGVpciBvd24gZnVuY3Rpb24gdG8gY2FsbC5cblx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2Qub25DbGllbnRFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0eyovXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IChkYXRhOiBhbnksIGZpbGVzOiBhbnkpOiBhbnkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBodHRwTWV0aG9kOiBzdHJpbmcgPSBuZXdSb3V0ZU1ldGhvZC50eXBlO1xuXHRcdFx0XHRcdFx0XHRcdC8vIENvbnN0cnVjdCB0aGUgdXJsIGhlcmUuIEJhc2UgKyByb3V0ZSArIHJvdXRlIG1ldGhvZFxuXHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Um91dGUudmVyc2lvbiAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtjdXJyZW50Um91dGUudmVyc2lvbn1gO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRSb3V0ZS5yb3V0ZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtjdXJyZW50Um91dGUucm91dGV9YDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5uYW1lICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0cm91dGVTdHIgKz0gYC8ke25ld1JvdXRlTWV0aG9kLm5hbWV9YDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZXR0aW5nIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZyb20gdGhlIEFQSSBpcyB0aGUgbG93ZXN0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIHByaW9yaXR5IGZvciBnZXR0aW5nIGNyZWRlbnRpYWxzLiBUaGUgcHJpb3JpdGllcyBhcmUgaW4gdGhpcyBvcmRlcjogXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMS4gSG90Um91dGVNZXRob2Rcblx0XHRcdFx0XHRcdFx0XHQvLyAyLiBIb3RSb3V0ZVxuXHRcdFx0XHRcdFx0XHRcdC8vIDMuIEhvdEFQSVxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gdGhpcy5hdXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzLiBQcmlvcml0aXplIHRoZW0gd2hlbiB0aGV5J3JlIFxuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBtZXRob2QuIE9ubHkgYWRkIHRoZSBvbmVzIGZyb20gdGhlIHJvdXRlIGlmIHRoZSBvbmVzIGZyb20gXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIG1ldGhvZCBhcmUgbWlzc2luZy5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBuZXdSb3V0ZU1ldGhvZC5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5yb3V0ZS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2Qucm91dGUuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhdXRoQ3JlZGVudGlhbHMgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHRoZSBkYXRhIGJlaW5nIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gYXV0aENyZWRlbnRpYWxzKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWw6IGFueSA9IGF1dGhDcmVkZW50aWFsc1trZXldO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGtleXMgaW4gdGhlIGRhdGEgYWJvdXQgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRvIGJlIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhW2tleV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW2tleV0gPSBhdXRoQ3JlZGVudGlhbDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXJnczogYW55W10gPSBbcm91dGVTdHIsIGRhdGEsIGh0dHBNZXRob2QsIGZpbGVzXTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5tYWtlQ2FsbC5hcHBseSAodGhpcywgYXJncykpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdC8vfVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHRoaXNbcm91dGVOYW1lXSA9IG5ld1JvdXRlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGUgKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVnaXN0ZXJSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGFsbCByb3V0ZXMgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZXMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnJvdXRlcylcblx0XHR7XG5cdFx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5yb3V0ZXNba2V5XTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBjYWxsIHRvIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBtYWtlQ2FsbCAocm91dGU6IHN0cmluZywgZGF0YTogYW55LCBodHRwTWV0aG9kOiBzdHJpbmcgPSBcIlBPU1RcIiwgXG5cdFx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30pOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVVybDtcblxuXHRcdGh0dHBNZXRob2QgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0aWYgKHVybFsodXJsLmxlbmd0aCAtIDEpXSA9PT0gXCIvXCIpXG5cdFx0XHR1cmwgPSB1cmwuc3Vic3RyICgwLCAodXJsLmxlbmd0aCAtIDEpKTtcblxuXHRcdGlmIChyb3V0ZVswXSAhPT0gXCIvXCIpXG5cdFx0XHR1cmwgKz0gXCIvXCI7XG5cblx0XHR1cmwgKz0gcm91dGU7XG5cblx0XHRjb25zdCBudW1GaWxlczogbnVtYmVyID0gT2JqZWN0LmtleXMgKGZpbGVzKS5sZW5ndGg7XG5cblx0XHRpZiAobnVtRmlsZXMgPiAwKVxuXHRcdHtcblx0XHRcdGlmIChodHRwTWV0aG9kICE9PSBcIlBPU1RcIilcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVG8gdXBsb2FkIGZpbGVzLCB5b3UgbXVzdCBzZXQgdGhlIGh0dHBNZXRob2QgdG8gUE9TVC5gKTtcblxuXHRcdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhICgpO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0XHRcdGZvcm1EYXRhLmFwcGVuZCAoa2V5LCBmaWxlc1trZXldKTtcblxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRib2R5OiBmb3JtRGF0YVxuXHRcdFx0XHR9KTtcblx0XHRcdGxldCBqc29uUmVzOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0aWYgKGRhdGFbXCJob3RzdGFxXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdID0ge307XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl0gPT0gbnVsbClcblx0XHRcdFx0ZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID0ge307XG5cblx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdID0gXG5cdFx0XHRcdFx0anNvblJlc1tcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdW1widXBsb2FkSWRcIl07XG5cblx0XHRcdC8vIEFmdGVyIHRoZSB1cGxvYWQsIG1ha2UgdGhlIGFjdHVhbCBKU09OIGNhbGwuIERvIG5vdCBwYXNzIGZpbGVzIGFnYWluLlxuXHRcdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLm1ha2VDYWxsIChyb3V0ZSwgZGF0YSwgaHR0cE1ldGhvZCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRsZXQgZmV0Y2hPYmo6IGFueSA9IHtcblx0XHRcdFx0bWV0aG9kOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICgoaHR0cE1ldGhvZCAhPT0gXCJHRVRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZCAhPT0gXCJIRUFEXCIpKVxuXHRcdHtcblx0XHRcdGZldGNoT2JqW1wiYm9keVwiXSA9IEpTT04uc3RyaW5naWZ5IChkYXRhKTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PiBcblx0XHRcdHtcblx0XHRcdFx0ZmV0Y2ggKHVybCwgZmV0Y2hPYmopLnRoZW4gKGFzeW5jIChyZXMpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGpzb25PYmo6IGFueSA9IGF3YWl0IHJlcy5qc29uICgpO1xuXHRcdFxuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoanNvbk9iaik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2ggKChyZWFzb246IGFueSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3VybH06ICR7cmVhc29uLm1lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocHJvbWlzZSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlclR5cGUgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIEEgY2xpZW50IGNvbm5lY3RlZCB0byBhIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdENsaWVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBBUEkgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyQVBJOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG5cdCAqL1xuXHR0eXBlOiBIb3RTZXJ2ZXJUeXBlO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEpXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0dGhpcy50ZXN0ZXJBUEkgPSBudWxsO1xuXHRcdHRoaXMudHlwZSA9IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90Q29tcG9uZW50T3V0cHV0XG57XG5cdC8qKlxuXHQgKiBUaGUgSFRNTCB0byBvdXRwdXQuXG5cdCAqL1xuXHRodG1sOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcXVlcnkgc2VsZWN0b3IgdG8gYWRkIHRoaXMgY29tcG9uZW50J3MgZnVuY3Rpb25zIHRvLlxuXHQgKiBcblx0ICogQGV4YW1wbGUgI29iamVjdElkXG5cdCAqL1xuXHRhZGRGdW5jdGlvbnNUbz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwbGFjZSBoZXJlIHBhcmVudCBuYW1lIHRvIGF0dGFjaCB0aGlzIGh0bWwgdG8uXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSB0b3Bcblx0ICovXG5cdHBsYWNlSGVyZVBhcmVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIEFwcGVuZCB0aGUgb3V0cHV0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBkaXYgLnRlc3RDbGFzc1xuXHQgKi9cblx0cGFyZW50U2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIEhUTUxFbGVtZW50cy5cblx0ICovXG5cdGh0bWxFbGVtZW50cz86IEhUTUxFbGVtZW50W107XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9ucz86IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIEFueSBleHRyYSBhdHRyaWJ1dGVzIHRvIHJlZ2lzdGVyLlxuXHQgKi9cblx0b2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBpbm5lciBIVE1MIG9yIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRpbm5lcjogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9ucz86IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBvdXRwdXQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBJZiBzZXQgdG8gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlT3V0cHV0PzogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgZ2V0dGluZyB0aGUgb3V0cHV0LCBidXQgYmVmb3JlIHRoZSBET00gcGFyc2luZy5cblx0ICogXG5cdCAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgbGFzdCB0aW1lIHByaW9yIHRvIFxuXHQgKiBiZWluZyBwYXJzZWQgaW50byBhIERPTSBlbGVtZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIG91dHB1dCB0byBiZSBwYXJzZWQgYXMgYSBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUG9zdE91dHB1dD86IChvdXRwdXQ6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSkpID0+IFByb21pc2U8KHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKT47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdoZW4gaXRzIHRpbWUgdG8gZml4IHRoZSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIHdpbGwgc2tpcCB0aGUgSG90U3RhcSBkZWZhdWx0IGZpeGluZy5cblx0ICovXG5cdG9uRml4SFRNTD86IChvdXRwdXQ6IHN0cmluZykgPT4gUHJvbWlzZTx7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfT47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY3VzdG9tIERPTSBwYXJzZXIuXG5cdCAqL1xuXHRvblBhcnNlRE9NPzogKG91dHB1dDogc3RyaW5nKSA9PiBQcm9taXNlPERvY3VtZW50Pjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBwYXJzZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBET00uXG5cdCAqL1xuXHRvblBhcnNlZD86IChvdXRwdXQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblByZVBsYWNlPzogKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gUHJvbWlzZTxIVE1MRWxlbWVudD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBmaW5hbCB0aW1lIHByaW9yIHRvIGJlaW5nIHJlbmRlcmVkLlxuXHQgKi9cblx0b25Qb3N0UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IFByb21pc2U8SFRNTEVsZW1lbnQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBET00gZWxlbWVudCBvbnRvIHRoZSBuZXdseSBjcmVhdGVkIHBhcmVudC5cblx0ICovXG5cdG9uUGFyZW50UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdENvbXBvbmVudCBpbXBsZW1lbnRzIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnRzLlxuXHQgKi9cblx0aHRtbEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogQW55IGV4dHJhIGF0dHJpYnV0ZXMgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgY29tcG9uZW50LlxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIGlubmVyIEhUTUwgb3IgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGlubmVyOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXZlbnRzIHRvIHRyaWdnZXIuXG5cdCAqL1xuXHRldmVudHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0XHRcdGZ1bmM6IEZ1bmN0aW9uO1xuXHRcdFx0XHRvcHRpb25zOiBhbnk7XG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gb3V0cHV0LlxuXHQgKiBcblx0ICogQHJldHVybnMgSWYgc2V0IHRvIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZU91dHB1dD86ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIGdldHRpbmcgdGhlIG91dHB1dCwgYnV0IGJlZm9yZSB0aGUgRE9NIHBhcnNpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGxhc3QgdGltZSBwcmlvciB0byBcblx0ICogYmVpbmcgcGFyc2VkIGludG8gYSBET00gZWxlbWVudC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBmaW5hbCBvdXRwdXQgdG8gYmUgcGFyc2VkIGFzIGEgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblBvc3RPdXRwdXQ/OiAob3V0cHV0OiAoc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W10pKSA9PiBQcm9taXNlPChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk+O1xuXHQvKipcblx0ICogRXhlY3V0ZSB3aGVuIGl0cyB0aW1lIHRvIGZpeCB0aGUgSFRNTCBwcmlvciB0byBET00gcGFyc2luZy4gVGhpcyB3aWxsIHNraXAgdGhlIEhvdFN0YXEgZGVmYXVsdCBmaXhpbmcuXG5cdCAqL1xuXHRvbkZpeEhUTUw/OiAob3V0cHV0OiBzdHJpbmcpID0+IFByb21pc2U8eyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH0+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhIGN1c3RvbSBET00gcGFyc2VyLlxuXHQgKi9cblx0b25QYXJzZURPTT86IChvdXRwdXQ6IHN0cmluZykgPT4gUHJvbWlzZTxEb2N1bWVudD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHRoZSBvdXRwdXQgaGFzIGJlZW4gcGFyc2VkIGFuZCBpcyByZWFkeSB0byBiZSBwbGFjZWQgaW50byB0aGUgRE9NLlxuXHQgKi9cblx0b25QYXJzZWQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25QcmVQbGFjZT86IChodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IFByb21pc2U8SFRNTEVsZW1lbnQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgZmluYWwgdGltZSBwcmlvciB0byBiZWluZyByZW5kZXJlZC5cblx0ICovXG5cdG9uUG9zdFBsYWNlPzogKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBQcm9taXNlPEhUTUxFbGVtZW50Pjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgRE9NIGVsZW1lbnQgb250byB0aGUgbmV3bHkgY3JlYXRlZCBwYXJlbnQuXG5cdCAqL1xuXHRvblBhcmVudFBsYWNlPzogKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKChjb3B5IGluc3RhbmNlb2YgSG90U3RhcSkgfHwgKGNvcHkgPT0gbnVsbCkpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudHMgPSBbXTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IFwiXCI7XG5cdFx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0XHR0aGlzLmVsZW1lbnRPcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdHRoaXMudHlwZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHRoaXMuaW5uZXIgPSBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weS5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLmh0bWxFbGVtZW50cyA9IGNvcHkuaHRtbEVsZW1lbnRzIHx8IFtdO1xuXHRcdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IGNvcHkudGFnIHx8IHRoaXMubmFtZTtcblx0XHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSBjb3B5LmVsZW1lbnRPcHRpb25zIHx8IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMub2JzZXJ2ZWRBdHRyaWJ1dGVzID0gY29weS5vYnNlcnZlZEF0dHJpYnV0ZXMgfHwgW107XG5cdFx0XHR0aGlzLnR5cGUgPSBjb3B5LnR5cGUgfHwgXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBjb3B5LnZhbHVlIHx8IG51bGw7XG5cdFx0XHR0aGlzLmlubmVyID0gY29weS5pbm5lciB8fCBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0aGlzLmFwaSA9IGFwaTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCB0aGF0J3MgY2FsbGVkIHdoZW4gdGhpcyBjb21wb25lbnQncyBET00gZWxlbWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIERPTSBlbGVtZW50LlxuXHQgKi9cblx0YXN5bmMgb25DcmVhdGVkIChlbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0cmV0dXJuIChlbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGF0dHJpYnV0ZXMgbWFudWFsbHkuXG5cdCAqL1xuXHRhc3luYyBoYW5kbGVBdHRyaWJ1dGVzPyAoYXR0cmlidXRlczogTmFtZWROb2RlTWFwKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSGFuZGxlIGEgY2xpY2sgZXZlbnQuXG5cdCAqL1xuXHRhYnN0cmFjdCBjbGljaz8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0YWJzdHJhY3Qgb3V0cHV0ICgpOiBQcm9taXNlPHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdPjtcbn0iLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5cbmltcG9ydCB7IERldmVsb3Blck1vZGUsIEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuLyoqXG4gKiBBIGZpbGUgdG8gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90RmlsZVxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCBwYWdlLlxuXHQgKi9cblx0cGFnZT86IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIGdldC5cblx0ICovXG5cdGxvY2FsRmlsZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9ycz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyc2VyIG9wdGlvbnMgZm9yIHdoZW4gcHJvY2Vzc2luZyBhIHN0cmluZyBvciBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlck9wdGlvbnNcbntcblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGZyb20gcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0b3V0cHV0Q29tbWFuZHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogQWxsb3cgSlNPTi5zdHJpbmdpZnkgdG8gYmUgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0YWxsb3dTdHJpbmdpZnk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90RmlsZSBpbXBsZW1lbnRzIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9yczogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdEZpbGUgPSB7fSlcblx0e1xuXHRcdHRoaXMucGFnZSA9IGNvcHkucGFnZSB8fCBudWxsO1xuXHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdHRoaXMudXJsID0gY29weS51cmwgfHwgXCJcIjtcblx0XHR0aGlzLmxvY2FsRmlsZSA9IGNvcHkubG9jYWxGaWxlIHx8IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gY29weS5jb250ZW50IHx8IFwiXCI7XG5cdFx0dGhpcy50aHJvd0FsbEVycm9ycyA9IGNvcHkudGhyb3dBbGxFcnJvcnMgfHwgZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdHNldENvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWRcblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdGdldENvbnRlbnQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIGdldCByZXF1ZXN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGh0dHBHZXQgKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCk7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzLnRleHQgKCk7XG5cblx0XHRcdHJldHVybiAoY29udGVudCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgdXJsLlxuXHQgKi9cblx0YXN5bmMgbG9hZFVybCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0aGlzLmNvbnRlbnQgPSBhd2FpdCBIb3RGaWxlLmh0dHBHZXQgKHRoaXMudXJsKTtcblxuXHRcdHJldHVybiAodGhpcy5jb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkTG9jYWxGaWxlICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBuZXcgUHJvbWlzZSAoXG5cdFx0XHQocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT5cblx0XHRcdHtcblx0XHRcdFx0ZnMucmVhZEZpbGUgKHRoaXMubG9jYWxGaWxlLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycjtcblxuXHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXNvbHZlICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gKHByb21pc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnVybCAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRVcmwgKCk7XG5cblx0XHRpZiAodGhpcy5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkTG9jYWxGaWxlICgpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHN0cmluZyBjb250ZW50LiBUaGlzIHdpbGwgdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzQ29udGVudCAoY29udGVudDogc3RyaW5nLCBjb250ZW50UmVnZXg6IFJlZ0V4cCxcblx0XHRjb250ZW50UHJvY2Vzc29yOiAocmVnZXhGb3VuZDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0b2ZmQ29udGVudFByb2Nlc3NvcjogKG9mZkNvbnRlbnQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG51bVJlbW92ZUZyb21CZWdpbm5pbmc6IG51bWJlciA9IDIsXG5cdFx0bnVtUmVtb3ZlRnJvbUVuZDogbnVtYmVyID0gMik6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHJlc3VsdDogUmVnRXhwRXhlY0FycmF5ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR3aGlsZSAocmVzdWx0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHN0YXJ0OiBudW1iZXIgPSByZXN1bHQuaW5kZXggLSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nO1xuXHRcdFx0bGV0IGVuZDogbnVtYmVyID0gY29udGVudFJlZ2V4Lmxhc3RJbmRleCArIG51bVJlbW92ZUZyb21FbmQ7XG5cblx0XHRcdC8vIEdldCB0aGUgcHJldmlvdXMgc2VjdGlvbi5cblx0XHRcdGxldCBwcmV2Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChzdGFydCAtIHByZXZpb3VzSW5kZXgpKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQ7XG5cblx0XHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChwcmV2Q29udGVudCk7XG5cblx0XHRcdC8vIFByb2Nlc3MgdGhlIGNvbnRlbnQgZm91bmQgZnJvbSB0aGUgcmVnZXhcblx0XHRcdGxldCBjb250ZW50Rm91bmQ6IHN0cmluZyA9IHJlc3VsdFswXTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChjb250ZW50Rm91bmQpO1xuXG5cdFx0XHQvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24gdG8gcGFyc2UuXG5cdFx0XHRyZXN1bHQgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW55IGNvbnRlbnQgdGhhdCBjb3VsZCBoYXZlIG5lc3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBcblx0ICogdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBmaXhtZSBOZWVkcyB0byBiZSBhYmxlIHRvIGlnbm9yZSBhbnkgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUgY29tbWVudHMgXG5cdCAqIG9yIGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBpcyB1c2VkIGBgYCR7XCJUZXN0IH1cIn1gYGAgSXQgXG5cdCAqIHdpbGwgZXJyb3Igb3V0LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycyk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IHN0YXJ0VHJpZ2dlclBvczogbnVtYmVyID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIHBvcyk7XG5cdFx0XHRsZXQgbmVzdGVkQ291bnRlcjogbnVtYmVyID0gMDtcblxuXHRcdFx0aWYgKHRyaWdnZXJDaGFyICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXZlcnNlIHNlYXJjaCB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFxuXHRcdFx0XHQvLyBvY2N1cnJlbmNlcy5cblx0XHRcdFx0bGV0IHJwb3M6IG51bWJlciA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBlbmQgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHR3aGlsZSAocnBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJwb3MgPT09IHN0YXJ0VHJpZ2dlclBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0cnBvcyA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBycG9zIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbmVzdGVkIHRyaWdnZXIgY2hhcmFjdGVycywgZ2V0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXG5cdFx0XHQvLyB0aGUgZW5kIGNoYXJhY3Rlci5cblx0XHRcdGlmIChuZXN0ZWRDb3VudGVyID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRsZXQgdGVtcGVwb3M6IG51bWJlciA9IGVwb3M7XG5cblx0XHRcdFx0d2hpbGUgKChlcG9zID4gLTEpICYmIChuZXN0ZWRDb3VudGVyID4gMCkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGVtcGVwb3MgPCAwKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGRpc2NvdmVyaW5nIGVuZENoYXJzIHRoYXQgd2Ugc2hvdWxkbid0IGJlLlxuXHRcdFx0XHRcdGxldCBwb3NPdXRzaWRlT2ZDb250ZW50OiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mIChzdGFydENoYXJzLCB0ZW1wZXBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXG5cdFx0XHRcdFx0aWYgKHBvc091dHNpZGVPZkNvbnRlbnQgPiBlcG9zKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRlcG9zID0gdGVtcGVwb3M7XG5cblx0XHRcdFx0XHR0ZW1wZXBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVwb3MgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0XHRuZXN0ZWRDb3VudGVyLS07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlbmQgPSBlcG9zO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb2ZmQ29udGVudFN0cjogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChwb3MgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAob2ZmQ29udGVudFN0cik7XG5cblx0XHRcdGxldCBmb3VuZENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChcblx0XHRcdFx0cG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZywgKGVuZCAtIChwb3MgKyBudW1SZW1vdmVGcm9tQmVnaW5uaW5nKSkpO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGZvdW5kQ29udGVudCk7XG5cblx0XHRcdC8vIEdldCB0aGUgbmV4dCBjb250ZW50XG5cdFx0XHRwb3MgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0c3RhcnRUcmlnZ2VyUG9zID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQgKyBudW1SZW1vdmVGcm9tRW5kO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBjb250ZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRoaXNDb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gdGhyb3dBbGxFcnJvcnMgSWYgc2V0IHRvIHRydWUsIGFueSBlcnJvciB0aGF0IG9jY3VycyB3aWxsIGJlIHRocm93biBhcyBhbiBleGNlcHRpb24uXG5cdCAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgdGhlIGNvbnRlbnQuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VDb250ZW50ICh0aGlzQ29udGVudDogc3RyaW5nLCB0aHJvd0FsbEVycm9yczogYm9vbGVhbiwgcGFyc2VyT3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGlmIChwYXJzZXJPcHRpb25zID09IG51bGwpXG5cdFx0e1xuXHRcdFx0cGFyc2VyT3B0aW9ucyA9IHtcblx0XHRcdFx0XHRvdXRwdXRDb21tYW5kczogdHJ1ZSxcblx0XHRcdFx0XHRhbGxvd1N0cmluZ2lmeTogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGxldCBTVFJJTkdJRllfU1RBUlQ6IHN0cmluZyA9IFwiSlNPTi5zdHJpbmdpZnkgKFwiO1xuXHRcdGxldCBTVFJJTkdJRllfRU5EOiBzdHJpbmcgPSBcIilcIjtcblxuXHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRTVFJJTkdJRllfU1RBUlQgPSBcIlwiO1xuXHRcdFx0U1RSSU5HSUZZX0VORCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQXNzZW1ibGUgdGhlIEpTIHRvIGV2YWx1YXRlLiBUaGlzIHdpbGwgdGFrZSBhbGwgY29udGVudCBvdXRzaWRlIG9mIFxuXHRcdC8vIDwqIGFuZCAqPiBhbmQgd3JhcCBhIEhvdC5lY2hvIGFyb3VuZCBpdC4gQW55IEpTIGZvdW5kIGluc2lkZSBvZiB0aGUgXG5cdFx0Ly8gPCogYW5kICo+IHdpbGwgYmUgZXhlY3V0ZWQgYXMgaXMuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzQ29udGVudCAodGhpc0NvbnRlbnQsIFxuXHRcdFx0bmV3IFJlZ0V4cCAoXCIoPz1cXFxcPFxcXFwqKShbXFxcXHNcXFxcU10qPykoPz1cXFxcKlxcXFw+KVwiLCBcImdcIiksIFxuXHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBIGxpdHRsZSBoYWNrLCBzaW5jZSBJIHN1Y2sgYXQgUmVnZXggOihcblx0XHRcdFx0cmVnZXhGb3VuZCA9IHJlZ2V4Rm91bmQuc3Vic3RyICgyKTtcblxuXHRcdFx0XHRyZXR1cm4gKGAke3JlZ2V4Rm91bmR9YCk7XG5cdFx0XHR9LCBcblx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKG9mZkNvbnRlbnQgPT09IFwiXCIpXG5cdFx0XHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0b2ZmQ29udGVudCwgXCIhe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQyOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0LCBcIlNUUntcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWVjaG9PdXRwdXQgKEpTT04uc3RyaW5naWZ5KCR7cmVnZXhGb3VuZDJ9KSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7U1RSSU5HSUZZX1NUQVJUfSR7cmVnZXhGb3VuZDJ9JHtTVFJJTkdJRllfRU5EfSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0MiwgXCIke1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhdHJ5IHsgSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsgfWNhdGNoIChleCl7SG90LmVjaG8gKFwiXCIpO30qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhyb3dBbGxFcnJvcnMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCFIb3QuZWNobyAoJHtyZWdleEZvdW5kMn0pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7cmVnZXhGb3VuZDJ9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0LypsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5IChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtlc2NhcGVkQ29udGVudH0sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKEhvdC5Nb2RlID09PSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb24pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDMsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cdFx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0XHQvKmxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke29mZkNvbnRlbnQzfSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0ID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0XHR0ZW1wT3V0cHV0MywgXCI/KFwiLCBcIilcIiwgXCIoXCIsIFxuXHRcdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGZvdW5kU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0IGJlIHBhcnNlZC4gSWYgc28sIHN0cmluZ2lmeSBpdC5cblx0XHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlIChyZWdleEZvdW5kMik7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdGZvdW5kU3RyID0gSlNPTi5zdHJpbmdpZnkgKHJlZ2V4Rm91bmQyKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IGAke3JlZ2V4Rm91bmQyfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdmFsaWQgSlNPTiBpcyBub3QgcmVjZWl2ZWQsIGRvbid0IHdvcnJ5IGFib3V0IGl0LCBwYXNzIGl0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIGFsb25nIHRvIHRoZSBmdW5jdGlvbiBiZWxvdyBmb3IgaXQgdG8gYmUgcGFyc2VkIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biB0aGVyZSBpbnN0ZWFkLlxuXHRcdFx0XHRcdFx0XHRcdGZvdW5kU3RyID0gYCR7cmVnZXhGb3VuZDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgTWFrZSB0aGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gYW5kIHBhc3MgZm91bmRTdHIsIGV0Yy5cblx0XHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0Ahe1xuY29uc3QgdGVzdEVsbSA9IGNyZWF0ZVRlc3RFbGVtZW50ICgke2ZvdW5kU3RyfSk7XG5Ib3QuZWNobyAoXFxgZGF0YS10ZXN0LW9iamVjdC1uYW1lID0gXCJcXCR7dGVzdEVsbS5uYW1lfVwiIGRhdGEtdGVzdC1vYmplY3QtZnVuYyA9IFwiXFwke3Rlc3RFbG0uZnVuY31cIiBkYXRhLXRlc3Qtb2JqZWN0LXZhbHVlID0gXCJcXCR7dGVzdEVsbS52YWx1ZX1cIlxcYCk7XG59KiYhIyVAIUAqIVxcbmA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNyZWF0ZVRlc3RFbGVtZW50ID0gKGZvdW5kU3RyMjogYW55KSA9PlxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCB0ZXN0RWxtID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBvYmogPSBmb3VuZFN0cjI7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoZm91bmRTdHIyKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmogPSBKU09OLnBhcnNlIChmb3VuZFN0cjIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqW1wibmFtZVwiXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UudGVzdEVsZW1lbnRzW3Rlc3RFbG0ubmFtZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHt0ZXN0RWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIWApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxuXHRcdFx0XHRcdFx0XHRcdGBFcnJvciBwcm9jZXNzaW5nIHRlc3QgZWxlbWVudCAke2ZvdW5kU3RyMn0gaW4gJHtIb3QuQ3VycmVudFBhZ2UubmFtZX0uIEVycm9yOiAke2V4Lm1lc3NhZ2V9YFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAodGVzdEVsbSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGVzdEVsbSA9IGNyZWF0ZVRlc3RFbGVtZW50IChmb3VuZFN0cik7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCFkYXRhLXRlc3Qtb2JqZWN0LW5hbWUgPSBcIiR7dGVzdEVsbS5uYW1lfVwiIGRhdGEtdGVzdC1vYmplY3QtZnVuYyA9IFwiJHt0ZXN0RWxtLmZ1bmN9XCIgZGF0YS10ZXN0LW9iamVjdC12YWx1ZSA9IFwiJHt0ZXN0RWxtLnZhbHVlfVwiKiYhIyVAIUAqIWA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0XHQvKmxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke29mZkNvbnRlbnQzfSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0NTogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0dGVtcE91dHB1dDQsIFwiKiYmJSolQCNAIVwiLCBcIiomISMlQCFAKiFcIiwgXCIqJiYlKiVAI0AhXCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKHJlZ2V4Rm91bmQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IEpTT04uc3RyaW5naWZ5IChvZmZDb250ZW50KTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBvZmZDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0b3V0ID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gZXNjYXBlZENvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcIiomJiUqJUAjQCFcIi5sZW5ndGgsIFwiKiYhIyVAIUAqIVwiLmxlbmd0aCk7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUZW1wb3JhcnkgaGFjay4gVGhlc2UgZGVsaW1pdGVycyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRlbXBPdXRwdXQgd2hlbiBcblx0XHRcdFx0Ly8vIGV4ZWN1dGluZyBwcm9jZXNzTmVzdGVkQ29udGVudC5cblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwmXFwlXFwqXFwlXFxAXFwjXFxAXFwhL2csIFwiXCIpO1xuXHRcdFx0XHR0ZW1wT3V0cHV0NSA9IHRlbXBPdXRwdXQ1LnJlcGxhY2UgKC9cXCpcXCZcXCFcXCNcXCVcXEBcXCFcXEBcXCpcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0cmV0dXJuICh0ZW1wT3V0cHV0NSk7XG5cdFx0XHR9LCAwKTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHRoZSBjb250ZW50IGluIHRoaXMgZmlsZS4gVGhpcyB0cmVhdHMgZWFjaCBmaWxlIGFzIG9uZSBsYXJnZSBKYXZhU2NyaXB0XG5cdCAqIGZpbGUuIEFueSB0ZXh0IG91dHNpZGUgb2YgdGhlIDwqICo+IGFyZWFzIHdpbGwgYmUgdHJlYXRlZCBhczpcblx0ICogXG5cdCAqIFx0XHRIb3QuZWNobyAoXCJ0ZXh0XCIpO1xuXHQgKiBcblx0ICogQGZpeG1lIFRoZSByZWdleCdzIGluIHRoZSBvZmZDb250ZW50IGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGZpeGVkLiBUaGVyZSdzIHNldmVyYWwgXG5cdCAqIHRlc3QgY2FzZXMgd2hlcmUgdGhleSB3aWxsIGZhaWwuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGhpc0NvbnRlbnQ6IHN0cmluZyA9IHRoaXMuY29udGVudDtcblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljS2V5cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljS2V5cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50ICh0aGlzQ29udGVudCwgdGhpcy50aHJvd0FsbEVycm9ycyk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHQvLyBPdXRwdXQgdGhlIGFyZ3VtZW50cyBzbyBpdCdzIHVzYWJsZSBpbiB0aGUgZW50aXJlIGRvY3VtZW50LlxuXHRcdFx0aWYgKHR5cGVvZiAoYXJncykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBwYXNzaW5nIGFyZ3VtZW50cyBjYW5ub3QgYmUgYSBzdHJpbmchYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBhcmdzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmV3VmFyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWU6IGFueSA9IGFyZ3Nba2V5XTtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAobmV3VmFyVmFsdWUpO1xuXG5cdFx0XHRcdG5ld1ZhciA9IGB2YXIgJHtrZXl9ID0gJHtuZXdWYXJWYWx1ZVN0cn07XFxuYDtcblxuXHRcdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG5ld1Zhcjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNvbnRlbnROYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLmxvY2FsRmlsZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMudXJsO1xuXG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblxuXHRcdFx0ZnVuY3Rpb24gZWNob091dHB1dCAoY29udGVudCwgdGhyb3dFcnJvcnMpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0Vycm9ycyA9PSBudWxsKVxuXHRcdFx0XHRcdHRocm93RXJyb3JzID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAodGhyb3dFcnJvcnMgPT09IHRydWUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChjb250ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gY3JlYXRlVGVzdEVsZW1lbnQgKGZvdW5kU3RyKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHI7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChmb3VuZFN0cikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRvYmogPSBKU09OLnBhcnNlIChmb3VuZFN0cik7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRpZiAob2JqW1wibmFtZVwiXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxcYFRlc3QgZWxlbWVudCBcXCR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFcXGApO1xuXG5cdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmFkZFRlc3RFbGVtZW50ICh0ZXN0RWxtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxuXHRcdFx0XFxgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgXFwke2ZvdW5kU3RyfSBpbiBcXCR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogXFwke2V4Lm1lc3NhZ2V9XFxgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICh0ZXN0RWxtKTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gcnVuQ29udGVudCAoQ3VycmVudEhvdEZpbGUpXG5cdFx0XHR7XFxuYDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gb3V0cHV0O1xuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBgXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocnVuQ29udGVudCAoUGFzc2VkSG90RmlsZSkudGhlbiAoKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh7XG5cdFx0XHRcdFx0XHRob3Q6IEhvdCxcblx0XHRcdFx0XHRcdG91dHB1dDogSG90Lk91dHB1dCxcblx0XHRcdFx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5IChIb3QuRGF0YSlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtgO1xuXG5cdFx0XHQvLy8gQGZpeG1lIFByaW9yIHRvIGV4ZWN1dGlvbiBjb21waWxlIGFueSBUeXBlU2NyaXB0IGFuZCBtYWtlIGl0IEVTNSBjb21wYXRpYmxlLlxuXHRcdFx0bGV0IGZ1bmM6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uIChleGVjdXRpb25Db250ZW50KTtcblx0XHRcdHJldHVybmVkT3V0cHV0ID0gYXdhaXQgZnVuYy5hcHBseSAodGhpcywgW0hvdCwgdGhpc10pO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0aWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IpXG5cdFx0XHR7XG5cdFx0XHRcdC8vLyBAZml4bWUgUHV0IHdoYXQncyBpbiB0aGUgY29udGVudCB2YXJpYWJsZSBpbnRvIGEgcHJldiBjb250ZW50IHZhcmlhYmxlP1xuXHRcdFx0XHQvLy8gVGhlbiBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGFueSBzeW50YXggZXJyb3JzIGJlaW5nIHRocm93biwgZXhlY3V0ZSB0aGUgXG5cdFx0XHRcdC8vLyBjb2RlPyBUaGlzIHdvdWxkIGFsc28gcmVxdWlyZSBzYXZpbmcgYW55IEhUTUwgb3V0c2lkZSBvZiB0aGUgKj4gYW5kIDwqIFxuXHRcdFx0XHQvLy8gdGhlbiBlY2hvaW5nIGl0IG91dC4gVGhlIHRocm93IGJlbG93IHdvdWxkIGhhdmUgdG8gYmUgcmVtb3ZlZCBhcyB3ZWxsLlxuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0fVxuXG5cdFx0SG90LkRhdGEgPSByZXR1cm5lZE91dHB1dC5ob3QuRGF0YTtcblx0XHRsZXQgZmluYWxPdXRwdXQ6IHN0cmluZyA9IHJldHVybmVkT3V0cHV0Lm91dHB1dDtcblx0XHRIb3QuT3V0cHV0ID0gXCJcIjtcblxuXHRcdHJldHVybiAoZmluYWxPdXRwdXQpO1xuXHR9XG59IiwiLyoqXG4gKiBUaGUgbG9nZ2luZyBsZXZlbC5cbiAqL1xuZXhwb3J0IGVudW0gSG90TG9nTGV2ZWxcbntcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IGluZm8gbWVzc2FnZXMuXG5cdCAqL1xuXHRJbmZvLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgd2FybmluZyBtZXNzYWdlcy5cblx0ICovXG5cdFdhcm5pbmcsXG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBlcnJvciBtZXNzYWdlcy5cblx0ICovXG5cdEVycm9yLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcy5cblx0ICovXG5cdFZlcmJvc2UsXG5cdC8qKlxuXHQgKiBQcmludHMgYWxsIG1lc3NhZ2VzLCBleGNlcHQgdmVyYm9zZS5cblx0ICovXG5cdEFsbCxcblx0LyoqXG5cdCAqIERvZXNuJ3QgcHJpbnQgYW55IG1lc3NhZ2UuXG5cdCAqL1xuXHROb25lXG59XG5cbi8qKlxuICogVGhlIGxvZ2dlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdExvZ1xue1xuXHQvKipcblx0ICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRsb2dMZXZlbDogSG90TG9nTGV2ZWw7XG5cblx0Y29uc3RydWN0b3IgKGxvZ0xldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbClcblx0e1xuXHRcdHRoaXMubG9nTGV2ZWwgPSBsb2dMZXZlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSBtZXNzYWdlLlxuXHQgKi9cblx0bG9nIChsZXZlbDogSG90TG9nTGV2ZWwsIG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0XHRcdHRoaXMud2FybmluZyAobWVzc2FnZSk7XG5cblx0XHRcdGlmICgobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pIHx8IFxuXHRcdFx0XHQobGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKVxuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0XHRcdHRoaXMud2FybmluZyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKVxuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSB2ZXJib3NlIG1lc3NhZ2UuXG5cdCAqL1xuXHR2ZXJib3NlIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSlcblx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgbWVzc2FnZS5cblx0ICovXG5cdGluZm8gKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKSlcblx0XHR7XG5cdFx0XHRjb25zb2xlLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSB3YXJuaW5nLlxuXHQgKi9cblx0d2FybmluZyAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpKVxuXHRcdHtcblx0XHRcdGNvbnNvbGUud2FybiAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhbiBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZXJyb3IgKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKSlcblx0XHR7XG5cdFx0XHRsZXQgbXNnOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAodHlwZW9mIChtZXNzYWdlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0bXNnID0gbWVzc2FnZTtcblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UubWVzc2FnZSAhPSBudWxsKVxuXHRcdFx0XHRcdG1zZyA9IG1lc3NhZ2UubWVzc2FnZTtcblxuXHRcdFx0XHRpZiAobWVzc2FnZS5zdGFjayAhPSBudWxsKVxuXHRcdFx0XHRcdG1zZyA9IG1lc3NhZ2Uuc3RhY2s7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IgKG1zZyk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbi8qKlxuICogQSBwYWdlIHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFBhZ2Vcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlIHVzZWQgdG8gZ2V0IHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdHJvdXRlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuIEZpbGUgb3JkZXJpbmcgbWF0dGVycyBoZXJlLlxuXHQgKiBFdmVyeSBmaWxlIGlzIHByb2Nlc3NlZCBpbmNyZW1lbnRhbGx5LlxuXHQgKi9cblx0ZmlsZXM/OiBIb3RGaWxlW107XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbmFtZS5cblx0ICovXG5cdHRlc3Rlck5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzPzogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdEVsZW1lbnQ7IH07XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBwYXRocyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RQYXRocz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xufVxuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90UGFnZSBpbXBsZW1lbnRzIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlIHVzZWQgdG8gZ2V0IHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0RWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90UGFnZSB8IEhvdFN0YXEpXG5cdHtcblx0XHRpZiAoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gXCJcIjtcblx0XHRcdHRoaXMuZmlsZXMgPSBbXTtcblx0XHRcdHRoaXMudGVzdEVsZW1lbnRzID0ge307XG5cdFx0XHR0aGlzLnRlc3RQYXRocyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJOYW1lID0gY29weS50ZXN0ZXJOYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IGNvcHkudGVzdGVyTWFwIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gY29weS5yb3V0ZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy5maWxlcyA9IGNvcHkuZmlsZXMgfHwgW107XG5cdFx0XHR0aGlzLnRlc3RFbGVtZW50cyA9IGNvcHkudGVzdEVsZW1lbnRzIHx8IHt9O1xuXHRcdFx0dGhpcy50ZXN0UGF0aHMgPSBjb3B5LnRlc3RQYXRocyB8fCB7fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgZmlsZSB0byBwcm9jZXNzLiBJdCdzIHJlY29tbWVuZCB0byBsb2FkIHRoZSBmaWxlIHByaW9yIHRvIFxuXHQgKiBhZGRpbmcgaXQgdG8gYSBwYWdlIGlmIGl0J3MgYWJvdXQgdG8gYmUgdXNlZC5cblx0ICovXG5cdGFzeW5jIGFkZEZpbGUgKGZpbGU6IEhvdEZpbGUpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRmaWxlLnBhZ2UgPSB0aGlzO1xuXG5cdFx0dGhpcy5maWxlcy5wdXNoIChmaWxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEFQSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLlxuXHQgKi9cblx0Z2V0QVBJICgpOiBIb3RBUElcblx0e1xuXHRcdHJldHVybiAodGhpcy5wcm9jZXNzb3IuYXBpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHRlc3RlciBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldFRlc3RlckFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLnRlc3RlckFQSSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFsbCBmaWxlcyBpbiB0aGUgcGFnZS4gQ291bGQgZGVjcmVhc2UgcGFnZSBsb2FkaW5nIHBlcmZvcm1hbmNlLlxuXHQgKiBJdCdzIHJlY29tbWVuZCB0byBsb2FkIHRoZSBmaWxlIHByaW9yIHRvIGFkZGluZyBpdCB0byBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBsb2FkIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gdGhpcy5maWxlc1tpSWR4XTtcblxuXHRcdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgcGFnZSBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gdGhpcy5maWxlc1tpSWR4XTtcblxuXHRcdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cdFx0XHRmaWxlLnBhZ2UgPSB0aGlzO1xuXG5cdFx0XHRvdXRwdXQgKz0gYXdhaXQgZmlsZS5wcm9jZXNzIChhcmdzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0YWRkVGVzdEVsZW1lbnQgKGVsbTogSG90VGVzdEVsZW1lbnQpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtlbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RFbGVtZW50c1tlbG0ubmFtZV0gPSBlbG07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0Z2V0VGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyk6IEhvdFRlc3RFbGVtZW50XG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke25hbWV9IGRvZXN0IG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGNyZWF0ZVRlc3RQYXRoIChwYXRoTmFtZTogc3RyaW5nLCBkcml2ZXJGdW5jOiBIb3RUZXN0UGF0aCk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgcGF0aCAke3BhdGhOYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMudGVzdFBhdGhzW3BhdGhOYW1lXSA9IGRyaXZlckZ1bmM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIVFRQTWV0aG9kLCBJSG90Um91dGVNZXRob2QsIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLCBUZXN0Q2FzZUZ1bmN0aW9uLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIFRoZSByb3V0ZSB0byB1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0aGF0IG1haW50YWlucyB0aGUgY29ubmVjdGlvbnMuXG5cdCAqL1xuXHRjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uLlxuXHQgKi9cblx0dmVyc2lvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdXRlIG1ldGhvZC5cblx0ICovXG5cdHByZWZpeDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUuXG5cdCAqL1xuXHRtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdO1xuXHQvKipcblx0ICogVGhlIGVycm9ycyBhbmQgdGhlaXIgSlNPTiB0aGF0IGNhbiBiZSB0aHJvd24uIENhbiBiZTpcblx0ICogKiBub3RfYXV0aG9yaXplZFxuXHQgKiAqIG5vX3NlcnZlcl9leGVjdXRlX2Z1bmN0aW9uXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLnZlcnNpb24gPSBcInYxXCI7XG5cdFx0dGhpcy5wcmVmaXggPSBcIlwiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuXHRcdHRoaXMuZXJyb3JzID0ge1xuXHRcdFx0XHRcIm5vdF9hdXRob3JpemVkXCI6IEhvdFJvdXRlLmNyZWF0ZUVycm9yIChcIk5vdCBhdXRob3JpemVkLlwiKSxcblx0XHRcdFx0XCJub19zZXJ2ZXJfZXhlY3V0ZV9mdW5jdGlvblwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJNaXNzaW5nIHNlcnZlciBleGVjdXRlIGZ1bmN0aW9uLlwiKSxcblx0XHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGVycm9yIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUVycm9yIChtZXNzYWdlOiBzdHJpbmcpOiBhbnlcblx0e1xuXHRcdHJldHVybiAoeyBlcnJvcjogbWVzc2FnZSB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gQVBJIG1ldGhvZCB0byB0aGlzIHJvdXRlLlxuXHQgKiBcblx0ICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGFkZC4gSWYgYSBIb3RSb3V0ZU1ldGhvZCBpcyBzdXBwbGllZCwgdGhlIFxuXHQgKiByZXN0IG9mIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKi9cblx0YWRkTWV0aG9kIChcblx0XHRtZXRob2Q6IEhvdFJvdXRlTWV0aG9kIHwgSUhvdFJvdXRlTWV0aG9kIHwgc3RyaW5nLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLFxuXHRcdHR5cGU6IEhUVFBNZXRob2QgPSBIVFRQTWV0aG9kLlBPU1QsXG5cdFx0dGVzdENhc2VzOiAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W10gPSBudWxsXG5cdFx0KTogdm9pZFxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobWV0aG9kKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdG1ldGhvZCA9IG5ldyBIb3RSb3V0ZU1ldGhvZCAodGhpcywgbWV0aG9kLCBleGVjdXRlRnVuY3Rpb24sIHR5cGUsIG51bGwsIG51bGwsIG51bGwsIHRlc3RDYXNlcyk7XG5cblx0XHRpZiAobWV0aG9kIGluc3RhbmNlb2YgSG90Um91dGVNZXRob2QpXG5cdFx0XHR0aGlzLm1ldGhvZHMucHVzaCAobWV0aG9kKTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKG1ldGhvZC5yb3V0ZSA9PSBudWxsKVxuXHRcdFx0XHRtZXRob2Qucm91dGUgPSB0aGlzO1xuXG5cdFx0XHRtZXRob2QgPSBuZXcgSG90Um91dGVNZXRob2QgKG1ldGhvZCk7XG5cdFx0XHR0aGlzLm1ldGhvZHMucHVzaCAoKDxIb3RSb3V0ZU1ldGhvZD5tZXRob2QpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgbWV0aG9kIGJ5IGl0J3MgbmFtZS5cblx0ICovXG5cdGdldE1ldGhvZCAobmFtZTogc3RyaW5nKTogSG90Um91dGVNZXRob2Rcblx0e1xuXHRcdGxldCBmb3VuZE1ldGhvZDogSG90Um91dGVNZXRob2QgPSBudWxsO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLm1ldGhvZHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1ldGhvZDogSG90Um91dGVNZXRob2QgPSB0aGlzLm1ldGhvZHNbaUlkeF07XG5cblx0XHRcdGlmIChtZXRob2QubmFtZSA9PT0gbmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Zm91bmRNZXRob2QgPSBtZXRob2Q7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChmb3VuZE1ldGhvZCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyByb3V0ZSB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb3V0ZSB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvbkV4ZWN1dGUgaW4gdGhlIFxuXHQgKiBjYWxsZWQgSG90Um91dGVNZXRob2QuIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiBcblx0ICogdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKi9cblx0b25BdXRob3JpemVVc2VyOiAocmVxOiBhbnksIHJlczogYW55KSA9PiBQcm9taXNlPGFueT4gPSBudWxsO1xufSIsImltcG9ydCB7IERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcblxuLyoqXG4gKiBBdmFpbGFibGUgSFRUUCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIVFRQTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBBIEhUVFAgR0VUIHJlcXVlc3QuXG5cdCAqL1xuXHRHRVQgPSBcImdldFwiLFxuXHQvKipcblx0ICogQSBIVFRQIFBPU1QgcmVxdWVzdC5cblx0ICovXG5cdFBPU1QgPSBcInBvc3RcIixcblx0LyoqXG5cdCAqIFRoaXMgd2lsbCB1cGxvYWQgYSBmaWxlLCB0aGVuIHBvc3QgdGhlIGpzb24gcmVxdWVzdCBhZnRlcndhcmRzLlxuXHQgKi9cblx0RklMRV9VUExPQUQgPSBcImZpbGVfdXBsb2FkX3RoZW5fcG9zdF9qc29uXCJcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgd2l0aCBFeHByZXNzLlxuICogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGlzIHJvdXRlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gXG5cdChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnksIGZpbGVzPzogYW55KSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCB0eXBlIENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIGF1dGhvcml6YXRpb24uIEFueSB2YWx1ZSBcbiAqIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24uXG4gKiBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcmV0dXJuZWQsIHRoaXMgaW5kaWNhdGVzIHRoZSBzZXJ2ZXIgd2FzIG5vdCBhYmxlIFxuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBzbyB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gd2lsbCBub3QgYmUgXG4gKiBleGVjdXRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uID0gKHJlcTogYW55LCByZXM6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIFRoZSB0ZXN0IGNhc2UgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgVGVzdENhc2VGdW5jdGlvbiA9ICgoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBQcm9taXNlPGFueT4pIHwgKChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IGFueSk7XG4vKipcbiAqIFRoZSB0ZXN0IGNhc2Ugb2JqZWN0IHRvIHBhc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2VPYmplY3Rcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cblx0ICovXG5cdGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb247XG59XG5cbi8qKlxuICogQSBtZXRob2QgcGFyYW1ldGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBwYXJhbWV0ZXIuIERlZmF1bHQ6IHN0cmluZ1xuXHQgKiBDYW4gYmU6XG5cdCAqICogc3RyaW5nXG5cdCAqICogaW50ZWdlclxuXHQgKiAqIG51bWJlclxuXHQgKiAqIGJvb2xlYW5cblx0ICogKiBhcnJheVxuXHQgKiAqIG9iamVjdFxuXHQgKi9cblx0dHlwZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyLiBEZWZhdWx0OiBcIlwiXG5cdCAqL1xuXHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0LyoqXG5cdCAqIElzIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVkPyBEZWZhdWx0OiBmYWxzZVxuXHQgKi9cblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHBhcmFtZXRlcnMgaW4gdGhlIG9iamVjdC5cblx0ICovXG5cdHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjsgfTtcbn1cblxuLyoqXG4gKiBBbiBBUEkgbWV0aG9kIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFJvdXRlTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHJvdXRlLlxuXHQgKi9cblx0cm91dGU/OiBIb3RSb3V0ZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCByZXR1cm5zIGZyb20gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRyZXR1cm5zPzogc3RyaW5nIHwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXI7XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjsgfTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0dHlwZT86IEhUVFBNZXRob2Q7XG5cdC8qKlxuXHQgKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgXG5cdCAqIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXV0aENyZWRlbnRpYWxzPzogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0O1xuXHRcdH0gfCAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W107XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIG1ldGhvZCB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI/OiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZCBcblx0ICogaXMgc2V0LCB0aGlzIHdpbGwgbm90IGNhbGwgb25BdXRob3JpemUgZm9yIHRoZSBwYXJlbnQgSG90Um91dGUuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlLiBcblx0ICogVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyQXV0aG9yaXplPzogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgc2VydmVyIHNpZGUuIFxuXHQgKiBUaGlzIHdpbGwgc3RyaW5naWZ5IGFueSBKU09OIG9iamVjdCBhbmQgc2VuZCBpdCBhcyBhIEpTT04gcmVzcG9uc2UuIFxuXHQgKiBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQgbm8gcmVzcG9uc2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFxuXHQgKiBTbyB0aGUgZGV2ZWxvcGVyIHdvdWxkIGhhdmUgdG8gc2VuZCBhIHJlc3BvbnNlIHVzaW5nIFwicmVzXCIuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIHNlcnZlciBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckV4ZWN1dGU/OiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBjbGllbnQgc2lkZS5cblx0ICogQGZpeG1lIElzIHRoaXMgbmVjZXNzYXJ5P1xuXHQgKi9cblx0b25DbGllbnRFeGVjdXRlPzogQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb247XG59XG5cbi8qKlxuICogQW4gQVBJIG1ldGhvZCB0byBtYWtlLlxuICovXG5leHBvcnQgY2xhc3MgSG90Um91dGVNZXRob2QgaW1wbGVtZW50cyBJSG90Um91dGVNZXRob2Rcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcm91dGUuXG5cdCAqL1xuXHRyb3V0ZTogSG90Um91dGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCByZXR1cm5zIGZyb20gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRyZXR1cm5zOiBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cGFyYW1ldGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXI7IH07XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdHR5cGU6IEhUVFBNZXRob2Q7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGlzUmVnaXN0ZXJlZDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0ZXhlY3V0ZVNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgbWV0aG9kIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3Rlcj86IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuIElmIHRoaXMgbWV0aG9kIFxuXHQgKiBpcyBzZXQsIHRoaXMgd2lsbCBub3QgY2FsbCBvbkF1dGhvcml6ZSBmb3IgdGhlIHBhcmVudCBIb3RSb3V0ZS5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvbkV4ZWN1dGUuIFxuXHQgKiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJBdXRob3JpemU/OiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3RvciAocm91dGU6IEhvdFJvdXRlIHwgSUhvdFJvdXRlTWV0aG9kLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCBcblx0XHRvbkV4ZWN1dGU6IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHwgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHR0eXBlOiBIVFRQTWV0aG9kID0gSFRUUE1ldGhvZC5QT1NULCBvblNlcnZlckF1dGhvcml6ZTogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0b25SZWdpc3RlcjogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb24gPSBudWxsLCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGwsIFxuXHRcdHRlc3RDYXNlczogeyBbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7IH0gfCAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W10gPSBudWxsKVxuXHR7XG5cdFx0bGV0IG5ld1JvdXRlOiBIb3RSb3V0ZSA9IG51bGw7XG5cblx0XHRpZiAocm91dGUgaW5zdGFuY2VvZiBIb3RSb3V0ZSlcblx0XHRcdG5ld1JvdXRlID0gcm91dGU7XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdG5ld1JvdXRlID0gcm91dGUucm91dGU7XG5cblx0XHRcdGlmIChyb3V0ZS50eXBlICE9IG51bGwpXG5cdFx0XHRcdHR5cGUgPSByb3V0ZS50eXBlO1xuXG5cdFx0XHRpZiAocm91dGUubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRuYW1lID0gcm91dGUubmFtZTtcblxuXHRcdFx0aWYgKHJvdXRlLmRlc2NyaXB0aW9uICE9IG51bGwpXG5cdFx0XHRcdHRoaXMuZGVzY3JpcHRpb24gPSByb3V0ZS5kZXNjcmlwdGlvbjtcblxuXHRcdFx0aWYgKHJvdXRlLnJldHVybnMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHR5cGVvZiAocm91dGUucmV0dXJucykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnJldHVybnMgPSB7XG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogcm91dGUucmV0dXJuc1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5yZXR1cm5zID0gcm91dGUucmV0dXJucztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvdXRlLnBhcmFtZXRlcnMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5wYXJhbWV0ZXJzID0ge307XG5cblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHJvdXRlLnBhcmFtZXRlcnMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgcGFyYW0gPSByb3V0ZS5wYXJhbWV0ZXJzW2tleV07XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChwYXJhbSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5wYXJhbWV0ZXJzW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IHBhcmFtLFxuXHRcdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAocGFyYW0udHlwZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwYXJhbS50eXBlID0gXCJzdHJpbmdcIjtcblxuXHRcdFx0XHRcdFx0dGhpcy5wYXJhbWV0ZXJzW2tleV0gPSBwYXJhbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvdXRlLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSByb3V0ZS5hdXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0b25FeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25TZXJ2ZXJBdXRob3JpemUgIT0gbnVsbClcblx0XHRcdFx0b25TZXJ2ZXJBdXRob3JpemUgPSByb3V0ZS5vblNlcnZlckF1dGhvcml6ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uUmVnaXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0b25SZWdpc3RlciA9IHJvdXRlLm9uUmVnaXN0ZXI7XG5cblx0XHRcdGlmIChyb3V0ZS5vblBvc3RSZWdpc3RlciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLm9uUG9zdFJlZ2lzdGVyID0gcm91dGUub25Qb3N0UmVnaXN0ZXI7XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5vblNlcnZlckV4ZWN1dGUgPSByb3V0ZS5vblNlcnZlckV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS5vbkNsaWVudEV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5vbkNsaWVudEV4ZWN1dGUgPSByb3V0ZS5vbkNsaWVudEV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS50ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdFx0dGVzdENhc2VzID0gcm91dGUudGVzdENhc2VzO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIHJvdXRlIG1ldGhvZHMgbXVzdCBoYXZlIGEgbmFtZSFgKTtcblxuXHRcdHRoaXMucm91dGUgPSBuZXdSb3V0ZTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0XHR0aGlzLmV4ZWN1dGVTZXR1cCA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gYXV0aENyZWRlbnRpYWxzO1xuXHRcdHRoaXMub25TZXJ2ZXJBdXRob3JpemUgPSBvblNlcnZlckF1dGhvcml6ZTtcblx0XHR0aGlzLm9uUmVnaXN0ZXIgPSBvblJlZ2lzdGVyO1xuXHRcdHRoaXMudGVzdENhc2VzID0ge307XG5cblx0XHRpZiAodGhpcy5yb3V0ZS5jb25uZWN0aW9uLnByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3RDYXNlcyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9iaiA9IHRlc3RDYXNlc1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGVzdENhc2VOYW1lOiBzdHJpbmcgPSBvYmo7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+dGVzdENhc2VzW2lJZHggKyAxXSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5hZGRUZXN0Q2FzZSAodGVzdENhc2VOYW1lLCBmdW5jKTtcblx0XHRcdFx0XHRcdFx0aUlkeCsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlIChvYmopO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGVzdENhc2VzKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvYmogPSB0ZXN0Q2FzZXNba2V5XTtcblxuXHRcdFx0XHRcdFx0dGhpcy5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5yb3V0ZS5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0dGhpcy5vblNlcnZlckV4ZWN1dGUgPSBvbkV4ZWN1dGU7XG5cdFx0Ly9lbHNlXG5cdFx0XHQvL3RoaXMub25DbGllbnRFeGVjdXRlID0gb25FeGVjdXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyB0ZXN0IGNhc2UuXG5cdCAqL1xuXHRhZGRUZXN0Q2FzZSAobmV3VGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0IHwgc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbiwgXG5cdFx0XHR0ZXN0Q2FzZUZ1bmN0aW9uOiBUZXN0Q2FzZUZ1bmN0aW9uID0gbnVsbCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBuZXdUZXN0Q2FzZTtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSB0ZXN0Q2FzZUZ1bmN0aW9uO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJmdW5jdGlvblwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRlc3RDYXNlSWQ6IG51bWJlciA9IE9iamVjdC5rZXlzICh0aGlzLnRlc3RDYXNlcykubGVuZ3RoO1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gYCR7dGhpcy5yb3V0ZS5yb3V0ZX0vJHt0aGlzLm5hbWV9IHRlc3QgY2FzZSAke3Rlc3RDYXNlSWR9YDtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+bmV3VGVzdENhc2UpO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCA9ICg8VGVzdENhc2VPYmplY3Q+bmV3VGVzdENhc2UpO1xuXHRcdHRoaXMudGVzdENhc2VzW3Rlc3RDYXNlLm5hbWVdID0gdGVzdENhc2U7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdFNlcnZlclR5cGVcbntcblx0SFRUUCxcblx0V2ViU29ja2V0cyxcblx0R2VuZXJhdGVcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTZXJ2ZXJcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0eXBlLlxuXHQgKi9cblx0c2VydmVyVHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIEFQSSB0byB1c2UuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBuZXR3b3JrIGFkZHJlc3MgdG8gbGlzdGVuIG9uLlxuXHQgKi9cblx0bGlzdGVuQWRkcmVzczogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBvcnRzIHRvIHVzZS5cblx0ICovXG5cdHBvcnRzOiB7XG5cdFx0XHRodHRwOiBudW1iZXI7XG5cdFx0XHRodHRwczogbnVtYmVyO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBTU0wgc2V0dGluZ3MuXG5cdCAqL1xuXHRzc2w6IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGNlcnQ6IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSBrZXkgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRrZXk6IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSBDQSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGNhOiBzdHJpbmc7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFJlZGlyZWN0IEhUVFAgdHJhZmZpYyB0byBIVFRQUy5cblx0ICovXG5cdHJlZGlyZWN0SFRUUHRvSFRUUFM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG5cdCAqL1xuXHR0eXBlOiBIb3RTZXJ2ZXJUeXBlO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogQW55IHNlY3JldHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyLlxuXHQgKi9cblx0c2VjcmV0czogYW55O1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RTZXJ2ZXIgaW1wbGVtZW50cyBJSG90U2VydmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdHlwZS5cblx0ICovXG5cdHNlcnZlclR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgbmV0d29yayBhZGRyZXNzIHRvIGxpc3RlbiBvbi5cblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxIHwgSG90U2VydmVyKVxuXHR7XG5cdFx0aWYgKHByb2Nlc3NvciBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdFx0dGhpcy5saXN0ZW5BZGRyZXNzID0gXCIwLjAuMC4wXCI7XG5cdFx0XHR0aGlzLnBvcnRzID0ge1xuXHRcdFx0XHRcdGh0dHA6IDgwLFxuXHRcdFx0XHRcdGh0dHBzOiA0NDNcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMuc3NsID0ge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvci5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBwcm9jZXNzb3Iuc2VydmVyVHlwZSB8fCBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBwcm9jZXNzb3IuYXBpIHx8IG51bGw7XG5cdFx0XHR0aGlzLmxpc3RlbkFkZHJlc3MgPSBwcm9jZXNzb3IubGlzdGVuQWRkcmVzcyB8fCBcIjAuMC4wLjBcIjtcblx0XHRcdHRoaXMucG9ydHMgPSBwcm9jZXNzb3IucG9ydHMgfHwge1xuXHRcdFx0XHRcdGh0dHA6IDgwLFxuXHRcdFx0XHRcdGh0dHBzOiA0NDNcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMuc3NsID0gcHJvY2Vzc29yLnNzbCB8fCB7XG5cdFx0XHRcdFx0Y2VydDogXCJcIixcblx0XHRcdFx0XHRrZXk6IFwiXCIsXG5cdFx0XHRcdFx0Y2E6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMucmVkaXJlY3RIVFRQdG9IVFRQUyA9IHByb2Nlc3Nvci5yZWRpcmVjdEhUVFB0b0hUVFBTICE9IG51bGwgPyBwcm9jZXNzb3IucmVkaXJlY3RIVFRQdG9IVFRQUyA6IHRydWU7XG5cdFx0XHR0aGlzLnR5cGUgPSBwcm9jZXNzb3IudHlwZSB8fCBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdFx0XHR0aGlzLnNlY3JldHMgPSBwcm9jZXNzb3Iuc2VjcmV0cyB8fCB7fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0IGFuIEFQSSB0byB0aGlzIHNlcnZlci4gVGhpcyB3aWxsIGFsc28gc2V0IHRoZSBhc3NvY2lhdGVkIFxuXHQgKiBwcm9jZXNzb3IgdG8gdGhpcyBBUEkgYXMgd2VsbC5cblx0ICovXG5cdGFzeW5jIHNldEFQSSAoYXBpOiBIb3RBUEkpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR0aGlzLnByb2Nlc3Nvci5hcGkgPSBhcGk7XG5cdFx0dGhpcy5hcGkgPSBhcGk7XG5cblx0XHQvL2lmIChyZWdpc3RlclJvdXRlcyA9PT0gdHJ1ZSlcblx0XHRcdC8vYXdhaXQgdGhpcy5hcGkucmVnaXN0ZXJSb3V0ZXMgKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYSByb3V0ZSB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlPyAocm91dGU6IEhvdFJvdXRlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU3RhcnQgbGlzdGVuaW5nIGZvciByZXF1ZXN0cy5cblx0ICovXG5cdGFzeW5jIGxpc3Rlbj8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFNodXRkb3duIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyBzaHV0ZG93bj8gKCk6IFByb21pc2U8dm9pZD47XG59IiwiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZHVsZU5hbWUgZnJvbSBcInZhbGlkYXRlLW5wbS1wYWNrYWdlLW5hbWVcIjtcblxuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5cbmltcG9ydCB7IEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSwgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcblxuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24sIEhvdFRlc3RNYXAgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBTZXJ2YWJsZUZpbGVFeHRlbnNpb24gfSBmcm9tIFwiLi9Ib3RIVFRQU2VydmVyXCI7XG5cbnZhciBIb3RUZXN0ZXJNb2NoYTogYW55ID0gbnVsbDtcbnZhciBIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3RTZWxlbml1bURyaXZlcjogYW55ID0gbnVsbDtcblxuLyoqXG4gKiBBIG1hcCBwYXRoIGZvciB0ZXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFNpdGVNYXBQYXRoXG57XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHN0YXJ0IGF1dG9tYXRpY2FsbHkgd2hlbiB0ZXN0cyBzdGFydC5cblx0ICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS5cblx0ICovXG5cdGF1dG9TdGFydD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgXG5cdCAqL1xuXHRwYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcm91dGUgdXNlZCBpbiBhIEhvdFNpdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U2l0ZVJvdXRlXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcm91dGUuIFdpbGwgYXBwZWFyIGluIHRoZSB0aXRsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gbG9hZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIEFQSSB0byBpbnRlcmZhY2Ugd2l0aC5cblx0ICovXG5cdGFwaT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBvcmRlciBpbiB3aGljaCBkZXN0aW5hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGV4ZWN1dGUuIFRoaXMgaXMgXG5cdCAqIGlnbm9yZWQgaWYgdGhlIGRlc3RpbmF0aW9ucyBhcmUgYW4gYXJyYXkuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbk9yZGVyPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgSG90VGVzdGVyTWFwIHRvIHVzZS4gVGhpcyBjYW4gYmUgdGhlIG5hbWUgb2YgYW4gXG5cdCAqIGV4aXN0aW5nIG9uZSBhdHRhY2hlZCB0byB0aGUgc2VsZWN0ZWQgdGVzdGVyLCBvciBcblx0ICogY2FuIGJlIGFuIGFycmF5IG9mIGRlc3RpbmF0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBcblx0ICogY3JlYXRlIGEgbmV3IG1hcC5cblx0ICovXG5cdG1hcD86IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90U2l0ZU1hcFBhdGg7IH0gfCBIb3RTaXRlTWFwUGF0aFtdO1xufVxuXG4vKipcbiAqIEEgSG90U2l0ZSB0byBsb2FkLiBUaGlzIFNIT1VMRCBOT1QgY29udGFpbiBhbnkgcHJpdmF0ZSBzZWNyZXQga2V5cywgcGFzc3dvcmRzLCBcbiAqIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgc2VydmVyLiBBcyBzdWNoLCBmdXR1cmUgXG4gKiB2ZXJzaW9ucyBvZiB0aGUgSG90U2l0ZSBpbnRlcmZhY2Ugc2hvdWxkIG5vdCBjb250YWluIGFueSBkYXRhYmFzZSByZWxhdGVkIFxuICogY29ubmVjdGlvbiBpbmZvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFNpdGVcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoaXMgSG90U2l0ZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgSG90U2l0ZS5cblx0ICovXG5cdHZlcnNpb24/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyBIb3RTaXRlLlxuXHQgKi9cblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBIb3RTaXRlLiBUaGlzIGlzIGZpbGxlZCBpbiBkdXJpbmcgcGFyc2luZy5cblx0ICovXG5cdGhvdHNpdGVQYXRoPzogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCB3ZWIgc2VydmVyIGNvbmZpZ3VyYXRpb24uXG5cdCAqL1xuXHRzZXJ2ZXI/OiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBkZWZhdWx0IG5hbWUgZm9yIGEgc2VydmVkIEhvdHQgZmlsZS5cblx0XHRcdCAqL1xuXHRcdFx0bmFtZT86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBzZXJ2ZSBBTEwgZmlsZXMsIGluY2x1ZGluZyBwb3RlbnRpYWxseSBzZWNyZXQgZmlsZXMuXG5cdFx0XHQgKi9cblx0XHRcdHNlcnZlU2VjcmV0RmlsZXM/OiBib29sZWFuO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXJ2ZSB0aGUgZm9sbG93aW5nIGZpbGUgZXh0ZW5zaW9ucyB3aGVuIHJlcXVlc3RlZC5cblx0XHRcdCAqL1xuXHRcdFx0c2VydmVGaWxlRXh0ZW5zaW9ucz86IChzdHJpbmcgfCBTZXJ2YWJsZUZpbGVFeHRlbnNpb24pW107XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBBUEkgdG8gaW50ZXJmYWNlIHdpdGggYWNyb3NzIGFsbCBwYWdlcy5cblx0XHRcdCAqL1xuXHRcdFx0Z2xvYmFsQXBpPzogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSBzZXJ2ZXIuXG5cdFx0XHQgKi9cblx0XHRcdHVybD86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIEphdmFTY3JpcHQgc291cmNlIHBhdGguXG5cdFx0XHQgKi9cblx0XHRcdGpzU3JjUGF0aD86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIHBvcnRzIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0cG9ydHM/OiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHdlYiBIVFRQIHBvcnQgdG8gc2VydmUgb24uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0aHR0cD86IG51bWJlcjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgd2ViIEhUVFBTIHBvcnQgdG8gc2VydmUgb24uXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0aHR0cHM/OiBudW1iZXI7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCByZWRpcmVjdCBmcm9tIEhUVFAgdG8gSFRUUFMgZm9yIGEgd2ViIGFuZCB3ZWItYXBpIHNlcnZlci5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRyZWRpcmVjdEhUVFB0b0hUVFBTPzogYm9vbGVhbjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgYXBpIEhUVFAgcG9ydCB0byBzZXJ2ZSBvbi5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRhcGlIdHRwPzogbnVtYmVyO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBhcGkgSFRUUFMgcG9ydCB0byBzZXJ2ZSBvbi5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRhcGlIdHRwcz86IG51bWJlcjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHJlZGlyZWN0IGZyb20gSFRUUCB0byBIVFRQUyBmb3IgYW4gYXBpIHNlcnZlci5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRhcGlSZWRpcmVjdEhUVFB0b0hUVFBTPzogYm9vbGVhbjtcblx0XHRcdFx0fTtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGxpc3Qgb2YgZGlyZWN0b3J5IHRvIHNlcnZlIHRvIHRoZSBjbGllbnQgZnJvbSB0aGUgc2VydmVyLlxuXHRcdFx0ICovXG5cdFx0XHRzZXJ2ZURpcmVjdG9yaWVzPzoge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSB3ZWIgcm91dGUgdG8gdGFrZS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRyb3V0ZTogc3RyaW5nO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBsb2NhbCBmaWxlc3lzdGVtIHBhdGggdG8gc2VydmUgcGFnZXMgZnJvbS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRsb2NhbFBhdGg6IHN0cmluZztcblx0XHRcdFx0fVtdO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBIb3cgdG8gaGFuZGxlIGVycm9ycy5cblx0XHRcdCAqL1xuXHRcdFx0ZXJyb3JzPzoge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogT24gYSA0MDQsIHNlcnZlIGEgbG9jYWwgZmlsZS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdG9uNDA0Pzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogT24gYW4gZXJyb3Igb3RoZXIgdGhhbiBhIDQwNCwgc2VydmUgYSBsb2NhbCBmaWxlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0b25PdGhlcj86IHN0cmluZztcblx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRlc3RpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuXHQgKi9cblx0dGVzdGluZz86IHtcblx0XHRcdHdlYj86IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB0ZXN0ZXIgY2xhc3MgdG8gdXNlLiBFWDogSG90VGVzdGVyTW9jaGFTZWxlbml1bVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdGVzdGVyLlxuXHRcdFx0XHQgKiBEZWZhdWx0IFZhbHVlOiB0cnVlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRjcmVhdGVOZXdUZXN0ZXI/OiBib29sZWFuO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0aGF0IGNvbm5lY3RzIHRvIHRoZSB0ZXN0ZXIgYXBpIHNlcnZlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3RlckFQSVVybD86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGRyaXZlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRkcml2ZXI/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQgY29tbWFuZC5cblx0XHRcdFx0ICogRGVmYXVsdCBpcyBzZXQgdG8gMjAuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRjb21tYW5kRGVsYXk/OiBudW1iZXI7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZXMuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRsYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbWFwcyB0byB0ZXN0IGluIG9yZGVyLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bWFwcz86IHN0cmluZ1tdO1xuXHRcdFx0fSxcblx0XHRcdGFwaT86IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB0ZXN0ZXIgY2xhc3MgdG8gdXNlLiBFWDogSG90VGVzdGVyTW9jaGFcblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3Rlcj86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgY3JlYXRlIGEgbmV3IHRlc3Rlci5cblx0XHRcdFx0ICogRGVmYXVsdCBWYWx1ZTogdHJ1ZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y3JlYXRlTmV3VGVzdGVyPzogYm9vbGVhbjtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB1cmwgdGhhdCBjb25uZWN0cyB0byB0aGUgdGVzdGVyIGFwaSBzZXJ2ZXIuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJBUElVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBkcml2ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0ZHJpdmVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGVzLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bGF1bmNocGFkVXJsPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG1hcHMgdG8gdGVzdCBpbiBvcmRlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdG1hcHM/OiBzdHJpbmdbXTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIHJvdXRlcyB0byBsb2FkLlxuXHQgKi9cblx0cm91dGVzPzoge1xuXHRcdFx0W3JvdXRlTmFtZTogc3RyaW5nXTogSG90U2l0ZVJvdXRlO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgYXZhaWxhYmxlIEFQSXMgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtdXN0IGFscmVhZHkgaGF2ZSB0aGVzZSBcblx0ICogbG9hZGVkLlxuXHQgKi9cblx0YXBpcz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIEpTIEFQSSBmaWxlIHRvIGxvYWQuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0anNhcGk/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIGV4cG9ydGVkIEpTIGxpYnJhcnkgbmFtZSB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bGlicmFyeU5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIGFwaSB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YXBpTmFtZT86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgcG9ydCB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cG9ydD86IG51bWJlcjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgcHVibGljIGJhc2UgdXJsIGZvciB0aGUgYXBpLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHVybD86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgc2VydmVyLXNpZGUgZmlsZXBhdGggZm9yIHRoZSBhcGkuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZmlsZXBhdGg/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIG1hcHMgdG8gdGVzdCBpbiBvcmRlci5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRtYXA/OiBzdHJpbmdbXTtcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogUHVibGljIGtleXMgdGhhdCBhcmUgZW1iZWRkZWQgaW50byB0aGUgcGFnZS5cblx0ICovXG5cdHB1YmxpY0tleXM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBrZXkgb2YgYW4gQVBJIHNlY3JldCB0byBwYXNzIHRvIHRoZSBzaXRlIHRvIFxuXHRcdFx0XHRcdCAqIGJlIHVzZWQgcHVibGljbHkuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cGFzc1NlY3JldEZyb21BUEk/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogR2V0IHRoZSBwdWJsaWMgc2VjcmV0IGZyb20gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZW52Pzogc3RyaW5nO1xuXHRcdFx0XHR9O1xuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0byBsb2FkIGFuZCByZWdpc3Rlci5cblx0ICovXG5cdGNvbXBvbmVudHM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSB1cmwgdG8gdGhlIGNvbXBvbmVudCB0byBsb2FkIGFuZCByZWdpc3Rlci5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHR1cmw6IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRvIGxvYWQgYW5kIHNhdmUgaW4gbWVtb3J5LlxuXHQgKi9cblx0ZmlsZXM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gbG9hZC5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHR1cmw6IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBkaXNhYmxlIGxvYWRpbmcgZmlsZXMgaW50byBtZW1vcnkuXG5cdCAqL1xuXHRkaXNhYmxlRmlsZUxvYWRpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHN0YXJ0aW5nIGEgcGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTdGFydE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIFRoZSBIb3R0IHNpdGUgdG8gbG9hZC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IHRvIGRpc3BsYXkuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UgdG8gbG9hZC5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSB0byBsb2FkIHRoZSBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yPzogSG90U3RhcTtcblx0LyoqXG5cdCAqIEFueSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbmV3IHBhZ2UuXG5cdCAqL1xuXHRhcmdzPzogYW55O1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBtYXAgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTWFwPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIGZvciB0aGUgdGVzdGVyIGFwaS5cblx0ICovXG5cdHRlc3RlckFQSUJhc2VVcmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZSB0aGF0J3MgXG5cdCAqIHBvaW50ZWQgYXQgdGhlIHVybCBhYm92ZS5cblx0ICovXG5cdHRlc3RlckxhdW5jaHBhZFVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IGhhbmRsZXMgYWxsIEhUTUwgcHJlcHJvY2Vzc2luZywgdGhlbiBvdXRwdXRzIHRoZSBcbiAqIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFN0YXFcbntcblx0LyoqXG5cdCAqIFRoZSBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdGFwaT86IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHR0ZXN0ZXJBUEk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGV4ZWN1dGlvbiB0aGlzIGlzLlxuXHQgKi9cblx0bW9kZT86IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZXMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRwYWdlcz86IHsgW25hbWU6IHN0cmluZ106IEhvdFBhZ2UgfTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0Y29tcG9uZW50cz86IHtcblx0XHRbdGFnTmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHRjb21wb25lbnRUeXBlOiAobmV3ICAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaT86IEhvdEFQSSkgPT4gSG90Q29tcG9uZW50KSwgXG5cdFx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSwgXG5cdFx0XHRcdGFwaTogSG90QVBJXG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0aGF0IGNhbiBiZSBzdG9yZWQgZm9yIGxhdGVyIHVzZS5cblx0ICovXG5cdGZpbGVzPzogeyBbbmFtZTogc3RyaW5nXTogSG90RmlsZSB9O1xuXHQvKipcblx0ICogVGhlIGxvYWRlZCBob3RzaXRlLlxuXHQgKi9cblx0aG90U2l0ZT86IEhvdFNpdGU7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgY2xhc3MgSG90U3RhcSBpbXBsZW1lbnRzIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIEhvdFN0YXEuXG5cdCAqL1xuXHRzdGF0aWMgdmVyc2lvbjogc3RyaW5nID0gXCIwLjYuMjNcIjtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIGEgd2ViIGJ1aWxkLlxuXHQgKi9cblx0c3RhdGljIGlzV2ViOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBpc1JlYWR5Rm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhpcyBldmVudCB3aGVuIHRoaXMgcGFnZSBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5Rm9yVGVzdGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFcnJvcnMgdG8gZXhlY3V0ZSB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLlxuXHQgKi9cblx0c3RhdGljIGVycm9yczogeyBbbmFtZTogc3RyaW5nXTogeyByZWRpcmVjdFRvVXJsPzogc3RyaW5nOyBmdW5jPzogKGVyclR5cGU6IHN0cmluZykgPT4gdm9pZDsgfTsgfSA9IHt9O1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU6IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHR0ZXN0ZXJBUEk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBwYWdlcyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdHBhZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdGNvbXBvbmVudHM6IHtcblx0XHRbdGFnTmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHRjb21wb25lbnRUeXBlOiAobmV3ICAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaT86IEhvdEFQSSkgPT4gSG90Q29tcG9uZW50KSwgXG5cdFx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSwgXG5cdFx0XHRcdGFwaTogSG90QVBJXG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0aGF0IGNhbiBiZSBzdG9yZWQgZm9yIGxhdGVyIHVzZS5cblx0ICovXG5cdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlOiBIb3RTaXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdGFwaUNvbnRlbnQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0dGVzdGVyQXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhZ2UgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHRwYWdlQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogVGhlIHB1YmxpYyBrZXlzIHRvIGJlIGV4cG9zZWQuXG5cdCAqL1xuXHRwdWJsaWNLZXlzOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVycyB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIHRlc3RzLlxuXHQgKi9cblx0dGVzdGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdGVyIH07XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RTdGFxID0ge30pXG5cdHtcblx0XHR0aGlzLmFwaSA9IGNvcHkuYXBpIHx8IG51bGw7XG5cdFx0dGhpcy50ZXN0ZXJBUEkgPSBjb3B5LnRlc3RlckFQSSB8fCBudWxsO1xuXHRcdHRoaXMubW9kZSA9IGNvcHkubW9kZSB8fCBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdFx0dGhpcy5wYWdlcyA9IGNvcHkucGFnZXMgfHwge307XG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IHt9O1xuXHRcdHRoaXMuaG90U2l0ZSA9IGNvcHkuaG90U2l0ZSB8fCBudWxsO1xuXHRcdHRoaXMuYXBpQ29udGVudCA9IGBcblx0XHRcdHtcblx0XHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHR2YXIgbmV3YXBpID0gbmV3ICVhcGlfbmFtZSUgKCViYXNlX3VybCUsIG5ld0hvdENsaWVudCk7XG5cdFx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7XG5cdFx0XHR9YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHR3aW5kb3cuSG90U3RhcSA9IEhvdFN0YXFXZWIuSG90U3RhcTtcblx0XHR3aW5kb3cuSG90Q2xpZW50ID0gSG90U3RhcVdlYi5Ib3RDbGllbnQ7XG5cdFx0d2luZG93LkhvdEFQSSA9IEhvdFN0YXFXZWIuSG90QVBJO1xuXHRcdHdpbmRvdy5Ib3QgPSBIb3RTdGFxV2ViLkhvdDtcblx0PC9zY3JpcHQ+XG5cbiVhcGlzX3RvX2xvYWQlXG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHRmdW5jdGlvbiBob3RzdGFxX3N0YXJ0QXBwICgpXG5cdFx0e1xuXHRcdFx0bGV0IHRlbXBNb2RlID0gMDtcblxuXHRcdFx0aWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuXHRcdFx0XHR0ZW1wTW9kZSA9IEhvdC5Nb2RlO1xuXG5cdFx0XHQlbG9hZF9ob3Rfc2l0ZSVcblxuXHRcdFx0dmFyIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXHRcdFx0dmFyIHByb21pc2VzID0gW107XG5cdFx0XHQlZGV2ZWxvcGVyX21vZGUlXG5cblx0XHRcdCVhcGlfY29kZSVcblxuXHRcdFx0JXB1YmxpY19zZWNyZXRzJVxuXHRcdFx0JXRlc3Rlcl9hcGklXG5cdFx0XHQlbG9hZF9maWxlcyVcblxuXHRcdFx0cHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuXHRcdFx0UHJvbWlzZS5hbGwgKHByb21pc2VzKS50aGVuIChmdW5jdGlvbiAoKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5VXJsICh7XG5cdFx0XHRcdFx0XHRcdHVybDogXCIldXJsJVwiLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiBcIiV0aXRsZSVcIixcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6ICVhcmdzJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogJXRlc3Rlcl9uYW1lJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwOiAldGVzdGVyX21hcCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckFQSUJhc2VVcmw6ICV0ZXN0ZXJfYXBpX2Jhc2VfdXJsJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsOiAldGVzdGVyX2xhdW5jaHBhZF91cmwlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aG90c3RhcV9zdGFydEFwcCAoKTtcblx0PC9zY3JpcHQ+XG48L2hlYWQ+XG5cbjxib2R5PlxuPC9ib2R5PlxuXG48L2h0bWw+YDtcblx0XHR0aGlzLmxvZ2dlciA9IG5ldyBIb3RMb2cgKEhvdExvZ0xldmVsLk5vbmUpO1xuXHRcdHRoaXMucHVibGljS2V5cyA9IHt9O1xuXHRcdHRoaXMudGVzdGVycyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgYm9vbGVhbiB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUJvb2xlYW4gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuXG5cdHtcblx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInRydWVcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwiZmFsc2VcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllc1wiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJub1wiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwieWVwXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcIm5haFwiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRpZiAocGFyc2VJbnQgKHZhbHVlKSAhPSAwKVxuXHRcdFx0XHRyZXR1cm4gKHRydWUpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdH1cblxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW0gKG5hbWU6IHN0cmluZywgb2JqV2l0aFBhcmFtOiBhbnksIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZSwgdGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG9ialdpdGhQYXJhbVtuYW1lXTtcblxuXHRcdGlmICh2YWx1ZSA9PSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChyZXF1aXJlZCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGlmIChyZXF1aXJlZCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJHtuYW1lfS5gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW1EZWZhdWx0IChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFuIGVycm9yLiBUaGlzIGNhbm5vdCBiZSBhbiBhc3luYyBmdW5jdGlvbiBkdWUgdG8gdGhlIG5hdHVyZSBvZiBob3cgdGhpcyB3b3Jrcy5cblx0ICovXG5cdHN0YXRpYyBleGVjdXRlRXJyb3IgKGVyclR5cGU6IHN0cmluZylcblx0e1xuXHRcdGlmIChIb3RTdGFxLmVycm9yc1tlcnJUeXBlXSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCB1cmw6IHN0cmluZyA9IEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdLnJlZGlyZWN0VG9Vcmw7XG5cblx0XHRcdGlmICh1cmwgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHVybCAhPT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBmdW5jID0gSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0uZnVuYztcblxuXHRcdFx0aWYgKGZ1bmMgIT0gbnVsbClcblx0XHRcdFx0ZnVuYyAoZXJyVHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cblx0ICovXG5cdHN0YXRpYyBhc3luYyB3YWl0IChudW1NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHJldHVybiAoYXdhaXQgbmV3IFByb21pc2UgKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHNldFRpbWVvdXQgKCgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoKTtcblx0XHRcdFx0XHR9LCBudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHBhZ2UuXG5cdCAqL1xuXHRhZGRQYWdlIChwYWdlOiBIb3RQYWdlKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5wYWdlc1twYWdlLm5hbWVdID0gcGFnZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBwYWdlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRQYWdlIChwYWdlTmFtZTogc3RyaW5nKTogSG90UGFnZVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnBhZ2VzW3BhZ2VOYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgZmlsZS5cblx0ICovXG5cdGFkZEZpbGUgKGZpbGU6IEhvdEZpbGUpOiB2b2lkXG5cdHtcblx0XHRsZXQgbmFtZTogc3RyaW5nID0gZmlsZS5uYW1lO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS5sb2NhbEZpbGU7XG5cblx0XHRpZiAobmFtZSA9PT0gXCJcIilcblx0XHRcdG5hbWUgPSBmaWxlLnVybDtcblxuXHRcdHRoaXMuZmlsZXNbbmFtZV0gPSBmaWxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGZpbGUuXG5cdCAqL1xuXHRnZXRGaWxlIChuYW1lOiBzdHJpbmcpOiBIb3RGaWxlXG5cdHtcblx0XHRpZiAodGhpcy5maWxlc1tuYW1lXSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgZmlsZSAke25hbWV9YCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuZmlsZXNbbmFtZV0pO1xuXHR9XG5cblx0LyoqIFxuXHQgKiBLZWVwIHRoZSBjb250ZXh0IHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGluLlxuXHQgKiBcblx0ICogQHBhcmFtIGZ1bmMgVGhlIGRvY3VtZW50IGVsZW1lbnQncyBpZC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIG9iamVjdCB0byByZW1haW4gaW4gY29udGV4dC5cblx0ICogQHBhcmFtIFt2YWw9dW5kZWZpbmVkXSBBbiBhZGRpdGlvbmFsIHZhbHVlIHRvIHBhc3MgdG8gdGhlIGNvbnRleHQuXG5cdCAqIEByZXR1cm4gVGhlIHJldHVybmVkIHJlc3VsdCBmcm9tIHRoZSBmdW5jdGlvbiBmdW5jLlxuXHQgKi9cblx0c3RhdGljIGtlZXBDb250ZXh0KGZ1bmM6IEZ1bmN0aW9uLCBjb250ZXh0OiBhbnksIHZhbD86IGFueSk6IGFueVxuXHR7XG5cdFx0dmFyIG9ialJldHVybiA9IGZ1bmN0aW9uKClcblx0XHRcdHtcblx0XHRcdFx0dmFyIGFyeUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG5cdFx0XHRcdGlmICh2YWwgIT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdGFyeUFyZ3MucHVzaCh2YWwpO1xuXG5cdFx0XHRcdGlmIChjb250ZXh0ID09IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJ5QXJncyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gZnVuYy5hcHBseShjb250ZXh0LCBhcnlBcmdzKTtcblx0XHRcdH07XG5cblx0XHRyZXR1cm4gb2JqUmV0dXJuO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbmQgcmVnaXN0ZXIgYSBjb21wb25lbnQuXG5cdCAqL1xuXHRhZGRDb21wb25lbnQgKENvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBhcGk6IEhvdEFQSSA9IG51bGwsIFxuXHRcdGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG5cdHtcblx0XHRsZXQgdGVtcEFwaSA9IHRoaXMuYXBpXG5cdFx0XG5cdFx0aWYgKGFwaSAhPSBudWxsKVxuXHRcdFx0dGVtcEFwaSA9IGFwaTtcblxuXHRcdGxldCB0ZW1wQ29tcG9uZW50T2JqID0gbmV3IENvbXBvbmVudFR5cGUgKHRoaXMsIHRlbXBBcGkpO1xuXG5cdFx0aWYgKHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYENvbXBvbmVudCAke3RlbXBDb21wb25lbnRPYmoudGFnfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gPSB7IGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUsIHByb2Nlc3NvcjogdGhpcywgYXBpOiB0ZW1wQXBpIH07XG5cdFx0dGhpcy5yZWdpc3RlckNvbXBvbmVudCAodGVtcENvbXBvbmVudE9iai50YWcsIGVsZW1lbnRPcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0IGFueSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIG9ubHkgYWNjb3VudHMgZm9yIDx0cj4gY3VycmVudGx5LlxuXHQgKi9cblx0cHJvdGVjdGVkIHN0YXRpYyBmaXhIVE1MIChzdHI6IHN0cmluZyk6IHsgZml4ZWRTdHI6IHN0cmluZywgcXVlcnlTZWxlY3Rvcjogc3RyaW5nOyB9XG5cdHtcblx0XHQvLyBUYWtlIGludG8gYWNjb3VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFhNTCBhbmQgSFRNTC5cblx0XHRjb25zdCB0ZW1wU3RyOiBzdHJpbmcgPSBzdHIucmVwbGFjZSgvIFxcLz4vZywgJz4nKS5yZXBsYWNlKFxuXHRcdFx0Lyg8KGFyZWF8YmFzZXxicnxjb2x8Y29tbWFuZHxlbWJlZHxocnxpbWd8aW5wdXR8a2V5Z2VufGxpbmt8bWV0YXxwYXJhbXxzb3VyY2V8dHJhY2t8d2JyKS4qPz4pL2csICckMTwvJDI+Jyk7XG5cdFx0Y29uc3QgcGFyc2VkWE1MID0gbmV3IERPTVBhcnNlciAoKS5wYXJzZUZyb21TdHJpbmcgKGA8eG1sPiR7dGVtcFN0cn08L3htbD5gLCBcInRleHQveG1sXCIpO1xuXHRcdGxldCBxdWVyeVNlbGVjdG9yOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHBhcnNlZFhNTC5kb2N1bWVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRjb25zdCB0YWdOYW1lOiBzdHJpbmcgPSBwYXJzZWRYTUwuZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuWzBdLnRhZ05hbWUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdGlmICh0YWdOYW1lID09PSBcInRyXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHN0ciA9IGA8dGFibGU+JHtzdHJ9PC90YWJsZT5gO1xuXHRcdFx0XHRxdWVyeVNlbGVjdG9yID0gXCJ0Ym9keVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJ0aFwiKVxuXHRcdFx0e1xuXHRcdFx0XHRzdHIgPSBgPHRhYmxlPiR7c3RyfTwvdGFibGU+YDtcblx0XHRcdFx0cXVlcnlTZWxlY3RvciA9IHRhZ05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh7IGZpeGVkU3RyOiBzdHIsIHF1ZXJ5U2VsZWN0b3I6IHF1ZXJ5U2VsZWN0b3IgfSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYSBjb21wb25lbnQgZm9yIHVzZSBhcyBhIEhUTUwgdGFnLlxuXHQgKi9cblx0cHJvdGVjdGVkIHJlZ2lzdGVyQ29tcG9uZW50ICh0YWc6IHN0cmluZywgZWxlbWVudE9wdGlvbnM6IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucyA9IHVuZGVmaW5lZCk6IHZvaWRcblx0e1xuXHRcdGlmICgodGFnID09IG51bGwpIHx8ICh0YWcgPT09IFwiXCIpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIGNvbXBvbmVudHMgbXVzdCBoYXZlIGEgdGFnIWApO1xuXG5cdFx0aWYgKGN1c3RvbUVsZW1lbnRzLmdldCAodGFnKSAhPT0gdW5kZWZpbmVkKVxuXHRcdHtcblx0XHRcdC8vLyBAZml4bWUgVGhpcyBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gU2hvdWxkIHRoaXMgdGhyb3cgYW4gZXJyb3Igb3Igd2FybmluZz8gSSBkb24ndCB0aGluayBpdCBzaG91bGQuLi5cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCBwcm9jZXNzb3JDb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xuXG5cdFx0Y3VzdG9tRWxlbWVudHMuZGVmaW5lICh0YWcsIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnRcblx0XHRcdHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBjb25uZWN0ZWQgSG90Q29tcG9uZW50LlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y29tcG9uZW50OiBIb3RDb21wb25lbnQ7XG5cdFx0XHRcblx0XHRcdFx0Y29uc3RydWN0b3IgKClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHN1cGVyICgpO1xuXG5cdFx0XHRcdFx0bGV0IGNvbXBvbmVudEluZm8gPSBwcm9jZXNzb3JDb21wb25lbnRzW3RhZ107XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQgPSBuZXcgY29tcG9uZW50SW5mby5jb21wb25lbnRUeXBlIChjb21wb25lbnRJbmZvLnByb2Nlc3NvciwgY29tcG9uZW50SW5mby5hcGkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoaXMgaGVscHMgcGFyc2UgPHRyPiBhbmQgb3RoZXIgdGFncyB0aGF0IGRvIG5vdCBoYXZlIGEgcGFyZW50LlxuXHRcdFx0XHQgKiBcblx0XHRcdFx0ICogVGhhbmtzIEJyYW5kb24gTWNDb25uZWxsIVxuXHRcdFx0XHQgKiBcblx0XHRcdFx0ICogRnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjczMTM0NzkvbWFrZS1wYXJzZWZyb21zdHJpbmctcGFyc2Utd2l0aG91dC12YWxpZGF0aW9uXG5cdFx0XHRcdCAqIFxuXHRcdFx0XHQgKiBAdG9kbyBNYXkgcmVtb3ZlIHRoaXMgYXMgaXQgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHdlbGwgaW4gYSBsb3Qgb2YgZWRnZSBjYXNlcy5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHByb3RlY3RlZCBsb29zZVBhcnNlRnJvbVN0cmluZyAocGFyc2VyOiBET01QYXJzZXIsIHN0cjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoLyBcXC8+L2csICc+JykucmVwbGFjZSgvKDwoYXJlYXxiYXNlfGJyfGNvbHxjb21tYW5kfGVtYmVkfGhyfGltZ3xpbnB1dHxrZXlnZW58bGlua3xtZXRhfHBhcmFtfHNvdXJjZXx0cmFja3x3YnIpLio/PikvZywgJyQxPC8kMj4nKTtcblx0XHRcdFx0XHRjb25zdCB4ZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnPHhtbD4nK3N0cisnPC94bWw+JywgJ3RleHQveG1sJyk7XG5cdFx0XHRcdFx0Y29uc3QgaGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoJycsICd0ZXh0L2h0bWwnKTtcblx0XHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oeGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGRyZW4pKSB7XG5cdFx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0aGRvbS5ib2R5LmFwcGVuZENoaWxkKGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oaGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdhcmVhLGJhc2UsYnIsY29sLGNvbW1hbmQsZW1iZWQsaHIsaW1nLGlucHV0LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicpKSkge1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGVsZW0ub3V0ZXJIVE1MID0gJzwnK2VsZW0ub3V0ZXJIVE1MLnNsaWNlKDEpLnNwbGl0KCc8JylbMF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBoZG9tO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSAvLy8gQGZpeG1lIERvZXMgdGhpcyBSRUFMTFkgaGF2ZSB0byBiZSBzdGF0aWM/IEF3ZnVsIGlmIGl0IGRvZXMuLi5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJldHVybiAodGhpcy5jb21wb25lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzKTtcblx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgY29tcEh0bWxFbGVtZW50ID0gdGhpcztcblx0XHRcdFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XHRcblx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudC5odG1sRWxlbWVudHMgPSBbY29tcEh0bWxFbGVtZW50XTtcblx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudC5pbm5lciA9IHRoaXMuaW5uZXJIVE1MO1xuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgIT0gbnVsbClcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgKHRoaXMuYXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyOiBBdHRyID0gdGhpcy5hdHRyaWJ1dGVzW2lJZHhdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyTmFtZTogc3RyaW5nID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlICgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyVmFsdWU6IHN0cmluZyA9IGF0dHIudmFsdWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcImlkXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQubmFtZSA9IGF0dHJWYWx1ZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwibmFtZVwiKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcInZhbHVlXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQudmFsdWUgPSBhdHRyVmFsdWU7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lLmluZGV4T2YgKFwiaG90LVwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0clRlbXBOYW1lOiBzdHJpbmcgPSBhdHRyTmFtZS5zdWJzdHJpbmcgKDQpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudFthdHRyVGVtcE5hbWVdID0gYXR0clZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICgpID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdGxldCBvdXRwdXRzID0gYXdhaXQgdGhpcy5jb21wb25lbnQub3V0cHV0ICgpO1xuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUG9zdE91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0b3V0cHV0cyA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uUG9zdE91dHB1dCAob3V0cHV0cyk7XG5cdFx0XHRcblx0XHRcdFx0XHRsZXQgY29tcG9uZW50T3V0cHV0czogSG90Q29tcG9uZW50T3V0cHV0W10gPSBbXTtcblx0XHRcdFxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKG91dHB1dHMpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cy5wdXNoICh7IGh0bWw6IG91dHB1dHMgfSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChvdXRwdXRzIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMgPSBvdXRwdXRzO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRPdXRwdXRzID0gW291dHB1dHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdGZvciAobGV0IGlLZHggPSAwOyBpS2R4IDwgY29tcG9uZW50T3V0cHV0cy5sZW5ndGg7IGlLZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0ID0gY29tcG9uZW50T3V0cHV0c1tpS2R4XTtcblx0XHRcdFx0XHRcdGxldCBodG1sU3RyOiBzdHJpbmcgPSBvdXRwdXQuaHRtbDtcblx0XHRcdFx0XHRcdGxldCBhZGRGdW5jdGlvbnNUbzogc3RyaW5nID0gXCJcIjtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKG91dHB1dC5hZGRGdW5jdGlvbnNUbyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRhZGRGdW5jdGlvbnNUbyA9IG91dHB1dC5hZGRGdW5jdGlvbnNUbztcblx0XHRcdFxuXHRcdFx0XHRcdFx0bGV0IHN0cjogc3RyaW5nID0gSG90RmlsZS5wYXJzZUNvbnRlbnQgKGh0bWxTdHIsIHRydWUsIHsgXCJvdXRwdXRDb21tYW5kc1wiOiBmYWxzZSB9KTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VkICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHN0ciA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uUGFyc2VkIChzdHIpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRsZXQgaHRtbEhhbmRsZXI6IHsgZml4ZWRTdHI6IHN0cmluZywgcXVlcnlTZWxlY3Rvcjogc3RyaW5nOyB9ID0geyBmaXhlZFN0cjogXCJcIiwgcXVlcnlTZWxlY3RvcjogXCJcIiB9O1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25GaXhIVE1MICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGh0bWxIYW5kbGVyID0gYXdhaXQgdGhpcy5jb21wb25lbnQub25GaXhIVE1MIChzdHIpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoc3RyKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0bGV0IG5ld0RPTTogRG9jdW1lbnQgPSBudWxsO1xuXHRcdFx0XHRcdFx0bGV0IG5ld09iajogSFRNTEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25QYXJzZURPTSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRuZXdET00gPSBhd2FpdCB0aGlzLmNvbXBvbmVudC5vblBhcnNlRE9NIChodG1sSGFuZGxlci5maXhlZFN0cik7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdC8vbmV3RE9NID0gdGhpcy5sb29zZVBhcnNlRnJvbVN0cmluZyAobmV3IERPTVBhcnNlciAoKSwgc3RyKTtcblx0XHRcdFx0XHRcdFx0bmV3RE9NID0gbmV3IERPTVBhcnNlciAoKS5wYXJzZUZyb21TdHJpbmcgKGh0bWxIYW5kbGVyLmZpeGVkU3RyLCBcInRleHQvaHRtbFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGNvbXBvbmVudCBvdXRwdXQgZnJvbSAke3RoaXMuY29tcG9uZW50Lm5hbWV9YCk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgdGhyb3dFcnI6IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbmV3RE9NLmJvZHkuY2hpbGRyZW4ubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQgPSBuZXdET00uYm9keS5jaGlsZHJlbltpSWR4XTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlICgpID09PSBcInBhcnNlcmVycm9yXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5ld09iaiA9IGNoaWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvd0VyciA9IGZhbHNlO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmICh0aHJvd0VyciA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBPbmx5IGEgc2luZ2xlIGh0bWwgZWxlbWVudCBjYW4gY29tZSBmcm9tIGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50Lm5hbWV9LCBtdWx0aXBsZSBlbGVtZW50cyB3ZXJlIGRldGVjdGVkLmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3RvciA9PT0gXCJcIilcblx0XHRcdFx0XHRcdFx0bmV3T2JqID0gKDxIVE1MRWxlbWVudD5uZXdET00uYm9keS5jaGlsZHJlblswXSk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG5ld09iaiA9IG5ld0RPTS5xdWVyeVNlbGVjdG9yIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yKTtcblxuXHRcdFx0XHRcdFx0bGV0IGNoaWxkcmVuVG9SZWFkZDogTm9kZVtdID0gW107XG5cdFx0XHRcblx0XHRcdFx0XHRcdC8vIFNhdmUgdGhlIGNoaWxkcmVuIGZyb20gYmVpbmcgcmVwbGFjZWQuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMSk7IGlJZHggPiAtMTsgaUlkeC0tKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQ6IE5vZGUgPSB0aGlzLmNoaWxkcmVuW2lJZHhdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdGNoaWxkcmVuVG9SZWFkZC5wdXNoICh0aGlzLnJlbW92ZUNoaWxkIChjaGlsZCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHR0aGlzLnJlcGxhY2VXaXRoIChuZXdPYmopO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQuY2xpY2sgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0bmV3T2JqLm9uY2xpY2sgPSB0aGlzLmNvbXBvbmVudC5jbGljay5iaW5kICh0aGlzLmNvbXBvbmVudCk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBldmVudCA9IHRoaXMuY29tcG9uZW50LmV2ZW50c1trZXldO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0bmV3T2JqLmFkZEV2ZW50TGlzdGVuZXIgKGV2ZW50LnR5cGUsIGV2ZW50LmZ1bmMsIGV2ZW50Lm9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRsZXQgb2JqZWN0RnVuY3Rpb25zOiBzdHJpbmdbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICh0aGlzLmNvbXBvbmVudC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBBc3NvY2lhdGUgYW55IGZ1bmN0aW9ucyB0byB0aGUgbmV3bHkgY3JlYXRlZCBlbGVtZW50LlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBvYmplY3RGdW5jdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBvYmpGdW5jOiBzdHJpbmcgPSBvYmplY3RGdW5jdGlvbnNbaUlkeF07XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IFwiY29uc3RydWN0b3JcIilcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGxldCBwcm9wID0gdGhpcy5jb21wb25lbnRbb2JqRnVuY107XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocHJvcCkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBpc05ld0Z1bmN0aW9uOiBib29sZWFuID0gdHJ1ZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdC8vIEdvIHRocm91Z2ggZWFjaCBmdW5jdGlvbiBpbiB0aGUgYmFzZSBIb3RDb21wb25lbnQgYW5kIHNlZSBcblx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGVyZSdzIGFueSBtYXRjaGVzLiBJZiB0aGVyZSdzIGEgbWF0Y2gsIHRoYXQgbWVhbnMgXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgdHJ5aW5nIHRvIGFkZCBhbiBleGlzdGluZyBmdW5jdGlvbiwgYW5kIHdlIGRvbid0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2FubmEgZG8gdGhhdC4gU2tpcCBpdC5cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkyIGluIEhvdENvbXBvbmVudC5wcm90b3R5cGUpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IGtleTIpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzTmV3RnVuY3Rpb24gPSBmYWxzZTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAoaXNOZXdGdW5jdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdPYmpbb2JqRnVuY10gPSBIb3RTdGFxLmtlZXBDb250ZXh0ICh0aGlzLmNvbXBvbmVudFtvYmpGdW5jXSwgdGhpcy5jb21wb25lbnQpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWRkRnVuY3Rpb25zVG8gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBxdWVyeTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIChhZGRGdW5jdGlvbnNUbyk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRxdWVyeVtvYmpGdW5jXSA9IEhvdFN0YXEua2VlcENvbnRleHQgKHRoaXMuY29tcG9uZW50W29iakZ1bmNdLCB0aGlzLmNvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblByZVBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdG5ld09iaiA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgKG5ld09iaik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdGxldCBjb21wSHRtbEVsZW1lbnQyOiBIVE1MRWxlbWVudCA9IGF3YWl0IHRoaXMuY29tcG9uZW50Lm9uQ3JlYXRlZCAobmV3T2JqKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyZW50UGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLm9uUGFyZW50UGxhY2UgPSB0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLmhvdENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50O1xuXHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzLnB1c2ggKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LnBhcmVudFNlbGVjdG9yICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlOiBOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAob3V0cHV0LnBhcmVudFNlbGVjdG9yKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlLmFwcGVuZENoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGlmIChjb21wSHRtbEVsZW1lbnQyLm9uUGFyZW50UGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBjb21wSHRtbEVsZW1lbnQyLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwYXJlbnROb2RlLCBjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LnBsYWNlSGVyZVBhcmVudCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZVRvQ2hlY2sgPSBjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlQ2hlY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdHdoaWxlIChwYXJlbnROb2RlQ2hlY2tDb3VudGVyIDwgMTApIC8vLyBAdG9kbyBNYWtlIHRoaXMgY29udHJvbGxhYmxlIHdpdGggYSB2YXJpYWJsZSBmcm9tIHRoZSBjb21wb25lbnQuXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZVRvQ2hlY2sgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrIGluc3RhbmNlb2YgSFRNTEh0bWxFbGVtZW50KVxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgaG90LXBsYWNlLWhlcmUgZXhpc3RzLCBwbGFjZSB0aGUgY2hpbGRyZW4gdGhlcmUuIElmIG5vdCwgcGxhY2UgaXQgdW5kZXIgdGhlIFxuXHRcdFx0XHRcdFx0XHRcdC8vIG5ldyBlbGVtZW50LlxuXHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudE5vZGVUb0NoZWNrLnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtvdXRwdXQucGxhY2VIZXJlUGFyZW50fVwiXWApO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUFycmF5Lmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBsYWNlSGVyZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBdHRyQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgW2hvdC1wbGFjZS1oZXJlPVwiJHtvdXRwdXQucGxhY2VIZXJlUGFyZW50fVwiXWApO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXR0ckFycmF5Lmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBdHRyQXJyYXlbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgY29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGxhY2VIZXJlLCBjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdHBhcmVudE5vZGVUb0NoZWNrID0gcGFyZW50Tm9kZVRvQ2hlY2sucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlQ2hlY2tDb3VudGVyKys7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gQXBwZW5kIHRoZSBjaGlsZHJlbiB0byB0aGUgbmV3bHkgY3JlYXRlZCBIVE1MIGVsZW1lbnQuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuVG9SZWFkZC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGQ6IE5vZGUgPSBjaGlsZHJlblRvUmVhZGRbaUlkeF07XG5cdFx0XHRcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5hcHBlbmRDaGlsZCAoY2hpbGQpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkLm9uUGFyZW50UGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBjaGlsZC5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAoY29tcEh0bWxFbGVtZW50MiwgY2hpbGQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBvc3RQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyID0gYXdhaXQgdGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIucGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LCBlbGVtZW50T3B0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgbmV3IEhUTUwgZWxlbWVudChzKSB0byB0aGUgY3VycmVudCBkb2N1bWVudC5cblx0ICovXG5cdHN0YXRpYyBhZGRIdG1sIChwYXJlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50LCBodG1sOiBzdHJpbmcgfCBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXVxuXHR7XG5cdFx0bGV0IGZvdW5kUGFyZW50OiBIVE1MRWxlbWVudCA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChwYXJlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0Zm91bmRQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIChwYXJlbnQpO1xuXHRcdGVsc2Vcblx0XHRcdGZvdW5kUGFyZW50ID0gcGFyZW50O1xuXG5cdFx0aWYgKGZvdW5kUGFyZW50ID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBwYXJlbnQgJHtwYXJlbnR9IWApO1xuXG5cdFx0bGV0IHJlc3VsdDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAoaHRtbCkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0bGV0IGh0bWxIYW5kbGVyID0gSG90U3RhcS5maXhIVE1MIChodG1sKTtcblx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbmV3IERPTVBhcnNlciAoKS5wYXJzZUZyb21TdHJpbmcgKGh0bWxIYW5kbGVyLmZpeGVkU3RyLCBcInRleHQvaHRtbFwiKTtcblx0XHRcdGxldCBjaGlsZHJlbjogYW55ID0gbnVsbDtcblxuXHRcdFx0aWYgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IgPT09IFwiXCIpXG5cdFx0XHRcdGNoaWxkcmVuID0gbmV3RE9NLmJvZHkuY2hpbGRyZW47XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNoaWxkcmVuID0gbmV3RE9NLnF1ZXJ5U2VsZWN0b3IgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IpLmNoaWxkcmVuO1xuXG5cdFx0XHRsZXQgcmVzdWx0czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY2hpbGQ6IEhUTUxFbGVtZW50ID0gKDxIVE1MRWxlbWVudD5jaGlsZHJlbltpSWR4XSk7XG5cblx0XHRcdFx0cmVzdWx0cy5wdXNoIChmb3VuZFBhcmVudC5hcHBlbmRDaGlsZCAoY2hpbGQpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0cmVzdWx0ID0gZm91bmRQYXJlbnQuYXBwZW5kQ2hpbGQgKGh0bWwpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgSG90U2l0ZSdzIG5hbWUgaXMgdmFsaWQuXG5cdCAqL1xuXHRzdGF0aWMgY2hlY2tIb3RTaXRlTmFtZSAoaG90c2l0ZU5hbWU6IHN0cmluZywgdGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW5cblx0e1xuXHRcdGxldCB0aHJvd1RoZUV4Y2VwdGlvbiA9ICgpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7aG90c2l0ZU5hbWV9IGhhcyBhbiBpbnZhbGlkIG5hbWUhIFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eSBhbmQgbXVzdCBoYXZlIGEgdmFsaWQgTlBNIG1vZHVsZSBuYW1lLmApO1xuXHRcdFx0fTtcblxuXHRcdGxldCByZXN1bHRzID0gdmFsaWRhdGVNb2R1bGVOYW1lIChob3RzaXRlTmFtZSk7XG5cblx0XHRpZiAocmVzdWx0cy5lcnJvcnMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAocmVzdWx0cy5lcnJvcnMubGVuZ3RoID4gMClcblx0XHRcdFx0dGhyb3dUaGVFeGNlcHRpb24gKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbiB0aGUgc3VwcGxpZWQgY29udGVudCwgcmVwbGFjZSBhIGtleSBpbiBhICR7S0VZfSB3aXRoIGEgdmFsdWUuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgY29udGVudCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlcy5cblx0ICovXG5cdHN0YXRpYyByZXBsYWNlS2V5IChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBmaW5hbFN0cjogc3RyaW5nID0gY29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChgXFxcXCRcXFxceyR7a2V5fVxcXFx9YCwgXCJnXCIpLCB2YWx1ZSk7XG5cblx0XHRyZXR1cm4gKGZpbmFsU3RyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB2YWx1ZSBmcm9tIGEgSG90U2l0ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIHRoZSBob3RzaXRlIG9iamVjdC4gUmV0dXJucyBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0VmFsdWVGcm9tSG90U2l0ZU9iaiAoaG90c2l0ZTogSG90U2l0ZSwgcGFyYW1zOiBzdHJpbmdbXSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKGhvdHNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcHJldlZhbHVlOiBhbnkgPSBob3RzaXRlO1xuXG5cdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggb2JqZWN0IGluIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIFxuXHRcdFx0Ly8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmluYWwgcGFyYW1ldGVyLlxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBwYXJhbXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwYXJhbTogc3RyaW5nID0gcGFyYW1zW2lJZHhdO1xuXG5cdFx0XHRcdGlmIChwcmV2VmFsdWVbcGFyYW1dID09IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwcmV2VmFsdWUgPSBudWxsO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcmV2VmFsdWUgPSBwcmV2VmFsdWVbcGFyYW1dO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJldlZhbHVlICE9IG51bGwpXG5cdFx0XHRcdHZhbHVlID0gcHJldlZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBIb3RTaXRlLlxuXHQgKi9cblx0YXN5bmMgcHJvY2Vzc0hvdFNpdGUgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdEhvdFN0YXEuY2hlY2tIb3RTaXRlTmFtZSAodGhpcy5ob3RTaXRlLm5hbWUsIHRydWUpO1xuXG5cdFx0bGV0IHJvdXRlcyA9IHRoaXMuaG90U2l0ZS5yb3V0ZXM7XG5cdFx0bGV0IHRlc3RlclVybDogc3RyaW5nID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSBudWxsO1xuXHRcdGxldCBkcml2ZXI6IEhvdFRlc3REcml2ZXIgPSBudWxsO1xuXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNldHVwVGVzdGVyID0gKHBhcmVudE9iajogYW55KSA9PiBcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGNyZWF0ZU5ld1Rlc3RlcjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmouY3JlYXRlTmV3VGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlTmV3VGVzdGVyID0gcGFyZW50T2JqLmNyZWF0ZU5ld1Rlc3Rlcjtcblx0XHRcblx0XHRcdFx0XHRcdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IFwiVGVzdGVyXCI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmoudGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHBhcmVudE9iai50ZXN0ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmoudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSBwYXJlbnRPYmoudGVzdGVyTmFtZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGNyZWF0ZU5ld1Rlc3RlciA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgRmluZCBhIHdheSB0byBzZWN1cmVseSBhbGxvdyBkZXZzIHRvIHVzZSB0aGVpciBvd24gZHJpdmVycyBhbmQgdGVzdGVycy4uLlxuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgSGFjayBmb3IgZGVhbGluZyB3aXRoIFdlYlBhY2sncyBicy5cblx0XHRcdFx0XHRcdFx0XHRIb3RUZXN0ZXJNb2NoYSA9IHJlcXVpcmUgKFwiLi9Ib3RUZXN0ZXJNb2NoYVwiKS5Ib3RUZXN0ZXJNb2NoYTtcblx0XHRcdFx0XHRcdFx0XHRIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtID0gcmVxdWlyZSAoXCIuL0hvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIikuSG90VGVzdGVyTW9jaGFTZWxlbml1bTtcblx0XHRcdFx0XHRcdFx0XHRIb3RUZXN0U2VsZW5pdW1Ecml2ZXIgPSByZXF1aXJlIChcIi4vSG90VGVzdFNlbGVuaXVtRHJpdmVyXCIpLkhvdFRlc3RTZWxlbml1bURyaXZlcjtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlckFQSVVybCA9PT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHRlc3RlclVybCA9IHBhcmVudE9iai50ZXN0ZXJBUElVcmw7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai5kcml2ZXIgPT09IFwiSG90VGVzdFNlbGVuaXVtRHJpdmVyXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRkcml2ZXIgPSBuZXcgSG90VGVzdFNlbGVuaXVtRHJpdmVyICgpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmoudGVzdGVyID09PSBcIkhvdFRlc3Rlck1vY2hhXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIgPSBuZXcgSG90VGVzdGVyTW9jaGEgKHRoaXMsIHRlc3Rlck5hbWUsIHRlc3RlclVybCwgZHJpdmVyKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciA9PT0gXCJIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIgPSBuZXcgSG90VGVzdGVyTW9jaGFTZWxlbml1bSAodGhpcywgdGVzdGVyTmFtZSwgdGVzdGVyVXJsKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0ZXN0ZXIuZHJpdmVyID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRyaXZlciBzZXQhYCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai5jb21tYW5kRGVsYXkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIuZHJpdmVyLmNvbW1hbmREZWxheSA9IHBhcmVudE9iai5jb21tYW5kRGVsYXk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c2V0dXBUZXN0ZXIgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYik7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRzZXR1cFRlc3RlciAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyb3V0ZXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGVzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHJvdXRlc1trZXldO1xuXHRcdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlIChyb3V0ZSk7XG5cdFx0XHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcyxcblx0XHRcdFx0XHRcdG5hbWU6IHJvdXRlLm5hbWUgfHwgXCJcIixcblx0XHRcdFx0XHRcdHJvdXRlOiBrZXksXG5cdFx0XHRcdFx0XHRmaWxlczogW2ZpbGVdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0gcm91dGUubmFtZTtcblx0XHRcdFx0XHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLm1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChyb3V0ZS5tYXApID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IG1hcCAke3JvdXRlLm1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0ZXIudGVzdE1hcHNbcm91dGUubWFwXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwID0gbmV3IEhvdFRlc3RNYXAgKCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGRlc3RpbmF0aW9uczogSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RGVzdGluYXRpb24gfSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGUubWFwIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0gW107XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcm91dGUubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtpSWR4XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gcm91dGUubWFwKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtrZXkyXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnNba2V5Ml0gPSBuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IGRlc3RpbmF0aW9ucztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5kZXN0aW5hdGlvbk9yZGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXS5kZXN0aW5hdGlvbk9yZGVyID0gcm91dGUuZGVzdGluYXRpb25PcmRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuYXBpcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW2tleV07XG5cblx0XHRcdFx0aWYgKGFwaS5tYXAgPT0gbnVsbClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gZmFsc2UpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBrZXk7XG5cdFx0XHRcdFx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IG5ldyBIb3RUZXN0TWFwICgpO1xuXG5cdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFwaS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBtYXA6IHN0cmluZyA9IGFwaS5tYXBbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAobWFwKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQSB0ZXN0ZXIgd2FzIG5vdCBjcmVhdGVkIGZpcnN0ISBZb3UgbXVzdCBzcGVjaWZ5IG9uZSBpbiB0aGUgQ0xJIG9yIGluIEhvdFNpdGUuanNvbi5gKTtcblxuXHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLy8gQGZpeG1lIEFsbG93IHRoaXMgdG8gd29yayBmb3Igc2VydmVyLXNpZGUgYXMgd2VsbC4uLlxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuY29tcG9uZW50cylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNvbXBvbmVudCA9IHRoaXMuaG90U2l0ZS5jb21wb25lbnRzW2tleV07XG5cdFx0XHRcdGxldCBjb21wb25lbnRVcmw6IHN0cmluZyA9IGNvbXBvbmVudC51cmw7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBDcmVhdGUgdW5pdCB0ZXN0IGZvciBmZXRjaGluZywgbG9hZGluZywgYW5kIHJlZ2lzdGVyaW5nLlxuXHRcdFx0XHRsZXQgcmVzOiBhbnkgPSBhd2FpdCBmZXRjaCAoY29tcG9uZW50VXJsKTtcblx0XHRcdFx0bGV0IENvbXBvbmVudENsYXNzID0gZXZhbCAocmVzKTtcblxuXHRcdFx0XHR0aGlzLmFkZENvbXBvbmVudCAoQ29tcG9uZW50Q2xhc3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzID09IG51bGwpXG5cdFx0XHR0aGlzLmhvdFNpdGUucm91dGVzID0ge307XG5cblx0XHRsZXQgZGlzYWJsZUZpbGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZyAhPSBudWxsKVxuXHRcdFx0ZGlzYWJsZUZpbGVMb2FkaW5nID0gdGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZztcblxuXHRcdGlmIChkaXNhYmxlRmlsZUxvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgdGhpcy5sb2FkSG90RmlsZXMgKHRoaXMuaG90U2l0ZS5maWxlcyk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEhvdHNpdGUgaGFzIGZpbGUgbG9hZGluZyBkaXNhYmxlZC4uLmApO1xuXG5cdFx0aWYgKHRlc3RlciAhPSBudWxsKVxuXHRcdFx0dGhpcy5hZGRUZXN0ZXIgKHRlc3Rlcik7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBmcm9tIGEgSG90U2l0ZS5qc29uIGZpbGUuIEJlIHN1cmUgdG8gbG9hZCBhbmQgYXR0YWNoIGFueSB0ZXN0ZXJzIGJlZm9yZSBcblx0ICogbG9hZGluZyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGpzb25TdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgRG93bmxvYWRpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYERvd25sb2FkZWQgc2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGpzb25TdHIgPSByZXMudGV4dCAoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHBhdGggPSBwcGF0aC5ub3JtYWxpemUgKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgQWNjZXNzaW5nIEhvdFNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRqc29uU3RyID0gYXdhaXQgbmV3IFByb21pc2UgKFxuXHRcdFx0XHQocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZzLnJlYWRGaWxlIChwYXRoLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKGVyciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRocm93IGVycjtcblx0XG5cdFx0XHRcdFx0XHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nICgpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8gKGBBY2Nlc3NlZCBzaXRlICR7cGF0aH1gKTtcblx0XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUgKGNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuaG90U2l0ZSA9IEpTT04ucGFyc2UgKGpzb25TdHIpO1xuXHRcdHRoaXMuaG90U2l0ZS5ob3RzaXRlUGF0aCA9IHBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBhbiBhcnJheSBvZiBmaWxlcy4gSWYgYSBmaWxlIGFscmVhZHkgaGFzIGNvbnRlbnQsIGl0IHdpbGwgbm90IGJlIHJlbG9hZGVkIFxuXHQgKiB1bmxlc3MgZm9yY2VDb250ZW50TG9hZGluZyBpcyBzZXQgdG8gdHJ1ZS5cblx0ICovXG5cdGFzeW5jIGxvYWRIb3RGaWxlcyAoZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IHsgdXJsPzogc3RyaW5nOyBsb2NhbEZpbGU/OiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IH0gfSwgXG5cdFx0XHRmb3JjZUNvbnRlbnRMb2FkaW5nOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgTG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGUgPSBmaWxlc1trZXldO1xuXHRcdFx0bGV0IG5ld0ZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0bmV3RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcdFx0XHRcIm5hbWVcIjoga2V5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZS51cmwgIT0gbnVsbClcblx0XHRcdFx0bmV3RmlsZS51cmwgPSBmaWxlLnVybDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoZmlsZS5sb2NhbEZpbGUgIT0gbnVsbClcblx0XHRcdFx0XHRuZXdGaWxlLmxvY2FsRmlsZSA9IGZpbGUubG9jYWxGaWxlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgbG9hZENvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRpZiAoZmlsZS5jb250ZW50ICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUuY29udGVudCA9IGZpbGUuY29udGVudDtcblx0XHRcdFx0bG9hZENvbnRlbnQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZvcmNlQ29udGVudExvYWRpbmcgPT09IHRydWUpXG5cdFx0XHRcdGxvYWRDb250ZW50ID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGxvYWRDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZmlsZXBhdGg6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKG5ld0ZpbGUudXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdGZpbGVwYXRoID0gbmV3RmlsZS51cmw7XG5cblx0XHRcdFx0aWYgKG5ld0ZpbGUubG9jYWxGaWxlICE9PSBcIlwiKVxuXHRcdFx0XHRcdGZpbGVwYXRoID0gbmV3RmlsZS5sb2NhbEZpbGU7XG5cblx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlOiAke2ZpbGVwYXRofWApO1xuXHRcdFx0XHRhd2FpdCBuZXdGaWxlLmxvYWQgKCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBGaW5pc2hlZCBsb2FkaW5nIEhvdHQgZmlsZTogJHtmaWxlcGF0aH1gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hZGRGaWxlIChuZXdGaWxlKTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRmluaXNoZWQgbG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGUgdGhlIGNvbnRlbnQgdG8gc2VuZCB0byBhIGNsaWVudC5cblx0ICovXG5cdGdlbmVyYXRlQ29udGVudCAocm91dGVLZXk6IHN0cmluZywgbmFtZTogc3RyaW5nID0gXCJcIiwgdXJsOiBzdHJpbmcgPSBcIi4vXCIsXG5cdFx0XHRqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiLCBwYXNzQXJnczogYm9vbGVhbiA9IHRydWUsIFxuXHRcdFx0YXJnczogYW55ID0gbnVsbCk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IGFwaVNjcmlwdHM6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IGFwaUNvZGU6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IHB1YmxpY0tleXM6IHN0cmluZyA9IFwiXCI7XG5cblx0XHQvLy8gQHRvZG8gT3B0aW1pemUgdGhpcyBmdW5jdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLlxuXG5cdFx0Ly8gTG9hZCB0aGUgQVBJIHN0cmluZy5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGdsb2JhbEFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpXTtcblxuXHRcdFx0XHRcdGlmIChnbG9iYWxBcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgZXhpc3QhYCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGpzYXBpIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5saWJyYXJ5TmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEgYXBpTmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtnbG9iYWxBcGkuanNhcGl9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgYmFzZVVybDogc3RyaW5nID0gXCJcXFwiXFxcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHtnbG9iYWxBcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkuYXBpTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdGFwaUNvZGUgKz0gdGVtcEFQSUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XTtcblxuXHRcdFx0XHRpZiAocm91dGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChyb3V0ZS5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgYXBpID0gdGhpcy5ob3RTaXRlLmFwaXNbcm91dGUuYXBpXTtcblxuXHRcdFx0XHRcdFx0aWYgKGFwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBBUEkgJHtyb3V0ZS5hcGl9YCk7XG5cblx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0aWYgKGFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7cm91dGUuYXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChhcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEgbGlicmFyeU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYXBpLmFwaU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEgYXBpTmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQganNhcGlwYXRoID0gYXBpLmpzYXBpO1xuXHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtqc2FwaXBhdGh9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgYmFzZVVybDogc3RyaW5nID0gXCJcXFwiXFxcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChhcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHthcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfbmFtZVxcJS9nLCBhcGkuYXBpTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBhcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdGFwaUNvZGUgKz0gdGVtcEFQSUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aCAhPSBudWxsKVxuXHRcdFx0XHRcdGpzU3JjUGF0aCA9IHRoaXMuaG90U2l0ZS5zZXJ2ZXIuanNTcmNQYXRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnB1YmxpY0tleXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNlY3JldCA9IHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzW2tleV07XG5cdFx0XHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChzZWNyZXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VjcmV0KTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaS5jb25uZWN0aW9uID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDYW5ub3QgcGFzcyBzZWNyZXRzIGZyb20gdGhlIEFQSSBpZiB0aGVyZSdzIG5vIGNvbm5lY3Rpb24hYCk7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgc2VydmVyQ29ubjogSG90U2VydmVyID0gKDxIb3RTZXJ2ZXI+dGhpcy5hcGkuY29ubmVjdGlvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LnBhc3NTZWNyZXRGcm9tQVBJICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChzZXJ2ZXJDb25uLnNlY3JldHNba2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LmVudiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBAc2VjdnVsIElzIHRoaXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5PyBOZWVkIHRvIHZlcmlmeSB0aGF0IFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBvbmx5IHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGlzLiBBdCB0aGlzIHBvaW50LCBJIHRoaW5rIG9ubHkgdGhlIFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBzZXJ2ZXIgaGFzIGFjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBlbnZLZXk6IHN0cmluZyA9IHNlY3JldC5lbnY7XG5cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChwcm9jZXNzLmVudltlbnZLZXldKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHB1YmxpY0tleXMgKz0gYHByb2Nlc3Nvci5wdWJsaWNLZXlzW1wiJHtrZXl9XCJdID0gJHt2YWx1ZX07XFxuYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSB0aGlzLnBhZ2VDb250ZW50O1xuXHRcdGxldCBmaXhDb250ZW50ID0gKHRlbXBDb250ZW50OiBzdHJpbmcpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXZlbG9wZXJNb2RlU3RyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyQVBJU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkZXZlbG9wZXJNb2RlU3RyID0gYHRlbXBNb2RlID0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50O2A7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRoaXMudGVzdGVyQXBpQ29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRlc3RlckFQSVN0ci5yZXBsYWNlICgvXFwlYmFzZVxcX3Rlc3RlclxcX3VybFxcJS9nLCBgXFxcIiR7dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybH1cXFwiYCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgbG9hZEZpbGVzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyAodGhpcy5maWxlcykubGVuZ3RoID4gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgdmFyIGZpbGVzID0ge307XFxuXFxuYDtcblxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmZpbGVzKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBmaWxlID0gdGhpcy5maWxlc1trZXldO1xuXHRcdFx0XHRcdFx0bGV0IGZpbGVVcmw6IHN0cmluZyA9IGBcIiR7ZmlsZS51cmx9XCJgO1xuXHRcdFx0XHRcdFx0bGV0IGZpbGVDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsZS5jb250ZW50ICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5IChmaWxlLmNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEZpbmQgYW55IHNjcmlwdCB0YWdzIGFuZCBpbnRlcnJ1cHQgdGhlbSBzbyB0aGUgSFRNTCBwYXJzZXJzIFxuXHRcdFx0XHRcdFx0XHQvLyBkb24ndCBnZXQgY29uZnVzZWQuXG5cdFx0XHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPHNjcmlwdFwiLCBcImdtaVwiKSwgXCI8c2NyXFxcIiArIFxcXCJpcHRcIik7XG5cdFx0XHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPFxcXFwvc2NyaXB0XCIsIFwiZ21pXCIpLCBcIjwvc2NyXFxcIiArIFxcXCJpcHRcIik7XG5cblx0XHRcdFx0XHRcdFx0ZmlsZUNvbnRlbnQgPSBgLCBcImNvbnRlbnRcIjogJHtlc2NhcGVkQ29udGVudH1gO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdGZpbGVzW1wiJHtrZXl9XCJdID0geyBcInVybFwiOiAke2ZpbGVVcmx9JHtmaWxlQ29udGVudH0gfTtcXG5gO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgXFx0XFx0XFx0cHJvbWlzZXMucHVzaCAocHJvY2Vzc29yLmxvYWRIb3RGaWxlcyAoZmlsZXMpKTtcXG5gO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGl0bGVcXCUvZywgbmFtZSk7XG5cblx0XHRcdFx0aWYgKHBhc3NBcmdzID09PSB0cnVlKVxuXHRcdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFyZ3NcXCUvZywgXCJIb3QuQXJndW1lbnRzXCIpO1xuXG5cdFx0XHRcdGlmIChhcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXJnc1xcJS9nLCBKU09OLnN0cmluZ2lmeSAoYXJncykpO1xuXG5cdFx0XHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IHJvdXRlS2V5O1xuXHRcdFx0XHRsZXQgdGVzdGVyVXJsOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyTGF1bmNocGFkVXJsOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0gXCJUZXN0ZXJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyVXJsID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckxhdW5jaHBhZFVybCA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5sYXVuY2hwYWRVcmw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cdFx0XHRcdFx0XHRcdHRlc3Rlck1hcCA9IHJvdXRlLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlaG90c3RhcVxcX2pzXFxfc3JjXFwlL2csIGpzU3JjUGF0aCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWRldmVsb3BlclxcX21vZGVcXCUvZywgZGV2ZWxvcGVyTW9kZVN0cik7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2FwaVxcJS9nLCB0ZXN0ZXJBUElTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlzXFxfdG9cXF9sb2FkXFwlL2csIGFwaVNjcmlwdHMpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfaG90XFxfc2l0ZVxcJS9nLCBcIlwiKTsgLy8vIEBmaXhtZSBTaG91bGQgdGhpcyBvbmx5IGJlIGRvbmUgc2VydmVyLXNpZGU/XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWxvYWRcXF9maWxlc1xcJS9nLCBsb2FkRmlsZXMpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9jb2RlXFwlL2csIGFwaUNvZGUpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVwdWJsaWNcXF9zZWNyZXRzXFwlL2csIHB1YmxpY0tleXMpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV1cmxcXCUvZywgdXJsKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGVzdGVyXFxfbmFtZVxcJS9nLCBgXCIke3Rlc3Rlck5hbWV9XCJgKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGVzdGVyXFxfbWFwXFwlL2csIGBcIiR7dGVzdGVyTWFwfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2FwaVxcX2Jhc2VcXF91cmxcXCUvZywgYFwiJHt0ZXN0ZXJVcmx9XCJgKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGVzdGVyXFxfbGF1bmNocGFkXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyTGF1bmNocGFkVXJsfVwiYCk7XG5cblx0XHRcdFx0cmV0dXJuICh0ZW1wQ29udGVudCk7XG5cdFx0XHR9O1xuXHRcdGNvbnRlbnQgPSBmaXhDb250ZW50IChjb250ZW50KTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBFeHByZXNzIHJvdXRlcyBmcm9tIHRoZSBnaXZlbiBwYWdlcy4gQmUgc3VyZSB0byBsb2FkIHRoZSBcblx0ICogcGFnZXMgZmlyc3QgYmVmb3JlIGRvaW5nIHRoaXMuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIFxuXHQgKiBjdXN0b21pemVkIEV4cHJlc3MgYXBwbGljYXRpb25zLiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIGxvYWRlZCByb3V0ZXMgXG5cdCAqIGZyb20gdGhpcyBIb3RTdGFxIG9iamVjdCB3aXRoIEhvdEhUVFBTZXJ2ZXIsIGJlIHN1cmUgdG8gdXNlIFxuXHQgKiB0aGUgbG9hZEhvdFNpdGUgbWV0aG9kIGluIEhvdEhUVFBTZXJ2ZXIuXG5cdCAqL1xuXHRjcmVhdGVFeHByZXNzUm91dGVzIChleHByZXNzQXBwOiBhbnksIGpzU3JjUGF0aDogc3RyaW5nID0gXCIuL2pzL0hvdFN0YXEubWluLmpzXCIpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5wYWdlcylcblx0XHR7XG5cdFx0XHRsZXQgcGFnZTogSG90UGFnZSA9IHRoaXMucGFnZXNba2V5XTtcblx0XHRcdGNvbnN0IGNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuZ2VuZXJhdGVDb250ZW50IChwYWdlLnJvdXRlLCBwYWdlLm5hbWUsIHBhZ2UuZmlsZXNbMF0udXJsLCBqc1NyY1BhdGgpO1xuXG5cdFx0XHRleHByZXNzQXBwLmdldCAocGFnZS5yb3V0ZSwgKHJlcTogYW55LCByZXM6IGFueSkgPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcy5zZW5kIChjb250ZW50KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3RlciBmb3IgdXNlIGxhdGVyLlxuXHQgKi9cblx0YWRkVGVzdGVyICh0ZXN0ZXI6IEhvdFRlc3Rlcik6IHZvaWRcblx0e1xuXHRcdHRoaXMudGVzdGVyc1t0ZXN0ZXIubmFtZV0gPSB0ZXN0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldFdlYlRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIHdlYiBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgbWFwcyBmb3IgdGVzdGluZyBmcm9tIHRoZSBIb3RTaXRlLlxuXHQgKi9cblx0Z2V0QVBJVGVzdGluZ01hcHMgKCk6IHN0cmluZ1tdXG5cdHtcblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gSG90U2l0ZSB3YXMgbG9hZGVkIVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3RpbmcgYXBpIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSB0ZXN0aW5nIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBtYXBzIVwiKTtcblxuXHRcdHJldHVybiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlJ3Mga2V5IGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLnJvdXRlcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1trZXldO1xuXG5cdFx0XHRcdFx0aWYgKHJvdXRlLm5hbWUgPT09IG5hbWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Zm91bmRLZXkgPSBrZXk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoZm91bmRLZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlIGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBIb3RTaXRlUm91dGVcblx0e1xuXHRcdGxldCBmb3VuZFJvdXRlOiBIb3RTaXRlUm91dGUgPSBudWxsO1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gdGhpcy5nZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lKTtcblxuXHRcdGlmIChmb3VuZEtleSAhPT0gXCJcIilcblx0XHRcdGZvdW5kUm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW2ZvdW5kS2V5XTtcblxuXHRcdHJldHVybiAoZm91bmRSb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0ZXN0cy5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqIEBwYXJhbSBtYXBOYW1lIFRoZSBtYXAgb3IgbWFwcyB0byB1c2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nLCBtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRlc3Rlci5leGVjdXRlIChtYXBOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgd2ViIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyB3ZWIgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxXZWJUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRXZWJUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgYXBpIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyBhcGkgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxBUElUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRBUElUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAocGFnZU5hbWU6IHN0cmluZywgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLmdldFBhZ2UgKHBhZ2VOYW1lKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwYWdlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBsb2NhbCBmaWxlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBwcm9jZXNzTG9jYWxGaWxlIChsb2NhbEZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IGxvY2FsRmlsZXBhdGgsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcImxvY2FsRmlsZVwiOiBsb2NhbEZpbGVwYXRoXG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHVybCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc1VybCAob3B0aW9uczogSG90U3RhcnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcInVybFwiOiBvcHRpb25zLnVybFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogb3B0aW9ucy5wcm9jZXNzb3IsXG5cdFx0XHRcdFwibmFtZVwiOiBvcHRpb25zLm5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdLFxuXHRcdFx0XHRcInRlc3Rlck5hbWVcIjogb3B0aW9ucy50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcInRlc3Rlck1hcFwiOiBvcHRpb25zLnRlc3Rlck1hcFxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29udGVudCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0NvbnRlbnQgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJjb250ZW50XCI6IG9wdGlvbnMuY29udGVudFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXVxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHdpbmRvdyBoYXMgZmluaXNoZWQgbG9hZGluZywgZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHkgKHJlYWR5RnVuYzogKCkgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdGlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0XHRcdHJlYWR5RnVuYyAoKTtcblx0XHRlbHNlXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAoXCJsb2FkXCIsIHJlYWR5RnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgb3V0cHV0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyB1c2VPdXRwdXQgKG91dHB1dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0XHRsZXQgcGFyc2VyID0gbmV3IERPTVBhcnNlciAoKTtcblx0XHRcdGxldCBjaGlsZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcgKG91dHB1dCwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRsZXQgaHRtbE9iajogSFRNTEh0bWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTtcblxuXHRcdFx0aHRtbE9iai5pbm5lckhUTUwgPSBjaGlsZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmlubmVySFRNTDtcblxuXHRcdFx0Ly8gVGhhbmtzIHRvIG5ld2Z1cm5pdHVyZXkgYXQ6IFxuXHRcdFx0Ly8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjI5NDU4ODQvZG9tcGFyc2VyLWFwcGVuZGluZy1zY3JpcHQtdGFncy10by1oZWFkLWJvZHktYnV0LW5vdC1leGVjdXRpbmdcblx0XHRcdGxldCB0bXBTY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuXHRcdFx0aWYgKHRtcFNjcmlwdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyBwdXNoIGFsbCBvZiB0aGUgZG9jdW1lbnQncyBzY3JpcHQgdGFncyBpbnRvIGFuIGFycmF5XG5cdFx0XHRcdC8vICh0byBwcmV2ZW50IGRvbSBtYW5pcHVsYXRpb24gd2hpbGUgaXRlcmF0aW5nIG92ZXIgZG9tIG5vZGVzKVxuXHRcdFx0XHRsZXQgc2NyaXB0czogSFRNTFNjcmlwdEVsZW1lbnRbXSA9IFtdO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRtcFNjcmlwdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRzY3JpcHRzLnB1c2godG1wU2NyaXB0c1tpXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIHNjcmlwdCB0YWdzIGFuZCBjcmVhdGUgZHVwbGljYXRlIHRhZ3MgZm9yIGVhY2hcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IHM6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cblx0XHRcdFx0XHQvLyBhZGQgdGhlIG5ldyBub2RlIHRvIHRoZSBwYWdlXG5cdFx0XHRcdFx0c2NyaXB0c1tpXS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHMpO1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHRoZSBvcmlnaW5hbCAobm9uLWV4ZWN1dGluZykgbm9kZSBmcm9tIHRoZSBwYWdlXG5cdFx0XHRcdFx0c2NyaXB0c1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdHNbaV0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2U8dm9pZD4gKChyZXNvbHZlMiwgcmVqZWN0MikgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cy5vbmxvYWQgPSAoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0bGV0IGhhc1NyYzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0cy5zZXRBdHRyaWJ1dGUgKFwic3JjXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRoYXNTcmMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJ0eXBlXCIpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHMuc2V0QXR0cmlidXRlIChcInR5cGVcIiwgc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRzLmlubmVySFRNTCA9IHNjcmlwdHNbaV0uaW5uZXJIVE1MO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChoYXNTcmMgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciB0ZXN0ZXJzIHRvIGxvYWQuXG5cdCAqIFxuXHQgKiBAZml4bWUgVGhpcyBkb2VzIG5vdCB3YWl0IGZvciBBTEwgdGVzdGVycyB0byBmaW5pc2ggbG9hZGluZy4gT25seSBcblx0ICogdGhlIGZpcnN0IG9uZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyB3YWl0Rm9yVGVzdGVycyAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0d2hpbGUgKEhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cblx0XHRpZiAoSG90U3RhcS5vblJlYWR5Rm9yVGVzdGluZyAhPSBudWxsKVxuXHRcdFx0YXdhaXQgSG90U3RhcS5vblJlYWR5Rm9yVGVzdGluZyAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXR1cCB0aGUgdGVzdGVycyBhcGksIGlmIGFueS5cblx0ICovXG5cdHN0YXRpYyBzZXR1cFRlc3RlcnMgKHByb2Nlc3NvcjogSG90U3RhcSwgb3B0aW9uczogSG90U3RhcnRPcHRpb25zKVxuXHR7XG5cdFx0aWYgKHByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdGlmIChwcm9jZXNzb3IudGVzdGVyQVBJID09IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPT0gbnVsbClcblx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRsZXQgY2xpZW50OiBIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHRsZXQgdGVzdGVyQVBJOiBIb3RUZXN0ZXJBUEkgPSBuZXcgSG90VGVzdGVyQVBJIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwsIGNsaWVudCk7XG5cdFx0XHRcdHRlc3RlckFQSS5jb25uZWN0aW9uLmFwaSA9IHRlc3RlckFQSTtcblx0XHRcdFx0cHJvY2Vzc29yLnRlc3RlckFQSSA9IHRlc3RlckFQSTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0dXAgdGhlIHRlc3RlcnMgYXBpIG9uIHRoZSBjbGllbnQsIGlmIG5lZWRlZC5cblx0ICovXG5cdHN0YXRpYyBzZXR1cENsaWVudFRlc3RlcnMgKHByb2Nlc3NvcjogSG90U3RhcSk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwcm9jZXNzb3IubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHR7XG5cdFx0XHRvdXRwdXQgKz0gXG5gPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cbmZ1bmN0aW9uIGhvdHN0YXFfaXNEb2N1bWVudFJlYWR5ICgpXG57XG5pZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG57XG5pZiAoSG90Lk1vZGUgPT09IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcbntcbmxldCBmdW5jID0gZnVuY3Rpb24gKClcblx0e1xuXHRcdGlmIChIb3QuVGVzdGVyQVBJICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHRlc3RQYXRocyA9IHt9O1xuXHRcdFx0bGV0IHRlc3RFbGVtZW50cyA9IEpTT04uc3RyaW5naWZ5IChIb3QuQ3VycmVudFBhZ2UudGVzdEVsZW1lbnRzKTtcblx0XHRcdGxldCB0ZXN0TWFwcyA9IEpTT04uc3RyaW5naWZ5IChIb3QuQ3VycmVudFBhZ2UudGVzdE1hcHMpO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gSG90LkN1cnJlbnRQYWdlLnRlc3RQYXRocylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRlc3RQYXRoID0gSG90LkN1cnJlbnRQYWdlLnRlc3RQYXRoc1trZXldO1xuXG5cdFx0XHRcdHRlc3RQYXRoc1trZXldID0gdGVzdFBhdGgudG9TdHJpbmcgKCk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCB0ZXN0UGF0aHNTdHIgPSBKU09OLnN0cmluZ2lmeSAodGVzdFBhdGhzKTtcblxuXHRcdFx0SG90LlRlc3RlckFQSS50ZXN0ZXIucGFnZUxvYWRlZCAoe1xuXHRcdFx0XHRcdHRlc3Rlck5hbWU6IEhvdC5DdXJyZW50UGFnZS50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcdHRlc3Rlck1hcDogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck1hcCxcblx0XHRcdFx0XHRwYWdlTmFtZTogSG90LkN1cnJlbnRQYWdlLm5hbWUsXG5cdFx0XHRcdFx0dGVzdEVsZW1lbnRzOiB0ZXN0RWxlbWVudHMsXG5cdFx0XHRcdFx0dGVzdFBhdGhzOiB0ZXN0UGF0aHNTdHJcblx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChyZXNwLmVycm9yKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0SG90U3RhcVdlYi5Ib3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID0gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cbmlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0ZnVuYyAoKTtcbmVsc2Vcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmMpO1xufVxufVxufVxuXG5ob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKTtcbjwvc2NyaXB0PmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0IGZyb20gdGhlIGdpdmVuIHVybC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheVVybCAodXJsOiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uUmVhZHkgKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInVybFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCA9IHVybC51cmw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IHVybC5wcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncyA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5hcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gdXJsLmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTWFwID0gdXJsLnRlc3Rlck1hcDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB1cmwudGVzdGVyTmFtZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3RlckFQSUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSB1cmwudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0SG90U3RhcS5zZXR1cFRlc3RlcnMgKHByb2Nlc3Nvciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG9wdGlvbnMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5hcmdzID0gYXJncztcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMudXJsLmluZGV4T2YgKFwiaHN0cXNlcnZlXCIpIDwgMClcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3RTdGFxLnByb2Nlc3NVcmwgKG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRvdXRwdXQgKz0gSG90U3RhcS5zZXR1cENsaWVudFRlc3RlcnMgKHByb2Nlc3Nvcik7XG5cblx0XHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBob3R0IHNjcmlwdC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheUNvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZyB8IEhvdFN0YXJ0T3B0aW9ucywgbmFtZTogc3RyaW5nID0gbnVsbCwgXG5cdFx0XHRwcm9jZXNzb3I6IEhvdFN0YXEgPSBudWxsLCBhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxIb3RTdGFxPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTxIb3RTdGFxPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0SG90U3RhcS5vblJlYWR5IChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJjb250ZW50XCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoY29udGVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IGNvbnRlbnQubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gbmFtZTtcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoY29udGVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gXCJcIjsgLy8vIEBmaXhtZSBJcyB0aGlzIG9rIHRvIGRvP1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gY29udGVudC5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIChjb250ZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5jb250ZW50ID0gY29udGVudDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5jb250ZW50ID0gY29udGVudC5jb250ZW50O1xuXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gY29udGVudC5wcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncyA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQuYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IGNvbnRlbnQuYXJncztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3Rlck1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTWFwID0gY29udGVudC50ZXN0ZXJNYXA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IGNvbnRlbnQudGVzdGVyTmFtZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJBUElCYXNlVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gY29udGVudC50ZXN0ZXJBUElCYXNlVXJsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG5cdFx0XHRcdFx0XHRIb3RTdGFxLnNldHVwVGVzdGVycyAocHJvY2Vzc29yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3RTdGFxLnByb2Nlc3NDb250ZW50IChvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgSG90U3RhcS51c2VPdXRwdXQgKG91dHB1dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChwcm9jZXNzb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG59XG5cbmlmICh0eXBlb2YgKGRvY3VtZW50KSAhPT0gXCJ1bmRlZmluZWRcIilcbntcblx0bGV0IGxvYWRIb3RTdGFxU2l0ZSA9IGZ1bmN0aW9uICgpXG5cdHtcblx0XHRsZXQgaG90c3RhcUVsbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxXCIpO1xuXG5cdFx0Ly8gU2V0IHRoaXMgdG8gdHJ1ZSwganVzdCBpbiBjYXNlLi4uXG5cdFx0SG90U3RhcS5pc1dlYiA9IHRydWU7XG5cblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodHlwZW9mIChIb3RTdGFxV2ViKSAhPT0gXCJ1bmRlZmluZWRcIilcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3cuSG90U3RhcSA9IEhvdFN0YXFXZWIuSG90U3RhcTtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHdpbmRvdy5Ib3RDbGllbnQgPSBIb3RTdGFxV2ViLkhvdENsaWVudDtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHdpbmRvdy5Ib3RBUEkgPSBIb3RTdGFxV2ViLkhvdEFQSTtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHdpbmRvdy5Ib3QgPSBIb3RTdGFxV2ViLkhvdDtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHdpbmRvdy5Ib3RDb21wb25lbnQgPSBIb3RTdGFxV2ViLkhvdENvbXBvbmVudDtcblx0XHR9XG5cblx0XHRpZiAoaG90c3RhcUVsbXMubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgaG90c3RhcUVsbTogSFRNTEVsZW1lbnQgPSBob3RzdGFxRWxtc1swXTtcblxuXHRcdFx0c2V0VGltZW91dCAoYXN5bmMgZnVuY3Rpb24gKClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBnZXRBdHRyID0gKGVsbTogSFRNTEVsZW1lbnQsIGF0dHJOYW1lczogc3RyaW5nW10pID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgYXR0ck5hbWVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyTmFtZXNbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxtLmdldEF0dHJpYnV0ZSAoYXR0ck5hbWUpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGVsbS5nZXRBdHRyaWJ1dGUgKGF0dHJOYW1lKSk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChgZGF0YS0ke2F0dHJOYW1lfWApKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAodW5kZWZpbmVkKTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRsZXQgbG9hZFBhZ2U6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImxvYWQtcGFnZVwiLCBcImxvYWRQYWdlXCIsIFwic3JjXCJdKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGxldCByb3V0ZXI6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInJvdXRlclwiXSkgfHwgXCJcIjtcblx0XHRcdFx0XHRsZXQgbmFtZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wibmFtZVwiXSkgfHwgXCJkZWZhdWx0XCI7XG5cdFx0XHRcdFx0bGV0IGFyZ3M6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFyZ3NcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IGFwaUxpYnJhcnk6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFwaS1saWJyYXJ5XCIsIFwiYXBpTGlicmFyeVwiXSkgfHwgbnVsbDtcblx0XHRcdFx0XHRsZXQgYXBpTmFtZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXBpLW5hbWVcIiwgXCJhcGlOYW1lXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRcdGxldCBhcGlVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFwaS11cmxcIiwgXCJhcGlVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1uYW1lXCIsIFwidGVzdGVyTmFtZVwiXSkgfHwgXCJIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5cdFx0XHRcdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLW1hcFwiLCBcInRlc3Rlck1hcFwiXSkgfHwgbnVsbDtcblx0XHRcdFx0XHRsZXQgdGVzdGVyQXBpQmFzZVVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLWFwaS1iYXNlLXVybFwiLCBcInRlc3RlckFwaUJhc2VVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IHRlc3RlckxhdW5jaHBhZFVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLWxhdW5jaHBhZC11cmxcIiwgXCJ0ZXN0ZXJMYXVuY2hwYWRVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdFx0bGV0IGRvbnRSZXVzZVByb2Nlc3NvcjogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBwYXNzUmF3VXJsOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV0IGh0bWxTb3VyY2U6IHN0cmluZyA9IGhvdHN0YXFFbG0uaW5uZXJIVE1MIHx8IFwiXCI7XG5cdFx0XHRcdFx0bGV0IHJvdXRlck1hbmFnZXI6IHsgW3BhdGg6IHN0cmluZ106IHsgcmVkaXJlY3Q6IHN0cmluZzsgYmFzZVJlZGlyZWN0OiBzdHJpbmc7IGJhc2U6IHN0cmluZzsgc3JjOiBzdHJpbmc7IH0gfSA9IHt9O1xuXHRcdFx0XHRcdGxldCByb3V0ZXJXaWxkY2FyZHM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdFx0bGV0IHNlYXJjaDogVVJMU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyAod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cblx0XHRcdFx0XHRpZiAoZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wic3JjXCJdKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bG9hZFBhZ2UgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pO1xuXG5cdFx0XHRcdFx0aWYgKGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInBhc3NSYXdVcmxcIl0pICE9IG51bGwpXG5cdFx0XHRcdFx0XHRwYXNzUmF3VXJsID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcblx0XHRcdFx0XHRcdGRvbnRSZXVzZVByb2Nlc3NvciA9IHRydWU7XG5cblx0XHRcdFx0XHRsZXQgaHN0cWJhc2VyZWRpcmVjdDogc3RyaW5nID0gc2VhcmNoLmdldCAoXCJoc3RxYmFzZXJlZGlyZWN0XCIpO1xuXG5cdFx0XHRcdFx0aWYgKGhzdHFiYXNlcmVkaXJlY3QgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRoc3RxYmFzZXJlZGlyZWN0ID0gZGVjb2RlVVJJIChoc3RxYmFzZXJlZGlyZWN0KTtcblx0XHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSAoXCJcIiwgXCJcIiwgaHN0cWJhc2VyZWRpcmVjdCk7XG5cdFx0XHRcdFx0XHRsb2FkUGFnZSA9IGhzdHFiYXNlcmVkaXJlY3Q7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bGV0IGhvdHN0YXFFcnJvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxLWVycm9yXCIpO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBob3RzdGFxRXJyb3JzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGxldCBob3RzdGFxRXJyb3JFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcUVycm9yc1tpSWR4XTtcblx0XHRcdFx0XHRcdGxldCBlcnJvclN0YXR1czogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVycm9yRWxtLCBbXCJzdGF0dXNcIl0pO1xuXHRcdFx0XHRcdFx0bGV0IHVuc3VwcG9ydGVkQnJvd3Nlcjogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVycm9yRWxtLCBbXCJ1bnN1cHBvcnRlZC1icm93c2VyLXJlZGlyZWN0XCJdKTtcblxuXHRcdFx0XHRcdFx0aWYgKHVuc3VwcG9ydGVkQnJvd3NlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRIb3RTdGFxLmVycm9yc1tcInVuc3VwcG9ydGVkQnJvd3NlclwiXSA9IHsgcmVkaXJlY3RUb1VybDogdW5zdXBwb3J0ZWRCcm93c2VyIH07XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdEhvdFN0YXEuZXJyb3JzW2Ake2Vycm9yU3RhdHVzfWBdID0geyByZWRpcmVjdFRvVXJsOiB1bnN1cHBvcnRlZEJyb3dzZXIgfTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDaGVjayBpZiBhc3luYy9hd2FpdCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZXZhbCAoXCJhc3luYyAoKSA9PiB7fVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdEhvdFN0YXEuZXhlY3V0ZUVycm9yIChcInVuc3VwcG9ydGVkQnJvd3NlclwiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocm91dGVyICE9PSBcIlwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBob3RzdGFxUm91dGVyRWxtcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImhvdHN0YXEtcm91dGVyXCIpO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFSb3V0ZXJFbG1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGxldCBob3RzdGFxUm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG1zW2lJZHhdO1xuXHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyTmFtZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcVJvdXRlckVsbSwgW1wibmFtZVwiXSk7XG5cdFx0XHRcdFx0XHRcdGxldCBzZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFSb3V0ZXJFbG0sIFtcInNlcnZlLWxvY2FsXCIsIFwic2VydmVMb2NhbGx5XCJdKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJOYW1lID09PSByb3V0ZXIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBMb2FkIGFsbCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyLlxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlKZHggPSAwOyBpSmR4IDwgaG90c3RhcVJvdXRlckVsbS5jaGlsZE5vZGVzLmxlbmd0aDsgaUpkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZXJFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcVJvdXRlckVsbS5jaGlsZE5vZGVzW2lKZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyRWxtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJFbG0udGFnTmFtZS50b1VwcGVyQ2FzZSAoKSA9PT0gXCJST1VURVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlclBhdGg6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wicGF0aFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJlZGlyZWN0OiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInJlZGlyZWN0XCJdKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYmFzZVJlZGlyZWN0OiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcImJhc2UtcmVkaXJlY3RcIiwgXCJiYXNlUmVkaXJlY3RcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcImJhc2VcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZXJTcmM6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wic3JjXCJdKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJQYXRoLmluZGV4T2YgKFwiKlwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyTWFuYWdlcltyb3V0ZXJQYXRoXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVkaXJlY3Q6IHJlZGlyZWN0IHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJhc2VSZWRpcmVjdDogYmFzZVJlZGlyZWN0IHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJhc2U6IGJhc2UgfHwgdW5kZWZpbmVkLCBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3JjOiByb3V0ZXJTcmMgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNoZWNrUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBnb3RvUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxvd2VyU2VydmVMb2NhbGx5OiBzdHJpbmcgPSBzZXJ2ZUxvY2FsbHkudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICgobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwidHJ1ZVwiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwieWVzXCIpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCIxXCIpKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBsYXN0U2xhc2hQb3M6IG51bWJlciA9IGNoZWNrUGF0aC5sYXN0SW5kZXhPZiAoXCIvXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChsYXN0U2xhc2hQb3MgPiAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoZWNrUGF0aCA9IGNoZWNrUGF0aC5zdWJzdHJpbmcgKGxhc3RTbGFzaFBvcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z290b1BhdGggPSBnb3RvUGF0aC5zdWJzdHJpbmcgKGxhc3RTbGFzaFBvcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyV2lsZGNhcmRzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2VydmUgbG9jYWxseSBkb2Vzbid0IHJlYWxseSB3b3JrIHdpdGggd2lsZGNhcmRzXG5cdFx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIFRoaXMgaXNuJ3QgYWN0dWFsbHkgd29ya2luZyBsaWtlIGEgd2lsZGNhcmQgc2hvdWxkLiBUaGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUpkeCA9IDA7IGlKZHggPCByb3V0ZXJXaWxkY2FyZHMubGVuZ3RoOyBpSmR4KyspXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZVdpbGRjYXJkOiBzdHJpbmcgPSByb3V0ZXJXaWxkY2FyZHNbaUpkeF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB0ZW1wUm91dGVXaWxkY2FyZDogc3RyaW5nID0gcm91dGVXaWxkY2FyZC5yZXBsYWNlIChcIipcIiwgXCJcIik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoZWNrUGF0aC5pbmRleE9mICh0ZW1wUm91dGVXaWxkY2FyZCkgPiAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoaXMgc2ltcGx5IHJldHVybnMgdGhlIGtleSBpbiB0aGUgcm91dGVyTWFuYWdlciB0byBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hlY2tQYXRoID0gcm91dGVXaWxkY2FyZDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmluZCB0aGUgY29ycmVjdCByb3V0ZSBhbmQgbG9hZCBpdC5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyTWFuYWdlcltjaGVja1BhdGhdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5yZWRpcmVjdCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5yZWRpcmVjdDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uYmFzZVJlZGlyZWN0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7cm91dGVyTWFuYWdlcltjaGVja1BhdGhdLmJhc2VSZWRpcmVjdH0/aHN0cWJhc2VyZWRpcmVjdD0ke2VuY29kZVVSSSAoZ290b1BhdGgpfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyTWFuYWdlcltjaGVja1BhdGhdLnNyYyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsb2FkUGFnZSA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5zcmM7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0YXJncyA9IEpTT04ucGFyc2UgKGFyZ3MpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGFyZ3MgPSBIb3QuQXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0bGV0IGhhc0h0bWxTb3VyY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmIChodG1sU291cmNlICE9PSBcIlwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IGh0bWxTb3VyY2VDaGVjazogc3RyaW5nID0gaHRtbFNvdXJjZS5yZXBsYWNlICgvXFxzL2csJycpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaHRtbFNvdXJjZUNoZWNrICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRoYXNIdG1sU291cmNlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsZXQgdGVtcE1vZGUgPSAwO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRlbXBNb2RlID0gSG90Lk1vZGU7XG5cdFx0XHRcblx0XHRcdFx0XHRsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbDtcblxuXHRcdFx0XHRcdGlmIChkb250UmV1c2VQcm9jZXNzb3IgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKEhvdCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRwcm9jZXNzb3IubW9kZSA9IHRlbXBNb2RlO1xuXG5cdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6IGFyZ3Ncblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAobG9hZFBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHBhc3NSYXdVcmwgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAobG9hZFBhZ2UuaW5kZXhPZiAoXCJoc3Rxc2VydmVcIikgPCAwKVxuXHRcdFx0XHRcdFx0XHRcdGxvYWRQYWdlICs9IFwiP2hzdHFzZXJ2ZT1uYWhmYW1cIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSBsb2FkUGFnZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSB0ZXN0ZXJNYXA7XG5cdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0aWYgKHRlc3RlckFwaUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IHRlc3RlckFwaUJhc2VVcmw7XG5cblx0XHRcdFx0XHRpZiAodGVzdGVyTGF1bmNocGFkVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckxhdW5jaHBhZFVybCA9IHRlc3RlckxhdW5jaHBhZFVybDtcblxuXHRcdFx0XHRcdGlmIChhcGlOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGNsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cblx0XHRcdFx0XHRcdGlmIChhcGlVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYGFwaS11cmwgd2FzIG5vdCBzZXQhYCk7XG5cblx0XHRcdFx0XHRcdGxldCBwYXJlbnRMaWI6IGFueSA9IHdpbmRvdztcblxuXHRcdFx0XHRcdFx0aWYgKGFwaUxpYnJhcnkgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRwYXJlbnRMaWIgPSB3aW5kb3dbYXBpTGlicmFyeV07XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBuZXdBUEkgPSBuZXcgcGFyZW50TGliW2FwaU5hbWVdIChhcGlVcmwsIGNsaWVudCk7XG5cdFx0XHRcdFx0XHRuZXdBUEkuY29ubmVjdGlvbi5hcGkgPSBuZXdBUEk7XG5cdFx0XHRcdFx0XHRwcm9jZXNzb3IuYXBpID0gbmV3QVBJO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChoYXNIdG1sU291cmNlID09PSBmYWxzZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAobG9hZFBhZ2UgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBob3RzdGFxIHRhZyBtdXN0IGhhdmUgYSBzcmMsIEhUTUwgY29udGVudHMgaW5zaWRlIGl0LCBvciBhIHJvdXRlciBzZXQuYCk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheVVybCAob3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRIb3RTdGFxLmRpc3BsYXlDb250ZW50IChvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIDUwKTtcblx0XHR9XG5cdH07XG5cblx0Ly8vIEB0cy1pZ25vcmVcblx0d2luZG93LmV0aGVyZXVtMjIgPSB3aW5kb3cuZXRoZXJldW07XG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgbG9hZEhvdFN0YXFTaXRlKTtcbn1cbiIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG4vKipcbiAqIFRoaXMgYWN0dWFsbHkgZXhlY3V0ZXMgdGhlIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdERyaXZlclxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RUZXN0UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGV4ZWN1dGVkIGNvbW1hbmQuXG5cdCAqL1xuXHRjb21tYW5kRGVsYXk6IG51bWJlcjtcblx0LyoqXG5cdCAqIEFueSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgc2F2ZWQgYmV0d2VlbiB0aGUgZGlmZmVyZW50IHRlc3RpbmcgcnVucy5cblx0ICovXG5cdHBlcnNpc3RlbnREYXRhOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSwgcGFnZTogSG90VGVzdFBhZ2UgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0XHR0aGlzLmNvbW1hbmREZWxheSA9IDIwO1xuXHRcdHRoaXMucGVyc2lzdGVudERhdGEgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IG9iamVjdCBieSBpdCdzIG5hbWUuIElmIGEgKiBpcyB1c2VkLCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBcblx0ICogd2lsZGNhcmQgZm9yIHRoZSBvYmplY3QncyBuYW1lLiBJZiBhID4gaXMgdXNlZCwgdGhlbiB0aGUgbmFtZSB3aWxsIFxuXHQgKiBiZSB0cmVhdGVkIGFzIGEgQ1NTIHNlbGVjdG9yLlxuXHQgKi9cblx0cGFyc2VUZXN0T2JqZWN0IChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IG5hbWUuaW5kZXhPZiAoXCIqXCIpO1xuXHRcdGxldCB3aWxkY2FyZDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFwqLywgXCJcIik7XG5cdFx0XHR3aWxkY2FyZCA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdGxldCBzZWxlY3Rvcjogc3RyaW5nID0gYFtkYXRhLXRlc3Qtb2JqZWN0LW5hbWUke3dpbGRjYXJkfT0nJHtuYW1lfSddYDtcblx0XHRwb3MgPSBuYW1lLmluZGV4T2YgKFwiPlwiKTtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFw+LywgXCJcIik7XG5cdFx0XHRzZWxlY3RvciA9IG5hbWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzZWxlY3Rvcik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0YXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRhc3luYyBwcmludCAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUgKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZSBsaW5lLlxuXHQgKi9cblx0YXN5bmMgcHJpbnRsbiAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgdGhpcy5wcmludCAoYCR7bWVzc2FnZX1cXG5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoaXMgc2VydmVyIG9yIGRlc3Ryb3kgYW55dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSG90VGVzdERyaXZlci5cblx0ICovXG5cdGFic3RyYWN0IGRlc3Ryb3kgKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlIHRvIGEgdXJsLlxuXHQgKi9cblx0YWJzdHJhY3QgbmF2aWdhdGVUb1VybCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogV2FpdCBmb3IgYSBIb3RUZXN0RWxlbWVudCB0byBsb2FkLlxuXHQgKi9cblx0YWJzdHJhY3Qgd2FpdEZvclRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgb3B0aW9ucz86IEhvdFRlc3RFbGVtZW50T3B0aW9ucyk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIEZpbmQgYSBIb3RUZXN0RWxlbWVudCB0byB1dGlsaXplLlxuXHQgKi9cblx0YWJzdHJhY3QgZmluZFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgb3B0aW9ucz86IEhvdFRlc3RFbGVtZW50T3B0aW9ucyk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIFJ1biBhIEhvdFRlc3RFbGVtZW50IGNvbW1hbmQuXG5cdCAqL1xuXHRhYnN0cmFjdCBydW5Db21tYW5kICh0ZXN0RWxtOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgZnVuY05hbWU/OiBzdHJpbmcsIHZhbHVlU3RyPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogQW4gZXhwcmVzc2lvbiB0byB0ZXN0LlxuXHQgKi9cblx0YWJzdHJhY3QgYXNzZXJ0RWxlbWVudFZhbHVlIChuYW1lOiBzdHJpbmcgfCBIb3RUZXN0RWxlbWVudCwgdmFsdWU6IGFueSwgXG5cdFx0ZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogQW4gZXhwcmVzc2lvbiB0byB0ZXN0LlxuXHQgKi9cblx0YXN5bmMgYXNzZXJ0ICh2YWx1ZTogYW55LCBlcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGlmICghICh2YWx1ZSkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGVycm9yTWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIGEgc2VyaWVzIG9mIHRlc3QgZWxlbWVudHMuXG5cdCAqL1xuXHRhc3luYyBydW4gKGV4ZWN1dGlvbnM6IHN0cmluZ1tdIHwgc3RyaW5nW11bXSk6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZXhlY3V0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uOiBhbnkgPSBleGVjdXRpb25zW2lJZHhdO1xuXHRcdFx0bGV0IHRlc3RFbG06IEhvdFRlc3RFbGVtZW50ID0gbnVsbDtcblx0XHRcdGxldCBmdW5jOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAodHlwZW9mIChleGVjdXRpb24pID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHR0ZXN0RWxtID0gdGhpcy5wYWdlLnRlc3RFbGVtZW50c1tleGVjdXRpb25dO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGhpcyBpcyBnb2luZyB0byB3cmVjayBzZWxlY3RpbmcgdGVzdCBlbGVtZW50cyBieSB3aWxkY2FyZHMuXG5cdFx0XHRcdGlmICh0ZXN0RWxtID09IG51bGwpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdERyaXZlcjogVW5hYmxlIHRvIGZpbmQgdGVzdCBlbGVtZW50ICR7ZXhlY3V0aW9ufWApO1xuXG5cdFx0XHRcdGZ1bmMgPSB0ZXN0RWxtLmZ1bmM7XG5cdFx0XHRcdHZhbHVlID0gdGVzdEVsbS52YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGV4ZWN1dGlvbiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmFtZTogc3RyaW5nID0gZXhlY3V0aW9uWzBdO1xuXHRcdFx0XHR0ZXN0RWxtID0gdGhpcy5wYWdlLnRlc3RFbGVtZW50c1tuYW1lXTtcblxuXHRcdFx0XHQvLyBUaGlzIG51bGwgY2F0Y2ggaXMgc3BlY2lmaWNhbGx5IHRvIGhlbHAgZmluZCB3aWxkY2FyZCB0ZXN0IGVsZW1lbnRzLlxuXHRcdFx0XHRpZiAodGVzdEVsbSA9PSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3RUZXN0RWxlbWVudCAobmFtZSk7XG5cdFx0XHRcdFx0ZnVuYyA9IGV4ZWN1dGlvblsxXTtcblx0XHRcdFx0XHR2YWx1ZSA9IGV4ZWN1dGlvblsyXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmdW5jID0gdGVzdEVsbS5mdW5jO1xuXHRcdFx0XHRcdHZhbHVlID0gdGVzdEVsbS52YWx1ZTtcblxuXHRcdFx0XHRcdGlmIChleGVjdXRpb24ubGVuZ3RoID4gMSlcblx0XHRcdFx0XHRcdGZ1bmMgPSBleGVjdXRpb25bMV07XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0aW9uLmxlbmd0aCA+IDIpXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGV4ZWN1dGlvblsyXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0ZXN0RWxtLmZ1bmMgPSBmdW5jO1xuXHRcdFx0dGVzdEVsbS52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kICh0ZXN0RWxtKTtcblxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICh0aGlzLmNvbW1hbmREZWxheSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG59IiwiLyoqXG4gKiBIb3QgdGVzdCBlbGVtZW50IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU/OiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnRPcHRpb25zIGltcGxlbWVudHMgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBJZiB0aGUgdGVzdCBlbGVtZW50IGlzIG1pc3NpbmcsIGlnbm9yZSB0aGUgZXJyb3IuIFRoaXMgXG5cdCAqIHdpbGwgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbW1lZGlhdGVseSBcblx0ICogd2l0aG91dCBhbnkgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90VGVzdEVsZW1lbnRPcHRpb25zID0ge30pXG5cdHtcblx0XHR0aGlzLm11c3RCZVZpc2libGUgPSBjb3B5Lm11c3RCZVZpc2libGUgfHwgdHJ1ZTtcblx0XHR0aGlzLmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgPSBjb3B5Lmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgfHwgZmFsc2U7XG5cdH1cbn1cblxuLyoqXG4gKiBBIHRlc3QgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgdG8gdXNlLlxuXHQgKi9cblx0dmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RWxlbWVudCBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBcblx0ICogd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0LlxuXHQgKi9cblx0ZnVuYzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZyB8IElIb3RUZXN0RWxlbWVudCwgZnVuYzogc3RyaW5nID0gXCJcIiwgdmFsdWU6IGFueSA9IG51bGwpXG5cdHtcblx0XHRpZiAodHlwZW9mIChuYW1lKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdFx0dGhpcy5mdW5jID0gZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMubmFtZSA9IG5hbWUubmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IG5hbWUuZnVuYyB8fCBmdW5jO1xuXHRcdFx0dGhpcy52YWx1ZSA9IG5hbWUudmFsdWUgfHwgdmFsdWU7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFNpdGVNYXBQYXRoIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHRlc3QgcGF0aCBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIb3RUZXN0UGF0aCA9IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4vKipcbiAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlIGluIGEgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdERlc3RpbmF0aW9uXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVzdGluYXRpb24gdG8gdGFrZS5cblx0ICovXG5cdGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgZXhlY3V0aW5nIGl0J3MgXG5cdCAqIHRlc3RzIHdoZW4gaXQncyB0aW1lLlxuXHQgKi9cblx0YXV0b1N0YXJ0OiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbjogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uIHwgSG90U2l0ZU1hcFBhdGggPSBcIlwiLCBhdXRvU3RhcnQ6IGJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAoZGVzdGluYXRpb24pID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcblx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgSG90VGVzdERlc3RpbmF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uZGVzdGluYXRpb247XG5cdFx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gZGVzdGluYXRpb24uYXV0b1N0YXJ0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24ucGF0aDtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQSBwYWdlIGNvbnRhaW5pbmcgb25seSB0ZXN0IHJlbGF0ZWQgaW5mby5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RUZXN0UGFnZVxue1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBtYXAuXG5cdCAqL1xuXHR0ZXN0RWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIG1hcC5cblx0ICovXG5cdHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH07XG59XG5cbi8qKlxuICogTWFwcyB0aGUgcGF0aHMgdGhhdCBhcmUgdGFrZW4gdG8gY29tcGxldGUgYSB0ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdE1hcFxue1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIHBhdGhzIGFyZSB0byBiZSB0YWtlbi4gRWFjaCBkZXN0aW5hdGlvbiBpcyBhIHN0cmluZyBcblx0ICogaW4gYSB0eXBlIC0+IHBhdGggb3JkZXIuIFRoZSB0eXBlIGNvdWxkIGJlIGVpdGhlciBhIHBhZ2Ugb3IgYXBpIHJvdXRlLiBcblx0ICogRm9yIGV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiBbXG5cdCAqICAgICAgXCJwYWdlOnNpZ25pbl9wYWdlIC0+IHNpZ25pbl9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfdXNlcm5hbWVfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX3Bhc3N3b3JkX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV9uYW1lX3BhdGggLT4gY2hhbmdlX2FkZHJlc3NfcGF0aFwiLFxuXHQgKiBcdFx0XCJwYWdlOmFjY291bnRfcGFnZSAtPiBzaWdub3V0X3BhdGhcIixcblx0ICogXHRcdFwiYXBpOmFjY291bnRfYXBpX3JvdXRlIC0+IHNpZ25vdXRfcm91dGVfbWV0aG9kIC0+IHNpZ25vdXRfdGVzdF9wYXRoXCJcblx0ICogXVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIFRoZSBmaXJzdCBzdHJpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIC0+IHdpbGwgYWx3YXlzIGJlIHRoZSB0eXBlLCBzdWNoIGFzIGEgXG5cdCAqIHBhZ2Ugb3IgYW4gYXBpIHJvdXRlLiBBbnkgc3RyaW5ncyB0byB0aGUgcmlnaHQgb2YgdGhlIC0+IHdpbGwgYmUgYSBwYXRoLCBldmVuIFxuXHQgKiB3aGVuIGNoYWluaW5nIGFkZHRpb25hbCAtPidzLlxuXHQgKi9cblx0ZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbjsgfTtcblx0LyoqXG5cdCAqIFRoZSBvcmRlciBpbiB3aGljaCBkZXN0aW5hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGV4ZWN1dGUuIFRoaXMgaXMgXG5cdCAqIGlnbm9yZWQgaWYgdGhlIGRlc3RpbmF0aW9ucyBhcmUgYW4gYXJyYXkuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbk9yZGVyOiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhZ2VzIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRwYWdlczoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlXG5cdFx0fTtcblxuXHRjb25zdHJ1Y3RvciAoZGVzdGluYXRpb25zOiBzdHJpbmdbXSB8IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uOyB9ID0gW10sIFxuXHRcdHBhZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGFnZSB9ID0ge30sIGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdID0gW10pXG5cdHtcblx0XHQvLyBHbyB0aHJvdWdoIGFuZCBjb252ZXJ0IGFueSBzdHJpbmdzIGludG8gSG90VGVzdERlc3RpbmF0aW9ucy5cblx0XHRpZiAoZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2lJZHhdO1xuXG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBkZXN0aW5hdGlvbnMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnNba2V5XSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuZGVzdGluYXRpb25PcmRlciA9IGRlc3RpbmF0aW9uT3JkZXI7XG5cdFx0dGhpcy5wYWdlcyA9IHBhZ2VzO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0TWFwLCBIb3RUZXN0UGFnZSwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbi8qKlxuICogVGhlIHRlc3Qgc3RvcCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGVpdGhlciBhIGRlc3RpbmF0aW9uIG9yIFxuICogYSBwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFRlc3RTdG9wXG57XG5cdC8qKlxuXHQgKiBBIGNvbW1hbmQgdG8gZXhlY3V0ZS4gQ2FuIGJlOlxuXHQgKiAqIHByaW50KHgpXG5cdCAqICAgKiBQcmludCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlcidzIGNvbnNvbGUuXG5cdCAqICogcHJpbnRsbih4KVxuXHQgKiAgICogUHJpbnQgYSBtZXNzYWdlIHdpdGggYSBuZXcgbGluZSB0byB0aGUgc2VydmVyJ3MgY29uc29sZS5cblx0ICogKiB1cmwoeClcblx0ICogICAqIE9wZW4gYSB1cmwuIE11c3QgYmUgYW4gYWJzb2x1dGUgdXJsLlxuXHQgKiAqIHdhaXRGb3JUZXN0ZXJBUElEYXRhXG5cdCAqICAgKiBUaGlzIHdpbGwgd2FpdCBmb3IgdGhlIHRlc3RlciBBUEkgdG8gcmVjZWl2ZSBkYXRhLlxuXHQgKiAqIHdhaXQoeClcblx0ICogICAqIFRoaXMgd2lsbCB3YWl0IGZvciB4IG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqICogd2FpdEZvclRlc3RPYmplY3QoeClcblx0ICogICAqIFRoaXMgd2lsbCB3YWl0IGZvciBhIHRlc3Qgb2JqZWN0IHRvIGJlIGxvYWRlZC5cblx0ICovXG5cdGNtZDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc3RpbmF0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRkZXN0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byBleGVjdXRlLlxuXHQgKi9cblx0cGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZXN0aW5hdGlvbiBmb3IgYSB0ZXN0IHRvIHRha2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBtYXAuXG5cdCAqL1xuXHRtYXBOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSB0byBzdGFydCBhdC5cblx0ICovXG5cdHBhZ2U6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgcm91dGUgdG8gc3RhcnQgdXNpbmcuXG5cdCAqL1xuXHRhcGk6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRocyB0byB0YWtlIG9uIHRoZSBwYWdlLlxuXHQgKi9cblx0cGF0aHM6IEhvdFRlc3RTdG9wW107XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGVzdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RUZXN0ZXJcbntcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCB0aGF0IHdpbGwgY29uc3RydWN0IGZ1dHVyZSB1cmxzLlxuXHQgKi9cblx0YmFzZVVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgcHJvY2Vzc29yLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIHRlc3QgbWFwcyB0byB0ZXN0LlxuXHQgKi9cblx0dGVzdE1hcHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RNYXA7IH07XG5cdC8qKlxuXHQgKiBUaGUgZHJpdmVyIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGVzdHMuXG5cdCAqL1xuXHRkcml2ZXI6IEhvdFRlc3REcml2ZXI7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgbG9hZGluZz9cblx0ICovXG5cdGZpbmlzaGVkTG9hZGluZzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBzZXR0aW5nIHVwP1xuXHQgKi9cblx0aGFzQmVlblNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuRGVzdHJveWVkOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEsIG5hbWU6IHN0cmluZywgYmFzZVVybDogc3RyaW5nLCBcblx0XHRkcml2ZXI6IEhvdFRlc3REcml2ZXIsIHRlc3RNYXBzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0TWFwOyB9ID0ge30pXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy50ZXN0TWFwcyA9IHRlc3RNYXBzO1xuXHRcdHRoaXMuZHJpdmVyID0gZHJpdmVyO1xuXHRcdHRoaXMuZmluaXNoZWRMb2FkaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNCZWVuU2V0dXAgPSBmYWxzZTtcblx0XHR0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHNldHRpbmcgdXAgdGhlIHRlc3Rlci5cblx0ICovXG5cdGFic3RyYWN0IHNldHVwIChpc1dlYlJvdXRlOiBib29sZWFuLCB1cmw6IHN0cmluZywgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBkZXN0cm95aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhYnN0cmFjdCBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgaXQgd2lsbCBcblx0ICogY29udGludWUgYW5kIGV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMuIElmIHRoaXMgcmV0dXJucyBpdCB3aWxsIFxuXHQgKiBza2lwIGFsbCB0ZXN0IHBhdGhzIGFuZCBleGVjdXRlIG9uVGVzdEVuZCBpbnN0ZWFkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0U3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIEFQSSB0ZXN0IHBhdGggaGFzIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgXG5cdCAqIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlcndhcmRzLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0QVBJUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBwYWdlIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBcblx0ICogaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoU3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBcblx0XHRzdG9wOiBIb3RUZXN0U3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYSBwYWdlIHRlc3QgaGFzIGVuZGVkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0UGFnZVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHRlc3RQYXRoOiBIb3RUZXN0UGF0aCwgXG5cdFx0cmVzdWx0OiBhbnksIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGEgY29tbWFuZCBpcyBleGVjdXRlZC5cblx0ICovXG5cdGFzeW5jIG9uQ29tbWFuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgcGFnZTogSG90VGVzdFBhZ2UsIHN0b3A6IEhvdFRlc3RTdG9wLCBcblx0XHRjbWQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGVzdHMgYXJlIGZpbmlzaGVkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0RW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGlzIHRlc3RlciBoYXMgYmVlbiBleGVjdXRlZCBmcm9tIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBvbkV4ZWN1dGU/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGlzIHRlc3RlciBoYXMgZmluaXNoZWQgbG9hZGluZyBhbGwgZGF0YSBmcm9tIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBvbkZpbmlzaGVkTG9hZGluZz8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGZpbmlzaCBsb2FkaW5nIGFsbCBkYXRhLlxuXHQgKi9cblx0YXN5bmMgd2FpdEZvckRhdGEgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHdoaWxlICh0aGlzLmZpbmlzaGVkTG9hZGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0UGFnZSAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogSG90VGVzdFBhZ2Vcblx0e1xuXHRcdGxldCBwYWdlID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXS5wYWdlc1tkZXN0aW5hdGlvbi5wYWdlXTtcblxuXHRcdHJldHVybiAocGFnZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBwYXRoLlxuXHQgKi9cblx0Z2V0VGVzdFBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgcGF0aE5hbWU6IHN0cmluZyk6IEhvdFRlc3RQYXRoXG5cdHtcblx0XHRsZXQgcGFnZSA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV0ucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRyZXR1cm4gKHBhZ2UudGVzdFBhdGhzW3BhdGhOYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgZGVzdGluYXRpb24gSlNPTiBvYmplY3QgdG8gdXNlLlxuXHQgKi9cblx0c3RhdGljIGludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lOiBzdHJpbmcsIHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24pOiBIb3REZXN0aW5hdGlvblxuXHR7XG5cdFx0bGV0IGRlc3RpbmF0aW9uOiBzdHJpbmcgPSB0ZXN0RGVzdC5kZXN0aW5hdGlvbjtcblx0XHRsZXQgbmV3RGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0ge1xuXHRcdFx0XHRtYXBOYW1lOiBtYXBOYW1lLFxuXHRcdFx0XHRwYWdlOiBcIlwiLFxuXHRcdFx0XHRhcGk6IFwiXCIsXG5cdFx0XHRcdHBhdGhzOiBbXVxuXHRcdFx0fTtcblx0XHRsZXQgc3Ryczogc3RyaW5nW10gPSBkZXN0aW5hdGlvbi5zcGxpdCAoL1xcLVxcPi9nKTtcblx0XHRsZXQgdHlwZTogc3RyaW5nID0gc3Ryc1swXTtcblxuXHRcdGlmICh0eXBlLmxlbmd0aCA8IDIpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0aWYgKCh0eXBlWzBdID09PSBcIi9cIikgJiYgKHR5cGVbMV0gPT09IFwiL1wiKSlcblx0XHRcdHJldHVybiAobnVsbCk7XG5cblx0XHRsZXQgZ2V0VHlwZTogKHR5cGVTdHI6IHN0cmluZywgdHlwZURlbGltaXRlcjogc3RyaW5nKSA9PiBzdHJpbmcgPSBcblx0XHRcdCh0eXBlU3RyOiBzdHJpbmcsIHR5cGVEZWxpbWl0ZXI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcG9zOiBudW1iZXIgPSB0eXBlU3RyLmluZGV4T2YgKHR5cGVEZWxpbWl0ZXIpO1xuXHRcdFx0XHRsZXQgdHlwZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFxuXHRcdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlVmFsdWUgPSB0eXBlU3RyLnN1YnN0ciAocG9zICsgdHlwZURlbGltaXRlci5sZW5ndGgpO1xuXHRcdFx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVWYWx1ZS50cmltICgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICh0eXBlVmFsdWUpO1xuXHRcdFx0fTtcblxuXHRcdG5ld0Rlc3RpbmF0aW9uLnBhZ2UgPSBnZXRUeXBlICh0eXBlLCBcInBhZ2U6XCIpO1xuXHRcdG5ld0Rlc3RpbmF0aW9uLmFwaSA9IGdldFR5cGUgKHR5cGUsIFwiYXBpOlwiKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAxOyBpSWR4IDwgc3Rycy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbmV3UGF0aFN0cjogc3RyaW5nID0gc3Ryc1tpSWR4XTtcblx0XHRcdGxldCBuZXdQYXRoOiBIb3RUZXN0U3RvcCA9IHtcblx0XHRcdFx0XHRjbWQ6IFwiXCIsXG5cdFx0XHRcdFx0ZGVzdDogXCJcIixcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdG5ld1BhdGhTdHIgPSBuZXdQYXRoU3RyLnRyaW0gKCk7XG5cdFx0XHRuZXdQYXRoLmRlc3QgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImRlc3Q6XCIpO1xuXHRcdFx0bmV3UGF0aC5jbWQgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImNtZDpcIik7XG5cdFx0XHRuZXdQYXRoLnBhdGggPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcInBhdGg6XCIpO1xuXG5cdFx0XHRpZiAoKG5ld1BhdGguZGVzdCA9PSBcIlwiKSAmJiAobmV3UGF0aC5jbWQgPT0gXCJcIikgJiYgKG5ld1BhdGgucGF0aCA9PSBcIlwiKSlcblx0XHRcdFx0bmV3UGF0aC5wYXRoID0gbmV3UGF0aFN0cjtcblxuXHRcdFx0bmV3RGVzdGluYXRpb24ucGF0aHMucHVzaCAobmV3UGF0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChuZXdEZXN0aW5hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBBUEkncyB0ZXN0IHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgc2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmIChtZXRob2QgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRyeWluZyB0byBhY2Nlc3MgbnVsbCBtZXRob2Qgb24gZGVzdGluYXRpb24gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0uYCk7XG5cblx0XHQvLyBBIGR1bWIgaGFjayB0byBwcmV2ZW50IGFueSByZWN1cnNpb24gdGhhdCBjb3VsZCBvY2N1ci5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0bGV0IHRlc3RDYXNlT2JqZWN0OiBUZXN0Q2FzZU9iamVjdCA9IG1ldGhvZC50ZXN0Q2FzZXNbdGVzdE5hbWVdO1xuXG5cdFx0XHRpZiAodGVzdENhc2VPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBUZXN0IGNhc2Ugb2JqZWN0ICR7dGVzdE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0Q2FzZU9iamVjdC5mdW5jICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoRW5kICE9IG51bGwpXG5cdFx0XHRcdGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aEVuZCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGFuIEFQSSByb3V0ZS5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIG5lZWRzIGEgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRpZiAodGhpcy5wcm9jZXNzb3IuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFzc29jaWF0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYW4gQVBJIWApO1xuXG5cdFx0bGV0IHJvdXRlOiBIb3RSb3V0ZSA9IHRoaXMucHJvY2Vzc29yLmFwaS5yb3V0ZXNbZGVzdGluYXRpb24uYXBpXTtcblxuXHRcdGlmIChyb3V0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBUEkgZG9lcyBub3QgaGF2ZSByb3V0ZSAke2Rlc3RpbmF0aW9uLmFwaX0hYCk7XG5cblx0XHQvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXRoIGluIHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBjb21wbGV0ZS5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9uLnBhdGhzLmxlbmd0aDsgaUlkeCArPSAyKVxuXHRcdHtcblx0XHRcdGxldCBzdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHhdO1xuXHRcdFx0bGV0IHBhdGhOYW1lOiBzdHJpbmcgPSBzdG9wLnBhdGg7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHJvdXRlLmdldE1ldGhvZCAocGF0aE5hbWUpO1xuXHRcdFx0bGV0IG5leHRTdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHggKyAxXTtcblx0XHRcdGxldCB0ZXN0TmFtZTogc3RyaW5nID0gbmV4dFN0b3AucGF0aDtcblxuXHRcdFx0aWYgKG1ldGhvZCA9PSBudWxsKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBtZXRob2QgcmVsYXRlZCB0byBwYXRoICR7cGF0aE5hbWV9IGluIG1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9YCk7XG5cblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RBUElQYXRoIChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYSB0ZXN0IHBhZ2UgcGF0aC5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0UGFnZVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgc3RvcDogSG90VGVzdFN0b3AsIFxuXHRcdHNraXBFdmVudENhbGxzOiBib29sZWFuID0gZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCBydW5UZXN0UGF0aDogYm9vbGVhbiA9IHRydWU7XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0Ly8vIEBmaXhtZSBGb3Igc29tZSByZWFzb24gdGhlIGVycm9ycyBiZWluZyB0aHJvd24gaGVyZSBhcmUgbm90IGJlaW5nIHRocm93bi5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLmRyaXZlci5wYWdlID0gcGFnZTtcblxuXHRcdGxldCB0ZXN0UGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRsZXQgdGVzdFBhdGg6IEhvdFRlc3RQYXRoID0gcGFnZS50ZXN0UGF0aHNbdGVzdFBhdGhOYW1lXTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0UGF0aCA9PSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgcGF0aCAke3Rlc3RQYXRoTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIWApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0UGF0aCAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aEVuZCAoZGVzdGluYXRpb24sIHRlc3RQYXRoLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIGNtZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbW1hbmQgbWF0Y2hlcy5cblx0XHQgKi9cblx0XHRsZXQgaGFzQ21kOiAoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbikgPT4gYm9vbGVhbiA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcsIGNtZDogc3RyaW5nLCBoYXNBcmd1bWVudHM6IGJvb2xlYW4pOiBib29sZWFuID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoc3RvcC5jbWQgPT09IGNtZClcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHBvczogbnVtYmVyID0gc3RvcC5jbWQuaW5kZXhPZiAoXCIoXCIpO1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3MgcGFyZW50aGVzaXMsIGdldCB0aGUgaW5jb21pbmcgY29tbWFuZC5cblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0Q21kOiBzdHJpbmcgPSBzdG9wLmNtZC5zdWJzdHIgKDAsIHBvcyk7XG5cblx0XHRcdFx0XHRpZiAoaW5wdXRDbWQgPT09IGNtZClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEdldCB0aGUgYXJndW1lbnRzIGluIGEgY29tbWFuZC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGEgXG5cdFx0ICogc2luZ2xlIGFyZ3VtZW50IGZvciBub3cuXG5cdFx0ICogXG5cdFx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcmd1bWVudHMuXG5cdFx0ICovXG5cdFx0bGV0IGdldENtZEFyZ3M6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdbXSA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaCAoLyg/PVxcKCkoLio/KSg/PVxcKSkvZyk7XG5cblx0XHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZW1wTWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdFx0dGVtcE1hdGNoID0gdGVtcE1hdGNoLnN1YnN0ciAoMiwgdGVtcE1hdGNoLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRyZXN1bHRzLnB1c2ggKHRlbXBNYXRjaCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0cy5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke2lucHV0fSByZXF1aXJlcyBhcmd1bWVudHMsIGJ1dCBub25lIHdlcmUgc3VwcGxpZWQuYCk7XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHRcdH07XG5cblx0XHRsZXQgY21kRnVuYzogKChjbWRBcmdzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPikgPSBudWxsO1xuXHRcdGxldCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RlckFQSURhdGFcIiwgZmFsc2UpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMud2FpdEZvckRhdGEgKCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG51bU1pbGxpc2Vjb25kczogbnVtYmVyID0gcGFyc2VJbnQgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgSG90U3RhcS53YWl0IChudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInVybFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIubmF2aWdhdGVUb1VybCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50XCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50bG5cIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBpbnB1dDogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZHJpdmVyLnByaW50bG4gKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ3YWl0Rm9yVGVzdE9iamVjdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3RPYmplY3Q6IHN0cmluZyA9IEpTT04ucGFyc2UgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50ICh0ZXN0T2JqZWN0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoY21kRnVuYyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBDb21tYW5kICR7c3RvcC5jbWR9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0YXdhaXQgdGhpcy5vbkNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBjbWQsIGFyZ3MsIGNtZEZ1bmMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMgaW4gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aHMgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cdFx0XHRsZXQgcGFnZTogSG90VGVzdFBhZ2UgPSB0ZXN0TWFwLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXHRcblx0XHRcdGlmIChwYWdlID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogUGFnZSAke2Rlc3RpbmF0aW9uLnBhZ2V9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRpZiAoc3RvcC5kZXN0ICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdE1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdoZW4gdXNpbmcgdHlwZSAnZGVzdCcgaW4gYSBkZXN0aW5hdGlvbiBzdHJpbmcsIGFsbCBkZXN0aW5hdGlvbnMgaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gbXVzdCBiZSBuYW1lZC5gKTtcblxuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IHRlc3RNYXAuZGVzdGluYXRpb25zW3N0b3AuZGVzdF07XG5cdFx0XHRcdGxldCBuZXdEZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbi5tYXBOYW1lLCB0ZXN0RGVzdCk7XG5cblx0XHRcdFx0aWYgKG5ld0Rlc3RpbmF0aW9uICE9IG51bGwpXG5cdFx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAobmV3RGVzdGluYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3RvcC5jbWQgIT09IFwiXCIpXG5cdFx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZUNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBzdG9wLmNtZCk7XG5cblx0XHRcdGlmIChzdG9wLnBhdGggIT09IFwiXCIpXG5cdFx0XHRcdHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb24sIHN0b3AsIGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZSAobWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbbWFwTmFtZV07XG5cblx0XHRpZiAobWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke21hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gUHJvY2VzcyByb3V0ZXMgdGVzdGluZyBmaXJzdC5cblx0XHRsZXQgcm91dGVLZXk6IHN0cmluZyA9IHRoaXMucHJvY2Vzc29yLmdldFJvdXRlS2V5RnJvbU5hbWUgKG1hcE5hbWUpO1xuXHRcdGxldCB1cmw6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocm91dGVLZXkgIT09IFwiXCIpXG5cdFx0XHR1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtyb3V0ZUtleX1gO1xuXG5cdFx0bGV0IGV4ZWN1dGVEZXN0aW5hdGlvbjogKHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24sIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+ID0gXG5cdFx0XHRhc3luYyAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk6IHN0cmluZyA9IFwiXCIpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0RGVzdC5hdXRvU3RhcnQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRsZXQgZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0gSG90VGVzdGVyLmludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lLCB0ZXN0RGVzdCk7XG5cdFx0XHRcdGxldCBpc1dlYlJvdXRlOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBydW5UZXN0UGF0aHM6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdGlzV2ViUm91dGUgPSB0cnVlO1xuXHRcblx0XHRcdFx0aWYgKHRoaXMuc2V0dXAgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5TZXR1cCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zZXR1cCAoaXNXZWJSb3V0ZSwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XG5cdFx0XHRcdGlmICh0aGlzLm9uVGVzdFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdFx0cnVuVGVzdFBhdGhzID0gYXdhaXQgdGhpcy5vblRlc3RTdGFydCAoZGVzdGluYXRpb24sIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcblx0XHRcdFx0aWYgKHJ1blRlc3RQYXRocyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcblx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24uYXBpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RFbmQgKGRlc3RpbmF0aW9uKTtcblx0XG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3kgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZGVzdHJveSAoKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBtYXAgZGVzdGluYXRpb25zIGFyZSBpbiBhbiBhcnJheSwganVzdCBleGVjdXRlIHRob3NlIGluIG9yZGVyLlxuXHRcdGlmIChtYXAuZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IG1hcC5kZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgZGVzdGluYXRpb24gb3JkZXIsIHVzZSB0aGF0LlxuXHRcdFx0aWYgKG1hcC5kZXN0aW5hdGlvbk9yZGVyLmxlbmd0aCA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBoYXNFeGVjdXRlZEtleXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0Ly8gR28gdGhyb3VnaCB0aGUgZGVzdGluYXRpb24gb3JkZXIgYW5kIGV4ZWN1dGUgZWFjaCBvbmUuXG5cdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb3JkZXJLZXk6IHN0cmluZyA9IG1hcC5kZXN0aW5hdGlvbk9yZGVyW2lJZHhdO1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tvcmRlcktleV07XG5cblx0XHRcdFx0XHRpZiAodGVzdERlc3QgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogRGVzdGluYXRpb24gJHtvcmRlcktleX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRoYXNFeGVjdXRlZEtleXMucHVzaCAob3JkZXJLZXkpO1xuXHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIG9yZGVyS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlIGRlc3RpbmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgeWV0LlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBleGVjdXRlRGVzdDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhhc0V4ZWN1dGVkS2V5cy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXhlY3V0ZWRLZXk6IHN0cmluZyA9IGhhc0V4ZWN1dGVkS2V5c1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKGV4ZWN1dGVkS2V5ID09PSBrZXkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGV4ZWN1dGVEZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGV4ZWN1dGVEZXN0ID09PSB0cnVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBkZXN0aW5hdGlvbnMgaW4gYW55IG9yZGVyLlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEVuZCBvZiByb3V0ZXMgdGVzdGluZ1xuXG5cdFx0Ly8gU3RhcnQgb2YgQVBJIHRlc3RpbmdcblxuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCwgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIVFRQTWV0aG9kIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcblxuZXhwb3J0IGNsYXNzIEhvdFRlc3RlckFQSSBleHRlbmRzIEhvdEFQSVxue1xuXHRjb25zdHJ1Y3RvciAoYmFzZVVybDogc3RyaW5nLCBjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQgPSBudWxsLCBkYjogYW55ID0gbnVsbClcblx0e1xuXHRcdHN1cGVyKGJhc2VVcmwsIGNvbm5lY3Rpb24sIGRiKTtcblxuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdEFQSTtcblxuXHRcdGxldCByb3V0ZTogSG90Um91dGUgPSBuZXcgSG90Um91dGUgKGNvbm5lY3Rpb24sIFwidGVzdGVyXCIpO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoe1xuXHRcdFx0XHRcIm5hbWVcIjogXCJwYWdlTG9hZGVkXCIsIFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLnBhZ2VMb2FkZWQsXG5cdFx0XHRcdFwicGFyYW1ldGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3Rlck1hcFwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdGVyIG1hcCBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInBhZ2VOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSBwYWdlIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwidGVzdEVsZW1lbnRzXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJhcnJheVwiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3QgZWxlbWVudHMgb24gdGhlIHBhZ2UuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3RQYXRoc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwiYXJyYXlcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0IHBhdGhzIG9uIHRoZSBwYWdlLlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImV4ZWN1dGVUZXN0c1wiLFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmV4ZWN1dGVUZXN0cyxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIHRvIGV4ZWN1dGUuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSB3aGVuIHRlc3RzIGFyZSBjb21wbGV0ZS5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImhlYXJ0YmVhdFwiLFxuXHRcdFx0XHRcInR5cGVcIjogSFRUUE1ldGhvZC5HRVQsXG5cdFx0XHRcdFwib25TZXJ2ZXJFeGVjdXRlXCI6IHRoaXMuaGVhcnRiZWF0LFxuXHRcdFx0XHRcInJldHVybnNcIjogXCJSZXR1cm5zIHRydWUgYXMgYW4gYWNrbm93bGVkZ2VtZW50LlwiXG5cdFx0XHR9KTtcblx0XHR0aGlzLmFkZFJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcGFnZSBoYXMgZmluaXNoZWQgbG9hZGluZyBpbiBkZXZlbG9wbWVudCBtb2RlLlxuXHQgKi9cblx0YXN5bmMgcGFnZUxvYWRlZCAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyT2JqOiB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdFx0XHRcdHBhZ2VOYW1lOiBzdHJpbmc7XG5cdFx0XHRcdHRlc3RFbGVtZW50czogYW55O1xuXHRcdFx0XHR0ZXN0UGF0aHNTdHJzOiBhbnk7XG5cdFx0XHR9ID0ge1xuXHRcdFx0XHR0ZXN0ZXJOYW1lOiBqc29uT2JqW1widGVzdGVyTmFtZVwiXSxcblx0XHRcdFx0dGVzdGVyTWFwOiBqc29uT2JqW1widGVzdGVyTWFwXCJdLFxuXHRcdFx0XHRwYWdlTmFtZToganNvbk9ialtcInBhZ2VOYW1lXCJdLFxuXHRcdFx0XHR0ZXN0RWxlbWVudHM6IGpzb25PYmpbXCJ0ZXN0RWxlbWVudHNcIl0sXG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGpzb25PYmpbXCJ0ZXN0UGF0aHNcIl1cblx0XHRcdH07XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gdGVzdGVyT2JqKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCB0ZXN0T2JqOiBhbnkgPSB0ZXN0ZXJPYmpba2V5XTtcblx0XHRcdGxldCB0aHJvd0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmICh0ZXN0T2JqID09IG51bGwpXG5cdFx0XHRcdHRocm93RXJyb3IgPSB0cnVlO1xuXG5cdFx0XHRpZiAoKHRlc3Rlck9iai50ZXN0ZXJOYW1lID09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3Rlck1hcCA9PT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJNYXB9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0ZXN0ZXIudGVzdE1hcHNbdGVzdGVyT2JqLnRlc3Rlck1hcF07XG5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdGVyQVBJOiBUZXN0ZXIgbWFwICR7dGVzdGVyT2JqLnRlc3Rlck1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0gPSB7XG5cdFx0XHRcdFwidGVzdEVsZW1lbnRzXCI6IHt9LFxuXHRcdFx0XHRcInRlc3RQYXRoc1wiOiB7fVxuXHRcdFx0fTtcblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0udGVzdEVsZW1lbnRzID0gdGVzdGVyT2JqLnRlc3RFbGVtZW50cztcblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0udGVzdFBhdGhzID0gdGVzdFBhdGhzO1xuXG5cdFx0dGVzdGVyLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG5cblx0XHRpZiAodGVzdGVyLm9uRmluaXNoZWRMb2FkaW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCB0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgKCk7XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIHRlc3RzIGZvciBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdHMgKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IGpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdO1xuXHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IGpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl07XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT0gbnVsbCkgfHwgKHRlc3Rlck1hcCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PT0gXCJcIikgfHwgKHRlc3Rlck1hcCA9PT0gXCJcIikpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRsZXQgc2VydmVyOiBIb3RTZXJ2ZXIgPSAoPEhvdFNlcnZlcj50aGlzLmNvbm5lY3Rpb24pO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChzZXJ2ZXIuZXhlY3V0ZVRlc3RzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0YXdhaXQgc2VydmVyLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgdGVzdGVyTWFwKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3BvbmRzIHdpdGggdHJ1ZSB0byBoZWFydGJlYXQgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBoZWFydGJlYXQgKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEsIEhvdFN0YXJ0T3B0aW9ucywgSUhvdFN0YXEsIFxuXHRIb3RTaXRlLCBIb3RTaXRlUm91dGUsIEhvdFNpdGVNYXBQYXRoIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90LCBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vLyBTZXJ2ZXIgc3R1ZmZcbmltcG9ydCB7IEhvdEFQSSwgRXZlbnRFeGVjdXRpb25UeXBlLCBBUEl0b0xvYWQgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIVFRQTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24sIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFNlcnZlciwgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5cbi8vIFRlc3Rpbmcgc3R1ZmZcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBJSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMsIElIb3RUZXN0RWxlbWVudE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdGVyLCBIb3RUZXN0U3RvcCwgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3RUZXN0ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RlckFQSSB9IGZyb20gXCIuL0hvdFRlc3RlckFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0UGF0aCwgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbkhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4vLyBDYW4ndCBleHBvcnQgaW50ZXJmYWNlcyBmcm9tIGhlcmUgOihcblxubW9kdWxlLmV4cG9ydHNbXCJIb3RTdGFxXCJdID0gSG90U3RhcTtcbm1vZHVsZS5leHBvcnRzW1wiSG90XCJdID0gSG90O1xubW9kdWxlLmV4cG9ydHNbXCJEZXZlbG9wZXJNb2RlXCJdID0gRGV2ZWxvcGVyTW9kZTtcbm1vZHVsZS5leHBvcnRzW1wiSG90Q29tcG9uZW50XCJdID0gSG90Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHNbXCJIb3RBUElcIl0gPSBIb3RBUEk7XG5tb2R1bGUuZXhwb3J0c1tcIkV2ZW50RXhlY3V0aW9uVHlwZVwiXSA9IEV2ZW50RXhlY3V0aW9uVHlwZTtcbm1vZHVsZS5leHBvcnRzW1wiSG90RmlsZVwiXSA9IEhvdEZpbGU7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdExvZ1wiXSA9IEhvdExvZztcbm1vZHVsZS5leHBvcnRzW1wiSG90TG9nTGV2ZWxcIl0gPSBIb3RMb2dMZXZlbDtcbm1vZHVsZS5leHBvcnRzW1wiSG90UGFnZVwiXSA9IEhvdFBhZ2U7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFJvdXRlXCJdID0gSG90Um91dGU7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFJvdXRlTWV0aG9kXCJdID0gSG90Um91dGVNZXRob2Q7XG5tb2R1bGUuZXhwb3J0c1tcIkhUVFBNZXRob2RcIl0gPSBIVFRQTWV0aG9kO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RTZXJ2ZXJcIl0gPSBIb3RTZXJ2ZXI7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFNlcnZlclR5cGVcIl0gPSBIb3RTZXJ2ZXJUeXBlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RDbGllbnRcIl0gPSBIb3RDbGllbnQ7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3RlclwiXSA9IEhvdFRlc3Rlcjtcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdGVyQVBJXCJdID0gSG90VGVzdGVyQVBJO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0TWFwXCJdID0gSG90VGVzdE1hcDtcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdERlc3RpbmF0aW9uXCJdID0gSG90VGVzdERlc3RpbmF0aW9uO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0RWxlbWVudFwiXSA9IEhvdFRlc3RFbGVtZW50O1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0RWxlbWVudE9wdGlvbnNcIl0gPSBIb3RUZXN0RWxlbWVudE9wdGlvbnM7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3REcml2ZXJcIl0gPSBIb3RUZXN0RHJpdmVyOyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgdXNlZCAnbW9kdWxlJyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODU5KTtcbiJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwic2VsZiIsIkZvcm1EYXRhIiwid2luZG93IiwiYXNzaWduIiwidGFyZ2V0IiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsImluaXQiLCJjb252ZXJ0ZXIiLCJkZWZhdWx0QXR0cmlidXRlcyIsInNldCIsInZhbHVlIiwiYXR0cmlidXRlcyIsImRvY3VtZW50IiwiZXhwaXJlcyIsIkRhdGUiLCJub3ciLCJ0b1VUQ1N0cmluZyIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJzdHJpbmdpZmllZEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVOYW1lIiwic3BsaXQiLCJjb29raWUiLCJ3cml0ZSIsIk9iamVjdCIsImNyZWF0ZSIsImdldCIsImNvb2tpZXMiLCJqYXIiLCJwYXJ0cyIsInNsaWNlIiwiam9pbiIsImZvdW5kS2V5IiwicmVhZCIsImUiLCJyZW1vdmUiLCJ3aXRoQXR0cmlidXRlcyIsInRoaXMiLCJ3aXRoQ29udmVydGVyIiwiZnJlZXplIiwicGF0aCIsImZhY3RvcnkiLCJnbG9iYWwiLCJFcnJvciIsImdldEdsb2JhbCIsImZldGNoIiwiYmluZCIsIkhlYWRlcnMiLCJSZXF1ZXN0IiwiUmVzcG9uc2UiLCJEZXZlbG9wZXJNb2RlIiwiSG90Iiwic3RhdGljIiwiZmlsZSIsImFyZ3MiLCJIb3RTdGFxIiwiaXNXZWIiLCJsb3dlckZpbGUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJlY2hvIiwiZ2V0RmlsZSIsInJlcyIsImh0dHBSZXF1ZXN0Iiwib3V0cHV0IiwidGV4dCIsImV2YWwiLCJhcHBseSIsImZpbGVOYW1lIiwidGVtcEZpbGUiLCJDdXJyZW50UGFnZSIsInByb2Nlc3NvciIsInBhZ2UiLCJjb250ZW50IiwicHJvY2VzcyIsIkhvdEZpbGUiLCJ1cmwiLCJsb2NhbEZpbGUiLCJsb2FkIiwicm91dGUiLCJkYXRhIiwiaHR0cE1ldGhvZCIsImZpbGVzIiwicmVzdWx0IiwiYXBpIiwibWFrZUNhbGwiLCJmZXRjaE9iaiIsIkpTT04iLCJzdHJpbmdpZnkiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJqc29uIiwiZXgiLCJtZXNzYWdlIiwicmVxdWVzdEluaXQiLCJPdXRwdXQiLCJpSWR4IiwiQ1NTIiwiY3NzRmlsZSIsImNzc091dCIsImNzc1N0ciIsIkpTRmlsZXMiLCJqc0ZpbGUiLCJqc0ZpbGVPdXQiLCJqc0ZpbGVTdHIiLCJKU1NjcmlwdHMiLCJqc1NjcmlwdCIsImpzU2NyaXB0T3V0IiwianNTY3JpcHRzU3RyIiwiQXJndW1lbnRzIiwiSG90VGVzdEVsZW1lbnQiLCJNb2RlIiwiUHJvZHVjdGlvbiIsIkFQSSIsIlRlc3RlckFQSSIsIkRhdGEiLCJDb29raWVzIiwiUHVibGljS2V5cyIsIkV2ZW50RXhlY3V0aW9uVHlwZSIsImNvbnN0cnVjdG9yIiwiYmFzZVVybCIsImNvbm5lY3Rpb24iLCJkYiIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRnVuY3Rpb25zIiwiZXhlY3V0ZUV2ZW50c1VzaW5nIiwiSG90Um91dGUiLCJhdXRoQ3JlZGVudGlhbHMiLCJ1c2VyQXV0aCIsInJvdXRlcyIsIm9uUHJlUmVnaXN0ZXIiLCJvblBvc3RSZWdpc3RlciIsInNldERCU2NoZW1hIiwic2NoZW1hIiwiZ2V0REIiLCJnZXREQlNjaGVtYSIsImFkZFJvdXRlIiwicm91dGVNZXRob2QiLCJleGVjdXRlRnVuY3Rpb24iLCJyb3V0ZU5hbWUiLCJIb3RSb3V0ZU1ldGhvZCIsImFkZE1ldGhvZCIsIm5ld1JvdXRlIiwibWV0aG9kcyIsImN1cnJlbnRSb3V0ZSIsIm5ld1JvdXRlTWV0aG9kIiwibmFtZSIsInR5cGUiLCJyb3V0ZVN0ciIsInZlcnNpb24iLCJhdXRoQ3JlZGVudGlhbCIsInJlZ2lzdGVyUm91dGUiLCJIb3RTZXJ2ZXIiLCJyZWdpc3RlclJvdXRlcyIsInRvVXBwZXJDYXNlIiwic3Vic3RyIiwia2V5cyIsImZvcm1EYXRhIiwiYXBwZW5kIiwibWV0aG9kIiwiYm9keSIsImpzb25SZXMiLCJoZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ0aGVuIiwianNvbk9iaiIsImNhdGNoIiwicmVhc29uIiwidGVzdGVyQVBJIiwiSG90U2VydmVyVHlwZSIsIkhUVFAiLCJsb2dnZXIiLCJjb3B5IiwiaHRtbEVsZW1lbnRzIiwidGFnIiwiZWxlbWVudE9wdGlvbnMiLCJ1bmRlZmluZWQiLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJpbm5lciIsImV2ZW50cyIsIm9uQ3JlYXRlZCIsImVsZW1lbnQiLCJ0aHJvd0FsbEVycm9ycyIsInNldENvbnRlbnQiLCJnZXRDb250ZW50IiwibG9hZFVybCIsImh0dHBHZXQiLCJsb2FkTG9jYWxGaWxlIiwiZnMiLCJyZWFkRmlsZSIsImVyciIsInRvU3RyaW5nIiwiY29udGVudFJlZ2V4IiwiY29udGVudFByb2Nlc3NvciIsIm9mZkNvbnRlbnRQcm9jZXNzb3IiLCJudW1SZW1vdmVGcm9tQmVnaW5uaW5nIiwibnVtUmVtb3ZlRnJvbUVuZCIsImV4ZWMiLCJwcmV2aW91c0luZGV4Iiwic3RhcnQiLCJpbmRleCIsImVuZCIsImxhc3RJbmRleCIsInByZXZDb250ZW50Iiwic3RhcnRDaGFycyIsImVuZENoYXJzIiwidHJpZ2dlckNoYXIiLCJwb3MiLCJzdGFydFRyaWdnZXJQb3MiLCJuZXN0ZWRDb3VudGVyIiwicnBvcyIsImxhc3RJbmRleE9mIiwiZXBvcyIsInRlbXBlcG9zIiwidGhpc0NvbnRlbnQiLCJwYXJzZXJPcHRpb25zIiwib3V0cHV0Q29tbWFuZHMiLCJhbGxvd1N0cmluZ2lmeSIsIlNUUklOR0lGWV9TVEFSVCIsIlNUUklOR0lGWV9FTkQiLCJwcm9jZXNzQ29udGVudCIsIlJlZ0V4cCIsInJlZ2V4Rm91bmQiLCJvZmZDb250ZW50IiwidGVtcE91dHB1dCIsInByb2Nlc3NOZXN0ZWRDb250ZW50IiwicmVnZXhGb3VuZDIiLCJvZmZDb250ZW50MyIsInRlbXBPdXRwdXQyIiwib3V0IiwidGVtcE91dHB1dDMiLCJ0ZW1wT3V0cHV0NCIsIkRldmVsb3BtZW50IiwiZm91bmRTdHIiLCJwYXJzZSIsImNyZWF0ZVRlc3RFbGVtZW50IiwiZm91bmRTdHIyIiwidGVzdEVsbSIsIm9iaiIsIkFycmF5IiwidGVzdEVsZW1lbnRzIiwiZnVuYyIsInRlbXBPdXRwdXQ1IiwiZXNjYXBlZENvbnRlbnQiLCJtb2RlIiwicHVibGljS2V5cyIsImdldEFQSSIsImdldFRlc3RlckFQSSIsInBhcnNlQ29udGVudCIsInJldHVybmVkT3V0cHV0IiwiZXhlY3V0aW9uQ29udGVudCIsIm5ld1ZhciIsIm5ld1ZhclZhbHVlIiwiY29udGVudE5hbWUiLCJGdW5jdGlvbiIsIlN5bnRheEVycm9yIiwiaG90IiwiZmluYWxPdXRwdXQiLCJIb3RMb2dMZXZlbCIsImxvZ0xldmVsIiwiQWxsIiwibG9nIiwibGV2ZWwiLCJWZXJib3NlIiwiZXJyb3IiLCJXYXJuaW5nIiwid2FybmluZyIsIkluZm8iLCJpbmZvIiwidmVyYm9zZSIsImNvbnNvbGUiLCJ3YXJuIiwibXNnIiwic3RhY2siLCJ0ZXN0ZXJOYW1lIiwidGVzdGVyTWFwIiwidGVzdFBhdGhzIiwiYWRkRmlsZSIsInB1c2giLCJhZGRUZXN0RWxlbWVudCIsImVsbSIsImdldFRlc3RFbGVtZW50IiwiY3JlYXRlVGVzdFBhdGgiLCJwYXRoTmFtZSIsImRyaXZlckZ1bmMiLCJvblJlZ2lzdGVyIiwib25BdXRob3JpemVVc2VyIiwicHJlZml4IiwiZXJyb3JzIiwiY3JlYXRlRXJyb3IiLCJIVFRQTWV0aG9kIiwiUE9TVCIsInRlc3RDYXNlcyIsImdldE1ldGhvZCIsImZvdW5kTWV0aG9kIiwib25FeGVjdXRlIiwib25TZXJ2ZXJBdXRob3JpemUiLCJyZXR1cm5zIiwicGFyYW1ldGVycyIsInBhcmFtIiwib25TZXJ2ZXJFeGVjdXRlIiwib25DbGllbnRFeGVjdXRlIiwiaXNSZWdpc3RlcmVkIiwiZXhlY3V0ZVNldHVwIiwidGVzdENhc2VOYW1lIiwiYWRkVGVzdENhc2UiLCJuZXdUZXN0Q2FzZSIsInRlc3RDYXNlRnVuY3Rpb24iLCJ0ZXN0Q2FzZUlkIiwidGVzdENhc2UiLCJzZXJ2ZXJUeXBlIiwibGlzdGVuQWRkcmVzcyIsInBvcnRzIiwiaHR0cCIsImh0dHBzIiwic3NsIiwiY2VydCIsImNhIiwicmVkaXJlY3RIVFRQdG9IVFRQUyIsInNlY3JldHMiLCJzZXRBUEkiLCJIb3RUZXN0ZXJNb2NoYSIsIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW0iLCJIb3RUZXN0U2VsZW5pdW1Ecml2ZXIiLCJwYWdlcyIsImNvbXBvbmVudHMiLCJob3RTaXRlIiwiYXBpQ29udGVudCIsInRlc3RlckFwaUNvbnRlbnQiLCJwYWdlQ29udGVudCIsIkhvdExvZyIsIk5vbmUiLCJ0ZXN0ZXJzIiwicGFyc2VJbnQiLCJvYmpXaXRoUGFyYW0iLCJyZXF1aXJlZCIsInRocm93RXhjZXB0aW9uIiwiZGVmYXVsdFZhbHVlIiwiZXJyVHlwZSIsInJlZGlyZWN0VG9VcmwiLCJsb2NhdGlvbiIsImhyZWYiLCJudW1NaWxsaXNlY29uZHMiLCJzZXRUaW1lb3V0IiwiYWRkUGFnZSIsImdldFBhZ2UiLCJwYWdlTmFtZSIsImNvbnRleHQiLCJ2YWwiLCJhcnlBcmdzIiwicHJvdG90eXBlIiwiY2FsbCIsImFkZENvbXBvbmVudCIsIkNvbXBvbmVudFR5cGUiLCJ0ZW1wQXBpIiwidGVtcENvbXBvbmVudE9iaiIsImNvbXBvbmVudFR5cGUiLCJyZWdpc3RlckNvbXBvbmVudCIsInN0ciIsInRlbXBTdHIiLCJwYXJzZWRYTUwiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJxdWVyeVNlbGVjdG9yIiwiZG9jdW1lbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJ0YWdOYW1lIiwiZml4ZWRTdHIiLCJjdXN0b21FbGVtZW50cyIsInByb2Nlc3NvckNvbXBvbmVudHMiLCJkZWZpbmUiLCJIVE1MRWxlbWVudCIsInN1cGVyIiwiY29tcG9uZW50SW5mbyIsImNvbXBvbmVudCIsImxvb3NlUGFyc2VGcm9tU3RyaW5nIiwicGFyc2VyIiwieGRvbSIsImhkb20iLCJlbGVtIiwiZnJvbSIsImFwcGVuZENoaWxkIiwicXVlcnlTZWxlY3RvckFsbCIsIm91dGVySFRNTCIsImNvbm5lY3RlZENhbGxiYWNrIiwiaG90Q29tcG9uZW50IiwiaW5uZXJIVE1MIiwiaGFuZGxlQXR0cmlidXRlcyIsImF0dHIiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImF0dHJUZW1wTmFtZSIsInN1YnN0cmluZyIsIm9uUHJlT3V0cHV0Iiwib3V0cHV0cyIsIm9uUG9zdE91dHB1dCIsImNvbXBvbmVudE91dHB1dHMiLCJodG1sIiwiaUtkeCIsImh0bWxTdHIiLCJhZGRGdW5jdGlvbnNUbyIsIm9uUGFyc2VkIiwiaHRtbEhhbmRsZXIiLCJvbkZpeEhUTUwiLCJmaXhIVE1MIiwibmV3RE9NIiwibmV3T2JqIiwib25QYXJzZURPTSIsInRocm93RXJyIiwiY2hpbGQiLCJjaGlsZHJlblRvUmVhZGQiLCJyZW1vdmVDaGlsZCIsInJlcGxhY2VXaXRoIiwiY2xpY2siLCJvbmNsaWNrIiwiZXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib3B0aW9ucyIsIm9iamVjdEZ1bmN0aW9ucyIsImdldE93blByb3BlcnR5TmFtZXMiLCJvYmpGdW5jIiwiaXNOZXdGdW5jdGlvbiIsImtleTIiLCJIb3RDb21wb25lbnQiLCJrZWVwQ29udGV4dCIsIm9uUHJlUGxhY2UiLCJjb21wSHRtbEVsZW1lbnQyIiwib25QYXJlbnRQbGFjZSIsInBhcmVudFNlbGVjdG9yIiwicGFyZW50Tm9kZSIsInBhcmVudEVsZW1lbnQiLCJwbGFjZUhlcmVQYXJlbnQiLCJwYXJlbnROb2RlVG9DaGVjayIsInBhcmVudE5vZGVDaGVja0NvdW50ZXIiLCJIVE1MSHRtbEVsZW1lbnQiLCJwbGFjZUhlcmVBcnJheSIsInBsYWNlSGVyZSIsInBsYWNlSGVyZUF0dHJBcnJheSIsIm9uUG9zdFBsYWNlIiwicGFyZW50IiwiZm91bmRQYXJlbnQiLCJyZXN1bHRzIiwiaG90c2l0ZU5hbWUiLCJ0aHJvd1RoZUV4Y2VwdGlvbiIsImhvdHNpdGUiLCJwYXJhbXMiLCJwcmV2VmFsdWUiLCJwcm9jZXNzSG90U2l0ZSIsImNoZWNrSG90U2l0ZU5hbWUiLCJ0ZXN0ZXJVcmwiLCJ0ZXN0ZXIiLCJkcml2ZXIiLCJ0ZXN0aW5nIiwic2V0dXBUZXN0ZXIiLCJwYXJlbnRPYmoiLCJjcmVhdGVOZXdUZXN0ZXIiLCJ0ZXN0ZXJBUElVcmwiLCJjb21tYW5kRGVsYXkiLCJ3ZWIiLCJIb3RQYWdlIiwibWFwTmFtZSIsInRlc3RNYXAiLCJtYXAiLCJ0ZXN0TWFwcyIsIkhvdFRlc3RNYXAiLCJkZXN0aW5hdGlvbnMiLCJkZXN0IiwiSG90VGVzdERlc3RpbmF0aW9uIiwiZGVzdGluYXRpb25PcmRlciIsImFwaXMiLCJjb21wb25lbnRVcmwiLCJDb21wb25lbnRDbGFzcyIsImRpc2FibGVGaWxlTG9hZGluZyIsImxvYWRIb3RGaWxlcyIsImFkZFRlc3RlciIsImxvYWRIb3RTaXRlIiwianNvblN0ciIsInBwYXRoIiwibm9ybWFsaXplIiwiaG90c2l0ZVBhdGgiLCJmb3JjZUNvbnRlbnRMb2FkaW5nIiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwiZmlsZXBhdGgiLCJnZW5lcmF0ZUNvbnRlbnQiLCJyb3V0ZUtleSIsImpzU3JjUGF0aCIsInBhc3NBcmdzIiwiYXBpU2NyaXB0cyIsImFwaUNvZGUiLCJzZXJ2ZXIiLCJnbG9iYWxBcGkiLCJzZW5kSlNDb250ZW50IiwianNhcGkiLCJsaWJyYXJ5TmFtZSIsImFwaU5hbWUiLCJ0ZW1wQVBJQ29udGVudCIsImpzYXBpcGF0aCIsInNlY3JldCIsInNlcnZlckNvbm4iLCJwYXNzU2VjcmV0RnJvbUFQSSIsImVudiIsImVudktleSIsInRlbXBDb250ZW50IiwiZGV2ZWxvcGVyTW9kZVN0ciIsInRlc3RlckFQSVN0ciIsImxvYWRGaWxlcyIsImZpbGVVcmwiLCJmaWxlQ29udGVudCIsInRlc3RlckxhdW5jaHBhZFVybCIsImxhdW5jaHBhZFVybCIsImZpeENvbnRlbnQiLCJjcmVhdGVFeHByZXNzUm91dGVzIiwiZXhwcmVzc0FwcCIsInJlcSIsInNlbmQiLCJnZXRXZWJUZXN0aW5nTWFwcyIsIm1hcHMiLCJnZXRBUElUZXN0aW5nTWFwcyIsImdldFJvdXRlS2V5RnJvbU5hbWUiLCJnZXRSb3V0ZUZyb21OYW1lIiwiZm91bmRSb3V0ZSIsImV4ZWN1dGVUZXN0cyIsImV4ZWN1dGUiLCJleGVjdXRlQWxsV2ViVGVzdHMiLCJleGVjdXRlQWxsQVBJVGVzdHMiLCJsb2NhbEZpbGVwYXRoIiwicmVhZHlGdW5jIiwicmVhZHlTdGF0ZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidG1wU2NyaXB0cyIsInNjcmlwdHMiLCJzIiwiY3JlYXRlRWxlbWVudCIsInJlc29sdmUyIiwicmVqZWN0MiIsIm9ubG9hZCIsImhhc1NyYyIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsImlzUmVhZHlGb3JUZXN0aW5nIiwid2FpdCIsIm9uUmVhZHlGb3JUZXN0aW5nIiwidGVzdGVyQVBJQmFzZVVybCIsImNsaWVudCIsIkhvdENsaWVudCIsIkhvdFRlc3RlckFQSSIsIm9uUmVhZHkiLCJzZXR1cFRlc3RlcnMiLCJwcm9jZXNzVXJsIiwic2V0dXBDbGllbnRUZXN0ZXJzIiwidXNlT3V0cHV0IiwibG9hZEhvdFN0YXFTaXRlIiwiaG90c3RhcUVsbXMiLCJIb3RTdGFxV2ViIiwiSG90QVBJIiwiaG90c3RhcUVsbSIsImdldEF0dHIiLCJhdHRyTmFtZXMiLCJsb2FkUGFnZSIsInJvdXRlciIsImFwaUxpYnJhcnkiLCJhcGlVcmwiLCJ0ZXN0ZXJBcGlCYXNlVXJsIiwiZG9udFJldXNlUHJvY2Vzc29yIiwicGFzc1Jhd1VybCIsImh0bWxTb3VyY2UiLCJyb3V0ZXJNYW5hZ2VyIiwicm91dGVyV2lsZGNhcmRzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwiaHN0cWJhc2VyZWRpcmVjdCIsImRlY29kZVVSSSIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJob3RzdGFxRXJyb3JzIiwiaG90c3RhcUVycm9yRWxtIiwiZXJyb3JTdGF0dXMiLCJ1bnN1cHBvcnRlZEJyb3dzZXIiLCJleGVjdXRlRXJyb3IiLCJob3RzdGFxUm91dGVyRWxtcyIsImhvdHN0YXFSb3V0ZXJFbG0iLCJyb3V0ZXJOYW1lIiwic2VydmVMb2NhbGx5IiwiaUpkeCIsImNoaWxkTm9kZXMiLCJyb3V0ZXJFbG0iLCJyb3V0ZXJQYXRoIiwicmVkaXJlY3QiLCJiYXNlUmVkaXJlY3QiLCJiYXNlIiwicm91dGVyU3JjIiwic3JjIiwiY2hlY2tQYXRoIiwicGF0aG5hbWUiLCJnb3RvUGF0aCIsImxvd2VyU2VydmVMb2NhbGx5IiwibGFzdFNsYXNoUG9zIiwicm91dGVXaWxkY2FyZCIsInRlbXBSb3V0ZVdpbGRjYXJkIiwiZW5jb2RlVVJJIiwiaGFzSHRtbFNvdXJjZSIsImh0bWxTb3VyY2VDaGVjayIsInRlbXBNb2RlIiwicGFyZW50TGliIiwibmV3QVBJIiwiZGlzcGxheVVybCIsImRpc3BsYXlDb250ZW50IiwiZXRoZXJldW0yMiIsImV0aGVyZXVtIiwicGVyc2lzdGVudERhdGEiLCJwYXJzZVRlc3RPYmplY3QiLCJ3aWxkY2FyZCIsInNlbGVjdG9yIiwicHJpbnQiLCJzdGRvdXQiLCJwcmludGxuIiwiYXNzZXJ0IiwiZXJyb3JNZXNzYWdlIiwicnVuIiwiZXhlY3V0aW9ucyIsImV4ZWN1dGlvbiIsInJ1bkNvbW1hbmQiLCJtdXN0QmVWaXNpYmxlIiwiaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciIsImRlc3RpbmF0aW9uIiwiYXV0b1N0YXJ0IiwiSG90VGVzdGVyIiwiZmluaXNoZWRMb2FkaW5nIiwiaGFzQmVlblNldHVwIiwiaGFzQmVlbkRlc3Ryb3llZCIsIndhaXRGb3JEYXRhIiwiZ2V0VGVzdFBhZ2UiLCJnZXRUZXN0UGF0aCIsInRlc3REZXN0IiwibmV3RGVzdGluYXRpb24iLCJwYXRocyIsInN0cnMiLCJnZXRUeXBlIiwidHlwZVN0ciIsInR5cGVEZWxpbWl0ZXIiLCJ0eXBlVmFsdWUiLCJ0cmltIiwibmV3UGF0aFN0ciIsIm5ld1BhdGgiLCJjbWQiLCJleGVjdXRlVGVzdEFQSVBhdGgiLCJ0ZXN0TmFtZSIsInNraXBFdmVudENhbGxzIiwiY29udGludWVXaGVuVGVzdElzQ29tcGxldGUiLCJydW5UZXN0UGF0aCIsIm9uVGVzdEFQSVBhdGhTdGFydCIsInRlc3RDYXNlT2JqZWN0Iiwib25UZXN0QVBJUGF0aEVuZCIsImV4ZWN1dGVUZXN0QVBJUGF0aHMiLCJleGVjdXRlVGVzdFBhZ2VQYXRoIiwic3RvcCIsInRlc3RQYXRoTmFtZSIsInRlc3RQYXRoIiwib25UZXN0UGFnZVBhdGhTdGFydCIsIm9uVGVzdFBhZ2VQYXRoRW5kIiwiZXhlY3V0ZUNvbW1hbmQiLCJoYXNDbWQiLCJpbnB1dCIsImhhc0FyZ3VtZW50cyIsImdldENtZEFyZ3MiLCJtYXRjaGVzIiwibWF0Y2giLCJ0ZW1wTWF0Y2giLCJjbWRGdW5jIiwiY21kQXJncyIsIm5hdmlnYXRlVG9VcmwiLCJ0ZXN0T2JqZWN0Iiwid2FpdEZvclRlc3RFbGVtZW50Iiwib25Db21tYW5kIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aHMiLCJpbnRlcnByZXREZXN0aW5hdGlvbiIsImV4ZWN1dGVEZXN0aW5hdGlvbiIsImRlc3RpbmF0aW9uS2V5IiwiaXNXZWJSb3V0ZSIsInJ1blRlc3RQYXRocyIsInNldHVwIiwib25UZXN0U3RhcnQiLCJvblRlc3RFbmQiLCJkZXN0cm95IiwiaGFzRXhlY3V0ZWRLZXlzIiwib3JkZXJLZXkiLCJleGVjdXRlRGVzdCIsInBhZ2VMb2FkZWQiLCJHRVQiLCJoZWFydGJlYXQiLCJhdXRob3JpemVkVmFsdWUiLCJxdWVyeU9iaiIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsIm9uRmluaXNoZWRMb2FkaW5nIiwiSG90VGVzdEVsZW1lbnRPcHRpb25zIiwiSG90VGVzdERyaXZlciIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJfX3dlYnBhY2tfZXhwb3J0c19fIl0sInNvdXJjZVJvb3QiOiIifQ==