piclist 0.0.8 → 0.0.9
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.
- package/dist/i18n/zh-CN.d.ts +13 -0
- package/dist/index.cjs.js +2 -2
- package/dist/index.esm.js +2 -2
- package/dist/plugins/uploader/webdav.d.ts +2 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/utils/interfaces.d.ts +2 -0
- package/package.json +132 -132
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"fs-extra";import t from"path";import{EventEmitter as r}from"events";import n,{homedir as i}from"os";import{Command as s}from"commander";import a from"inquirer";import{imageSize as o}from"image-size";import{URL as l}from"url";import c from"chalk";import u from"minimatch";import p from"globby";import g from"ejs";import E from"download-git-repo";import d from"rimraf";import _ from"dayjs";import I from"util";import h from"crypto";import m from"mime-types";import f from"qiniu";import P from"md5";import C from"resolve";import{merge as U,get as N,set as D,unset as L}from"lodash";import{spawn as S}from"child_process";import A from"is-wsl";import T from"axios";import y from"form-data";import O from"https";import B from"tunnel";import{JSONStore as b}from"@picgo/store";import x from"cross-spawn";import R from"js-yaml";import{ObjectAdapter as G,I18n as w}from"@picgo/i18n";const $={handle:e=>{const t=e.cmd;t.program.command("install <plugins...>").description("install picgo plugin").alias("add").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,s={proxy:n,registry:i};e.pluginHandler.install(t,s).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall <plugins...>").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update <plugins...>").description("update picgo plugin").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,s={proxy:n,registry:i};e.pluginHandler.update(t,s).catch((t=>{e.log.error(t)}))}))}},M={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}},v=e=>e.startsWith("http://")||e.startsWith("https://"),H=e=>((e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!0}})(e)||(e=encodeURI(e)),e),F=e=>{try{const{width:t=0,height:r=0}=o(e);return{real:!0,width:t,height:r}}catch(e){return{real:!1,width:200,height:200}}},k=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":q(e)?"simple":"unknown",q=r=>{if(t.isAbsolute(r))return!1;const n=t.join(process.cwd(),r);return!e.existsSync(n)&&(!r.includes("/")&&!r.includes("\\"))},K=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,Y=e=>e.split(t.sep).join("/"),j=(e,t=!1)=>{if(e.includes("@")){let r=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(r=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const n=e.match(r);return n?n[2]:(console.warn("can not remove plugin version"),e)}return e},Q=[],W=e=>Q.some((t=>e.startsWith(t))),z=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;const V={handle:r=>{r.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((n=>{(async()=>{const i=n.map((e=>v(e)?e:t.resolve(e))).filter((t=>{const n=e.existsSync(t)||v(t);return n||r.log.warn(`${t} does not exist.`),n}));await r.upload(i)})().catch((e=>{r.log.error(e)}))}))}},J=async(e,t,r,n)=>{const i=await e.cmd.inquirer.prompt(t),s="uploader"===r?`picBed.${n}`:"transformer"===r?`transformer.${n}`:n;e.saveConfig({[s]:i})},X={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules").action(((t,r)=>{(async()=>{var n,i;try{switch(t){case"uploader":case"transformer":if(r){const n=e.helper[t].get(r);if(!n)return e.log.error(`No ${t} named ${r}`);n.config&&await J(e,n.config(e),t,r)}else{const r=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],n=await e.cmd.inquirer.prompt(r),i=e.helper[t].get(n[t]);(null==i?void 0:i.config)&&await J(e,i.config(e),t,n[t])}break;case"plugin":if(r){if(r.includes("picgo-plugin-")||(r=`picgo-plugin-${r}`),!Object.keys(e.getConfig("picgoPlugins")).includes(r))return e.log.error(`No plugin named ${r}`);(null===(n=e.pluginLoader.getPlugin(r))||void 0===n?void 0:n.config)&&await J(e,e.pluginLoader.getPlugin(r).config(e),"plugin",r)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],r=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(r.plugin))||void 0===i?void 0:i.config)&&await J(e,e.pluginLoader.getPlugin(r.plugin).config(e),"plugin",r.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin")}const s="plugin"===t?"plugins":t;e.log.success("Configure config successfully!"),e.log.info(`If you want to use this config, please run 'picgo use ${s}'`)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Z={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((r=>{(async()=>{try{let n=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(r){if(!i[r])return e.log.warn(`No module named ${r}`),e.log.warn("Available modules are uploader|transformer|plugins");n.push(i[r])}else n=Object.keys(i).map((e=>i[e]));const s=await t.inquirer.prompt(n);if(s.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{s.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":s.uploader||e.getConfig("picBed.current"),"picBed.uploader":s.uploader||e.getConfig("picBed.current"),"picBed.transformer":s.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},ee={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},te=async(e,r)=>{try{const n=ne(r.tmp),i=t.join(r.tmp,"template");let s={};n.prompts&&n.prompts.length>0&&(s=await e.cmd.inquirer.prompt(n.prompts));let a=await p(["**/*"],{cwd:i,dot:!0});if(a=a.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{u(t,e,{dot:!0})&&(r=t)})),!r||re(e,n.filters[r],s)})),0===a.length)return e.log.warn("Template files not found!");const o=ie(a,i,s);se(r.dest,o),"function"==typeof n.complete&&n.complete({answers:s,options:r,files:a,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},re=(e,t,r)=>{const n=new Function("data","with (data) { return "+t+"}");try{return n(r)}catch(r){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},ne=r=>{const n=t.join(r,"index.js");if(e.existsSync(n)){return require(n)}return{}},ie=(r,n,i)=>{const s={};return r.forEach((r=>{const a=e.readFileSync(t.join(n,r),"utf8"),o=g.render(a,i);(Buffer.isBuffer(o)||/[^\s]/.test(o))&&(s[r]=o)})),s},se=(r,n)=>{Object.keys(n).forEach((i=>{const s=t.join(r,i);e.ensureDirSync(t.dirname(s)),e.writeFileSync(s,n[i])}))},ae=(t,r)=>{r.offline?e.existsSync(r.template)?te(t,r).catch((e=>{t.log.error(e)})):t.log.error(`Local template ${r.template} not found`):(r.template=r.hasSlash?r.template:"PicGo/picgo-template-"+r.template,oe(t,r))},oe=(t,r)=>{e.existsSync(r.tmp)&&d.sync(r.tmp),t.log.info("Template files are downloading..."),E(r.template,r.tmp,{clone:r.clone},(e=>{if(e)return t.log.error(e);t.log.success("Template files are downloaded!"),te(t,r).catch((e=>{t.log.error(e)}))}))},le={handle:async r=>{r.cmd.program.command("init").arguments("<template> [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((n,s,a)=>{(async()=>{try{const o=n.includes("/"),l=!s||"."===s,c=t.resolve(s||"."),u=a.clone||!1,p=a.offline||!1,g=t.join(i(),".picgo/templates",n.replace(/[/:]/g,"-"));a.offline&&(n=g);const E={template:n,project:s,hasSlash:o,inPlace:l,dest:c,clone:u,tmp:g,offline:p};l||e.existsSync(c)?await r.cmd.inquirer.prompt([{type:"confirm",message:l?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((e=>{e.ok&&ae(r,E)})):ae(r,E)}catch(e){if(r.log.error(e),process.argv.includes("--debug"))throw e}})().catch((e=>{r.log.error(e)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(c.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(c.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},ce={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const r=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:r,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],n=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(n.i18n),void e.log.success(`Language set to ${n.i18n}`)}if(!r.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class ue{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var r;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),ue.currentPlugin&&(this.pluginIdMap.has(ue.currentPlugin)?null===(r=this.pluginIdMap.get(ue.currentPlugin))||void 0===r||r.push(e):this.pluginIdMap.set(ue.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const pe=(e=null)=>{ue.currentPlugin=e};class ge{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new s,this.inquirer=a,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("0.0.8","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",$),e.cmd.register("config",M),e.cmd.register("setting",X),e.cmd.register("upload",V),e.cmd.register("use",Z),e.cmd.register("proxy",ee),e.cmd.register("init",le),e.cmd.register("i18n",ce)}register(e,t){var r;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const n=ue.currentPlugin;null!==n&&(this.pluginIdMap.has(n)?null===(r=this.pluginIdMap.get(n))||void 0===r||r.push(e):this.pluginIdMap.set(n,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var Ee,de,_e;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(Ee||(Ee={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(de||(de={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(_e||(_e={}));class Ie{constructor(e){this.level={[Ee.success]:"green",[Ee.info]:"blue",[Ee.warn]:"yellow",[Ee.error]:"red"},this.ctx=e}handleLog(e,...r){if(!this.ctx.getConfig("silent")){const n=c[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...r),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||t.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const t=this.checkLogFileIsLarge(this.logPath);if(t.isLarge){const e=`Log file is too large (> ${t.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(c.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),r.unshift(e)}this.handleWriteLog(this.logPath,e,...r)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(t){if(e.existsSync(t)){const r=e.statSync(t).size,n=1024*((e=0)=>isNaN(Number(e))?0:Number(e))(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:r>n,logFileSize:r,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(t){e.existsSync(t)&&(e.unlinkSync(t),e.createFileSync(t))}handleWriteLog(t,r,...n){try{if(this.checkLogLevel(r,this.logLevel)){let i=`${_().format("YYYY-MM-DD HH:mm:ss")} [PicList ${r.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===r?i+=`\n------Error Stack Begin------\n${I.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),i+=`${e} `)})),i+="\n",e.appendFileSync(t,i)}}catch(e){console.error("[PicList Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(Ee.success,...e)}info(...e){return this.handleLog(Ee.info,...e)}error(...e){return this.handleLog(Ee.error,...e)}warn(...e){return this.handleLog(Ee.warn,...e)}debug(...e){"development"===process.env.NODE_ENV&&this.handleLog(Ee.info,...e)}}class he extends r{constructor(e){super(),this.ctx=e}async start(e){const t=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");return t.input=e,t.output=[],await this.beforeTransform(t),await this.doTransform(t),await this.beforeUpload(t),await this.doUpload(t),await this.afterUpload(t),t}catch(e){if(t.log.warn(de.FAILED),t.emit(de.UPLOAD_PROGRESS,-1),t.emit(de.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(de.UPLOAD_PROGRESS,0),e.emit(de.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(de.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let r=t,n=e.helper.transformer.get(t);return n||(n=e.helper.transformer.get("path"),r="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${r}]`),await(null==n?void 0:n.handle(e)),e}async beforeUpload(e){return e.emit(de.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(de.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms",r=e.helper.uploader.get(t),n=t;r||(t="smms",n="smms",r=e.helper.uploader.get("smms"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - smms`)),e.log.info(`Uploading... Current uploader is [${n}]`),await(null==r?void 0:r.handle(e));for(const r of e.output)r.type=t;return e}async afterUpload(e){e.emit(de.AFTER_UPLOAD,e),e.emit(de.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const r=e.output.length;for(let n=0;n<r;n++)void 0!==e.output[n].imgUrl&&(t+=H(e.output[n].imgUrl),n!==r-1&&(t+="\n")),delete e.output[n].base64Image,delete e.output[n].buffer;return e.emit(de.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const r=e.getList(),n=e.getIdList(),i=e.getName();return await Promise.all(r.map((async(e,r)=>{try{t.log.info(`${i}: ${n[r]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${n[r]} error`),e}}))),t}}const me=(e,t,r,n="")=>({method:"POST",url:`https://${n||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicGo",Authorization:r},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),fe=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const r=e.output;for(const n of r)if(n.fileName&&n.buffer){let r=n.buffer;!r&&n.base64Image&&(r=Buffer.from(n.base64Image,"base64"));const i=me(n.fileName,r,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),r=JSON.parse(t);if("success"===r.code)delete n.base64Image,delete n.buffer,n.imgUrl=r.data.url,n.hash=r.data.hash;else{if("image_repeated"!==r.code||"string"!=typeof r.images)throw e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.message}),new Error(r);delete n.base64Image,delete n.buffer,n.imgUrl=r.images}}catch(t){throw e.log.error(t),new Error(t)}}return e},Pe=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"password",get alias(){return e.i18n.translate("PICBED_SMMS_TOKEN")},default:t.token||"",required:!0},{name:"backupDomain",type:"input",get prefix(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},get message(){return e.i18n.translate("PICBED_SMMS_MESSAGE_BACKUP_DOMAIN")},get alias(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},default:t.backupDomain||"",required:!1}]};const Ce=(e,t)=>{const r=e.secretId,n=e.secretKey,i=e.appId,s=e.bucket;let a,o="";if(e.version&&"v4"!==e.version){const r=Math.floor((new Date).getTime()/1e3);o=`${r};${r+86400}`;const i=h.createHmac("sha1",n).update(o).digest("hex"),s=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${o}\n${h.createHash("sha1").update(s).digest("hex")}\n`;a=h.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${s}&k=${r}&e=${t+3600}&t=${t}&r=${e}&f=`,l=h.createHmac("sha1",n).update(o).digest(),c=Buffer.concat([l,Buffer.from(o)]);a=Buffer.from(c).toString("base64")}return{signature:a,appId:i,bucket:s,signTime:o}},Ue=(e,t,r,n,i)=>{const s=e.area,a=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(a)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.cos.${e.area}.myqcloud.com`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${r.signTime}&q-key-time=${r.signTime}&q-header-list=host&q-url-param-list=&q-signature=${r.signature}`,contentType:m.lookup(t),userAgent:`PicGo;${i};null;null`},body:n,resolveWithFullResponse:!0}:{method:"POST",url:`http://${s}.file.myqcloud.com/files/v2/${r.appId}/${r.bucket}/${encodeURI(a)}${t}`,headers:{Host:`${s}.file.myqcloud.com`,Authorization:r.signature,contentType:"multipart/form-data",userAgent:`PicGo;${i};null;null`},formData:{op:"upload",filecontent:n},resolveWithFullResponse:!0}},Ne=async e=>{var t,r,n;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const s=e.output,a=i.customUrl,o=i.path,l=!i.version||"v4"===i.version;for(const c of s)if(c.fileName&&c.buffer){const s=Ce(i,c.fileName);if(!s)return!1;let u=c.buffer;!u&&c.base64Image&&(u=Buffer.from(c.base64Image,"base64"));const p=Ue(i,c.fileName,s,u,e.GUI_VERSION||e.VERSION),g=await e.request(p).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let E;if(E=l&&"string"==typeof g?JSON.parse(g):g,400===E.statusCode)throw(null===(t=null==E?void 0:E.body)||void 0===t?void 0:t.err)?E.body.err:new Error((null===(r=null==E?void 0:E.body)||void 0===r?void 0:r.msg)||(null===(n=null==E?void 0:E.body)||void 0===n?void 0:n.message));const d=i.options||"";if(l&&"SUCCESS"===E.message)delete c.base64Image,delete c.buffer,c.imgUrl=a?`${a}/${o}${c.fileName}`:`${E.data.source_url}${d}`;else{if(l||!E||200!==E.statusCode)throw new Error(g.body.msg);delete c.base64Image,delete c.buffer,c.imgUrl=a?`${a}/${encodeURI(o)}${encodeURI(c.fileName)}${d}`:`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURI(o)}${encodeURI(c.fileName)}${d}`}}return e}catch(t){if(!i.version||"v4"===i.version)try{const r=JSON.parse(t.error);e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:r.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},De=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const Le=(e,t,r)=>{const n=t.path||"",{token:i,repo:s}=t;return{method:"PUT",url:`https://api.github.com/repos/${s}/contents/${encodeURI(n)}${encodeURI(e)}`,headers:{Authorization:`token ${i}`,"User-Agent":"PicGo","Content-Type":m.lookup(e)},body:r,json:!0}},Se=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i={message:"Upload by PicGo",branch:t.branch,content:r,path:t.path+encodeURI(n.fileName)},s=Le(n.fileName,t,i),a=await e.request(s);if(!a)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,t.customUrl?n.imgUrl=`${t.customUrl}/${t.path}${n.fileName}`:n.imgUrl=a.content.download_url,n.hash=a.content.sha}return e}catch(t){throw e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},Ae=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function Te(e,t,r,n){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),s=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(s+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${r}`,"Content-Type":m.lookup(t)||"application/octet-stream"},body:n}}function ye(e){const t=e.accessKey,r=e.secretKey,n=new f.auth.digest.Mac(t,r),i={scope:e.bucket};return new f.rs.PutPolicy(i).uploadToken(n)}const Oe=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=Te(t,n.fileName,ye(t),r),s=await e.request(i),a=JSON.parse(s);if(!(null==a?void 0:a.key))throw e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:a.msg}),e.log.error("qiniu error",a),new Error("Upload failed");{delete n.base64Image,delete n.buffer;const e=t.url,r=t.options;n.imgUrl=`${e}/${a.key}${r}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const r=t.response.body;e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.error})}throw t}},Be=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const be=(e,t,r)=>{const n={method:"POST",url:"https://api.imgur.com/3/image",headers:{Authorization:`Client-ID ${e.clientId}`,"content-type":"multipart/form-data",Host:"api.imgur.com","User-Agent":"PicGo"},formData:{image:r,type:"base64",name:t}};return e.proxy&&(n.proxy=e.proxy),n},xe=async e=>{var t;const r=e.getConfig("picBed.imgur");if(!r)throw new Error("Can't find imgur config");try{const t=e.output;for(const n of t)if(n.fileName&&n.buffer){const t=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=be(r,n.fileName,t),s=await e.request(i),a="string"==typeof s?JSON.parse(s):s;if(!a.success)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,n.imgUrl=a.data.link,n.hash=a.data.deletehash}return e}catch(r){throw e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:"http://docs.imgur.com/api/errno/"}),(null===(t=null==r?void 0:r.response)||void 0===t?void 0:t.data)||r}},Re=e=>{const t=e.getConfig("picBed.imgur")||{};return[{name:"clientId",type:"input",get alias(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},default:t.clientId||"",required:!0},{name:"proxy",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get alias(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_PROXY")},default:t.proxy||"",required:!1}]};const Ge=(e,t)=>{const r=(new Date).toUTCString(),n=m.lookup(t);if(!n)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${n}\n${r}\n/${e.bucket}/${e.path}${t}`,s=h.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${s}`},we=(e,t,r,n)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURI(t)}`,headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:r,Date:(new Date).toUTCString(),"Content-Type":m.lookup(t)},body:n,resolveWithFullResponse:!0}),$e=async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");try{const r=e.output,n=t.customUrl,i=t.path;for(const s of r)if(s.fileName&&s.buffer){const r=Ge(t,s.fileName);let a=s.buffer;!a&&s.base64Image&&(a=Buffer.from(s.base64Image,"base64"));const o=we(t,s.fileName,r,a);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=t.options||"";s.imgUrl=n?`${n}/${i}${s.fileName}${e}`:`https://${t.bucket}.${t.area}.aliyuncs.com/${i}${s.fileName}${e}`}}return e}catch(t){throw e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},Me=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const ve=(e,t)=>{const r=e.path||"",n=e.operator,i=e.password,s=P(i),a=(new Date).toUTCString(),o=`PUT&${`/${e.bucket}/${encodeURI(r)}${encodeURI(t)}`}&${a}`;return`UPYUN ${n}:${h.createHmac("sha1",s).update(o).digest("base64")}`},He=(e,t,r,n)=>{const i=e.bucket,s=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(s)}${encodeURI(t)}`,headers:{Authorization:r,Date:(new Date).toUTCString(),"Content-Type":m.lookup(t)||"application/octet-stream"},body:n,resolveWithFullResponse:!0}},Fe=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const r=e.output,n=t.path||"";for(const i of r)if(i.fileName&&i.buffer){let r=i.buffer;!r&&i.base64Image&&(r=Buffer.from(i.base64Image,"base64"));const s=ve(t,i.fileName),a=He(t,i.fileName,s,r);if(200!==(await e.request(a)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${n}${i.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const r=function(e){try{return JSON.parse(e)}catch(t){return e}}(t.error);e.emit(de.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof r?r.code:r}),text:"http://docs.upyun.com/api/errno/"})}throw t}},ke=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const qe=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:$e,config:Me})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:Ne,config:De})}(e),function(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:fe,config:Pe})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:Se,config:Ae})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:Oe,config:Be})}(e),function(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:xe,config:Re})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:Fe,config:ke})}(e)}}),Ke=(e,t,r)=>{const n=F(t);return n.real||(e.log.warn(`can't get ${r}'s image size`),e.log.warn("fallback to 200 * 200")),n};var Ye={handle:async r=>{const n=r.output;return await Promise.all(r.input.map((async(i,s)=>{let a;if(a=v(i)?await(async(e,r)=>{e=H(e);let n,i=!1,s="";const a=new Promise(((a,o)=>{(async()=>{var o;try{const o=await r.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>{const t=e.headers["content-type"];return(null==t?void 0:t.includes("image"))&&(i=!0,s=`.${String(t.split("image/")[1])}`),e.data}));if(clearTimeout(n),i){const r=new l(e).pathname;a({buffer:o,fileName:t.basename(r),extname:s,success:!0})}else a({success:!1,reason:`${e} is not image`})}catch(t){clearTimeout(n),a({success:!1,reason:`request ${e} error, ${null!==(o=null==t?void 0:t.message)&&void 0!==o?o:""}`})}})().catch(o)})),o=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),1e4)}));return Promise.race([a,o])})(i,r):await(async r=>{try{return{extname:t.extname(r),fileName:t.basename(r),buffer:await e.readFile(r),success:!0}}catch(e){return{reason:`read file ${r} error`,success:!1}}})(i),!a.success||!a.buffer)throw new Error(a.reason);{const e=Ke(r,a.buffer,i);n[s]={buffer:a.buffer,fileName:a.fileName,width:e.width,height:e.height,extname:a.extname}}}))),r.output=n.filter((e=>e)),r}};var je={handle:async e=>(e.output.push(...e.input),e)};class Qe{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const r=t.join(this.ctx.baseDir,"package.json");if(!e.existsSync(r)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};e.writeFileSync(r,JSON.stringify(t),"utf8")}}resolvePlugin(e,r){try{return C.sync(r,{basedir:e.baseDir})}catch(n){return t.join(e.baseDir,"node_modules",r)}}load(){const r=t.join(this.ctx.baseDir,"package.json"),n=t.join(this.ctx.baseDir,"node_modules/");if(!e.existsSync(n))return!1;const i=e.readJSONSync(r),s=Object.keys(i.dependencies||{}),a=Object.keys(i.devDependencies||{}),o=s.concat(a).filter((t=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(t))return!1;const r=this.resolvePlugin(this.ctx,t);return e.existsSync(r)}));for(const e of o)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),pe(e);const r=t(this.ctx);this.pluginMap.set(e,r),r.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),pe(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(de.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),pe(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const r=t.join(this.ctx.baseDir,"node_modules/"),n=require(r+e)(this.ctx);return this.pluginMap.set(e,n),n}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const We={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\r\nproperty fileTypes : {{«class PNGf», ".png"}}\r\n\r\non run argv\r\n\tif argv is {} then\r\n\t\treturn ""\r\n\tend if\r\n\r\n\tif ((clipboard info) as string) contains "«class furl»" then\r\n\t\treturn POSIX path of (the clipboard as «class furl»)\r\n\telse\r\n\t\tset imagePath to (item 1 of argv)\r\n\t\tset theType to getType()\r\n\r\n\t\tif theType is not missing value then\r\n\t\t\ttry\r\n\t\t\t\tset myFile to (open for access imagePath with write permission)\r\n\t\t\t\tset eof myFile to 0\r\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\r\n\t\t\t\tclose access myFile\r\n\t\t\t\treturn (POSIX path of imagePath)\r\n\t\t\ton error\r\n\t\t\t\ttry\r\n\t\t\t\t\tclose access myFile\r\n\t\t\t\tend try\r\n\t\t\t\treturn "no image"\r\n\t\t\tend try\r\n\t\telse\r\n\t\t\treturn "no image"\r\n\t\tend if\r\n\tend if\r\nend run\r\n\r\non getType()\r\n\trepeat with aType in fileTypes\r\n\t\trepeat with theInfo in (clipboard info)\r\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\r\n\t\tend repeat\r\n\tend repeat\r\n\treturn missing value\r\nend getType\r\n',win32:'\r\nparam($imagePath)\r\n\r\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\n\r\nAdd-Type -Assembly PresentationCore\r\n$img = [Windows.Clipboard]::GetImage()\r\n\r\nif ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\nif (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n$encoder.Save($stream) | out-null\r\n$stream.Dispose() | out-null\r\n\r\n$imagePath\r\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\nparam($imagePath)\r\n\r\n# https://github.com/PowerShell/PowerShell/issues/7233\r\n# fix the output encoding bug\r\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\r\n\r\nAdd-Type -Assembly PresentationCore\r\nfunction main {\r\n $img = [Windows.Clipboard]::GetImage()\r\n\r\n if ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n if (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n $encoder.Save($stream) | out-null\r\n $stream.Dispose() | out-null\r\n\r\n $imagePath\r\n # fix windows 10 native cmd crash bug when "picgo upload"\r\n # https://github.com/PicGo/PicGo-Core/issues/32\r\n Exit 1\r\n}\r\n\r\ntry {\r\n # For WIN10\r\n $file = Get-Clipboard -Format FileDropList\r\n if ($file -ne $null) {\r\n Convert-Path $file\r\n Exit 1\r\n }\r\n} catch {\r\n # For WIN7 WIN8 WIN10\r\n main\r\n}\r\n\r\nmain',linux:'#!/bin/sh\r\n\r\nif [ -z "$DISPLAY" ]; then\r\n echo "no support" >&2\r\n exit 1\r\nfi\r\n\r\ncase "$XDG_SESSION_TYPE" in\r\nwayland)\r\n command -v wl-copy >/dev/null 2>&1 || {\r\n echo >&2 "no wl-clipboard"\r\n exit 1\r\n }\r\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nx11 | tty)\r\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\r\n command -v xclip >/dev/null 2>&1 || {\r\n echo >&2 "no xclip"\r\n exit 1\r\n }\r\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\r\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nesac\r\n',wsl:'#!/bin/sh\r\n# grab the paths\r\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\r\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\r\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\r\n\r\n# run the powershell script\r\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\r\n\r\n# note that there is a return symbol in powershell result\r\nnoImage=$(echo "no image\\r")\r\n\r\n# check whether image exists\r\nif [ "$res" = "$noImage" ] ;then\r\n echo "no image"\r\nelse\r\n echo $(wslpath -u -a "${res}")\r\nfi\r\n'},ze={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Ve=async r=>{!function(r){const n=t.join(r.baseDir,"piclist-clipboard-images");e.existsSync(n)||e.mkdirSync(n)}(r);const i=t.join(r.baseDir,"piclist-clipboard-images",`${_().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((s,a)=>{const o=(()=>{const e=process.platform;if(A)return"wsl";if("win32"===e)return"10"===n.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),l=t.join(r.baseDir,ze[o]);let c;e.existsSync(l)||e.writeFileSync(l,We[o],"utf8"),c="darwin"===o?S("osascript",[l,i]):"win32"===o||"win10"===o?S("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",l,i]):S("sh",[l,i]),c.stdout.on("data",(n=>{if("linux"===o&&"no xclip or wl-clipboard"===n.toString().trim())return r.emit(de.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),a(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const l=n.toString().trim();let c=!1;if(t.basename(l)!==t.basename(i)&&e.existsSync(l)&&(c=!0),"no image"!==l&&!e.existsSync(l))return a(new Error(`Can't find ${l}`));s({imgPath:l,shouldKeepAfterUploading:c})}))}))},Je=new r,Xe=new O.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function Ze(e,t,r){"object"==typeof r&&"value"in r&&"options"in r?e.append(t,r.value,r.options):e.append(t,r)}function et(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function tt(e){var t,r,n,i,s,a,o;const l={method:(null===(r=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===r?void 0:r.toUpperCase())||"",url:(null===(n=null==e?void 0:e.config)||void 0===n?void 0:n.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,statusCode:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.status)||0,body:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||""}};return Promise.reject(l)}class rt{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),Je.on(_e.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new l(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=B.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=Xe;const r=T.create(this.options);r.interceptors.response.use(et,tt);const n=function(e){var t;let r=!1;const n=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new l(e.proxy)}catch(e){i=!1,n.proxy=!1,console.error(e)}r=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(n.proxy=!1,n.httpsAgent=B.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):n.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new y;for(const r in e.formData)Ze(t,r,e.formData[r]);n.data=t,n.headers=Object.assign(n.headers||{},t.getHeaders()),r=!0,delete n.formData}return"body"in e&&(n.data=e.body,r=!0,delete n.body),"qs"in e&&(n.params=e.qs,r=!0),n.__isOldOptions=r,n}(e);return r.interceptors.request.use((function(e){var t,r,n;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?r.request(n):r.request(n).then((t=>n.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class nt{constructor(e){if(this.ctx=e,this.db=new b(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"smms",current:"smms"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class it{constructor(e){this.ctx=e}async install(e,t={},r){const n=[],i=e.map((e=>st(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(n.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),s=i.map((e=>e.fullName)),a=i.map((e=>e.pkgName));if(s.length>0){const e=await this.execCommand("install",s,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}a.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...n]});return{success:!0,body:[...a,...n]}}if(0===n.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...n]});return{success:!0,body:[...a,...n]}}async uninstall(e){const t=e.map((e=>st(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(t.length>0){const e=await this.execCommand("uninstall",t,this.ctx.baseDir);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}t.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:t});return{success:!0,body:t}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t={},r){const n=e.map((e=>st(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(n.length>0){const e=await this.execCommand("update",n,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:n});return{success:!0,body:n}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,r,n={},i={}){const s=n.registry||this.ctx.getConfig("settings.registry"),a=n.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((n=>{var o,l;let c=[e].concat(t).concat("--color=always").concat("--save");s&&(c=c.concat(`--registry=${s}`)),a&&(c=c.concat(`--proxy=${a}`));try{const e=x("npm",c,{cwd:r,env:Object.assign({},process.env,i)});let t="";null===(o=e.stdout)||void 0===o||o.on("data",(e=>{t+=e})).pipe(process.stdout),null===(l=e.stderr)||void 0===l||l.on("data",(e=>{t+=e})).pipe(process.stderr),e.on("close",(e=>{n(e?{code:e,data:t}:{code:0,data:t})})),e.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(de.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(de.FAILED,e)}}))}}const st=(r,n)=>{const i={success:!1,fullName:"",pkgName:""},s=((r,n=console)=>{switch(k(r)){case"normal":case"scope":return r;case"simple":return K(r);default:{let i=r;return t.isAbsolute(r)&&e.existsSync(r)?Y(i):(i=t.join(process.cwd(),r),e.existsSync(i)?Y(i):(n.warn(`Can't find plugin ${r}`),""))}}})(n,r.log);if(!s)return i;const a=((r,n=console)=>{var i;switch(k(r)){case"normal":return j(r);case"scope":return j(r,!0);case"simple":return j(K(r));default:{if(!e.existsSync(r))return n.warn(`Can't find plugin: ${r}`),"";const s=t.posix.join(r,"package.json");if(e.existsSync(s)){const t=e.readJSONSync(s)||{};return(null===(i=t.name)||void 0===i?void 0:i.includes("picgo-plugin-"))?t.name:(n.warn(`The plugin package.json's name filed is ${t.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return n.warn(`Can't find plugin: ${r}`),""}}})(s,r.log);return a?{success:!0,fullName:s,pkgName:a}:i},at={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class ot{constructor(e){this.ctx=e,this.objectAdapter=new G(at);let t=this.ctx.getConfig("settings.language")||"zh-CN";at[t]||(t="zh-CN"),this.i18n=new w({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const r=this.getOutterI18nFolder();e.readdirSync(r,{withFileTypes:!0}).forEach((n=>{if(n.isFile()&&n.name.endsWith(".yml")){const i=t.join(r,n.name),s=e.readFileSync(i,"utf8");try{const e=R.load(s);at[n.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const r=t.join(this.ctx.baseDir,"i18n-cli");return e.pathExistsSync(r)||e.ensureDirSync(r),r}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const r=this.objectAdapter.getLocale(e);if(!r)return!1;const n=U(r,t);return this.objectAdapter.setLocale(e,n),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),at[e]=t,!0)}getLanguageList(){return Object.keys(at)}}class lt extends r{constructor(e=""){super(),this.VERSION="0.0.8",this.configPath=e,this.output=[],this.input=[],this.helper={transformer:new ue("transformer"),uploader:new ue("uploader"),beforeTransformPlugins:new ue("beforeTransformPlugins"),beforeUploadPlugins:new ue("beforeUploadPlugins"),afterUploadPlugins:new ue("afterUploadPlugins")},this.initConfigPath(),this.log=new Ie(this),this.cmd=new ge(this),this.pluginHandler=new it(this),this.initConfig(),this.init()}get pluginLoader(){return this._pluginLoader}initConfigPath(){if(""===this.configPath&&(this.configPath=i()+"/.piclist/config.json"),".JSON"!==t.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=t.dirname(this.configPath);e.pathExistsSync(this.configPath)||e.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new nt(this),this._config=this.db.read(!0)}init(){try{this.i18n=new ot(this),this.Request=new rt(this),this._pluginLoader=new Qe(this),pe("picgo"),qe().register(this),{register(e){e.helper.transformer.register("path",Ye),e.helper.transformer.register("base64",je)}}.register(this),pe(""),this._pluginLoader.load(),this.lifecycle=new he(this)}catch(e){throw this.emit(de.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?N(this._config,e):this._config}saveConfig(e){z(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(W(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){z(e)?Object.keys(e).forEach((t=>{W(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),D(this._config,t,e[t]),Je.emit(_e.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(W(e)?this.log.warn(`the config.${e} can't be unset`):L(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(t){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==t&&0!==t.length){const{output:e}=await this.lifecycle.start(t);return e}try{const{imgPath:t,shouldKeepAfterUploading:r}=await Ve(this);if("no image"===t)throw new Error("image not found in clipboard");{this.once(de.FAILED,(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([t]);return n}}catch(e){throw this.emit(de.FAILED,e),e}}}export{ge as Commander,he as Lifecycle,ue as LifecyclePlugins,Ie as Logger,lt as PicGo,it as PluginHandler,Qe as PluginLoader,rt as Request};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9zZXR0aW5nLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9wcm94eS50cyIsIi4uL3NyYy91dGlscy9pbml0VXRpbHMudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5pdC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pMThuLnRzIiwiLi4vc3JjL2xpYi9MaWZlY3ljbGVQbHVnaW5zLnRzIiwiLi4vc3JjL2xpYi9Db21tYW5kZXIudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5kZXgudHMiLCIuLi9zcmMvdXRpbHMvZW51bS50cyIsIi4uL3NyYy9saWIvTG9nZ2VyLnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUNvbnRleHQudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9zbW1zLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdGN5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9naXRodWIudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9xaW5pdS50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2ltZ3VyLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvYWxpeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvbGliL1BsdWdpbkxvYWRlci50cyIsIi4uL3NyYy91dGlscy9zdGF0aWMudHMiLCIuLi9zcmMvdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UudHMiLCIuLi9zcmMvdXRpbHMvZXZlbnRCdXMudHMiLCIuLi9zcmMvbGliL1JlcXVlc3QudHMiLCIuLi9zcmMvdXRpbHMvZGIudHMiLCIuLi9zcmMvbGliL1BsdWdpbkhhbmRsZXIudHMiLCIuLi9zcmMvaTE4bi9pbmRleC50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vemgtVFcudHMiLCIuLi9zcmMvaTE4bi9lbi50cyIsIi4uL3NyYy9jb3JlL1BpY0dvLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBwbHVnaW5IYW5kbGVyOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICAvLyBjb25zdCBwbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIoY3R4KVxyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luc3RhbGwgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdpbnN0YWxsIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5hbGlhcygnYWRkJylcclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHByb3h5PicsICdBZGQgcHJveHkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgcHJveHksIHJlZ2lzdHJ5IH0gPSBwcm9ncmFtXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgIHByb3h5LFxyXG4gICAgICAgICAgcmVnaXN0cnlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIuaW5zdGFsbChwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndW5pbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5hbGlhcygncm0nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VuaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVuaW5zdGFsbChwbHVnaW5zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBkYXRlIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXBkYXRlIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLm9wdGlvbignLXIsIC0tcmVnaXN0cnkgPHJlZ2lzdHJ5PicsICdDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBwcm94eSxcclxuICAgICAgICAgIHJlZ2lzdHJ5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVwZGF0ZShwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZTogRXJyb3IpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luSGFuZGxlclxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGNvbmZpZzogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdzZXQgY29uZmlnIHBhdGgnKVxyXG4gICAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSAnaW1hZ2Utc2l6ZSdcclxuaW1wb3J0IHtcclxuICBJSW1nU2l6ZSxcclxuICBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbyxcclxuICBJUGx1Z2luTmFtZVR5cGUsXHJcbiAgSUxvZ2dlcixcclxuICBJUGljR29cclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSlcclxuZXhwb3J0IGNvbnN0IGlzVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgdXJsID0gdXJsIHx8ICcnXHJcbiAgdHJ5IHtcclxuICAgIC8vIHRoZSB3aG9sZSB1cmwgZW5jb2RlIG9yIGRlY29kZSBzaG9sZCBub3QgdXNlIGVuY29kZVVSSUNvbXBvbmVudCBvciBkZWNvZGVVUklDb21wb25lbnRcclxuICAgIHJldHVybiB1cmwgIT09IGRlY29kZVVSSSh1cmwpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgLy8gaWYgc29tZSBlcnJvciBjYXVnaHQsIHRyeSB0byBsZXQgaXQgZ29cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjb25zdCBoYW5kbGVVcmxFbmNvZGUgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghaXNVcmxFbmNvZGUodXJsKSkge1xyXG4gICAgdXJsID0gZW5jb2RlVVJJKHVybClcclxuICB9XHJcbiAgcmV0dXJuIHVybFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VTaXplID0gKGZpbGU6IEJ1ZmZlcik6IElJbWdTaXplID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyB3aWR0aCA9IDAsIGhlaWdodCA9IDAgfSA9IGltYWdlU2l6ZShmaWxlKVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogdHJ1ZSxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodFxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIGZhbGxiYWNrIHRvIDIwMCAqIDIwMFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIGhlaWdodDogMjAwXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RlNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlUGF0aCksXHJcbiAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSxcclxuICAgICAgYnVmZmVyOiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCksXHJcbiAgICAgIHN1Y2Nlc3M6IHRydWVcclxuICAgIH1cclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYXNvbjogYHJlYWQgZmlsZSAke2ZpbGVQYXRofSBlcnJvcmAsXHJcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0VVJMRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdXJsID0gaGFuZGxlVXJsRW5jb2RlKHVybClcclxuICBsZXQgaXNJbWFnZSA9IGZhbHNlXHJcbiAgbGV0IGV4dG5hbWUgPSAnJ1xyXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XHJcbiAgY29uc3QgcmVxdWVzdEZuID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcclxuICAgICAgICAgIHVybCxcclxuICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcC5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgICAgICAgICAgaXNJbWFnZSA9IHRydWVcclxuICAgICAgICAgICAgICBleHRuYW1lID0gYC4ke1N0cmluZyhjb250ZW50VHlwZS5zcGxpdCgnaW1hZ2UvJylbMV0pfWBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcC5kYXRhIGFzIEJ1ZmZlclxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxyXG4gICAgICAgIGlmIChpc0ltYWdlKSB7XHJcbiAgICAgICAgICBjb25zdCB1cmxQYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXHJcbiAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgYnVmZmVyOiByZXMsXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgICBleHRuYW1lLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlYXNvbjogYCR7dXJsfSBpcyBub3QgaW1hZ2VgXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcclxuICAgICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IGVycm9yLCAke2Vycm9yPy5tZXNzYWdlID8/ICcnfWBcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KSgpLmNhdGNoKHJlamVjdClcclxuICB9KVxyXG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlKTogdm9pZCA9PiB7XHJcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gdGltZW91dGBcclxuICAgICAgfSlcclxuICAgIH0sIDEwMDAwKVxyXG4gIH0pXHJcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcmVxdWVzdEZuLCB0aW1lb3V0UHJvbWlzZV0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZydzIHR5cGVcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHNjb3BlXHJcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gbm9ybWFsXHJcbiAqIDMuIHh4eCAtPiBzaW1wbGVcclxuICogNC4gbm90IGV4aXN0cyBvciBpcyBhIHBhdGggLT4gdW5rbm93blxyXG4gKiBAcGFyYW0gbmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFBsdWdpbk5hbWVUeXBlID0gKG5hbWU6IHN0cmluZyk6IElQbHVnaW5OYW1lVHlwZSA9PiB7XHJcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xyXG4gICAgcmV0dXJuICdzY29wZSdcclxuICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICByZXR1cm4gJ25vcm1hbCdcclxuICB9IGVsc2UgaWYgKGlzU2ltcGxlTmFtZShuYW1lKSkge1xyXG4gICAgcmV0dXJuICdzaW1wbGUnXHJcbiAgfVxyXG4gIHJldHVybiAndW5rbm93bidcclxufVxyXG5cclxuLyoqXHJcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgc2ltcGxlIHBsdWdpbiBuYW1lIG9yIG5vdFxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiB4eHggLT4gdHJ1ZVxyXG4gKiAyLiAvVXNyL3h4L3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBmYWxzZVxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5OYW1lT3JQYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNTaW1wbGVOYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUobmFtZU9yUGF0aCkpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG5hbWVPclBhdGgpXHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBpZiAobmFtZU9yUGF0aC5pbmNsdWRlcygnLycpIHx8IG5hbWVPclBhdGguaW5jbHVkZXMoJ1xcXFwnKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIHJldHVybiB0cnVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBzdHJlYW1saW5lIHRoZSBmdWxsIHBsdWdpbiBuYW1lIHRvIGEgc2ltcGxlIG9uZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiB4eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teXl5IC0+IHl5eVxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5GdWxsTmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVN0cmVhbWxpbmVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xyXG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLCAnJylcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvcGljZ28tcGx1Z2luLS8sICcnKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGNvbXBsZXRlIHBsdWdpbiBuYW1lIHRvIGZ1bGwgbmFtZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpblNpbXBsZU5hbWVcclxuICogQHBhcmFtIHNjb3BlIHBsdWdpblNjb3BlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZywgc2NvcGUgPSAnJyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHNjb3BlKSB7XHJcbiAgICByZXR1cm4gYEAke3Njb3BlfS9waWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBoYW5kbGUgaW5zdGFsbC91bmluc3RhbGwvdXBkYXRlIHBsdWdpbiBuYW1lIG9yIHBhdGhcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogMy4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNC4gLi94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gL2Fic29sdXRlUGF0aC8uLi4veHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDUuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aCBwbHVnaW5OYW1lIG9yIHBsdWdpblBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRQcm9jZXNzUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXHJcbiAgc3dpdGNoIChwbHVnaW5OYW1lVHlwZSkge1xyXG4gICAgY2FzZSAnbm9ybWFsJzpcclxuICAgIGNhc2UgJ3Njb3BlJzpcclxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICAgIGNhc2UgJ3NpbXBsZSc6XHJcbiAgICAgIHJldHVybiBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aClcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgLy8gbm93LCB0aGUgcGx1Z2luTmFtZVR5cGUgaXMgdW5rbm93IGhlcmVcclxuICAgICAgLy8gMS4gY2hlY2sgaWYgaXMgYW4gYWJzb2x1dGUgcGF0aFxyXG4gICAgICBsZXQgcGx1Z2luUGF0aCA9IG5hbWVPclBhdGhcclxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShuYW1lT3JQYXRoKSAmJiBmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcclxuICAgICAgfVxyXG4gICAgICAvLyAyLiBjaGVjayBpZiBpcyBhIHJlbGF0aXZlIHBhdGhcclxuICAgICAgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVVbml4U3R5bGVQYXRoKHBsdWdpblBhdGgpXHJcbiAgICAgIH1cclxuICAgICAgLy8gMy4gaW52YWxpZCBuYW1lT3JQYXRoXHJcbiAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbiAke25hbWVPclBhdGh9YClcclxuICAgICAgcmV0dXJuICcnXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogZ2V0IHRoZSBub3JtYWwgcGx1Z2luIG5hbWVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDMuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNC4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDUuIGFuIGV4Y2VwdGlvbjogW3BhY2thZ2UuanNvbidzIG5hbWVdICE9PSBbZm9sZGVyIG5hbWVdXHJcbiAqIHRoZW4gdXNlIFtwYWNrYWdlLmpzb24ncyBuYW1lXSwgdXN1YWxseSBtYXRjaCB0aGUgc2NvcGUgcGFja2FnZS5cclxuICogNi4gaWYgcGx1Z2luIG5hbWUgaGFzIHZlcnNpb246IHBpY2dvLXBsdWdpbi14eHhAeC54LnggdGhlbiByZW1vdmUgdGhlIHZlcnNpb25cclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXROb3JtYWxQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBsdWdpbk5hbWVUeXBlID0gZ2V0UGx1Z2luTmFtZVR5cGUobmFtZU9yUGF0aClcclxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XHJcbiAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihuYW1lT3JQYXRoKVxyXG4gICAgY2FzZSAnc2NvcGUnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihuYW1lT3JQYXRoLCB0cnVlKVxyXG4gICAgY2FzZSAnc2ltcGxlJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24oaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpKVxyXG4gICAgZGVmYXVsdDoge1xyXG4gICAgICAvLyBub3csIHRoZSBuYW1lT3JQYXRoIG11c3QgYmUgcGF0aFxyXG4gICAgICAvLyB0aGUgbmFtZU9yUGF0aCBoZXJlIHdpbGwgYmUgZW5zdXJlZCB3aXRoIHVuaXggc3R5bGVcclxuICAgICAgLy8gd2UgbmVlZCB0byBmaW5kIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lIGNhdXNlIG5wbSB1c2luZyB0aGUgbmFtZSBpbiBwYWNrYWdlLmpzb24ncyBuYW1lIGZpbGVkXHJcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhuYW1lT3JQYXRoKSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGFja2FnZUpTT05QYXRoID0gcGF0aC5wb3NpeC5qb2luKG5hbWVPclBhdGgsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpTT05QYXRoKSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGtnID0gZnMucmVhZEpTT05TeW5jKHBhY2thZ2VKU09OUGF0aCkgfHwge31cclxuICAgICAgICBpZiAoIXBrZy5uYW1lPy5pbmNsdWRlcygncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICAgICAgICBsb2dnZXIud2FybihgVGhlIHBsdWdpbiBwYWNrYWdlLmpzb24ncyBuYW1lIGZpbGVkIGlzICR7cGtnLm5hbWUgYXMgc3RyaW5nIHx8ICdlbXB0eSd9LCBuZWVkIHRvIGluY2x1ZGUgdGhlIHByZWZpeDogcGljZ28tcGx1Z2luLWApXHJcbiAgICAgICAgICByZXR1cm4gJydcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBrZy5uYW1lXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBoYW5kbGUgdHJhbnNmb3JtIHRoZSBwYXRoIHRvIHVuaXggc3R5bGVcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gQzpcXFxceHh4XFxcXHh4eCAtPiBDOi94eHgveHh4XHJcbiAqIDIuIC94eHgveHh4IC0+IC94eHgveHh4XHJcbiAqIEBwYXJhbSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlVW5peFN0eWxlUGF0aCA9IChwYXRoU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBhdGhBcnIgPSBwYXRoU3RyLnNwbGl0KHBhdGguc2VwKVxyXG4gIHJldHVybiBwYXRoQXJyLmpvaW4oJy8nKVxyXG59XHJcblxyXG4vKipcclxuICogcmVtb3ZlIHBsdWdpbiB2ZXJzaW9uIHdoZW4gcmVnaXN0ZXIgcGx1Z2luIG5hbWVcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICogQHBhcmFtIHNjb3BlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtb3ZlUGx1Z2luVmVyc2lvbiA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIHNjb3BlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghbmFtZU9yUGF0aC5pbmNsdWRlcygnQCcpKSB7XHJcbiAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgcmVnID0gLyguK1xcLyk/KHBpY2dvLXBsdWdpbi1cXHcrKShALispKi9cclxuICAgIC8vIGlmIGlzIGEgc2NvcGUgcGtnXHJcbiAgICBpZiAoc2NvcGUpIHtcclxuICAgICAgcmVnID0gLyguK1xcLyk/KF5AW14vXStcXC9waWNnby1wbHVnaW4tXFx3KykoQC4rKSovXHJcbiAgICB9XHJcbiAgICBjb25zdCBtYXRjaEFyciA9IG5hbWVPclBhdGgubWF0Y2gocmVnKVxyXG4gICAgaWYgKCFtYXRjaEFycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2NhbiBub3QgcmVtb3ZlIHBsdWdpbiB2ZXJzaW9uJylcclxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBtYXRjaEFyclsyXVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZSBjb25maWcgYmxhY2sgaXRlbSBsaXN0IHdoaWNoIHdvbid0IGJlIHNldHRlZFxyXG4gKiBvbmx5IGNhbiBiZSBnb3RcclxuICovXHJcbmV4cG9ydCBjb25zdCBjb25maWdCbGFja0xpc3QgPSBbXVxyXG5cclxuLyoqXHJcbiAqIGNoZWNrIHNvbWUgY29uZmlnIGtleSBpcyBpbiBibGFja0xpc3RcclxuICogQHBhcmFtIGtleVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5CbGFja0xpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gY29uZmlnQmxhY2tMaXN0LnNvbWUoYmxhY2tJdGVtID0+IGtleS5zdGFydHNXaXRoKGJsYWNrSXRlbSkpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjaGVjayB0aGUgaW5wdXQgY29uZmlnIGlzIHZhbGlkXHJcbiAqIGNvbmZpZyBtdXN0IGJlIG9iamVjdCBzdWNoIGFzIHsgeHh4OiAneHh4JyB9XHJcbiAqICYmIGNhbid0IGJlIGFycmF5XHJcbiAqIEBwYXJhbSBjb25maWdcclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0lucHV0Q29uZmlnVmFsaWQgPSAoY29uZmlnOiBhbnkpOiBib29sZWFuID0+IHtcclxuICBpZiAoXHJcbiAgICB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJlxyXG4gICAgIUFycmF5LmlzQXJyYXkoY29uZmlnKSAmJlxyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5sZW5ndGggPiAwXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2VcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZTxUPiAoc3RyOiBzdHJpbmcpOiBUIHwgc3RyaW5nIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICByZXR1cm4gc3RyXHJcbiAgfVxyXG59XHJcblxyXG4vLyBob2xkLi4uXHJcbi8vIGV4cG9ydCBjb25zdCBjb25maWdXaGl0ZUxpc3Q6IFJlZ0V4cFtdID0gW1xyXG4vLyAgIC9ecGljQmVkLyxcclxuLy8gICAvXnBpY2dvUGx1Z2lucy8sXHJcbi8vICAgL15AW14vXStcXC9waWNnby1wbHVnaW4tLyxcclxuLy8gICAvZGVidWcvLFxyXG4vLyAgIC9zaWxlbnQvLFxyXG4vLyAgIC9jb25maWdQYXRoLyxcclxuLy8gICAvXnNldHRpbmdzLyxcclxuLy8gXVxyXG5cclxuLy8gZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5XaGl0ZUxpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuLy8gICByZXR1cm4gY29uZmlnV2hpdGVMaXN0LnNvbWUod2hpdGVJdGVtID0+IHdoaXRlSXRlbS50ZXN0KGtleSkpXHJcbi8vIH1cclxuXHJcbmV4cG9ydCBjb25zdCBmb3JjZU51bWJlciA9IChudW06IHN0cmluZyB8IG51bWJlciA9IDApOiBudW1iZXIgPT4ge1xyXG4gIHJldHVybiBpc05hTihOdW1iZXIobnVtKSkgPyAwIDogTnVtYmVyKG51bSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGV2ID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNQcm9kID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nXHJcbn1cclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1cGxvYWQ6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1cGxvYWQnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VwbG9hZCwgZ28gZ28gZ28nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbaW5wdXQuLi5dJylcclxuICAgICAgLmFsaWFzKCd1JylcclxuICAgICAgLmFjdGlvbigoaW5wdXQ6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0TGlzdCA9IGlucHV0XHJcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpc1VybChpdGVtKSA/IGl0ZW0gOiBwYXRoLnJlc29sdmUoaXRlbSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3QgPSBmcy5leGlzdHNTeW5jKGl0ZW0pIHx8IGlzVXJsKGl0ZW0pXHJcbiAgICAgICAgICAgICAgaWYgKCFleGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy53YXJuKGAke2l0ZW19IGRvZXMgbm90IGV4aXN0LmApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBleGlzdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgYXdhaXQgY3R4LnVwbG9hZChpbnB1dExpc3QpXHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1cGxvYWRcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG4vLyBoYW5kbGUgbW9kdWxlcyBjb25maWcgLT4gc2F2ZSB0byBwaWNnbyBjb25maWcgZmlsZVxyXG5jb25zdCBoYW5kbGVDb25maWcgPSBhc3luYyAoY3R4OiBJUGljR28sIHByb21wdHM6IElQbHVnaW5Db25maWdbXSwgbW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG1vZHVsZSA9PT0gJ3VwbG9hZGVyJ1xyXG4gICAgPyBgcGljQmVkLiR7bmFtZX1gIDogbW9kdWxlID09PSAndHJhbnNmb3JtZXInXHJcbiAgICAgID8gYHRyYW5zZm9ybWVyLiR7bmFtZX1gIDogbmFtZVxyXG4gIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgIFtjb25maWdOYW1lXTogYW5zd2VyXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgc2V0dGluZyA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3NldCcpXHJcbiAgICAgIC5hbGlhcygnY29uZmlnJylcclxuICAgICAgLmFyZ3VtZW50cygnPG1vZHVsZT4gW25hbWVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjb25maWd1cmUgY29uZmlnIG9mIHBpY2dvIG1vZHVsZXMnKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICAgICAgICAvLyBhd2FpdCBjdHgucGx1Z2luTG9hZGVyLmxvYWQoKVxyXG4gICAgICAgICAgICAvLyBpZiBhIG1vZHVsZSBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcclxuICAgICAgICAgICAgc3dpdGNoIChtb2R1bGUpIHtcclxuICAgICAgICAgICAgICBjYXNlICd1cGxvYWRlcic6XHJcbiAgICAgICAgICAgICAgY2FzZSAndHJhbnNmb3JtZXInOlxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQobmFtZSlcclxuICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cuZXJyb3IoYE5vICR7bW9kdWxlfSBuYW1lZCAke25hbWV9YClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBpdGVtLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7bW9kdWxlfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyW21vZHVsZV0uZ2V0SWRMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEobikgJHttb2R1bGV9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdDogY3R4LmdldENvbmZpZygncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZygncGljQmVkLmN1cnJlbnQnKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KGFuc3dlclttb2R1bGVdKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXJbbW9kdWxlXSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBjYXNlICdwbHVnaW4nOlxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gYHBpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjdHguZ2V0Q29uZmlnKCdwaWNnb1BsdWdpbnMnKSkuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSk/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGBObyBwbHVnaW4gbmFtZWQgJHtuYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2hvb3NlIGEgcGx1Z2luJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIGFuc3dlci5wbHVnaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdBdmFpbGFibGUgbW9kdWxlcyBhcmUgdXBsb2FkZXJ8dHJhbnNmb3JtZXJ8cGx1Z2luJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB1c2VNb2R1bGVOYW1lID0gbW9kdWxlID09PSAncGx1Z2luJyA/ICdwbHVnaW5zJyA6IG1vZHVsZVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICAgIGN0eC5sb2cuaW5mbyhgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29uZmlnLCBwbGVhc2UgcnVuICdwaWNnbyB1c2UgJHt1c2VNb2R1bGVOYW1lfSdgKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzZXR0aW5nXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiwgVW5kZWZpbmFibGUsIElDTElDb25maWdzLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1c2U6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1c2UnKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbW9kdWxlXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXNlIG1vZHVsZXMgb2YgcGljZ28nKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBJQ0xJQ29uZmlncyA9IHtcclxuICAgICAgICAgICAgICB1cGxvYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYW4gdXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYSB0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7aXRlbX1gKSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzLnB1c2goY29uZmlnW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdBdmFpbGFibGUgbW9kdWxlcyBhcmUgdXBsb2FkZXJ8dHJhbnNmb3JtZXJ8cGx1Z2lucycpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHByb21wdHMgPSBPYmplY3Qua2V5cyhjb25maWcpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBjb25maWdbaXRlbV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcblxyXG4gICAgICAgICAgICAvLyBoYW5kbGUgZm9yIHBsdWdpbnMgb3B0aW9uIGZyb20gQXJyYXkgdG8gb2JqZWN0XHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBjdHguZ2V0Q29uZmlnPElTdHJpbmdLZXlNYXA8Ym9vbGVhbj4+KCdwaWNnb1BsdWdpbnMnKVxyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IHRydWVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHBsdWdpbnNbaXRlbV0gPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHBsdWdpbnNcclxuICAgICAgICAgICAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICAgICAgICAgICBwaWNnb1BsdWdpbnM6IHBsdWdpbnNcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciB1cGxvYWRlciAmIHRyYW5zZm9ybWVyXHJcbiAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAncGljQmVkLmN1cnJlbnQnOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudXBsb2FkZXInOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBhbnN3ZXIudHJhbnNmb3JtZXIgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGN0eC5sb2cuc3VjY2VzcygnQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhJylcclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXNlXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcHJveHk6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDx1cmw+JywgJ3NldCBwcm94eSBmb3IgdXBsb2FkaW5nJywgKHByb3h5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgICdwaWNCZWQucHJveHknOiBwcm94eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwcm94eVxyXG4iLCJpbXBvcnQgbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xyXG5pbXBvcnQgeyBJUGljR28sIElPcHRpb25zLCBJRmlsZVRyZWUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYmJ5IGZyb20gJ2dsb2JieSdcclxuaW1wb3J0IGVqcyBmcm9tICdlanMnXHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXHJcbiAqIEBwYXJhbSB7UGljR299IGN0eFxyXG4gKiBAcGFyYW0ge0lPcHRpb25zfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBnZW5lcmF0ZSA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcclxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihvcHRpb25zLnRtcCwgJ3RlbXBsYXRlJylcclxuICAgIGxldCBhbnN3ZXJzID0ge31cclxuICAgIGlmIChvcHRzLnByb21wdHMgJiYgb3B0cy5wcm9tcHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcclxuICAgIH1cclxuICAgIGxldCBfZmlsZXM6IHN0cmluZ1tdID0gYXdhaXQgZ2xvYmJ5KFsnKiovKiddLCB7IGN3ZDogc291cmNlLCBkb3Q6IHRydWUgfSkgLy8gZ2V0IGZpbGVzJyBuYW1lIGFycmF5XHJcbiAgICBfZmlsZXMgPSBfZmlsZXMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGdsb2IgPSAnJ1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoKGl0ZW0sIGtleSwgeyBkb3Q6IHRydWUgfSkpIHtcclxuICAgICAgICAgIGdsb2IgPSBpdGVtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZ2xvYikgeyAvLyBmaW5kIGEgZmlsdGVyIGV4cHJlc3Npb25cclxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKF9maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignVGVtcGxhdGUgZmlsZXMgbm90IGZvdW5kIScpXHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWxlcyA9IHJlbmRlcihfZmlsZXMsIHNvdXJjZSwgYW5zd2VycylcclxuICAgIHdyaXRlRmlsZVRyZWUob3B0aW9ucy5kZXN0LCBmaWxlcylcclxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBvcHRzLmNvbXBsZXRlKHsgYW5zd2Vycywgb3B0aW9ucywgZmlsZXM6IF9maWxlcywgY3R4IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0cy5jb21wbGV0ZU1lc3NhZ2UpIHtcclxuICAgICAgY3R4LmxvZy5zdWNjZXNzKG9wdHMuY29tcGxldGVNZXNzYWdlKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdEb25lIScpXHJcbiAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgZmlsdGVycycgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHggUGljR29cclxuICogQHBhcmFtIGV4cCBjb25kaXRpb24gZXhwcmVzc2lvblxyXG4gKiBAcGFyYW0gZGF0YSBvcHRpb25zIGRhdGFcclxuICovXHJcbmNvbnN0IGZpbHRlcnMgPSAoY3R4OiBJUGljR28sIGV4cDogYW55LCBkYXRhOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXHJcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCAnd2l0aCAoZGF0YSkgeyByZXR1cm4gJyArIGV4cCArICd9JylcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZuKGRhdGEpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihgRXJyb3Igd2hlbiBldmFsdWF0aW5nIGZpbHRlciBjb25kaXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRlbXBsYXRlIG9wdGlvbnNcclxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxyXG4gKi9cclxuY29uc3QgZ2V0T3B0aW9ucyA9ICh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAnaW5kZXguanMnKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKG9wdGlvbnNQYXRoKVxyXG4gICAgcmV0dXJuIG9wdGlvbnNcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHt9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGZpbGVzIHRvIGEgdmlydHVhbCB0cmVlIG9iamVjdFxyXG4gKiBAcGFyYW0ge2FycmF5fSBmaWxlc1xyXG4gKi9cclxuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XHJcbiAgY29uc3QgZmlsZVRyZWU6IElGaWxlVHJlZSA9IHt9XHJcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksICd1dGY4JylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXHJcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpIHx8IC9bXlxcc10vLnRlc3QoY29udGVudCkpIHtcclxuICAgICAgZmlsZVRyZWVbZmlsZVBhdGhdID0gY29udGVudFxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIGZpbGVUcmVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcclxuICogQHBhcmFtIHtzdHJpbmd9IGRpclxyXG4gKiBAcGFyYW0ge29iamVjdH0gZmlsZXNcclxuICovXHJcbmNvbnN0IHdyaXRlRmlsZVRyZWUgPSAoZGlyOiBzdHJpbmcsIGZpbGVzOiBhbnkpOiB2b2lkID0+IHtcclxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIG5hbWUpXHJcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpXHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGZpbHRlcnMsXHJcbiAgZ2VuZXJhdGUsXHJcbiAgcmVuZGVyLFxyXG4gIHdyaXRlRmlsZVRyZWVcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuLi8uLi91dGlscy9pbml0VXRpbHMnXHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcclxuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkLWdpdC1yZXBvJ1xyXG5pbXBvcnQgeyBJT3B0aW9ucywgSVBsdWdpbiwgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBybSBmcm9tICdyaW1yYWYnXHJcblxyXG5jb25zdCBydW4gPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgLy8gY29uc3QgbmFtZSA9IG9wdGlvbnMuaW5QbGFjZSA/IHBhdGgucmVsYXRpdmUoJy4uLycsIHByb2Nlc3MuY3dkKCkpIDogb3B0aW9ucy5wcm9qZWN0XHJcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkgeyAvLyBvZmZsaW5lIG1vZGVcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XHJcbiAgICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy5lcnJvcihgTG9jYWwgdGVtcGxhdGUgJHtvcHRpb25zLnRlbXBsYXRlfSBub3QgZm91bmRgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7IC8vIG9ubGluZSBtb2RlXHJcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcclxuICAgICAgPyAnUGljR28vcGljZ28tdGVtcGxhdGUtJyArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcclxuICAgICAgOiBvcHRpb25zLnRlbXBsYXRlXHJcbiAgICBkb3dubG9hZEFuZEdlbmVyYXRlKGN0eCwgb3B0aW9ucylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkb3dubG9hZCB0ZW1wbGF0ZSAmIGdlbmVyYXRlXHJcbiAqIEBwYXJhbSB7IFBpY0dvIH0gY3R4XHJcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZG93bmxvYWRBbmRHZW5lcmF0ZSA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcclxuICAgIHJtLnN5bmMob3B0aW9ucy50bXApXHJcbiAgfVxyXG4gIGN0eC5sb2cuaW5mbygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkaW5nLi4uJylcclxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLnN1Y2Nlc3MoJ1RlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGVkIScpXHJcbiAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBpbml0OiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaW5pdCcpXHJcbiAgICAgIC5hcmd1bWVudHMoJzx0ZW1wbGF0ZT4gW3Byb2plY3RdJylcclxuICAgICAgLm9wdGlvbignLS1jbG9uZScsICd1c2UgZ2l0IGNsb25lJylcclxuICAgICAgLm9wdGlvbignLS1vZmZsaW5lJywgJ3VzZSBjYWNoZWQgdGVtcGxhdGUnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NyZWF0ZSBwaWNnbyBwbHVnaW5cXCdzIGRldmVsb3BtZW50IHRlbXBsYXRlcycpXHJcbiAgICAgIC5hY3Rpb24oKHRlbXBsYXRlOiBzdHJpbmcsIHByb2plY3Q6IHN0cmluZywgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIC8vIFRoYW5rcyB0byB2dWUtY2xpIGluaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtY2xpL2Jsb2IvbWFzdGVyL2Jpbi92dWUtaW5pdFxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzU2xhc2ggPSB0ZW1wbGF0ZS5pbmNsdWRlcygnLycpXHJcbiAgICAgICAgICAgIGNvbnN0IGluUGxhY2UgPSAhcHJvamVjdCB8fCBwcm9qZWN0ID09PSAnLidcclxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0IHx8ICcuJylcclxuICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBwcm9ncmFtLmNsb25lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IG9mZmxpbmUgPSBwcm9ncmFtLm9mZmxpbmUgfHwgZmFsc2VcclxuICAgICAgICAgICAgY29uc3QgdG1wID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5waWNnby90ZW1wbGF0ZXMnLCB0ZW1wbGF0ZS5yZXBsYWNlKC9bLzpdL2csICctJykpIC8vIGZvciBjYWNoaW5nIHRlbXBsYXRlXHJcblxyXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5vZmZsaW5lKSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0bXBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZSxcclxuICAgICAgICAgICAgICBwcm9qZWN0LFxyXG4gICAgICAgICAgICAgIGhhc1NsYXNoLFxyXG4gICAgICAgICAgICAgIGluUGxhY2UsXHJcbiAgICAgICAgICAgICAgZGVzdCxcclxuICAgICAgICAgICAgICBjbG9uZSxcclxuICAgICAgICAgICAgICB0bXAsXHJcbiAgICAgICAgICAgICAgb2ZmbGluZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBwcm9qZWN0IGlzIGVtcHR5IG9yIGV4aXN0XHJcbiAgICAgICAgICAgIGlmIChpblBsYWNlIHx8IGZzLmV4aXN0c1N5bmMoZGVzdCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaW5QbGFjZVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ0dlbmVyYXRlIHByb2plY3QgaW4gY3VycmVudCBkaXJlY3Rvcnk/J1xyXG4gICAgICAgICAgICAgICAgICAgIDogJ1RhcmdldCBkaXJlY3RvcnkgZXhpc3RzLiBDb250aW51ZT8nLFxyXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnb2snXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXSkudGhlbigoYW5zd2VyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIub2spIHtcclxuICAgICAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBwcm9qZWN0IGlzIGdpdmVuXHJcbiAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignLS1oZWxwJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZygnRXhhbXBsZXM6JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggYW4gb2ZmaWNpYWwgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgcGx1Z2luIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICMgY3JlYXRlIGEgbmV3IHByb2plY3Qgc3RyYWlnaHQgZnJvbSBhIGdpdGh1YiB0ZW1wbGF0ZScpKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCcgICQgcGljZ28gaW5pdCB1c2VybmFtZS9yZXBvIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGluaXRcclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSVBpY0dvLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBpMThuOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaTE4bicpXHJcbiAgICAgIC5hcmd1bWVudHMoJ1tsYW5nXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY2hhbmdlIHBpY2dvIGxhbmd1YWdlJylcclxuICAgICAgLmFjdGlvbihhc3luYyAobGFuZzogc3RyaW5nID0gJycpID0+IHtcclxuICAgICAgICBjb25zdCBsaXN0ID0gY3R4LmkxOG4uZ2V0TGFuZ3VhZ2VMaXN0KClcclxuICAgICAgICBpZiAoIWxhbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgbmFtZTogJ2kxOG4nLFxyXG4gICAgICAgICAgICAgIGNob2ljZXM6IGxpc3QsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGxhbmd1YWdlJyxcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sYW5ndWFnZScpIHx8ICd6aC1DTidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxzdHJpbmc+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UoYW5zd2VyLmkxOG4pXHJcbiAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2Fuc3dlci5pMThufWApXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGxhbmcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdObyBzdWNoIGxhbmd1YWdlJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UobGFuZylcclxuICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2xhbmd9YClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGkxOG5cclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSUxpZmVjeWNsZVBsdWdpbnMgfSBmcm9tICcuLi90eXBlcydcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQbHVnaW5zIGltcGxlbWVudHMgSUxpZmVjeWNsZVBsdWdpbnMge1xyXG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0OiBNYXA8c3RyaW5nLCBJUGx1Z2luPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWVcclxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxyXG4gICAgdGhpcy5wbHVnaW5JZE1hcCA9IG5ldyBNYXAoKVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaWQgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGlmIChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCA9PiB7XHJcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgcmV0dXJuIExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVQbHVnaW5zXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzICovXHJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXHJcbmltcG9ydCBpbnF1aXJlciwgeyBJbnF1aXJlciB9IGZyb20gJ2lucXVpcmVyJ1xyXG5pbXBvcnQgeyBJUGx1Z2luLCBJQ29tbWFuZGVyLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGNvbW1hbmRlcnMgZnJvbSAnLi4vcGx1Z2lucy9jb21tYW5kZXInXHJcbmltcG9ydCB7IGdldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbW1hbmRlciBpbXBsZW1lbnRzIElDb21tYW5kZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZSA9ICdjb21tYW5kZXInXHJcbiAgc3RhdGljIGN1cnJlbnRQbHVnaW46IHN0cmluZyB8IG51bGxcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG5cclxuICBwcm9ncmFtOiBDb21tYW5kXHJcbiAgaW5xdWlyZXI6IElucXVpcmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKVxyXG4gICAgdGhpcy5pbnF1aXJlciA9IGlucXVpcmVyXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZSAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm5hbWVcclxuICB9XHJcblxyXG4gIGluaXQgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9ncmFtXHJcbiAgICAgIC52ZXJzaW9uKHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT04sICctdiwgLS12ZXJzaW9uJylcclxuICAgICAgLm9wdGlvbignLWQsIC0tZGVidWcnLCAnZGVidWcgbW9kZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgZGVidWc6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub3B0aW9uKCctcywgLS1zaWxlbnQnLCAnc2lsZW50IG1vZGUnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgIHNpbGVudDogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignY29tbWFuZDoqJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihgSW52YWxpZCBjb21tYW5kOiAke3RoaXMucHJvZ3JhbS5hcmdzLmpvaW4oJyAnKX1cXG5TZWUgLS1oZWxwIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLmApXHJcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgIH0pXHJcblxyXG4gICAgLy8gYnVpbHQtaW4gY29tbWFuZHNcclxuICAgIGNvbW1hbmRlcnModGhpcy5jdHgpXHJcbiAgfVxyXG5cclxuICByZWdpc3RlciAoaWQ6IHN0cmluZywgcGx1Z2luOiBJUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCduYW1lIGlzIHJlcXVpcmVkIScpXHJcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5oYW5kbGUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BsdWdpbi5oYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIScpXHJcbiAgICBpZiAodGhpcy5saXN0LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5uYW1lfSBwbHVnaW4gZHVwbGljYXRlIGlkOiAke2lkfSFgKVxyXG4gICAgdGhpcy5saXN0LnNldChpZCwgcGx1Z2luKVxyXG4gICAgY29uc3QgY3VycmVudFBsdWdpbk5hbWUgPSBnZXRDdXJyZW50UGx1Z2luTmFtZSgpXHJcbiAgICBpZiAoY3VycmVudFBsdWdpbk5hbWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKGN1cnJlbnRQbHVnaW5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KGN1cnJlbnRQbHVnaW5OYW1lKT8ucHVzaChpZClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLnNldChjdXJyZW50UGx1Z2luTmFtZSwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRMaXN0KCkuZm9yRWFjaCgoaXRlbTogSVBsdWdpbikgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGl0ZW0uaGFuZGxlKHRoaXMuY3R4KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCAoaWQ6IHN0cmluZyk6IElQbHVnaW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXHJcbiAgfVxyXG5cclxuICBnZXRMaXN0ICgpOiBJUGx1Z2luW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXHJcbiAgfVxyXG5cclxuICBnZXRJZExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbW1hbmRlclxyXG4iLCJpbXBvcnQgcGx1Z2luSGFuZGxlciBmcm9tICcuL3BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB1cGxvYWQgZnJvbSAnLi91cGxvYWQnXHJcbmltcG9ydCBzZXR0aW5nIGZyb20gJy4vc2V0dGluZydcclxuaW1wb3J0IHVzZSBmcm9tICcuL3VzZSdcclxuaW1wb3J0IHByb3h5IGZyb20gJy4vcHJveHknXHJcbmltcG9ydCBpbml0IGZyb20gJy4vaW5pdCdcclxuaW1wb3J0IGkxOG4gZnJvbSAnLi9pMThuJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChjdHg6IElQaWNHbyk6IHZvaWQgPT4ge1xyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3BsdWdpbkhhbmRsZXInLCBwbHVnaW5IYW5kbGVyKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ2NvbmZpZycsIGNvbmZpZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCdzZXR0aW5nJywgc2V0dGluZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1cGxvYWQnLCB1cGxvYWQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigndXNlJywgdXNlKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3Byb3h5JywgcHJveHkpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaW5pdCcsIGluaXQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaTE4bicsIGkxOG4pXHJcbn1cclxuIiwiZXhwb3J0IGVudW0gSUxvZ1R5cGUge1xyXG4gIHN1Y2Nlc3MgPSAnc3VjY2VzcycsXHJcbiAgaW5mbyA9ICdpbmZvJyxcclxuICB3YXJuID0gJ3dhcm4nLFxyXG4gIGVycm9yID0gJ2Vycm9yJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBieSB1c2Vyc1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XHJcbiAgVVBMT0FEX1BST0dSRVNTID0gJ3VwbG9hZFByb2dyZXNzJyxcclxuICBGQUlMRUQgPSAnZmFpbGVkJyxcclxuICBCRUZPUkVfVFJBTlNGT1JNID0gJ2JlZm9yZVRyYW5zZm9ybScsXHJcbiAgQkVGT1JFX1VQTE9BRCA9ICdiZWZvcmVVcGxvYWQnLFxyXG4gIEFGVEVSX1VQTE9BRCA9ICdhZnRlclVwbG9hZCcsXHJcbiAgRklOSVNIRUQgPSAnZmluaXNoZWQnLFxyXG4gIElOU1RBTEwgPSAnaW5zdGFsbCcsXHJcbiAgVU5JTlNUQUxMID0gJ3VuaW5zdGFsbCcsXHJcbiAgVVBEQVRFID0gJ3VwZGF0ZScsXHJcbiAgTk9USUZJQ0FUSU9OID0gJ25vdGlmaWNhdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgb25seSBieSBwaWNnb1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1c0V2ZW50IHtcclxuICBDT05GSUdfQ0hBTkdFID0gJ0NPTkZJR19DSEFOR0UnXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcclxuaW1wb3J0IHsgSUxvZ1R5cGUgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQge1xyXG4gIElMb2dBcmd2VHlwZSxcclxuICBJTG9nQXJndlR5cGVXaXRoRXJyb3IsXHJcbiAgVW5kZWZpbmFibGUsXHJcbiAgSUxvZ0NvbG9yLFxyXG4gIElMb2dnZXIsXHJcbiAgSVBpY0dvXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGZvcmNlTnVtYmVyLCBpc0RldiB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xyXG4gICAgW0lMb2dUeXBlLnN1Y2Nlc3NdOiAnZ3JlZW4nLFxyXG4gICAgW0lMb2dUeXBlLmluZm9dOiAnYmx1ZScsXHJcbiAgICBbSUxvZ1R5cGUud2Fybl06ICd5ZWxsb3cnLFxyXG4gICAgW0lMb2dUeXBlLmVycm9yXTogJ3JlZCdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxvZ0xldmVsITogc3RyaW5nXHJcbiAgcHJpdmF0ZSBsb2dQYXRoITogc3RyaW5nXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMb2cgKHR5cGU6IElMb2dUeXBlLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICAvLyBjaGVjayBjb25maWcuc2lsZW50XHJcbiAgICBpZiAoIXRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2lsZW50JykpIHtcclxuICAgICAgY29uc3QgbG9nSGVhZGVyID0gY2hhbGtbdGhpcy5sZXZlbFt0eXBlXSBhcyBJTG9nQ29sb3JdKGBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXHJcbiAgICAgIGNvbnNvbGUubG9nKGxvZ0hlYWRlciwgLi4ubXNnKVxyXG4gICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sb2dMZXZlbCcpXHJcbiAgICAgIHRoaXMubG9nUGF0aCA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MubG9nUGF0aCcpIHx8IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnLi9waWNsaXN0LmxvZycpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jaGVja0xvZ0ZpbGVJc0xhcmdlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTXNnID0gYExvZyBmaWxlIGlzIHRvbyBsYXJnZSAoPiAkeyhyZXN1bHQubG9nRmlsZVNpemVMaW1pdCEpIC8gMTAyNCAvIDEwMjQgfHwgJzEwJ30gTUIpLCByZWNyZWF0ZSBsb2cgZmlsZWBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdbUGljTGlzdCBXQVJOXTonKSwgd2FybmluZ01zZylcclxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZUxvZ0ZpbGUodGhpcy5sb2dQYXRoKVxyXG4gICAgICAgICAgICBtc2cudW5zaGlmdCh3YXJuaW5nTXNnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVXcml0ZUxvZyh0aGlzLmxvZ1BhdGgsIHR5cGUsIC4uLm1zZylcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyB3aHk/Pz9cclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiBjaGVja2luZyBsb2cgZmlsZSBzaXplJywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nRmlsZUlzTGFyZ2UgKGxvZ1BhdGg6IHN0cmluZyk6IHtcclxuICAgIGlzTGFyZ2U6IGJvb2xlYW5cclxuICAgIGxvZ0ZpbGVTaXplPzogbnVtYmVyXHJcbiAgICBsb2dGaWxlU2l6ZUxpbWl0PzogbnVtYmVyXHJcbiAgfSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2dQYXRoKSkge1xyXG4gICAgICBjb25zdCBsb2dGaWxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxvZ1BhdGgpLnNpemVcclxuICAgICAgY29uc3QgbG9nRmlsZVNpemVMaW1pdCA9IGZvcmNlTnVtYmVyKHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxudW1iZXI+Pignc2V0dGluZ3MubG9nRmlsZVNpemVMaW1pdCcpIHx8IDEwKSAqIDEwMjQgKiAxMDI0IC8vIDEwIE1CIGRlZmF1bHRcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc0xhcmdlOiBsb2dGaWxlU2l6ZSA+IGxvZ0ZpbGVTaXplTGltaXQsXHJcbiAgICAgICAgbG9nRmlsZVNpemUsXHJcbiAgICAgICAgbG9nRmlsZVNpemVMaW1pdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc0xhcmdlOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNyZWF0ZUxvZ0ZpbGUgKGxvZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcclxuICAgICAgZnMudW5saW5rU3luYyhsb2dQYXRoKVxyXG4gICAgICBmcy5jcmVhdGVGaWxlU3luYyhsb2dQYXRoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVXcml0ZUxvZyAobG9nUGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrTG9nTGV2ZWwodHlwZSwgdGhpcy5sb2dMZXZlbCkpIHtcclxuICAgICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKX0gW1BpY0xpc3QgJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgICAgbXNnLmZvckVhY2goKGl0ZW06IElMb2dBcmd2VHlwZVdpdGhFcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsb2cgKz0gJ1xcbidcclxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKGxvZ1BhdGgsIGxvZylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbUGljTGlzdCBFcnJvcl0gb24gd3JpdGluZyBsb2cgZmlsZScsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nTGV2ZWwgKHR5cGU6IHN0cmluZywgbGV2ZWw6IHVuZGVmaW5lZCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBsZXZlbCA9PT0gJ2FsbCcpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsKSkge1xyXG4gICAgICByZXR1cm4gbGV2ZWwuc29tZSgoaXRlbTogc3RyaW5nKSA9PiAoaXRlbSA9PT0gdHlwZSB8fCBpdGVtID09PSAnYWxsJykpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHlwZSA9PT0gbGV2ZWxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1Y2Nlc3MgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5zdWNjZXNzLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBpbmZvICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZXJyb3IgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5lcnJvciwgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgd2FybiAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLndhcm4sIC4uLm1zZylcclxuICB9XHJcblxyXG4gIGRlYnVnICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXYoKSkge1xyXG4gICAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2dnZXJcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBJTGlmZWN5Y2xlUGx1Z2lucywgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBoYW5kbGVVcmxFbmNvZGUgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlQ29udGV4dCdcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc3RhcnQgKGlucHV0OiBhbnlbXSk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICAvLyBlbnN1cmUgZXZlcnkgdXBsb2FkIHByb2Nlc3MgaGFzIGFuIHVuaXF1ZSBjb250ZXh0XHJcbiAgICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KHRoaXMuY3R4KVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaW1hZ2VzIGlucHV0XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgYW4gYXJyYXkuJylcclxuICAgICAgfVxyXG4gICAgICBjdHguaW5wdXQgPSBpbnB1dFxyXG4gICAgICBjdHgub3V0cHV0ID0gW11cclxuXHJcbiAgICAgIC8vIGxpZmVjeWNsZSBtYWluXHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVHJhbnNmb3JtKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1RyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVXBsb2FkKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJVcGxvYWQoY3R4KVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgY3R4LmxvZy53YXJuKElCdWlsZEluRXZlbnQuRkFJTEVEKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgLTEpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgIGlmIChjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdkZWJ1ZycpKSB7XHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdHhcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMClcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQkVGT1JFX1RSQU5TRk9STSwgY3R4KVxyXG4gICAgY3R4LmxvZy5pbmZvKCdCZWZvcmUgdHJhbnNmb3JtJylcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmJlZm9yZVRyYW5zZm9ybVBsdWdpbnMsIGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZG9UcmFuc2Zvcm0gKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAzMClcclxuICAgIGNvbnN0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQudHJhbnNmb3JtZXInKSB8fCAncGF0aCdcclxuICAgIGxldCBjdXJyZW50VHJhbnNmb3JtZXIgPSB0eXBlXHJcbiAgICBsZXQgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCh0eXBlKVxyXG4gICAgaWYgKCF0cmFuc2Zvcm1lcikge1xyXG4gICAgICB0cmFuc2Zvcm1lciA9IGN0eC5oZWxwZXIudHJhbnNmb3JtZXIuZ2V0KCdwYXRoJylcclxuICAgICAgY3VycmVudFRyYW5zZm9ybWVyID0gJ3BhdGgnXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB0cmFuc2Zvcm1lciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHRyYW5zZm9ybWVyIC0gcGF0aGApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFRyYW5zZm9ybWluZy4uLiBDdXJyZW50IHRyYW5zZm9ybWVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHRyYW5zZm9ybWVyPy5oYW5kbGUoY3R4KVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCA2MClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHVwbG9hZCcpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9VUExPQUQsIGN0eClcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMsIGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZG9VcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGxldCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLmN1cnJlbnQnKSB8fCAnc21tcydcclxuICAgIGxldCB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KHR5cGUpXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgaWYgKCF1cGxvYWRlcikge1xyXG4gICAgICB0eXBlID0gJ3NtbXMnXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdzbW1zJ1xyXG4gICAgICB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KCdzbW1zJylcclxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHVwbG9hZGVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdXBsb2FkZXIgLSBzbW1zYClcclxuICAgIH1cclxuICAgIGN0eC5sb2cuaW5mbyhgVXBsb2FkaW5nLi4uIEN1cnJlbnQgdXBsb2FkZXIgaXMgWyR7Y3VycmVudFRyYW5zZm9ybWVyfV1gKVxyXG4gICAgYXdhaXQgdXBsb2FkZXI/LmhhbmRsZShjdHgpXHJcbiAgICBmb3IgKGNvbnN0IG91dHB1dEltZyBvZiBjdHgub3V0cHV0KSB7XHJcbiAgICAgIG91dHB1dEltZy50eXBlID0gdHlwZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZnRlclVwbG9hZCAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5BRlRFUl9VUExPQUQsIGN0eClcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAxMDApXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMsIGN0eClcclxuICAgIGxldCBtc2cgPSAnJ1xyXG4gICAgY29uc3QgbGVuZ3RoID0gY3R4Lm91dHB1dC5sZW5ndGhcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHR5cGVvZiBjdHgub3V0cHV0W2ldLmltZ1VybCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBtc2cgKz0gaGFuZGxlVXJsRW5jb2RlKGN0eC5vdXRwdXRbaV0uaW1nVXJsISlcclxuICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgbXNnICs9ICdcXG4nXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJhc2U2NEltYWdlXHJcbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJ1ZmZlclxyXG4gICAgfVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GSU5JU0hFRCwgY3R4KVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKGBcXG4ke21zZ31gKVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQbHVnaW5zIChsaWZlQ3ljbGVQbHVnaW5zOiBJTGlmZWN5Y2xlUGx1Z2lucywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0TGlzdCgpXHJcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0SWRMaXN0KClcclxuICAgIGNvbnN0IGxpZmVDeWNsZU5hbWUgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldE5hbWUoKVxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocGx1Z2lucy5tYXAoYXN5bmMgKHBsdWdpbjogSVBsdWdpbiwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGN0eC5sb2cuaW5mbyhgJHtsaWZlQ3ljbGVOYW1lfTogJHtwbHVnaW5OYW1lc1tpbmRleF19IHJ1bm5pbmdgKVxyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5oYW5kbGUoY3R4KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihgJHtsaWZlQ3ljbGVOYW1lfTogJHtwbHVnaW5OYW1lc1tpbmRleF19IGVycm9yYClcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH0pKVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlXHJcbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuLyoqXHJcbiAqIGNyZWF0ZSBhbiB1bmlxdWUgY29udGV4dCBmb3IgZWFjaCB1cGxvYWQgcHJvY2Vzc1xyXG4gKiBAcGFyYW0gY3R4XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dCA9IChjdHg6IElQaWNHbyk6IElQaWNHbyA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGNvbmZpZ1BhdGg6IGN0eC5jb25maWdQYXRoLFxyXG4gICAgYmFzZURpcjogY3R4LmJhc2VEaXIsXHJcbiAgICBsb2c6IGN0eC5sb2csXHJcbiAgICBjbWQ6IGN0eC5jbWQsXHJcbiAgICBvdXRwdXQ6IFtdLFxyXG4gICAgaW5wdXQ6IFtdLFxyXG4gICAgcGx1Z2luTG9hZGVyOiBjdHgucGx1Z2luTG9hZGVyLFxyXG4gICAgcGx1Z2luSGFuZGxlcjogY3R4LnBsdWdpbkhhbmRsZXIsXHJcbiAgICBSZXF1ZXN0OiBjdHguUmVxdWVzdCxcclxuICAgIGhlbHBlcjogY3R4LmhlbHBlcixcclxuICAgIFZFUlNJT046IGN0eC5WRVJTSU9OLFxyXG4gICAgR1VJX1ZFUlNJT046IGN0eC5HVUlfVkVSU0lPTixcclxuICAgIHJlcXVlc3Q6IGN0eC5yZXF1ZXN0LFxyXG4gICAgaTE4bjogY3R4LmkxOG4sXHJcbiAgICBnZXRDb25maWc6IGN0eC5nZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2F2ZUNvbmZpZzogY3R4LnNhdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQ29uZmlnOiBjdHgucmVtb3ZlQ29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHNldENvbmZpZzogY3R4LnNldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICB1bnNldENvbmZpZzogY3R4LnVuc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVwbG9hZDogY3R4LnVwbG9hZC5iaW5kKGN0eCksXHJcbiAgICBhZGRMaXN0ZW5lcjogY3R4LmFkZExpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9uOiBjdHgub24uYmluZChjdHgpLFxyXG4gICAgb25jZTogY3R4Lm9uY2UuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlTGlzdGVuZXI6IGN0eC5yZW1vdmVMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBvZmY6IGN0eC5vZmYuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBjdHgucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHNldE1heExpc3RlbmVyczogY3R4LnNldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBnZXRNYXhMaXN0ZW5lcnM6IGN0eC5nZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgbGlzdGVuZXJzOiBjdHgubGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHJhd0xpc3RlbmVyczogY3R4LnJhd0xpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBlbWl0OiBjdHguZW1pdC5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lckNvdW50OiBjdHgubGlzdGVuZXJDb3VudC5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kTGlzdGVuZXI6IGN0eC5wcmVwZW5kTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgcHJlcGVuZE9uY2VMaXN0ZW5lcjogY3R4LnByZXBlbmRPbmNlTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgZXZlbnROYW1lczogY3R4LmV2ZW50TmFtZXMuYmluZChjdHgpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVNtbXNDb25maWcsIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChmaWxlTmFtZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyLCBhcGlUb2tlbjogc3RyaW5nLCBiYWNrdXBEb21haW4gPSAnJyk6IElPbGRSZXFPcHRpb25zID0+IHtcclxuICBjb25zdCBkb21haW4gPSBiYWNrdXBEb21haW4gfHwgJ3NtLm1zJ1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHBzOi8vJHtkb21haW59L2FwaS92Mi91cGxvYWRgLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBjb250ZW50VHlwZTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbycsXHJcbiAgICAgIEF1dGhvcml6YXRpb246IGFwaVRva2VuXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgc21maWxlOiB7XHJcbiAgICAgICAgdmFsdWU6IGltYWdlLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIGZpbGVuYW1lOiBmaWxlTmFtZVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3NsOiAndHJ1ZSdcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3Qgc21tc0NvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpXHJcbiAgaWYgKCFzbW1zQ29uZmlnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCBzbW1zIGNvbmZpZyEnKVxyXG4gIH1cclxuICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBvc3RDb25maWcgPSBwb3N0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGltYWdlLCBzbW1zQ29uZmlnPy50b2tlbiwgc21tc0NvbmZpZz8uYmFja3VwRG9tYWluKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogc3RyaW5nID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHkuY29kZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuZGF0YS51cmxcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmhhc2hcclxuICAgICAgICB9IGVsc2UgaWYgKGJvZHkuY29kZSA9PT0gJ2ltYWdlX3JlcGVhdGVkJyAmJiB0eXBlb2YgYm9keS5pbWFnZXMgPT09ICdzdHJpbmcnKSB7IC8vIGRvIGV4dHJhIGNoZWNrIHNpbmNlIHRoaXMgZXJyb3IgcmV0dXJuIGlzIG5vdCBkb2N1bWVudGVkIGF0IGh0dHBzOi8vZG9jLnNtLm1zLyNhcGktSW1hZ2UtVXBsb2FkXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuaW1hZ2VzXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubWVzc2FnZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJU21tc0NvbmZpZz4oJ3BpY0JlZC5zbW1zJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgbWVzc2FnZTogJ2FwaSB0b2tlbicsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYmFja3VwRG9tYWluJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4nKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYmFja3VwRG9tYWluIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdzbW1zJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVMnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVGN5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XHJcbiAgc2lnbmF0dXJlOiBzdHJpbmdcclxuICBhcHBJZDogc3RyaW5nXHJcbiAgYnVja2V0OiBzdHJpbmdcclxuICBzaWduVGltZTogc3RyaW5nXHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IElTaWduYXR1cmUgPT4ge1xyXG4gIGNvbnN0IHNlY3JldElkID0gb3B0aW9ucy5zZWNyZXRJZFxyXG4gIGNvbnN0IHNlY3JldEtleSA9IG9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkXHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBsZXQgc2lnbmF0dXJlXHJcbiAgbGV0IHNpZ25UaW1lOiBzdHJpbmcgPSAnJ1xyXG4gIGlmICghb3B0aW9ucy52ZXJzaW9uIHx8IG9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDApXHJcbiAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApIC0gMVxyXG4gICAgY29uc3QgZXhwaXJlZCA9IGN1cnJlbnQgKyAzNjAwXHJcblxyXG4gICAgY29uc3QgbXVsdGlTaWduYXR1cmUgPSBgYT0ke2FwcElkfSZiPSR7YnVja2V0fSZrPSR7c2VjcmV0SWR9JmU9JHtleHBpcmVkfSZ0PSR7Y3VycmVudH0mcj0ke3JhbmRvbX0mZj1gXHJcblxyXG4gICAgY29uc3Qgc2lnbkhleEtleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUobXVsdGlTaWduYXR1cmUpLmRpZ2VzdCgpXHJcbiAgICBjb25zdCB0ZW1wU3RyaW5nID0gQnVmZmVyLmNvbmNhdChbc2lnbkhleEtleSwgQnVmZmVyLmZyb20obXVsdGlTaWduYXR1cmUpXSlcclxuICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHRlbXBTdHJpbmcpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3Nzgjc2lnbmF0dXJlXHJcbiAgICBjb25zdCB0b2RheSA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKVxyXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0b2RheSArIDg2NDAwXHJcbiAgICBzaWduVGltZSA9IGAke3RvZGF5fTske3RvbW9ycm93fWBcclxuICAgIGNvbnN0IHNpZ25LZXkgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNlY3JldEtleSkudXBkYXRlKHNpZ25UaW1lKS5kaWdlc3QoJ2hleCcpXHJcbiAgICBjb25zdCBodHRwU3RyaW5nID0gYHB1dFxcbi8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfVxcblxcbmhvc3Q9JHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21cXG5gXHJcbiAgICBjb25zdCBzaGExZWRIdHRwU3RyaW5nID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoaHR0cFN0cmluZykuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gYHNoYTFcXG4ke3NpZ25UaW1lfVxcbiR7c2hhMWVkSHR0cFN0cmluZ31cXG5gXHJcbiAgICBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNpZ25LZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdCgnaGV4JylcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHNpZ25hdHVyZSxcclxuICAgIGFwcElkLFxyXG4gICAgYnVja2V0LFxyXG4gICAgc2lnblRpbWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLCBpbWFnZTogQnVmZmVyLCB2ZXJzaW9uOiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtmaWxlTmFtZX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZS5zaWduYXR1cmUsXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgICB1c2VyQWdlbnQ6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgZm9ybURhdGE6IHtcclxuICAgICAgICBvcDogJ3VwbG9hZCcsXHJcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgIHVybDogYGh0dHA6Ly8ke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YCxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEhvc3Q6IGAke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbWAsXHJcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYHEtc2lnbi1hbGdvcml0aG09c2hhMSZxLWFrPSR7b3B0aW9ucy5zZWNyZXRJZH0mcS1zaWduLXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEta2V5LXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEtaGVhZGVyLWxpc3Q9aG9zdCZxLXVybC1wYXJhbS1saXN0PSZxLXNpZ25hdHVyZT0ke3NpZ25hdHVyZS5zaWduYXR1cmV9YCxcclxuICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpLFxyXG4gICAgICAgIHVzZXJBZ2VudDogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBpbWFnZSxcclxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHRjWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPigncGljQmVkLnRjeXVuJylcclxuICBpZiAoIXRjWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdGVuY2VudCBDT1MgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSB0Y1l1bk9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCBwYXRoID0gdGNZdW5PcHRpb25zLnBhdGhcclxuICAgIGNvbnN0IHVzZVY0ID0gIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGlmICghc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSwgY3R4LkdVSV9WRVJTSU9OIHx8IGN0eC5WRVJTSU9OKVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcylcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBtc2c6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0FVVEhfRkFJTEVEJyksXHJcbiAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgbGV0IGJvZHlcclxuICAgICAgICBpZiAodXNlVjQgJiYgdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYm9keSA9IHJlc1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSA0MDApIHtcclxuICAgICAgICAgIGlmIChib2R5Py5ib2R5Py5lcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgYm9keS5ib2R5LmVyclxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHk/LmJvZHk/Lm1zZyB8fCBib2R5Py5ib2R5Py5tZXNzYWdlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25VcmwgPSB0Y1l1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgIGlmICh1c2VWNCAmJiBib2R5Lm1lc3NhZ2UgPT09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtib2R5LmRhdGEuc291cmNlX3VybCBhcyBzdHJpbmd9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5ib2R5Lm1zZylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKCF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGVyci5lcnJvcilcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgICBjb2RlOiBib2R5LmNvZGUgYXMgc3RyaW5nXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRleHQ6ICdodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzg0MzInXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KCdwaWNCZWQudGN5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAndmVyc2lvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgYWxpYXM6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTicpLFxyXG4gICAgICBjaG9pY2VzOiBbJ3Y0JywgJ3Y1J10sXHJcbiAgICAgIGRlZmF1bHQ6ICd2NScsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0S2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FwcElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFwcElkIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigndGN5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJR2l0aHViQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChmaWxlTmFtZTogc3RyaW5nLCBvcHRpb25zOiBJR2l0aHViQ29uZmlnLCBkYXRhOiBhbnkpOiBJT2xkUmVxT3B0aW9uc1dpdGhKU09OID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgeyB0b2tlbiwgcmVwbyB9ID0gb3B0aW9uc1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3JlcG99L2NvbnRlbnRzLyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbycsXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICAgIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gICAganNvbjogdHJ1ZVxyXG4gIH0gYXMgY29uc3RcclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBnaXRodWJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJR2l0aHViQ29uZmlnPigncGljQmVkLmdpdGh1YicpXHJcbiAgaWYgKCFnaXRodWJPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBnaXRodWIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICBtZXNzYWdlOiAnVXBsb2FkIGJ5IFBpY0dvJyxcclxuICAgICAgICAgIGJyYW5jaDogZ2l0aHViT3B0aW9ucy5icmFuY2gsXHJcbiAgICAgICAgICBjb250ZW50OiBiYXNlNjRJbWFnZSxcclxuICAgICAgICAgIHBhdGg6IGdpdGh1Yk9wdGlvbnMucGF0aCArIGVuY29kZVVSSShpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvc3RDb25maWcgPSBwb3N0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGdpdGh1Yk9wdGlvbnMsIGRhdGEpXHJcbiAgICAgICAgY29uc3QgYm9keToge1xyXG4gICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICBkb3dubG9hZF91cmw6IHN0cmluZ1xyXG4gICAgICAgICAgICBzaGE6IHN0cmluZ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxyXG4gICAgICAgIGlmIChib2R5KSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtnaXRodWJPcHRpb25zLmN1c3RvbVVybH0vJHtnaXRodWJPcHRpb25zLnBhdGh9JHtpbWcuZmlsZU5hbWV9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuY29udGVudC5kb3dubG9hZF91cmxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5jb250ZW50LnNoYVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSycpXHJcbiAgICB9KVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlcG8nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1JFUE8nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVwbyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdicmFuY2gnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnJhbmNoIHx8ICdtYXN0ZXInLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcignZ2l0aHViJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCBxaW5pdSBmcm9tICdxaW5pdSdcclxuaW1wb3J0IHsgSVBsdWdpbkNvbmZpZywgSVFpbml1Q29uZmlnLCBJUGljR28sIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5mdW5jdGlvbiBwb3N0T3B0aW9ucyAob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcclxuICBjb25zdCBhcmVhID0gc2VsZWN0QXJlYShvcHRpb25zLmFyZWEgfHwgJ3owJylcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgYmFzZTY0RmlsZU5hbWUgPSBCdWZmZXIuZnJvbShwYXRoICsgZmlsZU5hbWUsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHA6Ly91cGxvYWQke2FyZWF9LnFpbml1cC5jb20vcHV0YjY0Ly0xL2tleS8ke2Jhc2U2NEZpbGVOYW1lfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBVcFRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltZ0Jhc2U2NFxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0QXJlYSAoYXJlYTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYXJlYSA9PT0gJ3owJyA/ICcnIDogJy0nICsgYXJlYVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbiAocWluaXVPcHRpb25zOiBhbnkpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGFjY2Vzc0tleSA9IHFpbml1T3B0aW9ucy5hY2Nlc3NLZXlcclxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgbWFjID0gbmV3IHFpbml1LmF1dGguZGlnZXN0Lk1hYyhhY2Nlc3NLZXksIHNlY3JldEtleSlcclxuICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXRcclxuICB9XHJcbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxyXG4gIHJldHVybiBwdXRQb2xpY3kudXBsb2FkVG9rZW4obWFjKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHFpbml1T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JylcclxuICBpZiAoIXFpbml1T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgcWluaXUgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gcWluaXVPcHRpb25zLm9wdGlvbnNcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke2JvZHkua2V5IGFzIHN0cmluZ30ke29wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1zZ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoJ3Fpbml1IGVycm9yJywgYm9keSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIC8vIGVyci5yZXNwb25zZSBtYXliZSB1bmRlZmluZWRcclxuICAgICAgaWYgKGVyci5yZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVycm9yLmVycm9yXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oJ3BpY0JlZC5xaW5pdScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FDQ0VTU0tFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncWluaXUnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVUnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElJbWd1ckNvbmZpZywgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElJbWd1ckNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1nQmFzZTY0OiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9ucyA9PiB7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkXHJcbiAgY29uc3Qgb2JqOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvaW1hZ2UnLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgQ2xpZW50LUlEICR7Y2xpZW50SWR9YCxcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgSG9zdDogJ2FwaS5pbWd1ci5jb20nLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbydcclxuICAgIH0sXHJcbiAgICBmb3JtRGF0YToge1xyXG4gICAgICBpbWFnZTogaW1nQmFzZTY0LFxyXG4gICAgICB0eXBlOiAnYmFzZTY0JyxcclxuICAgICAgbmFtZTogZmlsZU5hbWVcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIG9iai5wcm94eSA9IG9wdGlvbnMucHJveHlcclxuICB9XHJcbiAgcmV0dXJuIG9ialxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGltZ3VyT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUltZ3VyQ29uZmlnPigncGljQmVkLmltZ3VyJylcclxuICBpZiAoIWltZ3VyT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgaW1ndXIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhpbWd1ck9wdGlvbnMsIGltZy5maWxlTmFtZSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGlmIChib2R5LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLmxpbmtcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmRlbGV0ZWhhc2hcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLmltZ3VyLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgfSlcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIHRocm93IGVycj8ucmVzcG9uc2U/LmRhdGEgfHwgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjbGllbnRJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmNsaWVudElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Byb3h5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnByb3h5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdpbWd1cicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUFsaXl1bkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuLy8gZ2VuZXJhdGUgT1NTIHNpZ25hdHVyZVxyXG5jb25zdCBnZW5lcmF0ZVNpZ25hdHVyZSA9IChvcHRpb25zOiBJQWxpeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXHJcbiAgY29uc3QgbWltZVR5cGUgPSBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICBpZiAoIW1pbWVUeXBlKSB0aHJvdyBFcnJvcihgTm8gbWltZSB0eXBlIGZvdW5kIGZvciBmaWxlICR7ZmlsZU5hbWV9YClcclxuXHJcbiAgY29uc3Qgc2lnblN0cmluZyA9IGBQVVRcXG5cXG4ke21pbWVUeXBlfVxcbiR7ZGF0ZX1cXG4vJHtvcHRpb25zLmJ1Y2tldH0vJHtvcHRpb25zLnBhdGh9JHtmaWxlTmFtZX1gXHJcblxyXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgb3B0aW9ucy5hY2Nlc3NLZXlTZWNyZXQpLnVwZGF0ZShzaWduU3RyaW5nKS5kaWdlc3QoJ2Jhc2U2NCcpXHJcbiAgcmV0dXJuIGBPU1MgJHtvcHRpb25zLmFjY2Vzc0tleUlkfToke3NpZ25hdHVyZX1gXHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyKTogSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUFVUJyxcclxuICAgIHVybDogYGh0dHBzOi8vJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbS8ke2VuY29kZVVSSShvcHRpb25zLnBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbWAsXHJcbiAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZSxcclxuICAgICAgRGF0ZTogbmV3IERhdGUoKS50b1VUQ1N0cmluZygpLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpXHJcbiAgICB9LFxyXG4gICAgYm9keTogaW1hZ2UsXHJcbiAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBhbGlZdW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpXHJcbiAgaWYgKCFhbGlZdW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBhbGlZdW4gT1NTIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGhcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnMoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IG9wdGlvblVybCA9IGFsaVl1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7YWxpWXVuT3B0aW9ucy5idWNrZXR9LiR7YWxpWXVuT3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWNjZXNzS2V5SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlJZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlTZWNyZXQnLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5U2VjcmV0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdhbGl5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7XHJcbiAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVUQnKVxyXG4gICAgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVXB5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IE1ENSBmcm9tICdtZDUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCB7IHNhZmVQYXJzZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIGNvbnN0IG9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvclxyXG4gIGNvbnN0IHBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZFxyXG4gIGNvbnN0IG1kNVBhc3N3b3JkID0gTUQ1KHBhc3N3b3JkKVxyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcclxuICBjb25zdCB1cmkgPSBgLyR7b3B0aW9ucy5idWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gXHJcbiAgY29uc3QgdmFsdWUgPSBgUFVUJiR7dXJpfSYke2RhdGV9YFxyXG4gIGNvbnN0IHNpZ24gPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG1kNVBhc3N3b3JkKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgnYmFzZTY0JylcclxuICByZXR1cm4gYFVQWVVOICR7b3BlcmF0b3J9OiR7c2lnbn1gXHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGJ1Y2tldCA9IG9wdGlvbnMuYnVja2V0XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly92MC5hcGkudXB5dW4uY29tLyR7YnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLFxyXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHVweXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJylcclxuICBpZiAoIXVweXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdXBZdW4gY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBwYXRoID0gdXB5dW5PcHRpb25zLnBhdGggfHwgJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7dXB5dW5PcHRpb25zLnVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7dXB5dW5PcHRpb25zLm9wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdVcGxvYWQgZmFpbGVkJykge1xyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYm9keSA9IHNhZmVQYXJzZTx7IGNvZGU6IHN0cmluZyB9PihlcnIuZXJyb3IpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyA/IGJvZHkuY29kZSA6IGJvZHlcclxuICAgICAgICB9KSxcclxuICAgICAgICB0ZXh0OiAnaHR0cDovL2RvY3MudXB5dW4uY29tL2FwaS9lcnJuby8nXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3BlcmF0b3InLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJykgfSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUEVSQVRPUicpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcGVyYXRvciB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1BBU1NXT1JEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3VweXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IFNNTVNVcGxvYWRlciBmcm9tICcuL3NtbXMnXHJcbmltcG9ydCB0Y1l1blVwbG9hZGVyIGZyb20gJy4vdGN5dW4nXHJcbmltcG9ydCBnaXRodWJVcGxvYWRlciBmcm9tICcuL2dpdGh1YidcclxuaW1wb3J0IHFpbml1VXBsb2FkZXIgZnJvbSAnLi9xaW5pdSdcclxuaW1wb3J0IGltZ3VyVXBsb2FkZXIgZnJvbSAnLi9pbWd1cidcclxuaW1wb3J0IGFsaVl1blVwbG9hZGVyIGZyb20gJy4vYWxpeXVuJ1xyXG5pbXBvcnQgdXBZdW5VcGxvYWRlciBmcm9tICcuL3VweXVuJ1xyXG5cclxuY29uc3QgYnVpbGRJblVwbG9hZGVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgYWxpWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB0Y1l1blVwbG9hZGVyKGN0eClcclxuICAgICAgU01NU1VwbG9hZGVyKGN0eClcclxuICAgICAgZ2l0aHViVXBsb2FkZXIoY3R4KVxyXG4gICAgICBxaW5pdVVwbG9hZGVyKGN0eClcclxuICAgICAgaW1ndXJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHVwWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgYnVpbGRJblVwbG9hZGVyc1xyXG4iLCJpbXBvcnQge1xyXG4gIGlzVXJsLFxyXG4gIGdldEltYWdlU2l6ZSxcclxuICBnZXRGU0ZpbGUsXHJcbiAgZ2V0VVJMRmlsZVxyXG59IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgSUltZ0luZm8sIElJbWdTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdHM6IElJbWdJbmZvW10gPSBjdHgub3V0cHV0XHJcbiAgYXdhaXQgUHJvbWlzZS5hbGwoY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cclxuICAgIGlmIChpc1VybChpdGVtKSkge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0RlNGaWxlKGl0ZW0pXHJcbiAgICB9XHJcbiAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGltZ1NpemUgPSBnZXRJbWdTaXplKGN0eCwgaW5mby5idWZmZXIsIGl0ZW0pXHJcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0ge1xyXG4gICAgICAgIGJ1ZmZlcjogaW5mby5idWZmZXIsXHJcbiAgICAgICAgZmlsZU5hbWU6IGluZm8uZmlsZU5hbWUsXHJcbiAgICAgICAgd2lkdGg6IGltZ1NpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBpbWdTaXplLmhlaWdodCxcclxuICAgICAgICBleHRuYW1lOiBpbmZvLmV4dG5hbWVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGluZm8ucmVhc29uKVxyXG4gICAgfVxyXG4gIH0pKVxyXG4gIC8vIHJlbW92ZSBlbXB0eSBpdGVtXHJcbiAgY3R4Lm91dHB1dCA9IHJlc3VsdHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSlcclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGdldEltZ1NpemUgPSAoY3R4OiBJUGljR28sIGZpbGU6IEJ1ZmZlciwgcGF0aDogc3RyaW5nKTogSUltZ1NpemUgPT4ge1xyXG4gIGNvbnN0IGltYWdlU2l6ZSA9IGdldEltYWdlU2l6ZShmaWxlKVxyXG4gIGlmICghaW1hZ2VTaXplLnJlYWwpIHtcclxuICAgIGN0eC5sb2cud2FybihgY2FuJ3QgZ2V0ICR7cGF0aH0ncyBpbWFnZSBzaXplYClcclxuICAgIGN0eC5sb2cud2FybignZmFsbGJhY2sgdG8gMjAwICogMjAwJylcclxuICB9XHJcbiAgcmV0dXJuIGltYWdlU2l6ZVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY3R4Lm91dHB1dC5wdXNoKC4uLmN0eC5pbnB1dClcclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBoYW5kbGVcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCByZXNvbHZlIGZyb20gJ3Jlc29sdmUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiwgSVBsdWdpbkxvYWRlciwgSVBpY0dvUGx1Z2luSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuLyoqXHJcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGx1Z2luTG9hZGVyIGltcGxlbWVudHMgSVBsdWdpbkxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgbGlzdDogc3RyaW5nW10gPSBbXVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVsbExpc3Q6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXA6IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4gPSBuZXcgTWFwKClcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VQYXRoKSkge1xyXG4gICAgICBjb25zdCBwa2cgPSB7XHJcbiAgICAgICAgbmFtZTogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAncGljZ28tcGx1Z2lucycsXHJcbiAgICAgICAgcmVwb3NpdG9yeTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlJyxcclxuICAgICAgICBsaWNlbnNlOiAnTUlUJ1xyXG4gICAgICB9XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBrZyksICd1dGY4JylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gZW50cnlcclxuICBwcml2YXRlIHJlc29sdmVQbHVnaW4gKGN0eDogSVBpY0dvLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHJlc29sdmUuc3luYyhuYW1lLCB7IGJhc2VkaXI6IGN0eC5iYXNlRGlyIH0pXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIHBhdGguam9pbihjdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcycsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBsb2FkIGFsbCB0aGlyZCBwYXJ0eSBwbHVnaW5cclxuICBsb2FkICgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIFRoYW5rcyB0byBoZXhvIC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9oZXhvanMvaGV4by9ibG9iL21hc3Rlci9saWIvaGV4by9sb2FkX3BsdWdpbnMuanNcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwbHVnaW5EaXIpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlUGF0aClcclxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IGRldkRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IG1vZHVsZXMgPSBkZXBzLmNvbmNhdChkZXZEZXBzKS5maWx0ZXIoKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoIS9ecGljZ28tcGx1Z2luLXxeQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJlc29sdmVQbHVnaW4odGhpcy5jdHgsIG5hbWUpXHJcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpXHJcbiAgICB9KVxyXG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luKG1vZHVsZSlcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICByZWdpc3RlclBsdWdpbiAobmFtZTogc3RyaW5nLCBwbHVnaW4/OiBJUGljR29QbHVnaW4pOiB2b2lkIHtcclxuICAgIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5jdHgubG9nLndhcm4oJ1BsZWFzZSBwcm92aWRlIHZhbGlkIHBsdWdpbicpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5mdWxsTGlzdC5hZGQobmFtZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIHJlZ2lzdGVyIGxvY2FsIHBsdWdpblxyXG4gICAgICBpZiAoIXBsdWdpbikge1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHRydWUgfHwgKHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgdGhpcy5saXN0LnB1c2gobmFtZSlcclxuICAgICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgdGhpcy5nZXRQbHVnaW4obmFtZSkhLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gYHBpY2dvUGx1Z2luc1ske25hbWV9XWBcclxuICAgICAgICAgIHRoaXMuY3R4LnNhdmVDb25maWcoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBbcGx1Z2luXTogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHJlZ2lzdGVyIHByb3ZpZGVkIHBsdWdpblxyXG4gICAgICAgIC8vICYmIHdvbid0IHdyaXRlIGNvbmZpZyB0byBmaWxlc1xyXG4gICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgICAgICBjb25zdCBwbHVnaW5JbnRlcmZhY2UgPSBwbHVnaW4odGhpcy5jdHgpXHJcbiAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbkludGVyZmFjZSlcclxuICAgICAgICBwbHVnaW5JbnRlcmZhY2UucmVnaXN0ZXIodGhpcy5jdHgpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5wbHVnaW5NYXAuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogYFBsdWdpbiAke25hbWV9IExvYWQgRXJyb3JgLFxyXG4gICAgICAgIGJvZHk6IGVcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVucmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5saXN0ID0gdGhpcy5saXN0LmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBuYW1lKVxyXG4gICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci51cGxvYWRlci51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudHJhbnNmb3JtZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVRyYW5zZm9ybVBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5jbWQudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHgucmVtb3ZlQ29uZmlnKCdwaWNnb1BsdWdpbnMnLCBuYW1lKVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IHBsdWdpbiBieSBuYW1lXHJcbiAgZ2V0UGx1Z2luIChuYW1lOiBzdHJpbmcpOiBJUGljR29QbHVnaW5JbnRlcmZhY2UgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMucGx1Z2luTWFwLmhhcyhuYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbHVnaW5NYXAuZ2V0KG5hbWUpXHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcy8nKVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IHBsdWdpbiA9IHJlcXVpcmUocGx1Z2luRGlyICsgbmFtZSkodGhpcy5jdHgpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luKVxyXG4gICAgcmV0dXJuIHBsdWdpblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIGVuYWJsZWQgcGx1Z2luc1xyXG4gICAqL1xyXG4gIGdldExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3RcclxuICB9XHJcblxyXG4gIGhhc1BsdWdpbiAobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mdWxsTGlzdC5oYXMobmFtZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZnVsbCBsaXN0IG9mIHBsdWdpbnMsIHdoZXRoZXIgaXQgaXMgZW5hYmxlZCBvciBub3RcclxuICAgKi9cclxuICBnZXRGdWxsTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmZ1bGxMaXN0XVxyXG4gIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5Mb2FkZXJcclxuIiwiZXhwb3J0IGNvbnN0IENMSVBCT0FSRF9JTUFHRV9GT0xERVIgPSAncGljbGlzdC1jbGlwYm9hcmQtaW1hZ2VzJ1xyXG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcclxuaW1wb3J0IG9zIGZyb20gJ29zJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBpc1dzbCBmcm9tICdpcy13c2wnXHJcbmltcG9ydCB7IElQaWNHbywgSUNsaXBib2FyZEltYWdlIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuL2VudW0nXHJcbmltcG9ydCBtYWNDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbWFjLmFwcGxlc2NyaXB0J1xyXG5pbXBvcnQgd2luZG93c0NsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzLnBzMSdcclxuaW1wb3J0IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzMTAucHMxJ1xyXG5pbXBvcnQgbGludXhDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbGludXguc2gnXHJcbmltcG9ydCB3c2xDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd3NsLnNoJ1xyXG5pbXBvcnQgeyBDTElQQk9BUkRfSU1BR0VfRk9MREVSIH0gZnJvbSAnLi9zdGF0aWMnXHJcblxyXG5leHBvcnQgdHlwZSBQbGF0Zm9ybSA9ICdkYXJ3aW4nIHwgJ3dpbjMyJyB8ICd3aW4xMCcgfCAnbGludXgnIHwgJ3dzbCdcclxuXHJcbmNvbnN0IGdldEN1cnJlbnRQbGF0Zm9ybSA9ICgpOiBQbGF0Zm9ybSA9PiB7XHJcbiAgY29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtXHJcbiAgaWYgKGlzV3NsKSB7XHJcbiAgICByZXR1cm4gJ3dzbCdcclxuICB9XHJcbiAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICBjb25zdCBjdXJyZW50T1MgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKVswXVxyXG4gICAgaWYgKGN1cnJlbnRPUyA9PT0gJzEwJykge1xyXG4gICAgICByZXR1cm4gJ3dpbjEwJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICd3aW4zMidcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgcmV0dXJuICdkYXJ3aW4nXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiAnbGludXgnXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRDb250ZW50OiB7XHJcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xyXG59ID0ge1xyXG4gIGRhcndpbjogbWFjQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjMyOiB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjEwOiB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQsXHJcbiAgbGludXg6IGxpbnV4Q2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdzbDogd3NsQ2xpcGJvYXJkU2NyaXB0XHJcbn1cclxuLyoqXHJcbiAqIHBvd2Vyc2hlbGwgd2lsbCByZXBvcnQgZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBoYXZlIGEgJy5wczEnIGV4dGVuc2lvbixcclxuICogc28gd2Ugc2hvdWxkIGtlZXAgdGhlIGV4dGVuc2lvbiBuYW1lIGNvbnNpc3RlbnQgd2l0aCBjb3JyZXNwb25kaW5nIHNoZWxsXHJcbiAqL1xyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZToge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46ICdtYWMuYXBwbGVzY3JpcHQnLFxyXG4gIHdpbjMyOiAnd2luZG93cy5wczEnLFxyXG4gIHdpbjEwOiAnd2luZG93czEwLnBzMScsXHJcbiAgbGludXg6ICdsaW51eC5zaCcsXHJcbiAgd3NsOiAnd3NsLnNoJ1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbWFnZUZvbGRlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIpXHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGltYWdlUGF0aCkpIHtcclxuICAgIGZzLm1rZGlyU3luYyhpbWFnZVBhdGgpXHJcbiAgfVxyXG59XHJcblxyXG4vLyBUaGFua3MgdG8gdnMtcGljZ286IGh0dHBzOi8vZ2l0aHViLmNvbS9TcGFkZXMtUy92cy1waWNnby9ibG9iL21hc3Rlci9zcmMvZXh0ZW5zaW9uLnRzXHJcbmNvbnN0IGdldENsaXBib2FyZEltYWdlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+ID0+IHtcclxuICBjcmVhdGVJbWFnZUZvbGRlcihjdHgpXHJcbiAgLy8gYWRkIGFuIGNsaXBib2FyZCBpbWFnZSBmb2xkZXIgdG8gY29udHJvbCB0aGUgaW1hZ2UgY2FjaGUgZmlsZVxyXG4gIGNvbnN0IGltYWdlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiwgYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9LnBuZ2ApXHJcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4oKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGdldEN1cnJlbnRQbGF0Zm9ybSgpXHJcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZVtwbGF0Zm9ybV0pXHJcbiAgICAvLyBJZiB0aGUgc2NyaXB0IGRvZXMgbm90IGV4aXN0IHlldCwgd2UgbmVlZCB0byB3cml0ZSB0aGUgY29udGVudCB0byB0aGUgc2NyaXB0IGZpbGVcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkge1xyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxyXG4gICAgICAgIHNjcmlwdFBhdGgsXHJcbiAgICAgICAgcGxhdGZvcm0yU2NyaXB0Q29udGVudFtwbGF0Zm9ybV0sXHJcbiAgICAgICAgJ3V0ZjgnXHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIGxldCBleGVjdXRpb25cclxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ29zYXNjcmlwdCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fCBwbGF0Zm9ybSA9PT0gJ3dpbjEwJykge1xyXG4gICAgICBleGVjdXRpb24gPSBzcGF3bigncG93ZXJzaGVsbCcsIFtcclxuICAgICAgICAnLW5vcHJvZmlsZScsXHJcbiAgICAgICAgJy1ub25pbnRlcmFjdGl2ZScsXHJcbiAgICAgICAgJy1ub2xvZ28nLFxyXG4gICAgICAgICctc3RhJyxcclxuICAgICAgICAnLWV4ZWN1dGlvbnBvbGljeScsICd1bnJlc3RyaWN0ZWQnLFxyXG4gICAgICAgIC8vIGZpeCB3aW5kb3dzIDEwIG5hdGl2ZSBjbWQgY3Jhc2ggYnVnIHdoZW4gXCJwaWNnbyB1cGxvYWRcIlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlL2lzc3Vlcy8zMlxyXG4gICAgICAgIC8vICctd2luZG93c3R5bGUnLCdoaWRkZW4nLFxyXG4gICAgICAgIC8vICctbm9leGl0JyxcclxuICAgICAgICAnLWZpbGUnLCBzY3JpcHRQYXRoLFxyXG4gICAgICAgIGltYWdlUGF0aFxyXG4gICAgICBdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3NoJywgW3NjcmlwdFBhdGgsIGltYWdlUGF0aF0pXHJcbiAgICB9XHJcblxyXG4gICAgZXhlY3V0aW9uLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcclxuICAgICAgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XHJcbiAgICAgICAgaWYgKGRhdGEudG9TdHJpbmcoKS50cmltKCkgPT09ICdubyB4Y2xpcCBvciB3bC1jbGlwYm9hcmQnKSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogJ3hjbGlwIG9yIHdsLWNsaXBib2FyZCBub3QgZm91bmQnLFxyXG4gICAgICAgICAgICBib2R5OiAnUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdQbGVhc2UgaW5zdGFsbCB4Y2xpcChmb3IgeDExKSBvciB3bC1jbGlwYm9hcmQoZm9yIHdheWxhbmQpIGJlZm9yZSBydW4gcGljZ28nKSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW1nUGF0aCA9IGRhdGEudG9TdHJpbmcoKS50cmltKClcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBmaWxlUGF0aCBpcyB0aGUgcmVhbCBmaWxlIGluIHN5c3RlbVxyXG4gICAgICAvLyB3ZSBzaG91bGQga2VlcCBpdCBpbnN0ZWFkIG9mIHJlbW92aW5nXHJcbiAgICAgIGxldCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgPSBmYWxzZVxyXG5cclxuICAgICAgLy8gaW4gbWFjT1MgaWYgeW91ciBjb3B5IHRoZSBmaWxlIGluIHN5c3RlbSwgaXQncyBiYXNlbmFtZSB3aWxsIG5vdCBlcXVhbCB0byBvdXIgZGVmYXVsdCBiYXNlbmFtZVxyXG4gICAgICBpZiAocGF0aC5iYXNlbmFtZShpbWdQYXRoKSAhPT0gcGF0aC5iYXNlbmFtZShpbWFnZVBhdGgpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHBhdGggaXMgbm90IGdlbmVyYXRlIGJ5IHBpY2dvXHJcbiAgICAgICAgLy8gYnV0IHRoZSBwYXRoIGV4aXN0cywgd2Ugc2hvdWxkIGtlZXAgaXRcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgICAgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBpZiB0aGUgaW1nUGF0aCBpcyBpbnZhbGlkXHJcbiAgICAgIGlmIChpbWdQYXRoICE9PSAnbm8gaW1hZ2UnICYmICFmcy5leGlzdHNTeW5jKGltZ1BhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbid0IGZpbmQgJHtpbWdQYXRofWApKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXNvbHZlKHtcclxuICAgICAgICBpbWdQYXRoLFxyXG4gICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZ1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRDbGlwYm9hcmRJbWFnZVxyXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXHJcblxyXG5jb25zdCBldmVudEJ1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5leHBvcnQge1xyXG4gIGV2ZW50QnVzXHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jICovXHJcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcydcclxuaW1wb3J0IHsgSVBpY0dvLCBVbmRlZmluYWJsZSwgSUNvbmZpZ0NoYW5nZVBheWxvYWQsIElDb25maWcsIElSZXF1ZXN0Q29uZmlnLCBJT2xkUmVxT3B0aW9ucywgSVJlc3BvbnNlLCBJRnVsbFJlc3BvbnNlLCBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnXHJcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnXHJcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcydcclxuaW1wb3J0IHR1bm5lbCBmcm9tICd0dW5uZWwnXHJcbmNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xyXG4gIG1heFZlcnNpb246ICdUTFN2MS4yJyxcclxuICBtaW5WZXJzaW9uOiAnVExTdjEuMidcclxufSlcclxuXHJcbi8vIHRoYW5rcyBmb3IgaHR0cHM6Ly9naXRodWIuZGV2L3JlcXVlc3QvcmVxdWVzdC9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG5mdW5jdGlvbiBhcHBlbmRGb3JtRGF0YSAoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcclxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICd2YWx1ZScgaW4gZGF0YSAmJiAnb3B0aW9ucycgaW4gZGF0YSkge1xyXG4gICAgZm9ybS5hcHBlbmQoa2V5LCBkYXRhLnZhbHVlLCBkYXRhLm9wdGlvbnMpXHJcbiAgfSBlbHNlIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcXVlc3RJbnRlcmNlcHRvciAob3B0aW9uczogSU9sZFJlcU9wdGlvbnMgfCBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1JlcXVlc3RDb25maWcgJiB7XHJcbiAgX19pc09sZE9wdGlvbnM/OiBib29sZWFuXHJcbn0ge1xyXG4gIGxldCBfX2lzT2xkT3B0aW9ucyA9IGZhbHNlXHJcbiAgY29uc3Qgb3B0OiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiAmIHtcclxuICAgIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG4gIH0gPSB7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgdXJsOiAob3B0aW9ucy51cmwgYXMgc3RyaW5nKSB8fCAnJyxcclxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxyXG4gIH1cclxuICAvLyB1c2VyIHJlcXVlc3QgY29uZmlnIHByb3h5XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIGxldCBwcm94eU9wdGlvbnMgPSBvcHRpb25zLnByb3h5XHJcbiAgICBpZiAodHlwZW9mIHByb3h5T3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKG9wdGlvbnMucHJveHkpXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5wcm94eSA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKHByb3h5T3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zPy5ob3N0bmFtZSxcclxuICAgICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zPy5wb3J0LCAxMClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdC5wcm94eSA9IHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0LCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogJ2h0dHAnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICgnZm9ybURhdGEnIGluIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5mb3JtRGF0YSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5mb3JtRGF0YVtrZXldXHJcbiAgICAgIGFwcGVuZEZvcm1EYXRhKGZvcm0sIGtleSwgZGF0YSlcclxuICAgIH1cclxuICAgIG9wdC5kYXRhID0gZm9ybVxyXG4gICAgb3B0LmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKG9wdC5oZWFkZXJzIHx8IHt9LCBmb3JtLmdldEhlYWRlcnMoKSlcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxyXG4gICAgZGVsZXRlIG9wdC5mb3JtRGF0YVxyXG4gIH1cclxuICBpZiAoJ2JvZHknIGluIG9wdGlvbnMpIHtcclxuICAgIG9wdC5kYXRhID0gb3B0aW9ucy5ib2R5XHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIGRlbGV0ZSBvcHQuYm9keVxyXG4gIH1cclxuICBpZiAoJ3FzJyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQucGFyYW1zID0gb3B0aW9ucy5xc1xyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgfVxyXG4gIG9wdC5fX2lzT2xkT3B0aW9ucyA9IF9faXNPbGRPcHRpb25zXHJcbiAgcmV0dXJuIG9wdFxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUludGVyY2VwdG9yIChyZXNwb25zZTogQXhpb3NSZXNwb25zZSk6IElGdWxsUmVzcG9uc2Uge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5yZXNwb25zZSxcclxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgIGJvZHk6IHJlc3BvbnNlLmRhdGFcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc3BvbnNlRXJyb3JIYW5kbGVyIChlcnJvcjogYW55KSB7XHJcbiAgLy8gaWYgKGVycm9yLnJlc3BvbnNlKSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIHN0YXR1cyBjb2RlXHJcbiAgLy8gICAvLyB0aGF0IGZhbGxzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgMnh4XHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJybylcclxuICAvLyB9IGVsc2UgaWYgKGVycm9yLnJlcXVlc3QpIHtcclxuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcclxuICAvLyAgIC8vIGBlcnJvci5yZXF1ZXN0YCBpcyBhbiBpbnN0YW5jZSBvZiBYTUxIdHRwUmVxdWVzdCBpbiB0aGUgYnJvd3NlciBhbmQgYW4gaW5zdGFuY2Ugb2ZcclxuICAvLyAgIC8vIGh0dHAuQ2xpZW50UmVxdWVzdCBpbiBub2RlLmpzXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IucmVxdWVzdClcclxuICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgLy8gU29tZXRoaW5nIGhhcHBlbmVkIGluIHNldHRpbmcgdXAgdGhlIHJlcXVlc3QgdGhhdCB0cmlnZ2VyZWQgYW4gRXJyb3JcclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKVxyXG4gIC8vIH1cclxuICBjb25zdCBlcnJvck9iaiA9IHtcclxuICAgIG1ldGhvZDogZXJyb3I/LmNvbmZpZz8ubWV0aG9kPy50b1VwcGVyQ2FzZSgpIHx8ICcnLFxyXG4gICAgdXJsOiBlcnJvcj8uY29uZmlnPy51cmwgfHwgJycsXHJcbiAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgfHwgJycsXHJcbiAgICBzdGFjazogZXJyb3I/LnN0YWNrIHx8IHt9LFxyXG4gICAgcmVzcG9uc2U6IHtcclxuICAgICAgc3RhdHVzOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBib2R5OiBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgfHwgJydcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yT2JqKVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSBwcm94eTogVW5kZWZpbmFibGU8c3RyaW5nPiA9ICcnXHJcbiAgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gPSB7fVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICBldmVudEJ1cy5vbihJQnVzRXZlbnQuQ09ORklHX0NIQU5HRSwgKGRhdGE6IElDb25maWdDaGFuZ2VQYXlsb2FkPHN0cmluZyB8IElDb25maWdbJ3BpY0JlZCddPikgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGRhdGEuY29uZmlnTmFtZSkge1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZCc6XHJcbiAgICAgICAgICBpZiAoKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pPy5wcm94eSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3h5ID0gKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pLnByb3h5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZC5wcm94eSc6XHJcbiAgICAgICAgICB0aGlzLnByb3h5ID0gZGF0YS52YWx1ZSBhcyBzdHJpbmdcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcHJveHkgPSB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5wcm94eScpXHJcbiAgICBpZiAocHJveHkpIHtcclxuICAgICAgdGhpcy5wcm94eSA9IHByb3h5XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVByb3h5ICgpOiBBeGlvc1JlcXVlc3RDb25maWdbJ3Byb3h5J10gfCBmYWxzZSB7XHJcbiAgICBpZiAodGhpcy5wcm94eSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByb3h5T3B0aW9ucyA9IG5ldyBVUkwodGhpcy5wcm94eSlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zLmhvc3RuYW1lLFxyXG4gICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zLnBvcnQgfHwgJzAnLCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogcHJveHlPcHRpb25zLnByb3RvY29sXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgLy8gIzY0IGR5bmFtaWMgZ2V0IHByb3h5IHZhbHVlXHJcbiAgcmVxdWVzdDxULCBVIGV4dGVuZHMgKFxyXG4gICAgSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBJT2xkUmVxT3B0aW9ucyA/IElPbGRSZXFPcHRpb25zIDogSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBBeGlvc1JlcXVlc3RDb25maWcgPyBBeGlvc1JlcXVlc3RDb25maWcgOiBuZXZlclxyXG4gICk+IChvcHRpb25zOiBVKTogUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+IHtcclxuICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IHRoaXMuaGFuZGxlUHJveHkoKVxyXG4gICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5tYXhCb2R5TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIHRoaXMub3B0aW9ucy5tYXhDb250ZW50TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkgJiYgb3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XHJcbiAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5wcm94eS5ob3N0LFxyXG4gICAgICAgICAgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaHR0cHNBZ2VudCA9IGh0dHBzQWdlbnRcclxuICAgIH1cclxuICAgIC8vICFOT1RJQ0UgdGhpcy5vcHRpb25zICE9PSBvcHRpb25zXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBheGlvcy5jcmVhdGUodGhpcy5vcHRpb25zKVxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShyZXNwb25zZUludGVyY2VwdG9yLCByZXNwb25zZUVycm9ySGFuZGxlcilcclxuXHJcbiAgICAvLyBjb21wYXRpYmxlIHdpdGggb2xkIHJlcXVlc3Qgb3B0aW9ucyB0byBuZXcgb3B0aW9uc1xyXG4gICAgY29uc3Qgb3B0ID0gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnMpXHJcblxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgLy8gaGFuZGxlIENvbnRlbnQtVHlwZVxyXG4gICAgICBsZXQgY29udGVudFR5cGUgPSAnJ1xyXG4gICAgICBpZiAob2JqPy5oZWFkZXJzPy5jb250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuY29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5Db250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuQ29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5bJ2NvbnRlbnQtdHlwZSddKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ10gYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gJycgJiYgb2JqLmhlYWRlcnMpIHtcclxuICAgICAgICBvYmouaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50VHlwZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmpcclxuICAgIH0pXHJcbiAgICBpZiAoJ3Jlc29sdmVXaXRoRnVsbFJlc3BvbnNlJyBpbiBvcHRpb25zICYmIG9wdGlvbnMucmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UpIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gdXNlIG9sZCByZXF1ZXN0IG9wdGlvbiBmb3JtYXRcclxuICAgICAgICBpZiAob3B0Ll9faXNPbGRPcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoJ2pzb24nIGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgIH1cclxuICAgICAgfSkgYXMgUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0XHJcbiIsImltcG9ydCB7IElDb25maWcsIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBKU09OU3RvcmUgfSBmcm9tICdAcGljZ28vc3RvcmUnXHJcbmltcG9ydCB7IElKU09OIH0gZnJvbSAnQHBpY2dvL3N0b3JlL2Rpc3QvdHlwZXMnXHJcblxyXG5jbGFzcyBEQiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEpTT05TdG9yZVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZGIgPSBuZXcgSlNPTlN0b3JlKHRoaXMuY3R4LmNvbmZpZ1BhdGgpXHJcblxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljQmVkJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljQmVkJywge1xyXG4gICAgICAgICAgdXBsb2FkZXI6ICdzbW1zJyxcclxuICAgICAgICAgIGN1cnJlbnQ6ICdzbW1zJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljZ29QbHVnaW5zJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljZ29QbHVnaW5zJywge30pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZCAoZmx1c2g/OiBib29sZWFuKTogSUpTT04ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGIucmVhZChmbHVzaClcclxuICB9XHJcblxyXG4gIGdldCAoa2V5OiBzdHJpbmcgPSAnJyk6IGFueSB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLmdldChrZXkpXHJcbiAgfVxyXG5cclxuICBzZXQgKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgaGFzIChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5oYXMoa2V5KVxyXG4gIH1cclxuXHJcbiAgdW5zZXQgKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLnVuc2V0KGtleSwgdmFsdWUpXHJcbiAgfVxyXG5cclxuICBzYXZlQ29uZmlnIChjb25maWc6IFBhcnRpYWw8SUNvbmZpZz4pOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb25maWcgKGNvbmZpZzogSUNvbmZpZyk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy51bnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgREJcclxuXHJcbi8vIGNvbnN0IGluaXRDb25maWcgPSAoY29uZmlnUGF0aDogc3RyaW5nKTogbG93ZGIuTG93ZGJTeW5jPGFueT4gPT4ge1xyXG4vLyB9XHJcblxyXG4vLyBjb25zdCBzYXZlQ29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZywgY29uZmlnOiBhbnkpOiB2b2lkID0+IHtcclxuLy8gICBjb25zdCBkYiA9IGluaXRDb25maWcoY29uZmlnUGF0aClcclxuLy8gICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4vLyAgICAgZGIucmVhZCgpLnNldChuYW1lLCBjb25maWdbbmFtZV0pLndyaXRlKClcclxuLy8gICB9KVxyXG4vLyB9XHJcblxyXG4vLyBleHBvcnQge1xyXG4vLyBpbml0Q29uZmlnLFxyXG4vLyBzYXZlQ29uZmlnXHJcbi8vIH1cclxuIiwiaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJ1xyXG5pbXBvcnQge1xyXG4gIElSZXN1bHQsXHJcbiAgSVByb2Nlc3NFbnYsXHJcbiAgSVBsdWdpblByb2Nlc3NSZXN1bHQsXHJcbiAgSVBsdWdpbkhhbmRsZXIsXHJcbiAgSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxyXG4gIFVuZGVmaW5hYmxlLFxyXG4gIElQaWNHbyxcclxuICBJUGx1Z2luSGFuZGxlclJlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUsIGdldE5vcm1hbFBsdWdpbk5hbWUgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vaTE4bi96aC1DTidcclxuXHJcbmV4cG9ydCBjbGFzcyBQbHVnaW5IYW5kbGVyIGltcGxlbWVudHMgSVBsdWdpbkhhbmRsZXIge1xyXG4gIC8vIFRoYW5rcyB0byBmZWZsb3cgLT4gaHR0cHM6Ly9naXRodWIuY29tL2ZlZmxvdy9mZWZsb3cvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL2luc3RhbGwvcGx1Z2luLmpzXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIGFzeW5jIGluc3RhbGwgKHBsdWdpbnM6IHN0cmluZ1tdLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52PzogSVByb2Nlc3NFbnYpOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XHJcbiAgICBjb25zdCBpbnN0YWxsZWRQbHVnaW5zOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnNcclxuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAvLyBkZXRlY3QgaWYgaGFzIGFscmVhZHkgaW5zdGFsbGVkXHJcbiAgICAgICAgLy8gb3Igd2lsbCBjYXVzZSBlcnJvclxyXG4gICAgICAgIGlmICh0aGlzLmN0eC5wbHVnaW5Mb2FkZXIuaGFzUGx1Z2luKGl0ZW0ucGtnTmFtZSkpIHtcclxuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChpdGVtLnBrZ05hbWUpXHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2VzcyhgUGljR28gaGFzIGFscmVhZHkgaW5zdGFsbGVkICR7aXRlbS5wa2dOYW1lfWApXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgc29tZXRoaW5nIHdyb25nLCBmaWx0ZXIgaXQgb3V0XHJcbiAgICAgICAgaWYgKCFpdGVtLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgY29uc3QgZnVsbE5hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5mdWxsTmFtZSlcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKGZ1bGxOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIGluc3RhbGwgcGx1Z2lucyBtdXN0IHVzZSBmdWxsTmFtZUxpc3Q6XHJcbiAgICAgIC8vIDEuIGluc3RhbGwgcmVtb3RlIHBhY2FnZVxyXG4gICAgICAvLyAyLiBpbnN0YWxsIGxvY2FsIHBhY2FnZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKCdpbnN0YWxsJywgZnVsbE5hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXHJcbiAgICAgIGlmICghcmVzdWx0LmNvZGUpIHtcclxuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXHJcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxlZFBsdWdpbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1bmluc3RhbGwgKHBsdWdpbnM6IHN0cmluZ1tdKTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdW5pbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1bmluc3RhbGwgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndW5pbnN0YWxsJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIpXHJcbiAgICAgIGlmICghcmVzdWx0LmNvZGUpIHtcclxuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci51bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbk5hbWUpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VuaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXHJcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCcpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ3VuaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUgKHBsdWdpbnM6IHN0cmluZ1tdLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52PzogSVByb2Nlc3NFbnYpOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XHJcbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnMubWFwKChpdGVtOiBzdHJpbmcpID0+IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzKHRoaXMuY3R4LCBpdGVtKSkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdWNjZXNzKVxyXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoaXRlbSA9PiBpdGVtLnBrZ05hbWUpXHJcbiAgICBpZiAocGtnTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB1cGRhdGUgcGx1Z2lucyBtdXN0IHVzZSBwa2dOYW1lTGlzdDpcclxuICAgICAgLy8gbnBtIHVwZGF0ZSB3aWxsIHVzZSB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKCd1cGRhdGUnLCBwa2dOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1cGRhdGVTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1cGRhdGVGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjQ29tbWFuZCAoY21kOiBzdHJpbmcsIG1vZHVsZXM6IHN0cmluZ1tdLCB3aGVyZTogc3RyaW5nLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52OiBJUHJvY2Vzc0VudiA9IHt9KTogUHJvbWlzZTxJUmVzdWx0PiB7XHJcbiAgICAvLyBvcHRpb25zIGZpcnN0XHJcbiAgICBjb25zdCByZWdpc3RyeSA9IG9wdGlvbnMucmVnaXN0cnkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5yZWdpc3RyeScpXHJcbiAgICBjb25zdCBwcm94eSA9IG9wdGlvbnMucHJveHkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5wcm94eScpXHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgICBsZXQgYXJncyA9IFtjbWRdLmNvbmNhdChtb2R1bGVzKS5jb25jYXQoJy0tY29sb3I9YWx3YXlzJykuY29uY2F0KCctLXNhdmUnKVxyXG4gICAgICBpZiAocmVnaXN0cnkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcmVnaXN0cnk9JHtyZWdpc3RyeX1gKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm94eSkge1xyXG4gICAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChgLS1wcm94eT0ke3Byb3h5fWApXHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBucG0gPSBzcGF3bignbnBtJywgYXJncywgeyBjd2Q6IHdoZXJlLCBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBlbnYpIH0pXHJcblxyXG4gICAgICAgIGxldCBvdXRwdXQgPSAnJ1xyXG4gICAgICAgIG5wbS5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgb3V0cHV0ICs9IGRhdGFcclxuICAgICAgICB9KS5waXBlKHByb2Nlc3Muc3Rkb3V0KVxyXG5cclxuICAgICAgICBucG0uc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZGVycilcclxuXHJcbiAgICAgICAgbnBtLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghY29kZSkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHsgY29kZTogMCwgZGF0YTogb3V0cHV0IH0pXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXNvbHZlKHsgY29kZTogY29kZSwgZGF0YTogb3V0cHV0IH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAvLyBmb3IgdXNlcnMgd2hvIGhhdmVuJ3QgaW5zdGFsbGVkIG5vZGUuanNcclxuICAgICAgICBucG0ub24oJ2Vycm9yJywgKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoJ05QTSBpcyBub3QgaW5zdGFsbGVkJylcclxuICAgICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlIGFzIEVycm9yKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogdHJhbnNmb3JtIHRoZSBpbnB1dCBwbHVnaW4gbmFtZSBvciBwYXRoIHN0cmluZyB0byB2YWxpZCByZXN1bHRcclxuICogQHBhcmFtIGN0eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKi9cclxuY29uc3QgaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3MgPSAoY3R4OiBJUGljR28sIG5hbWVPclBhdGg6IHN0cmluZyk6IElQbHVnaW5Qcm9jZXNzUmVzdWx0ID0+IHtcclxuICBjb25zdCByZXMgPSB7XHJcbiAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgIGZ1bGxOYW1lOiAnJyxcclxuICAgIHBrZ05hbWU6ICcnXHJcbiAgfVxyXG4gIGNvbnN0IHJlc3VsdCA9IGdldFByb2Nlc3NQbHVnaW5OYW1lKG5hbWVPclBhdGgsIGN0eC5sb2cpXHJcbiAgaWYgKCFyZXN1bHQpIHtcclxuICAgIHJldHVybiByZXNcclxuICB9XHJcbiAgLy8gZmlyc3QgZ2V0IHJlc3VsdCB0aGVuIGRvIHRoaXMgcHJvY2Vzc1xyXG4gIC8vIG9yIHNvbWUgZXJyb3Igd2lsbCBsb2cgdHdpY2VcclxuICBjb25zdCBwa2dOYW1lID0gZ2V0Tm9ybWFsUGx1Z2luTmFtZShyZXN1bHQsIGN0eC5sb2cpXHJcbiAgaWYgKCFwa2dOYW1lKSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgZnVsbE5hbWU6IHJlc3VsdCxcclxuICAgIHBrZ05hbWVcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBsdWdpbkhhbmRsZXJcclxuIiwiaW1wb3J0IHsgWkhfQ04sIElMb2NhbGVzS2V5LCBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xyXG5cclxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gJ0BwaWNnby9pMThuJ1xyXG5pbXBvcnQgeyBJU3RyaW5nS2V5TWFwLCBJSTE4bk1hbmFnZXIgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcclxuaW1wb3J0IHsgSUxvY2FsZSB9IGZyb20gJ0BwaWNnby9pMThuL2Rpc3QvdHlwZXMnXHJcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbidcclxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tICcuL3poLVRXJ1xyXG5cclxuY29uc3QgbGFuZ3VhZ2VMaXN0OiBJU3RyaW5nS2V5TWFwPElTdHJpbmdLZXlNYXA8c3RyaW5nPj4gPSB7XHJcbiAgJ3poLUNOJzogWkhfQ04sXHJcbiAgJ3poLVRXJzogWkhfVFcsXHJcbiAgZW46IEVOXHJcbn1cclxuXHJcbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGkxOG46IEkxOG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdEFkYXB0ZXI6IE9iamVjdEFkYXB0ZXJcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyID0gbmV3IE9iamVjdEFkYXB0ZXIobGFuZ3VhZ2VMaXN0KVxyXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3NldHRpbmdzLmxhbmd1YWdlJykgfHwgJ3poLUNOJ1xyXG4gICAgaWYgKCFsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdKSB7XHJcbiAgICAgIGxhbmd1YWdlID0gJ3poLUNOJyAvLyB1c2UgZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgdGhpcy5pMThuID0gbmV3IEkxOG4oe1xyXG4gICAgICBhZGFwdGVyOiB0aGlzLm9iamVjdEFkYXB0ZXIsXHJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4gKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGkxOG5Gb2xkZXIsIHtcclxuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxyXG4gICAgfSlcclxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUubmFtZS5lbmRzV2l0aCgnLnltbCcpKSB7XHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGVQYXRoID0gcGF0aC5qb2luKGkxOG5Gb2xkZXIsIGZpbGUubmFtZSlcclxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsICd1dGY4JylcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgaTE4bkZpbGVPYmogPSB5YW1sLmxvYWQoaTE4bkZpbGUpIGFzIElMb2NhbGVzXHJcbiAgICAgICAgICBsYW5ndWFnZUxpc3RbZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnltbCQvLCAnJyldID0gaTE4bkZpbGVPYmpcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyICgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnaTE4bi1jbGknKVxyXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xyXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGkxOG5Gb2xkZXIpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTE4bkZvbGRlclxyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmkxOG4udHJhbnNsYXRlKGtleSwgYXJncykgfHwga2V5XHJcbiAgfVxyXG5cclxuICBzZXRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pMThuLnNldExhbmd1YWdlKGxhbmd1YWdlKVxyXG4gICAgdGhpcy5jdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdzZXR0aW5ncy5sYW5ndWFnZSc6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkTG9jYWxlIChsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5Mb2NhbGVzID0gdGhpcy5vYmplY3RBZGFwdGVyLmdldExvY2FsZShsYW5ndWFnZSlcclxuICAgIGlmICghb3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0xvY2FsZXMgPSBtZXJnZShvcmlnaW5Mb2NhbGVzLCBsb2NhbGVzKVxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBhZGRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAob3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIGxvY2FsZXMpXHJcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGdldExhbmd1YWdlTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlTGlzdClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgSTE4bk1hbmFnZXJcclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX0NOID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICfkuIrkvKDlpLHotKUnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAn6K+35qOA5p+l5L2g55qE6YWN572u6aG55piv5ZCm5q2j56GuJyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ+ivt+ajgOafpeS9oOeahOmFjee9rumhueS7peWPiue9kee7nCcsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICfplJnor6/noIHvvJoke2NvZGV977yM6K+35omT5byA5rWP6KeI5Zmo57KY6LS05Zyw5Z2A5p+l55yL55u45YWz5Y6f5ZugJyxcclxuICBTRVJWRVJfRVJST1I6ICfmnI3liqHnq6/lh7rplJnvvIzor7fph43or5UnLFxyXG4gIEFVVEhfRkFJTEVEOiAn6K6k6K+B5aSx6LSlJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAn6K6+5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICflpIfnlKjkuIrkvKDln5/lkI0nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ+S+i+WmgiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ+mYv+mHjOS6kU9TUycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAn6K6+5a6aS2V5SWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6ICforr7lrppLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJpvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICfohb7orq/kupFDT1MnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogJ0NPU+eJiOacrCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogJ+iuvuWumlNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ+iuvuWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ+iuvuWumkFwcElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogJ+S+i+Wmgu+8mjEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAn6K6+5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ+iuvuWumuS7k+W6k+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ+iuvuWumuWIhuaUr+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAn5qC85byP77yadXNlcm5hbWUvcmVwbycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSDogJ+S+i+Wmgu+8mm1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gcWluaXVcclxuICBQSUNCRURfUUlOSVU6ICfkuIPniZvkupEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICforr7lrppBY2Nlc3NLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6ICforr7lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAn6K6+5a6a6K6/6Zeu572R5Z2AJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mnowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlc2xpbScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ+iuvuWumkNsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICforr7lrprku6PnkIYnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAn5L6L5aaC77yaaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICflj4jmi43kupEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ+iuvuWumuaTjeS9nOWRmCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAn6K6+5a6a5pON5L2c5ZGY5a+G56CBJyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ+iuvuWumuWKoOmAn+Wfn+WQjScsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAn6L6T5YWl5pON5L2c5ZGY5a+G56CBJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcblxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWuieijheaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEOiAn5o+S5Lu25a6J6KOF5aSx6LSlJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25a6J6KOF5aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICfmj5Lku7blronoo4XlpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI3miJblkIjms5Xlronoo4Xot6/lvoQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWNuOi9veaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7bljbjovb3lpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWNuOi9veWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25Y246L295aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1M6ICfmj5Lku7bmm7TmlrDmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEOiAn5o+S5Lu25pu05paw5aSx6LSlJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bmm7TmlrDlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuabtOaWsOWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjSdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSUxvY2FsZXNLZXkgPSBrZXlvZiB0eXBlb2YgWkhfQ05cclxuZXhwb3J0IHR5cGUgSUxvY2FsZXMgPSB0eXBlb2YgWkhfQ05cclxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBaSF9UVzogSUxvY2FsZXMgPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ+S4iuWCs+WkseaVlycsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICfoq4vmqqLmn6XkvaDnmoToqK3lrprmmK/lkKbmraPnoronLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAn6KuL5qqi5p+l5L2g55qE6Kit5a6a5Y+K57ay6LevJyxcclxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogJ+mMr+iqpOeivO+8miR7Y29kZX3vvIzoq4vmiZPplovngI/opr3lmajosrzkuIrlnLDlnYDmn6XnnIvnm7jpl5zljp/lm6AnLFxyXG4gIFNFUlZFUl9FUlJPUjogJ+S8uuacjeWZqOWHuumMr++8jOiri+mHjeippicsXHJcbiAgQVVUSF9GQUlMRUQ6ICfoqo3orYnlpLHmlZcnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICfoqK3lrppUb2tlbicsXHJcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogJ+WCmeeUqOS4iuWCs+e2suWdgCcsXHJcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiAn5L6L5aaCIHNtbXMuYXBwJyxcclxuXHJcbiAgLy8gQWxpLWNsb3VkXHJcbiAgUElDQkVEX0FMSUNMT1VEOiAn6Zi/6YeM5LqRT1NTJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6ICfoqK3lrppLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ+ioreWumktleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBUZW5jZW50LWNsb3VkXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogJ+mosOioiuS6kUNPUycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ09T54mI5pysJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAn6Kit5a6aU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAn6Kit5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiAn6Kit5a6aQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAn5L6L5aaC77yaMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJphcC1iZWlqaW5nJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VNb2dyMicsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICfoqK3lrppUb2tlbicsXHJcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiAn6Kit5a6a5YCJ5bqr5ZCN56ixJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiAn6Kit5a6a5YiG5pSv5ZCN56ixJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86ICfmoLzlvI/vvJp1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAn5L6L5aaC77yabWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ+S4g+eJm+S6kScsXHJcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogJ+ioreWumkFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ+ioreWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1FJTklVX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICfoqK3lrproqKrllY/ntrLlnYAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaejAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAn6Kit5a6aQ2xpZW50SWQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ+ioreWumlBST1hZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICfoqK3lrprmk43kvZzlk6EnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+ioreWumuaTjeS9nOWToeWvhueivCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICfoqK3lrprliqDpgJ/ntrLlnYAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ+i8uOWFpeaTjeS9nOWToeWvhueivCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8miFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7blronoo53miJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWuieijneWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWuieijneWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAn5o+S5Lu25a6J6KOd5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ix5oiW5q2j56K655qE5a6J6KOd6Lev5b6RJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7bljbjovInmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAn5o+S5Lu25Y246LyJ5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bljbjovInlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuWNuOi8ieWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAn5o+S5Lu25pu05paw5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ+aPkuS7tuabtOaWsOWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAn5o+S5Lu25pu05paw5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLEnXHJcbn1cclxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBFTjogSUxvY2FsZXMgPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ1VwbG9hZCBmYWlsZWQnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MnLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MgYW5kIG5ldHdvcmsnLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAnRXJyb3IgY29kZTogJHtjb2RlfSwgcGxlYXNlIG9wZW4gdGhlIGJyb3dzZXIgYW5kIHBhc3RlIHRoZSBhZGRyZXNzIHRvIHNlZSB0aGUgcmVhc29uJyxcclxuICBTRVJWRVJfRVJST1I6ICdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInLFxyXG4gIEFVVEhfRkFJTEVEOiAnQXV0aGVudGljYXRpb24gZmFpbGVkJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAnU2V0IEJhY2t1cCBVcGxvYWQgRG9tYWluJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICdFeC4gc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICdBbGkgQ2xvdWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ1NldCBLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ1NldCBLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gb3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAnVGVuY2VudCBDbG91ZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ2hvb3NlIENPUyB2ZXJzaW9uJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAnU2V0IFNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICdTZXQgQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAnRXguIDEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAnRXguIGFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHA6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICdTZXQgUmVwbyBOYW1lJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICdTZXQgQnJhbmNoJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ0V4LiB1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAnRXguIG1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ1Fpbml1JyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAnU2V0IEFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAnU2V0IFVSTCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ0V4LiB6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICdFeC4gaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ1NldCBDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAnU2V0IFByb3h5JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ0V4LiBodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ1VweXVuJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAnU2V0IE9wZXJhdG9yJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICdTZXQgT3BlcmF0b3IgUGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ0V4LiBtZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICdQbGVhc2UgdHlwZSB0aGUgb3BlcmF0b3IgcGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ0V4LiBodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAnRXguICFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuXHJcbiAgLy8gUGx1Z2luIEhhbmRsZXJcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiAnUGx1Z2luIGluc3RhbGxlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSBvciB2YWxpZCBpbnN0YWxsYXRpb24gcGF0aCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiAnUGx1Z2luIHVuaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQ6ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAnUGx1Z2luIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lJ1xyXG59XHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnXHJcbmltcG9ydCBDb21tYW5kZXIgZnJvbSAnLi4vbGliL0NvbW1hbmRlcidcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbGliL0xvZ2dlcidcclxuaW1wb3J0IExpZmVjeWNsZSBmcm9tICcuL0xpZmVjeWNsZSdcclxuaW1wb3J0IExpZmVjeWNsZVBsdWdpbnMsIHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuLi9saWIvTGlmZWN5Y2xlUGx1Z2lucydcclxuaW1wb3J0IHVwbG9hZGVycyBmcm9tICcuLi9wbHVnaW5zL3VwbG9hZGVyJ1xyXG5pbXBvcnQgdHJhbnNmb3JtZXJzIGZyb20gJy4uL3BsdWdpbnMvdHJhbnNmb3JtZXInXHJcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSAnLi4vbGliL1BsdWdpbkxvYWRlcidcclxuaW1wb3J0IHsgZ2V0LCBzZXQsIHVuc2V0IH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyBJSGVscGVyLCBJSW1nSW5mbywgSUNvbmZpZywgSVBpY0dvLCBJU3RyaW5nS2V5TWFwLCBJUGx1Z2luTG9hZGVyLCBJSTE4bk1hbmFnZXIsIElQaWNHb1BsdWdpbiwgSVBpY0dvUGx1Z2luSW50ZXJmYWNlLCBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgZ2V0Q2xpcGJvYXJkSW1hZ2UgZnJvbSAnLi4vdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UnXHJcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL2xpYi9SZXF1ZXN0J1xyXG5pbXBvcnQgREIgZnJvbSAnLi4vdXRpbHMvZGInXHJcbmltcG9ydCBQbHVnaW5IYW5kbGVyIGZyb20gJy4uL2xpYi9QbHVnaW5IYW5kbGVyJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50LCBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBpc0NvbmZpZ0tleUluQmxhY2tMaXN0LCBpc0lucHV0Q29uZmlnVmFsaWQgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IEkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vaTE4bidcclxuXHJcbmV4cG9ydCBjbGFzcyBQaWNHbyBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIElQaWNHbyB7XHJcbiAgcHJpdmF0ZSBfY29uZmlnITogSUNvbmZpZ1xyXG4gIHByaXZhdGUgbGlmZWN5Y2xlITogTGlmZWN5Y2xlXHJcbiAgcHJpdmF0ZSBkYiE6IERCXHJcbiAgcHJpdmF0ZSBfcGx1Z2luTG9hZGVyITogUGx1Z2luTG9hZGVyXHJcbiAgY29uZmlnUGF0aDogc3RyaW5nXHJcbiAgYmFzZURpciE6IHN0cmluZ1xyXG4gIGhlbHBlciE6IElIZWxwZXJcclxuICBsb2c6IExvZ2dlclxyXG4gIGNtZDogQ29tbWFuZGVyXHJcbiAgb3V0cHV0OiBJSW1nSW5mb1tdXHJcbiAgaW5wdXQ6IGFueVtdXHJcbiAgcGx1Z2luSGFuZGxlcjogUGx1Z2luSGFuZGxlclxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MS41LjArXHJcbiAgICpcclxuICAgKiB1c2UgcmVxdWVzdCBpbnN0ZWFkXHJcbiAgICovXHJcbiAgUmVxdWVzdCE6IFJlcXVlc3RcclxuICBpMThuITogSUkxOG5NYW5hZ2VyXHJcbiAgVkVSU0lPTjogc3RyaW5nID0gcHJvY2Vzcy5lbnYuUElDR09fVkVSU0lPTlxyXG4gIEdVSV9WRVJTSU9OPzogc3RyaW5nXHJcblxyXG4gIGdldCBwbHVnaW5Mb2FkZXIgKCk6IElQbHVnaW5Mb2FkZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbkxvYWRlclxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IgKGNvbmZpZ1BhdGg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXHJcbiAgICB0aGlzLm91dHB1dCA9IFtdXHJcbiAgICB0aGlzLmlucHV0ID0gW11cclxuICAgIHRoaXMuaGVscGVyID0ge1xyXG4gICAgICB0cmFuc2Zvcm1lcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ3RyYW5zZm9ybWVyJyksXHJcbiAgICAgIHVwbG9hZGVyOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygndXBsb2FkZXInKSxcclxuICAgICAgYmVmb3JlVHJhbnNmb3JtUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2JlZm9yZVRyYW5zZm9ybVBsdWdpbnMnKSxcclxuICAgICAgYmVmb3JlVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2JlZm9yZVVwbG9hZFBsdWdpbnMnKSxcclxuICAgICAgYWZ0ZXJVcGxvYWRQbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYWZ0ZXJVcGxvYWRQbHVnaW5zJylcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdENvbmZpZ1BhdGgoKVxyXG4gICAgdGhpcy5sb2cgPSBuZXcgTG9nZ2VyKHRoaXMpXHJcbiAgICB0aGlzLmNtZCA9IG5ldyBDb21tYW5kZXIodGhpcylcclxuICAgIHRoaXMucGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKHRoaXMpXHJcbiAgICB0aGlzLmluaXRDb25maWcoKVxyXG4gICAgdGhpcy5pbml0KClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENvbmZpZ1BhdGggKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5jb25maWdQYXRoID0gaG9tZWRpcigpICsgJy8ucGljbGlzdC9jb25maWcuanNvbidcclxuICAgIH1cclxuICAgIGlmIChwYXRoLmV4dG5hbWUodGhpcy5jb25maWdQYXRoKS50b1VwcGVyQ2FzZSgpICE9PSAnLkpTT04nKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnUGF0aCA9ICcnXHJcbiAgICAgIHRocm93IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuJylcclxuICAgIH1cclxuICAgIHRoaXMuYmFzZURpciA9IHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ1BhdGgpXHJcbiAgICBjb25zdCBleGlzdCA9IGZzLnBhdGhFeGlzdHNTeW5jKHRoaXMuY29uZmlnUGF0aClcclxuICAgIGlmICghZXhpc3QpIHtcclxuICAgICAgZnMuZW5zdXJlRmlsZVN5bmMoYCR7dGhpcy5jb25maWdQYXRofWApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb25maWcgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYiA9IG5ldyBEQih0aGlzKVxyXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5kYi5yZWFkKHRydWUpIGFzIElDb25maWdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBpbml0IDE4biBhdCBmaXJzdFxyXG4gICAgICB0aGlzLmkxOG4gPSBuZXcgSTE4bk1hbmFnZXIodGhpcylcclxuICAgICAgdGhpcy5SZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcylcclxuICAgICAgdGhpcy5fcGx1Z2luTG9hZGVyID0gbmV3IFBsdWdpbkxvYWRlcih0aGlzKVxyXG4gICAgICAvLyBsb2FkIHNlbGYgcGx1Z2luc1xyXG4gICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZSgncGljZ28nKVxyXG4gICAgICB1cGxvYWRlcnModGhpcykucmVnaXN0ZXIodGhpcylcclxuICAgICAgdHJhbnNmb3JtZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXHJcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKCcnKVxyXG4gICAgICAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgdGhpcy5fcGx1Z2luTG9hZGVyLmxvYWQoKVxyXG4gICAgICB0aGlzLmxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGUodGhpcylcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICB0aGlzLmxvZy5lcnJvcihlKVxyXG4gICAgICB0aHJvdyBlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBlYXNpbHkgbWFubnVhbGx5IGxvYWQgYSBwbHVnaW5cclxuICAgKiBpZiBwcm92aWRlIHBsdWdpbiBuYW1lLCB3aWxsIHJlZ2lzdGVyIHBsdWdpbiBieSBuYW1lXHJcbiAgICogb3IganVzdCBpbnN0YW50aWF0ZSBhIHBsdWdpblxyXG4gICAqL1xyXG4gIHVzZSAocGx1Z2luOiBJUGljR29QbHVnaW4sIG5hbWU/OiBzdHJpbmcpOiBJUGljR29QbHVnaW5JbnRlcmZhY2Uge1xyXG4gICAgaWYgKG5hbWUpIHtcclxuICAgICAgdGhpcy5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKVxyXG4gICAgICByZXR1cm4gdGhpcy5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpIVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwbHVnaW4odGhpcylcclxuICAgICAgcmV0dXJuIHBsdWdpbkluc3RhbmNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckNvbW1hbmRzICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY21kLmluaXQoKVxyXG4gICAgICB0aGlzLmNtZC5sb2FkQ29tbWFuZHMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Q29uZmlnPFQ+IChuYW1lPzogc3RyaW5nKTogVCB7XHJcbiAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZyBhcyB1bmtub3duIGFzIFRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBnZXQodGhpcy5fY29uZmlnLCBuYW1lKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBJU3RyaW5nS2V5TWFwPGFueT4pOiB2b2lkIHtcclxuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcclxuICAgICAgdGhpcy5sb2cud2FybigndGhlIGZvcm1hdCBvZiBjb25maWcgaXMgaW52YWxpZCwgcGxlYXNlIHByb3ZpZGUgb2JqZWN0JylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNldENvbmZpZyhjb25maWcpXHJcbiAgICB0aGlzLmRiLnNhdmVDb25maWcoY29uZmlnKVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFrZXkgfHwgIXByb3BOYW1lKSByZXR1cm5cclxuICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KGtleSkpIHtcclxuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgcmVtb3ZlZGApXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy51bnNldENvbmZpZyhrZXksIHByb3BOYW1lKVxyXG4gICAgdGhpcy5kYi51bnNldChrZXksIHByb3BOYW1lKVxyXG4gIH1cclxuXHJcbiAgc2V0Q29uZmlnIChjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0lucHV0Q29uZmlnVmFsaWQoY29uZmlnKSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKCd0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3QnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KG5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke25hbWV9IGNhbid0IGJlIG1vZGlmaWVkYClcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXHJcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1tuYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIHNldCh0aGlzLl9jb25maWcsIG5hbWUsIGNvbmZpZ1tuYW1lXSlcclxuICAgICAgZXZlbnRCdXMuZW1pdChJQnVzRXZlbnQuQ09ORklHX0NIQU5HRSwge1xyXG4gICAgICAgIGNvbmZpZ05hbWU6IG5hbWUsXHJcbiAgICAgICAgdmFsdWU6IGNvbmZpZ1tuYW1lXVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHVuc2V0Q29uZmlnIChrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFrZXkgfHwgIXByb3BOYW1lKSByZXR1cm5cclxuICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KGtleSkpIHtcclxuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgdW5zZXRgKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHVuc2V0KHRoaXMuZ2V0Q29uZmlnKGtleSksIHByb3BOYW1lKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHJlcXVlc3QgKCk6IElSZXF1ZXN0WydyZXF1ZXN0J10ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVxdWVzdC5yZXF1ZXN0LmJpbmQodGhpcy5SZXF1ZXN0KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBsb2FkIChpbnB1dD86IGFueVtdKTogUHJvbWlzZTxJSW1nSW5mb1tdIHwgRXJyb3I+IHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggPT09ICcnKSB7XHJcbiAgICAgIHRoaXMubG9nLmVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuJylcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9XHJcbiAgICAvLyB1cGxvYWQgZnJvbSBjbGlwYm9hcmRcclxuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkIHx8IGlucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHsgaW1nUGF0aCwgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIH0gPSBhd2FpdCBnZXRDbGlwYm9hcmRJbWFnZSh0aGlzKVxyXG4gICAgICAgIGlmIChpbWdQYXRoID09PSAnbm8gaW1hZ2UnKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ltYWdlIG5vdCBmb3VuZCBpbiBjbGlwYm9hcmQnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uY2UoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAvLyDliKDpmaQgcGljZ28g55Sf5oiQ55qE5Zu+54mH5paH5Lu277yM5L6L5aaCIGB+Ly5waWNnby8yMDIwMDYyMTIwNTcyMC5wbmdgXHJcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7IHRoaXMubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLm9uY2UoJ2ZpbmlzaGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEtlZXBBZnRlclVwbG9hZGluZykge1xyXG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4geyB0aGlzLmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KFtpbWdQYXRoXSlcclxuICAgICAgICAgIHJldHVybiBvdXRwdXRcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB1cGxvYWQgZnJvbSBwYXRoXHJcbiAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCB0aGlzLmxpZmVjeWNsZS5zdGFydChpbnB1dClcclxuICAgICAgcmV0dXJuIG91dHB1dFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgSW1nRnJvbVBhdGggZnJvbSAnLi9wYXRoJ1xyXG5pbXBvcnQgSW1nRnJvbUJhc2U2NCBmcm9tICcuL2Jhc2U2NCdcclxuXHJcbmNvbnN0IGJ1aWxkSW5UcmFuc2Zvcm1lcnM6IElQaWNHb1BsdWdpbiA9ICgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcmVnaXN0ZXIgKGN0eDogSVBpY0dvKSB7XHJcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoJ3BhdGgnLCBJbWdGcm9tUGF0aClcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcignYmFzZTY0JywgSW1nRnJvbUJhc2U2NClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5UcmFuc2Zvcm1lcnNcclxuIl0sIm5hbWVzIjpbInBsdWdpbkhhbmRsZXIiLCJoYW5kbGUiLCJjdHgiLCJjbWQiLCJwcm9ncmFtIiwiY29tbWFuZCIsImRlc2NyaXB0aW9uIiwiYWxpYXMiLCJvcHRpb24iLCJhY3Rpb24iLCJwbHVnaW5zIiwicHJveHkiLCJyZWdpc3RyeSIsIm9wdGlvbnMiLCJpbnN0YWxsIiwiY2F0Y2giLCJlIiwibG9nIiwiZXJyb3IiLCJ1bmluc3RhbGwiLCJ1cGRhdGUiLCJjb25maWciLCJpc1VybCIsInVybCIsInN0YXJ0c1dpdGgiLCJoYW5kbGVVcmxFbmNvZGUiLCJkZWNvZGVVUkkiLCJpc1VybEVuY29kZSIsImVuY29kZVVSSSIsImdldEltYWdlU2l6ZSIsImZpbGUiLCJ3aWR0aCIsImhlaWdodCIsImltYWdlU2l6ZSIsInJlYWwiLCJnZXRQbHVnaW5OYW1lVHlwZSIsIm5hbWUiLCJ0ZXN0IiwiaXNTaW1wbGVOYW1lIiwibmFtZU9yUGF0aCIsInBhdGgiLCJpc0Fic29sdXRlIiwicGx1Z2luUGF0aCIsImpvaW4iLCJwcm9jZXNzIiwiY3dkIiwiZnMiLCJleGlzdHNTeW5jIiwiaW5jbHVkZXMiLCJoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUiLCJzY29wZSIsImhhbmRsZVVuaXhTdHlsZVBhdGgiLCJwYXRoU3RyIiwic3BsaXQiLCJzZXAiLCJyZW1vdmVQbHVnaW5WZXJzaW9uIiwicmVnIiwibWF0Y2hBcnIiLCJtYXRjaCIsImNvbnNvbGUiLCJ3YXJuIiwiY29uZmlnQmxhY2tMaXN0IiwiaXNDb25maWdLZXlJbkJsYWNrTGlzdCIsImtleSIsInNvbWUiLCJibGFja0l0ZW0iLCJpc0lucHV0Q29uZmlnVmFsaWQiLCJBcnJheSIsImlzQXJyYXkiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwidXBsb2FkIiwiYXJndW1lbnRzIiwiaW5wdXQiLCJpbnB1dExpc3QiLCJtYXAiLCJpdGVtIiwicmVzb2x2ZSIsImZpbHRlciIsImV4aXN0IiwiaGFuZGxlQ29uZmlnIiwiYXN5bmMiLCJwcm9tcHRzIiwibW9kdWxlIiwiYW5zd2VyIiwiaW5xdWlyZXIiLCJwcm9tcHQiLCJjb25maWdOYW1lIiwic2F2ZUNvbmZpZyIsInNldHRpbmciLCJoZWxwZXIiLCJnZXQiLCJ0eXBlIiwiY2hvaWNlcyIsImdldElkTGlzdCIsIm1lc3NhZ2UiLCJnZXRDb25maWciLCJwbHVnaW5Mb2FkZXIiLCJnZXRQbHVnaW4iLCJnZXRGdWxsTGlzdCIsInBsdWdpbiIsInVzZU1vZHVsZU5hbWUiLCJzdWNjZXNzIiwiaW5mbyIsImFyZ3YiLCJ1c2UiLCJ1cGxvYWRlciIsImRlZmF1bHQiLCJ0cmFuc2Zvcm1lciIsInB1c2giLCJwaWNnb1BsdWdpbnMiLCJzZXRDb25maWciLCJnZW5lcmF0ZSIsIm9wdHMiLCJnZXRPcHRpb25zIiwidG1wIiwic291cmNlIiwiYW5zd2VycyIsIl9maWxlcyIsImdsb2JieSIsImRvdCIsImdsb2IiLCJmaWx0ZXJzIiwiZm9yRWFjaCIsImZpbGVzIiwicmVuZGVyIiwid3JpdGVGaWxlVHJlZSIsImRlc3QiLCJjb21wbGV0ZSIsImNvbXBsZXRlTWVzc2FnZSIsImV4cCIsImRhdGEiLCJmbiIsIkZ1bmN0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsInRlbXBsYXRlUGF0aCIsIm9wdGlvbnNQYXRoIiwicmVxdWlyZSIsImZpbGVUcmVlIiwiZmlsZVBhdGgiLCJyZWFkRmlsZVN5bmMiLCJjb250ZW50IiwiZWpzIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJkaXIiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJydW4iLCJvZmZsaW5lIiwidGVtcGxhdGUiLCJoYXNTbGFzaCIsImRvd25sb2FkQW5kR2VuZXJhdGUiLCJybSIsInN5bmMiLCJkb3dubG9hZCIsImNsb25lIiwiZXJyIiwiaW5pdCIsInByb2plY3QiLCJpblBsYWNlIiwiaG9tZWRpciIsInJlcGxhY2UiLCJ0aGVuIiwib2siLCJvbiIsImNoYWxrIiwiZ3JheSIsImkxOG4iLCJsYW5nIiwibGlzdCIsImdldExhbmd1YWdlTGlzdCIsInNldExhbmd1YWdlIiwiTGlmZWN5Y2xlUGx1Z2lucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsIk1hcCIsInBsdWdpbklkTWFwIiwicmVnaXN0ZXIiLCJpZCIsIlR5cGVFcnJvciIsImhhcyIsInNldCIsImN1cnJlbnRQbHVnaW4iLCJ1bnJlZ2lzdGVyIiwicGx1Z2luTmFtZSIsInBsdWdpbkxpc3QiLCJkZWxldGUiLCJnZXROYW1lIiwiZ2V0TGlzdCIsInZhbHVlcyIsInNldEN1cnJlbnRQbHVnaW5OYW1lIiwiQ29tbWFuZGVyIiwiQ29tbWFuZCIsInZlcnNpb24iLCJkZWJ1ZyIsInNpbGVudCIsImFyZ3MiLCJleGl0IiwiY3VycmVudFBsdWdpbk5hbWUiLCJsb2FkQ29tbWFuZHMiLCJJTG9nVHlwZSIsIklCdWlsZEluRXZlbnQiLCJJQnVzRXZlbnQiLCJMb2dnZXIiLCJoYW5kbGVMb2ciLCJtc2ciLCJsb2dIZWFkZXIiLCJsZXZlbCIsInRvVXBwZXJDYXNlIiwibG9nTGV2ZWwiLCJsb2dQYXRoIiwiYmFzZURpciIsInNldFRpbWVvdXQiLCJyZXN1bHQiLCJjaGVja0xvZ0ZpbGVJc0xhcmdlIiwiaXNMYXJnZSIsIndhcm5pbmdNc2ciLCJ5ZWxsb3ciLCJyZWNyZWF0ZUxvZ0ZpbGUiLCJ1bnNoaWZ0IiwiaGFuZGxlV3JpdGVMb2ciLCJsb2dGaWxlU2l6ZSIsInN0YXRTeW5jIiwic2l6ZSIsImxvZ0ZpbGVTaXplTGltaXQiLCJudW0iLCJpc05hTiIsIk51bWJlciIsImZvcmNlTnVtYmVyIiwidW5saW5rU3luYyIsImNyZWF0ZUZpbGVTeW5jIiwiY2hlY2tMb2dMZXZlbCIsImRheWpzIiwiZm9ybWF0IiwiRXJyb3IiLCJ1dGlsIiwic3RhY2siLCJhcHBlbmRGaWxlU3luYyIsInVuZGVmaW5lZCIsImVudiIsIk5PREVfRU5WIiwiTGlmZWN5Y2xlIiwiRXZlbnRFbWl0dGVyIiwic3VwZXIiLCJjb25maWdQYXRoIiwib3V0cHV0IiwiUmVxdWVzdCIsIlZFUlNJT04iLCJHVUlfVkVSU0lPTiIsInJlcXVlc3QiLCJiaW5kIiwicmVtb3ZlQ29uZmlnIiwidW5zZXRDb25maWciLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJyZW1vdmVMaXN0ZW5lciIsIm9mZiIsInJlbW92ZUFsbExpc3RlbmVycyIsInNldE1heExpc3RlbmVycyIsImdldE1heExpc3RlbmVycyIsImxpc3RlbmVycyIsInJhd0xpc3RlbmVycyIsImVtaXQiLCJsaXN0ZW5lckNvdW50IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImV2ZW50TmFtZXMiLCJjcmVhdGVDb250ZXh0IiwiYmVmb3JlVHJhbnNmb3JtIiwiZG9UcmFuc2Zvcm0iLCJiZWZvcmVVcGxvYWQiLCJkb1VwbG9hZCIsImFmdGVyVXBsb2FkIiwiRkFJTEVEIiwiVVBMT0FEX1BST0dSRVNTIiwiQkVGT1JFX1RSQU5TRk9STSIsImhhbmRsZVBsdWdpbnMiLCJiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zIiwiY3VycmVudFRyYW5zZm9ybWVyIiwiQkVGT1JFX1VQTE9BRCIsImJlZm9yZVVwbG9hZFBsdWdpbnMiLCJvdXRwdXRJbWciLCJBRlRFUl9VUExPQUQiLCJhZnRlclVwbG9hZFBsdWdpbnMiLCJpIiwiaW1nVXJsIiwiYmFzZTY0SW1hZ2UiLCJidWZmZXIiLCJGSU5JU0hFRCIsImxpZmVDeWNsZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsImxpZmVDeWNsZU5hbWUiLCJQcm9taXNlIiwiYWxsIiwiaW5kZXgiLCJwb3N0T3B0aW9ucyIsImZpbGVOYW1lIiwiaW1hZ2UiLCJhcGlUb2tlbiIsImJhY2t1cERvbWFpbiIsIm1ldGhvZCIsImhlYWRlcnMiLCJjb250ZW50VHlwZSIsIkF1dGhvcml6YXRpb24iLCJmb3JtRGF0YSIsInNtZmlsZSIsInZhbHVlIiwiZmlsZW5hbWUiLCJzc2wiLCJzbW1zQ29uZmlnIiwiaW1nTGlzdCIsImltZyIsImZyb20iLCJwb3N0Q29uZmlnIiwidG9rZW4iLCJyZXMiLCJib2R5IiwicGFyc2UiLCJjb2RlIiwiaGFzaCIsImltYWdlcyIsIk5PVElGSUNBVElPTiIsInRpdGxlIiwidHJhbnNsYXRlIiwidXNlckNvbmZpZyIsInJlcXVpcmVkIiwicHJlZml4IiwiZ2VuZXJhdGVTaWduYXR1cmUiLCJzZWNyZXRJZCIsInNlY3JldEtleSIsImFwcElkIiwiYnVja2V0Iiwic2lnbmF0dXJlIiwic2lnblRpbWUiLCJ0b2RheSIsIk1hdGgiLCJmbG9vciIsIkRhdGUiLCJnZXRUaW1lIiwic2lnbktleSIsImNyeXB0byIsImNyZWF0ZUhtYWMiLCJkaWdlc3QiLCJodHRwU3RyaW5nIiwiYXJlYSIsInN0cmluZ1RvU2lnbiIsImNyZWF0ZUhhc2giLCJyYW5kb20iLCJjdXJyZW50IiwibXVsdGlTaWduYXR1cmUiLCJzaWduSGV4S2V5IiwidGVtcFN0cmluZyIsImNvbmNhdCIsInRvU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSG9zdCIsIm1pbWUiLCJsb29rdXAiLCJ1c2VyQWdlbnQiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsIm9wIiwiZmlsZWNvbnRlbnQiLCJ0Y1l1bk9wdGlvbnMiLCJjdXN0b21VcmwiLCJ1c2VWNCIsInN0YXR1c0NvZGUiLCJvcHRpb25VcmwiLCJzb3VyY2VfdXJsIiwidGV4dCIsInJlcG8iLCJqc29uIiwiZ2l0aHViT3B0aW9ucyIsImJyYW5jaCIsImRvd25sb2FkX3VybCIsInNoYSIsImltZ0Jhc2U2NCIsInNlbGVjdEFyZWEiLCJnZXRUb2tlbiIsInFpbml1T3B0aW9ucyIsImFjY2Vzc0tleSIsIm1hYyIsInFpbml1IiwiYXV0aCIsIk1hYyIsInJzIiwiUHV0UG9saWN5IiwidXBsb2FkVG9rZW4iLCJiYXNlVXJsIiwicmVzcG9uc2UiLCJvYmoiLCJjbGllbnRJZCIsImltZ3VyT3B0aW9ucyIsImxpbmsiLCJkZWxldGVoYXNoIiwiZGF0ZSIsInRvVVRDU3RyaW5nIiwibWltZVR5cGUiLCJzaWduU3RyaW5nIiwiYWNjZXNzS2V5U2VjcmV0IiwiYWNjZXNzS2V5SWQiLCJhbGlZdW5PcHRpb25zIiwib3BlcmF0b3IiLCJwYXNzd29yZCIsIm1kNVBhc3N3b3JkIiwiTUQ1IiwidXB5dW5PcHRpb25zIiwic3RyIiwic2FmZVBhcnNlIiwiYnVpbGRJblVwbG9hZGVycyIsImFsaVl1blVwbG9hZGVyIiwidGNZdW5VcGxvYWRlciIsIlNNTVNVcGxvYWRlciIsImdpdGh1YlVwbG9hZGVyIiwicWluaXVVcGxvYWRlciIsImltZ3VyVXBsb2FkZXIiLCJ1cFl1blVwbG9hZGVyIiwiZ2V0SW1nU2l6ZSIsInJlc3VsdHMiLCJ0aW1lb3V0SWQiLCJpc0ltYWdlIiwiZXh0bmFtZSIsInJlcXVlc3RGbiIsInJlamVjdCIsInJlc3BvbnNlVHlwZSIsInJlc3AiLCJTdHJpbmciLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJiYXNlbmFtZSIsInJlYXNvbiIsInRpbWVvdXRQcm9taXNlIiwicmFjZSIsImdldFVSTEZpbGUiLCJyZWFkRmlsZSIsImdldEZTRmlsZSIsImltZ1NpemUiLCJQbHVnaW5Mb2FkZXIiLCJTZXQiLCJwYWNrYWdlUGF0aCIsInBrZyIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwicmVhZEpTT05TeW5jIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJmdWxsTGlzdCIsImFkZCIsInBsdWdpbkludGVyZmFjZSIsInBsdWdpbk1hcCIsInVucmVnaXN0ZXJQbHVnaW4iLCJoYXNQbHVnaW4iLCJwbGF0Zm9ybTJTY3JpcHRDb250ZW50IiwiZGFyd2luIiwid2luMzIiLCJ3aW4xMCIsImxpbnV4Iiwid3NsIiwicGxhdGZvcm0yU2NyaXB0RmlsZW5hbWUiLCJnZXRDbGlwYm9hcmRJbWFnZSIsImltYWdlUGF0aCIsIm1rZGlyU3luYyIsImNyZWF0ZUltYWdlRm9sZGVyIiwicGxhdGZvcm0iLCJpc1dzbCIsIm9zIiwicmVsZWFzZSIsImdldEN1cnJlbnRQbGF0Zm9ybSIsInNjcmlwdFBhdGgiLCJleGVjdXRpb24iLCJzcGF3biIsInN0ZG91dCIsInRyaW0iLCJpbWdQYXRoIiwic2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIiwiZXZlbnRCdXMiLCJodHRwc0FnZW50IiwiaHR0cHMiLCJBZ2VudCIsIm1heFZlcnNpb24iLCJtaW5WZXJzaW9uIiwiYXBwZW5kRm9ybURhdGEiLCJmb3JtIiwiYXBwZW5kIiwicmVzcG9uc2VJbnRlcmNlcHRvciIsInN0YXR1cyIsInJlc3BvbnNlRXJyb3JIYW5kbGVyIiwiZXJyb3JPYmoiLCJDT05GSUdfQ0hBTkdFIiwiaGFuZGxlUHJveHkiLCJwcm94eU9wdGlvbnMiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwcm90b2NvbCIsIm1heEJvZHlMZW5ndGgiLCJJbmZpbml0eSIsIm1heENvbnRlbnRMZW5ndGgiLCJ0dW5uZWwiLCJodHRwc092ZXJIdHRwIiwiaW5zdGFuY2UiLCJheGlvcyIsImNyZWF0ZSIsImludGVyY2VwdG9ycyIsIm9wdCIsIl9faXNPbGRPcHRpb25zIiwiRm9ybURhdGEiLCJhc3NpZ24iLCJnZXRIZWFkZXJzIiwicGFyYW1zIiwicXMiLCJyZXF1ZXN0SW50ZXJjZXB0b3IiLCJDb250ZW50VHlwZSIsIkRCIiwiZGIiLCJKU09OU3RvcmUiLCJyZWFkIiwiZmx1c2giLCJ1bnNldCIsIlBsdWdpbkhhbmRsZXIiLCJpbnN0YWxsZWRQbHVnaW5zIiwicHJvY2Vzc1BsdWdpbnMiLCJoYW5kbGVQbHVnaW5OYW1lUHJvY2VzcyIsInBrZ05hbWUiLCJmdWxsTmFtZUxpc3QiLCJmdWxsTmFtZSIsInBrZ05hbWVMaXN0IiwiZXhlY0NvbW1hbmQiLCJ3aGVyZSIsIm5wbSIsInBpcGUiLCJzdGRlcnIiLCJsb2dnZXIiLCJnZXRQcm9jZXNzUGx1Z2luTmFtZSIsInBhY2thZ2VKU09OUGF0aCIsInBvc2l4IiwiZ2V0Tm9ybWFsUGx1Z2luTmFtZSIsImxhbmd1YWdlTGlzdCIsIlVQTE9BRF9GQUlMRUQiLCJDSEVDS19TRVRUSU5HUyIsIkNIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLIiwiVVBMT0FEX0ZBSUxFRF9SRUFTT04iLCJTRVJWRVJfRVJST1IiLCJBVVRIX0ZBSUxFRCIsIlBJQ0JFRF9TTU1TIiwiUElDQkVEX1NNTVNfVE9LRU4iLCJQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOIiwiUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOIiwiUElDQkVEX0FMSUNMT1VEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCIsIlBJQ0JFRF9BTElDTE9VRF9CVUNLRVQiLCJQSUNCRURfQUxJQ0xPVURfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9QQVRIIiwiUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCIsIlBJQ0JFRF9BTElDTE9VRF9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTiIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUyIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUEiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9HSVRIVUIiLCJQSUNCRURfR0lUSFVCX1RPS0VOIiwiUElDQkVEX0dJVEhVQl9SRVBPIiwiUElDQkVEX0dJVEhVQl9QQVRIIiwiUElDQkVEX0dJVEhVQl9CUkFOQ0giLCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9RSU5JVSIsIlBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVkiLCJQSUNCRURfUUlOSVVfU0VDUkVUS0VZIiwiUElDQkVEX1FJTklVX0JVQ0tFVCIsIlBJQ0JFRF9RSU5JVV9QQVRIIiwiUElDQkVEX1FJTklVX1VSTCIsIlBJQ0JFRF9RSU5JVV9PUFRJT05TIiwiUElDQkVEX1FJTklVX0FSRUEiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkwiLCJQSUNCRURfSU1HVVIiLCJQSUNCRURfSU1HVVJfQ0xJRU5USUQiLCJQSUNCRURfSU1HVVJfUFJPWFkiLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWSIsIlBJQ0JFRF9VUFlVTiIsIlBJQ0JFRF9VUFlVTl9CVUNLRVQiLCJQSUNCRURfVVBZVU5fT1BFUkFUT1IiLCJQSUNCRURfVVBZVU5fUEFTU1dPUkQiLCJQSUNCRURfVVBZVU5fUEFUSCIsIlBJQ0JFRF9VUFlVTl9VUkwiLCJQSUNCRURfVVBZVU5fT1BUSU9OUyIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkwiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEgiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRCIsImVuIiwiSTE4bk1hbmFnZXIiLCJvYmplY3RBZGFwdGVyIiwiT2JqZWN0QWRhcHRlciIsImxhbmd1YWdlIiwiSTE4biIsImFkYXB0ZXIiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJsb2FkT3V0dGVySTE4biIsImkxOG5Gb2xkZXIiLCJnZXRPdXR0ZXJJMThuRm9sZGVyIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJpMThuRmlsZVBhdGgiLCJpMThuRmlsZSIsImkxOG5GaWxlT2JqIiwieWFtbCIsInBhdGhFeGlzdHNTeW5jIiwiYWRkTG9jYWxlIiwibG9jYWxlcyIsIm9yaWdpbkxvY2FsZXMiLCJnZXRMb2NhbGUiLCJuZXdMb2NhbGVzIiwibWVyZ2UiLCJzZXRMb2NhbGUiLCJhZGRMYW5ndWFnZSIsIlBpY0dvIiwiaW5pdENvbmZpZ1BhdGgiLCJpbml0Q29uZmlnIiwiX3BsdWdpbkxvYWRlciIsImVuc3VyZUZpbGVTeW5jIiwiX2NvbmZpZyIsInVwbG9hZGVycyIsIkltZ0Zyb21QYXRoIiwiSW1nRnJvbUJhc2U2NCIsImxpZmVjeWNsZSIsInJlZ2lzdGVyQ29tbWFuZHMiLCJwcm9wTmFtZSIsInN0YXJ0IiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoidTNCQUVBLE1BQU1BLEVBQXlCLENBQzdCQyxPQUFTQyxJQUVQLE1BQU1DLEVBQU1ELEVBQUlDLElBQ2hCQSxFQUFJQyxRQUNEQyxRQUFRLHdCQUNSQyxZQUFZLHdCQUNaQyxNQUFNLE9BQ05DLE9BQU8sc0JBQXVCLDRCQUM5QkEsT0FBTyw0QkFBNkIsb0NBQ3BDQyxRQUFPLENBQUNDLEVBQW1CTixLQUMxQixNQUFNTyxNQUFFQSxFQUFLQyxTQUFFQSxHQUFhUixFQUN0QlMsRUFBVSxDQUNkRixNQUFBQSxFQUNBQyxTQUFBQSxHQUVGVixFQUFJRixjQUFjYyxRQUFRSixFQUFTRyxHQUFTRSxPQUFPQyxJQUFRZCxFQUFJZSxJQUFJQyxNQUFNRixTQUU3RWIsRUFBSUMsUUFDREMsUUFBUSwwQkFDUkUsTUFBTSxNQUNORCxZQUFZLDBCQUNaRyxRQUFRQyxJQUNQUixFQUFJRixjQUFjbUIsVUFBVVQsR0FBU0ssT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsU0FFdEViLEVBQUlDLFFBQ0RDLFFBQVEsdUJBQ1JDLFlBQVksdUJBQ1pFLE9BQU8sc0JBQXVCLDRCQUM5QkEsT0FBTyw0QkFBNkIsb0NBQ3BDQyxRQUFPLENBQUNDLEVBQW1CTixLQUMxQixNQUFNTyxNQUFFQSxFQUFLQyxTQUFFQSxHQUFhUixFQUN0QlMsRUFBVSxDQUNkRixNQUFBQSxFQUNBQyxTQUFBQSxHQUVGVixFQUFJRixjQUFjb0IsT0FBT1YsRUFBU0csR0FBU0UsT0FBT0MsSUFBZWQsRUFBSWUsSUFBSUMsTUFBTUYsV0NwQ2pGSyxFQUFrQixDQUN0QnBCLE9BQVNDLElBQ0tBLEVBQUlDLElBQ1pDLFFBQ0RJLE9BQU8sc0JBQXVCLHFCQ014QmMsRUFBU0MsR0FBMEJBLEVBQUlDLFdBQVcsWUFBY0QsRUFBSUMsV0FBVyxZQVcvRUMsRUFBbUJGLElBVkwsQ0FBQ0EsSUFDMUJBLEVBQU1BLEdBQU8sR0FDYixJQUVFLE9BQU9BLElBQVFHLFVBQVVILEdBQ3pCLE1BQU9QLEdBRVAsT0FBTyxJQUlKVyxDQUFZSixLQUNmQSxFQUFNSyxVQUFVTCxJQUVYQSxHQUdJTSxFQUFnQkMsSUFDM0IsSUFDRSxNQUFNQyxNQUFFQSxFQUFRLEVBQUNDLE9BQUVBLEVBQVMsR0FBTUMsRUFBVUgsR0FDNUMsTUFBTyxDQUNMSSxNQUFNLEVBQ05ILE1BQUFBLEVBQ0FDLE9BQUFBLEdBRUYsTUFBT2hCLEdBRVAsTUFBTyxDQUNMa0IsTUFBTSxFQUNOSCxNQUFPLElBQ1BDLE9BQVEsT0F3RkRHLEVBQXFCQyxHQUM1Qix5QkFBeUJDLEtBQUtELEdBQ3pCLFFBQ0VBLEVBQUtaLFdBQVcsaUJBQ2xCLFNBQ0VjLEVBQWFGLEdBQ2YsU0FFRixVQVVJRSxFQUFnQkMsSUFDM0IsR0FBSUMsRUFBS0MsV0FBV0YsR0FDbEIsT0FBTyxFQUVULE1BQU1HLEVBQWFGLEVBQUtHLEtBQUtDLFFBQVFDLE1BQU9OLEdBQzVDLE9BQUlPLEVBQUdDLFdBQVdMLE1BR2RILEVBQVdTLFNBQVMsT0FBUVQsRUFBV1MsU0FBUyxRQTZCekNDLEVBQTJCLENBQUNiLEVBQWNjLEVBQVEsS0FDekRBLEVBQ0ssSUFBSUEsa0JBQXNCZCxJQUUxQixnQkFBZ0JBLElBNkZkZSxFQUF1QkMsR0FDbEJBLEVBQVFDLE1BQU1iLEVBQUtjLEtBQ3BCWCxLQUFLLEtBVVRZLEVBQXNCLENBQUNoQixFQUFvQlcsR0FBaUIsS0FDdkUsR0FBS1gsRUFBV1MsU0FBUyxLQUVsQixDQUNMLElBQUlRLEVBQU0sa0NBRU5OLElBQ0ZNLEVBQU0sNENBRVIsTUFBTUMsRUFBV2xCLEVBQVdtQixNQUFNRixHQUNsQyxPQUFLQyxFQUlJQSxFQUFTLElBSGhCRSxRQUFRQyxLQUFLLGlDQUNOckIsR0FWVCxPQUFPQSxHQXFCRXNCLEVBQWtCLEdBTWxCQyxFQUEwQkMsR0FDOUJGLEVBQWdCRyxNQUFLQyxHQUFhRixFQUFJdkMsV0FBV3lDLEtBVTdDQyxFQUFzQjdDLEdBRWIsaUJBQVhBLElBQ044QyxNQUFNQyxRQUFRL0MsSUFDZmdELE9BQU9DLEtBQUtqRCxHQUFRa0QsT0FBUyxFQThCMUIsTUM1V0RDLEVBQWtCLENBQ3RCdkUsT0FBU0MsSUFDS0EsRUFBSUMsSUFDWkMsUUFDREMsUUFBUSxVQUNSQyxZQUFZLG9CQUNabUUsVUFBVSxjQUNWbEUsTUFBTSxLQUNORSxRQUFRaUUsSUFDUCxXQUNFLE1BQU1DLEVBQVlELEVBQ2ZFLEtBQUtDLEdBQ0d2RCxFQUFNdUQsR0FBUUEsRUFBT3JDLEVBQUtzQyxRQUFRRCxLQUUxQ0UsUUFBUUYsSUFDUCxNQUFNRyxFQUFRbEMsRUFBR0MsV0FBVzhCLElBQVN2RCxFQUFNdUQsR0FJM0MsT0FIS0csR0FDSDlFLEVBQUllLElBQUkyQyxLQUFLLEdBQUdpQixxQkFFWEcsV0FFTDlFLEVBQUlzRSxPQUFPRyxJQVpuQixHQWFLNUQsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsV0N4QnBDaUUsRUFBZUMsTUFBT2hGLEVBQWFpRixFQUEwQkMsRUFBZ0JoRCxLQUNqRixNQUFNaUQsUUFBZW5GLEVBQUlDLElBQUltRixTQUFTQyxPQUFPSixHQUN2Q0ssRUFBd0IsYUFBWEosRUFDZixVQUFVaEQsSUFBb0IsZ0JBQVhnRCxFQUNqQixlQUFlaEQsSUFBU0EsRUFDOUJsQyxFQUFJdUYsV0FBVyxDQUNiRCxDQUFDQSxHQUFhSCxLQUlaSyxFQUFVLENBQ2R6RixPQUFTQyxJQUNLQSxFQUFJQyxJQUNaQyxRQUNEQyxRQUFRLE9BQ1JFLE1BQU0sVUFDTmtFLFVBQVUsbUJBQ1ZuRSxZQUFZLHFDQUNaRyxRQUFPLENBQUMyRSxFQUFnQmhELEtBQ3ZCLG1CQUNFLElBSUUsT0FBUWdELEdBQ04sSUFBSyxXQUNMLElBQUssY0FDSCxHQUFJaEQsRUFBTSxDQUNSLE1BQU15QyxFQUFPM0UsRUFBSXlGLE9BQU9QLEdBQVFRLElBQUl4RCxHQUNwQyxJQUFLeUMsRUFDSCxPQUFPM0UsRUFBSWUsSUFBSUMsTUFBTSxNQUFNa0UsV0FBZ0JoRCxLQUV6Q3lDLEVBQUt4RCxjQUNENEQsRUFBYS9FLEVBQUsyRSxFQUFLeEQsT0FBT25CLEdBQU1rRixFQUFRaEQsT0FFL0MsQ0FDTCxNQUFNK0MsRUFBVSxDQUNkLENBQ0VVLEtBQU0sT0FDTnpELEtBQU0sR0FBR2dELElBQ1RVLFFBQVM1RixFQUFJeUYsT0FBT1AsR0FBUVcsWUFDNUJDLFFBQVMsZUFBZVosTUFJdEJDLFFBQWVuRixFQUFJQyxJQUFJbUYsU0FBU0MsT0FBMkJKLEdBQzNETixFQUFPM0UsRUFBSXlGLE9BQU9QLEdBQVFRLElBQUlQLEVBQU9ELEtBQ3ZDUCxNQUFBQSxTQUFBQSxFQUFNeEQsZUFDRjRELEVBQWEvRSxFQUFLMkUsRUFBS3hELE9BQU9uQixHQUFNa0YsRUFBUUMsRUFBT0QsSUFHN0QsTUFDRixJQUFLLFNBQ0gsR0FBSWhELEVBQU0sQ0FJUixHQUhLQSxFQUFLWSxTQUFTLG1CQUNqQlosRUFBTyxnQkFBZ0JBLE1BRXJCaUMsT0FBT0MsS0FBS3BFLEVBQUkrRixVQUFVLGlCQUFpQmpELFNBQVNaLEdBS3RELE9BQU9sQyxFQUFJZSxJQUFJQyxNQUFNLG1CQUFtQmtCLGdCQUpwQ2xDLEVBQUlnRyxhQUFhQyxVQUFVL0QseUJBQU9mLGVBQzlCNEQsRUFBYS9FLEVBQUtBLEVBQUlnRyxhQUFhQyxVQUFVL0QsR0FBT2YsT0FBUW5CLEdBQU0sU0FBVWtDLE9BS2pGLENBQ0wsTUFBTStDLEVBQVUsQ0FDZCxDQUNFVSxLQUFNLE9BQ056RCxLQUFNLFNBQ04wRCxRQUFTNUYsRUFBSWdHLGFBQWFFLGNBQzFCSixRQUFTLG9CQUdQWCxRQUFlbkYsRUFBSUMsSUFBSW1GLFNBQVNDLE9BQVlKLGNBQzlDakYsRUFBSWdHLGFBQWFDLFVBQVVkLEVBQU9nQiw4QkFBU2hGLGVBQ3ZDNEQsRUFBYS9FLEVBQUtBLEVBQUlnRyxhQUFhQyxVQUFVZCxFQUFPZ0IsUUFBU2hGLE9BQVFuQixHQUFNLFNBQVVtRixFQUFPZ0IsUUFHdEcsTUFDRixRQUVFLE9BREFuRyxFQUFJZSxJQUFJMkMsS0FBSyxtQkFBbUJ3QixLQUN6QmxGLEVBQUllLElBQUkyQyxLQUFLLHFEQUV4QixNQUFNMEMsRUFBMkIsV0FBWGxCLEVBQXNCLFVBQVlBLEVBQ3hEbEYsRUFBSWUsSUFBSXNGLFFBQVEsa0NBQ2hCckcsRUFBSWUsSUFBSXVGLEtBQUsseURBQXlERixNQUN0RSxNQUFPdEYsR0FFUCxHQURBZCxFQUFJZSxJQUFJQyxNQUFNRixHQUNWNEIsUUFBUTZELEtBQUt6RCxTQUFTLFdBQ3hCLE1BQU1oQyxJQXRFWixHQXlFS0QsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsV0M3RnBDMEYsRUFBZSxDQUNuQnpHLE9BQVFpRixNQUFPaEYsSUFDYixNQUFNQyxFQUFNRCxFQUFJQyxJQUNoQkEsRUFBSUMsUUFDREMsUUFBUSxPQUNSb0UsVUFBVSxZQUNWbkUsWUFBWSx3QkFDWkcsUUFBUTJFLElBQ1AsV0FDRSxJQUdFLElBQUlELEVBQWlCLEdBQ3JCLE1BQU05RCxFQUFzQixDQUMxQnNGLFNBQVUsQ0FDUmQsS0FBTSxPQUNOekQsS0FBTSxXQUNONEQsUUFBUyxrQkFDVEYsUUFBUzVGLEVBQUl5RixPQUFPZ0IsU0FBU1osWUFDN0JhLFFBQVMxRyxFQUFJK0YsVUFBVSxvQkFBc0IvRixFQUFJK0YsVUFBVSxtQkFBcUIsUUFFbEZZLFlBQWEsQ0FDWGhCLEtBQU0sT0FDTnpELEtBQU0sY0FDTjRELFFBQVMsb0JBQ1RGLFFBQVM1RixFQUFJeUYsT0FBT2tCLFlBQVlkLFlBQ2hDYSxRQUFTMUcsRUFBSStGLFVBQStCLHVCQUF5QixRQUV2RXZGLFFBQVMsQ0FDUG1GLEtBQU0sV0FDTnpELEtBQU0sVUFDTjRELFFBQVMsY0FDVEYsUUFBUzVGLEVBQUlnRyxhQUFhRSxjQUMxQlEsUUFBU3ZDLE9BQU9DLEtBQUtwRSxFQUFJK0YsVUFBVSxpQkFBaUJsQixRQUFRRixHQUFpQjNFLEVBQUkrRixVQUFVLGdCQUFnQnBCLFNBSS9HLEdBQUlPLEVBQVEsQ0FDVixJQUFJL0QsRUFBTytELEdBSVQsT0FEQWxGLEVBQUllLElBQUkyQyxLQUFLLG1CQUFtQndCLEtBQ3pCbEYsRUFBSWUsSUFBSTJDLEtBQUssc0RBSHBCdUIsRUFBUTJCLEtBQUt6RixFQUFPK0QsU0FNdEJELEVBQVVkLE9BQU9DLEtBQUtqRCxHQUFRdUQsS0FBS0MsR0FBaUJ4RCxFQUFPd0QsS0FFN0QsTUFBTVEsUUFBZWxGLEVBQUltRixTQUFTQyxPQUFZSixHQUc5QyxHQUFJRSxFQUFPM0UsUUFBUyxDQUNsQixNQUFNQSxFQUFVUixFQUFJK0YsVUFBa0MsZ0JBQ3RENUIsT0FBT0MsS0FBSzVELEdBQVNrRSxLQUFLQyxJQUNwQlEsRUFBTzNFLFFBQVFzQyxTQUFTNkIsR0FDMUJuRSxFQUFRbUUsSUFBUSxFQUVoQm5FLEVBQVFtRSxJQUFRLEtBSXBCM0UsRUFBSXVGLFdBQVcsQ0FDYnNCLGFBQWNyRyxJQUlsQlIsRUFBSXVGLFdBQVcsQ0FDYixpQkFBa0JKLEVBQU9zQixVQUFZekcsRUFBSStGLFVBQWtCLGtCQUMzRCxrQkFBbUJaLEVBQU9zQixVQUFZekcsRUFBSStGLFVBQWtCLGtCQUM1RCxxQkFBc0JaLEVBQU93QixhQUFlLFNBRTlDM0csRUFBSWUsSUFBSXNGLFFBQVEsa0NBQ2hCLE1BQU92RixHQUVQLEdBREFkLEVBQUllLElBQUlDLE1BQU1GLEdBQ1Y0QixRQUFRNkQsS0FBS3pELFNBQVMsV0FDeEIsTUFBTWhDLElBbEVaLEdBcUVLRCxPQUFPQyxJQUFRZCxFQUFJZSxJQUFJQyxNQUFNRixXQzdFcENMLEdBQWlCLENBQ3JCVixPQUFTQyxJQUNLQSxFQUFJQyxJQUNaQyxRQUNESSxPQUFPLG9CQUFxQiwyQkFBNEJHLElBQ3ZEVCxFQUFJOEcsVUFBVSxDQUNaLGVBQWdCckcsU0NJcEJzRyxHQUFXL0IsTUFBT2hGLEVBQWFXLEtBQ25DLElBQ0UsTUFBTXFHLEVBQU9DLEdBQVd0RyxFQUFRdUcsS0FDMUJDLEVBQVM3RSxFQUFLRyxLQUFLOUIsRUFBUXVHLElBQUssWUFDdEMsSUFBSUUsRUFBVSxHQUNWSixFQUFLL0IsU0FBVytCLEVBQUsvQixRQUFRWixPQUFTLElBQ3hDK0MsUUFBZ0JwSCxFQUFJQyxJQUFJbUYsU0FBU0MsT0FBTzJCLEVBQUsvQixVQUUvQyxJQUFJb0MsUUFBeUJDLEVBQU8sQ0FBQyxRQUFTLENBQUUzRSxJQUFLd0UsRUFBUUksS0FBSyxJQWNsRSxHQWJBRixFQUFTQSxFQUFPeEMsUUFBUUYsSUFDdEIsSUFBSTZDLEVBQU8sR0FNWCxPQUxBckQsT0FBT0MsS0FBSzRDLEVBQUtTLFNBQVNDLFNBQVM3RCxJQUM3QkwsRUFBTW1CLEVBQU1kLEVBQUssQ0FBRTBELEtBQUssTUFDMUJDLEVBQU83QyxPQUdQNkMsR0FDS0MsR0FBUXpILEVBQUtnSCxFQUFLUyxRQUFRRCxHQUFPSixNQUt0QixJQUFsQkMsRUFBT2hELE9BQ1QsT0FBT3JFLEVBQUllLElBQUkyQyxLQUFLLDZCQUV0QixNQUFNaUUsRUFBUUMsR0FBT1AsRUFBUUYsRUFBUUMsR0FDckNTLEdBQWNsSCxFQUFRbUgsS0FBTUgsR0FDQyxtQkFBbEJYLEVBQUtlLFVBQ2RmLEVBQUtlLFNBQVMsQ0FBRVgsUUFBQUEsRUFBU3pHLFFBQUFBLEVBQVNnSCxNQUFPTixFQUFRckgsSUFBQUEsSUFFL0NnSCxFQUFLZ0IsaUJBQ1BoSSxFQUFJZSxJQUFJc0YsUUFBUVcsRUFBS2dCLGlCQUV2QmhJLEVBQUllLElBQUlzRixRQUFRLFNBQ2hCLE1BQU92RixHQUNQLE9BQU9kLEVBQUllLElBQUlDLE1BQU1GLEtBVW5CMkcsR0FBVSxDQUFDekgsRUFBYWlJLEVBQVVDLEtBRXRDLE1BQU1DLEVBQUssSUFBSUMsU0FBUyxPQUFRLHdCQUEwQkgsRUFBTSxLQUNoRSxJQUNFLE9BQU9FLEVBQUdELEdBQ1YsTUFBT3BILEdBRVAsT0FEQWQsRUFBSWUsSUFBSUMsTUFBTSwyQ0FBMkNxSCxLQUFLQyxVQUFVTCxPQUNqRSxJQVFMaEIsR0FBY3NCLElBQ2xCLE1BQU1DLEVBQWNsRyxFQUFLRyxLQUFLOEYsRUFBYyxZQUM1QyxHQUFJM0YsRUFBR0MsV0FBVzJGLEdBQWMsQ0FHOUIsT0FEZ0JDLFFBQVFELEdBR3hCLE1BQU8sSUFRTFosR0FBUyxDQUFDRCxFQUFpQlIsRUFBZ0J4RyxLQUMvQyxNQUFNK0gsRUFBc0IsR0FRNUIsT0FQQWYsRUFBTUQsU0FBU2lCLElBQ2IsTUFBTS9HLEVBQU9nQixFQUFHZ0csYUFBYXRHLEVBQUtHLEtBQUswRSxFQUFRd0IsR0FBVyxRQUNwREUsRUFBVUMsRUFBSWxCLE9BQU9oRyxFQUFNakIsSUFDN0JvSSxPQUFPQyxTQUFTSCxJQUFZLFFBQVExRyxLQUFLMEcsTUFDM0NILEVBQVNDLEdBQVlFLE1BR2xCSCxHQVFIYixHQUFnQixDQUFDb0IsRUFBYXRCLEtBQ2xDeEQsT0FBT0MsS0FBS3VELEdBQU9ELFNBQVN4RixJQUMxQixNQUFNeUcsRUFBV3JHLEVBQUtHLEtBQUt3RyxFQUFLL0csR0FDaENVLEVBQUdzRyxjQUFjNUcsRUFBSzZHLFFBQVFSLElBQzlCL0YsRUFBR3dHLGNBQWNULEVBQVVoQixFQUFNekYsUUNuRy9CbUgsR0FBTSxDQUFDckosRUFBYVcsS0FFcEJBLEVBQVEySSxRQUNOMUcsRUFBR0MsV0FBV2xDLEVBQVE0SSxVQUN4QnhDLEdBQVMvRyxFQUFLVyxHQUFTRSxPQUFPQyxJQUFRZCxFQUFJZSxJQUFJQyxNQUFNRixNQUVwRGQsRUFBSWUsSUFBSUMsTUFBTSxrQkFBa0JMLEVBQVE0SSx1QkFHMUM1SSxFQUFRNEksU0FBWTVJLEVBQVE2SSxTQUV4QjdJLEVBQVE0SSxTQURSLHdCQUEwQjVJLEVBQVE0SSxTQUV0Q0UsR0FBb0J6SixFQUFLVyxLQVN2QjhJLEdBQXNCLENBQUN6SixFQUFhVyxLQUNwQ2lDLEVBQUdDLFdBQVdsQyxFQUFRdUcsTUFDeEJ3QyxFQUFHQyxLQUFLaEosRUFBUXVHLEtBRWxCbEgsRUFBSWUsSUFBSXVGLEtBQUsscUNBQ2JzRCxFQUFTakosRUFBUTRJLFNBQVU1SSxFQUFRdUcsSUFBSyxDQUFFMkMsTUFBT2xKLEVBQVFrSixRQUFVQyxJQUNqRSxHQUFJQSxFQUNGLE9BQU85SixFQUFJZSxJQUFJQyxNQUFNOEksR0FFdkI5SixFQUFJZSxJQUFJc0YsUUFBUSxrQ0FDaEJVLEdBQVMvRyxFQUFLVyxHQUFTRSxPQUFPQyxJQUFRZCxFQUFJZSxJQUFJQyxNQUFNRixVQUlsRGlKLEdBQWdCLENBQ3BCaEssT0FBUWlGLE1BQU9oRixJQUNEQSxFQUFJQyxJQUNaQyxRQUNEQyxRQUFRLFFBQ1JvRSxVQUFVLHdCQUNWakUsT0FBTyxVQUFXLGlCQUNsQkEsT0FBTyxZQUFhLHVCQUNwQkYsWUFBWSwrQ0FDWkcsUUFBTyxDQUFDZ0osRUFBa0JTLEVBQWlCOUosS0FDMUMsV0FFRSxJQUNFLE1BQU1zSixFQUFXRCxFQUFTekcsU0FBUyxLQUM3Qm1ILEdBQVdELEdBQXVCLE1BQVpBLEVBQ3RCbEMsRUFBT3hGLEVBQUtzQyxRQUFRb0YsR0FBVyxLQUMvQkgsRUFBUTNKLEVBQVEySixRQUFTLEVBQ3pCUCxFQUFVcEosRUFBUW9KLFVBQVcsRUFDN0JwQyxFQUFNNUUsRUFBS0csS0FBS3lILElBQVcsbUJBQW9CWCxFQUFTWSxRQUFRLFFBQVMsTUFFM0VqSyxFQUFRb0osVUFDVkMsRUFBV3JDLEdBR2IsTUFBTXZHLEVBQVUsQ0FDZDRJLFNBQUFBLEVBQ0FTLFFBQUFBLEVBQ0FSLFNBQUFBLEVBQ0FTLFFBQUFBLEVBQ0FuQyxLQUFBQSxFQUNBK0IsTUFBQUEsRUFDQTNDLElBQUFBLEVBQ0FvQyxRQUFBQSxHQUlFVyxHQUFXckgsRUFBR0MsV0FBV2lGLFNBQ3JCOUgsRUFBSUMsSUFBSW1GLFNBQVNDLE9BQU8sQ0FDNUIsQ0FDRU0sS0FBTSxVQUNORyxRQUFTbUUsRUFDTCx5Q0FDQSxxQ0FDSi9ILEtBQU0sUUFFUGtJLE1BQU1qRixJQUNIQSxFQUFPa0YsSUFDVGhCLEdBQUlySixFQUFLVyxNQUliMEksR0FBSXJKLEVBQUtXLEdBRVgsTUFBT0csR0FFUCxHQURBZCxFQUFJZSxJQUFJQyxNQUFNRixHQUNWNEIsUUFBUTZELEtBQUt6RCxTQUFTLFdBQ3hCLE1BQU1oQyxJQTlDWixHQWlES0QsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsU0FFbkN3SixHQUFHLFVBQVUsS0FDWjdHLFFBQVExQyxNQUNSMEMsUUFBUTFDLElBQUksYUFDWjBDLFFBQVExQyxNQUNSMEMsUUFBUTFDLElBQUl3SixFQUFNQyxLQUFLLHVEQUN2Qi9HLFFBQVExQyxJQUFJLG9DQUNaMEMsUUFBUTFDLE1BQ1IwQyxRQUFRMUMsSUFBSXdKLEVBQU1DLEtBQUssNkRBQ3ZCL0csUUFBUTFDLElBQUksMkNBQ1owQyxRQUFRMUMsV0NoSFYwSixHQUFnQixDQUNwQjFLLE9BQVNDLElBQ0tBLEVBQUlDLElBQ1pDLFFBQ0RDLFFBQVEsUUFDUm9FLFVBQVUsVUFDVm5FLFlBQVkseUJBQ1pHLFFBQU95RSxNQUFPMEYsRUFBZSxNQUM1QixNQUFNQyxFQUFPM0ssRUFBSXlLLEtBQUtHLGtCQUN0QixJQUFLRixFQUFNLENBQ1QsTUFBTXpGLEVBQVUsQ0FDZCxDQUNFVSxLQUFNLE9BQ056RCxLQUFNLE9BQ04wRCxRQUFTK0UsRUFDVDdFLFFBQVMsb0JBQ1RZLFFBQVMxRyxFQUFJK0YsVUFBVSxzQkFBd0IsVUFHN0NaLFFBQWVuRixFQUFJQyxJQUFJbUYsU0FBU0MsT0FBOEJKLEdBR3BFLE9BRkFqRixFQUFJeUssS0FBS0ksWUFBWTFGLEVBQU9zRixXQUM1QnpLLEVBQUllLElBQUlzRixRQUFRLG1CQUFtQmxCLEVBQU9zRixRQUc1QyxJQUFLRSxFQUFLN0gsU0FBUzRILEdBQ2pCLE9BQU8xSyxFQUFJZSxJQUFJMkMsS0FBSyxvQkFFdEIxRCxFQUFJeUssS0FBS0ksWUFBWUgsR0FDckIxSyxFQUFJZSxJQUFJc0YsUUFBUSxtQkFBbUJxRSxnQkM1QjlCSSxHQU1YQyxZQUFhN0ksR0FDWDhJLEtBQUs5SSxLQUFPQSxFQUNaOEksS0FBS0wsS0FBTyxJQUFJTSxJQUNoQkQsS0FBS0UsWUFBYyxJQUFJRCxJQUd6QkUsU0FBVUMsRUFBWWpGLFNBQ3BCLElBQUtpRixFQUFJLE1BQU0sSUFBSUMsVUFBVSxtQkFDN0IsR0FBNkIsbUJBQWxCbEYsRUFBT3BHLE9BQXVCLE1BQU0sSUFBSXNMLFVBQVUscUNBQzdELEdBQUlMLEtBQUtMLEtBQUtXLElBQUlGLEdBQUssTUFBTSxJQUFJQyxVQUFVLEdBQUdMLEtBQUs5SSxzQkFBc0JrSixNQUN6RUosS0FBS0wsS0FBS1ksSUFBSUgsRUFBSWpGLEdBQ2QyRSxHQUFpQlUsZ0JBQ2ZSLEtBQUtFLFlBQVlJLElBQUlSLEdBQWlCVSx5QkFDeENSLEtBQUtFLFlBQVl4RixJQUFJb0YsR0FBaUJVLCtCQUFnQjVFLEtBQUt3RSxHQUUzREosS0FBS0UsWUFBWUssSUFBSVQsR0FBaUJVLGNBQWUsQ0FBQ0osS0FLNURLLFdBQVlDLEdBQ1YsR0FBSVYsS0FBS0UsWUFBWUksSUFBSUksR0FBYSxDQUNwQyxNQUFNQyxFQUFhWCxLQUFLRSxZQUFZeEYsSUFBSWdHLEdBQ3hDQyxNQUFBQSxHQUFBQSxFQUFZakUsU0FBU3ZCLElBQ25CNkUsS0FBS0wsS0FBS2lCLE9BQU96RixPQUt2QjBGLFVBQ0UsT0FBT2IsS0FBSzlJLEtBR2R3RCxJQUFLMEYsR0FDSCxPQUFPSixLQUFLTCxLQUFLakYsSUFBSTBGLEdBR3ZCVSxVQUNFLE1BQU8sSUFBSWQsS0FBS0wsS0FBS29CLFVBR3ZCbEcsWUFDRSxNQUFPLElBQUltRixLQUFLTCxLQUFLdkcsU0FJbEIsTUFBTTRILEdBQXVCLENBQUM5SixFQUFzQixRQUN6RDRJLEdBQWlCVSxjQUFnQnRKLFNDaER0QitKLEdBVVhsQixZQUFhL0ssR0FUSWdMLFVBQU8sWUFFUEEsVUFBNkIsSUFBSUMsSUFDakNELGlCQUFxQyxJQUFJQyxJQU94REQsS0FBSzlLLFFBQVUsSUFBSWdNLEVBQ25CbEIsS0FBSzVGLFNBQVdBLEVBQ2hCNEYsS0FBS2hMLElBQU1BLEVBR2I2TCxVQUNFLE9BQU9iLEtBQUs5SSxLQUdkNkgsT0NqQmEsSUFBQy9KLEVEa0JaZ0wsS0FBSzlLLFFBQ0ZpTSxRQUFRLFFBQTJCLGlCQUNuQzdMLE9BQU8sY0FBZSxjQUFjLEtBQ25DMEssS0FBS2hMLElBQUk4RyxVQUFVLENBQ2pCc0YsT0FBTyxPQUdWOUwsT0FBTyxlQUFnQixlQUFlLEtBQ3JDMEssS0FBS2hMLElBQUk4RyxVQUFVLENBQ2pCdUYsUUFBUSxPQUdYL0IsR0FBRyxhQUFhLEtBQ2ZVLEtBQUtoTCxJQUFJZSxJQUFJQyxNQUFNLG9CQUFvQmdLLEtBQUs5SyxRQUFRb00sS0FBSzdKLEtBQUssc0RBQzlEQyxRQUFRNkosS0FBSyxPQ2hDTHZNLEVEb0NEZ0wsS0FBS2hMLEtDbkNkQyxJQUFJa0wsU0FBUyxnQkFBaUJyTCxHQUNsQ0UsRUFBSUMsSUFBSWtMLFNBQVMsU0FBVWhLLEdBQzNCbkIsRUFBSUMsSUFBSWtMLFNBQVMsVUFBVzNGLEdBQzVCeEYsRUFBSUMsSUFBSWtMLFNBQVMsU0FBVTdHLEdBQzNCdEUsRUFBSUMsSUFBSWtMLFNBQVMsTUFBTzNFLEdBQ3hCeEcsRUFBSUMsSUFBSWtMLFNBQVMsUUFBUzFLLElBQzFCVCxFQUFJQyxJQUFJa0wsU0FBUyxPQUFRcEIsSUFDekIvSixFQUFJQyxJQUFJa0wsU0FBUyxPQUFRVixJRCtCekJVLFNBQVVDLEVBQVlqRixTQUNwQixJQUFLaUYsRUFBSSxNQUFNLElBQUlDLFVBQVUscUJBQzdCLEdBQTZCLG1CQUFsQmxGLEVBQU9wRyxPQUF1QixNQUFNLElBQUlzTCxVQUFVLHFDQUM3RCxHQUFJTCxLQUFLTCxLQUFLVyxJQUFJRixHQUFLLE1BQU0sSUFBSUMsVUFBVSxHQUFHTCxLQUFLOUksNkJBQTZCa0osTUFDaEZKLEtBQUtMLEtBQUtZLElBQUlILEVBQUlqRixHQUNsQixNQUFNcUcsRURLRDFCLEdBQWlCVSxjQ0pJLE9BQXRCZ0IsSUFDRXhCLEtBQUtFLFlBQVlJLElBQUlrQixhQUN2QnhCLEtBQUtFLFlBQVl4RixJQUFJOEcsbUJBQW9CNUYsS0FBS3dFLEdBRTlDSixLQUFLRSxZQUFZSyxJQUFJaUIsRUFBbUIsQ0FBQ3BCLEtBSy9DSyxXQUFZQyxHQUNWLEdBQUlWLEtBQUtFLFlBQVlJLElBQUlJLEdBQWEsQ0FDcEMsTUFBTUMsRUFBYVgsS0FBS0UsWUFBWXhGLElBQUlnRyxHQUN4Q0MsTUFBQUEsR0FBQUEsRUFBWWpFLFNBQVN2QixJQUNuQjZFLEtBQUtMLEtBQUtpQixPQUFPekYsT0FLdkJzRyxlQUNFekIsS0FBS2MsVUFBVXBFLFNBQVMvQyxJQUN0QixJQUNFQSxFQUFLNUUsT0FBT2lMLEtBQUtoTCxLQUNqQixNQUFPYyxHQUNQa0ssS0FBS2hMLElBQUllLElBQUlDLE1BQU1GLE9BS3pCNEUsSUFBSzBGLEdBQ0gsT0FBT0osS0FBS0wsS0FBS2pGLElBQUkwRixHQUd2QlUsVUFDRSxNQUFPLElBQUlkLEtBQUtMLEtBQUtvQixVQUd2QmxHLFlBQ0UsTUFBTyxJQUFJbUYsS0FBS0wsS0FBS3ZHLFNFNUZ6QixJQUFZc0ksR0FVQUMsR0FnQkFDLElBMUJaLFNBQVlGLEdBQ1ZBLG9CQUNBQSxjQUNBQSxjQUNBQSxnQkFKRixDQUFZQSxLQUFBQSxRQVVaLFNBQVlDLEdBQ1ZBLG1DQUNBQSxrQkFDQUEscUNBQ0FBLCtCQUNBQSw2QkFDQUEsc0JBQ0FBLG9CQUNBQSx3QkFDQUEsa0JBQ0FBLDhCQVZGLENBQVlBLEtBQUFBLFFBZ0JaLFNBQVlDLEdBQ1ZBLGdDQURGLENBQVlBLEtBQUFBLGNDVkNDLEdBV1g5QixZQUFhL0ssR0FWSWdMLFdBQVEsQ0FDdkIsQ0FBQzBCLEdBQVNyRyxTQUFVLFFBQ3BCLENBQUNxRyxHQUFTcEcsTUFBTyxPQUNqQixDQUFDb0csR0FBU2hKLE1BQU8sU0FDakIsQ0FBQ2dKLEdBQVMxTCxPQUFRLE9BT2xCZ0ssS0FBS2hMLElBQU1BLEVBR0w4TSxVQUFXbkgsS0FBbUJvSCxHQUVwQyxJQUFLL0IsS0FBS2hMLElBQUkrRixVQUErQixVQUFXLENBQ3RELE1BQU1pSCxFQUFZekMsRUFBTVMsS0FBS2lDLE1BQU10SCxJQUFvQixZQUFZQSxFQUFLdUgsbUJBQ3hFekosUUFBUTFDLElBQUlpTSxLQUFjRCxHQUMxQi9CLEtBQUttQyxTQUFXbkMsS0FBS2hMLElBQUkrRixVQUFVLHFCQUNuQ2lGLEtBQUtvQyxRQUFVcEMsS0FBS2hMLElBQUkrRixVQUErQixxQkFBdUJ6RCxFQUFLRyxLQUFLdUksS0FBS2hMLElBQUlxTixRQUFTLGlCQUMxR0MsWUFBVyxLQUVULElBQ0UsTUFBTUMsRUFBU3ZDLEtBQUt3QyxvQkFBb0J4QyxLQUFLb0MsU0FDN0MsR0FBSUcsRUFBT0UsUUFBUyxDQUNsQixNQUFNQyxFQUFhLDRCQUE2QkgsRUFBd0IsaUJBQUksS0FBTyxNQUFRLDhCQUMzRjlKLFFBQVExQyxJQUFJd0osRUFBTW9ELE9BQU8sbUJBQW9CRCxHQUM3QzFDLEtBQUs0QyxnQkFBZ0I1QyxLQUFLb0MsU0FDMUJMLEVBQUljLFFBQVFILEdBRWQxQyxLQUFLOEMsZUFBZTlDLEtBQUtvQyxRQUFTekgsS0FBU29ILEdBQzNDLE1BQU9qTSxHQUVQMkMsUUFBUXpDLE1BQU0sNENBQTZDRixNQUU1RCxJQUlDME0sb0JBQXFCSixHQUszQixHQUFJeEssRUFBR0MsV0FBV3VLLEdBQVUsQ0FDMUIsTUFBTVcsRUFBY25MLEVBQUdvTCxTQUFTWixHQUFTYSxLQUNuQ0MsRUFBNkcsS1ppVDlGLEVBQUNDLEVBQXVCLElBQzFDQyxNQUFNQyxPQUFPRixJQUFRLEVBQUlFLE9BQU9GLEdZbFRWRyxDQUFZdEQsS0FBS2hMLElBQUkrRixVQUErQiw4QkFBZ0MsSUFBYSxLQUMxSCxNQUFPLENBQ0wwSCxRQUFTTSxFQUFjRyxFQUN2QkgsWUFBQUEsRUFDQUcsaUJBQUFBLEdBR0osTUFBTyxDQUNMVCxTQUFTLEdBSUxHLGdCQUFpQlIsR0FDbkJ4SyxFQUFHQyxXQUFXdUssS0FDaEJ4SyxFQUFHMkwsV0FBV25CLEdBQ2R4SyxFQUFHNEwsZUFBZXBCLElBSWRVLGVBQWdCVixFQUFpQnpILEtBQWlCb0gsR0FDeEQsSUFDRSxHQUFJL0IsS0FBS3lELGNBQWM5SSxFQUFNcUYsS0FBS21DLFVBQVcsQ0FDM0MsSUFBSXBNLEVBQU0sR0FBRzJOLElBQVFDLE9BQU8sbUNBQW1DaEosRUFBS3VILGtCQUNwRUgsRUFBSXJGLFNBQVMvQyxJQUNQQSxhQUFnQmlLLE9BQWtCLFVBQVRqSixFQUMzQjVFLEdBQU8sb0NBQW9DOE4sRUFBS0YsT0FBT2hLLE1BQUFBLFNBQUFBLEVBQU1tSywwQ0FFekMsaUJBQVRuSyxJQUNUQSxFQUFPMEQsS0FBS0MsVUFBVTNELEVBQU0sS0FBTSxJQUVwQzVELEdBQU8sR0FBRzRELFNBR2Q1RCxHQUFPLEtBRVA2QixFQUFHbU0sZUFBZTNCLEVBQVNyTSxJQUU3QixNQUFPRCxHQUNQMkMsUUFBUXpDLE1BQU0sc0NBQXVDRixJQUlqRDJOLGNBQWU5SSxFQUFjc0gsR0FDbkMsWUFBYytCLElBQVYvQixHQUFpQyxRQUFWQSxJQUd2QmhKLE1BQU1DLFFBQVErSSxHQUNUQSxFQUFNbkosTUFBTWEsR0FBa0JBLElBQVNnQixHQUFpQixRQUFUaEIsSUFFL0NnQixJQUFTc0gsR0FJcEI1RyxXQUFZMEcsR0FDVixPQUFPL0IsS0FBSzhCLFVBQVVKLEdBQVNyRyxXQUFZMEcsR0FHN0N6RyxRQUFTeUcsR0FDUCxPQUFPL0IsS0FBSzhCLFVBQVVKLEdBQVNwRyxRQUFTeUcsR0FHMUMvTCxTQUFVK0wsR0FDUixPQUFPL0IsS0FBSzhCLFVBQVVKLEdBQVMxTCxTQUFVK0wsR0FHM0NySixRQUFTcUosR0FDUCxPQUFPL0IsS0FBSzhCLFVBQVVKLEdBQVNoSixRQUFTcUosR0FHMUNYLFNBQVVXLEdaaVBzQixnQkFBekJySyxRQUFRdU0sSUFBSUMsVVkvT2ZsRSxLQUFLOEIsVUFBVUosR0FBU3BHLFFBQVN5RyxVQ2pJMUJvQyxXQUFrQkMsRUFHN0JyRSxZQUFhL0ssR0FDWHFQLFFBQ0FyRSxLQUFLaEwsSUFBTUEsRUFHYmdGLFlBQWFSLEdBRVgsTUFBTXhFLEVDVm1CLENBQUNBLElBQ3JCLENBQ0xzUCxXQUFZdFAsRUFBSXNQLFdBQ2hCakMsUUFBU3JOLEVBQUlxTixRQUNidE0sSUFBS2YsRUFBSWUsSUFDVGQsSUFBS0QsRUFBSUMsSUFDVHNQLE9BQVEsR0FDUi9LLE1BQU8sR0FDUHdCLGFBQWNoRyxFQUFJZ0csYUFDbEJsRyxjQUFlRSxFQUFJRixjQUNuQjBQLFFBQVN4UCxFQUFJd1AsUUFDYi9KLE9BQVF6RixFQUFJeUYsT0FDWmdLLFFBQVN6UCxFQUFJeVAsUUFDYkMsWUFBYTFQLEVBQUkwUCxZQUNqQkMsUUFBUzNQLEVBQUkyUCxRQUNibEYsS0FBTXpLLEVBQUl5SyxLQUNWMUUsVUFBVy9GLEVBQUkrRixVQUFVNkosS0FBSzVQLEdBQzlCdUYsV0FBWXZGLEVBQUl1RixXQUFXcUssS0FBSzVQLEdBQ2hDNlAsYUFBYzdQLEVBQUk2UCxhQUFhRCxLQUFLNVAsR0FDcEM4RyxVQUFXOUcsRUFBSThHLFVBQVU4SSxLQUFLNVAsR0FDOUI4UCxZQUFhOVAsRUFBSThQLFlBQVlGLEtBQUs1UCxHQUNsQ3NFLE9BQVF0RSxFQUFJc0UsT0FBT3NMLEtBQUs1UCxHQUN4QitQLFlBQWEvUCxFQUFJK1AsWUFBWUgsS0FBSzVQLEdBQ2xDc0ssR0FBSXRLLEVBQUlzSyxHQUFHc0YsS0FBSzVQLEdBQ2hCZ1EsS0FBTWhRLEVBQUlnUSxLQUFLSixLQUFLNVAsR0FDcEJpUSxlQUFnQmpRLEVBQUlpUSxlQUFlTCxLQUFLNVAsR0FDeENrUSxJQUFLbFEsRUFBSWtRLElBQUlOLEtBQUs1UCxHQUNsQm1RLG1CQUFvQm5RLEVBQUltUSxtQkFBbUJQLEtBQUs1UCxHQUNoRG9RLGdCQUFpQnBRLEVBQUlvUSxnQkFBZ0JSLEtBQUs1UCxHQUMxQ3FRLGdCQUFpQnJRLEVBQUlxUSxnQkFBZ0JULEtBQUs1UCxHQUMxQ3NRLFVBQVd0USxFQUFJc1EsVUFBVVYsS0FBSzVQLEdBQzlCdVEsYUFBY3ZRLEVBQUl1USxhQUFhWCxLQUFLNVAsR0FDcEN3USxLQUFNeFEsRUFBSXdRLEtBQUtaLEtBQUs1UCxHQUNwQnlRLGNBQWV6USxFQUFJeVEsY0FBY2IsS0FBSzVQLEdBQ3RDMFEsZ0JBQWlCMVEsRUFBSTBRLGdCQUFnQmQsS0FBSzVQLEdBQzFDMlEsb0JBQXFCM1EsRUFBSTJRLG9CQUFvQmYsS0FBSzVQLEdBQ2xENFEsV0FBWTVRLEVBQUk0USxXQUFXaEIsS0FBSzVQLEtEMUJwQjZRLENBQWM3RixLQUFLaEwsS0FDL0IsSUFFRSxJQUFLaUUsTUFBTUMsUUFBUU0sR0FDakIsTUFBTSxJQUFJb0ssTUFBTSwyQkFXbEIsT0FUQTVPLEVBQUl3RSxNQUFRQSxFQUNaeEUsRUFBSXVQLE9BQVMsU0FHUHZFLEtBQUs4RixnQkFBZ0I5USxTQUNyQmdMLEtBQUsrRixZQUFZL1EsU0FDakJnTCxLQUFLZ0csYUFBYWhSLFNBQ2xCZ0wsS0FBS2lHLFNBQVNqUixTQUNkZ0wsS0FBS2tHLFlBQVlsUixHQUNoQkEsRUFDUCxNQUFPYyxHQUtQLEdBSkFkLEVBQUllLElBQUkyQyxLQUFLaUosR0FBY3dFLFFBQzNCblIsRUFBSXdRLEtBQUs3RCxHQUFjeUUsaUJBQWtCLEdBQ3pDcFIsRUFBSXdRLEtBQUs3RCxHQUFjd0UsT0FBUXJRLEdBQy9CZCxFQUFJZSxJQUFJQyxNQUFNRixHQUNWZCxFQUFJK0YsVUFBK0IsU0FDckMsTUFBTWpGLEVBRVIsT0FBT2QsR0FJSGdGLHNCQUF1QmhGLEdBSzdCLE9BSkFBLEVBQUl3USxLQUFLN0QsR0FBY3lFLGdCQUFpQixHQUN4Q3BSLEVBQUl3USxLQUFLN0QsR0FBYzBFLGlCQUFrQnJSLEdBQ3pDQSxFQUFJZSxJQUFJdUYsS0FBSywwQkFDUDBFLEtBQUtzRyxjQUFjdFIsRUFBSXlGLE9BQU84TCx1QkFBd0J2UixHQUNyREEsRUFHRGdGLGtCQUFtQmhGLEdBQ3pCQSxFQUFJd1EsS0FBSzdELEdBQWN5RSxnQkFBaUIsSUFDeEMsTUFBTXpMLEVBQU8zRixFQUFJK0YsVUFBK0IsdUJBQXlCLE9BQ3pFLElBQUl5TCxFQUFxQjdMLEVBQ3JCZ0IsRUFBYzNHLEVBQUl5RixPQUFPa0IsWUFBWWpCLElBQUlDLEdBUTdDLE9BUEtnQixJQUNIQSxFQUFjM0csRUFBSXlGLE9BQU9rQixZQUFZakIsSUFBSSxRQUN6QzhMLEVBQXFCLE9BQ3JCeFIsRUFBSWUsSUFBSTJDLEtBQUssNEJBQTRCaUMsNENBRTNDM0YsRUFBSWUsSUFBSXVGLEtBQUssMkNBQTJDa0wsWUFDbEQ3SyxNQUFBQSxTQUFBQSxFQUFhNUcsT0FBT0MsSUFDbkJBLEVBR0RnRixtQkFBb0JoRixHQUsxQixPQUpBQSxFQUFJd1EsS0FBSzdELEdBQWN5RSxnQkFBaUIsSUFDeENwUixFQUFJZSxJQUFJdUYsS0FBSyxpQkFDYnRHLEVBQUl3USxLQUFLN0QsR0FBYzhFLGNBQWV6UixTQUNoQ2dMLEtBQUtzRyxjQUFjdFIsRUFBSXlGLE9BQU9pTSxvQkFBcUIxUixHQUNsREEsRUFHRGdGLGVBQWdCaEYsR0FDdEIsSUFBSTJGLEVBQU8zRixFQUFJK0YsVUFBK0Isb0JBQXNCL0YsRUFBSStGLFVBQStCLG1CQUFxQixPQUN4SFUsRUFBV3pHLEVBQUl5RixPQUFPZ0IsU0FBU2YsSUFBSUMsR0FDbkM2TCxFQUFxQjdMLEVBQ3BCYyxJQUNIZCxFQUFPLE9BQ1A2TCxFQUFxQixPQUNyQi9LLEVBQVd6RyxFQUFJeUYsT0FBT2dCLFNBQVNmLElBQUksUUFDbkMxRixFQUFJZSxJQUFJMkMsS0FBSyx5QkFBeUJpQyx5Q0FFeEMzRixFQUFJZSxJQUFJdUYsS0FBSyxxQ0FBcUNrTCxZQUM1Qy9LLE1BQUFBLFNBQUFBLEVBQVUxRyxPQUFPQyxJQUN2QixJQUFLLE1BQU0yUixLQUFhM1IsRUFBSXVQLE9BQzFCb0MsRUFBVWhNLEtBQU9BLEVBRW5CLE9BQU8zRixFQUdEZ0Ysa0JBQW1CaEYsR0FDekJBLEVBQUl3USxLQUFLN0QsR0FBY2lGLGFBQWM1UixHQUNyQ0EsRUFBSXdRLEtBQUs3RCxHQUFjeUUsZ0JBQWlCLFdBQ2xDcEcsS0FBS3NHLGNBQWN0UixFQUFJeUYsT0FBT29NLG1CQUFvQjdSLEdBQ3hELElBQUkrTSxFQUFNLEdBQ1YsTUFBTTFJLEVBQVNyRSxFQUFJdVAsT0FBT2xMLE9BQzFCLElBQUssSUFBSXlOLEVBQUksRUFBR0EsRUFBSXpOLEVBQVF5TixTQUNVLElBQXpCOVIsRUFBSXVQLE9BQU91QyxHQUFHQyxTQUN2QmhGLEdBQU94TCxFQUFnQnZCLEVBQUl1UCxPQUFPdUMsR0FBR0MsUUFDakNELElBQU16TixFQUFTLElBQ2pCMEksR0FBTyxjQUdKL00sRUFBSXVQLE9BQU91QyxHQUFHRSxtQkFDZGhTLEVBQUl1UCxPQUFPdUMsR0FBR0csT0FJdkIsT0FGQWpTLEVBQUl3USxLQUFLN0QsR0FBY3VGLFNBQVVsUyxHQUNqQ0EsRUFBSWUsSUFBSXNGLFFBQVEsS0FBSzBHLEtBQ2QvTSxFQUdEZ0Ysb0JBQXFCbU4sRUFBcUNuUyxHQUNoRSxNQUFNUSxFQUFVMlIsRUFBaUJyRyxVQUMzQnNHLEVBQWNELEVBQWlCdE0sWUFDL0J3TSxFQUFnQkYsRUFBaUJ0RyxVQVV2QyxhQVRNeUcsUUFBUUMsSUFBSS9SLEVBQVFrRSxLQUFJTSxNQUFPbUIsRUFBaUJxTSxLQUNwRCxJQUNFeFMsRUFBSWUsSUFBSXVGLEtBQUssR0FBRytMLE1BQWtCRCxFQUFZSSxvQkFDeENyTSxFQUFPcEcsT0FBT0MsR0FDcEIsTUFBT2MsR0FFUCxNQURBZCxFQUFJZSxJQUFJQyxNQUFNLEdBQUdxUixNQUFrQkQsRUFBWUksWUFDekMxUixPQUdIZCxHRTNIWCxNQUFNeVMsR0FBYyxDQUFDQyxFQUFrQkMsRUFBZUMsRUFBa0JDLEVBQWUsTUFFOUUsQ0FDTEMsT0FBUSxPQUNSelIsSUFBSyxXQUhRd1IsR0FBZ0Isd0JBSTdCRSxRQUFTLENBQ1BDLFlBQWEsc0JBQ2IsYUFBYyxRQUNkQyxjQUFlTCxHQUVqQk0sU0FBVSxDQUNSQyxPQUFRLENBQ05DLE1BQU9ULEVBQ1BoUyxRQUFTLENBQ1AwUyxTQUFVWCxJQUdkWSxJQUFLLFVBS0x2VCxHQUFTaUYsTUFBT2hGLElBQ3BCLE1BQU11VCxFQUFhdlQsRUFBSStGLFVBQXVCLGVBQzlDLElBQUt3TixFQUNILE1BQU0sSUFBSTNFLE1BQU0sNkJBRWxCLE1BQU00RSxFQUFVeFQsRUFBSXVQLE9BQ3BCLElBQUssTUFBTWtFLEtBQU9ELEVBQ2hCLEdBQUlDLEVBQUlmLFVBQVllLEVBQUl4QixPQUFRLENBQzlCLElBQUlVLEVBQVFjLEVBQUl4QixRQUNYVSxHQUFTYyxFQUFJekIsY0FDaEJXLEVBQVE1SixPQUFPMkssS0FBS0QsRUFBSXpCLFlBQWEsV0FFdkMsTUFBTTJCLEVBQWFsQixHQUFZZ0IsRUFBSWYsU0FBVUMsRUFBT1ksTUFBQUEsU0FBQUEsRUFBWUssTUFBT0wsTUFBQUEsU0FBQUEsRUFBWVYsY0FDbkYsSUFDRSxNQUFNZ0IsUUFBb0I3VCxFQUFJMlAsUUFBUWdFLEdBQ2hDRyxFQUFPekwsS0FBSzBMLE1BQU1GLEdBQ3hCLEdBQWtCLFlBQWRDLEVBQUtFLFlBQ0FQLEVBQUl6QixtQkFDSnlCLEVBQUl4QixPQUNYd0IsRUFBSTFCLE9BQVMrQixFQUFLNUwsS0FBSzdHLElBQ3ZCb1MsRUFBSVEsS0FBT0gsRUFBSzVMLEtBQUsrTCxTQUNoQixDQUFBLEdBQWtCLG1CQUFkSCxFQUFLRSxNQUFvRCxpQkFBaEJGLEVBQUtJLE9BU3ZELE1BSkFsVSxFQUFJd1EsS0FBSzdELEdBQWN3SCxhQUFjLENBQ25DQyxNQUFPcFUsRUFBSXlLLEtBQUs0SixVQUF1QixpQkFDdkNQLEtBQU1BLEVBQUtoTyxVQUVQLElBQUk4SSxNQUFNa0YsVUFSVEwsRUFBSXpCLG1CQUNKeUIsRUFBSXhCLE9BQ1h3QixFQUFJMUIsT0FBUytCLEVBQUtJLFFBUXBCLE1BQU9wVCxHQUVQLE1BREFkLEVBQUllLElBQUlDLE1BQU1GLEdBQ1IsSUFBSThOLE1BQU05TixJQUl0QixPQUFPZCxHQUdIbUIsR0FBVW5CLElBQ2QsTUFBTXNVLEVBQWF0VSxFQUFJK0YsVUFBdUIsZ0JBQWtCLEdBc0JoRSxNQXJCZ0MsQ0FDOUIsQ0FDRTdELEtBQU0sUUFDTjRELFFBQVMsWUFDVEgsS0FBTSxXQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHNCQUN0RDNOLFFBQVM0TixFQUFXVixPQUFTLEdBQzdCVyxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sZUFDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsOEJBQ25Edk8sY0FDRixPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1QixzQ0FFckNoVSxZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsOEJBQ3REM04sUUFBUzROLEVBQVd6QixjQUFnQixHQUNwQzBCLFVBQVUsS0N4RWhCLE1BQU1FLEdBQW9CLENBQUM5VCxFQUF1QitSLEtBQ2hELE1BQU1nQyxFQUFXL1QsRUFBUStULFNBQ25CQyxFQUFZaFUsRUFBUWdVLFVBQ3BCQyxFQUFRalUsRUFBUWlVLE1BQ2hCQyxFQUFTbFUsRUFBUWtVLE9BQ3ZCLElBQUlDLEVBQ0FDLEVBQW1CLEdBQ3ZCLEdBQUtwVSxFQUFRd0wsU0FBK0IsT0FBcEJ4TCxFQUFRd0wsUUFVekIsQ0FFTCxNQUFNNkksRUFBUUMsS0FBS0MsT0FBTSxJQUFJQyxNQUFPQyxVQUFZLEtBRWhETCxFQUFXLEdBQUdDLEtBREdBLEVBQVEsUUFFekIsTUFBTUssRUFBVUMsRUFBT0MsV0FBVyxPQUFRWixHQUFXelQsT0FBTzZULEdBQVVTLE9BQU8sT0FDdkVDLEVBQWEsU0FBUzlVLEVBQVEyQixPQUFPb1EsYUFBb0IvUixFQUFRa1UsY0FBY2xVLEVBQVErVSxzQkFFdkZDLEVBQWUsU0FBU1osTUFETE8sRUFBT00sV0FBVyxRQUFRMVUsT0FBT3VVLEdBQVlELE9BQU8sV0FFN0VWLEVBQVlRLEVBQU9DLFdBQVcsT0FBUUYsR0FBU25VLE9BQU95VSxHQUFjSCxPQUFPLFdBbkIzQixDQUNoRCxNQUFNSyxFQUFTWixLQUFLQyxNQUFzQixLQUFoQkQsS0FBS1ksVUFDekJDLEVBQVViLEtBQUtDLE9BQU0sSUFBSUMsTUFBT0MsVUFBWSxLQUFRLEVBR3BEVyxFQUFpQixLQUFLbkIsT0FBV0MsT0FBWUgsT0FGbkNvQixFQUFVLFVBRW9EQSxPQUFhRCxPQUVyRkcsRUFBYVYsRUFBT0MsV0FBVyxPQUFRWixHQUFXelQsT0FBTzZVLEdBQWdCUCxTQUN6RVMsRUFBYWxOLE9BQU9tTixPQUFPLENBQUNGLEVBQVlqTixPQUFPMkssS0FBS3FDLEtBQzFEakIsRUFBWS9MLE9BQU8ySyxLQUFLdUMsR0FBWUUsU0FBUyxVQVkvQyxNQUFPLENBQ0xyQixVQUFBQSxFQUNBRixNQUFBQSxFQUNBQyxPQUFBQSxFQUNBRSxTQUFBQSxJQUlFdEMsR0FBYyxDQUFDOVIsRUFBdUIrUixFQUFrQm9DLEVBQXVCbkMsRUFBZXhHLEtBQ2xHLE1BQU11SixFQUFPL1UsRUFBUStVLEtBQ2ZwVCxFQUFPM0IsRUFBUTJCLEtBQ3JCLE9BQUszQixFQUFRd0wsU0FBK0IsT0FBcEJ4TCxFQUFRd0wsUUFpQnZCLENBQ0wyRyxPQUFRLE1BQ1J6UixJQUFLLFVBQVVWLEVBQVFrVSxjQUFjbFUsRUFBUStVLHFCQUFxQlUsbUJBQW1COVQsS0FBUThULG1CQUFtQjFELEtBQ2hISyxRQUFTLENBQ1BzRCxLQUFNLEdBQUcxVixFQUFRa1UsY0FBY2xVLEVBQVErVSxvQkFDdkN6QyxjQUFlLDhCQUE4QnRTLEVBQVErVCx3QkFBd0JJLEVBQVVDLHVCQUF1QkQsRUFBVUMsNkRBQTZERCxFQUFVQSxZQUMvTDlCLFlBQWFzRCxFQUFLQyxPQUFPN0QsR0FDekI4RCxVQUFXLFNBQVNySyxlQUV0QjJILEtBQU1uQixFQUNOOEQseUJBQXlCLEdBMUJwQixDQUNMM0QsT0FBUSxPQUNSelIsSUFBSyxVQUFVcVUsZ0NBQW1DWixFQUFVRixTQUFTRSxFQUFVRCxVQUFVblQsVUFBVVksS0FBUW9RLElBQzNHSyxRQUFTLENBQ1BzRCxLQUFNLEdBQUdYLHNCQUNUekMsY0FBZTZCLEVBQVVBLFVBQ3pCOUIsWUFBYSxzQkFDYndELFVBQVcsU0FBU3JLLGVBRXRCK0csU0FBVSxDQUNSd0QsR0FBSSxTQUNKQyxZQUFhaEUsR0FFZjhELHlCQUF5QixJQWtCekIxVyxHQUFTaUYsTUFBT2hGLGNBQ3BCLE1BQU00VyxFQUFlNVcsRUFBSStGLFVBQXdCLGdCQUNqRCxJQUFLNlEsRUFDSCxNQUFNLElBQUloSSxNQUFNLGlDQUVsQixJQUNFLE1BQU00RSxFQUFVeFQsRUFBSXVQLE9BQ2RzSCxFQUFZRCxFQUFhQyxVQUN6QnZVLEVBQU9zVSxFQUFhdFUsS0FDcEJ3VSxHQUFTRixFQUFhekssU0FBb0MsT0FBekJ5SyxFQUFhekssUUFDcEQsSUFBSyxNQUFNc0gsS0FBT0QsRUFDaEIsR0FBSUMsRUFBSWYsVUFBWWUsRUFBSXhCLE9BQVEsQ0FDOUIsTUFBTTZDLEVBQVlMLEdBQWtCbUMsRUFBY25ELEVBQUlmLFVBQ3RELElBQUtvQyxFQUNILE9BQU8sRUFFVCxJQUFJbkMsRUFBUWMsRUFBSXhCLFFBQ1hVLEdBQVNjLEVBQUl6QixjQUNoQlcsRUFBUTVKLE9BQU8ySyxLQUFLRCxFQUFJekIsWUFBYSxXQUV2QyxNQUFNclIsRUFBVThSLEdBQVltRSxFQUFjbkQsRUFBSWYsU0FBVW9DLEVBQVduQyxFQUFPM1MsRUFBSTBQLGFBQWUxUCxFQUFJeVAsU0FDM0ZvRSxRQUFZN1QsRUFBSTJQLFFBQVFoUCxHQUMzQnlKLE1BQU15SixHQUFhQSxJQUNuQmhULE9BQU9pSixJQUNDLENBQ0xpTixXQUFZLElBQ1pqRCxLQUFNLENBQ0ovRyxJQUFLL00sRUFBSXlLLEtBQUs0SixVQUF1QixlQUNyQ3ZLLElBQUFBLE9BSVIsSUFBSWdLLEVBTUosR0FKRUEsRUFERWdELEdBQXdCLGlCQUFSakQsRUFDWHhMLEtBQUswTCxNQUFNRixHQUVYQSxFQUVlLE1BQXBCQyxFQUFLaUQsV0FDUCxnQkFBSWpELE1BQUFBLFNBQUFBLEVBQU1BLDJCQUFNaEssS0FDUmdLLEVBQUtBLEtBQUtoSyxJQUVWLElBQUk4RSxpQkFBTWtGLE1BQUFBLFNBQUFBLEVBQU1BLDJCQUFNL0csaUJBQU8rRyxNQUFBQSxTQUFBQSxFQUFNQSwyQkFBTWhPLFVBR25ELE1BQU1rUixFQUFZSixFQUFhalcsU0FBVyxHQUMxQyxHQUFJbVcsR0FBMEIsWUFBakJoRCxFQUFLaE8sZUFDVDJOLEVBQUl6QixtQkFDSnlCLEVBQUl4QixPQUVUd0IsRUFBSTFCLE9BREY4RSxFQUNXLEdBQUdBLEtBQWF2VSxJQUFPbVIsRUFBSWYsV0FFM0IsR0FBR29CLEVBQUs1TCxLQUFLK08sYUFBdUJELFFBRTlDLENBQUEsR0FBS0YsSUFBU2hELEdBQTRCLE1BQXBCQSxFQUFLaUQsV0FTaEMsTUFBTSxJQUFJbkksTUFBTWlGLEVBQUlDLEtBQUsvRyxZQVJsQjBHLEVBQUl6QixtQkFDSnlCLEVBQUl4QixPQUVUd0IsRUFBSTFCLE9BREY4RSxFQUNXLEdBQUdBLEtBQWFuVixVQUFVWSxLQUFRWixVQUFVK1IsRUFBSWYsWUFBWXNFLElBRTVELFdBQVdKLEVBQWEvQixjQUFjK0IsRUFBYWxCLHFCQUFxQmhVLFVBQVVZLEtBQVFaLFVBQVUrUixFQUFJZixZQUFZc0UsS0FPekksT0FBT2hYLEVBQ1AsTUFBTzhKLEdBQ1AsSUFBSzhNLEVBQWF6SyxTQUFvQyxPQUF6QnlLLEVBQWF6SyxRQUN4QyxJQUNFLE1BQU0ySCxFQUFPekwsS0FBSzBMLE1BQU1qSyxFQUFJOUksT0FDNUJoQixFQUFJd1EsS0FBSzdELEdBQWN3SCxhQUFjLENBQ25DQyxNQUFPcFUsRUFBSXlLLEtBQUs0SixVQUF1QixpQkFDdkNQLEtBQU05VCxFQUFJeUssS0FBSzRKLFVBQXVCLHVCQUF3QixDQUM1REwsS0FBTUYsRUFBS0UsT0FFYmtELEtBQU0sd0RBRVIsTUFBT3BXLElBRVgsTUFBTWdKLElBSUozSSxHQUFVbkIsSUFDZCxNQUFNc1UsRUFBYXRVLEVBQUkrRixVQUF3QixpQkFBbUIsR0E2RWxFLE1BNUVnQyxDQUM5QixDQUNFN0QsS0FBTSxVQUNOeUQsS0FBTSxPQUNOdEYsTUFBT0wsRUFBSXlLLEtBQUs0SixVQUF1QiwrQkFDdkN6TyxRQUFTLENBQUMsS0FBTSxNQUNoQmMsUUFBUyxLQUNUNk4sVUFBVSxHQUVaLENBQ0VyUyxLQUFNLFdBQ055RCxLQUFNLFFBQ0Z0RixZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsaUNBQ3REM04sUUFBUzROLEVBQVdJLFVBQVksR0FDaENILFVBQVUsR0FFWixDQUNFclMsS0FBTSxZQUNOeUQsS0FBTSxXQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLGtDQUN0RDNOLFFBQVM0TixFQUFXSyxXQUFhLEdBQ2pDSixVQUFVLEdBRVosQ0FDRXJTLEtBQU0sU0FDTnlELEtBQU0sUUFDRnRGLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QiwrQkFDdEQzTixRQUFTNE4sRUFBV08sUUFBVSxHQUM5Qk4sVUFBVSxHQUVaLENBQ0VyUyxLQUFNLFFBQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLDhCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1Qiw4QkFDdEQzTixRQUFTNE4sRUFBV00sT0FBUyxHQUN6QjlPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsc0NBQ3hERSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sT0FDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsNkJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLDZCQUN0RDNOLFFBQVM0TixFQUFXb0IsTUFBUSxHQUN4QjVQLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIscUNBQ3hERSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sT0FDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsNkJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLDZCQUN0RDNOLFFBQVM0TixFQUFXaFMsTUFBUSxHQUN4QndELGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIscUNBQ3hERSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sWUFDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsa0NBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLGtDQUN0RDNOLFFBQVM0TixFQUFXdUMsV0FBYSxHQUM3Qi9RLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsMENBQ3hERSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sVUFDTnlELEtBQU0sUUFDTmUsUUFBUzROLEVBQVczVCxTQUFXLEdBQzNCNlQsYUFBWSxPQUFPeFUsRUFBSXlLLEtBQUs0SixVQUF1QixnQ0FDbkRoVSxZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsZ0NBQ2xEdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1Qix3Q0FDeERFLFVBQVUsS0NqUGhCLE1BQU05QixHQUFjLENBQUNDLEVBQWtCL1IsRUFBd0J1SCxLQUM3RCxNQUFNNUYsRUFBTzNCLEVBQVEyQixNQUFRLElBQ3ZCc1IsTUFBRUEsRUFBS3VELEtBQUVBLEdBQVN4VyxFQUN4QixNQUFPLENBQ0xtUyxPQUFRLE1BQ1J6UixJQUFLLGdDQUFnQzhWLGNBQWlCelYsVUFBVVksS0FBUVosVUFBVWdSLEtBQ2xGSyxRQUFTLENBQ1BFLGNBQWUsU0FBU1csSUFDeEIsYUFBYyxRQUNkLGVBQWdCMEMsRUFBS0MsT0FBTzdELElBRTlCb0IsS0FBTTVMLEVBQ05rUCxNQUFNLElBSUpyWCxHQUFTaUYsTUFBT2hGLElBQ3BCLE1BQU1xWCxFQUFnQnJYLEVBQUkrRixVQUF5QixpQkFDbkQsSUFBS3NSLEVBQ0gsTUFBTSxJQUFJekksTUFBTSw0QkFFbEIsSUFDRSxNQUFNNEUsRUFBVXhULEVBQUl1UCxPQUNwQixJQUFLLE1BQU1rRSxLQUFPRCxFQUNoQixHQUFJQyxFQUFJZixVQUFZZSxFQUFJeEIsT0FBUSxDQUM5QixNQUFNRCxFQUFjeUIsRUFBSXpCLGFBQWVqSixPQUFPMkssS0FBS0QsRUFBSXhCLFFBQVFrRSxTQUFTLFVBQ2xFak8sRUFBTyxDQUNYcEMsUUFBUyxrQkFDVHdSLE9BQVFELEVBQWNDLE9BQ3RCek8sUUFBU21KLEVBQ1QxUCxLQUFNK1UsRUFBYy9VLEtBQU9aLFVBQVUrUixFQUFJZixXQUVyQ2lCLEVBQWFsQixHQUFZZ0IsRUFBSWYsU0FBVTJFLEVBQWVuUCxHQUN0RDRMLFFBS0k5VCxFQUFJMlAsUUFBUWdFLEdBQ3RCLElBQUlHLEVBVUYsTUFBTSxJQUFJbEYsTUFBTSx5Q0FUVDZFLEVBQUl6QixtQkFDSnlCLEVBQUl4QixPQUNQb0YsRUFBY1IsVUFDaEJwRCxFQUFJMUIsT0FBUyxHQUFHc0YsRUFBY1IsYUFBYVEsRUFBYy9VLE9BQU9tUixFQUFJZixXQUVwRWUsRUFBSTFCLE9BQVMrQixFQUFLakwsUUFBUTBPLGFBRTVCOUQsRUFBSVEsS0FBT0gsRUFBS2pMLFFBQVEyTyxJQU05QixPQUFPeFgsRUFDUCxNQUFPOEosR0FLUCxNQUpBOUosRUFBSXdRLEtBQUs3RCxHQUFjd0gsYUFBYyxDQUNuQ0MsTUFBT3BVLEVBQUl5SyxLQUFLNEosVUFBdUIsaUJBQ3ZDUCxLQUFNOVQsRUFBSXlLLEtBQUs0SixVQUF1QixnQ0FFbEN2SyxJQUlKM0ksR0FBVW5CLElBQ2QsTUFBTXNVLEVBQWF0VSxFQUFJK0YsVUFBeUIsa0JBQW9CLEdBOENwRSxNQTdDZ0MsQ0FDOUIsQ0FDRTdELEtBQU0sT0FDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsdUJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHVCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsK0JBQ3hEM04sUUFBUzROLEVBQVc2QyxNQUFRLEdBQzVCNUMsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLFNBQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLHlCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1Qix5QkFDbER2TyxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLGlDQUN4RDNOLFFBQVM0TixFQUFXZ0QsUUFBVSxTQUM5Qi9DLFVBQVUsR0FFWixDQUNFclMsS0FBTSxRQUNOeUQsS0FBTSxXQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHdCQUN0RDNOLFFBQVM0TixFQUFXVixPQUFTLEdBQzdCVyxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sT0FDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsdUJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHVCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsK0JBQ3hEM04sUUFBUzROLEVBQVdoUyxNQUFRLEdBQzVCaVMsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLFlBQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLDRCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1Qiw0QkFDbER2TyxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLG9DQUN4RDNOLFFBQVM0TixFQUFXdUMsV0FBYSxHQUNqQ3RDLFVBQVUsS0MxR2hCLFNBQVM5QixHQUFhOVIsRUFBdUIrUixFQUFrQmtCLEVBQWU2RCxHQUM1RSxNQUFNL0IsRUFjUixTQUFxQkEsR0FDbkIsTUFBZ0IsT0FBVEEsRUFBZ0IsR0FBSyxJQUFNQSxFQWZyQmdDLENBQVcvVyxFQUFRK1UsTUFBUSxNQUNsQ3BULEVBQU8zQixFQUFRMkIsTUFBUSxHQUU3QixNQUFPLENBQ0x3USxPQUFRLE9BQ1J6UixJQUFLLGdCQUFnQnFVLDhCQUhBM00sT0FBTzJLLEtBQUtwUixFQUFPb1EsRUFBVSxTQUFTeUQsU0FBUyxVQUFVaE0sUUFBUSxNQUFPLEtBQUtBLFFBQVEsTUFBTyxPQUlqSDRJLFFBQVMsQ0FDUEUsY0FBZSxXQUFXVyxJQUMxQixlQUFnQjBDLEVBQUtDLE9BQU83RCxJQUFhLDRCQUUzQ29CLEtBQU0yRCxHQVFWLFNBQVNFLEdBQVVDLEdBQ2pCLE1BQU1DLEVBQVlELEVBQWFDLFVBQ3pCbEQsRUFBWWlELEVBQWFqRCxVQUN6Qm1ELEVBQU0sSUFBSUMsRUFBTUMsS0FBS3hDLE9BQU95QyxJQUFJSixFQUFXbEQsR0FDM0NoVSxFQUFVLENBQ2RxQyxNQUFPNFUsRUFBYS9DLFFBR3RCLE9BRGtCLElBQUlrRCxFQUFNRyxHQUFHQyxVQUFVeFgsR0FDeEJ5WCxZQUFZTixHQUcvQixNQUFNL1gsR0FBU2lGLE1BQU9oRixJQUNwQixNQUFNNFgsRUFBZTVYLEVBQUkrRixVQUF3QixnQkFDakQsSUFBSzZSLEVBQ0gsTUFBTSxJQUFJaEosTUFBTSwyQkFFbEIsSUFDRSxNQUFNNEUsRUFBVXhULEVBQUl1UCxPQUNwQixJQUFLLE1BQU1rRSxLQUFPRCxFQUNoQixHQUFJQyxFQUFJZixVQUFZZSxFQUFJeEIsT0FBUSxDQUM5QixNQUFNRCxFQUFjeUIsRUFBSXpCLGFBQWVqSixPQUFPMkssS0FBS0QsRUFBSXhCLFFBQVFrRSxTQUFTLFVBQ2xFeFYsRUFBVThSLEdBQVltRixFQUFjbkUsRUFBSWYsU0FBVWlGLEdBQVNDLEdBQWU1RixHQUMxRTZCLFFBQVk3VCxFQUFJMlAsUUFBUWhQLEdBQ3hCbVQsRUFBT3pMLEtBQUswTCxNQUFNRixHQUN4QixLQUFJQyxNQUFBQSxTQUFBQSxFQUFNalEsS0FZUixNQUxBN0QsRUFBSXdRLEtBQUs3RCxHQUFjd0gsYUFBYyxDQUNuQ0MsTUFBT3BVLEVBQUl5SyxLQUFLNEosVUFBdUIsaUJBQ3ZDUCxLQUFNQSxFQUFLL0csTUFFYi9NLEVBQUllLElBQUlDLE1BQU0sY0FBZThTLEdBQ3ZCLElBQUlsRixNQUFNLGlCQVpILFFBQ042RSxFQUFJekIsbUJBQ0p5QixFQUFJeEIsT0FDWCxNQUFNb0csRUFBVVQsRUFBYXZXLElBQ3ZCVixFQUFVaVgsRUFBYWpYLFFBQzdCOFMsRUFBSTFCLE9BQVMsR0FBR3NHLEtBQVd2RSxFQUFLalEsTUFBZ0JsRCxLQVd0RCxPQUFPWCxFQUNQLE1BQU84SixHQUNQLEdBQW9CLGtCQUFoQkEsRUFBSWhFLFNBRUZnRSxFQUFJd08sU0FBVSxDQUNoQixNQUFNdFgsRUFBUThJLEVBQUl3TyxTQUFTeEUsS0FDM0I5VCxFQUFJd1EsS0FBSzdELEdBQWN3SCxhQUFjLENBQ25DQyxNQUFPcFUsRUFBSXlLLEtBQUs0SixVQUF1QixpQkFDdkNQLEtBQU05UyxFQUFNQSxRQUlsQixNQUFNOEksSUFJSjNJLEdBQVVuQixJQUNkLE1BQU1zVSxFQUFhdFUsRUFBSStGLFVBQXdCLGlCQUFtQixHQTREbEUsTUEzRGdDLENBQzlCLENBQ0U3RCxLQUFNLFlBQ055RCxLQUFNLFFBQ0Z0RixZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsMkJBQ3REM04sUUFBUzROLEVBQVd1RCxXQUFhLEdBQ2pDdEQsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLFlBQ055RCxLQUFNLFdBQ0Z0RixZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsMkJBQ3REM04sUUFBUzROLEVBQVdLLFdBQWEsR0FDakNKLFVBQVUsR0FFWixDQUNFclMsS0FBTSxTQUNOeUQsS0FBTSxRQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHdCQUN0RDNOLFFBQVM0TixFQUFXTyxRQUFVLEdBQzlCTixVQUFVLEdBRVosQ0FDRXJTLEtBQU0sTUFDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIscUJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHFCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsNkJBQ3hEM04sUUFBUzROLEVBQVdqVCxLQUFPLEdBQzNCa1QsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLE9BQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLHNCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QixzQkFDbER2TyxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLDhCQUN4RDNOLFFBQVM0TixFQUFXb0IsTUFBUSxHQUM1Qm5CLFVBQVUsR0FFWixDQUNFclMsS0FBTSxVQUNOeUQsS0FBTSxRQUNGNk8sYUFBWSxPQUFPeFUsRUFBSXlLLEtBQUs0SixVQUF1Qix5QkFDbkRoVSxZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIseUJBQ2xEdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1QixpQ0FDeEQzTixRQUFTNE4sRUFBVzNULFNBQVcsR0FDL0I0VCxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sT0FDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsc0JBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHNCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsOEJBQ3hEM04sUUFBUzROLEVBQVdoUyxNQUFRLEdBQzVCaVMsVUFBVSxLQ3ZJaEIsTUFBTTlCLEdBQWMsQ0FBQzlSLEVBQXVCK1IsRUFBa0IrRSxLQUM1RCxNQUNNYyxFQUFzQixDQUMxQnpGLE9BQVEsT0FDUnpSLElBQUssZ0NBQ0wwUixRQUFTLENBQ1BFLGNBQWUsYUFMRnRTLEVBQVE2WCxXQU1yQixlQUFnQixzQkFDaEJuQyxLQUFNLGdCQUNOLGFBQWMsU0FFaEJuRCxTQUFVLENBQ1JQLE1BQU84RSxFQUNQOVIsS0FBTSxTQUNOekQsS0FBTXdRLElBTVYsT0FISS9SLEVBQVFGLFFBQ1Y4WCxFQUFJOVgsTUFBUUUsRUFBUUYsT0FFZjhYLEdBR0h4WSxHQUFTaUYsTUFBT2hGLFVBQ3BCLE1BQU15WSxFQUFlelksRUFBSStGLFVBQXdCLGdCQUNqRCxJQUFLMFMsRUFDSCxNQUFNLElBQUk3SixNQUFNLDJCQUVsQixJQUNFLE1BQU00RSxFQUFVeFQsRUFBSXVQLE9BQ3BCLElBQUssTUFBTWtFLEtBQU9ELEVBQ2hCLEdBQUlDLEVBQUlmLFVBQVllLEVBQUl4QixPQUFRLENBQzlCLE1BQU1ELEVBQWN5QixFQUFJekIsYUFBZWpKLE9BQU8ySyxLQUFLRCxFQUFJeEIsUUFBUWtFLFNBQVMsVUFDbEV4VixFQUFVOFIsR0FBWWdHLEVBQWNoRixFQUFJZixTQUFVVixHQUNsRDZCLFFBQW9CN1QsRUFBSTJQLFFBQVFoUCxHQUNoQ21ULEVBQXNCLGlCQUFSRCxFQUFtQnhMLEtBQUswTCxNQUFNRixHQUFPQSxFQUN6RCxJQUFJQyxFQUFLek4sUUFNUCxNQUFNLElBQUl1SSxNQUFNLHlDQUxUNkUsRUFBSXpCLG1CQUNKeUIsRUFBSXhCLE9BQ1h3QixFQUFJMUIsT0FBUytCLEVBQUs1TCxLQUFLd1EsS0FDdkJqRixFQUFJUSxLQUFPSCxFQUFLNUwsS0FBS3lRLFdBTTNCLE9BQU8zWSxFQUNQLE1BQU84SixHQU9QLE1BTkE5SixFQUFJd1EsS0FBSzdELEdBQWN3SCxhQUFjLENBQ25DQyxNQUFPcFUsRUFBSXlLLEtBQUs0SixVQUF1QixpQkFDdkNQLEtBQU05VCxFQUFJeUssS0FBSzRKLFVBQXVCLDhCQUN0QzZDLEtBQU0sZ0RBR0ZwTixNQUFBQSxTQUFBQSxFQUFLd08sK0JBQVVwUSxPQUFRNEIsSUFJM0IzSSxHQUFVbkIsSUFDZCxNQUFNc1UsRUFBYXRVLEVBQUkrRixVQUF3QixpQkFBbUIsR0FtQmxFLE1BbEJnQyxDQUM5QixDQUNFN0QsS0FBTSxXQUNOeUQsS0FBTSxRQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLDBCQUN0RDNOLFFBQVM0TixFQUFXa0UsVUFBWSxHQUNoQ2pFLFVBQVUsR0FFWixDQUNFclMsS0FBTSxRQUNOeUQsS0FBTSxRQUNGNk8sYUFBWSxPQUFPeFUsRUFBSXlLLEtBQUs0SixVQUF1Qix1QkFDbkRoVSxZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsdUJBQ2xEdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1QiwrQkFDeEQzTixRQUFTNE4sRUFBVzdULE9BQVMsR0FDN0I4VCxVQUFVLEtDeEVoQixNQUFNRSxHQUFvQixDQUFDOVQsRUFBd0IrUixLQUNqRCxNQUFNa0csR0FBTyxJQUFJekQsTUFBTzBELGNBQ2xCQyxFQUFXeEMsRUFBS0MsT0FBTzdELEdBQzdCLElBQUtvRyxFQUFVLE1BQU1sSyxNQUFNLCtCQUErQjhELEtBRTFELE1BQU1xRyxFQUFhLFVBQVVELE1BQWFGLE9BQVVqWSxFQUFRa1UsVUFBVWxVLEVBQVEyQixPQUFPb1EsSUFFL0VvQyxFQUFZUSxFQUFPQyxXQUFXLE9BQVE1VSxFQUFRcVksaUJBQWlCOVgsT0FBTzZYLEdBQVl2RCxPQUFPLFVBQy9GLE1BQU8sT0FBTzdVLEVBQVFzWSxlQUFlbkUsS0FHakNyQyxHQUFjLENBQUM5UixFQUF3QitSLEVBQWtCb0MsRUFBbUJuQyxLQUN6RSxDQUNMRyxPQUFRLE1BQ1J6UixJQUFLLFdBQVdWLEVBQVFrVSxVQUFVbFUsRUFBUStVLHFCQUFxQmhVLFVBQVVmLEVBQVEyQixRQUFRWixVQUFVZ1IsS0FDbkdLLFFBQVMsQ0FDUHNELEtBQU0sR0FBRzFWLEVBQVFrVSxVQUFVbFUsRUFBUStVLG9CQUNuQ3pDLGNBQWU2QixFQUNmSyxNQUFNLElBQUlBLE1BQU8wRCxjQUNqQixlQUFnQnZDLEVBQUtDLE9BQU83RCxJQUU5Qm9CLEtBQU1uQixFQUNOOEQseUJBQXlCLElBSXZCMVcsR0FBU2lGLE1BQU9oRixJQUNwQixNQUFNa1osRUFBZ0JsWixFQUFJK0YsVUFBeUIsaUJBQ25ELElBQUttVCxFQUNILE1BQU0sSUFBSXRLLE1BQU0sZ0NBRWxCLElBQ0UsTUFBTTRFLEVBQVV4VCxFQUFJdVAsT0FDZHNILEVBQVlxQyxFQUFjckMsVUFDMUJ2VSxFQUFPNFcsRUFBYzVXLEtBQzNCLElBQUssTUFBTW1SLEtBQU9ELEVBQ2hCLEdBQUlDLEVBQUlmLFVBQVllLEVBQUl4QixPQUFRLENBQzlCLE1BQU02QyxFQUFZTCxHQUFrQnlFLEVBQWV6RixFQUFJZixVQUN2RCxJQUFJQyxFQUFRYyxFQUFJeEIsUUFDWFUsR0FBU2MsRUFBSXpCLGNBQ2hCVyxFQUFRNUosT0FBTzJLLEtBQUtELEVBQUl6QixZQUFhLFdBRXZDLE1BQU1yUixFQUFVOFIsR0FBWXlHLEVBQWV6RixFQUFJZixTQUFVb0MsRUFBV25DLEdBRXBFLEdBQXdCLGFBREwzUyxFQUFJMlAsUUFBUWhQLElBQ3RCb1csV0FVUCxNQUFNLElBQUluSSxNQUFNLGlCQVZXLFFBQ3BCNkUsRUFBSXpCLG1CQUNKeUIsRUFBSXhCLE9BQ1gsTUFBTStFLEVBQVlrQyxFQUFjdlksU0FBVyxHQUV6QzhTLEVBQUkxQixPQURGOEUsRUFDVyxHQUFHQSxLQUFhdlUsSUFBT21SLEVBQUlmLFdBQVdzRSxJQUV0QyxXQUFXa0MsRUFBY3JFLFVBQVVxRSxFQUFjeEQscUJBQXFCcFQsSUFBT21SLEVBQUlmLFdBQVdzRSxLQU9qSCxPQUFPaFgsRUFDUCxNQUFPOEosR0FLUCxNQUpBOUosRUFBSXdRLEtBQUs3RCxHQUFjd0gsYUFBYyxDQUNuQ0MsTUFBT3BVLEVBQUl5SyxLQUFLNEosVUFBdUIsaUJBQ3ZDUCxLQUFNOVQsRUFBSXlLLEtBQUs0SixVQUF1QixvQkFFbEN2SyxJQUlKM0ksR0FBVW5CLElBQ2QsTUFBTXNVLEVBQWF0VSxFQUFJK0YsVUFBeUIsa0JBQW9CLEdBNERwRSxNQTNEZ0MsQ0FDOUIsQ0FDRTdELEtBQU0sY0FDTnlELEtBQU0sUUFDRnRGLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QixnQ0FDdEQzTixRQUFTNE4sRUFBVzJFLGFBQWUsR0FDbkMxRSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sa0JBQ055RCxLQUFNLFdBQ0Z0RixZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsb0NBQ3REM04sUUFBUzROLEVBQVcwRSxpQkFBbUIsR0FDdkN6RSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sU0FDTnlELEtBQU0sUUFDRnRGLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QiwyQkFDdEQzTixRQUFTNE4sRUFBV08sUUFBVSxHQUM5Qk4sVUFBVSxHQUVaLENBQ0VyUyxLQUFNLE9BQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLHlCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1Qix5QkFDdEQzTixRQUFTNE4sRUFBV29CLE1BQVEsR0FDeEI1UCxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLGlDQUN4REUsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLE9BQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLHlCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1Qix5QkFDbER2TyxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLGlDQUN4RDNOLFFBQVM0TixFQUFXaFMsTUFBUSxHQUM1QmlTLFVBQVUsR0FFWixDQUNFclMsS0FBTSxZQUNOeUQsS0FBTSxRQUNGNk8sYUFBWSxPQUFPeFUsRUFBSXlLLEtBQUs0SixVQUF1Qiw4QkFDbkRoVSxZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIsOEJBQ2xEdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1QixzQ0FDeEQzTixRQUFTNE4sRUFBV3VDLFdBQWEsR0FDakN0QyxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sVUFDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsNEJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLDRCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsb0NBQ3hEM04sUUFBUzROLEVBQVczVCxTQUFXLEdBQy9CNFQsVUFBVSxLQzVIaEIsTUFBTUUsR0FBb0IsQ0FBQzlULEVBQXVCK1IsS0FDaEQsTUFBTXBRLEVBQU8zQixFQUFRMkIsTUFBUSxHQUN2QjZXLEVBQVd4WSxFQUFRd1ksU0FDbkJDLEVBQVd6WSxFQUFReVksU0FDbkJDLEVBQWNDLEVBQUlGLEdBQ2xCUixHQUFPLElBQUl6RCxNQUFPMEQsY0FFbEJ6RixFQUFRLE9BREYsSUFBSXpTLEVBQVFrVSxVQUFVblQsVUFBVVksS0FBUVosVUFBVWdSLFFBQ2xDa0csSUFFNUIsTUFBTyxTQUFTTyxLQURIN0QsRUFBT0MsV0FBVyxPQUFROEQsR0FBYW5ZLE9BQU9rUyxHQUFPb0MsT0FBTyxhQUlyRS9DLEdBQWMsQ0FBQzlSLEVBQXVCK1IsRUFBa0JvQyxFQUFtQm5DLEtBQy9FLE1BQU1rQyxFQUFTbFUsRUFBUWtVLE9BQ2pCdlMsRUFBTzNCLEVBQVEyQixNQUFRLEdBQzdCLE1BQU8sQ0FDTHdRLE9BQVEsTUFDUnpSLElBQUssNEJBQTRCd1QsS0FBVW5ULFVBQVVZLEtBQVFaLFVBQVVnUixLQUN2RUssUUFBUyxDQUNQRSxjQUFlNkIsRUFDZkssTUFBTSxJQUFJQSxNQUFPMEQsY0FDakIsZUFBZ0J2QyxFQUFLQyxPQUFPN0QsSUFBYSw0QkFFM0NvQixLQUFNbkIsRUFDTjhELHlCQUF5QixJQUl2QjFXLEdBQVNpRixNQUFPaEYsSUFDcEIsTUFBTXVaLEVBQWV2WixFQUFJK0YsVUFBd0IsZ0JBQ2pELElBQUt3VCxFQUNILE1BQU0sSUFBSTNLLE1BQU0sMkJBRWxCLElBQ0UsTUFBTTRFLEVBQVV4VCxFQUFJdVAsT0FDZGpOLEVBQU9pWCxFQUFhalgsTUFBUSxHQUNsQyxJQUFLLE1BQU1tUixLQUFPRCxFQUNoQixHQUFJQyxFQUFJZixVQUFZZSxFQUFJeEIsT0FBUSxDQUM5QixJQUFJVSxFQUFRYyxFQUFJeEIsUUFDWFUsR0FBU2MsRUFBSXpCLGNBQ2hCVyxFQUFRNUosT0FBTzJLLEtBQUtELEVBQUl6QixZQUFhLFdBRXZDLE1BQU04QyxFQUFZTCxHQUFrQjhFLEVBQWM5RixFQUFJZixVQUNoRC9SLEVBQVU4UixHQUFZOEcsRUFBYzlGLEVBQUlmLFNBQVVvQyxFQUFXbkMsR0FFbkUsR0FBd0IsYUFETDNTLEVBQUkyUCxRQUFRaFAsSUFDdEJvVyxXQUtQLE1BQU0sSUFBSW5JLE1BQU0sd0JBSlQ2RSxFQUFJekIsbUJBQ0p5QixFQUFJeEIsT0FDWHdCLEVBQUkxQixPQUFTLEdBQUd3SCxFQUFhbFksT0FBT2lCLElBQU9tUixFQUFJZixXQUFXNkcsRUFBYTVZLFVBTTdFLE9BQU9YLEVBQ1AsTUFBTzhKLEdBQ1AsR0FBb0Isa0JBQWhCQSxFQUFJaEUsUUFDTjlGLEVBQUl3USxLQUFLN0QsR0FBY3dILGFBQWMsQ0FDbkNDLE1BQU9wVSxFQUFJeUssS0FBSzRKLFVBQXVCLGlCQUN2Q1AsS0FBTTlULEVBQUl5SyxLQUFLNEosVUFBdUIsd0JBRW5DLENBQ0wsTUFBTVAsV3JCbVJrQjBGLEdBQzVCLElBQ0UsT0FBT25SLEtBQUswTCxNQUFNeUYsR0FDbEIsTUFBT3hZLEdBQ1AsT0FBT3dZLEdxQnZSUUMsQ0FBNEIzUCxFQUFJOUksT0FDN0NoQixFQUFJd1EsS0FBSzdELEdBQWN3SCxhQUFjLENBQ25DQyxNQUFPcFUsRUFBSXlLLEtBQUs0SixVQUF1QixpQkFDdkNQLEtBQU05VCxFQUFJeUssS0FBSzRKLFVBQXVCLHVCQUF3QixDQUM1REwsS0FBc0IsaUJBQVRGLEVBQW9CQSxFQUFLRSxLQUFPRixJQUUvQ29ELEtBQU0scUNBR1YsTUFBTXBOLElBSUozSSxHQUFVbkIsSUFDZCxNQUFNc1UsRUFBYXRVLEVBQUkrRixVQUF3QixpQkFBbUIsR0F3RGxFLE1BdkRnQyxDQUM5QixDQUNFN0QsS0FBTSxTQUNOeUQsS0FBTSxRQUNGdEYsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHdCQUN0RDNOLFFBQVM0TixFQUFXTyxRQUFVLEdBQzlCTixVQUFVLEdBRVosQ0FDRXJTLEtBQU0sV0FDTnlELEtBQU0sUUFDRnRGLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QiwwQkFDbERHLGFBQ0YsT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsMEJBRXJDdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1QixrQ0FDeEQzTixRQUFTNE4sRUFBVzZFLFVBQVksR0FDaEM1RSxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sV0FDTnlELEtBQU0sV0FDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIsa0NBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLDBCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsa0NBQ3hEM04sUUFBUzROLEVBQVc4RSxVQUFZLEdBQ2hDN0UsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLE1BQ055RCxLQUFNLFFBQ0Z0RixZQUFXLE9BQU9MLEVBQUl5SyxLQUFLNEosVUFBdUIscUJBQ2xEdk8sY0FBYSxPQUFPOUYsRUFBSXlLLEtBQUs0SixVQUF1Qiw2QkFDeEQzTixRQUFTNE4sRUFBV2pULEtBQU8sR0FDM0JrVCxVQUFVLEdBRVosQ0FDRXJTLEtBQU0sVUFDTnlELEtBQU0sUUFDRjZPLGFBQVksT0FBT3hVLEVBQUl5SyxLQUFLNEosVUFBdUIseUJBQ25EaFUsWUFBVyxPQUFPTCxFQUFJeUssS0FBSzRKLFVBQXVCLHlCQUNsRHZPLGNBQWEsT0FBTzlGLEVBQUl5SyxLQUFLNEosVUFBdUIsaUNBQ3hEM04sUUFBUzROLEVBQVczVCxTQUFXLEdBQy9CNFQsVUFBVSxHQUVaLENBQ0VyUyxLQUFNLE9BQ055RCxLQUFNLFFBQ0Y2TyxhQUFZLE9BQU94VSxFQUFJeUssS0FBSzRKLFVBQXVCLHNCQUNuRGhVLFlBQVcsT0FBT0wsRUFBSXlLLEtBQUs0SixVQUF1QixzQkFDbER2TyxjQUFhLE9BQU85RixFQUFJeUssS0FBSzRKLFVBQXVCLDhCQUN4RDNOLFFBQVM0TixFQUFXaFMsTUFBUSxHQUM1QmlTLFVBQVUsS0NqSWhCLE1BQU1tRixHQUFpQyxLQUM5QixDQUNMdk8sU0FBVW5MLGFGZ0lvQkEsR0FDaENBLEVBQUl5RixPQUFPZ0IsU0FBUzBFLFNBQVMsU0FBVSxDQUNqQ2pKLFdBQ0YsT0FBT2xDLEVBQUl5SyxLQUFLNEosVUFBdUIsMkJBRXpDdFUsVUFDQW9CLEtFcklFd1ksQ0FBZTNaLFlOZ1BhQSxHQUNoQ0EsRUFBSXlGLE9BQU9nQixTQUFTMEUsU0FBUyxRQUFTLENBQ2hDakosV0FBVSxPQUFPbEMsRUFBSXlLLEtBQUs0SixVQUF1QiwrQkFDckR0VSxVQUNBb0IsS01uUEV5WSxDQUFjNVosWVBnRmNBLEdBQ2hDQSxFQUFJeUYsT0FBT2dCLFNBQVMwRSxTQUFTLE9BQVEsQ0FDL0JqSixXQUFVLE9BQU9sQyxFQUFJeUssS0FBSzRKLFVBQXVCLHVCQUNyRHRVLFVBQ0FvQixLT25GRTBZLENBQWE3WixZTHdHZUEsR0FDaENBLEVBQUl5RixPQUFPZ0IsU0FBUzBFLFNBQVMsU0FBVSxDQUNqQ2pKLFdBQVUsT0FBT2xDLEVBQUl5SyxLQUFLNEosVUFBdUIseUJBQ3JEdFUsVUFDQW9CLEtLM0dFMlksQ0FBZTlaLFlKa0lhQSxHQUNoQ0EsRUFBSXlGLE9BQU9nQixTQUFTMEUsU0FBUyxRQUFTLENBQ2hDakosV0FBVSxPQUFPbEMsRUFBSXlLLEtBQUs0SixVQUF1Qix3QkFDckR0VSxVQUNBb0IsS0lySUU0WSxDQUFjL1osWUhxRWNBLEdBQ2hDQSxFQUFJeUYsT0FBT2dCLFNBQVMwRSxTQUFTLFFBQVMsQ0FDaENqSixXQUFVLE9BQU9sQyxFQUFJeUssS0FBSzRKLFVBQXVCLHdCQUNyRHRVLFVBQ0FvQixLR3hFRTZZLENBQWNoYSxZRCtIY0EsR0FDaENBLEVBQUl5RixPQUFPZ0IsU0FBUzBFLFNBQVMsUUFBUyxDQUNoQ2pKLFdBQVUsT0FBT2xDLEVBQUl5SyxLQUFLNEosVUFBdUIsd0JBQ3JEdFUsR0FDQW9CLE9BQUFBLEtDbElFOFksQ0FBY2phLE1DaUJka2EsR0FBYSxDQUFDbGEsRUFBYTRCLEVBQWNVLEtBQzdDLE1BQU1QLEVBQVlKLEVBQWFDLEdBSy9CLE9BSktHLEVBQVVDLE9BQ2JoQyxFQUFJZSxJQUFJMkMsS0FBSyxhQUFhcEIsa0JBQzFCdEMsRUFBSWUsSUFBSTJDLEtBQUssMEJBRVIzQixHQUdULE9BQWUsUUFwQ0FpRCxNQUFPaEYsSUFDcEIsTUFBTW1hLEVBQXNCbmEsRUFBSXVQLE9BdUJoQyxhQXRCTStDLFFBQVFDLElBQUl2UyxFQUFJd0UsTUFBTUUsS0FBSU0sTUFBT0wsRUFBYzZOLEtBQ25ELElBQUlsTSxFQU1KLEdBSkVBLEVBREVsRixFQUFNdUQsUXZCb0RZSyxPQUFPM0QsRUFBYXJCLEtBQzVDcUIsRUFBTUUsRUFBZ0JGLEdBQ3RCLElBRUkrWSxFQUZBQyxHQUFVLEVBQ1ZDLEVBQVUsR0FFZCxNQUFNQyxFQUFZLElBQUlqSSxTQUFpQyxDQUFDMU4sRUFBUzRWLEtBQy9ELGlCQUNFLElBQ0UsTUFBTTNHLFFBQVk3VCxFQUFJMlAsUUFBUSxDQUM1Qm1ELE9BQVEsTUFDUnpSLElBQUFBLEVBQ0FvVix5QkFBeUIsRUFDekJnRSxhQUFjLGdCQUViclEsTUFBTXNRLElBQ0wsTUFBTTFILEVBQWMwSCxFQUFLM0gsUUFBUSxnQkFLakMsT0FKSUMsTUFBQUEsU0FBQUEsRUFBYWxRLFNBQVMsWUFDeEJ1WCxHQUFVLEVBQ1ZDLEVBQVUsSUFBSUssT0FBTzNILEVBQVk3UCxNQUFNLFVBQVUsT0FFNUN1WCxFQUFLeFMsUUFHaEIsR0FEQTBTLGFBQWFSLEdBQ1RDLEVBQVMsQ0FDWCxNQUFNUSxFQUFVLElBQUlDLEVBQUl6WixHQUFLMFosU0FDN0JuVyxFQUFRLENBQ05xTixPQUFRNEIsRUFDUm5CLFNBQVVwUSxFQUFLMFksU0FBU0gsR0FDeEJQLFFBQUFBLEVBQ0FqVSxTQUFTLFNBR1h6QixFQUFRLENBQ055QixTQUFTLEVBQ1Q0VSxPQUFRLEdBQUc1WixtQkFHZixNQUFPTCxHQUNQNFosYUFBYVIsR0FDYnhWLEVBQVEsQ0FDTnlCLFNBQVMsRUFFVDRVLE9BQVEsV0FBVzVaLHNCQUFjTCxNQUFBQSxTQUFBQSxFQUFPOEUsdUJBQVcsU0FwQ3pELEdBdUNLakYsTUFBTTJaLE1BRVBVLEVBQWlCLElBQUk1SSxTQUFrQzFOLElBQzNEd1YsRUFBWTlNLFlBQVcsS0FDckIxSSxFQUFRLENBQ055QixTQUFTLEVBQ1Q0VSxPQUFRLFdBQVc1WixnQkFFcEIsUUFFTCxPQUFPaVIsUUFBUTZJLEtBQUssQ0FBQ1osRUFBV1csS3VCMUdmRSxDQUFXelcsRUFBTTNFLFF2Qm1DWGdGLE9BQU8yRCxJQUM5QixJQUNFLE1BQU8sQ0FDTDJSLFFBQVNoWSxFQUFLZ1ksUUFBUTNSLEdBQ3RCK0osU0FBVXBRLEVBQUswWSxTQUFTclMsR0FDeEJzSixhQUFjclAsRUFBR3lZLFNBQVMxUyxHQUMxQnRDLFNBQVMsR0FFWCxTQUNBLE1BQU8sQ0FDTDRVLE9BQVEsYUFBYXRTLFVBQ3JCdEMsU0FBUyxLdUI1Q0lpVixDQUFVM1csSUFFckIyQixFQUFLRCxVQUFXQyxFQUFLMkwsT0FVdkIsTUFBTSxJQUFJckQsTUFBTXRJLEVBQUsyVSxRQVZVLENBQy9CLE1BQU1NLEVBQVVyQixHQUFXbGEsRUFBS3NHLEVBQUsyTCxPQUFRdE4sR0FDN0N3VixFQUFRM0gsR0FBUyxDQUNmUCxPQUFRM0wsRUFBSzJMLE9BQ2JTLFNBQVVwTSxFQUFLb00sU0FDZjdRLE1BQU8wWixFQUFRMVosTUFDZkMsT0FBUXlaLEVBQVF6WixPQUNoQndZLFFBQVNoVSxFQUFLZ1UsY0FPcEJ0YSxFQUFJdVAsT0FBUzRLLEVBQVF0VixRQUFPRixHQUFRQSxJQUM3QjNFLElDMUJULE9BQWUsQ0FDYkQsT0FOYWlGLE1BQU9oRixJQUNwQkEsRUFBSXVQLE9BQU8zSSxRQUFRNUcsRUFBSXdFLE9BQ2hCeEUsVUNPSXdiLEdBS1h6USxZQUFhL0ssR0FITGdMLFVBQWlCLEdBQ1JBLGNBQXdCLElBQUl5USxJQUM1QnpRLGVBQWdELElBQUlDLElBRW5FRCxLQUFLaEwsSUFBTUEsRUFDWGdMLEtBQUtqQixPQUdDQSxPQUNOLE1BQU0yUixFQUFjcFosRUFBS0csS0FBS3VJLEtBQUtoTCxJQUFJcU4sUUFBUyxnQkFDaEQsSUFBS3pLLEVBQUdDLFdBQVc2WSxHQUFjLENBQy9CLE1BQU1DLEVBQU0sQ0FDVnpaLEtBQU0sZ0JBQ045QixZQUFhLGdCQUNid2IsV0FBWSxzQ0FDWkMsUUFBUyxPQUVYalosRUFBR3dHLGNBQWNzUyxFQUFhclQsS0FBS0MsVUFBVXFULEdBQU0sU0FLL0NHLGNBQWU5YixFQUFha0MsR0FDbEMsSUFDRSxPQUFPMEMsRUFBUStFLEtBQUt6SCxFQUFNLENBQUU2WixRQUFTL2IsRUFBSXFOLFVBQ3pDLE1BQU92RCxHQUNQLE9BQU94SCxFQUFLRyxLQUFLekMsRUFBSXFOLFFBQVMsZUFBZ0JuTCxJQUtsRDhaLE9BQ0UsTUFBTU4sRUFBY3BaLEVBQUtHLEtBQUt1SSxLQUFLaEwsSUFBSXFOLFFBQVMsZ0JBQzFDNE8sRUFBWTNaLEVBQUtHLEtBQUt1SSxLQUFLaEwsSUFBSXFOLFFBQVMsaUJBRTlDLElBQUt6SyxFQUFHQyxXQUFXb1osR0FDakIsT0FBTyxFQUVULE1BQU03RSxFQUFPeFUsRUFBR3NaLGFBQWFSLEdBQ3ZCUyxFQUFPaFksT0FBT0MsS0FBS2dULEVBQUtnRixjQUFnQixJQUN4Q0MsRUFBVWxZLE9BQU9DLEtBQUtnVCxFQUFLa0YsaUJBQW1CLElBQzlDQyxFQUFVSixFQUFLakcsT0FBT21HLEdBQVN4WCxRQUFRM0MsSUFDM0MsSUFBSyx3Q0FBd0NDLEtBQUtELEdBQU8sT0FBTyxFQUNoRSxNQUFNSSxFQUFPMEksS0FBSzhRLGNBQWM5USxLQUFLaEwsSUFBS2tDLEdBQzFDLE9BQU9VLEVBQUdDLFdBQVdQLE1BRXZCLElBQUssTUFBTTRDLEtBQVVxWCxFQUNuQnZSLEtBQUt3UixlQUFldFgsR0FFdEIsT0FBTyxFQUdUc1gsZUFBZ0J0YSxFQUFjaUUsR0FDNUIsR0FBS2pFLEdBQXdCLGlCQUFUQSxFQUFwQixDQUlBOEksS0FBS3lSLFNBQVNDLElBQUl4YSxHQUNsQixJQUVFLEdBQUtpRSxFQWFFLENBR0w2RSxLQUFLTCxLQUFLL0QsS0FBSzFFLEdBQ2Y4SixHQUFxQjlKLEdBQ3JCLE1BQU15YSxFQUFrQnhXLEVBQU82RSxLQUFLaEwsS0FDcENnTCxLQUFLNFIsVUFBVXJSLElBQUlySixFQUFNeWEsR0FDekJBLEVBQWdCeFIsU0FBU0gsS0FBS2hMLFVBbkI5QixJQUFtRCxJQUEvQ2dMLEtBQUtoTCxJQUFJK0YsVUFBVSxnQkFBZ0I3RCxXQUFvRThNLElBQS9DaEUsS0FBS2hMLElBQUkrRixVQUFVLGdCQUFnQjdELEtBQXdCLENBQ3JIOEksS0FBS0wsS0FBSy9ELEtBQUsxRSxHQUNmOEosR0FBcUI5SixHQUVyQjhJLEtBQUsvRSxVQUFVL0QsR0FBT2lKLFNBQVNILEtBQUtoTCxLQUNwQyxNQUFNbUcsRUFBUyxnQkFBZ0JqRSxLQUMvQjhJLEtBQUtoTCxJQUFJdUYsV0FDUCxDQUNFWSxDQUFDQSxJQUFTLEtBYWxCLE1BQU9yRixHQUNQa0ssS0FBSzRSLFVBQVVoUixPQUFPMUosR0FDdEI4SSxLQUFLTCxLQUFPSyxLQUFLTCxLQUFLOUYsUUFBUUYsR0FBaUJBLElBQVN6QyxJQUN4RDhJLEtBQUt5UixTQUFTN1EsT0FBTzFKLEdBQ3JCOEksS0FBS2hMLElBQUllLElBQUlDLE1BQU1GLEdBQ25Ca0ssS0FBS2hMLElBQUl3USxLQUFLN0QsR0FBY3dILGFBQWMsQ0FDeENDLE1BQU8sVUFBVWxTLGVBQ2pCNFIsS0FBTWhULFVBbkNSa0ssS0FBS2hMLElBQUllLElBQUkyQyxLQUFLLCtCQXdDdEJtWixpQkFBa0IzYSxHQUNoQjhJLEtBQUtMLEtBQU9LLEtBQUtMLEtBQUs5RixRQUFRRixHQUFpQkEsSUFBU3pDLElBQ3hEOEksS0FBS3lSLFNBQVM3USxPQUFPMUosR0FDckI4SSxLQUFLNFIsVUFBVWhSLE9BQU8xSixHQUN0QjhKLEdBQXFCOUosR0FDckI4SSxLQUFLaEwsSUFBSXlGLE9BQU9nQixTQUFTZ0YsV0FBV3ZKLEdBQ3BDOEksS0FBS2hMLElBQUl5RixPQUFPa0IsWUFBWThFLFdBQVd2SixHQUN2QzhJLEtBQUtoTCxJQUFJeUYsT0FBTzhMLHVCQUF1QjlGLFdBQVd2SixHQUNsRDhJLEtBQUtoTCxJQUFJeUYsT0FBT2lNLG9CQUFvQmpHLFdBQVd2SixHQUMvQzhJLEtBQUtoTCxJQUFJeUYsT0FBT29NLG1CQUFtQnBHLFdBQVd2SixHQUM5QzhJLEtBQUtoTCxJQUFJQyxJQUFJd0wsV0FBV3ZKLEdBQ3hCOEksS0FBS2hMLElBQUk2UCxhQUFhLGVBQWdCM04sR0FJeEMrRCxVQUFXL0QsR0FDVCxHQUFJOEksS0FBSzRSLFVBQVV0UixJQUFJcEosR0FDckIsT0FBTzhJLEtBQUs0UixVQUFVbFgsSUFBSXhELEdBRTVCLE1BQU0rWixFQUFZM1osRUFBS0csS0FBS3VJLEtBQUtoTCxJQUFJcU4sUUFBUyxpQkFFeENsSCxFQUFTc0MsUUFBUXdULEVBQVkvWixFQUFwQnVHLENBQTBCdUMsS0FBS2hMLEtBRTlDLE9BREFnTCxLQUFLNFIsVUFBVXJSLElBQUlySixFQUFNaUUsR0FDbEJBLEVBTVQyRixVQUNFLE9BQU9kLEtBQUtMLEtBR2RtUyxVQUFXNWEsR0FDVCxPQUFPOEksS0FBS3lSLFNBQVNuUixJQUFJcEosR0FNM0JnRSxjQUNFLE1BQU8sSUFBSThFLEtBQUt5UixXQ25KYixNQ29DRE0sR0FFRixDQUNGQywycUNBQ0FDLGl3QkFDQUMsZzRDQUNBQyxrNUNBQ0FDLGt1QkFNSUMsR0FFRixDQUNGTCxPQUFRLGtCQUNSQyxNQUFPLGNBQ1BDLE1BQU8sZ0JBQ1BDLE1BQU8sV0FDUEMsSUFBSyxVQVdQLE1BQU1FLEdBQW9CdFksTUFBT2hGLEtBUmpDLFNBQTRCQSxHQUMxQixNQUFNdWQsRUFBWWpiLEVBQUtHLEtBQUt6QyxFQUFJcU4sUUQ1REksNEJDNkQvQnpLLEVBQUdDLFdBQVcwYSxJQUNqQjNhLEVBQUc0YSxVQUFVRCxHQU1mRSxDQUFrQnpkLEdBRWxCLE1BQU11ZCxFQUFZamIsRUFBS0csS0FBS3pDLEVBQUlxTixRRHRFSSwyQkNzRTZCLEdBQUdxQixJQUFRQyxPQUFPLHlCQUNuRixhQUFhLElBQUkyRCxTQUF5QixDQUFDMU4sRUFBbUI0VixLQUM1RCxNQUFNa0QsRUF2RGlCLE1BQ3pCLE1BQU1BLEVBQVdoYixRQUFRZ2IsU0FDekIsR0FBSUMsRUFDRixNQUFPLE1BRVQsR0FBaUIsVUFBYkQsRUFFRixNQUFrQixPQURBRSxFQUFHQyxVQUFVMWEsTUFBTSxLQUFLLEdBRWpDLFFBRUEsUUFFSixNQUFpQixXQUFidWEsRUFDRixTQUVBLFNBd0NVSSxHQUNYQyxFQUFhemIsRUFBS0csS0FBS3pDLEVBQUlxTixRQUFTZ1EsR0FBd0JLLElBU2xFLElBQUlNLEVBUENwYixFQUFHQyxXQUFXa2IsSUFDakJuYixFQUFHd0csY0FDRDJVLEVBQ0FoQixHQUF1QlcsR0FDdkIsUUFLRk0sRUFEZSxXQUFiTixFQUNVTyxFQUFNLFlBQWEsQ0FBQ0YsRUFBWVIsSUFDdEIsVUFBYkcsR0FBcUMsVUFBYkEsRUFDckJPLEVBQU0sYUFBYyxDQUM5QixhQUNBLGtCQUNBLFVBQ0EsT0FDQSxtQkFBb0IsZUFLcEIsUUFBU0YsRUFDVFIsSUFHVVUsRUFBTSxLQUFNLENBQUNGLEVBQVlSLElBR3ZDUyxFQUFVRSxPQUFPNVQsR0FBRyxRQUFTcEMsSUFDM0IsR0FBaUIsVUFBYndWLEdBQzZCLDZCQUEzQnhWLEVBQUtpTyxXQUFXZ0ksT0FLbEIsT0FKQW5lLEVBQUl3USxLQUFLN0QsR0FBY3dILGFBQWMsQ0FDbkNDLE1BQU8sa0NBQ1BOLEtBQU0sZ0ZBRUQwRyxFQUFPLElBQUk1TCxNQUFNLGdGQUc1QixNQUFNd1AsRUFBVWxXLEVBQUtpTyxXQUFXZ0ksT0FJaEMsSUFBSUUsR0FBMkIsRUFXL0IsR0FSSS9iLEVBQUswWSxTQUFTb0QsS0FBYTliLEVBQUswWSxTQUFTdUMsSUFHdkMzYSxFQUFHQyxXQUFXdWIsS0FDaEJDLEdBQTJCLEdBSWYsYUFBWkQsSUFBMkJ4YixFQUFHQyxXQUFXdWIsR0FDM0MsT0FBTzVELEVBQU8sSUFBSTVMLE1BQU0sY0FBY3dQLE1BR3hDeFosRUFBUSxDQUNOd1osUUFBQUEsRUFDQUMseUJBQUFBLFdDcElGQyxHQUFXLElBQUlsUCxFQ1FmbVAsR0FBYSxJQUFJQyxFQUFNQyxNQUFNLENBQ2pDQyxXQUFZLFVBQ1pDLFdBQVksWUFJZCxTQUFTQyxHQUFnQkMsRUFBZ0JoYixFQUFhcUUsR0FDaEMsaUJBQVRBLEdBQXFCLFVBQVdBLEdBQVEsWUFBYUEsRUFDOUQyVyxFQUFLQyxPQUFPamIsRUFBS3FFLEVBQUtrTCxNQUFPbEwsRUFBS3ZILFNBRWxDa2UsRUFBS0MsT0FBT2piLEVBQUtxRSxHQXdFckIsU0FBUzZXLEdBQXFCekcsR0FDNUIsc0NBQ0tBLElBQ0h2QixXQUFZdUIsRUFBUzBHLE9BQ3JCbEwsS0FBTXdFLEVBQVNwUSxPQUluQixTQUFTK1csR0FBc0JqZSxxQkFjN0IsTUFBTWtlLEVBQVcsQ0FDZnBNLDRCQUFROVIsTUFBQUEsU0FBQUEsRUFBT0csNkJBQVEyUiw2QkFBUTVGLGdCQUFpQixHQUNoRDdMLGVBQUtMLE1BQUFBLFNBQUFBLEVBQU9HLDZCQUFRRSxNQUFPLEdBQzNCMFYsc0JBQVkvVixNQUFBQSxTQUFBQSxFQUFPc1gsK0JBQVUwRyxTQUFVLEVBQ3ZDbFosU0FBUzlFLE1BQUFBLFNBQUFBLEVBQU84RSxVQUFXLEdBQzNCZ0osT0FBTzlOLE1BQUFBLFNBQUFBLEVBQU84TixRQUFTLEdBQ3ZCd0osU0FBVSxDQUNSMEcsa0JBQVFoZSxNQUFBQSxTQUFBQSxFQUFPc1gsK0JBQVUwRyxTQUFVLEVBQ25Dakksc0JBQVkvVixNQUFBQSxTQUFBQSxFQUFPc1gsK0JBQVUwRyxTQUFVLEVBQ3ZDbEwsZ0JBQU05UyxNQUFBQSxTQUFBQSxFQUFPc1gsK0JBQVVwUSxPQUFRLEtBR25DLE9BQU9vSyxRQUFRa0ksT0FBTzBFLFNBR1gxUCxHQUlYekUsWUFBYS9LLEdBRkxnTCxXQUE2QixHQUNyQ0EsYUFBbUMsR0FFakNBLEtBQUtoTCxJQUFNQSxFQUNYZ0wsS0FBS2pCLE9BQ0x1VSxHQUFTaFUsR0FBR3NDLEdBQVV1UyxlQUFnQmpYLFVBQ3BDLE9BQVFBLEVBQUs1QyxZQUNYLElBQUssb0JBQ0U0QyxFQUFLa0wsNEJBQTZCM1MsU0FDckN1SyxLQUFLdkssTUFBU3lILEVBQUtrTCxNQUE0QjNTLE9BRWpELE1BQ0YsSUFBSyxlQUNIdUssS0FBS3ZLLE1BQVF5SCxFQUFLa0wsVUFNbEJySixPQUNOLE1BQU10SixFQUFRdUssS0FBS2hMLElBQUkrRixVQUErQixnQkFDbER0RixJQUNGdUssS0FBS3ZLLE1BQVFBLEdBSVQyZSxjQUNOLEdBQUlwVSxLQUFLdkssTUFDUCxJQUNFLE1BQU00ZSxFQUFlLElBQUl2RSxFQUFJOVAsS0FBS3ZLLE9BQ2xDLE1BQU8sQ0FDTDZlLEtBQU1ELEVBQWFFLFNBQ25CQyxLQUFNQyxTQUFTSixFQUFhRyxNQUFRLElBQUssSUFDekNFLFNBQVVMLEVBQWFLLFVBRXpCLE1BQU81ZSxJQUdYLE9BQU8sRUFJVDZPLFFBRUloUCxTQUNGcUssS0FBS3JLLFFBQVFGLE1BQVF1SyxLQUFLb1UsY0FDMUJwVSxLQUFLckssUUFBUW9TLFFBQVVwUyxFQUFRb1MsU0FBVyxHQUMxQy9ILEtBQUtySyxRQUFRZ2YsY0FBZ0JDLEVBQUFBLEVBQzdCNVUsS0FBS3JLLFFBQVFrZixpQkFBbUJELEVBQUFBLEVBQzVCNVUsS0FBS3JLLFFBQVFGLGtCQUFTRSxFQUFRVSwwQkFBS0MsV0FBVyxjQUNoRDBKLEtBQUtySyxRQUFRNGQsV0FBYXVCLEVBQU9DLGNBQWMsQ0FDN0N0ZixNQUFPLENBQ0w2ZSxLQUFNdFUsS0FBS3JLLFFBQVFGLE1BQU02ZSxLQUN6QkUsS0FBTXhVLEtBQUtySyxRQUFRRixNQUFNK2UsUUFHN0J4VSxLQUFLckssUUFBUUYsT0FBUSxHQUVyQnVLLEtBQUtySyxRQUFRNGQsV0FBYUEsR0FJNUIsTUFBTXlCLEVBQVdDLEVBQU1DLE9BQU9sVixLQUFLckssU0FDbkNxZixFQUFTRyxhQUFhN0gsU0FBUzlSLElBQUl1WSxHQUFxQkUsSUFHeEQsTUFBTW1CLEVBN0tWLFNBQTZCemYsU0FHM0IsSUFBSTBmLEdBQWlCLEVBQ3JCLE1BQU1ELGlDQUdEemYsSUFDSFUsSUFBTVYsRUFBUVUsS0FBa0IsR0FDaEMwUixRQUFTcFMsRUFBUW9TLFNBQVcsS0FHOUIsR0FBSXBTLEVBQVFGLE1BQU8sQ0FDakIsSUFBSTRlLEVBQWUxZSxFQUFRRixNQUMzQixHQUE0QixpQkFBakI0ZSxFQUEyQixDQUNwQyxJQUNFQSxFQUFlLElBQUl2RSxFQUFJbmEsRUFBUUYsT0FDL0IsTUFBT0ssR0FDUHVlLEdBQWUsRUFDZmUsRUFBSTNmLE9BQVEsRUFDWmdELFFBQVF6QyxNQUFNRixHQUVoQnVmLEdBQWlCLEVBRWZoQixlQUNFMWUsRUFBUVUsMEJBQUtDLFdBQVcsY0FDMUI4ZSxFQUFJM2YsT0FBUSxFQUNaMmYsRUFBSTdCLFdBQWF1QixFQUFPQyxjQUFjLENBQ3BDdGYsTUFBTyxDQUNMNmUsS0FBTUQsTUFBQUEsU0FBQUEsRUFBY0UsU0FDcEJDLEtBQU1DLFNBQVNKLE1BQUFBLFNBQUFBLEVBQWNHLEtBQU0sUUFJdkNZLEVBQUkzZixNQUFRLENBQ1Y2ZSxLQUFNRCxFQUFhRSxTQUNuQkMsS0FBTUMsU0FBU0osRUFBYUcsS0FBTSxJQUNsQ0UsU0FBVSxTQUtsQixHQUFJLGFBQWMvZSxFQUFTLENBQ3pCLE1BQU1rZSxFQUFPLElBQUl5QixFQUNqQixJQUFLLE1BQU16YyxLQUFPbEQsRUFBUXVTLFNBRXhCMEwsR0FBZUMsRUFBTWhiLEVBRFJsRCxFQUFRdVMsU0FBU3JQLElBR2hDdWMsRUFBSWxZLEtBQU8yVyxFQUNYdUIsRUFBSXJOLFFBQVU1TyxPQUFPb2MsT0FBT0gsRUFBSXJOLFNBQVcsR0FBSThMLEVBQUsyQixjQUNwREgsR0FBaUIsU0FFVkQsRUFBSWxOLFNBYWIsTUFYSSxTQUFVdlMsSUFDWnlmLEVBQUlsWSxLQUFPdkgsRUFBUW1ULEtBQ25CdU0sR0FBaUIsU0FFVkQsRUFBSXRNLE1BRVQsT0FBUW5ULElBQ1Z5ZixFQUFJSyxPQUFTOWYsRUFBUStmLEdBQ3JCTCxHQUFpQixHQUVuQkQsRUFBSUMsZUFBaUJBLEVBQ2RELEVBNEdPTyxDQUFtQmhnQixHQW9CL0IsT0FsQkFxZixFQUFTRyxhQUFheFEsUUFBUW5KLEtBQUksU0FBVStSLGFBRTFDLElBQUl2RixFQUFjLEdBY2xCLGlCQWJJdUYsTUFBQUEsU0FBQUEsRUFBS3hGLDhCQUFTQyxjQUNoQkEsRUFBY3VGLEVBQUl4RixRQUFRQyxtQkFDbkJ1RixFQUFJeEYsUUFBUUMsd0JBQ1Z1RixNQUFBQSxTQUFBQSxFQUFLeEYsOEJBQVM2TixjQUN2QjVOLEVBQWN1RixFQUFJeEYsUUFBUTZOLG1CQUNuQnJJLEVBQUl4RixRQUFRNk4sd0JBQ1ZySSxNQUFBQSxTQUFBQSxFQUFLeEYsOEJBQVUsbUJBQ3hCQyxFQUFjdUYsRUFBSXhGLFFBQVEsdUJBQ25Cd0YsRUFBSXhGLFFBQVEsaUJBRUQsS0FBaEJDLEdBQXNCdUYsRUFBSXhGLFVBQzVCd0YsRUFBSXhGLFFBQVEsZ0JBQWtCQyxHQUV6QnVGLEtBRUwsNEJBQTZCNVgsR0FBV0EsRUFBUThWLHdCQUMzQ3VKLEVBQVNyUSxRQUFReVEsR0FFakJKLEVBQVNyUSxRQUFReVEsR0FBS2hXLE1BQUt5SixHQUU1QnVNLEVBQUlDLGVBQ0YsU0FBVTFmLEVBQ1JBLEVBQVF5VyxLQUNIdkQsRUFBSTNMLFVBRGIsRUFJT0csS0FBS0MsVUFBVXVMLEVBQUkzTCxNQUdyQjJMLEVBQUkzTCxRQ25PckIsTUFBTTJZLEdBR0o5VixZQUFhL0ssR0FJWCxHQUhBZ0wsS0FBS2hMLElBQU1BLEVBQ1hnTCxLQUFLOFYsR0FBSyxJQUFJQyxFQUFVL1YsS0FBS2hMLElBQUlzUCxhQUU1QnRFLEtBQUs4VixHQUFHeFYsSUFBSSxVQUNmLElBQ0VOLEtBQUs4VixHQUFHdlYsSUFBSSxTQUFVLENBQ3BCOUUsU0FBVSxPQUNWcVAsUUFBUyxTQUVYLE1BQU9oVixHQUVQLE1BREFrSyxLQUFLaEwsSUFBSWUsSUFBSUMsTUFBTUYsR0FDYkEsRUFHVixJQUFLa0ssS0FBSzhWLEdBQUd4VixJQUFJLGdCQUNmLElBQ0VOLEtBQUs4VixHQUFHdlYsSUFBSSxlQUFnQixJQUM1QixNQUFPekssR0FFUCxNQURBa0ssS0FBS2hMLElBQUllLElBQUlDLE1BQU1GLEdBQ2JBLEdBS1prZ0IsS0FBTUMsR0FDSixPQUFPalcsS0FBSzhWLEdBQUdFLEtBQUtDLEdBR3RCdmIsSUFBSzdCLEVBQWMsSUFFakIsT0FEQW1ILEtBQUtnVyxNQUFLLEdBQ0hoVyxLQUFLOFYsR0FBR3BiLElBQUk3QixHQUdyQjBILElBQUsxSCxFQUFhdVAsR0FFaEIsT0FEQXBJLEtBQUtnVyxNQUFLLEdBQ0hoVyxLQUFLOFYsR0FBR3ZWLElBQUkxSCxFQUFLdVAsR0FHMUI5SCxJQUFLekgsR0FFSCxPQURBbUgsS0FBS2dXLE1BQUssR0FDSGhXLEtBQUs4VixHQUFHeFYsSUFBSXpILEdBR3JCcWQsTUFBT3JkLEVBQWF1UCxHQUVsQixPQURBcEksS0FBS2dXLE1BQUssR0FDSGhXLEtBQUs4VixHQUFHSSxNQUFNcmQsRUFBS3VQLEdBRzVCN04sV0FBWXBFLEdBQ1ZnRCxPQUFPQyxLQUFLakQsR0FBUXVHLFNBQVN4RixJQUMzQjhJLEtBQUtPLElBQUlySixFQUFNZixFQUFPZSxPQUkxQjJOLGFBQWMxTyxHQUNaZ0QsT0FBT0MsS0FBS2pELEdBQVF1RyxTQUFTeEYsSUFDM0I4SSxLQUFLa1csTUFBTWhmLEVBQU1mLEVBQU9lLGNDakRqQmlmLEdBR1hwVyxZQUFhL0ssR0FDWGdMLEtBQUtoTCxJQUFNQSxFQUdiZ0YsY0FBZXhFLEVBQW1CRyxFQUFpQyxHQUFJc08sR0FDckUsTUFBTW1TLEVBQTZCLEdBQzdCQyxFQUFpQjdnQixFQUNwQmtFLEtBQUtDLEdBQWlCMmMsR0FBd0J0VyxLQUFLaEwsSUFBSzJFLEtBQ3hERSxRQUFRRixHQUdIcUcsS0FBS2hMLElBQUlnRyxhQUFhOFcsVUFBVW5ZLEVBQUs0YyxVQUN2Q0gsRUFBaUJ4YSxLQUFLakMsRUFBSzRjLFNBQzNCdlcsS0FBS2hMLElBQUllLElBQUlzRixRQUFRLCtCQUErQjFCLEVBQUs0YyxZQUNsRCxLQUdKNWMsRUFBSzBCLFVBS1JtYixFQUFlSCxFQUFlM2MsS0FBSUMsR0FBUUEsRUFBSzhjLFdBQy9DQyxFQUFjTCxFQUFlM2MsS0FBSUMsR0FBUUEsRUFBSzRjLFVBQ3BELEdBQUlDLEVBQWFuZCxPQUFTLEVBQUcsQ0FJM0IsTUFBTWtKLFFBQWV2QyxLQUFLMlcsWUFBWSxVQUFXSCxFQUFjeFcsS0FBS2hMLElBQUlxTixRQUFTMU0sRUFBU3NPLEdBQzFGLEdBQUsxQixFQUFPeUcsS0FjTCxDQUNMLE1BQU1sSyxFQUFNa0IsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsOENBQStDLENBQzlGTCxLQUFNLEdBQUd6RyxFQUFPeUcsT0FDaEI5TCxLQUFNcUYsRUFBT3JGLE9BRWY4QyxLQUFLaEwsSUFBSWUsSUFBSUMsTUFBTThJLEdBQ25Ca0IsS0FBS2hMLElBQUl3USxLQUFLLGdCQUFpQixDQUM3QjRELE1BQU9wSixLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1Qix3Q0FDNUNQLEtBQU1oSyxJQU1SLE1BSnlDLENBQ3ZDekQsU0FBUyxFQUNUeU4sS0FBTWhLLEdBekJSNFgsRUFBWWhhLFNBQVNnRSxJQUNuQlYsS0FBS2hMLElBQUlnRyxhQUFhd1csZUFBZTlRLE1BRXZDVixLQUFLaEwsSUFBSWUsSUFBSXNGLFFBQVEyRSxLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1QiwwQ0FDMURySixLQUFLaEwsSUFBSXdRLEtBQUssaUJBQWtCLENBQzlCNEQsTUFBT3BKLEtBQUtoTCxJQUFJeUssS0FBSzRKLFVBQXVCLHlDQUM1Q1AsS0FBTSxJQUFJNE4sS0FBZ0JOLEtBTTVCLE1BSndDLENBQ3RDL2EsU0FBUyxFQUNUeU4sS0FBTSxJQUFJNE4sS0FBZ0JOLElBbUJ6QixHQUFnQyxJQUE1QkEsRUFBaUIvYyxPQUFjLENBQ3hDLE1BQU15RixFQUFNa0IsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsZ0RBQ2pEckosS0FBS2hMLElBQUllLElBQUlDLE1BQU04SSxHQUNuQmtCLEtBQUtoTCxJQUFJd1EsS0FBSyxnQkFBaUIsQ0FDN0I0RCxNQUFPcEosS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsd0NBQzVDUCxLQUFNaEssSUFNUixNQUp5QyxDQUN2Q3pELFNBQVMsRUFDVHlOLEtBQU1oSyxHQUlSa0IsS0FBS2hMLElBQUllLElBQUlzRixRQUFRMkUsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsMENBQzFEckosS0FBS2hMLElBQUl3USxLQUFLLGlCQUFrQixDQUM5QjRELE1BQU9wSixLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1Qix5Q0FDNUNQLEtBQU0sSUFBSTROLEtBQWdCTixLQU01QixNQUp3QyxDQUN0Qy9hLFNBQVMsRUFDVHlOLEtBQU0sSUFBSTROLEtBQWdCTixJQU1oQ3BjLGdCQUFpQnhFLEdBQ2YsTUFDTWtoQixFQURpQmxoQixFQUFRa0UsS0FBS0MsR0FBaUIyYyxHQUF3QnRXLEtBQUtoTCxJQUFLMkUsS0FBT0UsUUFBT0YsR0FBUUEsRUFBSzBCLFVBQy9FM0IsS0FBSUMsR0FBUUEsRUFBSzRjLFVBQ3BELEdBQUlHLEVBQVlyZCxPQUFTLEVBQUcsQ0FHMUIsTUFBTWtKLFFBQWV2QyxLQUFLMlcsWUFBWSxZQUFhRCxFQUFhMVcsS0FBS2hMLElBQUlxTixTQUN6RSxHQUFLRSxFQUFPeUcsS0FjTCxDQUNMLE1BQU1sSyxFQUFNa0IsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsZ0RBQWlELENBQ2hHTCxLQUFNLEdBQUd6RyxFQUFPeUcsT0FDaEI5TCxLQUFNcUYsRUFBT3JGLE9BRWY4QyxLQUFLaEwsSUFBSWUsSUFBSUMsTUFBTThJLEdBQ25Ca0IsS0FBS2hMLElBQUl3USxLQUFLLGtCQUFtQixDQUMvQjRELE1BQU9wSixLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1QiwwQ0FDNUNQLEtBQU1oSyxJQU1SLE1BSnlDLENBQ3ZDekQsU0FBUyxFQUNUeU4sS0FBTWhLLEdBekJSNFgsRUFBWWhhLFNBQVNnRSxJQUNuQlYsS0FBS2hMLElBQUlnRyxhQUFhNlcsaUJBQWlCblIsTUFFekNWLEtBQUtoTCxJQUFJZSxJQUFJc0YsUUFBUTJFLEtBQUtoTCxJQUFJeUssS0FBSzRKLFVBQXVCLDRDQUMxRHJKLEtBQUtoTCxJQUFJd1EsS0FBSyxtQkFBb0IsQ0FDaEM0RCxNQUFPcEosS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsMkNBQzVDUCxLQUFNNE4sSUFNUixNQUp3QyxDQUN0Q3JiLFNBQVMsRUFDVHlOLEtBQU00TixHQW1CTCxDQUNMLE1BQU01WCxFQUFNa0IsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsZ0RBQ2pEckosS0FBS2hMLElBQUllLElBQUlDLE1BQU04SSxHQUNuQmtCLEtBQUtoTCxJQUFJd1EsS0FBSyxrQkFBbUIsQ0FDL0I0RCxNQUFPcEosS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsMENBQzVDUCxLQUFNaEssSUFNUixNQUp5QyxDQUN2Q3pELFNBQVMsRUFDVHlOLEtBQU1oSyxJQU1aOUUsYUFBY3hFLEVBQW1CRyxFQUFpQyxHQUFJc08sR0FDcEUsTUFDTXlTLEVBRGlCbGhCLEVBQVFrRSxLQUFLQyxHQUFpQjJjLEdBQXdCdFcsS0FBS2hMLElBQUsyRSxLQUFPRSxRQUFPRixHQUFRQSxFQUFLMEIsVUFDL0UzQixLQUFJQyxHQUFRQSxFQUFLNGMsVUFDcEQsR0FBSUcsRUFBWXJkLE9BQVMsRUFBRyxDQUcxQixNQUFNa0osUUFBZXZDLEtBQUsyVyxZQUFZLFNBQVVELEVBQWExVyxLQUFLaEwsSUFBSXFOLFFBQVMxTSxFQUFTc08sR0FDeEYsR0FBSzFCLEVBQU95RyxLQVdMLENBQ0wsTUFBTWxLLEVBQU1rQixLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1Qiw2Q0FBOEMsQ0FDN0ZMLEtBQU0sR0FBR3pHLEVBQU95RyxPQUNoQjlMLEtBQU1xRixFQUFPckYsT0FFZjhDLEtBQUtoTCxJQUFJZSxJQUFJQyxNQUFNOEksR0FDbkJrQixLQUFLaEwsSUFBSXdRLEtBQUssZUFBZ0IsQ0FDNUI0RCxNQUFPcEosS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsdUNBQzVDUCxLQUFNaEssSUFNUixNQUp5QyxDQUN2Q3pELFNBQVMsRUFDVHlOLEtBQU1oSyxHQXRCUmtCLEtBQUtoTCxJQUFJZSxJQUFJc0YsUUFBUTJFLEtBQUtoTCxJQUFJeUssS0FBSzRKLFVBQXVCLHlDQUMxRHJKLEtBQUtoTCxJQUFJd1EsS0FBSyxnQkFBaUIsQ0FDN0I0RCxNQUFPcEosS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsd0NBQzVDUCxLQUFNNE4sSUFNUixNQUp3QyxDQUN0Q3JiLFNBQVMsRUFDVHlOLEtBQU00TixHQW1CTCxDQUNMLE1BQU01WCxFQUFNa0IsS0FBS2hMLElBQUl5SyxLQUFLNEosVUFBdUIsNkNBQ2pEckosS0FBS2hMLElBQUllLElBQUlDLE1BQU04SSxHQUNuQmtCLEtBQUtoTCxJQUFJd1EsS0FBSyxlQUFnQixDQUM1QjRELE1BQU9wSixLQUFLaEwsSUFBSXlLLEtBQUs0SixVQUF1Qix1Q0FDNUNQLEtBQU1oSyxJQU1SLE1BSnlDLENBQ3ZDekQsU0FBUyxFQUNUeU4sS0FBTWhLLElBTUo5RSxrQkFBbUIvRSxFQUFhc2MsRUFBbUJxRixFQUFlamhCLEVBQWlDLEdBQUlzTyxFQUFtQixJQUVoSSxNQUFNdk8sRUFBV0MsRUFBUUQsVUFBWXNLLEtBQUtoTCxJQUFJK0YsVUFBK0IscUJBQ3ZFdEYsRUFBUUUsRUFBUUYsT0FBU3VLLEtBQUtoTCxJQUFJK0YsVUFBK0Isa0JBQ3ZFLGFBQWEsSUFBSXVNLFNBQVMxTixZQUN4QixJQUFJMEgsRUFBTyxDQUFDck0sR0FBS2lXLE9BQU9xRyxHQUFTckcsT0FBTyxrQkFBa0JBLE9BQU8sVUFDN0R4VixJQUNGNEwsRUFBT0EsRUFBSzRKLE9BQU8sY0FBY3hWLE1BRS9CRCxJQUNGNkwsRUFBT0EsRUFBSzRKLE9BQU8sV0FBV3pWLE1BRWhDLElBQ0UsTUFBTW9oQixFQUFNNUQsRUFBTSxNQUFPM1IsRUFBTSxDQUFFM0osSUFBS2lmLEVBQU8zUyxJQUFLOUssT0FBT29jLE9BQU8sR0FBSTdkLFFBQVF1TSxJQUFLQSxLQUVqRixJQUFJTSxFQUFTLGFBQ2JzUyxFQUFJM0QsdUJBQVE1VCxHQUFHLFFBQVNwQyxJQUN0QnFILEdBQVVySCxLQUNUNFosS0FBS3BmLFFBQVF3YixrQkFFaEIyRCxFQUFJRSx1QkFBUXpYLEdBQUcsUUFBU3BDLElBQ3RCcUgsR0FBVXJILEtBQ1Q0WixLQUFLcGYsUUFBUXFmLFFBRWhCRixFQUFJdlgsR0FBRyxTQUFVMEosSUFJYnBQLEVBSEdvUCxFQUdLLENBQUVBLEtBQU1BLEVBQU05TCxLQUFNcUgsR0FGcEIsQ0FBRXlFLEtBQU0sRUFBRzlMLEtBQU1xSCxPQU03QnNTLEVBQUl2WCxHQUFHLFNBQVVSLElBQ2ZrQixLQUFLaEwsSUFBSWUsSUFBSUMsTUFBTThJLEdBQ25Ca0IsS0FBS2hMLElBQUllLElBQUlDLE1BQU0sd0JBQ25CZ0ssS0FBS2hMLElBQUl3USxLQUFLN0QsR0FBY3dFLE9BQVEsMkJBRXRDLE1BQU9yUSxHQUNQa0ssS0FBS2hMLElBQUllLElBQUlDLE1BQU1GLEdBQ25Ca0ssS0FBS2hMLElBQUl3USxLQUFLN0QsR0FBY3dFLE9BQVFyUSxRQVc1QyxNQUFNd2dCLEdBQTBCLENBQUN0aEIsRUFBYXFDLEtBQzVDLE1BQU13UixFQUFNLENBQ1Z4TixTQUFTLEVBQ1RvYixTQUFVLEdBQ1ZGLFFBQVMsSUFFTGhVLEUvQnhENEIsRUFBQ2xMLEVBQW9CMmYsRUFBNEJ2ZSxXQUVuRixPQUR1QnhCLEVBQWtCSSxJQUV2QyxJQUFLLFNBQ0wsSUFBSyxRQUNILE9BQU9BLEVBQ1QsSUFBSyxTQUNILE9BQU9VLEVBQXlCVixHQUNsQyxRQUFTLENBR1AsSUFBSUcsRUFBYUgsRUFDakIsT0FBSUMsRUFBS0MsV0FBV0YsSUFBZU8sRUFBR0MsV0FBV1IsR0FDeENZLEVBQW9CVCxJQUc3QkEsRUFBYUYsRUFBS0csS0FBS0MsUUFBUUMsTUFBT04sR0FDbENPLEVBQUdDLFdBQVdMLEdBQ1RTLEVBQW9CVCxJQUc3QndmLEVBQU90ZSxLQUFLLHFCQUFxQnJCLEtBQzFCLFErQmtDSTRmLENBQXFCNWYsRUFBWXJDLEVBQUllLEtBQ3BELElBQUt3TSxFQUNILE9BQU9zRyxFQUlULE1BQU0wTixFL0J2QjJCLEVBQUNsZixFQUFvQjJmLEVBQTRCdmUsaUJBRWxGLE9BRHVCeEIsRUFBa0JJLElBRXZDLElBQUssU0FDSCxPQUFPZ0IsRUFBb0JoQixHQUM3QixJQUFLLFFBQ0gsT0FBT2dCLEVBQW9CaEIsR0FBWSxHQUN6QyxJQUFLLFNBQ0gsT0FBT2dCLEVBQW9CTixFQUF5QlYsSUFDdEQsUUFBUyxDQUlQLElBQUtPLEVBQUdDLFdBQVdSLEdBRWpCLE9BREEyZixFQUFPdGUsS0FBSyxzQkFBc0JyQixLQUMzQixHQUVULE1BQU02ZixFQUFrQjVmLEVBQUs2ZixNQUFNMWYsS0FBS0osRUFBWSxnQkFDcEQsR0FBS08sRUFBR0MsV0FBV3FmLEdBR1osQ0FDTCxNQUFNdkcsRUFBTS9ZLEVBQUdzWixhQUFhZ0csSUFBb0IsR0FDaEQsaUJBQUt2RyxFQUFJelosMkJBQU1ZLFNBQVMsa0JBSWpCNlksRUFBSXpaLE1BSFQ4ZixFQUFPdGUsS0FBSywyQ0FBMkNpWSxFQUFJelosTUFBa0Isc0RBQ3RFLElBTFQsT0FEQThmLEVBQU90ZSxLQUFLLHNCQUFzQnJCLEtBQzNCLE0rQkdHK2YsQ0FBb0I3VSxFQUFRdk4sRUFBSWUsS0FDaEQsT0FBS3dnQixFQUdFLENBQ0xsYixTQUFTLEVBQ1RvYixTQUFVbFUsRUFDVmdVLFFBQUFBLEdBTE8xTixHQy9QTHdPLEdBQXFELENBQ3pELFFDYm1CLENBQ25CQyxjQUFlLE9BQ2ZDLGVBQWdCLGVBQ2hCQywyQkFBNEIsZUFDNUJDLHFCQUFzQiwrQkFDdEJDLGFBQWMsWUFDZEMsWUFBYSxPQUdiQyxZQUFhLFFBQ2JDLGtCQUFtQixVQUNuQkMsMEJBQTJCLFNBQzNCQyxrQ0FBbUMsY0FHbkNDLGdCQUFpQixTQUNqQkMsNEJBQTZCLFVBQzdCQyxnQ0FBaUMsY0FDakNDLHVCQUF3QixXQUN4QkMscUJBQXNCLFNBQ3RCQyxxQkFBc0IsU0FDdEJDLDBCQUEyQixVQUMzQkMsd0JBQXlCLFNBQ3pCQyw2QkFBOEIsb0JBQzlCQyw2QkFBOEIsV0FDOUJDLGdDQUFpQyx3QkFDakNDLGtDQUFtQyxzQkFHbkNDLG9CQUFxQixTQUNyQkMsNEJBQTZCLFFBQzdCQyw2QkFBOEIsYUFDOUJDLDhCQUErQixjQUMvQkMsMEJBQTJCLFVBQzNCQywyQkFBNEIsV0FDNUJDLHlCQUEwQixTQUMxQkMseUJBQTBCLFNBQzFCQyw0QkFBNkIsU0FDN0JDLDhCQUErQixVQUMvQkMsa0NBQW1DLGdCQUNuQ0MsaUNBQWtDLGdCQUNsQ0MsaUNBQWtDLFdBQ2xDQyxzQ0FBdUMsc0JBQ3ZDQyxvQ0FBcUMsaUJBR3JDQyxjQUFlLFNBQ2ZDLG9CQUFxQixVQUNyQkMsbUJBQW9CLFFBQ3BCQyxtQkFBb0IsU0FDcEJDLHFCQUFzQixRQUN0QkMsd0JBQXlCLFVBQ3pCQywyQkFBNEIsbUJBQzVCQyw2QkFBOEIsVUFDOUJDLDJCQUE0QixXQUM1QkMsZ0NBQWlDLHNCQUdqQ0MsYUFBYyxNQUNkQyx1QkFBd0IsY0FDeEJDLHVCQUF3QixjQUN4QkMsb0JBQXFCLFdBQ3JCQyxrQkFBbUIsU0FDbkJDLGlCQUFrQixTQUNsQkMscUJBQXNCLFNBQ3RCQyxrQkFBbUIsU0FDbkJDLDBCQUEyQixXQUMzQkMsMEJBQTJCLFFBQzNCQyw2QkFBOEIsZ0JBQzlCQyx5QkFBMEIscUNBRzFCQyxhQUFjLFFBQ2RDLHNCQUF1QixhQUN2QkMsbUJBQW9CLE9BQ3BCQywyQkFBNEIsMkJBRzVCQyxhQUFjLE1BQ2RDLG9CQUFxQixXQUNyQkMsc0JBQXVCLFFBQ3ZCQyxzQkFBdUIsVUFDdkJDLGtCQUFtQixTQUNuQkMsaUJBQWtCLFNBQ2xCQyxxQkFBc0IsU0FDdEJDLDhCQUErQixRQUMvQkMsOEJBQStCLFVBQy9CQyx5QkFBMEIsK0JBQzFCQyw2QkFBOEIsY0FDOUJDLDBCQUEyQixXQUczQkMsc0NBQXVDLFNBQ3ZDQyxxQ0FBc0MsU0FDdENDLDRDQUE2QyxzQ0FDN0NDLDBDQUEyQyx5QkFDM0NDLHdDQUF5QyxTQUN6Q0MsdUNBQXdDLFNBQ3hDQyw4Q0FBK0Msc0NBQy9DQyw2Q0FBOEMsa0JBQzlDQyxxQ0FBc0MsU0FDdENDLG9DQUFxQyxTQUNyQ0MsMkNBQTRDLHNDQUM1Q0MsMENBQTJDLG1CRHpGM0MsUUVaNkIsQ0FDN0J0RixjQUFlLE9BQ2ZDLGVBQWdCLGNBQ2hCQywyQkFBNEIsYUFDNUJDLHFCQUFzQiwrQkFDdEJDLGFBQWMsWUFDZEMsWUFBYSxPQUdiQyxZQUFhLFFBQ2JDLGtCQUFtQixVQUNuQkMsMEJBQTJCLFNBQzNCQyxrQ0FBbUMsY0FHbkNDLGdCQUFpQixTQUNqQkMsNEJBQTZCLFVBQzdCQyxnQ0FBaUMsY0FDakNDLHVCQUF3QixXQUN4QkMscUJBQXNCLFNBQ3RCQyxxQkFBc0IsU0FDdEJDLDBCQUEyQixTQUMzQkMsd0JBQXlCLFNBQ3pCQyw2QkFBOEIsb0JBQzlCQyw2QkFBOEIsV0FDOUJDLGdDQUFpQyx3QkFDakNDLGtDQUFtQyxzQkFHbkNDLG9CQUFxQixTQUNyQkMsNEJBQTZCLFFBQzdCQyw2QkFBOEIsYUFDOUJDLDhCQUErQixjQUMvQkMsMEJBQTJCLFVBQzNCQywyQkFBNEIsV0FDNUJDLHlCQUEwQixTQUMxQkMseUJBQTBCLFNBQzFCQyw0QkFBNkIsU0FDN0JDLDhCQUErQixTQUMvQkMsa0NBQW1DLGdCQUNuQ0MsaUNBQWtDLGdCQUNsQ0MsaUNBQWtDLFdBQ2xDQyxzQ0FBdUMsc0JBQ3ZDQyxvQ0FBcUMsaUJBR3JDQyxjQUFlLFNBQ2ZDLG9CQUFxQixVQUNyQkMsbUJBQW9CLFNBQ3BCQyxtQkFBb0IsU0FDcEJDLHFCQUFzQixTQUN0QkMsd0JBQXlCLFNBQ3pCQywyQkFBNEIsbUJBQzVCQyw2QkFBOEIsVUFDOUJDLDJCQUE0QixXQUM1QkMsZ0NBQWlDLHNCQUdqQ0MsYUFBYyxNQUNkQyx1QkFBd0IsY0FDeEJDLHVCQUF3QixjQUN4QkMsb0JBQXFCLFdBQ3JCQyxrQkFBbUIsU0FDbkJDLGlCQUFrQixTQUNsQkMscUJBQXNCLFNBQ3RCQyxrQkFBbUIsU0FDbkJDLDBCQUEyQixXQUMzQkMsMEJBQTJCLFFBQzNCQyw2QkFBOEIsZ0JBQzlCQyx5QkFBMEIscUNBRzFCQyxhQUFjLFFBQ2RDLHNCQUF1QixhQUN2QkMsbUJBQW9CLFVBQ3BCQywyQkFBNEIsMkJBRzVCQyxhQUFjLE1BQ2RDLG9CQUFxQixXQUNyQkMsc0JBQXVCLFFBQ3ZCQyxzQkFBdUIsVUFDdkJDLGtCQUFtQixTQUNuQkMsaUJBQWtCLFNBQ2xCQyxxQkFBc0IsU0FDdEJDLDhCQUErQixRQUMvQkMsOEJBQStCLFVBQy9CQyx5QkFBMEIsK0JBQzFCQyw2QkFBOEIsY0FDOUJDLDBCQUEyQixXQUczQkMsc0NBQXVDLFNBQ3ZDQyxxQ0FBc0MsU0FDdENDLDRDQUE2QyxzQ0FDN0NDLDBDQUEyQyw0QkFDM0NDLHdDQUF5QyxTQUN6Q0MsdUNBQXdDLFNBQ3hDQyw4Q0FBK0Msc0NBQy9DQyw2Q0FBOEMsb0JBQzlDQyxxQ0FBc0MsU0FDdENDLG9DQUFxQyxTQUNyQ0MsMkNBQTRDLHNDQUM1Q0MsMENBQTJDLHFCRjFGM0NDLEdHYjBCLENBQzFCdkYsY0FBZSxnQkFDZkMsZUFBZ0IsNkJBQ2hCQywyQkFBNEIseUNBQzVCQyxxQkFBc0IsdUZBQ3RCQyxhQUFjLHVDQUNkQyxZQUFhLHdCQUdiQyxZQUFhLFFBQ2JDLGtCQUFtQixZQUNuQkMsMEJBQTJCLDJCQUMzQkMsa0NBQW1DLGVBR25DQyxnQkFBaUIsWUFDakJDLDRCQUE2QixZQUM3QkMsZ0NBQWlDLGdCQUNqQ0MsdUJBQXdCLGFBQ3hCQyxxQkFBc0IsV0FDdEJDLHFCQUFzQixXQUN0QkMsMEJBQTJCLGlCQUMzQkMsd0JBQXlCLGlCQUN6QkMsNkJBQThCLHFCQUM5QkMsNkJBQThCLFlBQzlCQyxnQ0FBaUMseUJBQ2pDQyxrQ0FBbUMsdUJBR25DQyxvQkFBcUIsZ0JBQ3JCQyw0QkFBNkIscUJBQzdCQyw2QkFBOEIsZUFDOUJDLDhCQUErQixnQkFDL0JDLDBCQUEyQixZQUMzQkMsMkJBQTRCLGFBQzVCQyx5QkFBMEIsV0FDMUJDLHlCQUEwQixXQUMxQkMsNEJBQTZCLGlCQUM3QkMsOEJBQStCLGlCQUMvQkMsa0NBQW1DLGlCQUNuQ0MsaUNBQWtDLGlCQUNsQ0MsaUNBQWtDLFlBQ2xDQyxzQ0FBdUMsc0JBQ3ZDQyxvQ0FBcUMsa0JBR3JDQyxjQUFlLFNBQ2ZDLG9CQUFxQixZQUNyQkMsbUJBQW9CLGdCQUNwQkMsbUJBQW9CLFdBQ3BCQyxxQkFBc0IsYUFDdEJDLHdCQUF5QixpQkFDekJDLDJCQUE0QixvQkFDNUJDLDZCQUE4QixXQUM5QkMsMkJBQTRCLFlBQzVCQyxnQ0FBaUMsdUJBR2pDQyxhQUFjLFFBQ2RDLHVCQUF3QixnQkFDeEJDLHVCQUF3QixnQkFDeEJDLG9CQUFxQixhQUNyQkMsa0JBQW1CLFdBQ25CQyxpQkFBa0IsVUFDbEJDLHFCQUFzQixpQkFDdEJDLGtCQUFtQixXQUNuQkMsMEJBQTJCLFlBQzNCQywwQkFBMkIsU0FDM0JDLDZCQUE4QixpQkFDOUJDLHlCQUEwQixzQ0FHMUJDLGFBQWMsUUFDZEMsc0JBQXVCLGVBQ3ZCQyxtQkFBb0IsWUFDcEJDLDJCQUE0Qiw0QkFHNUJDLGFBQWMsUUFDZEMsb0JBQXFCLGFBQ3JCQyxzQkFBdUIsZUFDdkJDLHNCQUF1Qix3QkFDdkJDLGtCQUFtQixXQUNuQkMsaUJBQWtCLFVBQ2xCQyxxQkFBc0IsaUJBQ3RCQyw4QkFBK0IsU0FDL0JDLDhCQUErQixvQ0FDL0JDLHlCQUEwQixnQ0FDMUJDLDZCQUE4QixlQUM5QkMsMEJBQTJCLFlBRzNCQyxzQ0FBdUMsZ0NBQ3ZDQyxxQ0FBc0MsNkJBQ3RDQyw0Q0FBNkMsNkVBQzdDQywwQ0FBMkMsMEZBQzNDQyx3Q0FBeUMsa0NBQ3pDQyx1Q0FBd0MsMEJBQ3hDQyw4Q0FBK0MsMEVBQy9DQyw2Q0FBOEMsNERBQzlDQyxxQ0FBc0MsOEJBQ3RDQyxvQ0FBcUMsdUJBQ3JDQywyQ0FBNEMsdUVBQzVDQywwQ0FBMkMsMkRIdkY3QyxNQUFNRSxHQUlKL2MsWUFBYS9LLEdBQ1hnTCxLQUFLaEwsSUFBTUEsRUFDWGdMLEtBQUsrYyxjQUFnQixJQUFJQyxFQUFjM0YsSUFDdkMsSUFBSTRGLEVBQVdqZCxLQUFLaEwsSUFBSStGLFVBQWtCLHNCQUF3QixRQUM3RHNjLEdBQWE0RixLQUNoQkEsRUFBVyxTQUViamQsS0FBS1AsS0FBTyxJQUFJeWQsRUFBSyxDQUNuQkMsUUFBU25kLEtBQUsrYyxjQUNkSyxnQkFBaUJILElBRW5CamQsS0FBS3FkLGlCQUdDQSxpQkFDTixNQUFNQyxFQUFhdGQsS0FBS3VkLHNCQUNWM2xCLEVBQUc0bEIsWUFBWUYsRUFBWSxDQUN2Q0csZUFBZSxJQUVYL2dCLFNBQVE5RixJQUNaLEdBQUlBLEVBQUs4bUIsVUFBWTltQixFQUFLTSxLQUFLeW1CLFNBQVMsUUFBUyxDQUMvQyxNQUFNQyxFQUFldG1CLEVBQUtHLEtBQUs2bEIsRUFBWTFtQixFQUFLTSxNQUMxQzJtQixFQUFXam1CLEVBQUdnRyxhQUFhZ2dCLEVBQWMsUUFDL0MsSUFDRSxNQUFNRSxFQUFjQyxFQUFLL00sS0FBSzZNLEdBQzlCeEcsR0FBYXpnQixFQUFLTSxLQUFLaUksUUFBUSxTQUFVLEtBQU8yZSxFQUNoRCxNQUFPaG9CLEdBQ1AyQyxRQUFRekMsTUFBTUYsUUFNZHluQixzQkFDTixNQUFNRCxFQUFhaG1CLEVBQUtHLEtBQUt1SSxLQUFLaEwsSUFBSXFOLFFBQVMsWUFJL0MsT0FIS3pLLEVBQUdvbUIsZUFBZVYsSUFDckIxbEIsRUFBR3NHLGNBQWNvZixHQUVaQSxFQUdUalUsVUFBNEJ4USxFQUFzQnlJLEdBQ2hELE9BQU90QixLQUFLUCxLQUFLNEosVUFBVXhRLEVBQUt5SSxJQUFTekksRUFHM0NnSCxZQUFhb2QsR0FDWGpkLEtBQUtQLEtBQUtJLFlBQVlvZCxHQUN0QmpkLEtBQUtoTCxJQUFJdUYsV0FBVyxDQUNsQixvQkFBcUIwaUIsSUFJekJnQixVQUFXaEIsRUFBa0JpQixHQUMzQixNQUFNQyxFQUFnQm5lLEtBQUsrYyxjQUFjcUIsVUFBVW5CLEdBQ25ELElBQUtrQixFQUNILE9BQU8sRUFFVCxNQUFNRSxFQUFhQyxFQUFNSCxFQUFlRCxHQUV4QyxPQURBbGUsS0FBSytjLGNBQWN3QixVQUFVdEIsRUFBVW9CLElBQ2hDLEVBR1RHLFlBQWF2QixFQUFrQmlCLEdBRTdCLE9BRHNCbGUsS0FBSytjLGNBQWNxQixVQUFVbkIsS0FJbkRqZCxLQUFLK2MsY0FBY3dCLFVBQVV0QixFQUFVaUIsR0FDdkM3RyxHQUFhNEYsR0FBWWlCLEdBQ2xCLEdBR1R0ZSxrQkFDRSxPQUFPekcsT0FBT0MsS0FBS2llLFdJMUVWb0gsV0FBY3JhLEVBMkJ6QnJFLFlBQWF1RSxFQUFxQixJQUNoQ0QsUUFSRnJFLGFBQWtCLFFBU2hCQSxLQUFLc0UsV0FBYUEsRUFDbEJ0RSxLQUFLdUUsT0FBUyxHQUNkdkUsS0FBS3hHLE1BQVEsR0FDYndHLEtBQUt2RixPQUFTLENBQ1prQixZQUFhLElBQUltRSxHQUFpQixlQUNsQ3JFLFNBQVUsSUFBSXFFLEdBQWlCLFlBQy9CeUcsdUJBQXdCLElBQUl6RyxHQUFpQiwwQkFDN0M0RyxvQkFBcUIsSUFBSTVHLEdBQWlCLHVCQUMxQytHLG1CQUFvQixJQUFJL0csR0FBaUIsdUJBRTNDRSxLQUFLMGUsaUJBQ0wxZSxLQUFLakssSUFBTSxJQUFJOEwsR0FBTzdCLE1BQ3RCQSxLQUFLL0ssSUFBTSxJQUFJZ00sR0FBVWpCLE1BQ3pCQSxLQUFLbEwsY0FBZ0IsSUFBSXFoQixHQUFjblcsTUFDdkNBLEtBQUsyZSxhQUNMM2UsS0FBS2pCLE9BckJIL0QsbUJBQ0YsT0FBT2dGLEtBQUs0ZSxjQXVCTkYsaUJBSU4sR0FId0IsS0FBcEIxZSxLQUFLc0UsYUFDUHRFLEtBQUtzRSxXQUFhcEYsSUFBWSx5QkFFb0IsVUFBaEQ1SCxFQUFLZ1ksUUFBUXRQLEtBQUtzRSxZQUFZcEMsY0FFaEMsTUFEQWxDLEtBQUtzRSxXQUFhLEdBQ1pWLE1BQU0scURBRWQ1RCxLQUFLcUMsUUFBVS9LLEVBQUs2RyxRQUFRNkIsS0FBS3NFLFlBQ25CMU0sRUFBR29tQixlQUFlaGUsS0FBS3NFLGFBRW5DMU0sRUFBR2luQixlQUFlLEdBQUc3ZSxLQUFLc0UsY0FJdEJxYSxhQUNOM2UsS0FBSzhWLEdBQUssSUFBSUQsR0FBRzdWLE1BQ2pCQSxLQUFLOGUsUUFBVTllLEtBQUs4VixHQUFHRSxNQUFLLEdBR3RCalgsT0FDTixJQUVFaUIsS0FBS1AsS0FBTyxJQUFJcWQsR0FBWTljLE1BQzVCQSxLQUFLd0UsUUFBVSxJQUFJQSxHQUFReEUsTUFDM0JBLEtBQUs0ZSxjQUFnQixJQUFJcE8sR0FBYXhRLE1BRXRDZ0IsR0FBcUIsU0FDckIrZCxLQUFnQjVlLFNBQVNILE1DNUZ0QixDQUNMRyxTQUFVbkwsR0FDUkEsRUFBSXlGLE9BQU9rQixZQUFZd0UsU0FBUyxPQUFRNmUsSUFDeENocUIsRUFBSXlGLE9BQU9rQixZQUFZd0UsU0FBUyxTQUFVOGUsTUQwRnZCOWUsU0FBU0gsTUFDNUJnQixHQUFxQixJQUVyQmhCLEtBQUs0ZSxjQUFjNU4sT0FDbkJoUixLQUFLa2YsVUFBWSxJQUFJL2EsR0FBVW5FLE1BQy9CLE1BQU9sSyxHQUdQLE1BRkFrSyxLQUFLd0YsS0FBSzdELEdBQWN5RSxpQkFBa0IsR0FDMUNwRyxLQUFLakssSUFBSUMsTUFBTUYsR0FDVEEsR0FTVjBGLElBQUtMLEVBQXNCakUsR0FDekIsR0FBSUEsRUFFRixPQURBOEksS0FBS2hGLGFBQWF3VyxlQUFldGEsRUFBTWlFLEdBQ2hDNkUsS0FBS2hGLGFBQWFDLFVBQVUvRCxHQUduQyxPQUR1QmlFLEVBQU82RSxNQUtsQ21mLG1CQUMwQixLQUFwQm5mLEtBQUtzRSxhQUNQdEUsS0FBSy9LLElBQUk4SixPQUNUaUIsS0FBSy9LLElBQUl3TSxnQkFJYjFHLFVBQWM3RCxHQUNaLE9BQUtBLEVBR0l3RCxFQUFJc0YsS0FBSzhlLFFBQVM1bkIsR0FGbEI4SSxLQUFLOGUsUUFNaEJ2a0IsV0FBWXBFLEdBQ0w2QyxFQUFtQjdDLElBSXhCNkosS0FBS2xFLFVBQVUzRixHQUNmNkosS0FBSzhWLEdBQUd2YixXQUFXcEUsSUFKakI2SixLQUFLakssSUFBSTJDLEtBQUssMERBT2xCbU0sYUFBY2hNLEVBQWF1bUIsR0FDcEJ2bUIsR0FBUXVtQixJQUNUeG1CLEVBQXVCQyxHQUN6Qm1ILEtBQUtqSyxJQUFJMkMsS0FBSyxjQUFjRyx1QkFHOUJtSCxLQUFLOEUsWUFBWWpNLEVBQUt1bUIsR0FDdEJwZixLQUFLOFYsR0FBR0ksTUFBTXJkLEVBQUt1bUIsS0FHckJ0akIsVUFBVzNGLEdBQ0o2QyxFQUFtQjdDLEdBSXhCZ0QsT0FBT0MsS0FBS2pELEdBQVF1RyxTQUFTeEYsSUFDdkIwQixFQUF1QjFCLEtBQ3pCOEksS0FBS2pLLElBQUkyQyxLQUFLLGNBQWN4Qiw4QkFFckJmLEVBQU9lLElBRWhCcUosRUFBSVAsS0FBSzhlLFFBQVM1bkIsRUFBTWYsRUFBT2UsSUFDL0JvYyxHQUFTOU4sS0FBSzVELEdBQVV1UyxjQUFlLENBQ3JDN1osV0FBWXBELEVBQ1prUixNQUFPalMsRUFBT2UsUUFaaEI4SSxLQUFLakssSUFBSTJDLEtBQUssMERBaUJsQm9NLFlBQWFqTSxFQUFhdW1CLEdBQ25Cdm1CLEdBQVF1bUIsSUFDVHhtQixFQUF1QkMsR0FDekJtSCxLQUFLakssSUFBSTJDLEtBQUssY0FBY0csb0JBRzlCcWQsRUFBTWxXLEtBQUtqRixVQUFVbEMsR0FBTXVtQixJQUd6QnphLGNBQ0YsT0FBTzNFLEtBQUt3RSxRQUFRRyxRQUFRQyxLQUFLNUUsS0FBS3dFLFNBR3hDeEssYUFBY1IsR0FDWixHQUF3QixLQUFwQndHLEtBQUtzRSxXQUVQLE9BREF0RSxLQUFLakssSUFBSUMsTUFBTSxxREFDUixHQUdULFFBQWNnTyxJQUFWeEssR0FBd0MsSUFBakJBLEVBQU1ILE9Bd0IxQixDQUVMLE1BQU1rTCxPQUFFQSxTQUFpQnZFLEtBQUtrZixVQUFVRyxNQUFNN2xCLEdBQzlDLE9BQU8rSyxFQTFCUCxJQUNFLE1BQU02TyxRQUFFQSxFQUFPQyx5QkFBRUEsU0FBbUNmLEdBQWtCdFMsTUFDdEUsR0FBZ0IsYUFBWm9ULEVBQ0YsTUFBTSxJQUFJeFAsTUFBTSxnQ0FDWCxDQUNMNUQsS0FBS2dGLEtBQUtyRCxHQUFjd0UsUUFBUSxLQUN6QmtOLEdBRUh6YixFQUFHMG5CLE9BQU9sTSxHQUFTdmQsT0FBT0MsSUFBUWtLLEtBQUtqSyxJQUFJQyxNQUFNRixTQUdyRGtLLEtBQUtnRixLQUFLLFlBQVksS0FDZnFPLEdBQ0h6YixFQUFHMG5CLE9BQU9sTSxHQUFTdmQsT0FBT0MsSUFBUWtLLEtBQUtqSyxJQUFJQyxNQUFNRixTQUdyRCxNQUFNeU8sT0FBRUEsU0FBaUJ2RSxLQUFLa2YsVUFBVUcsTUFBTSxDQUFDak0sSUFDL0MsT0FBTzdPLEdBRVQsTUFBT3pPLEdBRVAsTUFEQWtLLEtBQUt3RixLQUFLN0QsR0FBY3dFLE9BQVFyUSxHQUMxQkEifQ==
|
|
1
|
+
import e from"fs-extra";import t from"path";import{EventEmitter as r}from"events";import n,{homedir as i}from"os";import{Command as s}from"commander";import a from"inquirer";import{imageSize as o}from"image-size";import{URL as l}from"url";import c from"chalk";import u from"minimatch";import E from"globby";import p from"ejs";import g from"download-git-repo";import _ from"rimraf";import d from"dayjs";import I from"util";import P from"crypto";import h from"mime-types";import m from"qiniu";import C from"md5";import f from"resolve";import{merge as S,get as D,set as L,unset as U}from"lodash";import{spawn as A}from"child_process";import N from"is-wsl";import T from"axios";import B from"form-data";import O from"https";import y from"tunnel";import{JSONStore as b}from"@picgo/store";import R from"cross-spawn";import G from"js-yaml";import{ObjectAdapter as x,I18n as w}from"@picgo/i18n";const M={handle:e=>{const t=e.cmd;t.program.command("install <plugins...>").description("install picgo plugin").alias("add").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,s={proxy:n,registry:i};e.pluginHandler.install(t,s).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall <plugins...>").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update <plugins...>").description("update picgo plugin").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,s={proxy:n,registry:i};e.pluginHandler.update(t,s).catch((t=>{e.log.error(t)}))}))}},$={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}},v=e=>e.startsWith("http://")||e.startsWith("https://"),H=e=>((e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!0}})(e)||(e=encodeURI(e)),e),F=e=>{try{const{width:t=0,height:r=0}=o(e);return{real:!0,width:t,height:r}}catch(e){return{real:!1,width:200,height:200}}},k=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":W(e)?"simple":"unknown",W=r=>{if(t.isAbsolute(r))return!1;const n=t.join(process.cwd(),r);return!e.existsSync(n)&&(!r.includes("/")&&!r.includes("\\"))},q=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,K=e=>e.split(t.sep).join("/"),Y=(e,t=!1)=>{if(e.includes("@")){let r=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(r=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const n=e.match(r);return n?n[2]:(console.warn("can not remove plugin version"),e)}return e},V=[],j=e=>V.some((t=>e.startsWith(t))),Q=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;const z={handle:r=>{r.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((n=>{(async()=>{const i=n.map((e=>v(e)?e:t.resolve(e))).filter((t=>{const n=e.existsSync(t)||v(t);return n||r.log.warn(`${t} does not exist.`),n}));await r.upload(i)})().catch((e=>{r.log.error(e)}))}))}},J=async(e,t,r,n)=>{const i=await e.cmd.inquirer.prompt(t),s="uploader"===r?`picBed.${n}`:"transformer"===r?`transformer.${n}`:n;e.saveConfig({[s]:i})},X={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules").action(((t,r)=>{(async()=>{var n,i;try{switch(t){case"uploader":case"transformer":if(r){const n=e.helper[t].get(r);if(!n)return e.log.error(`No ${t} named ${r}`);n.config&&await J(e,n.config(e),t,r)}else{const r=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],n=await e.cmd.inquirer.prompt(r),i=e.helper[t].get(n[t]);(null==i?void 0:i.config)&&await J(e,i.config(e),t,n[t])}break;case"plugin":if(r){if(r.includes("picgo-plugin-")||(r=`picgo-plugin-${r}`),!Object.keys(e.getConfig("picgoPlugins")).includes(r))return e.log.error(`No plugin named ${r}`);(null===(n=e.pluginLoader.getPlugin(r))||void 0===n?void 0:n.config)&&await J(e,e.pluginLoader.getPlugin(r).config(e),"plugin",r)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],r=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(r.plugin))||void 0===i?void 0:i.config)&&await J(e,e.pluginLoader.getPlugin(r.plugin).config(e),"plugin",r.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin")}const s="plugin"===t?"plugins":t;e.log.success("Configure config successfully!"),e.log.info(`If you want to use this config, please run 'picgo use ${s}'`)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Z={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((r=>{(async()=>{try{let n=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(r){if(!i[r])return e.log.warn(`No module named ${r}`),e.log.warn("Available modules are uploader|transformer|plugins");n.push(i[r])}else n=Object.keys(i).map((e=>i[e]));const s=await t.inquirer.prompt(n);if(s.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{s.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":s.uploader||e.getConfig("picBed.current"),"picBed.uploader":s.uploader||e.getConfig("picBed.current"),"picBed.transformer":s.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},ee={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},te=async(e,r)=>{try{const n=ne(r.tmp),i=t.join(r.tmp,"template");let s={};n.prompts&&n.prompts.length>0&&(s=await e.cmd.inquirer.prompt(n.prompts));let a=await E(["**/*"],{cwd:i,dot:!0});if(a=a.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{u(t,e,{dot:!0})&&(r=t)})),!r||re(e,n.filters[r],s)})),0===a.length)return e.log.warn("Template files not found!");const o=ie(a,i,s);se(r.dest,o),"function"==typeof n.complete&&n.complete({answers:s,options:r,files:a,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},re=(e,t,r)=>{const n=new Function("data","with (data) { return "+t+"}");try{return n(r)}catch(r){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},ne=r=>{const n=t.join(r,"index.js");if(e.existsSync(n)){return require(n)}return{}},ie=(r,n,i)=>{const s={};return r.forEach((r=>{const a=e.readFileSync(t.join(n,r),"utf8"),o=p.render(a,i);(Buffer.isBuffer(o)||/[^\s]/.test(o))&&(s[r]=o)})),s},se=(r,n)=>{Object.keys(n).forEach((i=>{const s=t.join(r,i);e.ensureDirSync(t.dirname(s)),e.writeFileSync(s,n[i])}))},ae=(t,r)=>{r.offline?e.existsSync(r.template)?te(t,r).catch((e=>{t.log.error(e)})):t.log.error(`Local template ${r.template} not found`):(r.template=r.hasSlash?r.template:"PicGo/picgo-template-"+r.template,oe(t,r))},oe=(t,r)=>{e.existsSync(r.tmp)&&_.sync(r.tmp),t.log.info("Template files are downloading..."),g(r.template,r.tmp,{clone:r.clone},(e=>{if(e)return t.log.error(e);t.log.success("Template files are downloaded!"),te(t,r).catch((e=>{t.log.error(e)}))}))},le={handle:async r=>{r.cmd.program.command("init").arguments("<template> [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((n,s,a)=>{(async()=>{try{const o=n.includes("/"),l=!s||"."===s,c=t.resolve(s||"."),u=a.clone||!1,E=a.offline||!1,p=t.join(i(),".picgo/templates",n.replace(/[/:]/g,"-"));a.offline&&(n=p);const g={template:n,project:s,hasSlash:o,inPlace:l,dest:c,clone:u,tmp:p,offline:E};l||e.existsSync(c)?await r.cmd.inquirer.prompt([{type:"confirm",message:l?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((e=>{e.ok&&ae(r,g)})):ae(r,g)}catch(e){if(r.log.error(e),process.argv.includes("--debug"))throw e}})().catch((e=>{r.log.error(e)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(c.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(c.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},ce={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const r=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:r,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],n=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(n.i18n),void e.log.success(`Language set to ${n.i18n}`)}if(!r.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class ue{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var r;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),ue.currentPlugin&&(this.pluginIdMap.has(ue.currentPlugin)?null===(r=this.pluginIdMap.get(ue.currentPlugin))||void 0===r||r.push(e):this.pluginIdMap.set(ue.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const Ee=(e=null)=>{ue.currentPlugin=e};class pe{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new s,this.inquirer=a,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("0.0.9","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",M),e.cmd.register("config",$),e.cmd.register("setting",X),e.cmd.register("upload",z),e.cmd.register("use",Z),e.cmd.register("proxy",ee),e.cmd.register("init",le),e.cmd.register("i18n",ce)}register(e,t){var r;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const n=ue.currentPlugin;null!==n&&(this.pluginIdMap.has(n)?null===(r=this.pluginIdMap.get(n))||void 0===r||r.push(e):this.pluginIdMap.set(n,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var ge,_e,de;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(ge||(ge={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(_e||(_e={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(de||(de={}));class Ie{constructor(e){this.level={[ge.success]:"green",[ge.info]:"blue",[ge.warn]:"yellow",[ge.error]:"red"},this.ctx=e}handleLog(e,...r){if(!this.ctx.getConfig("silent")){const n=c[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...r),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||t.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const t=this.checkLogFileIsLarge(this.logPath);if(t.isLarge){const e=`Log file is too large (> ${t.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(c.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),r.unshift(e)}this.handleWriteLog(this.logPath,e,...r)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(t){if(e.existsSync(t)){const r=e.statSync(t).size,n=1024*((e=0)=>isNaN(Number(e))?0:Number(e))(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:r>n,logFileSize:r,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(t){e.existsSync(t)&&(e.unlinkSync(t),e.createFileSync(t))}handleWriteLog(t,r,...n){try{if(this.checkLogLevel(r,this.logLevel)){let i=`${d().format("YYYY-MM-DD HH:mm:ss")} [PicList ${r.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===r?i+=`\n------Error Stack Begin------\n${I.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),i+=`${e} `)})),i+="\n",e.appendFileSync(t,i)}}catch(e){console.error("[PicList Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(ge.success,...e)}info(...e){return this.handleLog(ge.info,...e)}error(...e){return this.handleLog(ge.error,...e)}warn(...e){return this.handleLog(ge.warn,...e)}debug(...e){"development"===process.env.NODE_ENV&&this.handleLog(ge.info,...e)}}class Pe extends r{constructor(e){super(),this.ctx=e}async start(e){const t=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");return t.input=e,t.output=[],await this.beforeTransform(t),await this.doTransform(t),await this.beforeUpload(t),await this.doUpload(t),await this.afterUpload(t),t}catch(e){if(t.log.warn(_e.FAILED),t.emit(_e.UPLOAD_PROGRESS,-1),t.emit(_e.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(_e.UPLOAD_PROGRESS,0),e.emit(_e.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(_e.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let r=t,n=e.helper.transformer.get(t);return n||(n=e.helper.transformer.get("path"),r="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${r}]`),await(null==n?void 0:n.handle(e)),e}async beforeUpload(e){return e.emit(_e.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(_e.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms",r=e.helper.uploader.get(t),n=t;r||(t="smms",n="smms",r=e.helper.uploader.get("smms"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - smms`)),e.log.info(`Uploading... Current uploader is [${n}]`),await(null==r?void 0:r.handle(e));for(const r of e.output)r.type=t;return e}async afterUpload(e){e.emit(_e.AFTER_UPLOAD,e),e.emit(_e.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const r=e.output.length;for(let n=0;n<r;n++)void 0!==e.output[n].imgUrl&&(t+=H(e.output[n].imgUrl),n!==r-1&&(t+="\n")),delete e.output[n].base64Image,delete e.output[n].buffer;return e.emit(_e.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const r=e.getList(),n=e.getIdList(),i=e.getName();return await Promise.all(r.map((async(e,r)=>{try{t.log.info(`${i}: ${n[r]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${n[r]} error`),e}}))),t}}const he=(e,t,r,n="")=>({method:"POST",url:`https://${n||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicGo",Authorization:r},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),me=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const r=e.output;for(const n of r)if(n.fileName&&n.buffer){let r=n.buffer;!r&&n.base64Image&&(r=Buffer.from(n.base64Image,"base64"));const i=he(n.fileName,r,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),r=JSON.parse(t);if("success"===r.code)delete n.base64Image,delete n.buffer,n.imgUrl=r.data.url,n.hash=r.data.hash;else{if("image_repeated"!==r.code||"string"!=typeof r.images)throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.message}),new Error(r);delete n.base64Image,delete n.buffer,n.imgUrl=r.images}}catch(t){throw e.log.error(t),new Error(t)}}return e},Ce=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"password",get alias(){return e.i18n.translate("PICBED_SMMS_TOKEN")},default:t.token||"",required:!0},{name:"backupDomain",type:"input",get prefix(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},get message(){return e.i18n.translate("PICBED_SMMS_MESSAGE_BACKUP_DOMAIN")},get alias(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},default:t.backupDomain||"",required:!1}]};const fe=(e,t)=>{const r=e.secretId,n=e.secretKey,i=e.appId,s=e.bucket;let a,o="";if(e.version&&"v4"!==e.version){const r=Math.floor((new Date).getTime()/1e3);o=`${r};${r+86400}`;const i=P.createHmac("sha1",n).update(o).digest("hex"),s=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${o}\n${P.createHash("sha1").update(s).digest("hex")}\n`;a=P.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${s}&k=${r}&e=${t+3600}&t=${t}&r=${e}&f=`,l=P.createHmac("sha1",n).update(o).digest(),c=Buffer.concat([l,Buffer.from(o)]);a=Buffer.from(c).toString("base64")}return{signature:a,appId:i,bucket:s,signTime:o}},Se=(e,t,r,n,i)=>{const s=e.area,a=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(a)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.cos.${e.area}.myqcloud.com`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${r.signTime}&q-key-time=${r.signTime}&q-header-list=host&q-url-param-list=&q-signature=${r.signature}`,contentType:h.lookup(t),userAgent:`PicGo;${i};null;null`},body:n,resolveWithFullResponse:!0}:{method:"POST",url:`http://${s}.file.myqcloud.com/files/v2/${r.appId}/${r.bucket}/${encodeURI(a)}${t}`,headers:{Host:`${s}.file.myqcloud.com`,Authorization:r.signature,contentType:"multipart/form-data",userAgent:`PicGo;${i};null;null`},formData:{op:"upload",filecontent:n},resolveWithFullResponse:!0}},De=async e=>{var t,r,n;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const s=e.output,a=i.customUrl,o=i.path,l=!i.version||"v4"===i.version;for(const c of s)if(c.fileName&&c.buffer){const s=fe(i,c.fileName);if(!s)return!1;let u=c.buffer;!u&&c.base64Image&&(u=Buffer.from(c.base64Image,"base64"));const E=Se(i,c.fileName,s,u,e.GUI_VERSION||e.VERSION),p=await e.request(E).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let g;if(g=l&&"string"==typeof p?JSON.parse(p):p,400===g.statusCode)throw(null===(t=null==g?void 0:g.body)||void 0===t?void 0:t.err)?g.body.err:new Error((null===(r=null==g?void 0:g.body)||void 0===r?void 0:r.msg)||(null===(n=null==g?void 0:g.body)||void 0===n?void 0:n.message));const _=i.options||"";if(l&&"SUCCESS"===g.message)delete c.base64Image,delete c.buffer,c.imgUrl=a?`${a}/${o}${c.fileName}`:`${g.data.source_url}${_}`;else{if(l||!g||200!==g.statusCode)throw new Error(p.body.msg);delete c.base64Image,delete c.buffer,c.imgUrl=a?`${a}/${encodeURI(o)}${encodeURI(c.fileName)}${_}`:`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURI(o)}${encodeURI(c.fileName)}${_}`}}return e}catch(t){if(!i.version||"v4"===i.version)try{const r=JSON.parse(t.error);e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:r.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},Le=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const Ue=(e,t,r)=>{const n=t.path||"",{token:i,repo:s}=t;return{method:"PUT",url:`https://api.github.com/repos/${s}/contents/${encodeURI(n)}${encodeURI(e)}`,headers:{Authorization:`token ${i}`,"User-Agent":"PicGo","Content-Type":h.lookup(e)},body:r,json:!0}},Ae=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i={message:"Upload by PicGo",branch:t.branch,content:r,path:t.path+encodeURI(n.fileName)},s=Ue(n.fileName,t,i),a=await e.request(s);if(!a)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,t.customUrl?n.imgUrl=`${t.customUrl}/${t.path}${n.fileName}`:n.imgUrl=a.content.download_url,n.hash=a.content.sha}return e}catch(t){throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},Ne=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function Te(e,t,r,n){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),s=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(s+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${r}`,"Content-Type":h.lookup(t)||"application/octet-stream"},body:n}}function Be(e){const t=e.accessKey,r=e.secretKey,n=new m.auth.digest.Mac(t,r),i={scope:e.bucket};return new m.rs.PutPolicy(i).uploadToken(n)}const Oe=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=Te(t,n.fileName,Be(t),r),s=await e.request(i),a=JSON.parse(s);if(!(null==a?void 0:a.key))throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:a.msg}),e.log.error("qiniu error",a),new Error("Upload failed");{delete n.base64Image,delete n.buffer;const e=t.url,r=t.options;n.imgUrl=`${e}/${a.key}${r}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const r=t.response.body;e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.error})}throw t}},ye=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const be=(e,t,r)=>{const n={method:"POST",url:"https://api.imgur.com/3/image",headers:{Authorization:`Client-ID ${e.clientId}`,"content-type":"multipart/form-data",Host:"api.imgur.com","User-Agent":"PicGo"},formData:{image:r,type:"base64",name:t}};return e.proxy&&(n.proxy=e.proxy),n},Re=async e=>{var t;const r=e.getConfig("picBed.imgur");if(!r)throw new Error("Can't find imgur config");try{const t=e.output;for(const n of t)if(n.fileName&&n.buffer){const t=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=be(r,n.fileName,t),s=await e.request(i),a="string"==typeof s?JSON.parse(s):s;if(!a.success)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,n.imgUrl=a.data.link,n.hash=a.data.deletehash}return e}catch(r){throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:"http://docs.imgur.com/api/errno/"}),(null===(t=null==r?void 0:r.response)||void 0===t?void 0:t.data)||r}},Ge=e=>{const t=e.getConfig("picBed.imgur")||{};return[{name:"clientId",type:"input",get alias(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},default:t.clientId||"",required:!0},{name:"proxy",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get alias(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_PROXY")},default:t.proxy||"",required:!1}]};const xe=(e,t)=>{const r=(new Date).toUTCString(),n=h.lookup(t);if(!n)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${n}\n${r}\n/${e.bucket}/${e.path}${t}`,s=P.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${s}`},we=(e,t,r,n)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURI(t)}`,headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:r,Date:(new Date).toUTCString(),"Content-Type":h.lookup(t)},body:n,resolveWithFullResponse:!0}),Me=async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");t.path=t.path.replace(/\/*$/,"").replace(/^\/*/,"")+"/";try{const r=e.output,n=t.customUrl,i=t.path;for(const s of r)if(s.fileName&&s.buffer){const r=xe(t,s.fileName);let a=s.buffer;!a&&s.base64Image&&(a=Buffer.from(s.base64Image,"base64"));const o=we(t,s.fileName,r,a);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=t.options||"";s.imgUrl=n?`${n}/${i}${s.fileName}${e}`:`https://${t.bucket}.${t.area}.aliyuncs.com/${i}${s.fileName}${e}`}}return e}catch(t){throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},$e=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const ve=(e,t)=>{const r=e.path||"",n=e.operator,i=e.password,s=C(i),a=(new Date).toUTCString(),o=`PUT&${`/${e.bucket}/${encodeURI(r)}${encodeURI(t)}`}&${a}`;return`UPYUN ${n}:${P.createHmac("sha1",s).update(o).digest("base64")}`},He=(e,t,r,n)=>{const i=e.bucket,s=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(s)}${encodeURI(t)}`,headers:{Authorization:r,Date:(new Date).toUTCString(),"Content-Type":h.lookup(t)||"application/octet-stream"},body:n,resolveWithFullResponse:!0}},Fe=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const r=e.output,n=t.path||"";for(const i of r)if(i.fileName&&i.buffer){let r=i.buffer;!r&&i.base64Image&&(r=Buffer.from(i.base64Image,"base64"));const s=ve(t,i.fileName),a=He(t,i.fileName,s,r);if(200!==(await e.request(a)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${n}${i.fileName}${t.options}`}return e}catch(t){if("Upload failed"===t.message)e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const r=function(e){try{return JSON.parse(e)}catch(t){return e}}(t.error);e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof r?r.code:r}),text:"http://docs.upyun.com/api/errno/"})}throw t}},ke=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const We=(e,t,r)=>({method:"PUT",url:`${e.host}/${encodeURI(e.path)}${encodeURI(t)}`,headers:{Authorization:`Basic ${Buffer.from(`${e.username}:${e.password}`).toString("base64")}`,"Content-Type":h.lookup(t),"Content-Length":r.length},body:r,resolveWithFullResponse:!0}),qe=async e=>{const t=e.getConfig("picBed.webdavplist");if(!t)throw new Error("Can't find webdavplist config");t.host=t.host.replace("https://","").replace("http://","").replace(/\/+$/,""),t.sslEnabled?t.host="https://"+t.host:t.host="http://"+t.host,t.path=t.path.replace(/^\/*/,"").replace(/\/*$/,"")+"/";try{const r=e.output,n=t.customUrl,i=t.path;for(const s of r)if(s.fileName&&s.buffer){let r=s.buffer;!r&&s.base64Image&&(r=Buffer.from(s.base64Image,"base64"));const a=We(t,s.fileName,r),o=await e.request(a);if(!(o.statusCode>=200&&o.statusCode<300))throw new Error("Upload failed");delete s.base64Image,delete s.buffer,s.imgUrl=n?`${n}/${i}${s.fileName}`:`${t.host}/${i}${s.fileName}`}return e}catch(t){throw e.emit(_e.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},Ke=e=>{const t=e.getConfig("picBed.webdavplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_HOST")},default:t.host||"",required:!0},{name:"sslEnabled",type:"confirm",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},required:!0,default:t.sslEnabled||!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED")}},{name:"username",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},default:t.username||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_USERNAME")}},{name:"password",type:"password",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},default:t.password||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PASSWORD")}},{name:"path",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},default:t.path||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PATH")}},{name:"customUrl",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},default:t.customUrl||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL")}}]};const Ye=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:Me,config:$e})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:De,config:Le})}(e),function(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:me,config:Ce})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:Ae,config:Ne})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:Oe,config:ye})}(e),function(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:Re,config:Ge})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:Fe,config:ke})}(e),function(e){e.helper.uploader.register("webdavplist",{get name(){return e.i18n.translate("PICBED_WEBDAVPLIST")},handle:qe,config:Ke})}(e)}}),Ve=(e,t,r)=>{const n=F(t);return n.real||(e.log.warn(`can't get ${r}'s image size`),e.log.warn("fallback to 200 * 200")),n};var je={handle:async r=>{const n=r.output;return await Promise.all(r.input.map((async(i,s)=>{let a;if(a=v(i)?await(async(e,r)=>{e=H(e);let n,i=!1,s="";const a=new Promise(((a,o)=>{(async()=>{var o;try{const o=await r.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>{const t=e.headers["content-type"];return(null==t?void 0:t.includes("image"))&&(i=!0,s=`.${String(t.split("image/")[1])}`),e.data}));if(clearTimeout(n),i){const r=new l(e).pathname;a({buffer:o,fileName:t.basename(r),extname:s,success:!0})}else a({success:!1,reason:`${e} is not image`})}catch(t){clearTimeout(n),a({success:!1,reason:`request ${e} error, ${null!==(o=null==t?void 0:t.message)&&void 0!==o?o:""}`})}})().catch(o)})),o=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),1e4)}));return Promise.race([a,o])})(i,r):await(async r=>{try{return{extname:t.extname(r),fileName:t.basename(r),buffer:await e.readFile(r),success:!0}}catch(e){return{reason:`read file ${r} error`,success:!1}}})(i),!a.success||!a.buffer)throw new Error(a.reason);{const e=Ve(r,a.buffer,i);n[s]={buffer:a.buffer,fileName:a.fileName,width:e.width,height:e.height,extname:a.extname}}}))),r.output=n.filter((e=>e)),r}};var Qe={handle:async e=>(e.output.push(...e.input),e)};class ze{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const r=t.join(this.ctx.baseDir,"package.json");if(!e.existsSync(r)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};e.writeFileSync(r,JSON.stringify(t),"utf8")}}resolvePlugin(e,r){try{return f.sync(r,{basedir:e.baseDir})}catch(n){return t.join(e.baseDir,"node_modules",r)}}load(){const r=t.join(this.ctx.baseDir,"package.json"),n=t.join(this.ctx.baseDir,"node_modules/");if(!e.existsSync(n))return!1;const i=e.readJSONSync(r),s=Object.keys(i.dependencies||{}),a=Object.keys(i.devDependencies||{}),o=s.concat(a).filter((t=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(t))return!1;const r=this.resolvePlugin(this.ctx,t);return e.existsSync(r)}));for(const e of o)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),Ee(e);const r=t(this.ctx);this.pluginMap.set(e,r),r.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),Ee(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(_e.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),Ee(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const r=t.join(this.ctx.baseDir,"node_modules/"),n=require(r+e)(this.ctx);return this.pluginMap.set(e,n),n}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const Je={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\r\nproperty fileTypes : {{«class PNGf», ".png"}}\r\n\r\non run argv\r\n\tif argv is {} then\r\n\t\treturn ""\r\n\tend if\r\n\r\n\tif ((clipboard info) as string) contains "«class furl»" then\r\n\t\treturn POSIX path of (the clipboard as «class furl»)\r\n\telse\r\n\t\tset imagePath to (item 1 of argv)\r\n\t\tset theType to getType()\r\n\r\n\t\tif theType is not missing value then\r\n\t\t\ttry\r\n\t\t\t\tset myFile to (open for access imagePath with write permission)\r\n\t\t\t\tset eof myFile to 0\r\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\r\n\t\t\t\tclose access myFile\r\n\t\t\t\treturn (POSIX path of imagePath)\r\n\t\t\ton error\r\n\t\t\t\ttry\r\n\t\t\t\t\tclose access myFile\r\n\t\t\t\tend try\r\n\t\t\t\treturn "no image"\r\n\t\t\tend try\r\n\t\telse\r\n\t\t\treturn "no image"\r\n\t\tend if\r\n\tend if\r\nend run\r\n\r\non getType()\r\n\trepeat with aType in fileTypes\r\n\t\trepeat with theInfo in (clipboard info)\r\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\r\n\t\tend repeat\r\n\tend repeat\r\n\treturn missing value\r\nend getType\r\n',win32:'\r\nparam($imagePath)\r\n\r\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\n\r\nAdd-Type -Assembly PresentationCore\r\n$img = [Windows.Clipboard]::GetImage()\r\n\r\nif ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\nif (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n$encoder.Save($stream) | out-null\r\n$stream.Dispose() | out-null\r\n\r\n$imagePath\r\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\nparam($imagePath)\r\n\r\n# https://github.com/PowerShell/PowerShell/issues/7233\r\n# fix the output encoding bug\r\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\r\n\r\nAdd-Type -Assembly PresentationCore\r\nfunction main {\r\n $img = [Windows.Clipboard]::GetImage()\r\n\r\n if ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n if (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n $encoder.Save($stream) | out-null\r\n $stream.Dispose() | out-null\r\n\r\n $imagePath\r\n # fix windows 10 native cmd crash bug when "picgo upload"\r\n # https://github.com/PicGo/PicGo-Core/issues/32\r\n Exit 1\r\n}\r\n\r\ntry {\r\n # For WIN10\r\n $file = Get-Clipboard -Format FileDropList\r\n if ($file -ne $null) {\r\n Convert-Path $file\r\n Exit 1\r\n }\r\n} catch {\r\n # For WIN7 WIN8 WIN10\r\n main\r\n}\r\n\r\nmain',linux:'#!/bin/sh\r\n\r\nif [ -z "$DISPLAY" ]; then\r\n echo "no support" >&2\r\n exit 1\r\nfi\r\n\r\ncase "$XDG_SESSION_TYPE" in\r\nwayland)\r\n command -v wl-copy >/dev/null 2>&1 || {\r\n echo >&2 "no wl-clipboard"\r\n exit 1\r\n }\r\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nx11 | tty)\r\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\r\n command -v xclip >/dev/null 2>&1 || {\r\n echo >&2 "no xclip"\r\n exit 1\r\n }\r\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\r\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nesac\r\n',wsl:'#!/bin/sh\r\n# grab the paths\r\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\r\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\r\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\r\n\r\n# run the powershell script\r\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\r\n\r\n# note that there is a return symbol in powershell result\r\nnoImage=$(echo "no image\\r")\r\n\r\n# check whether image exists\r\nif [ "$res" = "$noImage" ] ;then\r\n echo "no image"\r\nelse\r\n echo $(wslpath -u -a "${res}")\r\nfi\r\n'},Xe={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Ze=async r=>{!function(r){const n=t.join(r.baseDir,"piclist-clipboard-images");e.existsSync(n)||e.mkdirSync(n)}(r);const i=t.join(r.baseDir,"piclist-clipboard-images",`${d().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((s,a)=>{const o=(()=>{const e=process.platform;if(N)return"wsl";if("win32"===e)return"10"===n.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),l=t.join(r.baseDir,Xe[o]);let c;e.existsSync(l)||e.writeFileSync(l,Je[o],"utf8"),c="darwin"===o?A("osascript",[l,i]):"win32"===o||"win10"===o?A("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",l,i]):A("sh",[l,i]),c.stdout.on("data",(n=>{if("linux"===o&&"no xclip or wl-clipboard"===n.toString().trim())return r.emit(_e.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),a(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const l=n.toString().trim();let c=!1;if(t.basename(l)!==t.basename(i)&&e.existsSync(l)&&(c=!0),"no image"!==l&&!e.existsSync(l))return a(new Error(`Can't find ${l}`));s({imgPath:l,shouldKeepAfterUploading:c})}))}))},et=new r,tt=new O.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function rt(e,t,r){"object"==typeof r&&"value"in r&&"options"in r?e.append(t,r.value,r.options):e.append(t,r)}function nt(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function it(e){var t,r,n,i,s,a,o;const l={method:(null===(r=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===r?void 0:r.toUpperCase())||"",url:(null===(n=null==e?void 0:e.config)||void 0===n?void 0:n.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,statusCode:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.status)||0,body:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||""}};return Promise.reject(l)}class st{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),et.on(de.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new l(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=y.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=tt;const r=T.create(this.options);r.interceptors.response.use(nt,it);const n=function(e){var t;let r=!1;const n=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new l(e.proxy)}catch(e){i=!1,n.proxy=!1,console.error(e)}r=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(n.proxy=!1,n.httpsAgent=y.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):n.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new B;for(const r in e.formData)rt(t,r,e.formData[r]);n.data=t,n.headers=Object.assign(n.headers||{},t.getHeaders()),r=!0,delete n.formData}return"body"in e&&(n.data=e.body,r=!0,delete n.body),"qs"in e&&(n.params=e.qs,r=!0),n.__isOldOptions=r,n}(e);return r.interceptors.request.use((function(e){var t,r,n;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?r.request(n):r.request(n).then((t=>n.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class at{constructor(e){if(this.ctx=e,this.db=new b(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"smms",current:"smms"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class ot{constructor(e){this.ctx=e}async install(e,t={},r){const n=[],i=e.map((e=>lt(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(n.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),s=i.map((e=>e.fullName)),a=i.map((e=>e.pkgName));if(s.length>0){const e=await this.execCommand("install",s,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}a.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...n]});return{success:!0,body:[...a,...n]}}if(0===n.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...a,...n]});return{success:!0,body:[...a,...n]}}async uninstall(e){const t=e.map((e=>lt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(t.length>0){const e=await this.execCommand("uninstall",t,this.ctx.baseDir);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}t.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:t});return{success:!0,body:t}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t={},r){const n=e.map((e=>lt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(n.length>0){const e=await this.execCommand("update",n,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:n});return{success:!0,body:n}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,r,n={},i={}){const s=n.registry||this.ctx.getConfig("settings.registry"),a=n.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((n=>{var o,l;let c=[e].concat(t).concat("--color=always").concat("--save");s&&(c=c.concat(`--registry=${s}`)),a&&(c=c.concat(`--proxy=${a}`));try{const e=R("npm",c,{cwd:r,env:Object.assign({},process.env,i)});let t="";null===(o=e.stdout)||void 0===o||o.on("data",(e=>{t+=e})).pipe(process.stdout),null===(l=e.stderr)||void 0===l||l.on("data",(e=>{t+=e})).pipe(process.stderr),e.on("close",(e=>{n(e?{code:e,data:t}:{code:0,data:t})})),e.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(_e.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(_e.FAILED,e)}}))}}const lt=(r,n)=>{const i={success:!1,fullName:"",pkgName:""},s=((r,n=console)=>{switch(k(r)){case"normal":case"scope":return r;case"simple":return q(r);default:{let i=r;return t.isAbsolute(r)&&e.existsSync(r)?K(i):(i=t.join(process.cwd(),r),e.existsSync(i)?K(i):(n.warn(`Can't find plugin ${r}`),""))}}})(n,r.log);if(!s)return i;const a=((r,n=console)=>{var i;switch(k(r)){case"normal":return Y(r);case"scope":return Y(r,!0);case"simple":return Y(q(r));default:{if(!e.existsSync(r))return n.warn(`Can't find plugin: ${r}`),"";const s=t.posix.join(r,"package.json");if(e.existsSync(s)){const t=e.readJSONSync(s)||{};return(null===(i=t.name)||void 0===i?void 0:i.includes("picgo-plugin-"))?t.name:(n.warn(`The plugin package.json's name filed is ${t.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return n.warn(`Can't find plugin: ${r}`),""}}})(s,r.log);return a?{success:!0,fullName:s,pkgName:a}:i},ct={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"设定接口网址",PICBED_WEBDAVPLIST_SSLENABLED:"启用SSL",PICBED_WEBDAVPLIST_USERNAME:"设定用户名",PICBED_WEBDAVPLIST_PASSWORD:"设定密码",PICBED_WEBDAVPLIST_PATH:"设定存储路径",PICBED_WEBDAVPLIST_CUSTOMURL:"设定自定义域名",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS时启用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"输入密码",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"設定API主機",PICBED_WEBDAVPLIST_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_USERNAME:"設定用戶名",PICBED_WEBDAVPLIST_PASSWORD:"設定密碼",PICBED_WEBDAVPLIST_PATH:"設定儲存路徑",PICBED_WEBDAVPLIST_CUSTOMURL:"設定自訂網址",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"輸入用戶密碼",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"Set Host",PICBED_WEBDAVPLIST_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_USERNAME:"Set Username",PICBED_WEBDAVPLIST_PASSWORD:"Set Password",PICBED_WEBDAVPLIST_PATH:"Set Path",PICBED_WEBDAVPLIST_CUSTOMURL:"Set Custom URL",PICBED_WEBDAVPLIST_MESSAGE_HOST:"Ex. https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"Ex. me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"Please type the password",PICBED_WEBDAVPLIST_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"Ex. https://test.com",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class ut{constructor(e){this.ctx=e,this.objectAdapter=new x(ct);let t=this.ctx.getConfig("settings.language")||"zh-CN";ct[t]||(t="zh-CN"),this.i18n=new w({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const r=this.getOutterI18nFolder();e.readdirSync(r,{withFileTypes:!0}).forEach((n=>{if(n.isFile()&&n.name.endsWith(".yml")){const i=t.join(r,n.name),s=e.readFileSync(i,"utf8");try{const e=G.load(s);ct[n.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const r=t.join(this.ctx.baseDir,"i18n-cli");return e.pathExistsSync(r)||e.ensureDirSync(r),r}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const r=this.objectAdapter.getLocale(e);if(!r)return!1;const n=S(r,t);return this.objectAdapter.setLocale(e,n),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),ct[e]=t,!0)}getLanguageList(){return Object.keys(ct)}}class Et extends r{constructor(e=""){super(),this.VERSION="0.0.9",this.configPath=e,this.output=[],this.input=[],this.helper={transformer:new ue("transformer"),uploader:new ue("uploader"),beforeTransformPlugins:new ue("beforeTransformPlugins"),beforeUploadPlugins:new ue("beforeUploadPlugins"),afterUploadPlugins:new ue("afterUploadPlugins")},this.initConfigPath(),this.log=new Ie(this),this.cmd=new pe(this),this.pluginHandler=new ot(this),this.initConfig(),this.init()}get pluginLoader(){return this._pluginLoader}initConfigPath(){if(""===this.configPath&&(this.configPath=i()+"/.piclist/config.json"),".JSON"!==t.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=t.dirname(this.configPath);e.pathExistsSync(this.configPath)||e.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new at(this),this._config=this.db.read(!0)}init(){try{this.i18n=new ut(this),this.Request=new st(this),this._pluginLoader=new ze(this),Ee("picgo"),Ye().register(this),{register(e){e.helper.transformer.register("path",je),e.helper.transformer.register("base64",Qe)}}.register(this),Ee(""),this._pluginLoader.load(),this.lifecycle=new Pe(this)}catch(e){throw this.emit(_e.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?D(this._config,e):this._config}saveConfig(e){Q(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(j(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){Q(e)?Object.keys(e).forEach((t=>{j(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),L(this._config,t,e[t]),et.emit(de.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(j(e)?this.log.warn(`the config.${e} can't be unset`):U(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(t){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==t&&0!==t.length){const{output:e}=await this.lifecycle.start(t);return e}try{const{imgPath:t,shouldKeepAfterUploading:r}=await Ze(this);if("no image"===t)throw new Error("image not found in clipboard");{this.once(_e.FAILED,(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([t]);return n}}catch(e){throw this.emit(_e.FAILED,e),e}}}export{pe as Commander,Pe as Lifecycle,ue as LifecyclePlugins,Ie as Logger,Et as PicGo,ot as PluginHandler,ze as PluginLoader,st as Request};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9zZXR0aW5nLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9wcm94eS50cyIsIi4uL3NyYy91dGlscy9pbml0VXRpbHMudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5pdC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pMThuLnRzIiwiLi4vc3JjL2xpYi9MaWZlY3ljbGVQbHVnaW5zLnRzIiwiLi4vc3JjL2xpYi9Db21tYW5kZXIudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5kZXgudHMiLCIuLi9zcmMvdXRpbHMvZW51bS50cyIsIi4uL3NyYy9saWIvTG9nZ2VyLnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUNvbnRleHQudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9zbW1zLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdGN5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9naXRodWIudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9xaW5pdS50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2ltZ3VyLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvYWxpeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci93ZWJkYXYudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvbGliL1BsdWdpbkxvYWRlci50cyIsIi4uL3NyYy91dGlscy9zdGF0aWMudHMiLCIuLi9zcmMvdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UudHMiLCIuLi9zcmMvdXRpbHMvZXZlbnRCdXMudHMiLCIuLi9zcmMvbGliL1JlcXVlc3QudHMiLCIuLi9zcmMvdXRpbHMvZGIudHMiLCIuLi9zcmMvbGliL1BsdWdpbkhhbmRsZXIudHMiLCIuLi9zcmMvaTE4bi9pbmRleC50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vemgtVFcudHMiLCIuLi9zcmMvaTE4bi9lbi50cyIsIi4uL3NyYy9jb3JlL1BpY0dvLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBwbHVnaW5IYW5kbGVyOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICAvLyBjb25zdCBwbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIoY3R4KVxyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luc3RhbGwgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdpbnN0YWxsIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5hbGlhcygnYWRkJylcclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHByb3h5PicsICdBZGQgcHJveHkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgcHJveHksIHJlZ2lzdHJ5IH0gPSBwcm9ncmFtXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgIHByb3h5LFxyXG4gICAgICAgICAgcmVnaXN0cnlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIuaW5zdGFsbChwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndW5pbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5hbGlhcygncm0nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VuaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVuaW5zdGFsbChwbHVnaW5zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBkYXRlIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXBkYXRlIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLm9wdGlvbignLXIsIC0tcmVnaXN0cnkgPHJlZ2lzdHJ5PicsICdDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBwcm94eSxcclxuICAgICAgICAgIHJlZ2lzdHJ5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVwZGF0ZShwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZTogRXJyb3IpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luSGFuZGxlclxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGNvbmZpZzogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdzZXQgY29uZmlnIHBhdGgnKVxyXG4gICAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSAnaW1hZ2Utc2l6ZSdcclxuaW1wb3J0IHtcclxuICBJSW1nU2l6ZSxcclxuICBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbyxcclxuICBJUGx1Z2luTmFtZVR5cGUsXHJcbiAgSUxvZ2dlcixcclxuICBJUGljR29cclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSlcclxuZXhwb3J0IGNvbnN0IGlzVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgdXJsID0gdXJsIHx8ICcnXHJcbiAgdHJ5IHtcclxuICAgIC8vIHRoZSB3aG9sZSB1cmwgZW5jb2RlIG9yIGRlY29kZSBzaG9sZCBub3QgdXNlIGVuY29kZVVSSUNvbXBvbmVudCBvciBkZWNvZGVVUklDb21wb25lbnRcclxuICAgIHJldHVybiB1cmwgIT09IGRlY29kZVVSSSh1cmwpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgLy8gaWYgc29tZSBlcnJvciBjYXVnaHQsIHRyeSB0byBsZXQgaXQgZ29cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjb25zdCBoYW5kbGVVcmxFbmNvZGUgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghaXNVcmxFbmNvZGUodXJsKSkge1xyXG4gICAgdXJsID0gZW5jb2RlVVJJKHVybClcclxuICB9XHJcbiAgcmV0dXJuIHVybFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VTaXplID0gKGZpbGU6IEJ1ZmZlcik6IElJbWdTaXplID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyB3aWR0aCA9IDAsIGhlaWdodCA9IDAgfSA9IGltYWdlU2l6ZShmaWxlKVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogdHJ1ZSxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodFxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIGZhbGxiYWNrIHRvIDIwMCAqIDIwMFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIGhlaWdodDogMjAwXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RlNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlUGF0aCksXHJcbiAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSxcclxuICAgICAgYnVmZmVyOiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCksXHJcbiAgICAgIHN1Y2Nlc3M6IHRydWVcclxuICAgIH1cclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYXNvbjogYHJlYWQgZmlsZSAke2ZpbGVQYXRofSBlcnJvcmAsXHJcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0VVJMRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdXJsID0gaGFuZGxlVXJsRW5jb2RlKHVybClcclxuICBsZXQgaXNJbWFnZSA9IGZhbHNlXHJcbiAgbGV0IGV4dG5hbWUgPSAnJ1xyXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XHJcbiAgY29uc3QgcmVxdWVzdEZuID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcclxuICAgICAgICAgIHVybCxcclxuICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcC5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgICAgICAgICAgaXNJbWFnZSA9IHRydWVcclxuICAgICAgICAgICAgICBleHRuYW1lID0gYC4ke1N0cmluZyhjb250ZW50VHlwZS5zcGxpdCgnaW1hZ2UvJylbMV0pfWBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcC5kYXRhIGFzIEJ1ZmZlclxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxyXG4gICAgICAgIGlmIChpc0ltYWdlKSB7XHJcbiAgICAgICAgICBjb25zdCB1cmxQYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXHJcbiAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgYnVmZmVyOiByZXMsXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgICBleHRuYW1lLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlYXNvbjogYCR7dXJsfSBpcyBub3QgaW1hZ2VgXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcclxuICAgICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IGVycm9yLCAke2Vycm9yPy5tZXNzYWdlID8/ICcnfWBcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KSgpLmNhdGNoKHJlamVjdClcclxuICB9KVxyXG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlKTogdm9pZCA9PiB7XHJcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gdGltZW91dGBcclxuICAgICAgfSlcclxuICAgIH0sIDEwMDAwKVxyXG4gIH0pXHJcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcmVxdWVzdEZuLCB0aW1lb3V0UHJvbWlzZV0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZydzIHR5cGVcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHNjb3BlXHJcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gbm9ybWFsXHJcbiAqIDMuIHh4eCAtPiBzaW1wbGVcclxuICogNC4gbm90IGV4aXN0cyBvciBpcyBhIHBhdGggLT4gdW5rbm93blxyXG4gKiBAcGFyYW0gbmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFBsdWdpbk5hbWVUeXBlID0gKG5hbWU6IHN0cmluZyk6IElQbHVnaW5OYW1lVHlwZSA9PiB7XHJcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xyXG4gICAgcmV0dXJuICdzY29wZSdcclxuICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICByZXR1cm4gJ25vcm1hbCdcclxuICB9IGVsc2UgaWYgKGlzU2ltcGxlTmFtZShuYW1lKSkge1xyXG4gICAgcmV0dXJuICdzaW1wbGUnXHJcbiAgfVxyXG4gIHJldHVybiAndW5rbm93bidcclxufVxyXG5cclxuLyoqXHJcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgc2ltcGxlIHBsdWdpbiBuYW1lIG9yIG5vdFxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiB4eHggLT4gdHJ1ZVxyXG4gKiAyLiAvVXNyL3h4L3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBmYWxzZVxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5OYW1lT3JQYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNTaW1wbGVOYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUobmFtZU9yUGF0aCkpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG5hbWVPclBhdGgpXHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBpZiAobmFtZU9yUGF0aC5pbmNsdWRlcygnLycpIHx8IG5hbWVPclBhdGguaW5jbHVkZXMoJ1xcXFwnKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIHJldHVybiB0cnVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBzdHJlYW1saW5lIHRoZSBmdWxsIHBsdWdpbiBuYW1lIHRvIGEgc2ltcGxlIG9uZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiB4eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teXl5IC0+IHl5eVxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5GdWxsTmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVN0cmVhbWxpbmVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkge1xyXG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLCAnJylcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvcGljZ28tcGx1Z2luLS8sICcnKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGNvbXBsZXRlIHBsdWdpbiBuYW1lIHRvIGZ1bGwgbmFtZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpblNpbXBsZU5hbWVcclxuICogQHBhcmFtIHNjb3BlIHBsdWdpblNjb3BlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZywgc2NvcGUgPSAnJyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHNjb3BlKSB7XHJcbiAgICByZXR1cm4gYEAke3Njb3BlfS9waWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBoYW5kbGUgaW5zdGFsbC91bmluc3RhbGwvdXBkYXRlIHBsdWdpbiBuYW1lIG9yIHBhdGhcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogMy4geHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNC4gLi94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gL2Fic29sdXRlUGF0aC8uLi4veHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDUuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aCBwbHVnaW5OYW1lIG9yIHBsdWdpblBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRQcm9jZXNzUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXHJcbiAgc3dpdGNoIChwbHVnaW5OYW1lVHlwZSkge1xyXG4gICAgY2FzZSAnbm9ybWFsJzpcclxuICAgIGNhc2UgJ3Njb3BlJzpcclxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICAgIGNhc2UgJ3NpbXBsZSc6XHJcbiAgICAgIHJldHVybiBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aClcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgLy8gbm93LCB0aGUgcGx1Z2luTmFtZVR5cGUgaXMgdW5rbm93IGhlcmVcclxuICAgICAgLy8gMS4gY2hlY2sgaWYgaXMgYW4gYWJzb2x1dGUgcGF0aFxyXG4gICAgICBsZXQgcGx1Z2luUGF0aCA9IG5hbWVPclBhdGhcclxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShuYW1lT3JQYXRoKSAmJiBmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcclxuICAgICAgfVxyXG4gICAgICAvLyAyLiBjaGVjayBpZiBpcyBhIHJlbGF0aXZlIHBhdGhcclxuICAgICAgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVVbml4U3R5bGVQYXRoKHBsdWdpblBhdGgpXHJcbiAgICAgIH1cclxuICAgICAgLy8gMy4gaW52YWxpZCBuYW1lT3JQYXRoXHJcbiAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbiAke25hbWVPclBhdGh9YClcclxuICAgICAgcmV0dXJuICcnXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogZ2V0IHRoZSBub3JtYWwgcGx1Z2luIG5hbWVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDMuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNC4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDUuIGFuIGV4Y2VwdGlvbjogW3BhY2thZ2UuanNvbidzIG5hbWVdICE9PSBbZm9sZGVyIG5hbWVdXHJcbiAqIHRoZW4gdXNlIFtwYWNrYWdlLmpzb24ncyBuYW1lXSwgdXN1YWxseSBtYXRjaCB0aGUgc2NvcGUgcGFja2FnZS5cclxuICogNi4gaWYgcGx1Z2luIG5hbWUgaGFzIHZlcnNpb246IHBpY2dvLXBsdWdpbi14eHhAeC54LnggdGhlbiByZW1vdmUgdGhlIHZlcnNpb25cclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXROb3JtYWxQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBsdWdpbk5hbWVUeXBlID0gZ2V0UGx1Z2luTmFtZVR5cGUobmFtZU9yUGF0aClcclxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XHJcbiAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihuYW1lT3JQYXRoKVxyXG4gICAgY2FzZSAnc2NvcGUnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihuYW1lT3JQYXRoLCB0cnVlKVxyXG4gICAgY2FzZSAnc2ltcGxlJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24oaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpKVxyXG4gICAgZGVmYXVsdDoge1xyXG4gICAgICAvLyBub3csIHRoZSBuYW1lT3JQYXRoIG11c3QgYmUgcGF0aFxyXG4gICAgICAvLyB0aGUgbmFtZU9yUGF0aCBoZXJlIHdpbGwgYmUgZW5zdXJlZCB3aXRoIHVuaXggc3R5bGVcclxuICAgICAgLy8gd2UgbmVlZCB0byBmaW5kIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lIGNhdXNlIG5wbSB1c2luZyB0aGUgbmFtZSBpbiBwYWNrYWdlLmpzb24ncyBuYW1lIGZpbGVkXHJcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhuYW1lT3JQYXRoKSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGFja2FnZUpTT05QYXRoID0gcGF0aC5wb3NpeC5qb2luKG5hbWVPclBhdGgsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpTT05QYXRoKSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW4ndCBmaW5kIHBsdWdpbjogJHtuYW1lT3JQYXRofWApXHJcbiAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGtnID0gZnMucmVhZEpTT05TeW5jKHBhY2thZ2VKU09OUGF0aCkgfHwge31cclxuICAgICAgICBpZiAoIXBrZy5uYW1lPy5pbmNsdWRlcygncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICAgICAgICBsb2dnZXIud2FybihgVGhlIHBsdWdpbiBwYWNrYWdlLmpzb24ncyBuYW1lIGZpbGVkIGlzICR7cGtnLm5hbWUgYXMgc3RyaW5nIHx8ICdlbXB0eSd9LCBuZWVkIHRvIGluY2x1ZGUgdGhlIHByZWZpeDogcGljZ28tcGx1Z2luLWApXHJcbiAgICAgICAgICByZXR1cm4gJydcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBrZy5uYW1lXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBoYW5kbGUgdHJhbnNmb3JtIHRoZSBwYXRoIHRvIHVuaXggc3R5bGVcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4gQzpcXFxceHh4XFxcXHh4eCAtPiBDOi94eHgveHh4XHJcbiAqIDIuIC94eHgveHh4IC0+IC94eHgveHh4XHJcbiAqIEBwYXJhbSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlVW5peFN0eWxlUGF0aCA9IChwYXRoU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBhdGhBcnIgPSBwYXRoU3RyLnNwbGl0KHBhdGguc2VwKVxyXG4gIHJldHVybiBwYXRoQXJyLmpvaW4oJy8nKVxyXG59XHJcblxyXG4vKipcclxuICogcmVtb3ZlIHBsdWdpbiB2ZXJzaW9uIHdoZW4gcmVnaXN0ZXIgcGx1Z2luIG5hbWVcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eEAxLjAuMCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICogQHBhcmFtIHNjb3BlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtb3ZlUGx1Z2luVmVyc2lvbiA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIHNjb3BlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghbmFtZU9yUGF0aC5pbmNsdWRlcygnQCcpKSB7XHJcbiAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgcmVnID0gLyguK1xcLyk/KHBpY2dvLXBsdWdpbi1cXHcrKShALispKi9cclxuICAgIC8vIGlmIGlzIGEgc2NvcGUgcGtnXHJcbiAgICBpZiAoc2NvcGUpIHtcclxuICAgICAgcmVnID0gLyguK1xcLyk/KF5AW14vXStcXC9waWNnby1wbHVnaW4tXFx3KykoQC4rKSovXHJcbiAgICB9XHJcbiAgICBjb25zdCBtYXRjaEFyciA9IG5hbWVPclBhdGgubWF0Y2gocmVnKVxyXG4gICAgaWYgKCFtYXRjaEFycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2NhbiBub3QgcmVtb3ZlIHBsdWdpbiB2ZXJzaW9uJylcclxuICAgICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBtYXRjaEFyclsyXVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZSBjb25maWcgYmxhY2sgaXRlbSBsaXN0IHdoaWNoIHdvbid0IGJlIHNldHRlZFxyXG4gKiBvbmx5IGNhbiBiZSBnb3RcclxuICovXHJcbmV4cG9ydCBjb25zdCBjb25maWdCbGFja0xpc3QgPSBbXVxyXG5cclxuLyoqXHJcbiAqIGNoZWNrIHNvbWUgY29uZmlnIGtleSBpcyBpbiBibGFja0xpc3RcclxuICogQHBhcmFtIGtleVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5CbGFja0xpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gY29uZmlnQmxhY2tMaXN0LnNvbWUoYmxhY2tJdGVtID0+IGtleS5zdGFydHNXaXRoKGJsYWNrSXRlbSkpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjaGVjayB0aGUgaW5wdXQgY29uZmlnIGlzIHZhbGlkXHJcbiAqIGNvbmZpZyBtdXN0IGJlIG9iamVjdCBzdWNoIGFzIHsgeHh4OiAneHh4JyB9XHJcbiAqICYmIGNhbid0IGJlIGFycmF5XHJcbiAqIEBwYXJhbSBjb25maWdcclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0lucHV0Q29uZmlnVmFsaWQgPSAoY29uZmlnOiBhbnkpOiBib29sZWFuID0+IHtcclxuICBpZiAoXHJcbiAgICB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJlxyXG4gICAgIUFycmF5LmlzQXJyYXkoY29uZmlnKSAmJlxyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5sZW5ndGggPiAwXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2VcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZTxUPiAoc3RyOiBzdHJpbmcpOiBUIHwgc3RyaW5nIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICByZXR1cm4gc3RyXHJcbiAgfVxyXG59XHJcblxyXG4vLyBob2xkLi4uXHJcbi8vIGV4cG9ydCBjb25zdCBjb25maWdXaGl0ZUxpc3Q6IFJlZ0V4cFtdID0gW1xyXG4vLyAgIC9ecGljQmVkLyxcclxuLy8gICAvXnBpY2dvUGx1Z2lucy8sXHJcbi8vICAgL15AW14vXStcXC9waWNnby1wbHVnaW4tLyxcclxuLy8gICAvZGVidWcvLFxyXG4vLyAgIC9zaWxlbnQvLFxyXG4vLyAgIC9jb25maWdQYXRoLyxcclxuLy8gICAvXnNldHRpbmdzLyxcclxuLy8gXVxyXG5cclxuLy8gZXhwb3J0IGNvbnN0IGlzQ29uZmlnS2V5SW5XaGl0ZUxpc3QgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuLy8gICByZXR1cm4gY29uZmlnV2hpdGVMaXN0LnNvbWUod2hpdGVJdGVtID0+IHdoaXRlSXRlbS50ZXN0KGtleSkpXHJcbi8vIH1cclxuXHJcbmV4cG9ydCBjb25zdCBmb3JjZU51bWJlciA9IChudW06IHN0cmluZyB8IG51bWJlciA9IDApOiBudW1iZXIgPT4ge1xyXG4gIHJldHVybiBpc05hTihOdW1iZXIobnVtKSkgPyAwIDogTnVtYmVyKG51bSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGV2ID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNQcm9kID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nXHJcbn1cclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1cGxvYWQ6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1cGxvYWQnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VwbG9hZCwgZ28gZ28gZ28nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbaW5wdXQuLi5dJylcclxuICAgICAgLmFsaWFzKCd1JylcclxuICAgICAgLmFjdGlvbigoaW5wdXQ6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0TGlzdCA9IGlucHV0XHJcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpc1VybChpdGVtKSA/IGl0ZW0gOiBwYXRoLnJlc29sdmUoaXRlbSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3QgPSBmcy5leGlzdHNTeW5jKGl0ZW0pIHx8IGlzVXJsKGl0ZW0pXHJcbiAgICAgICAgICAgICAgaWYgKCFleGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy53YXJuKGAke2l0ZW19IGRvZXMgbm90IGV4aXN0LmApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBleGlzdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgYXdhaXQgY3R4LnVwbG9hZChpbnB1dExpc3QpXHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1cGxvYWRcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG4vLyBoYW5kbGUgbW9kdWxlcyBjb25maWcgLT4gc2F2ZSB0byBwaWNnbyBjb25maWcgZmlsZVxyXG5jb25zdCBoYW5kbGVDb25maWcgPSBhc3luYyAoY3R4OiBJUGljR28sIHByb21wdHM6IElQbHVnaW5Db25maWdbXSwgbW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG1vZHVsZSA9PT0gJ3VwbG9hZGVyJ1xyXG4gICAgPyBgcGljQmVkLiR7bmFtZX1gIDogbW9kdWxlID09PSAndHJhbnNmb3JtZXInXHJcbiAgICAgID8gYHRyYW5zZm9ybWVyLiR7bmFtZX1gIDogbmFtZVxyXG4gIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgIFtjb25maWdOYW1lXTogYW5zd2VyXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgc2V0dGluZyA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3NldCcpXHJcbiAgICAgIC5hbGlhcygnY29uZmlnJylcclxuICAgICAgLmFyZ3VtZW50cygnPG1vZHVsZT4gW25hbWVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjb25maWd1cmUgY29uZmlnIG9mIHBpY2dvIG1vZHVsZXMnKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICAgICAgICAvLyBhd2FpdCBjdHgucGx1Z2luTG9hZGVyLmxvYWQoKVxyXG4gICAgICAgICAgICAvLyBpZiBhIG1vZHVsZSBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcclxuICAgICAgICAgICAgc3dpdGNoIChtb2R1bGUpIHtcclxuICAgICAgICAgICAgICBjYXNlICd1cGxvYWRlcic6XHJcbiAgICAgICAgICAgICAgY2FzZSAndHJhbnNmb3JtZXInOlxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQobmFtZSlcclxuICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cuZXJyb3IoYE5vICR7bW9kdWxlfSBuYW1lZCAke25hbWV9YClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBpdGVtLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7bW9kdWxlfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyW21vZHVsZV0uZ2V0SWRMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEobikgJHttb2R1bGV9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdDogY3R4LmdldENvbmZpZygncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZygncGljQmVkLmN1cnJlbnQnKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KGFuc3dlclttb2R1bGVdKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXJbbW9kdWxlXSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBjYXNlICdwbHVnaW4nOlxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gYHBpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjdHguZ2V0Q29uZmlnKCdwaWNnb1BsdWdpbnMnKSkuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSk/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGBObyBwbHVnaW4gbmFtZWQgJHtuYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2hvb3NlIGEgcGx1Z2luJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIGFuc3dlci5wbHVnaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdBdmFpbGFibGUgbW9kdWxlcyBhcmUgdXBsb2FkZXJ8dHJhbnNmb3JtZXJ8cGx1Z2luJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB1c2VNb2R1bGVOYW1lID0gbW9kdWxlID09PSAncGx1Z2luJyA/ICdwbHVnaW5zJyA6IG1vZHVsZVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICAgIGN0eC5sb2cuaW5mbyhgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29uZmlnLCBwbGVhc2UgcnVuICdwaWNnbyB1c2UgJHt1c2VNb2R1bGVOYW1lfSdgKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzZXR0aW5nXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiwgVW5kZWZpbmFibGUsIElDTElDb25maWdzLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1c2U6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1c2UnKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbW9kdWxlXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXNlIG1vZHVsZXMgb2YgcGljZ28nKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBJQ0xJQ29uZmlncyA9IHtcclxuICAgICAgICAgICAgICB1cGxvYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYW4gdXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYSB0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7aXRlbX1gKSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzLnB1c2goY29uZmlnW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdBdmFpbGFibGUgbW9kdWxlcyBhcmUgdXBsb2FkZXJ8dHJhbnNmb3JtZXJ8cGx1Z2lucycpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHByb21wdHMgPSBPYmplY3Qua2V5cyhjb25maWcpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBjb25maWdbaXRlbV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcblxyXG4gICAgICAgICAgICAvLyBoYW5kbGUgZm9yIHBsdWdpbnMgb3B0aW9uIGZyb20gQXJyYXkgdG8gb2JqZWN0XHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBjdHguZ2V0Q29uZmlnPElTdHJpbmdLZXlNYXA8Ym9vbGVhbj4+KCdwaWNnb1BsdWdpbnMnKVxyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IHRydWVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHBsdWdpbnNbaXRlbV0gPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHBsdWdpbnNcclxuICAgICAgICAgICAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICAgICAgICAgICBwaWNnb1BsdWdpbnM6IHBsdWdpbnNcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciB1cGxvYWRlciAmIHRyYW5zZm9ybWVyXHJcbiAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAncGljQmVkLmN1cnJlbnQnOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudXBsb2FkZXInOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBhbnN3ZXIudHJhbnNmb3JtZXIgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGN0eC5sb2cuc3VjY2VzcygnQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhJylcclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXNlXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcHJveHk6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDx1cmw+JywgJ3NldCBwcm94eSBmb3IgdXBsb2FkaW5nJywgKHByb3h5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgICdwaWNCZWQucHJveHknOiBwcm94eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwcm94eVxyXG4iLCJpbXBvcnQgbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xyXG5pbXBvcnQgeyBJUGljR28sIElPcHRpb25zLCBJRmlsZVRyZWUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYmJ5IGZyb20gJ2dsb2JieSdcclxuaW1wb3J0IGVqcyBmcm9tICdlanMnXHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXHJcbiAqIEBwYXJhbSB7UGljR299IGN0eFxyXG4gKiBAcGFyYW0ge0lPcHRpb25zfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBnZW5lcmF0ZSA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcclxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihvcHRpb25zLnRtcCwgJ3RlbXBsYXRlJylcclxuICAgIGxldCBhbnN3ZXJzID0ge31cclxuICAgIGlmIChvcHRzLnByb21wdHMgJiYgb3B0cy5wcm9tcHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcclxuICAgIH1cclxuICAgIGxldCBfZmlsZXM6IHN0cmluZ1tdID0gYXdhaXQgZ2xvYmJ5KFsnKiovKiddLCB7IGN3ZDogc291cmNlLCBkb3Q6IHRydWUgfSkgLy8gZ2V0IGZpbGVzJyBuYW1lIGFycmF5XHJcbiAgICBfZmlsZXMgPSBfZmlsZXMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGdsb2IgPSAnJ1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoKGl0ZW0sIGtleSwgeyBkb3Q6IHRydWUgfSkpIHtcclxuICAgICAgICAgIGdsb2IgPSBpdGVtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZ2xvYikgeyAvLyBmaW5kIGEgZmlsdGVyIGV4cHJlc3Npb25cclxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKF9maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignVGVtcGxhdGUgZmlsZXMgbm90IGZvdW5kIScpXHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWxlcyA9IHJlbmRlcihfZmlsZXMsIHNvdXJjZSwgYW5zd2VycylcclxuICAgIHdyaXRlRmlsZVRyZWUob3B0aW9ucy5kZXN0LCBmaWxlcylcclxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBvcHRzLmNvbXBsZXRlKHsgYW5zd2Vycywgb3B0aW9ucywgZmlsZXM6IF9maWxlcywgY3R4IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0cy5jb21wbGV0ZU1lc3NhZ2UpIHtcclxuICAgICAgY3R4LmxvZy5zdWNjZXNzKG9wdHMuY29tcGxldGVNZXNzYWdlKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdEb25lIScpXHJcbiAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgZmlsdGVycycgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHggUGljR29cclxuICogQHBhcmFtIGV4cCBjb25kaXRpb24gZXhwcmVzc2lvblxyXG4gKiBAcGFyYW0gZGF0YSBvcHRpb25zIGRhdGFcclxuICovXHJcbmNvbnN0IGZpbHRlcnMgPSAoY3R4OiBJUGljR28sIGV4cDogYW55LCBkYXRhOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXHJcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCAnd2l0aCAoZGF0YSkgeyByZXR1cm4gJyArIGV4cCArICd9JylcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZuKGRhdGEpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihgRXJyb3Igd2hlbiBldmFsdWF0aW5nIGZpbHRlciBjb25kaXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRlbXBsYXRlIG9wdGlvbnNcclxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxyXG4gKi9cclxuY29uc3QgZ2V0T3B0aW9ucyA9ICh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAnaW5kZXguanMnKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKG9wdGlvbnNQYXRoKVxyXG4gICAgcmV0dXJuIG9wdGlvbnNcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHt9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGZpbGVzIHRvIGEgdmlydHVhbCB0cmVlIG9iamVjdFxyXG4gKiBAcGFyYW0ge2FycmF5fSBmaWxlc1xyXG4gKi9cclxuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XHJcbiAgY29uc3QgZmlsZVRyZWU6IElGaWxlVHJlZSA9IHt9XHJcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksICd1dGY4JylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXHJcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpIHx8IC9bXlxcc10vLnRlc3QoY29udGVudCkpIHtcclxuICAgICAgZmlsZVRyZWVbZmlsZVBhdGhdID0gY29udGVudFxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIGZpbGVUcmVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcclxuICogQHBhcmFtIHtzdHJpbmd9IGRpclxyXG4gKiBAcGFyYW0ge29iamVjdH0gZmlsZXNcclxuICovXHJcbmNvbnN0IHdyaXRlRmlsZVRyZWUgPSAoZGlyOiBzdHJpbmcsIGZpbGVzOiBhbnkpOiB2b2lkID0+IHtcclxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIG5hbWUpXHJcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpXHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGZpbHRlcnMsXHJcbiAgZ2VuZXJhdGUsXHJcbiAgcmVuZGVyLFxyXG4gIHdyaXRlRmlsZVRyZWVcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuLi8uLi91dGlscy9pbml0VXRpbHMnXHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcclxuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkLWdpdC1yZXBvJ1xyXG5pbXBvcnQgeyBJT3B0aW9ucywgSVBsdWdpbiwgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBybSBmcm9tICdyaW1yYWYnXHJcblxyXG5jb25zdCBydW4gPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgLy8gY29uc3QgbmFtZSA9IG9wdGlvbnMuaW5QbGFjZSA/IHBhdGgucmVsYXRpdmUoJy4uLycsIHByb2Nlc3MuY3dkKCkpIDogb3B0aW9ucy5wcm9qZWN0XHJcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkgeyAvLyBvZmZsaW5lIG1vZGVcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XHJcbiAgICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy5lcnJvcihgTG9jYWwgdGVtcGxhdGUgJHtvcHRpb25zLnRlbXBsYXRlfSBub3QgZm91bmRgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7IC8vIG9ubGluZSBtb2RlXHJcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcclxuICAgICAgPyAnUGljR28vcGljZ28tdGVtcGxhdGUtJyArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcclxuICAgICAgOiBvcHRpb25zLnRlbXBsYXRlXHJcbiAgICBkb3dubG9hZEFuZEdlbmVyYXRlKGN0eCwgb3B0aW9ucylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkb3dubG9hZCB0ZW1wbGF0ZSAmIGdlbmVyYXRlXHJcbiAqIEBwYXJhbSB7IFBpY0dvIH0gY3R4XHJcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZG93bmxvYWRBbmRHZW5lcmF0ZSA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcclxuICAgIHJtLnN5bmMob3B0aW9ucy50bXApXHJcbiAgfVxyXG4gIGN0eC5sb2cuaW5mbygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkaW5nLi4uJylcclxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLnN1Y2Nlc3MoJ1RlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGVkIScpXHJcbiAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBpbml0OiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaW5pdCcpXHJcbiAgICAgIC5hcmd1bWVudHMoJzx0ZW1wbGF0ZT4gW3Byb2plY3RdJylcclxuICAgICAgLm9wdGlvbignLS1jbG9uZScsICd1c2UgZ2l0IGNsb25lJylcclxuICAgICAgLm9wdGlvbignLS1vZmZsaW5lJywgJ3VzZSBjYWNoZWQgdGVtcGxhdGUnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NyZWF0ZSBwaWNnbyBwbHVnaW5cXCdzIGRldmVsb3BtZW50IHRlbXBsYXRlcycpXHJcbiAgICAgIC5hY3Rpb24oKHRlbXBsYXRlOiBzdHJpbmcsIHByb2plY3Q6IHN0cmluZywgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIC8vIFRoYW5rcyB0byB2dWUtY2xpIGluaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtY2xpL2Jsb2IvbWFzdGVyL2Jpbi92dWUtaW5pdFxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzU2xhc2ggPSB0ZW1wbGF0ZS5pbmNsdWRlcygnLycpXHJcbiAgICAgICAgICAgIGNvbnN0IGluUGxhY2UgPSAhcHJvamVjdCB8fCBwcm9qZWN0ID09PSAnLidcclxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0IHx8ICcuJylcclxuICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBwcm9ncmFtLmNsb25lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IG9mZmxpbmUgPSBwcm9ncmFtLm9mZmxpbmUgfHwgZmFsc2VcclxuICAgICAgICAgICAgY29uc3QgdG1wID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5waWNnby90ZW1wbGF0ZXMnLCB0ZW1wbGF0ZS5yZXBsYWNlKC9bLzpdL2csICctJykpIC8vIGZvciBjYWNoaW5nIHRlbXBsYXRlXHJcblxyXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5vZmZsaW5lKSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0bXBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZSxcclxuICAgICAgICAgICAgICBwcm9qZWN0LFxyXG4gICAgICAgICAgICAgIGhhc1NsYXNoLFxyXG4gICAgICAgICAgICAgIGluUGxhY2UsXHJcbiAgICAgICAgICAgICAgZGVzdCxcclxuICAgICAgICAgICAgICBjbG9uZSxcclxuICAgICAgICAgICAgICB0bXAsXHJcbiAgICAgICAgICAgICAgb2ZmbGluZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBwcm9qZWN0IGlzIGVtcHR5IG9yIGV4aXN0XHJcbiAgICAgICAgICAgIGlmIChpblBsYWNlIHx8IGZzLmV4aXN0c1N5bmMoZGVzdCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaW5QbGFjZVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ0dlbmVyYXRlIHByb2plY3QgaW4gY3VycmVudCBkaXJlY3Rvcnk/J1xyXG4gICAgICAgICAgICAgICAgICAgIDogJ1RhcmdldCBkaXJlY3RvcnkgZXhpc3RzLiBDb250aW51ZT8nLFxyXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnb2snXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXSkudGhlbigoYW5zd2VyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIub2spIHtcclxuICAgICAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBwcm9qZWN0IGlzIGdpdmVuXHJcbiAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignLS1oZWxwJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZygnRXhhbXBsZXM6JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggYW4gb2ZmaWNpYWwgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgcGx1Z2luIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICMgY3JlYXRlIGEgbmV3IHByb2plY3Qgc3RyYWlnaHQgZnJvbSBhIGdpdGh1YiB0ZW1wbGF0ZScpKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCcgICQgcGljZ28gaW5pdCB1c2VybmFtZS9yZXBvIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGluaXRcclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSVBpY0dvLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBpMThuOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaTE4bicpXHJcbiAgICAgIC5hcmd1bWVudHMoJ1tsYW5nXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY2hhbmdlIHBpY2dvIGxhbmd1YWdlJylcclxuICAgICAgLmFjdGlvbihhc3luYyAobGFuZzogc3RyaW5nID0gJycpID0+IHtcclxuICAgICAgICBjb25zdCBsaXN0ID0gY3R4LmkxOG4uZ2V0TGFuZ3VhZ2VMaXN0KClcclxuICAgICAgICBpZiAoIWxhbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgbmFtZTogJ2kxOG4nLFxyXG4gICAgICAgICAgICAgIGNob2ljZXM6IGxpc3QsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGxhbmd1YWdlJyxcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sYW5ndWFnZScpIHx8ICd6aC1DTidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxzdHJpbmc+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UoYW5zd2VyLmkxOG4pXHJcbiAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2Fuc3dlci5pMThufWApXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGxhbmcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdObyBzdWNoIGxhbmd1YWdlJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UobGFuZylcclxuICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2xhbmd9YClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGkxOG5cclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSUxpZmVjeWNsZVBsdWdpbnMgfSBmcm9tICcuLi90eXBlcydcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQbHVnaW5zIGltcGxlbWVudHMgSUxpZmVjeWNsZVBsdWdpbnMge1xyXG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0OiBNYXA8c3RyaW5nLCBJUGx1Z2luPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWVcclxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxyXG4gICAgdGhpcy5wbHVnaW5JZE1hcCA9IG5ldyBNYXAoKVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaWQgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGlmIChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCA9PiB7XHJcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgcmV0dXJuIExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVQbHVnaW5zXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzICovXHJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXHJcbmltcG9ydCBpbnF1aXJlciwgeyBJbnF1aXJlciB9IGZyb20gJ2lucXVpcmVyJ1xyXG5pbXBvcnQgeyBJUGx1Z2luLCBJQ29tbWFuZGVyLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGNvbW1hbmRlcnMgZnJvbSAnLi4vcGx1Z2lucy9jb21tYW5kZXInXHJcbmltcG9ydCB7IGdldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbW1hbmRlciBpbXBsZW1lbnRzIElDb21tYW5kZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZSA9ICdjb21tYW5kZXInXHJcbiAgc3RhdGljIGN1cnJlbnRQbHVnaW46IHN0cmluZyB8IG51bGxcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG5cclxuICBwcm9ncmFtOiBDb21tYW5kXHJcbiAgaW5xdWlyZXI6IElucXVpcmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKVxyXG4gICAgdGhpcy5pbnF1aXJlciA9IGlucXVpcmVyXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZSAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm5hbWVcclxuICB9XHJcblxyXG4gIGluaXQgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9ncmFtXHJcbiAgICAgIC52ZXJzaW9uKHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT04sICctdiwgLS12ZXJzaW9uJylcclxuICAgICAgLm9wdGlvbignLWQsIC0tZGVidWcnLCAnZGVidWcgbW9kZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgZGVidWc6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub3B0aW9uKCctcywgLS1zaWxlbnQnLCAnc2lsZW50IG1vZGUnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgIHNpbGVudDogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignY29tbWFuZDoqJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihgSW52YWxpZCBjb21tYW5kOiAke3RoaXMucHJvZ3JhbS5hcmdzLmpvaW4oJyAnKX1cXG5TZWUgLS1oZWxwIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLmApXHJcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgIH0pXHJcblxyXG4gICAgLy8gYnVpbHQtaW4gY29tbWFuZHNcclxuICAgIGNvbW1hbmRlcnModGhpcy5jdHgpXHJcbiAgfVxyXG5cclxuICByZWdpc3RlciAoaWQ6IHN0cmluZywgcGx1Z2luOiBJUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCduYW1lIGlzIHJlcXVpcmVkIScpXHJcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5oYW5kbGUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BsdWdpbi5oYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIScpXHJcbiAgICBpZiAodGhpcy5saXN0LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5uYW1lfSBwbHVnaW4gZHVwbGljYXRlIGlkOiAke2lkfSFgKVxyXG4gICAgdGhpcy5saXN0LnNldChpZCwgcGx1Z2luKVxyXG4gICAgY29uc3QgY3VycmVudFBsdWdpbk5hbWUgPSBnZXRDdXJyZW50UGx1Z2luTmFtZSgpXHJcbiAgICBpZiAoY3VycmVudFBsdWdpbk5hbWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKGN1cnJlbnRQbHVnaW5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KGN1cnJlbnRQbHVnaW5OYW1lKT8ucHVzaChpZClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLnNldChjdXJyZW50UGx1Z2luTmFtZSwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRMaXN0KCkuZm9yRWFjaCgoaXRlbTogSVBsdWdpbikgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGl0ZW0uaGFuZGxlKHRoaXMuY3R4KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCAoaWQ6IHN0cmluZyk6IElQbHVnaW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXHJcbiAgfVxyXG5cclxuICBnZXRMaXN0ICgpOiBJUGx1Z2luW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXHJcbiAgfVxyXG5cclxuICBnZXRJZExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbW1hbmRlclxyXG4iLCJpbXBvcnQgcGx1Z2luSGFuZGxlciBmcm9tICcuL3BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB1cGxvYWQgZnJvbSAnLi91cGxvYWQnXHJcbmltcG9ydCBzZXR0aW5nIGZyb20gJy4vc2V0dGluZydcclxuaW1wb3J0IHVzZSBmcm9tICcuL3VzZSdcclxuaW1wb3J0IHByb3h5IGZyb20gJy4vcHJveHknXHJcbmltcG9ydCBpbml0IGZyb20gJy4vaW5pdCdcclxuaW1wb3J0IGkxOG4gZnJvbSAnLi9pMThuJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChjdHg6IElQaWNHbyk6IHZvaWQgPT4ge1xyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3BsdWdpbkhhbmRsZXInLCBwbHVnaW5IYW5kbGVyKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ2NvbmZpZycsIGNvbmZpZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCdzZXR0aW5nJywgc2V0dGluZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1cGxvYWQnLCB1cGxvYWQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigndXNlJywgdXNlKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3Byb3h5JywgcHJveHkpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaW5pdCcsIGluaXQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaTE4bicsIGkxOG4pXHJcbn1cclxuIiwiZXhwb3J0IGVudW0gSUxvZ1R5cGUge1xyXG4gIHN1Y2Nlc3MgPSAnc3VjY2VzcycsXHJcbiAgaW5mbyA9ICdpbmZvJyxcclxuICB3YXJuID0gJ3dhcm4nLFxyXG4gIGVycm9yID0gJ2Vycm9yJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBieSB1c2Vyc1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XHJcbiAgVVBMT0FEX1BST0dSRVNTID0gJ3VwbG9hZFByb2dyZXNzJyxcclxuICBGQUlMRUQgPSAnZmFpbGVkJyxcclxuICBCRUZPUkVfVFJBTlNGT1JNID0gJ2JlZm9yZVRyYW5zZm9ybScsXHJcbiAgQkVGT1JFX1VQTE9BRCA9ICdiZWZvcmVVcGxvYWQnLFxyXG4gIEFGVEVSX1VQTE9BRCA9ICdhZnRlclVwbG9hZCcsXHJcbiAgRklOSVNIRUQgPSAnZmluaXNoZWQnLFxyXG4gIElOU1RBTEwgPSAnaW5zdGFsbCcsXHJcbiAgVU5JTlNUQUxMID0gJ3VuaW5zdGFsbCcsXHJcbiAgVVBEQVRFID0gJ3VwZGF0ZScsXHJcbiAgTk9USUZJQ0FUSU9OID0gJ25vdGlmaWNhdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgb25seSBieSBwaWNnb1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1c0V2ZW50IHtcclxuICBDT05GSUdfQ0hBTkdFID0gJ0NPTkZJR19DSEFOR0UnXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcclxuaW1wb3J0IHsgSUxvZ1R5cGUgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQge1xyXG4gIElMb2dBcmd2VHlwZSxcclxuICBJTG9nQXJndlR5cGVXaXRoRXJyb3IsXHJcbiAgVW5kZWZpbmFibGUsXHJcbiAgSUxvZ0NvbG9yLFxyXG4gIElMb2dnZXIsXHJcbiAgSVBpY0dvXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGZvcmNlTnVtYmVyLCBpc0RldiB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xyXG4gICAgW0lMb2dUeXBlLnN1Y2Nlc3NdOiAnZ3JlZW4nLFxyXG4gICAgW0lMb2dUeXBlLmluZm9dOiAnYmx1ZScsXHJcbiAgICBbSUxvZ1R5cGUud2Fybl06ICd5ZWxsb3cnLFxyXG4gICAgW0lMb2dUeXBlLmVycm9yXTogJ3JlZCdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxvZ0xldmVsITogc3RyaW5nXHJcbiAgcHJpdmF0ZSBsb2dQYXRoITogc3RyaW5nXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMb2cgKHR5cGU6IElMb2dUeXBlLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICAvLyBjaGVjayBjb25maWcuc2lsZW50XHJcbiAgICBpZiAoIXRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2lsZW50JykpIHtcclxuICAgICAgY29uc3QgbG9nSGVhZGVyID0gY2hhbGtbdGhpcy5sZXZlbFt0eXBlXSBhcyBJTG9nQ29sb3JdKGBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXHJcbiAgICAgIGNvbnNvbGUubG9nKGxvZ0hlYWRlciwgLi4ubXNnKVxyXG4gICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sb2dMZXZlbCcpXHJcbiAgICAgIHRoaXMubG9nUGF0aCA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MubG9nUGF0aCcpIHx8IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnLi9waWNsaXN0LmxvZycpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jaGVja0xvZ0ZpbGVJc0xhcmdlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTXNnID0gYExvZyBmaWxlIGlzIHRvbyBsYXJnZSAoPiAkeyhyZXN1bHQubG9nRmlsZVNpemVMaW1pdCEpIC8gMTAyNCAvIDEwMjQgfHwgJzEwJ30gTUIpLCByZWNyZWF0ZSBsb2cgZmlsZWBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdbUGljTGlzdCBXQVJOXTonKSwgd2FybmluZ01zZylcclxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZUxvZ0ZpbGUodGhpcy5sb2dQYXRoKVxyXG4gICAgICAgICAgICBtc2cudW5zaGlmdCh3YXJuaW5nTXNnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVXcml0ZUxvZyh0aGlzLmxvZ1BhdGgsIHR5cGUsIC4uLm1zZylcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyB3aHk/Pz9cclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiBjaGVja2luZyBsb2cgZmlsZSBzaXplJywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nRmlsZUlzTGFyZ2UgKGxvZ1BhdGg6IHN0cmluZyk6IHtcclxuICAgIGlzTGFyZ2U6IGJvb2xlYW5cclxuICAgIGxvZ0ZpbGVTaXplPzogbnVtYmVyXHJcbiAgICBsb2dGaWxlU2l6ZUxpbWl0PzogbnVtYmVyXHJcbiAgfSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2dQYXRoKSkge1xyXG4gICAgICBjb25zdCBsb2dGaWxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxvZ1BhdGgpLnNpemVcclxuICAgICAgY29uc3QgbG9nRmlsZVNpemVMaW1pdCA9IGZvcmNlTnVtYmVyKHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxudW1iZXI+Pignc2V0dGluZ3MubG9nRmlsZVNpemVMaW1pdCcpIHx8IDEwKSAqIDEwMjQgKiAxMDI0IC8vIDEwIE1CIGRlZmF1bHRcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc0xhcmdlOiBsb2dGaWxlU2l6ZSA+IGxvZ0ZpbGVTaXplTGltaXQsXHJcbiAgICAgICAgbG9nRmlsZVNpemUsXHJcbiAgICAgICAgbG9nRmlsZVNpemVMaW1pdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc0xhcmdlOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNyZWF0ZUxvZ0ZpbGUgKGxvZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcclxuICAgICAgZnMudW5saW5rU3luYyhsb2dQYXRoKVxyXG4gICAgICBmcy5jcmVhdGVGaWxlU3luYyhsb2dQYXRoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVXcml0ZUxvZyAobG9nUGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrTG9nTGV2ZWwodHlwZSwgdGhpcy5sb2dMZXZlbCkpIHtcclxuICAgICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKX0gW1BpY0xpc3QgJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgICAgbXNnLmZvckVhY2goKGl0ZW06IElMb2dBcmd2VHlwZVdpdGhFcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsb2cgKz0gJ1xcbidcclxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKGxvZ1BhdGgsIGxvZylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbUGljTGlzdCBFcnJvcl0gb24gd3JpdGluZyBsb2cgZmlsZScsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nTGV2ZWwgKHR5cGU6IHN0cmluZywgbGV2ZWw6IHVuZGVmaW5lZCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBsZXZlbCA9PT0gJ2FsbCcpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsKSkge1xyXG4gICAgICByZXR1cm4gbGV2ZWwuc29tZSgoaXRlbTogc3RyaW5nKSA9PiAoaXRlbSA9PT0gdHlwZSB8fCBpdGVtID09PSAnYWxsJykpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHlwZSA9PT0gbGV2ZWxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1Y2Nlc3MgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5zdWNjZXNzLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBpbmZvICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZXJyb3IgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5lcnJvciwgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgd2FybiAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLndhcm4sIC4uLm1zZylcclxuICB9XHJcblxyXG4gIGRlYnVnICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXYoKSkge1xyXG4gICAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2dnZXJcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBJTGlmZWN5Y2xlUGx1Z2lucywgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBoYW5kbGVVcmxFbmNvZGUgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlQ29udGV4dCdcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc3RhcnQgKGlucHV0OiBhbnlbXSk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICAvLyBlbnN1cmUgZXZlcnkgdXBsb2FkIHByb2Nlc3MgaGFzIGFuIHVuaXF1ZSBjb250ZXh0XHJcbiAgICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KHRoaXMuY3R4KVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaW1hZ2VzIGlucHV0XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgYW4gYXJyYXkuJylcclxuICAgICAgfVxyXG4gICAgICBjdHguaW5wdXQgPSBpbnB1dFxyXG4gICAgICBjdHgub3V0cHV0ID0gW11cclxuXHJcbiAgICAgIC8vIGxpZmVjeWNsZSBtYWluXHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVHJhbnNmb3JtKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1RyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVXBsb2FkKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJVcGxvYWQoY3R4KVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgY3R4LmxvZy53YXJuKElCdWlsZEluRXZlbnQuRkFJTEVEKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgLTEpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgIGlmIChjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdkZWJ1ZycpKSB7XHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdHhcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMClcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQkVGT1JFX1RSQU5TRk9STSwgY3R4KVxyXG4gICAgY3R4LmxvZy5pbmZvKCdCZWZvcmUgdHJhbnNmb3JtJylcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmJlZm9yZVRyYW5zZm9ybVBsdWdpbnMsIGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZG9UcmFuc2Zvcm0gKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAzMClcclxuICAgIGNvbnN0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQudHJhbnNmb3JtZXInKSB8fCAncGF0aCdcclxuICAgIGxldCBjdXJyZW50VHJhbnNmb3JtZXIgPSB0eXBlXHJcbiAgICBsZXQgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCh0eXBlKVxyXG4gICAgaWYgKCF0cmFuc2Zvcm1lcikge1xyXG4gICAgICB0cmFuc2Zvcm1lciA9IGN0eC5oZWxwZXIudHJhbnNmb3JtZXIuZ2V0KCdwYXRoJylcclxuICAgICAgY3VycmVudFRyYW5zZm9ybWVyID0gJ3BhdGgnXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB0cmFuc2Zvcm1lciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHRyYW5zZm9ybWVyIC0gcGF0aGApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFRyYW5zZm9ybWluZy4uLiBDdXJyZW50IHRyYW5zZm9ybWVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHRyYW5zZm9ybWVyPy5oYW5kbGUoY3R4KVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCA2MClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHVwbG9hZCcpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9VUExPQUQsIGN0eClcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMsIGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZG9VcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGxldCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLmN1cnJlbnQnKSB8fCAnc21tcydcclxuICAgIGxldCB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KHR5cGUpXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgaWYgKCF1cGxvYWRlcikge1xyXG4gICAgICB0eXBlID0gJ3NtbXMnXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdzbW1zJ1xyXG4gICAgICB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KCdzbW1zJylcclxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHVwbG9hZGVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdXBsb2FkZXIgLSBzbW1zYClcclxuICAgIH1cclxuICAgIGN0eC5sb2cuaW5mbyhgVXBsb2FkaW5nLi4uIEN1cnJlbnQgdXBsb2FkZXIgaXMgWyR7Y3VycmVudFRyYW5zZm9ybWVyfV1gKVxyXG4gICAgYXdhaXQgdXBsb2FkZXI/LmhhbmRsZShjdHgpXHJcbiAgICBmb3IgKGNvbnN0IG91dHB1dEltZyBvZiBjdHgub3V0cHV0KSB7XHJcbiAgICAgIG91dHB1dEltZy50eXBlID0gdHlwZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhZnRlclVwbG9hZCAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5BRlRFUl9VUExPQUQsIGN0eClcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAxMDApXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMsIGN0eClcclxuICAgIGxldCBtc2cgPSAnJ1xyXG4gICAgY29uc3QgbGVuZ3RoID0gY3R4Lm91dHB1dC5sZW5ndGhcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHR5cGVvZiBjdHgub3V0cHV0W2ldLmltZ1VybCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBtc2cgKz0gaGFuZGxlVXJsRW5jb2RlKGN0eC5vdXRwdXRbaV0uaW1nVXJsISlcclxuICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgbXNnICs9ICdcXG4nXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJhc2U2NEltYWdlXHJcbiAgICAgIGRlbGV0ZSBjdHgub3V0cHV0W2ldLmJ1ZmZlclxyXG4gICAgfVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GSU5JU0hFRCwgY3R4KVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKGBcXG4ke21zZ31gKVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQbHVnaW5zIChsaWZlQ3ljbGVQbHVnaW5zOiBJTGlmZWN5Y2xlUGx1Z2lucywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0TGlzdCgpXHJcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0SWRMaXN0KClcclxuICAgIGNvbnN0IGxpZmVDeWNsZU5hbWUgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldE5hbWUoKVxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocGx1Z2lucy5tYXAoYXN5bmMgKHBsdWdpbjogSVBsdWdpbiwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGN0eC5sb2cuaW5mbyhgJHtsaWZlQ3ljbGVOYW1lfTogJHtwbHVnaW5OYW1lc1tpbmRleF19IHJ1bm5pbmdgKVxyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5oYW5kbGUoY3R4KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihgJHtsaWZlQ3ljbGVOYW1lfTogJHtwbHVnaW5OYW1lc1tpbmRleF19IGVycm9yYClcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH0pKVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlmZWN5Y2xlXHJcbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuLyoqXHJcbiAqIGNyZWF0ZSBhbiB1bmlxdWUgY29udGV4dCBmb3IgZWFjaCB1cGxvYWQgcHJvY2Vzc1xyXG4gKiBAcGFyYW0gY3R4XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dCA9IChjdHg6IElQaWNHbyk6IElQaWNHbyA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGNvbmZpZ1BhdGg6IGN0eC5jb25maWdQYXRoLFxyXG4gICAgYmFzZURpcjogY3R4LmJhc2VEaXIsXHJcbiAgICBsb2c6IGN0eC5sb2csXHJcbiAgICBjbWQ6IGN0eC5jbWQsXHJcbiAgICBvdXRwdXQ6IFtdLFxyXG4gICAgaW5wdXQ6IFtdLFxyXG4gICAgcGx1Z2luTG9hZGVyOiBjdHgucGx1Z2luTG9hZGVyLFxyXG4gICAgcGx1Z2luSGFuZGxlcjogY3R4LnBsdWdpbkhhbmRsZXIsXHJcbiAgICBSZXF1ZXN0OiBjdHguUmVxdWVzdCxcclxuICAgIGhlbHBlcjogY3R4LmhlbHBlcixcclxuICAgIFZFUlNJT046IGN0eC5WRVJTSU9OLFxyXG4gICAgR1VJX1ZFUlNJT046IGN0eC5HVUlfVkVSU0lPTixcclxuICAgIHJlcXVlc3Q6IGN0eC5yZXF1ZXN0LFxyXG4gICAgaTE4bjogY3R4LmkxOG4sXHJcbiAgICBnZXRDb25maWc6IGN0eC5nZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2F2ZUNvbmZpZzogY3R4LnNhdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQ29uZmlnOiBjdHgucmVtb3ZlQ29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHNldENvbmZpZzogY3R4LnNldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICB1bnNldENvbmZpZzogY3R4LnVuc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVwbG9hZDogY3R4LnVwbG9hZC5iaW5kKGN0eCksXHJcbiAgICBhZGRMaXN0ZW5lcjogY3R4LmFkZExpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9uOiBjdHgub24uYmluZChjdHgpLFxyXG4gICAgb25jZTogY3R4Lm9uY2UuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlTGlzdGVuZXI6IGN0eC5yZW1vdmVMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBvZmY6IGN0eC5vZmYuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBjdHgucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHNldE1heExpc3RlbmVyczogY3R4LnNldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBnZXRNYXhMaXN0ZW5lcnM6IGN0eC5nZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgbGlzdGVuZXJzOiBjdHgubGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHJhd0xpc3RlbmVyczogY3R4LnJhd0xpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBlbWl0OiBjdHguZW1pdC5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lckNvdW50OiBjdHgubGlzdGVuZXJDb3VudC5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kTGlzdGVuZXI6IGN0eC5wcmVwZW5kTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgcHJlcGVuZE9uY2VMaXN0ZW5lcjogY3R4LnByZXBlbmRPbmNlTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgZXZlbnROYW1lczogY3R4LmV2ZW50TmFtZXMuYmluZChjdHgpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVNtbXNDb25maWcsIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChmaWxlTmFtZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyLCBhcGlUb2tlbjogc3RyaW5nLCBiYWNrdXBEb21haW4gPSAnJyk6IElPbGRSZXFPcHRpb25zID0+IHtcclxuICBjb25zdCBkb21haW4gPSBiYWNrdXBEb21haW4gfHwgJ3NtLm1zJ1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHBzOi8vJHtkb21haW59L2FwaS92Mi91cGxvYWRgLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBjb250ZW50VHlwZTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbycsXHJcbiAgICAgIEF1dGhvcml6YXRpb246IGFwaVRva2VuXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgc21maWxlOiB7XHJcbiAgICAgICAgdmFsdWU6IGltYWdlLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIGZpbGVuYW1lOiBmaWxlTmFtZVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3NsOiAndHJ1ZSdcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3Qgc21tc0NvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpXHJcbiAgaWYgKCFzbW1zQ29uZmlnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCBzbW1zIGNvbmZpZyEnKVxyXG4gIH1cclxuICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBvc3RDb25maWcgPSBwb3N0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGltYWdlLCBzbW1zQ29uZmlnPy50b2tlbiwgc21tc0NvbmZpZz8uYmFja3VwRG9tYWluKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogc3RyaW5nID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHkuY29kZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuZGF0YS51cmxcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmhhc2hcclxuICAgICAgICB9IGVsc2UgaWYgKGJvZHkuY29kZSA9PT0gJ2ltYWdlX3JlcGVhdGVkJyAmJiB0eXBlb2YgYm9keS5pbWFnZXMgPT09ICdzdHJpbmcnKSB7IC8vIGRvIGV4dHJhIGNoZWNrIHNpbmNlIHRoaXMgZXJyb3IgcmV0dXJuIGlzIG5vdCBkb2N1bWVudGVkIGF0IGh0dHBzOi8vZG9jLnNtLm1zLyNhcGktSW1hZ2UtVXBsb2FkXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuaW1hZ2VzXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubWVzc2FnZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJU21tc0NvbmZpZz4oJ3BpY0JlZC5zbW1zJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgbWVzc2FnZTogJ2FwaSB0b2tlbicsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYmFja3VwRG9tYWluJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4nKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYmFja3VwRG9tYWluIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdzbW1zJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVMnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVGN5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XHJcbiAgc2lnbmF0dXJlOiBzdHJpbmdcclxuICBhcHBJZDogc3RyaW5nXHJcbiAgYnVja2V0OiBzdHJpbmdcclxuICBzaWduVGltZTogc3RyaW5nXHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IElTaWduYXR1cmUgPT4ge1xyXG4gIGNvbnN0IHNlY3JldElkID0gb3B0aW9ucy5zZWNyZXRJZFxyXG4gIGNvbnN0IHNlY3JldEtleSA9IG9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkXHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBsZXQgc2lnbmF0dXJlXHJcbiAgbGV0IHNpZ25UaW1lOiBzdHJpbmcgPSAnJ1xyXG4gIGlmICghb3B0aW9ucy52ZXJzaW9uIHx8IG9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDApXHJcbiAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApIC0gMVxyXG4gICAgY29uc3QgZXhwaXJlZCA9IGN1cnJlbnQgKyAzNjAwXHJcblxyXG4gICAgY29uc3QgbXVsdGlTaWduYXR1cmUgPSBgYT0ke2FwcElkfSZiPSR7YnVja2V0fSZrPSR7c2VjcmV0SWR9JmU9JHtleHBpcmVkfSZ0PSR7Y3VycmVudH0mcj0ke3JhbmRvbX0mZj1gXHJcblxyXG4gICAgY29uc3Qgc2lnbkhleEtleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUobXVsdGlTaWduYXR1cmUpLmRpZ2VzdCgpXHJcbiAgICBjb25zdCB0ZW1wU3RyaW5nID0gQnVmZmVyLmNvbmNhdChbc2lnbkhleEtleSwgQnVmZmVyLmZyb20obXVsdGlTaWduYXR1cmUpXSlcclxuICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHRlbXBTdHJpbmcpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3Nzgjc2lnbmF0dXJlXHJcbiAgICBjb25zdCB0b2RheSA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKVxyXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0b2RheSArIDg2NDAwXHJcbiAgICBzaWduVGltZSA9IGAke3RvZGF5fTske3RvbW9ycm93fWBcclxuICAgIGNvbnN0IHNpZ25LZXkgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNlY3JldEtleSkudXBkYXRlKHNpZ25UaW1lKS5kaWdlc3QoJ2hleCcpXHJcbiAgICBjb25zdCBodHRwU3RyaW5nID0gYHB1dFxcbi8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfVxcblxcbmhvc3Q9JHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21cXG5gXHJcbiAgICBjb25zdCBzaGExZWRIdHRwU3RyaW5nID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoaHR0cFN0cmluZykuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gYHNoYTFcXG4ke3NpZ25UaW1lfVxcbiR7c2hhMWVkSHR0cFN0cmluZ31cXG5gXHJcbiAgICBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNpZ25LZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdCgnaGV4JylcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHNpZ25hdHVyZSxcclxuICAgIGFwcElkLFxyXG4gICAgYnVja2V0LFxyXG4gICAgc2lnblRpbWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLCBpbWFnZTogQnVmZmVyLCB2ZXJzaW9uOiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtmaWxlTmFtZX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZS5zaWduYXR1cmUsXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgICB1c2VyQWdlbnQ6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgZm9ybURhdGE6IHtcclxuICAgICAgICBvcDogJ3VwbG9hZCcsXHJcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgIHVybDogYGh0dHA6Ly8ke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YCxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEhvc3Q6IGAke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbWAsXHJcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYHEtc2lnbi1hbGdvcml0aG09c2hhMSZxLWFrPSR7b3B0aW9ucy5zZWNyZXRJZH0mcS1zaWduLXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEta2V5LXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEtaGVhZGVyLWxpc3Q9aG9zdCZxLXVybC1wYXJhbS1saXN0PSZxLXNpZ25hdHVyZT0ke3NpZ25hdHVyZS5zaWduYXR1cmV9YCxcclxuICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpLFxyXG4gICAgICAgIHVzZXJBZ2VudDogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBpbWFnZSxcclxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHRjWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPigncGljQmVkLnRjeXVuJylcclxuICBpZiAoIXRjWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdGVuY2VudCBDT1MgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSB0Y1l1bk9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCBwYXRoID0gdGNZdW5PcHRpb25zLnBhdGhcclxuICAgIGNvbnN0IHVzZVY0ID0gIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGlmICghc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSwgY3R4LkdVSV9WRVJTSU9OIHx8IGN0eC5WRVJTSU9OKVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcylcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBtc2c6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0FVVEhfRkFJTEVEJyksXHJcbiAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgbGV0IGJvZHlcclxuICAgICAgICBpZiAodXNlVjQgJiYgdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYm9keSA9IHJlc1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSA0MDApIHtcclxuICAgICAgICAgIGlmIChib2R5Py5ib2R5Py5lcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgYm9keS5ib2R5LmVyclxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHk/LmJvZHk/Lm1zZyB8fCBib2R5Py5ib2R5Py5tZXNzYWdlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25VcmwgPSB0Y1l1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgIGlmICh1c2VWNCAmJiBib2R5Lm1lc3NhZ2UgPT09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtib2R5LmRhdGEuc291cmNlX3VybCBhcyBzdHJpbmd9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5ib2R5Lm1zZylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKCF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGVyci5lcnJvcilcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgICBjb2RlOiBib2R5LmNvZGUgYXMgc3RyaW5nXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRleHQ6ICdodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzg0MzInXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KCdwaWNCZWQudGN5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAndmVyc2lvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgYWxpYXM6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTicpLFxyXG4gICAgICBjaG9pY2VzOiBbJ3Y0JywgJ3Y1J10sXHJcbiAgICAgIGRlZmF1bHQ6ICd2NScsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0S2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FwcElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFwcElkIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigndGN5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJR2l0aHViQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChmaWxlTmFtZTogc3RyaW5nLCBvcHRpb25zOiBJR2l0aHViQ29uZmlnLCBkYXRhOiBhbnkpOiBJT2xkUmVxT3B0aW9uc1dpdGhKU09OID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgeyB0b2tlbiwgcmVwbyB9ID0gb3B0aW9uc1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3JlcG99L2NvbnRlbnRzLyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbycsXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICAgIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gICAganNvbjogdHJ1ZVxyXG4gIH0gYXMgY29uc3RcclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBnaXRodWJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJR2l0aHViQ29uZmlnPigncGljQmVkLmdpdGh1YicpXHJcbiAgaWYgKCFnaXRodWJPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBnaXRodWIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICBtZXNzYWdlOiAnVXBsb2FkIGJ5IFBpY0dvJyxcclxuICAgICAgICAgIGJyYW5jaDogZ2l0aHViT3B0aW9ucy5icmFuY2gsXHJcbiAgICAgICAgICBjb250ZW50OiBiYXNlNjRJbWFnZSxcclxuICAgICAgICAgIHBhdGg6IGdpdGh1Yk9wdGlvbnMucGF0aCArIGVuY29kZVVSSShpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvc3RDb25maWcgPSBwb3N0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGdpdGh1Yk9wdGlvbnMsIGRhdGEpXHJcbiAgICAgICAgY29uc3QgYm9keToge1xyXG4gICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICBkb3dubG9hZF91cmw6IHN0cmluZ1xyXG4gICAgICAgICAgICBzaGE6IHN0cmluZ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxyXG4gICAgICAgIGlmIChib2R5KSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtnaXRodWJPcHRpb25zLmN1c3RvbVVybH0vJHtnaXRodWJPcHRpb25zLnBhdGh9JHtpbWcuZmlsZU5hbWV9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuY29udGVudC5kb3dubG9hZF91cmxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5jb250ZW50LnNoYVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSycpXHJcbiAgICB9KVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlcG8nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1JFUE8nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVwbyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdicmFuY2gnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnJhbmNoIHx8ICdtYXN0ZXInLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcignZ2l0aHViJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCBxaW5pdSBmcm9tICdxaW5pdSdcclxuaW1wb3J0IHsgSVBsdWdpbkNvbmZpZywgSVFpbml1Q29uZmlnLCBJUGljR28sIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5mdW5jdGlvbiBwb3N0T3B0aW9ucyAob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcclxuICBjb25zdCBhcmVhID0gc2VsZWN0QXJlYShvcHRpb25zLmFyZWEgfHwgJ3owJylcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgYmFzZTY0RmlsZU5hbWUgPSBCdWZmZXIuZnJvbShwYXRoICsgZmlsZU5hbWUsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHA6Ly91cGxvYWQke2FyZWF9LnFpbml1cC5jb20vcHV0YjY0Ly0xL2tleS8ke2Jhc2U2NEZpbGVOYW1lfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBVcFRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltZ0Jhc2U2NFxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0QXJlYSAoYXJlYTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYXJlYSA9PT0gJ3owJyA/ICcnIDogJy0nICsgYXJlYVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbiAocWluaXVPcHRpb25zOiBhbnkpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGFjY2Vzc0tleSA9IHFpbml1T3B0aW9ucy5hY2Nlc3NLZXlcclxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgbWFjID0gbmV3IHFpbml1LmF1dGguZGlnZXN0Lk1hYyhhY2Nlc3NLZXksIHNlY3JldEtleSlcclxuICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXRcclxuICB9XHJcbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxyXG4gIHJldHVybiBwdXRQb2xpY3kudXBsb2FkVG9rZW4obWFjKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHFpbml1T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JylcclxuICBpZiAoIXFpbml1T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgcWluaXUgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gcWluaXVPcHRpb25zLm9wdGlvbnNcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke2JvZHkua2V5IGFzIHN0cmluZ30ke29wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1zZ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoJ3Fpbml1IGVycm9yJywgYm9keSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIC8vIGVyci5yZXNwb25zZSBtYXliZSB1bmRlZmluZWRcclxuICAgICAgaWYgKGVyci5yZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVycm9yLmVycm9yXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oJ3BpY0JlZC5xaW5pdScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FDQ0VTU0tFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncWluaXUnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVUnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElJbWd1ckNvbmZpZywgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElJbWd1ckNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1nQmFzZTY0OiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9ucyA9PiB7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkXHJcbiAgY29uc3Qgb2JqOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvaW1hZ2UnLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgQ2xpZW50LUlEICR7Y2xpZW50SWR9YCxcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgSG9zdDogJ2FwaS5pbWd1ci5jb20nLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbydcclxuICAgIH0sXHJcbiAgICBmb3JtRGF0YToge1xyXG4gICAgICBpbWFnZTogaW1nQmFzZTY0LFxyXG4gICAgICB0eXBlOiAnYmFzZTY0JyxcclxuICAgICAgbmFtZTogZmlsZU5hbWVcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIG9iai5wcm94eSA9IG9wdGlvbnMucHJveHlcclxuICB9XHJcbiAgcmV0dXJuIG9ialxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGltZ3VyT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUltZ3VyQ29uZmlnPigncGljQmVkLmltZ3VyJylcclxuICBpZiAoIWltZ3VyT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgaW1ndXIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhpbWd1ck9wdGlvbnMsIGltZy5maWxlTmFtZSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGlmIChib2R5LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLmxpbmtcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmRlbGV0ZWhhc2hcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLmltZ3VyLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgfSlcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIHRocm93IGVycj8ucmVzcG9uc2U/LmRhdGEgfHwgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjbGllbnRJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmNsaWVudElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Byb3h5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnByb3h5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdpbWd1cicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUFsaXl1bkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuLy8gZ2VuZXJhdGUgT1NTIHNpZ25hdHVyZVxyXG5jb25zdCBnZW5lcmF0ZVNpZ25hdHVyZSA9IChvcHRpb25zOiBJQWxpeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXHJcbiAgY29uc3QgbWltZVR5cGUgPSBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICBpZiAoIW1pbWVUeXBlKSB0aHJvdyBFcnJvcihgTm8gbWltZSB0eXBlIGZvdW5kIGZvciBmaWxlICR7ZmlsZU5hbWV9YClcclxuXHJcbiAgY29uc3Qgc2lnblN0cmluZyA9IGBQVVRcXG5cXG4ke21pbWVUeXBlfVxcbiR7ZGF0ZX1cXG4vJHtvcHRpb25zLmJ1Y2tldH0vJHtvcHRpb25zLnBhdGh9JHtmaWxlTmFtZX1gXHJcblxyXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgb3B0aW9ucy5hY2Nlc3NLZXlTZWNyZXQpLnVwZGF0ZShzaWduU3RyaW5nKS5kaWdlc3QoJ2Jhc2U2NCcpXHJcbiAgcmV0dXJuIGBPU1MgJHtvcHRpb25zLmFjY2Vzc0tleUlkfToke3NpZ25hdHVyZX1gXHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyKTogSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUFVUJyxcclxuICAgIHVybDogYGh0dHBzOi8vJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbS8ke2VuY29kZVVSSShvcHRpb25zLnBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtvcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbWAsXHJcbiAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZSxcclxuICAgICAgRGF0ZTogbmV3IERhdGUoKS50b1VUQ1N0cmluZygpLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpXHJcbiAgICB9LFxyXG4gICAgYm9keTogaW1hZ2UsXHJcbiAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBhbGlZdW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpXHJcbiAgaWYgKCFhbGlZdW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBhbGlZdW4gT1NTIGNvbmZpZycpXHJcbiAgfVxyXG4gIGFsaVl1bk9wdGlvbnMucGF0aCA9IGFsaVl1bk9wdGlvbnMucGF0aC5yZXBsYWNlKC9cXC8qJC8sICcnKS5yZXBsYWNlKC9eXFwvKi8sICcnKSArICcvJ1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGhcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnMoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IG9wdGlvblVybCA9IGFsaVl1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7YWxpWXVuT3B0aW9ucy5idWNrZXR9LiR7YWxpWXVuT3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWNjZXNzS2V5SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlJZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlTZWNyZXQnLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5U2VjcmV0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdhbGl5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7XHJcbiAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVUQnKVxyXG4gICAgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVXB5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IE1ENSBmcm9tICdtZDUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCB7IHNhZmVQYXJzZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIGNvbnN0IG9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvclxyXG4gIGNvbnN0IHBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZFxyXG4gIGNvbnN0IG1kNVBhc3N3b3JkID0gTUQ1KHBhc3N3b3JkKVxyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcclxuICBjb25zdCB1cmkgPSBgLyR7b3B0aW9ucy5idWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gXHJcbiAgY29uc3QgdmFsdWUgPSBgUFVUJiR7dXJpfSYke2RhdGV9YFxyXG4gIGNvbnN0IHNpZ24gPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG1kNVBhc3N3b3JkKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgnYmFzZTY0JylcclxuICByZXR1cm4gYFVQWVVOICR7b3BlcmF0b3J9OiR7c2lnbn1gXHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGJ1Y2tldCA9IG9wdGlvbnMuYnVja2V0XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly92MC5hcGkudXB5dW4uY29tLyR7YnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLFxyXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHVweXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJylcclxuICBpZiAoIXVweXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdXBZdW4gY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBwYXRoID0gdXB5dW5PcHRpb25zLnBhdGggfHwgJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7dXB5dW5PcHRpb25zLnVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfSR7dXB5dW5PcHRpb25zLm9wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdVcGxvYWQgZmFpbGVkJykge1xyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYm9keSA9IHNhZmVQYXJzZTx7IGNvZGU6IHN0cmluZyB9PihlcnIuZXJyb3IpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyA/IGJvZHkuY29kZSA6IGJvZHlcclxuICAgICAgICB9KSxcclxuICAgICAgICB0ZXh0OiAnaHR0cDovL2RvY3MudXB5dW4uY29tL2FwaS9lcnJuby8nXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3BlcmF0b3InLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJykgfSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUEVSQVRPUicpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcGVyYXRvciB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1BBU1NXT1JEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3VweXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJV2ViZGF2UGxpc3RDb25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVdlYmRhdlBsaXN0Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyKTogSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUFVUJyxcclxuICAgIHVybDogYCR7b3B0aW9ucy5ob3N0fS8ke2VuY29kZVVSSShvcHRpb25zLnBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSksXHJcbiAgICAgICdDb250ZW50LUxlbmd0aCc6IGltYWdlLmxlbmd0aFxyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHdlYmRhdnBsaXN0T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JylcclxuICBpZiAoIXdlYmRhdnBsaXN0T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgd2ViZGF2cGxpc3QgY29uZmlnJylcclxuICB9XHJcbiAgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3QgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdC5yZXBsYWNlKCdodHRwczovLycsICcnKS5yZXBsYWNlKCdodHRwOi8vJywgJycpLnJlcGxhY2UoL1xcLyskLywgJycpXHJcbiAgaWYgKHdlYmRhdnBsaXN0T3B0aW9ucy5zc2xFbmFibGVkKSB7XHJcbiAgICB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCA9ICdodHRwczovLycgKyB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdFxyXG4gIH0gZWxzZSB7XHJcbiAgICB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCA9ICdodHRwOi8vJyArIHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0XHJcbiAgfVxyXG4gIHdlYmRhdnBsaXN0T3B0aW9ucy5wYXRoID0gd2ViZGF2cGxpc3RPcHRpb25zLnBhdGgucmVwbGFjZSgvXlxcLyovLCAnJykucmVwbGFjZSgvXFwvKiQvLCAnJykgKyAnLydcclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IGN1c3RvbVVybCA9IHdlYmRhdnBsaXN0T3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSB3ZWJkYXZwbGlzdE9wdGlvbnMucGF0aFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHdlYmRhdnBsaXN0T3B0aW9ucywgaW1nLmZpbGVOYW1lLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID49IDIwMCAmJiBib2R5LnN0YXR1c0NvZGUgPCAzMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX1gXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7d2ViZGF2cGxpc3RPcHRpb25zLmhvc3R9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX1gXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2hvc3QnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0hPU1QnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmhvc3QgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc3NsRW5hYmxlZCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc3NsRW5hYmxlZCB8fCB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVzZXJuYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRScpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwnKSB9XHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignd2ViZGF2cGxpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1QnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgU01NU1VwbG9hZGVyIGZyb20gJy4vc21tcydcclxuaW1wb3J0IHRjWXVuVXBsb2FkZXIgZnJvbSAnLi90Y3l1bidcclxuaW1wb3J0IGdpdGh1YlVwbG9hZGVyIGZyb20gJy4vZ2l0aHViJ1xyXG5pbXBvcnQgcWluaXVVcGxvYWRlciBmcm9tICcuL3Fpbml1J1xyXG5pbXBvcnQgaW1ndXJVcGxvYWRlciBmcm9tICcuL2ltZ3VyJ1xyXG5pbXBvcnQgYWxpWXVuVXBsb2FkZXIgZnJvbSAnLi9hbGl5dW4nXHJcbmltcG9ydCB1cFl1blVwbG9hZGVyIGZyb20gJy4vdXB5dW4nXHJcbmltcG9ydCB3ZWJkYXZwbGlzdFVwbG9hZGVyIGZyb20gJy4vd2ViZGF2J1xyXG5cclxuY29uc3QgYnVpbGRJblVwbG9hZGVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgYWxpWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB0Y1l1blVwbG9hZGVyKGN0eClcclxuICAgICAgU01NU1VwbG9hZGVyKGN0eClcclxuICAgICAgZ2l0aHViVXBsb2FkZXIoY3R4KVxyXG4gICAgICBxaW5pdVVwbG9hZGVyKGN0eClcclxuICAgICAgaW1ndXJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHVwWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB3ZWJkYXZwbGlzdFVwbG9hZGVyKGN0eClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5VcGxvYWRlcnNcclxuIiwiaW1wb3J0IHtcclxuICBpc1VybCxcclxuICBnZXRJbWFnZVNpemUsXHJcbiAgZ2V0RlNGaWxlLFxyXG4gIGdldFVSTEZpbGVcclxufSBmcm9tICcuLi8uLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElQaWNHbywgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sIElJbWdJbmZvLCBJSW1nU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCByZXN1bHRzOiBJSW1nSW5mb1tdID0gY3R4Lm91dHB1dFxyXG4gIGF3YWl0IFByb21pc2UuYWxsKGN0eC5pbnB1dC5tYXAoYXN5bmMgKGl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgbGV0IGluZm86IElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvXHJcbiAgICBpZiAoaXNVcmwoaXRlbSkpIHtcclxuICAgICAgaW5mbyA9IGF3YWl0IGdldFVSTEZpbGUoaXRlbSwgY3R4KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5mbyA9IGF3YWl0IGdldEZTRmlsZShpdGVtKVxyXG4gICAgfVxyXG4gICAgaWYgKGluZm8uc3VjY2VzcyAmJiBpbmZvLmJ1ZmZlcikge1xyXG4gICAgICBjb25zdCBpbWdTaXplID0gZ2V0SW1nU2l6ZShjdHgsIGluZm8uYnVmZmVyLCBpdGVtKVxyXG4gICAgICByZXN1bHRzW2luZGV4XSA9IHtcclxuICAgICAgICBidWZmZXI6IGluZm8uYnVmZmVyLFxyXG4gICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lLFxyXG4gICAgICAgIHdpZHRoOiBpbWdTaXplLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogaW1nU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgZXh0bmFtZTogaW5mby5leHRuYW1lXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihpbmZvLnJlYXNvbilcclxuICAgIH1cclxuICB9KSlcclxuICAvLyByZW1vdmUgZW1wdHkgaXRlbVxyXG4gIGN0eC5vdXRwdXQgPSByZXN1bHRzLmZpbHRlcihpdGVtID0+IGl0ZW0pXHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5jb25zdCBnZXRJbWdTaXplID0gKGN0eDogSVBpY0dvLCBmaWxlOiBCdWZmZXIsIHBhdGg6IHN0cmluZyk6IElJbWdTaXplID0+IHtcclxuICBjb25zdCBpbWFnZVNpemUgPSBnZXRJbWFnZVNpemUoZmlsZSlcclxuICBpZiAoIWltYWdlU2l6ZS5yZWFsKSB7XHJcbiAgICBjdHgubG9nLndhcm4oYGNhbid0IGdldCAke3BhdGh9J3MgaW1hZ2Ugc2l6ZWApXHJcbiAgICBjdHgubG9nLndhcm4oJ2ZhbGxiYWNrIHRvIDIwMCAqIDIwMCcpXHJcbiAgfVxyXG4gIHJldHVybiBpbWFnZVNpemVcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGhhbmRsZVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGN0eC5vdXRwdXQucHVzaCguLi5jdHguaW5wdXQpXHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdyZXNvbHZlJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4sIElQbHVnaW5Mb2FkZXIsIElQaWNHb1BsdWdpbkludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xyXG5pbXBvcnQgeyBzZXRDdXJyZW50UGx1Z2luTmFtZSB9IGZyb20gJy4vTGlmZWN5Y2xlUGx1Z2lucydcclxuXHJcbi8qKlxyXG4gKiBMb2NhbCBwbHVnaW4gbG9hZGVyLCBmaWxlIHN5c3RlbSBpcyByZXF1aXJlZFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBsdWdpbkxvYWRlciBpbXBsZW1lbnRzIElQbHVnaW5Mb2FkZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxpc3Q6IHN0cmluZ1tdID0gW11cclxuICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxMaXN0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTWFwOiBNYXA8c3RyaW5nLCBJUGljR29QbHVnaW5JbnRlcmZhY2U+ID0gbmV3IE1hcCgpXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5pbml0KClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlUGF0aCkpIHtcclxuICAgICAgY29uc3QgcGtnID0ge1xyXG4gICAgICAgIG5hbWU6ICdwaWNnby1wbHVnaW5zJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIHJlcG9zaXRvcnk6ICdodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZScsXHJcbiAgICAgICAgbGljZW5zZTogJ01JVCdcclxuICAgICAgfVxyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VQYXRoLCBKU09OLnN0cmluZ2lmeShwa2cpLCAndXRmOCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcGx1Z2luIGVudHJ5XHJcbiAgcHJpdmF0ZSByZXNvbHZlUGx1Z2luIChjdHg6IElQaWNHbywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiByZXNvbHZlLnN5bmMobmFtZSwgeyBiYXNlZGlyOiBjdHguYmFzZURpciB9KVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMnLCBuYW1lKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gbG9hZCBhbGwgdGhpcmQgcGFydHkgcGx1Z2luXHJcbiAgbG9hZCAoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGNvbnN0IHBsdWdpbkRpciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnbm9kZV9tb2R1bGVzLycpXHJcbiAgICAvLyBUaGFua3MgdG8gaGV4byAtPiBodHRwczovL2dpdGh1Yi5jb20vaGV4b2pzL2hleG8vYmxvYi9tYXN0ZXIvbGliL2hleG8vbG9hZF9wbHVnaW5zLmpzXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGx1Z2luRGlyKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IGpzb24gPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZVBhdGgpXHJcbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBkZXZEZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBtb2R1bGVzID0gZGVwcy5jb25jYXQoZGV2RGVwcykuZmlsdGVyKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCEvXnBpY2dvLXBsdWdpbi18XkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHJldHVybiBmYWxzZVxyXG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5yZXNvbHZlUGx1Z2luKHRoaXMuY3R4LCBuYW1lKVxyXG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoKVxyXG4gICAgfSlcclxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgdGhpcy5yZWdpc3RlclBsdWdpbihtb2R1bGUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZywgcGx1Z2luPzogSVBpY0dvUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIW5hbWUgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdQbGVhc2UgcHJvdmlkZSB2YWxpZCBwbHVnaW4nKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZnVsbExpc3QuYWRkKG5hbWUpXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyByZWdpc3RlciBsb2NhbCBwbHVnaW5cclxuICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICBpZiAodGhpcy5jdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtuYW1lfWApID09PSB0cnVlIHx8ICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luKG5hbWUpIS5yZWdpc3Rlcih0aGlzLmN0eClcclxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IGBwaWNnb1BsdWdpbnNbJHtuYW1lfV1gXHJcbiAgICAgICAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgW3BsdWdpbl06IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyByZWdpc3RlciBwcm92aWRlZCBwbHVnaW5cclxuICAgICAgICAvLyAmJiB3b24ndCB3cml0ZSBjb25maWcgdG8gZmlsZXNcclxuICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxyXG4gICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgY29uc3QgcGx1Z2luSW50ZXJmYWNlID0gcGx1Z2luKHRoaXMuY3R4KVxyXG4gICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW5JbnRlcmZhY2UpXHJcbiAgICAgICAgcGx1Z2luSW50ZXJmYWNlLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXHJcbiAgICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlIGFzIEVycm9yKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGBQbHVnaW4gJHtuYW1lfSBMb2FkIEVycm9yYCxcclxuICAgICAgICBib2R5OiBlXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyUGx1Z2luIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcclxuICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudXBsb2FkZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLnRyYW5zZm9ybWVyLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguY21kLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LnJlbW92ZUNvbmZpZygncGljZ29QbHVnaW5zJywgbmFtZSlcclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gYnkgbmFtZVxyXG4gIGdldFBsdWdpbiAobmFtZTogc3RyaW5nKTogSVBpY0dvUGx1Z2luSW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbk1hcC5oYXMobmFtZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFwLmdldChuYW1lKVxyXG4gICAgfVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXHJcbiAgICBjb25zdCBwbHVnaW4gPSByZXF1aXJlKHBsdWdpbkRpciArIG5hbWUpKHRoaXMuY3R4KVxyXG4gICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbilcclxuICAgIHJldHVybiBwbHVnaW5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGlzdCBvZiBlbmFibGVkIHBsdWdpbnNcclxuICAgKi9cclxuICBnZXRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0XHJcbiAgfVxyXG5cclxuICBoYXNQbHVnaW4gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZnVsbExpc3QuaGFzKG5hbWUpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGZ1bGwgbGlzdCBvZiBwbHVnaW5zLCB3aGV0aGVyIGl0IGlzIGVuYWJsZWQgb3Igbm90XHJcbiAgICovXHJcbiAgZ2V0RnVsbExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5mdWxsTGlzdF1cclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luTG9hZGVyXHJcbiIsImV4cG9ydCBjb25zdCBDTElQQk9BUkRfSU1BR0VfRk9MREVSID0gJ3BpY2xpc3QtY2xpcGJvYXJkLWltYWdlcydcclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBvcyBmcm9tICdvcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgaXNXc2wgZnJvbSAnaXMtd3NsJ1xyXG5pbXBvcnQgeyBJUGljR28sIElDbGlwYm9hcmRJbWFnZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi9lbnVtJ1xyXG5pbXBvcnQgbWFjQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL21hYy5hcHBsZXNjcmlwdCdcclxuaW1wb3J0IHdpbmRvd3NDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93cy5wczEnXHJcbmltcG9ydCB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93czEwLnBzMSdcclxuaW1wb3J0IGxpbnV4Q2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL2xpbnV4LnNoJ1xyXG5pbXBvcnQgd3NsQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL3dzbC5zaCdcclxuaW1wb3J0IHsgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiB9IGZyb20gJy4vc3RhdGljJ1xyXG5cclxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSAnZGFyd2luJyB8ICd3aW4zMicgfCAnd2luMTAnIHwgJ2xpbnV4JyB8ICd3c2wnXHJcblxyXG5jb25zdCBnZXRDdXJyZW50UGxhdGZvcm0gPSAoKTogUGxhdGZvcm0gPT4ge1xyXG4gIGNvbnN0IHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybVxyXG4gIGlmIChpc1dzbCkge1xyXG4gICAgcmV0dXJuICd3c2wnXHJcbiAgfVxyXG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgY29uc3QgY3VycmVudE9TID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJylbMF1cclxuICAgIGlmIChjdXJyZW50T1MgPT09ICcxMCcpIHtcclxuICAgICAgcmV0dXJuICd3aW4xMCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnd2luMzInXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgIHJldHVybiAnZGFyd2luJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJ2xpbnV4J1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0Q29udGVudDoge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46IG1hY0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4zMjogd2luZG93c0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4xMDogd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIGxpbnV4OiBsaW51eENsaXBib2FyZFNjcmlwdCxcclxuICB3c2w6IHdzbENsaXBib2FyZFNjcmlwdFxyXG59XHJcbi8qKlxyXG4gKiBwb3dlcnNoZWxsIHdpbGwgcmVwb3J0IGVycm9yIGlmIGZpbGUgZG9lcyBub3QgaGF2ZSBhICcucHMxJyBleHRlbnNpb24sXHJcbiAqIHNvIHdlIHNob3VsZCBrZWVwIHRoZSBleHRlbnNpb24gbmFtZSBjb25zaXN0ZW50IHdpdGggY29ycmVzcG9uZGluZyBzaGVsbFxyXG4gKi9cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWU6IHtcclxuICBba2V5IGluIFBsYXRmb3JtXTogc3RyaW5nXHJcbn0gPSB7XHJcbiAgZGFyd2luOiAnbWFjLmFwcGxlc2NyaXB0JyxcclxuICB3aW4zMjogJ3dpbmRvd3MucHMxJyxcclxuICB3aW4xMDogJ3dpbmRvd3MxMC5wczEnLFxyXG4gIGxpbnV4OiAnbGludXguc2gnLFxyXG4gIHdzbDogJ3dzbC5zaCdcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW1hZ2VGb2xkZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSKVxyXG4gIGlmICghZnMuZXhpc3RzU3luYyhpbWFnZVBhdGgpKSB7XHJcbiAgICBmcy5ta2RpclN5bmMoaW1hZ2VQYXRoKVxyXG4gIH1cclxufVxyXG5cclxuLy8gVGhhbmtzIHRvIHZzLXBpY2dvOiBodHRwczovL2dpdGh1Yi5jb20vU3BhZGVzLVMvdnMtcGljZ28vYmxvYi9tYXN0ZXIvc3JjL2V4dGVuc2lvbi50c1xyXG5jb25zdCBnZXRDbGlwYm9hcmRJbWFnZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SUNsaXBib2FyZEltYWdlPiA9PiB7XHJcbiAgY3JlYXRlSW1hZ2VGb2xkZXIoY3R4KVxyXG4gIC8vIGFkZCBhbiBjbGlwYm9hcmQgaW1hZ2UgZm9sZGVyIHRvIGNvbnRyb2wgdGhlIGltYWdlIGNhY2hlIGZpbGVcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIsIGAke2RheWpzKCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfS5wbmdgKVxyXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbik6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgcGxhdGZvcm0gPSBnZXRDdXJyZW50UGxhdGZvcm0oKVxyXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxyXG4gICAgLy8gSWYgdGhlIHNjcmlwdCBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGhlIHNjcmlwdCBmaWxlXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcclxuICAgICAgICBzY3JpcHRQYXRoLFxyXG4gICAgICAgIHBsYXRmb3JtMlNjcmlwdENvbnRlbnRbcGxhdGZvcm1dLFxyXG4gICAgICAgICd1dGY4J1xyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICBsZXQgZXhlY3V0aW9uXHJcbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdvc2FzY3JpcHQnLCBbc2NyaXB0UGF0aCwgaW1hZ2VQYXRoXSlcclxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicgfHwgcGxhdGZvcm0gPT09ICd3aW4xMCcpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3Bvd2Vyc2hlbGwnLCBbXHJcbiAgICAgICAgJy1ub3Byb2ZpbGUnLFxyXG4gICAgICAgICctbm9uaW50ZXJhY3RpdmUnLFxyXG4gICAgICAgICctbm9sb2dvJyxcclxuICAgICAgICAnLXN0YScsXHJcbiAgICAgICAgJy1leGVjdXRpb25wb2xpY3knLCAndW5yZXN0cmljdGVkJyxcclxuICAgICAgICAvLyBmaXggd2luZG93cyAxMCBuYXRpdmUgY21kIGNyYXNoIGJ1ZyB3aGVuIFwicGljZ28gdXBsb2FkXCJcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZS9pc3N1ZXMvMzJcclxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcclxuICAgICAgICAvLyAnLW5vZXhpdCcsXHJcbiAgICAgICAgJy1maWxlJywgc2NyaXB0UGF0aCxcclxuICAgICAgICBpbWFnZVBhdGhcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdzaCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfVxyXG5cclxuICAgIGV4ZWN1dGlvbi5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XHJcbiAgICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xyXG4gICAgICAgIGlmIChkYXRhLnRvU3RyaW5nKCkudHJpbSgpID09PSAnbm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkJykge1xyXG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgICAgdGl0bGU6ICd4Y2xpcCBvciB3bC1jbGlwYm9hcmQgbm90IGZvdW5kJyxcclxuICAgICAgICAgICAgYm9keTogJ1BsZWFzZSBpbnN0YWxsIHhjbGlwKGZvciB4MTEpIG9yIHdsLWNsaXBib2FyZChmb3Igd2F5bGFuZCkgYmVmb3JlIHJ1biBwaWNnbydcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJykpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGltZ1BhdGggPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXHJcblxyXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cclxuICAgICAgLy8gd2Ugc2hvdWxkIGtlZXAgaXQgaW5zdGVhZCBvZiByZW1vdmluZ1xyXG4gICAgICBsZXQgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIC8vIGluIG1hY09TIGlmIHlvdXIgY29weSB0aGUgZmlsZSBpbiBzeXN0ZW0sIGl0J3MgYmFzZW5hbWUgd2lsbCBub3QgZXF1YWwgdG8gb3VyIGRlZmF1bHQgYmFzZW5hbWVcclxuICAgICAgaWYgKHBhdGguYmFzZW5hbWUoaW1nUGF0aCkgIT09IHBhdGguYmFzZW5hbWUoaW1hZ2VQYXRoKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xyXG4gICAgICAgIC8vIGJ1dCB0aGUgcGF0aCBleGlzdHMsIHdlIHNob3VsZCBrZWVwIGl0XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaW1nUGF0aCkpIHtcclxuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxyXG4gICAgICBpZiAoaW1nUGF0aCAhPT0gJ25vIGltYWdlJyAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBDYW4ndCBmaW5kICR7aW1nUGF0aH1gKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgaW1nUGF0aCxcclxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmdcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0Q2xpcGJvYXJkSW1hZ2VcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5cclxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcclxuZXhwb3J0IHtcclxuICBldmVudEJ1c1xyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luYyAqL1xyXG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnXHJcbmltcG9ydCB7IElQaWNHbywgVW5kZWZpbmFibGUsIElDb25maWdDaGFuZ2VQYXlsb2FkLCBJQ29uZmlnLCBJUmVxdWVzdENvbmZpZywgSU9sZFJlcU9wdGlvbnMsIElSZXNwb25zZSwgSUZ1bGxSZXNwb25zZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJ1xyXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnXHJcbmltcG9ydCB0dW5uZWwgZnJvbSAndHVubmVsJ1xyXG5jb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcclxuICBtYXhWZXJzaW9uOiAnVExTdjEuMicsXHJcbiAgbWluVmVyc2lvbjogJ1RMU3YxLjInXHJcbn0pXHJcblxyXG4vLyB0aGFua3MgZm9yIGh0dHBzOi8vZ2l0aHViLmRldi9yZXF1ZXN0L3JlcXVlc3QvYmxvYi9tYXN0ZXIvaW5kZXguanNcclxuZnVuY3Rpb24gYXBwZW5kRm9ybURhdGEgKGZvcm06IEZvcm1EYXRhLCBrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIGRhdGEgJiYgJ29wdGlvbnMnIGluIGRhdGEpIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YS52YWx1ZSwgZGF0YS5vcHRpb25zKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXF1ZXN0SW50ZXJjZXB0b3IgKG9wdGlvbnM6IElPbGRSZXFPcHRpb25zIHwgQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NSZXF1ZXN0Q29uZmlnICYge1xyXG4gIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG59IHtcclxuICBsZXQgX19pc09sZE9wdGlvbnMgPSBmYWxzZVxyXG4gIGNvbnN0IG9wdDogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gJiB7XHJcbiAgICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cclxuICB9ID0ge1xyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIHVybDogKG9wdGlvbnMudXJsIGFzIHN0cmluZykgfHwgJycsXHJcbiAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICB9XHJcbiAgLy8gdXNlciByZXF1ZXN0IGNvbmZpZyBwcm94eVxyXG4gIGlmIChvcHRpb25zLnByb3h5KSB7XHJcbiAgICBsZXQgcHJveHlPcHRpb25zID0gb3B0aW9ucy5wcm94eVxyXG4gICAgaWYgKHR5cGVvZiBwcm94eU9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gbmV3IFVSTChvcHRpb25zLnByb3h5KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gZmFsc2VcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIH1cclxuICAgIGlmIChwcm94eU9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcclxuICAgICAgICBvcHQuaHR0cHNBZ2VudCA9IHR1bm5lbC5odHRwc092ZXJIdHRwKHtcclxuICAgICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucz8uaG9zdG5hbWUsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucz8ucG9ydCwgMTApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHQucHJveHkgPSB7XHJcbiAgICAgICAgICBob3N0OiBwcm94eU9wdGlvbnMuaG9zdG5hbWUsXHJcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCwgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6ICdodHRwJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoJ2Zvcm1EYXRhJyBpbiBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IG9wdGlvbnMuZm9ybURhdGFba2V5XVxyXG4gICAgICBhcHBlbmRGb3JtRGF0YShmb3JtLCBrZXksIGRhdGEpXHJcbiAgICB9XHJcbiAgICBvcHQuZGF0YSA9IGZvcm1cclxuICAgIG9wdC5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihvcHQuaGVhZGVycyB8fCB7fSwgZm9ybS5nZXRIZWFkZXJzKCkpXHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIGRlbGV0ZSBvcHQuZm9ybURhdGFcclxuICB9XHJcbiAgaWYgKCdib2R5JyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICBkZWxldGUgb3B0LmJvZHlcclxuICB9XHJcbiAgaWYgKCdxcycgaW4gb3B0aW9ucykge1xyXG4gICAgb3B0LnBhcmFtcyA9IG9wdGlvbnMucXNcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gIH1cclxuICBvcHQuX19pc09sZE9wdGlvbnMgPSBfX2lzT2xkT3B0aW9uc1xyXG4gIHJldHVybiBvcHRcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzcG9uc2VJbnRlcmNlcHRvciAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpOiBJRnVsbFJlc3BvbnNlIHtcclxuICByZXR1cm4ge1xyXG4gICAgLi4ucmVzcG9uc2UsXHJcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICBib2R5OiByZXNwb25zZS5kYXRhXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUVycm9ySGFuZGxlciAoZXJyb3I6IGFueSkge1xyXG4gIC8vIGlmIChlcnJvci5yZXNwb25zZSkge1xyXG4gIC8vICAgLy8gVGhlIHJlcXVlc3Qgd2FzIG1hZGUgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSBzdGF0dXMgY29kZVxyXG4gIC8vICAgLy8gdGhhdCBmYWxscyBvdXQgb2YgdGhlIHJhbmdlIG9mIDJ4eFxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm8pXHJcbiAgLy8gfSBlbHNlIGlmIChlcnJvci5yZXF1ZXN0KSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBidXQgbm8gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkXHJcbiAgLy8gICAvLyBgZXJyb3IucmVxdWVzdGAgaXMgYW4gaW5zdGFuY2Ugb2YgWE1MSHR0cFJlcXVlc3QgaW4gdGhlIGJyb3dzZXIgYW5kIGFuIGluc3RhbmNlIG9mXHJcbiAgLy8gICAvLyBodHRwLkNsaWVudFJlcXVlc3QgaW4gbm9kZS5qc1xyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLnJlcXVlc3QpXHJcbiAgLy8gfSBlbHNlIHtcclxuICAvLyAgIC8vIFNvbWV0aGluZyBoYXBwZW5lZCBpbiBzZXR0aW5nIHVwIHRoZSByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIGFuIEVycm9yXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSlcclxuICAvLyB9XHJcbiAgY29uc3QgZXJyb3JPYmogPSB7XHJcbiAgICBtZXRob2Q6IGVycm9yPy5jb25maWc/Lm1ldGhvZD8udG9VcHBlckNhc2UoKSB8fCAnJyxcclxuICAgIHVybDogZXJyb3I/LmNvbmZpZz8udXJsIHx8ICcnLFxyXG4gICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8ICcnLFxyXG4gICAgc3RhY2s6IGVycm9yPy5zdGFjayB8fCB7fSxcclxuICAgIHJlc3BvbnNlOiB7XHJcbiAgICAgIHN0YXR1czogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgYm9keTogZXJyb3I/LnJlc3BvbnNlPy5kYXRhIHx8ICcnXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvck9iailcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJUmVxdWVzdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcHJveHk6IFVuZGVmaW5hYmxlPHN0cmluZz4gPSAnJ1xyXG4gIG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ID0ge31cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gICAgZXZlbnRCdXMub24oSUJ1c0V2ZW50LkNPTkZJR19DSEFOR0UsIChkYXRhOiBJQ29uZmlnQ2hhbmdlUGF5bG9hZDxzdHJpbmcgfCBJQ29uZmlnWydwaWNCZWQnXT4pID0+IHtcclxuICAgICAgc3dpdGNoIChkYXRhLmNvbmZpZ05hbWUpIHtcclxuICAgICAgICBjYXNlICdwaWNCZWQnOlxyXG4gICAgICAgICAgaWYgKChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKT8ucHJveHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm94eSA9IChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKS5wcm94eVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdwaWNCZWQucHJveHknOlxyXG4gICAgICAgICAgdGhpcy5wcm94eSA9IGRhdGEudmFsdWUgYXMgc3RyaW5nXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQucHJveHknKVxyXG4gICAgaWYgKHByb3h5KSB7XHJcbiAgICAgIHRoaXMucHJveHkgPSBwcm94eVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVQcm94eSAoKTogQXhpb3NSZXF1ZXN0Q29uZmlnWydwcm94eSddIHwgZmFsc2Uge1xyXG4gICAgaWYgKHRoaXMucHJveHkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKHRoaXMucHJveHkpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0IHx8ICcwJywgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6IHByb3h5T3B0aW9ucy5wcm90b2NvbFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIC8vICM2NCBkeW5hbWljIGdldCBwcm94eSB2YWx1ZVxyXG4gIHJlcXVlc3Q8VCwgVSBleHRlbmRzIChcclxuICAgIElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgSU9sZFJlcU9wdGlvbnMgPyBJT2xkUmVxT3B0aW9ucyA6IElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgQXhpb3NSZXF1ZXN0Q29uZmlnID8gQXhpb3NSZXF1ZXN0Q29uZmlnIDogbmV2ZXJcclxuICApPiAob3B0aW9uczogVSk6IFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PiB7XHJcbiAgICB0aGlzLm9wdGlvbnMucHJveHkgPSB0aGlzLmhhbmRsZVByb3h5KClcclxuICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Q29udGVudExlbmd0aCA9IEluZmluaXR5XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5ICYmIG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICBob3N0OiB0aGlzLm9wdGlvbnMucHJveHkuaG9zdCxcclxuICAgICAgICAgIHBvcnQ6IHRoaXMub3B0aW9ucy5wcm94eS5wb3J0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLm9wdGlvbnMucHJveHkgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSBodHRwc0FnZW50XHJcbiAgICB9XHJcbiAgICAvLyAhTk9USUNFIHRoaXMub3B0aW9ucyAhPT0gb3B0aW9uc1xyXG4gICAgLy8gdGhpcy5vcHRpb25zIGlzIHRoZSBkZWZhdWx0IG9wdGlvbnNcclxuICAgIGNvbnN0IGluc3RhbmNlID0gYXhpb3MuY3JlYXRlKHRoaXMub3B0aW9ucylcclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UocmVzcG9uc2VJbnRlcmNlcHRvciwgcmVzcG9uc2VFcnJvckhhbmRsZXIpXHJcblxyXG4gICAgLy8gY29tcGF0aWJsZSB3aXRoIG9sZCByZXF1ZXN0IG9wdGlvbnMgdG8gbmV3IG9wdGlvbnNcclxuICAgIGNvbnN0IG9wdCA9IHJlcXVlc3RJbnRlcmNlcHRvcihvcHRpb25zKVxyXG5cclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgIC8vIGhhbmRsZSBDb250ZW50LVR5cGVcclxuICAgICAgbGV0IGNvbnRlbnRUeXBlID0gJydcclxuICAgICAgaWYgKG9iaj8uaGVhZGVycz8uY29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5jb250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uQ29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5Db250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uWydjb250ZW50LXR5cGUnXSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ11cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29udGVudFR5cGUgIT09ICcnICYmIG9iai5oZWFkZXJzKSB7XHJcbiAgICAgICAgb2JqLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudFR5cGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqXHJcbiAgICB9KVxyXG4gICAgaWYgKCdyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZScgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmVXaXRoRnVsbFJlc3BvbnNlKSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdCkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIC8vIHVzZSBvbGQgcmVxdWVzdCBvcHRpb24gZm9ybWF0XHJcbiAgICAgICAgaWYgKG9wdC5fX2lzT2xkT3B0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCdqc29uJyBpbiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcy5kYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICB9XHJcbiAgICAgIH0pIGFzIFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PlxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdFxyXG4iLCJpbXBvcnQgeyBJQ29uZmlnLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSlNPTlN0b3JlIH0gZnJvbSAnQHBpY2dvL3N0b3JlJ1xyXG5pbXBvcnQgeyBJSlNPTiB9IGZyb20gJ0BwaWNnby9zdG9yZS9kaXN0L3R5cGVzJ1xyXG5cclxuY2xhc3MgREIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBKU09OU3RvcmVcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmRiID0gbmV3IEpTT05TdG9yZSh0aGlzLmN0eC5jb25maWdQYXRoKVxyXG5cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY0JlZCcpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY0JlZCcsIHtcclxuICAgICAgICAgIHVwbG9hZGVyOiAnc21tcycsXHJcbiAgICAgICAgICBjdXJyZW50OiAnc21tcydcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY2dvUGx1Z2lucycpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY2dvUGx1Z2lucycsIHt9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWQgKGZsdXNoPzogYm9vbGVhbik6IElKU09OIHtcclxuICAgIHJldHVybiB0aGlzLmRiLnJlYWQoZmx1c2gpXHJcbiAgfVxyXG5cclxuICBnZXQgKGtleTogc3RyaW5nID0gJycpOiBhbnkge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5nZXQoa2V5KVxyXG4gIH1cclxuXHJcbiAgc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5zZXQoa2V5LCB2YWx1ZSlcclxuICB9XHJcblxyXG4gIGhhcyAoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIuaGFzKGtleSlcclxuICB9XHJcblxyXG4gIHVuc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBQYXJ0aWFsPElDb25maWc+KTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChjb25maWc6IElDb25maWcpOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERCXHJcblxyXG4vLyBjb25zdCBpbml0Q29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZyk6IGxvd2RiLkxvd2RiU3luYzxhbnk+ID0+IHtcclxuLy8gfVxyXG5cclxuLy8gY29uc3Qgc2F2ZUNvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcsIGNvbmZpZzogYW55KTogdm9pZCA9PiB7XHJcbi8vICAgY29uc3QgZGIgPSBpbml0Q29uZmlnKGNvbmZpZ1BhdGgpXHJcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuLy8gICAgIGRiLnJlYWQoKS5zZXQobmFtZSwgY29uZmlnW25hbWVdKS53cml0ZSgpXHJcbi8vICAgfSlcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IHtcclxuLy8gaW5pdENvbmZpZyxcclxuLy8gc2F2ZUNvbmZpZ1xyXG4vLyB9XHJcbiIsImltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bidcclxuaW1wb3J0IHtcclxuICBJUmVzdWx0LFxyXG4gIElQcm9jZXNzRW52LFxyXG4gIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxyXG4gIElQbHVnaW5IYW5kbGVyLFxyXG4gIElQbHVnaW5IYW5kbGVyT3B0aW9ucyxcclxuICBVbmRlZmluYWJsZSxcclxuICBJUGljR28sXHJcbiAgSVBsdWdpbkhhbmRsZXJSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGdldFByb2Nlc3NQbHVnaW5OYW1lLCBnZXROb3JtYWxQbHVnaW5OYW1lIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uL2kxOG4vemgtQ04nXHJcblxyXG5leHBvcnQgY2xhc3MgUGx1Z2luSGFuZGxlciBpbXBsZW1lbnRzIElQbHVnaW5IYW5kbGVyIHtcclxuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zXHJcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgLy8gZGV0ZWN0IGlmIGhhcyBhbHJlYWR5IGluc3RhbGxlZFxyXG4gICAgICAgIC8vIG9yIHdpbGwgY2F1c2UgZXJyb3JcclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XHJcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2goaXRlbS5wa2dOYW1lKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3MoYFBpY0dvIGhhcyBhbHJlYWR5IGluc3RhbGxlZCAke2l0ZW0ucGtnTmFtZX1gKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHNvbWV0aGluZyB3cm9uZywgZmlsdGVyIGl0IG91dFxyXG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIGNvbnN0IGZ1bGxOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0uZnVsbE5hbWUpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChmdWxsTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxyXG4gICAgICAvLyAxLiBpbnN0YWxsIHJlbW90ZSBwYWNhZ2VcclxuICAgICAgLy8gMi4gaW5zdGFsbCBsb2NhbCBwYWNhZ2VcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgnaW5zdGFsbCcsIGZ1bGxOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdW5pbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2lucy5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN1Y2Nlc3MpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChwa2dOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHVuaW5zdGFsbCBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxyXG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ3VuaW5zdGFsbCcsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyKVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIudW5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdXBkYXRlIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1cGRhdGUgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndXBkYXRlJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIsIG9wdGlvbnMsIGVudilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZUZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY0NvbW1hbmQgKGNtZDogc3RyaW5nLCBtb2R1bGVzOiBzdHJpbmdbXSwgd2hlcmU6IHN0cmluZywgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudjogSVByb2Nlc3NFbnYgPSB7fSk6IFByb21pc2U8SVJlc3VsdD4ge1xyXG4gICAgLy8gb3B0aW9ucyBmaXJzdFxyXG4gICAgY29uc3QgcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucmVnaXN0cnknKVxyXG4gICAgY29uc3QgcHJveHkgPSBvcHRpb25zLnByb3h5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucHJveHknKVxyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KCctLWNvbG9yPWFsd2F5cycpLmNvbmNhdCgnLS1zYXZlJylcclxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJveHkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbnBtID0gc3Bhd24oJ25wbScsIGFyZ3MsIHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9KVxyXG5cclxuICAgICAgICBsZXQgb3V0cHV0ID0gJydcclxuICAgICAgICBucG0uc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZG91dClcclxuXHJcbiAgICAgICAgbnBtLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBvdXRwdXQgKz0gZGF0YVxyXG4gICAgICAgIH0pLnBpcGUocHJvY2Vzcy5zdGRlcnIpXHJcblxyXG4gICAgICAgIG5wbS5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IDAsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXHJcbiAgICAgICAgbnBtLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCAnTlBNIGlzIG5vdCBpbnN0YWxsZWQnKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmNvbnN0IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzID0gKGN0eDogSVBpY0dvLCBuYW1lT3JQYXRoOiBzdHJpbmcpOiBJUGx1Z2luUHJvY2Vzc1Jlc3VsdCA9PiB7XHJcbiAgY29uc3QgcmVzID0ge1xyXG4gICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICBmdWxsTmFtZTogJycsXHJcbiAgICBwa2dOYW1lOiAnJ1xyXG4gIH1cclxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxyXG4gIGlmICghcmVzdWx0KSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIC8vIGZpcnN0IGdldCByZXN1bHQgdGhlbiBkbyB0aGlzIHByb2Nlc3NcclxuICAvLyBvciBzb21lIGVycm9yIHdpbGwgbG9nIHR3aWNlXHJcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxyXG4gIGlmICghcGtnTmFtZSkge1xyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXHJcbiAgICBwa2dOYW1lXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXHJcbiIsImltcG9ydCB7IFpIX0NOLCBJTG9jYWxlc0tleSwgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgSVBpY0dvIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcclxuXHJcbmltcG9ydCB7IE9iamVjdEFkYXB0ZXIsIEkxOG4gfSBmcm9tICdAcGljZ28vaTE4bidcclxuaW1wb3J0IHsgSVN0cmluZ0tleU1hcCwgSUkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IElMb2NhbGUgfSBmcm9tICdAcGljZ28vaTE4bi9kaXN0L3R5cGVzJ1xyXG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nXHJcbmltcG9ydCB7IFpIX1RXIH0gZnJvbSAnLi96aC1UVydcclxuXHJcbmNvbnN0IGxhbmd1YWdlTGlzdDogSVN0cmluZ0tleU1hcDxJU3RyaW5nS2V5TWFwPHN0cmluZz4+ID0ge1xyXG4gICd6aC1DTic6IFpIX0NOLFxyXG4gICd6aC1UVyc6IFpIX1RXLFxyXG4gIGVuOiBFTlxyXG59XHJcblxyXG5jbGFzcyBJMThuTWFuYWdlciBpbXBsZW1lbnRzIElJMThuTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBJMThuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RBZGFwdGVyOiBPYmplY3RBZGFwdGVyXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMub2JqZWN0QWRhcHRlciA9IG5ldyBPYmplY3RBZGFwdGVyKGxhbmd1YWdlTGlzdClcclxuICAgIGxldCBsYW5ndWFnZSA9IHRoaXMuY3R4LmdldENvbmZpZzxzdHJpbmc+KCdzZXR0aW5ncy5sYW5ndWFnZScpIHx8ICd6aC1DTidcclxuICAgIGlmICghbGFuZ3VhZ2VMaXN0W2xhbmd1YWdlXSkge1xyXG4gICAgICBsYW5ndWFnZSA9ICd6aC1DTicgLy8gdXNlIGRlZmF1bHRcclxuICAgIH1cclxuICAgIHRoaXMuaTE4biA9IG5ldyBJMThuKHtcclxuICAgICAgYWRhcHRlcjogdGhpcy5vYmplY3RBZGFwdGVyLFxyXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gICAgdGhpcy5sb2FkT3V0dGVySTE4bigpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRPdXR0ZXJJMThuICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGkxOG5Gb2xkZXIgPSB0aGlzLmdldE91dHRlckkxOG5Gb2xkZXIoKVxyXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhpMThuRm9sZGVyLCB7XHJcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcclxuICAgIH0pXHJcbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICBpZiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLm5hbWUuZW5kc1dpdGgoJy55bWwnKSkge1xyXG4gICAgICAgIGNvbnN0IGkxOG5GaWxlUGF0aCA9IHBhdGguam9pbihpMThuRm9sZGVyLCBmaWxlLm5hbWUpXHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGUgPSBmcy5yZWFkRmlsZVN5bmMoaTE4bkZpbGVQYXRoLCAndXRmOCcpXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGkxOG5GaWxlT2JqID0geWFtbC5sb2FkKGkxOG5GaWxlKSBhcyBJTG9jYWxlc1xyXG4gICAgICAgICAgbGFuZ3VhZ2VMaXN0W2ZpbGUubmFtZS5yZXBsYWNlKC9cXC55bWwkLywgJycpXSA9IGkxOG5GaWxlT2JqXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3V0dGVySTE4bkZvbGRlciAoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGkxOG5Gb2xkZXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ2kxOG4tY2xpJylcclxuICAgIGlmICghZnMucGF0aEV4aXN0c1N5bmMoaTE4bkZvbGRlcikpIHtcclxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhpMThuRm9sZGVyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGkxOG5Gb2xkZXJcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZTxUIGV4dGVuZHMgc3RyaW5nPihrZXk6IElMb2NhbGVzS2V5IHwgVCwgYXJncz86IElTdHJpbmdLZXlNYXA8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pMThuLnRyYW5zbGF0ZShrZXksIGFyZ3MpIHx8IGtleVxyXG4gIH1cclxuXHJcbiAgc2V0TGFuZ3VhZ2UgKGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaTE4bi5zZXRMYW5ndWFnZShsYW5ndWFnZSlcclxuICAgIHRoaXMuY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAnc2V0dGluZ3MubGFuZ3VhZ2UnOiBsYW5ndWFnZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFkZExvY2FsZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAoIW9yaWdpbkxvY2FsZXMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdMb2NhbGVzID0gbWVyZ2Uob3JpZ2luTG9jYWxlcywgbG9jYWxlcylcclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIG5ld0xvY2FsZXMpXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgYWRkTGFuZ3VhZ2UgKGxhbmd1YWdlOiBzdHJpbmcsIGxvY2FsZXM6IElMb2NhbGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbkxvY2FsZXMgPSB0aGlzLm9iamVjdEFkYXB0ZXIuZ2V0TG9jYWxlKGxhbmd1YWdlKVxyXG4gICAgaWYgKG9yaWdpbkxvY2FsZXMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIuc2V0TG9jYWxlKGxhbmd1YWdlLCBsb2NhbGVzKVxyXG4gICAgbGFuZ3VhZ2VMaXN0W2xhbmd1YWdlXSA9IGxvY2FsZXNcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBnZXRMYW5ndWFnZUxpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYW5ndWFnZUxpc3QpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIEkxOG5NYW5hZ2VyXHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBaSF9DTiA9IHtcclxuICBVUExPQURfRkFJTEVEOiAn5LiK5Lyg5aSx6LSlJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ+ivt+ajgOafpeS9oOeahOmFjee9rumhueaYr+WQpuato+ehricsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICfor7fmo4Dmn6XkvaDnmoTphY3nva7pobnku6Xlj4rnvZHnu5wnLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAn6ZSZ6K+v56CB77yaJHtjb2Rlfe+8jOivt+aJk+W8gOa1j+iniOWZqOeymOi0tOWcsOWdgOafpeeci+ebuOWFs+WOn+WboCcsXHJcbiAgU0VSVkVSX0VSUk9SOiAn5pyN5Yqh56uv5Ye66ZSZ77yM6K+36YeN6K+VJyxcclxuICBBVVRIX0ZBSUxFRDogJ+iupOivgeWksei0pScsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ+iuvuWumlRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAn5aSH55So5LiK5Lyg5Z+f5ZCNJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICfkvovlpoIgc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICfpmL/ph4zkupFPU1MnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ+iuvuWumktleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAn6K6+5a6aS2V5U2VjcmV0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yab3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAn6IW+6K6v5LqRQ09TJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDT1PniYjmnKwnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICforr7lrppTZWNyZXRJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVk6ICforr7lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICforr7lrppBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICfkvovlpoLvvJoxMjM0NTY3ODkwJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mmFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZU1vZ3IyJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+iuvuWumlRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICforr7lrprku5PlupPlkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICforr7lrprliIbmlK/lkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ+agvOW8j++8mnVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICfkvovlpoLvvJptYWluJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAn5LiD54mb5LqRJyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAn6K6+5a6aQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAn6K6+5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1FJTklVX1VSTDogJ+iuvuWumuiuv+mXrue9keWdgCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJp6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG5cclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICforr7lrppDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAn6K6+5a6a5Luj55CGJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICforr7lrprmk43kvZzlkZgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+iuvuWumuaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICforr7lrprliqDpgJ/ln5/lkI0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8miFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG5cclxuICAvLyB3ZWJkYXZwbGlzdFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICforr7lrprmjqXlj6PnvZHlnYAnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn5ZCv55SoU1NMJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRDogJ+iuvuWumuWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1Q6ICfkvovlpoLvvJpodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ+mcgOimgUhUVFBT5pe25ZCv55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gUGx1Z2luIEhhbmRsZXJcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25a6J6KOF5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7blronoo4XlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7blronoo4XlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogJ+aPkuS7tuWuieijheWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjeaIluWQiOazleWuieijhei3r+W+hCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25Y246L295oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWNuOi9veWksei0pScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25Y246L295aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICfmj5Lku7bljbjovb3lpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ+aPkuS7tuabtOaWsOaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICfmj5Lku7bmm7TmlrDlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuabtOaWsOWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25pu05paw5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJTG9jYWxlc0tleSA9IGtleW9mIHR5cGVvZiBaSF9DTlxyXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxyXG4iLCJpbXBvcnQgeyBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX1RXOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAn5LiK5YKz5aSx5pWXJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ+iri+aqouafpeS9oOeahOioreWumuaYr+WQpuato+eiuicsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICfoq4vmqqLmn6XkvaDnmoToqK3lrprlj4rntrLot68nLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAn6Yyv6Kqk56K877yaJHtjb2Rlfe+8jOiri+aJk+mWi+eAj+imveWZqOiyvOS4iuWcsOWdgOafpeeci+ebuOmXnOWOn+WboCcsXHJcbiAgU0VSVkVSX0VSUk9SOiAn5Ly65pyN5Zmo5Ye66Yyv77yM6KuL6YeN6KmmJyxcclxuICBBVVRIX0ZBSUxFRDogJ+iqjeitieWkseaVlycsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAn5YKZ55So5LiK5YKz57ay5Z2AJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICfkvovlpoIgc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICfpmL/ph4zkupFPU1MnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ+ioreWumktleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAn6Kit5a6aS2V5U2VjcmV0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yab3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAn6aiw6KiK5LqRQ09TJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDT1PniYjmnKwnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICfoqK3lrppTZWNyZXRJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVk6ICfoqK3lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICfoqK3lrppBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICfkvovlpoLvvJoxMjM0NTY3ODkwJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mmFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZU1vZ3IyJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICfoqK3lrprlgInluqvlkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICfoqK3lrprliIbmlK/lkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ+agvOW8j++8mnVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICfkvovlpoLvvJptYWluJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAn5LiD54mb5LqRJyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAn6Kit5a6aQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAn6Kit5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1FJTklVX1VSTDogJ+ioreWumuioquWVj+e2suWdgCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJp6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG5cclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICfoqK3lrppDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAn6Kit5a6aUFJPWFknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAn5L6L5aaC77yaaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICflj4jmi43kupEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ+ioreWumuaTjeS9nOWToScsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAn6Kit5a6a5pON5L2c5ZOh5a+G56K8JyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ+ioreWumuWKoOmAn+e2suWdgCcsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAn6Ly45YWl5pON5L2c5ZOh5a+G56K8JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdlxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICfoqK3lrppBUEnkuLvmqZ8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPmmYLllZ/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ+ioreWumueUqOaItuWQjScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAn6Kit5a6a5a+G56K8JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mmh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPmmYLllZ/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAn6Ly45YWl55So5oi25a+G56K8JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7blronoo53miJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWuieijneWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWuieijneWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAn5o+S5Lu25a6J6KOd5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ix5oiW5q2j56K655qE5a6J6KOd6Lev5b6RJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7bljbjovInmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAn5o+S5Lu25Y246LyJ5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bljbjovInlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuWNuOi8ieWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAn5o+S5Lu25pu05paw5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ+aPkuS7tuabtOaWsOWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAn5o+S5Lu25pu05paw5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLEnXHJcbn1cclxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBFTjogSUxvY2FsZXMgPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ1VwbG9hZCBmYWlsZWQnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MnLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MgYW5kIG5ldHdvcmsnLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAnRXJyb3IgY29kZTogJHtjb2RlfSwgcGxlYXNlIG9wZW4gdGhlIGJyb3dzZXIgYW5kIHBhc3RlIHRoZSBhZGRyZXNzIHRvIHNlZSB0aGUgcmVhc29uJyxcclxuICBTRVJWRVJfRVJST1I6ICdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInLFxyXG4gIEFVVEhfRkFJTEVEOiAnQXV0aGVudGljYXRpb24gZmFpbGVkJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAnU2V0IEJhY2t1cCBVcGxvYWQgRG9tYWluJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICdFeC4gc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICdBbGkgQ2xvdWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ1NldCBLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ1NldCBLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gb3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAnVGVuY2VudCBDbG91ZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ2hvb3NlIENPUyB2ZXJzaW9uJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAnU2V0IFNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICdTZXQgQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAnRXguIDEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAnRXguIGFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHA6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICdTZXQgUmVwbyBOYW1lJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICdTZXQgQnJhbmNoJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ0V4LiB1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAnRXguIG1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ1Fpbml1JyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAnU2V0IEFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAnU2V0IFVSTCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ0V4LiB6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICdFeC4gaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ1NldCBDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAnU2V0IFByb3h5JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ0V4LiBodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ1VweXVuJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAnU2V0IE9wZXJhdG9yJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICdTZXQgT3BlcmF0b3IgUGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ0V4LiBtZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICdQbGVhc2UgdHlwZSB0aGUgb3BlcmF0b3IgcGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ0V4LiBodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAnRXguICFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuXHJcbiAgLy8gd2ViZGF2XHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUOiAnV2ViREFWJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfSE9TVDogJ1NldCBIb3N0JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfU1NMRU5BQkxFRDogJ0VuYWJsZSBIVFRQUycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FOiAnU2V0IFVzZXJuYW1lJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQ6ICdTZXQgUGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ0V4LiBodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ0VuYWJsZSBIVFRQUycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUU6ICdFeC4gbWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAnUGxlYXNlIHR5cGUgdGhlIHBhc3N3b3JkJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUgb3IgdmFsaWQgaW5zdGFsbGF0aW9uIHBhdGgnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiB1bmluc3RhbGxlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ1BsdWdpbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSdcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xyXG5pbXBvcnQgQ29tbWFuZGVyIGZyb20gJy4uL2xpYi9Db21tYW5kZXInXHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xpYi9Mb2dnZXInXHJcbmltcG9ydCBMaWZlY3ljbGUgZnJvbSAnLi9MaWZlY3ljbGUnXHJcbmltcG9ydCBMaWZlY3ljbGVQbHVnaW5zLCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi4vbGliL0xpZmVjeWNsZVBsdWdpbnMnXHJcbmltcG9ydCB1cGxvYWRlcnMgZnJvbSAnLi4vcGx1Z2lucy91cGxvYWRlcidcclxuaW1wb3J0IHRyYW5zZm9ybWVycyBmcm9tICcuLi9wbHVnaW5zL3RyYW5zZm9ybWVyJ1xyXG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4uL2xpYi9QbHVnaW5Mb2FkZXInXHJcbmltcG9ydCB7IGdldCwgc2V0LCB1bnNldCB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgSUhlbHBlciwgSUltZ0luZm8sIElDb25maWcsIElQaWNHbywgSVN0cmluZ0tleU1hcCwgSVBsdWdpbkxvYWRlciwgSUkxOG5NYW5hZ2VyLCBJUGljR29QbHVnaW4sIElQaWNHb1BsdWdpbkludGVyZmFjZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGdldENsaXBib2FyZEltYWdlIGZyb20gJy4uL3V0aWxzL2dldENsaXBib2FyZEltYWdlJ1xyXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9saWIvUmVxdWVzdCdcclxuaW1wb3J0IERCIGZyb20gJy4uL3V0aWxzL2RiJ1xyXG5pbXBvcnQgUGx1Z2luSGFuZGxlciBmcm9tICcuLi9saWIvUGx1Z2luSGFuZGxlcidcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCwgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgaXNDb25maWdLZXlJbkJsYWNrTGlzdCwgaXNJbnB1dENvbmZpZ1ZhbGlkIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJMThuTWFuYWdlciB9IGZyb20gJy4uL2kxOG4nXHJcblxyXG5leHBvcnQgY2xhc3MgUGljR28gZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBJUGljR28ge1xyXG4gIHByaXZhdGUgX2NvbmZpZyE6IElDb25maWdcclxuICBwcml2YXRlIGxpZmVjeWNsZSE6IExpZmVjeWNsZVxyXG4gIHByaXZhdGUgZGIhOiBEQlxyXG4gIHByaXZhdGUgX3BsdWdpbkxvYWRlciE6IFBsdWdpbkxvYWRlclxyXG4gIGNvbmZpZ1BhdGg6IHN0cmluZ1xyXG4gIGJhc2VEaXIhOiBzdHJpbmdcclxuICBoZWxwZXIhOiBJSGVscGVyXHJcbiAgbG9nOiBMb2dnZXJcclxuICBjbWQ6IENvbW1hbmRlclxyXG4gIG91dHB1dDogSUltZ0luZm9bXVxyXG4gIGlucHV0OiBhbnlbXVxyXG4gIHBsdWdpbkhhbmRsZXI6IFBsdWdpbkhhbmRsZXJcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjEuNS4wK1xyXG4gICAqXHJcbiAgICogdXNlIHJlcXVlc3QgaW5zdGVhZFxyXG4gICAqL1xyXG4gIFJlcXVlc3QhOiBSZXF1ZXN0XHJcbiAgaTE4biE6IElJMThuTWFuYWdlclxyXG4gIFZFUlNJT046IHN0cmluZyA9IHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT05cclxuICBHVUlfVkVSU0lPTj86IHN0cmluZ1xyXG5cclxuICBnZXQgcGx1Z2luTG9hZGVyICgpOiBJUGx1Z2luTG9hZGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wbHVnaW5Mb2FkZXJcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yIChjb25maWdQYXRoOiBzdHJpbmcgPSAnJykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jb25maWdQYXRoID0gY29uZmlnUGF0aFxyXG4gICAgdGhpcy5vdXRwdXQgPSBbXVxyXG4gICAgdGhpcy5pbnB1dCA9IFtdXHJcbiAgICB0aGlzLmhlbHBlciA9IHtcclxuICAgICAgdHJhbnNmb3JtZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCd0cmFuc2Zvcm1lcicpLFxyXG4gICAgICB1cGxvYWRlcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ3VwbG9hZGVyJyksXHJcbiAgICAgIGJlZm9yZVRyYW5zZm9ybVBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zJyksXHJcbiAgICAgIGJlZm9yZVVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVVcGxvYWRQbHVnaW5zJyksXHJcbiAgICAgIGFmdGVyVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2FmdGVyVXBsb2FkUGx1Z2lucycpXHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXRDb25maWdQYXRoKClcclxuICAgIHRoaXMubG9nID0gbmV3IExvZ2dlcih0aGlzKVxyXG4gICAgdGhpcy5jbWQgPSBuZXcgQ29tbWFuZGVyKHRoaXMpXHJcbiAgICB0aGlzLnBsdWdpbkhhbmRsZXIgPSBuZXcgUGx1Z2luSGFuZGxlcih0aGlzKVxyXG4gICAgdGhpcy5pbml0Q29uZmlnKClcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb25maWdQYXRoICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnUGF0aCA9IGhvbWVkaXIoKSArICcvLnBpY2xpc3QvY29uZmlnLmpzb24nXHJcbiAgICB9XHJcbiAgICBpZiAocGF0aC5leHRuYW1lKHRoaXMuY29uZmlnUGF0aCkudG9VcHBlckNhc2UoKSAhPT0gJy5KU09OJykge1xyXG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSAnJ1xyXG4gICAgICB0aHJvdyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvbmx5IHN1cHBvcnRzIEpTT04gZm9ybWF0LicpXHJcbiAgICB9XHJcbiAgICB0aGlzLmJhc2VEaXIgPSBwYXRoLmRpcm5hbWUodGhpcy5jb25maWdQYXRoKVxyXG4gICAgY29uc3QgZXhpc3QgPSBmcy5wYXRoRXhpc3RzU3luYyh0aGlzLmNvbmZpZ1BhdGgpXHJcbiAgICBpZiAoIWV4aXN0KSB7XHJcbiAgICAgIGZzLmVuc3VyZUZpbGVTeW5jKGAke3RoaXMuY29uZmlnUGF0aH1gKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlnICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGIgPSBuZXcgREIodGhpcylcclxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuZGIucmVhZCh0cnVlKSBhcyBJQ29uZmlnXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaW5pdCAxOG4gYXQgZmlyc3RcclxuICAgICAgdGhpcy5pMThuID0gbmV3IEkxOG5NYW5hZ2VyKHRoaXMpXHJcbiAgICAgIHRoaXMuUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHRoaXMpXHJcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlciA9IG5ldyBQbHVnaW5Mb2FkZXIodGhpcylcclxuICAgICAgLy8gbG9hZCBzZWxmIHBsdWdpbnNcclxuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoJ3BpY2dvJylcclxuICAgICAgdXBsb2FkZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXHJcbiAgICAgIHRyYW5zZm9ybWVycyh0aGlzKS5yZWdpc3Rlcih0aGlzKVxyXG4gICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZSgnJylcclxuICAgICAgLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXHJcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgdGhpcy5saWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlKHRoaXMpXHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcclxuICAgICAgdGhpcy5sb2cuZXJyb3IoZSlcclxuICAgICAgdGhyb3cgZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZWFzaWx5IG1hbm51YWxseSBsb2FkIGEgcGx1Z2luXHJcbiAgICogaWYgcHJvdmlkZSBwbHVnaW4gbmFtZSwgd2lsbCByZWdpc3RlciBwbHVnaW4gYnkgbmFtZVxyXG4gICAqIG9yIGp1c3QgaW5zdGFudGlhdGUgYSBwbHVnaW5cclxuICAgKi9cclxuICB1c2UgKHBsdWdpbjogSVBpY0dvUGx1Z2luLCBuYW1lPzogc3RyaW5nKTogSVBpY0dvUGx1Z2luSW50ZXJmYWNlIHtcclxuICAgIGlmIChuYW1lKSB7XHJcbiAgICAgIHRoaXMucGx1Z2luTG9hZGVyLnJlZ2lzdGVyUGx1Z2luKG5hbWUsIHBsdWdpbilcclxuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSFcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGx1Z2luKHRoaXMpXHJcbiAgICAgIHJldHVybiBwbHVnaW5JbnN0YW5jZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJDb21tYW5kcyAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoICE9PSAnJykge1xyXG4gICAgICB0aGlzLmNtZC5pbml0KClcclxuICAgICAgdGhpcy5jbWQubG9hZENvbW1hbmRzKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbmZpZzxUPiAobmFtZT86IHN0cmluZyk6IFQge1xyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jb25maWcgYXMgdW5rbm93biBhcyBUXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZ2V0KHRoaXMuX2NvbmZpZywgbmFtZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDb25maWcgKGNvbmZpZzogSVN0cmluZ0tleU1hcDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoIWlzSW5wdXRDb25maWdWYWxpZChjb25maWcpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oJ3RoZSBmb3JtYXQgb2YgY29uZmlnIGlzIGludmFsaWQsIHBsZWFzZSBwcm92aWRlIG9iamVjdCcpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRDb25maWcoY29uZmlnKVxyXG4gICAgdGhpcy5kYi5zYXZlQ29uZmlnKGNvbmZpZylcclxuICB9XHJcblxyXG4gIHJlbW92ZUNvbmZpZyAoa2V5OiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXHJcbiAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChrZXkpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtrZXl9IGNhbid0IGJlIHJlbW92ZWRgKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMudW5zZXRDb25maWcoa2V5LCBwcm9wTmFtZSlcclxuICAgIHRoaXMuZGIudW5zZXQoa2V5LCBwcm9wTmFtZSlcclxuICB9XHJcblxyXG4gIHNldENvbmZpZyAoY29uZmlnOiBJU3RyaW5nS2V5TWFwPGFueT4pOiB2b2lkIHtcclxuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcclxuICAgICAgdGhpcy5sb2cud2FybigndGhlIGZvcm1hdCBvZiBjb25maWcgaXMgaW52YWxpZCwgcGxlYXNlIHByb3ZpZGUgb2JqZWN0JylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChuYW1lKSkge1xyXG4gICAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtuYW1lfSBjYW4ndCBiZSBtb2RpZmllZGApXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxyXG4gICAgICAgIGRlbGV0ZSBjb25maWdbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICBzZXQodGhpcy5fY29uZmlnLCBuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICAgIGV2ZW50QnVzLmVtaXQoSUJ1c0V2ZW50LkNPTkZJR19DSEFOR0UsIHtcclxuICAgICAgICBjb25maWdOYW1lOiBuYW1lLFxyXG4gICAgICAgIHZhbHVlOiBjb25maWdbbmFtZV1cclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB1bnNldENvbmZpZyAoa2V5OiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXHJcbiAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChrZXkpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtrZXl9IGNhbid0IGJlIHVuc2V0YClcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB1bnNldCh0aGlzLmdldENvbmZpZyhrZXkpLCBwcm9wTmFtZSlcclxuICB9XHJcblxyXG4gIGdldCByZXF1ZXN0ICgpOiBJUmVxdWVzdFsncmVxdWVzdCddIHtcclxuICAgIHJldHVybiB0aGlzLlJlcXVlc3QucmVxdWVzdC5iaW5kKHRoaXMuUmVxdWVzdClcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZCAoaW5wdXQ/OiBhbnlbXSk6IFByb21pc2U8SUltZ0luZm9bXSB8IEVycm9yPiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSAnJykge1xyXG4gICAgICB0aGlzLmxvZy5lcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvbmx5IHN1cHBvcnRzIEpTT04gZm9ybWF0LicpXHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgLy8gdXBsb2FkIGZyb20gY2xpcGJvYXJkXHJcbiAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCB8fCBpbnB1dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB7IGltZ1BhdGgsIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyB9ID0gYXdhaXQgZ2V0Q2xpcGJvYXJkSW1hZ2UodGhpcylcclxuICAgICAgICBpZiAoaW1nUGF0aCA9PT0gJ25vIGltYWdlJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbWFnZSBub3QgZm91bmQgaW4gY2xpcGJvYXJkJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vbmNlKElCdWlsZEluRXZlbnQuRkFJTEVELCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgLy8g5Yig6ZmkIHBpY2dvIOeUn+aIkOeahOWbvueJh+aWh+S7tu+8jOS+i+WmgiBgfi8ucGljZ28vMjAyMDA2MjEyMDU3MjAucG5nYFxyXG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4geyB0aGlzLmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5vbmNlKCdmaW5pc2hlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICBmcy5yZW1vdmUoaW1nUGF0aCkuY2F0Y2goKGUpID0+IHsgdGhpcy5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCB0aGlzLmxpZmVjeWNsZS5zdGFydChbaW1nUGF0aF0pXHJcbiAgICAgICAgICByZXR1cm4gb3V0cHV0XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdXBsb2FkIGZyb20gcGF0aFxyXG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoaW5wdXQpXHJcbiAgICAgIHJldHVybiBvdXRwdXRcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IEltZ0Zyb21QYXRoIGZyb20gJy4vcGF0aCdcclxuaW1wb3J0IEltZ0Zyb21CYXNlNjQgZnJvbSAnLi9iYXNlNjQnXHJcblxyXG5jb25zdCBidWlsZEluVHJhbnNmb3JtZXJzOiBJUGljR29QbHVnaW4gPSAoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlZ2lzdGVyIChjdHg6IElQaWNHbykge1xyXG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKCdwYXRoJywgSW1nRnJvbVBhdGgpXHJcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoJ2Jhc2U2NCcsIEltZ0Zyb21CYXNlNjQpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBidWlsZEluVHJhbnNmb3JtZXJzXHJcbiJdLCJuYW1lcyI6WyJwbHVnaW5IYW5kbGVyIiwiaGFuZGxlIiwiY3R4IiwiY21kIiwicHJvZ3JhbSIsImNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwib3B0aW9uIiwiYWN0aW9uIiwicGx1Z2lucyIsInByb3h5IiwicmVnaXN0cnkiLCJvcHRpb25zIiwiaW5zdGFsbCIsImNhdGNoIiwiZSIsImxvZyIsImVycm9yIiwidW5pbnN0YWxsIiwidXBkYXRlIiwiY29uZmlnIiwiaXNVcmwiLCJ1cmwiLCJzdGFydHNXaXRoIiwiaGFuZGxlVXJsRW5jb2RlIiwiZGVjb2RlVVJJIiwiaXNVcmxFbmNvZGUiLCJlbmNvZGVVUkkiLCJnZXRJbWFnZVNpemUiLCJmaWxlIiwid2lkdGgiLCJoZWlnaHQiLCJpbWFnZVNpemUiLCJyZWFsIiwiZ2V0UGx1Z2luTmFtZVR5cGUiLCJuYW1lIiwidGVzdCIsImlzU2ltcGxlTmFtZSIsIm5hbWVPclBhdGgiLCJwYXRoIiwiaXNBYnNvbHV0ZSIsInBsdWdpblBhdGgiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsImZzIiwiZXhpc3RzU3luYyIsImluY2x1ZGVzIiwiaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lIiwic2NvcGUiLCJoYW5kbGVVbml4U3R5bGVQYXRoIiwicGF0aFN0ciIsInNwbGl0Iiwic2VwIiwicmVtb3ZlUGx1Z2luVmVyc2lvbiIsInJlZyIsIm1hdGNoQXJyIiwibWF0Y2giLCJjb25zb2xlIiwid2FybiIsImNvbmZpZ0JsYWNrTGlzdCIsImlzQ29uZmlnS2V5SW5CbGFja0xpc3QiLCJrZXkiLCJzb21lIiwiYmxhY2tJdGVtIiwiaXNJbnB1dENvbmZpZ1ZhbGlkIiwiQXJyYXkiLCJpc0FycmF5IiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInVwbG9hZCIsImFyZ3VtZW50cyIsImlucHV0IiwiaW5wdXRMaXN0IiwibWFwIiwiaXRlbSIsInJlc29sdmUiLCJmaWx0ZXIiLCJleGlzdCIsImhhbmRsZUNvbmZpZyIsImFzeW5jIiwicHJvbXB0cyIsIm1vZHVsZSIsImFuc3dlciIsImlucXVpcmVyIiwicHJvbXB0IiwiY29uZmlnTmFtZSIsInNhdmVDb25maWciLCJzZXR0aW5nIiwiaGVscGVyIiwiZ2V0IiwidHlwZSIsImNob2ljZXMiLCJnZXRJZExpc3QiLCJtZXNzYWdlIiwiZ2V0Q29uZmlnIiwicGx1Z2luTG9hZGVyIiwiZ2V0UGx1Z2luIiwiZ2V0RnVsbExpc3QiLCJwbHVnaW4iLCJ1c2VNb2R1bGVOYW1lIiwic3VjY2VzcyIsImluZm8iLCJhcmd2IiwidXNlIiwidXBsb2FkZXIiLCJkZWZhdWx0IiwidHJhbnNmb3JtZXIiLCJwdXNoIiwicGljZ29QbHVnaW5zIiwic2V0Q29uZmlnIiwiZ2VuZXJhdGUiLCJvcHRzIiwiZ2V0T3B0aW9ucyIsInRtcCIsInNvdXJjZSIsImFuc3dlcnMiLCJfZmlsZXMiLCJnbG9iYnkiLCJkb3QiLCJnbG9iIiwiZmlsdGVycyIsImZvckVhY2giLCJmaWxlcyIsInJlbmRlciIsIndyaXRlRmlsZVRyZWUiLCJkZXN0IiwiY29tcGxldGUiLCJjb21wbGV0ZU1lc3NhZ2UiLCJleHAiLCJkYXRhIiwiZm4iLCJGdW5jdGlvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0ZW1wbGF0ZVBhdGgiLCJvcHRpb25zUGF0aCIsInJlcXVpcmUiLCJmaWxlVHJlZSIsImZpbGVQYXRoIiwicmVhZEZpbGVTeW5jIiwiY29udGVudCIsImVqcyIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZGlyIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwicnVuIiwib2ZmbGluZSIsInRlbXBsYXRlIiwiaGFzU2xhc2giLCJkb3dubG9hZEFuZEdlbmVyYXRlIiwicm0iLCJzeW5jIiwiZG93bmxvYWQiLCJjbG9uZSIsImVyciIsImluaXQiLCJwcm9qZWN0IiwiaW5QbGFjZSIsImhvbWVkaXIiLCJyZXBsYWNlIiwidGhlbiIsIm9rIiwib24iLCJjaGFsayIsImdyYXkiLCJpMThuIiwibGFuZyIsImxpc3QiLCJnZXRMYW5ndWFnZUxpc3QiLCJzZXRMYW5ndWFnZSIsIkxpZmVjeWNsZVBsdWdpbnMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJNYXAiLCJwbHVnaW5JZE1hcCIsInJlZ2lzdGVyIiwiaWQiLCJUeXBlRXJyb3IiLCJoYXMiLCJzZXQiLCJjdXJyZW50UGx1Z2luIiwidW5yZWdpc3RlciIsInBsdWdpbk5hbWUiLCJwbHVnaW5MaXN0IiwiZGVsZXRlIiwiZ2V0TmFtZSIsImdldExpc3QiLCJ2YWx1ZXMiLCJzZXRDdXJyZW50UGx1Z2luTmFtZSIsIkNvbW1hbmRlciIsIkNvbW1hbmQiLCJ2ZXJzaW9uIiwiZGVidWciLCJzaWxlbnQiLCJhcmdzIiwiZXhpdCIsImN1cnJlbnRQbHVnaW5OYW1lIiwibG9hZENvbW1hbmRzIiwiSUxvZ1R5cGUiLCJJQnVpbGRJbkV2ZW50IiwiSUJ1c0V2ZW50IiwiTG9nZ2VyIiwiaGFuZGxlTG9nIiwibXNnIiwibG9nSGVhZGVyIiwibGV2ZWwiLCJ0b1VwcGVyQ2FzZSIsImxvZ0xldmVsIiwibG9nUGF0aCIsImJhc2VEaXIiLCJzZXRUaW1lb3V0IiwicmVzdWx0IiwiY2hlY2tMb2dGaWxlSXNMYXJnZSIsImlzTGFyZ2UiLCJ3YXJuaW5nTXNnIiwieWVsbG93IiwicmVjcmVhdGVMb2dGaWxlIiwidW5zaGlmdCIsImhhbmRsZVdyaXRlTG9nIiwibG9nRmlsZVNpemUiLCJzdGF0U3luYyIsInNpemUiLCJsb2dGaWxlU2l6ZUxpbWl0IiwibnVtIiwiaXNOYU4iLCJOdW1iZXIiLCJmb3JjZU51bWJlciIsInVubGlua1N5bmMiLCJjcmVhdGVGaWxlU3luYyIsImNoZWNrTG9nTGV2ZWwiLCJkYXlqcyIsImZvcm1hdCIsIkVycm9yIiwidXRpbCIsInN0YWNrIiwiYXBwZW5kRmlsZVN5bmMiLCJ1bmRlZmluZWQiLCJlbnYiLCJOT0RFX0VOViIsIkxpZmVjeWNsZSIsIkV2ZW50RW1pdHRlciIsInN1cGVyIiwiY29uZmlnUGF0aCIsIm91dHB1dCIsIlJlcXVlc3QiLCJWRVJTSU9OIiwiR1VJX1ZFUlNJT04iLCJyZXF1ZXN0IiwiYmluZCIsInJlbW92ZUNvbmZpZyIsInVuc2V0Q29uZmlnIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwicmVtb3ZlTGlzdGVuZXIiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJyYXdMaXN0ZW5lcnMiLCJlbWl0IiwibGlzdGVuZXJDb3VudCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJldmVudE5hbWVzIiwiY3JlYXRlQ29udGV4dCIsImJlZm9yZVRyYW5zZm9ybSIsImRvVHJhbnNmb3JtIiwiYmVmb3JlVXBsb2FkIiwiZG9VcGxvYWQiLCJhZnRlclVwbG9hZCIsIkZBSUxFRCIsIlVQTE9BRF9QUk9HUkVTUyIsIkJFRk9SRV9UUkFOU0ZPUk0iLCJoYW5kbGVQbHVnaW5zIiwiYmVmb3JlVHJhbnNmb3JtUGx1Z2lucyIsImN1cnJlbnRUcmFuc2Zvcm1lciIsIkJFRk9SRV9VUExPQUQiLCJiZWZvcmVVcGxvYWRQbHVnaW5zIiwib3V0cHV0SW1nIiwiQUZURVJfVVBMT0FEIiwiYWZ0ZXJVcGxvYWRQbHVnaW5zIiwiaSIsImltZ1VybCIsImJhc2U2NEltYWdlIiwiYnVmZmVyIiwiRklOSVNIRUQiLCJsaWZlQ3ljbGVQbHVnaW5zIiwicGx1Z2luTmFtZXMiLCJsaWZlQ3ljbGVOYW1lIiwiUHJvbWlzZSIsImFsbCIsImluZGV4IiwicG9zdE9wdGlvbnMiLCJmaWxlTmFtZSIsImltYWdlIiwiYXBpVG9rZW4iLCJiYWNrdXBEb21haW4iLCJtZXRob2QiLCJoZWFkZXJzIiwiY29udGVudFR5cGUiLCJBdXRob3JpemF0aW9uIiwiZm9ybURhdGEiLCJzbWZpbGUiLCJ2YWx1ZSIsImZpbGVuYW1lIiwic3NsIiwic21tc0NvbmZpZyIsImltZ0xpc3QiLCJpbWciLCJmcm9tIiwicG9zdENvbmZpZyIsInRva2VuIiwicmVzIiwiYm9keSIsInBhcnNlIiwiY29kZSIsImhhc2giLCJpbWFnZXMiLCJOT1RJRklDQVRJT04iLCJ0aXRsZSIsInRyYW5zbGF0ZSIsInVzZXJDb25maWciLCJyZXF1aXJlZCIsInByZWZpeCIsImdlbmVyYXRlU2lnbmF0dXJlIiwic2VjcmV0SWQiLCJzZWNyZXRLZXkiLCJhcHBJZCIsImJ1Y2tldCIsInNpZ25hdHVyZSIsInNpZ25UaW1lIiwidG9kYXkiLCJNYXRoIiwiZmxvb3IiLCJEYXRlIiwiZ2V0VGltZSIsInNpZ25LZXkiLCJjcnlwdG8iLCJjcmVhdGVIbWFjIiwiZGlnZXN0IiwiaHR0cFN0cmluZyIsImFyZWEiLCJzdHJpbmdUb1NpZ24iLCJjcmVhdGVIYXNoIiwicmFuZG9tIiwiY3VycmVudCIsIm11bHRpU2lnbmF0dXJlIiwic2lnbkhleEtleSIsInRlbXBTdHJpbmciLCJjb25jYXQiLCJ0b1N0cmluZyIsImVuY29kZVVSSUNvbXBvbmVudCIsIkhvc3QiLCJtaW1lIiwibG9va3VwIiwidXNlckFnZW50IiwicmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UiLCJvcCIsImZpbGVjb250ZW50IiwidGNZdW5PcHRpb25zIiwiY3VzdG9tVXJsIiwidXNlVjQiLCJzdGF0dXNDb2RlIiwib3B0aW9uVXJsIiwic291cmNlX3VybCIsInRleHQiLCJyZXBvIiwianNvbiIsImdpdGh1Yk9wdGlvbnMiLCJicmFuY2giLCJkb3dubG9hZF91cmwiLCJzaGEiLCJpbWdCYXNlNjQiLCJzZWxlY3RBcmVhIiwiZ2V0VG9rZW4iLCJxaW5pdU9wdGlvbnMiLCJhY2Nlc3NLZXkiLCJtYWMiLCJxaW5pdSIsImF1dGgiLCJNYWMiLCJycyIsIlB1dFBvbGljeSIsInVwbG9hZFRva2VuIiwiYmFzZVVybCIsInJlc3BvbnNlIiwib2JqIiwiY2xpZW50SWQiLCJpbWd1ck9wdGlvbnMiLCJsaW5rIiwiZGVsZXRlaGFzaCIsImRhdGUiLCJ0b1VUQ1N0cmluZyIsIm1pbWVUeXBlIiwic2lnblN0cmluZyIsImFjY2Vzc0tleVNlY3JldCIsImFjY2Vzc0tleUlkIiwiYWxpWXVuT3B0aW9ucyIsIm9wZXJhdG9yIiwicGFzc3dvcmQiLCJtZDVQYXNzd29yZCIsIk1ENSIsInVweXVuT3B0aW9ucyIsInN0ciIsInNhZmVQYXJzZSIsImhvc3QiLCJ1c2VybmFtZSIsIndlYmRhdnBsaXN0T3B0aW9ucyIsInNzbEVuYWJsZWQiLCJidWlsZEluVXBsb2FkZXJzIiwiYWxpWXVuVXBsb2FkZXIiLCJ0Y1l1blVwbG9hZGVyIiwiU01NU1VwbG9hZGVyIiwiZ2l0aHViVXBsb2FkZXIiLCJxaW5pdVVwbG9hZGVyIiwiaW1ndXJVcGxvYWRlciIsInVwWXVuVXBsb2FkZXIiLCJ3ZWJkYXZwbGlzdFVwbG9hZGVyIiwiZ2V0SW1nU2l6ZSIsInJlc3VsdHMiLCJ0aW1lb3V0SWQiLCJpc0ltYWdlIiwiZXh0bmFtZSIsInJlcXVlc3RGbiIsInJlamVjdCIsInJlc3BvbnNlVHlwZSIsInJlc3AiLCJTdHJpbmciLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJiYXNlbmFtZSIsInJlYXNvbiIsInRpbWVvdXRQcm9taXNlIiwicmFjZSIsImdldFVSTEZpbGUiLCJyZWFkRmlsZSIsImdldEZTRmlsZSIsImltZ1NpemUiLCJQbHVnaW5Mb2FkZXIiLCJTZXQiLCJwYWNrYWdlUGF0aCIsInBrZyIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwicmVhZEpTT05TeW5jIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJmdWxsTGlzdCIsImFkZCIsInBsdWdpbkludGVyZmFjZSIsInBsdWdpbk1hcCIsInVucmVnaXN0ZXJQbHVnaW4iLCJoYXNQbHVnaW4iLCJwbGF0Zm9ybTJTY3JpcHRDb250ZW50IiwiZGFyd2luIiwid2luMzIiLCJ3aW4xMCIsImxpbnV4Iiwid3NsIiwicGxhdGZvcm0yU2NyaXB0RmlsZW5hbWUiLCJnZXRDbGlwYm9hcmRJbWFnZSIsImltYWdlUGF0aCIsIm1rZGlyU3luYyIsImNyZWF0ZUltYWdlRm9sZGVyIiwicGxhdGZvcm0iLCJpc1dzbCIsIm9zIiwicmVsZWFzZSIsImdldEN1cnJlbnRQbGF0Zm9ybSIsInNjcmlwdFBhdGgiLCJleGVjdXRpb24iLCJzcGF3biIsInN0ZG91dCIsInRyaW0iLCJpbWdQYXRoIiwic2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIiwiZXZlbnRCdXMiLCJodHRwc0FnZW50IiwiaHR0cHMiLCJBZ2VudCIsIm1heFZlcnNpb24iLCJtaW5WZXJzaW9uIiwiYXBwZW5kRm9ybURhdGEiLCJmb3JtIiwiYXBwZW5kIiwicmVzcG9uc2VJbnRlcmNlcHRvciIsInN0YXR1cyIsInJlc3BvbnNlRXJyb3JIYW5kbGVyIiwiZXJyb3JPYmoiLCJDT05GSUdfQ0hBTkdFIiwiaGFuZGxlUHJveHkiLCJwcm94eU9wdGlvbnMiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInByb3RvY29sIiwibWF4Qm9keUxlbmd0aCIsIkluZmluaXR5IiwibWF4Q29udGVudExlbmd0aCIsInR1bm5lbCIsImh0dHBzT3Zlckh0dHAiLCJpbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwiaW50ZXJjZXB0b3JzIiwib3B0IiwiX19pc09sZE9wdGlvbnMiLCJGb3JtRGF0YSIsImFzc2lnbiIsImdldEhlYWRlcnMiLCJwYXJhbXMiLCJxcyIsInJlcXVlc3RJbnRlcmNlcHRvciIsIkNvbnRlbnRUeXBlIiwiREIiLCJkYiIsIkpTT05TdG9yZSIsInJlYWQiLCJmbHVzaCIsInVuc2V0IiwiUGx1Z2luSGFuZGxlciIsImluc3RhbGxlZFBsdWdpbnMiLCJwcm9jZXNzUGx1Z2lucyIsImhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzIiwicGtnTmFtZSIsImZ1bGxOYW1lTGlzdCIsImZ1bGxOYW1lIiwicGtnTmFtZUxpc3QiLCJleGVjQ29tbWFuZCIsIndoZXJlIiwibnBtIiwicGlwZSIsInN0ZGVyciIsImxvZ2dlciIsImdldFByb2Nlc3NQbHVnaW5OYW1lIiwicGFja2FnZUpTT05QYXRoIiwicG9zaXgiLCJnZXROb3JtYWxQbHVnaW5OYW1lIiwibGFuZ3VhZ2VMaXN0IiwiVVBMT0FEX0ZBSUxFRCIsIkNIRUNLX1NFVFRJTkdTIiwiQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksiLCJVUExPQURfRkFJTEVEX1JFQVNPTiIsIlNFUlZFUl9FUlJPUiIsIkFVVEhfRkFJTEVEIiwiUElDQkVEX1NNTVMiLCJQSUNCRURfU01NU19UT0tFTiIsIlBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfQUxJQ0xPVUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQiLCJQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUIiwiUElDQkVEX0FMSUNMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9BTElDTE9VRF9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMIiwiUElDQkVEX0FMSUNMT1VEX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0dJVEhVQiIsIlBJQ0JFRF9HSVRIVUJfVE9LRU4iLCJQSUNCRURfR0lUSFVCX1JFUE8iLCJQSUNCRURfR0lUSFVCX1BBVEgiLCJQSUNCRURfR0lUSFVCX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE8iLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1FJTklVIiwiUElDQkVEX1FJTklVX0FDQ0VTU0tFWSIsIlBJQ0JFRF9RSU5JVV9TRUNSRVRLRVkiLCJQSUNCRURfUUlOSVVfQlVDS0VUIiwiUElDQkVEX1FJTklVX1BBVEgiLCJQSUNCRURfUUlOSVVfVVJMIiwiUElDQkVEX1FJTklVX09QVElPTlMiLCJQSUNCRURfUUlOSVVfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEgiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9JTUdVUiIsIlBJQ0JFRF9JTUdVUl9DTElFTlRJRCIsIlBJQ0JFRF9JTUdVUl9QUk9YWSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZIiwiUElDQkVEX1VQWVVOIiwiUElDQkVEX1VQWVVOX0JVQ0tFVCIsIlBJQ0JFRF9VUFlVTl9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9QQVRIIiwiUElDQkVEX1VQWVVOX1VSTCIsIlBJQ0JFRF9VUFlVTl9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1IiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUIiwiUElDQkVEX1dFQkRBVlBMSVNUX0hPU1QiLCJQSUNCRURfV0VCREFWUExJU1RfU1NMRU5BQkxFRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRSIsIlBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1QiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUUiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQiLCJlbiIsIkkxOG5NYW5hZ2VyIiwib2JqZWN0QWRhcHRlciIsIk9iamVjdEFkYXB0ZXIiLCJsYW5ndWFnZSIsIkkxOG4iLCJhZGFwdGVyIiwiZGVmYXVsdExhbmd1YWdlIiwibG9hZE91dHRlckkxOG4iLCJpMThuRm9sZGVyIiwiZ2V0T3V0dGVySTE4bkZvbGRlciIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsImlzRmlsZSIsImVuZHNXaXRoIiwiaTE4bkZpbGVQYXRoIiwiaTE4bkZpbGUiLCJpMThuRmlsZU9iaiIsInlhbWwiLCJwYXRoRXhpc3RzU3luYyIsImFkZExvY2FsZSIsImxvY2FsZXMiLCJvcmlnaW5Mb2NhbGVzIiwiZ2V0TG9jYWxlIiwibmV3TG9jYWxlcyIsIm1lcmdlIiwic2V0TG9jYWxlIiwiYWRkTGFuZ3VhZ2UiLCJQaWNHbyIsImluaXRDb25maWdQYXRoIiwiaW5pdENvbmZpZyIsIl9wbHVnaW5Mb2FkZXIiLCJlbnN1cmVGaWxlU3luYyIsIl9jb25maWciLCJ1cGxvYWRlcnMiLCJJbWdGcm9tUGF0aCIsIkltZ0Zyb21CYXNlNjQiLCJsaWZlY3ljbGUiLCJyZWdpc3RlckNvbW1hbmRzIiwicHJvcE5hbWUiLCJzdGFydCIsInJlbW92ZSJdLCJtYXBwaW5ncyI6InUzQkFFQSxNQUFNQSxFQUF5QixDQUM3QkMsT0FBU0MsSUFFUCxNQUFNQyxFQUFNRCxFQUFJQyxJQUNoQkEsRUFBSUMsUUFDREMsUUFBUSx3QkFDUkMsWUFBWSx3QkFDWkMsTUFBTSxPQUNOQyxPQUFPLHNCQUF1Qiw0QkFDOUJBLE9BQU8sNEJBQTZCLG9DQUNwQ0MsUUFBTyxDQUFDQyxFQUFtQk4sS0FDMUIsTUFBTU8sTUFBRUEsRUFBS0MsU0FBRUEsR0FBYVIsRUFDdEJTLEVBQVUsQ0FDZEYsTUFBQUEsRUFDQUMsU0FBQUEsR0FFRlYsRUFBSUYsY0FBY2MsUUFBUUosRUFBU0csR0FBU0UsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsU0FFN0ViLEVBQUlDLFFBQ0RDLFFBQVEsMEJBQ1JFLE1BQU0sTUFDTkQsWUFBWSwwQkFDWkcsUUFBUUMsSUFDUFIsRUFBSUYsY0FBY21CLFVBQVVULEdBQVNLLE9BQU9DLElBQVFkLEVBQUllLElBQUlDLE1BQU1GLFNBRXRFYixFQUFJQyxRQUNEQyxRQUFRLHVCQUNSQyxZQUFZLHVCQUNaRSxPQUFPLHNCQUF1Qiw0QkFDOUJBLE9BQU8sNEJBQTZCLG9DQUNwQ0MsUUFBTyxDQUFDQyxFQUFtQk4sS0FDMUIs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
|