@sidekick-coder/zenith-kit 0.0.11 → 0.0.13

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.
@@ -0,0 +1,2 @@
1
+ import{toast as e}from"vue-sonner";import t from"qs";import{get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import{defineAbility as s,subject as c}from"@casl/ability";import{createMemoryHistory as l,createRouter as u,createWebHistory as d}from"vue-router";async function f(e){try{return[null,await e()]}catch(e){return[e,null]}}f.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var p=class{static __container_entry_key=`FetchService`;async handleError(t){if(!(t.headers.get(`Content-Type`)||``).includes(`application/json`)){e.error($t(`Internal Server Error`));return}if(t.headers.get(`Content-Type`)?.includes(`json`)){let n=await t.json().catch(()=>({message:$t(`Internal Server Error`)}));n.message&&e.error(n.message)}}buildUrl(e,n){if(!n)return e;let r=t.stringify(n,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return f(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},ee=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},m=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new ee(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const h=globalThis.clientContainer||new m;globalThis.clientContainer=h;const g=h.proxy(p);function _(...e){return e.reduce((e,t)=>t(e),class{})}function v(e,...t){return t.reduce((e,t)=>t(e),e)}function y(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function b(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function x(e){return class extends e{created_at;updated_at}}function S(e){return class extends e{deleted_at=null}}_(b,x,S);var C=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await g.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},w=class extends p{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}},T=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}},te=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}};const E=h.proxy(te);import.meta.env.DEV&&(globalThis.config=E);function ne(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function D(e){let n={},r=e.split(`?`)[1];return r?t.parse(r):n}var O=class extends p{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=h.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new T({prefix:E.get(`cookie.prefix`,``)});if(h.has(`cookies`)&&a.load(h.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:ne(i.path,e),query:t.query||D(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},k=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},A=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},j=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new A,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await f(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},M=class extends j{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},N=class extends _(b){id;label;layout;to;target;group;order;icon;parent},P=class extends _(b){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=f.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},F=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>P.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new A().child({label:`acl`}),this.ability=s(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=c(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=c(t,n);return this.ability.cannot(e,r)}subject(e,t){return c(e,t)}};const I=h.proxy(F);var L=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,N.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>I.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const R=e=>{let t=E.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function z(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function B(){let e=import.meta.env.SSR,t=u({history:e?l():d(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(R),t.auto=(e,n={})=>{let r=z(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var V=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const H=h.proxy(C);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=H);const re=h.proxy(A),U=h.proxy(L),W=h.proxy(`route`),G=h.proxy(`router`),K=h.proxy(V);var q=class extends _(b,y(k)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},J=class extends v(q){},Y=class extends _(b){id;name;version;enabled},X=class extends v(Y){addPagesFolder(e,t){G.auto(e,t)}async load(){}};const Z=g;function ie(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function ae(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function oe(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),Z(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const se={pick:ie,upload:oe,toUint8Array:ae};function Q(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!H.user&&!t.includes(n.path))return e.redirect}}const ce=Q({redirect:`/auth/login`});function $(e){return()=>{if(H.user)return e.redirect}}const le=$({redirect:`/`});export{Z as $fetch,se as $file,C as AuthService,w as FetchBrowserService,O as FetchNodeService,p as FetchService,M as LifecycleService,N as MenuItemEntity,L as MenuService,J as ModuleEntity,X as PluginEntity,V as ToastService,I as acl,H as auth,ce as authGuard,z as auto,E as config,h as container,Q as createAuthGuard,$ as createGuestGuard,B as createRouter,g as fetch,le as guestGuard,re as logger,U as menu,W as route,G as router,R as setupGuard,K as toast};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiY3JlYXRlVnVlUm91dGVyIiwiTW9kdWxlIiwiQmFzZSIsIlBsdWdpbkVudGl0eSIsIkJhc2UiLCIkb3JpZ2luYWwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoQnJvd3NlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hdXRoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xvZ2dlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9tZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy90b2FzdC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9mZXRjaGVyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9maWxlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvYXV0aEd1YXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvZ3Vlc3RHdWFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3Z1ZS1zb25uZXInXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zIGV4dGVuZHMgUmVxdWVzdEluaXQge1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRmV0Y2hTZXJ2aWNlJ1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSkgeyAgICBcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgfHwgJydcblxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKCR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uaW5jbHVkZXMoJ2pzb24nKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoeyBtZXNzYWdlOiAkdCgnSW50ZXJuYWwgU2VydmVyIEVycm9yJykgfSkpXG5cbiAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0b2FzdC5lcnJvcihkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkVXJsKHVybDogc3RyaW5nLCBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHFzLnN0cmluZ2lmeShxdWVyeSwgeyBhcnJheUZvcm1hdDogJ2JyYWNrZXRzJyB9KVxuXG4gICAgICAgIHJldHVybiB1cmwgKyAnPycgKyBxdWVyeVN0cmluZ1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFJlcXVlc3RJbml0KG9wdGlvbnM6IEZldGNoT3B0aW9ucyk6IFJlcXVlc3RJbml0IHtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHsgLi4ub3B0aW9ucyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mZXRjaE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZldGNoT3B0aW9uc1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBwYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8VD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkgYXMgUHJvbWlzZTxUPlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPihfdXJsOiBzdHJpbmcsIF9vcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cnk8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cnlDYXRjaCgoKSA9PiB0aGlzLmZldGNoPFQ+KHVybCwgb3B0aW9ucykpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcG9zdDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHB1dDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMFxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufSIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IG9iamVjdD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5cbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPEVudHJ5S2V5LCBhbnk+KClcblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtTdHJpbmcoa2V5KV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KHBheWxvYWQ6IEVudHJ5S2V5KTogRW50cnlLZXkge1xuICAgICAgICBsZXQga2V5ID0gcGF5bG9hZFxuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGtleSA9IHBheWxvYWQubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IHR5cGVvZiBwYXlsb2FkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N5bWJvbCdcblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAhKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGtleSA9IChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwYXlsb2FkOiBFbnRyeUtleSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHBheWxvYWQ6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFbnRyeSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kIGluIGNvbnRhaW5lci5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNsYXNzQ29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGFzc0NvbnN0cnVjdG9yKClcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIG5ld0luc3RhbmNlKVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChlbnRyaWVzOiBSZWNvcmQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHk8VCA9IHVua25vd24+KGtleTogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3Byb3BdXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGVudHJ5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVtwcm9wXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKF90YXJnZXQsIHByb3AsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZW50cnlbcHJvcF0gPSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IEVudHJ5S2V5W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMua2V5cygpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcblxuY29uc3QgY29udGFpbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jbGllbnRDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuXG5nbG9iYWxUaGlzLmNsaWVudENvbnRhaW5lciA9IGNvbnRhaW5lclxuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXIgYXMgQ29udGFpbmVyU2VydmljZVxuIiwiaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0ICRmZXRjaCA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgJGZldGNoXG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGltZXN0YW1wTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgICAgIHB1YmxpYyB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU29mdERlbGV0ZU1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2UoKVxuXG4gICAgICAgIHJldHVybiBhICsgYlxuICAgIH1cbn1cbiIsImltcG9ydCAkZmV0Y2ggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2ZldGNoLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBjb25maWcgPSBjb250YWluZXIucHJveHk8Q29uZmlnU2VydmljZT4oQ29uZmlnU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBnbG9iYWxUaGlzLmNvbmZpZyA9IGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBxcyBmcm9tICdxcycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFBhcmFtcyhyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcmVxdWVzdFNlZ21lbnRzW2ldXG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcmVxdWVzdFNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbGwgcmVtYWluaW5nIHNlZ21lbnRzIGFzIGEgc2luZ2xlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMV1cblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG4vLyBpbXBvcnQgdHlwZSBSb3V0ZXJTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCBDb2traWVNYXBFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBwYXJzZVVybFBhcmFtcywgcGFyc2VVcmxRdWVyeSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hOb2RlU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBpc0ludGVybmFsID0gIXVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpXG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEV4dGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoSW50ZXJuYWw8VD4odXJsLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEV4dGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoSW50ZXJuYWw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9ICBjb250YWluZXIuZ2V0PGFueT4oJ1JvdXRlclNlcnZpY2UnKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJ1xuICAgICAgICBjb25zdCByb3V0ZSA9IHJvdXRlci5yZXNvbHZlKG1ldGhvZCwgdXJsKVxuICAgICAgICBjb25zdCBjb29raWUgPSBuZXcgQ29ra2llTWFwRW50aXR5KHtcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5lci5oYXMoJ2Nvb2tpZXMnKSkge1xuICAgICAgICAgICAgY29va2llLmxvYWQoY29udGFpbmVyLmdldDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PignY29va2llcycpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyb3V0ZSB8fCAhcm91dGUuaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBub3QgZm91bmQgZm9yICR7bWV0aG9kfSAke3VybH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91dGVyLmV4ZWN1dGUocm91dGUsIHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJzZVVybFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpLFxuICAgICAgICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnkgfHwgcGFyc2VVcmxRdWVyeSh1cmwpLFxuICAgICAgICAgICAgYm9keTogb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnMuYm9keSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBjb29raWU6IGNvb2tpZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUHJvbWlzZTxUPlxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4vLyBAdHMtbm9jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMb2dnZXJTZXJ2aWNlJyBcblxuICAgIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZSB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICB9XG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcblxudHlwZSBMaWZlY3ljbGVNZXRob2QgPSAncmVnaXN0ZXInIHwgJ2xvYWQnIHwgJ2Jvb3QnIHwgJ3NodXRkb3duJ1xuXG5pbnRlcmZhY2UgTGlzdE9wdGlvbnMge1xuICAgIGluY2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBob29rcz86IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xpZmVjeWNsZVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaG9va3M6IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5ob29rcyA9IGRhdGEuaG9va3MgPz8gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEub25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gZGF0YS5vbkVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjb250ZXh0IH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGhvb2sgJHtjb250ZXh0Lm1ldGhvZH0gKCR7Y29udGV4dC5ob29rSWR9KTpgLCBlcnJvcilcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFwQWxpYXNlcyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhbGwpIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suaG9va19hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEFsaWFzID0gaG9vay5ob29rX2FsaWFzZXMuZmluZChhbGlhcyA9PiBhcmdzLmluY2x1ZGVzKGFsaWFzKSlcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChvcHRpb25zPzogTGlzdE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leGNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1ZGUpID8gb3B0aW9ucy5leGNsdWRlIDogW29wdGlvbnMuZXhjbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiAhaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlKSA/IG9wdGlvbnMuaW5jbHVkZSA6IFtvcHRpb25zLmluY2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcyA9IG9yZGVyQnkoaG9va3MsIFsnb3JkZXInXSwgWydhc2MnXSlcblxuICAgICAgICByZXR1cm4gaG9va3NcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKC4uLnBheWxvYWQ6IChMaWZlY3ljbGVIb29rIHwgQ29uc3RydWN0b3I8TGlmZWN5Y2xlSG9vaz4pW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMucHVzaChuZXcgaXRlbSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWhvb2suaG9va19pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1NraXBwaW5nIGhvb2sgd2l0aG91dCBob29rX2lkOicsIGhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ob29rcy5zZXQoaG9vay5ob29rX2lkLCBob29rKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGQgJyArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suc3ViaG9va3MpIHtcbiAgICAgICAgICAgICAgICBob29rLnN1Ymhvb2tzLmZvckVhY2goc3ViaG9vayA9PiB0aGlzLmFkZChzdWJob29rKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TWV0aG9kKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmxpc3Qob3B0aW9ucykgXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlbWl0dGluZyAke21ldGhvZH0gZm9yIGhvb2tzOmAsIHtcbiAgICAgICAgICAgICAgICBob29rczogaG9va3MubWFwKGhvb2sgPT4gaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiB0aGlzLmxpc3Qob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2sucmVnaXN0ZXIoKSwgaG9vay5vblJlZ2lzdGVyKCldKSxcbiAgICAgICAgICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5sb2FkKCksIGhvb2sub25Mb2FkKCldKSxcbiAgICAgICAgICAgICAgICBib290OiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5ib290KCksIGhvb2sub25Cb290KCldKSxcbiAgICAgICAgICAgICAgICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suc2h1dGRvd24oKSwgaG9vay5vblNodXRkb3duKCldKSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IG1hcFttZXRob2RdKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvciwgeyBob29rSWQ6IGhvb2suaG9va19pZCwgbWV0aG9kIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2R9IGAgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdChwYXlsb2FkOiBMaWZlY3ljbGVNZXRob2QgfCBMaWZlY3ljbGVNZXRob2RbXSwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE1ldGhvZChtZXRob2QsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IEJhc2VMaWZlY3ljbGVTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIGFkZEltcG9ydHMoaW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55Pil7XG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMoaW1wb3J0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nXG4gICAgcHVibGljIGxheW91dDogc3RyaW5nXG5cbiAgICBwdWJsaWMgdG8/OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCdcbiAgICBwdWJsaWMgZ3JvdXA/OiBzdHJpbmdcbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBwYXJlbnQ/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IEFjbEVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cydcblxuY29uc3QgYWNsID0gY29udGFpbmVyLnByb3h5PEFjbEVudGl0eT4oQWNsRW50aXR5KVxuXG5leHBvcnQgZGVmYXVsdCBhY2xcbiIsImltcG9ydCBNZW51SXRlbSBmcm9tICcjY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzJ1xuaW1wb3J0IGFjbCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYWNsLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXIge1xuICAgIGxheW91dD86IHN0cmluZ1xuICAgIGdyb3VwPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgYWxsb3dlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01lbnVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGl0ZW1zOiBNYXA8c3RyaW5nLCBNZW51SXRlbT4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyBhZGQoLi4uaXRlbTogT21pdDxQYXJ0aWFsPE1lbnVJdGVtPiwgJ21lcmdlJyB8ICdmcm9tJz5bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbSkge1xuXG4gICAgICAgICAgICBpZiAoIWkuaWQpIHtcbiAgICAgICAgICAgICAgICBpLmlkID0gSlNPTi5zdHJpbmdpZnkoaSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtcy5zZXQoaS5pZCwgTWVudUl0ZW0uZnJvbShpKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoaWQ6IE1lbnVJdGVtWydpZCddKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuZGVsZXRlKGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KGZpbHRlcjogTGlzdEZpbHRlciA9IHt9KSB7XG4gICAgICAgIGxldCBpdGVtcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLml0ZW1zLnZhbHVlcygpKSkpIGFzIE1lbnVJdGVtW11cblxuXG4gICAgICAgIGlmIChmaWx0ZXIubGF5b3V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkubGF5b3V0ID09PSBmaWx0ZXIubGF5b3V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBmaWx0ZXIuZ3JvdXAgfHwgaS5wYXJlbnQgPT09IGZpbHRlci5ncm91cClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIucGFyZW50KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkucGFyZW50ID09PSBmaWx0ZXIucGFyZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5hbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLmFsbG93ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gYWNsLmNhbigndmlldycsIGkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJBID0gYS5vcmRlciA/IGEub3JkZXIgOiA5OFxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCID0gYi5vcmRlciA/IGIub3JkZXIgOiA5OFxuXG4gICAgICAgICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5cbmNvbnN0IHNldHVwR3VhcmQ6IE5hdmlnYXRpb25HdWFyZCA9ICh0bykgPT4ge1xuICAgIGNvbnN0IHNldHVwID0gY29uZmlnLmdldDxhbnk+KCdzZXR1cCcpXG4gICAgXG4gICAgY29uc3QgY29tcGxldGVkID0gIXNldHVwPy5uZWVkX2RhdGFiYXNlICYmICFzZXR1cD8ubmVlZF91c2Vyc1xuICAgIFxuICAgIGlmIChjb21wbGV0ZWQgJiYgdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy8nXG4gICAgfVxuICAgIFxuICAgIGlmIChjb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0by5wYXRoLnN0YXJ0c1dpdGgoJy9zZXR1cCcpKSB7XG4gICAgICAgIHJldHVybiAnL3NldHVwJ1xuICAgIH1cbiAgICBcbiAgICBpZiAodG8ucGF0aCA9PT0gJy9zZXR1cCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9ICAgIFxuXG4gICAgaWYgKHNldHVwPy5uZWVkX2RhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiB0by5wYXRoICE9PSAnL3NldHVwL2RhdGFiYXNlJyA/ICcvc2V0dXAvZGF0YWJhc2UnIDogdHJ1ZVxuICAgIH1cblxuICAgIGlmIChzZXR1cD8ubmVlZF91c2Vycykge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC91c2VyJyA/ICcvc2V0dXAvdXNlcicgOiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0dXBHdWFyZFxuIiwiaW1wb3J0IHtcbiAgICBjcmVhdGVSb3V0ZXIgYXMgY3JlYXRlVnVlUm91dGVyLFxuICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnksXG4gICAgY3JlYXRlV2ViSGlzdG9yeVxufSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlciBhcyBWdWVSb3V0ZXIgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZVJlY29yZFJhdyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBzZXR1cEd1YXJkIGZyb20gJyNjbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyIGV4dGVuZHMgVnVlUm91dGVyIHtcbiAgICBhdXRvOiB0eXBlb2YgYXV0bztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRvT3B0aW9ucyB7XG4gICAgZ3VhcmRzPzogTmF2aWdhdGlvbkd1YXJkW10gfCAoKHJlY29yZDogUm91dGVSZWNvcmRSYXcpID0+IE5hdmlnYXRpb25HdWFyZFtdKTtcbiAgICBzdHJpcD86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgZXhjbHVkZT86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHJlZmluZT86IChyZWNvcmRzOiBSb3V0ZVJlY29yZFJhd1tdKSA9PiBSb3V0ZVJlY29yZFJhd1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0byhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sIG9wdGlvbnM6IEF1dG9PcHRpb25zID0ge30pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICBsZXQgcm91dGVzOiBSb3V0ZVJlY29yZFJhd1tdID0gW11cblxuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZT8uc29tZShydWxlID0+XG4gICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZpbGVuYW1lLmluY2x1ZGVzKHJ1bGUpXG4gICAgICAgICAgICAgICAgOiBydWxlLnRlc3QoZmlsZW5hbWUpXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFydHMgPSBmaWxlbmFtZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLnZ1ZSQvLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gcCAmJiAhcC5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgICAgICAubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwID0gcGFydFxuXG4gICAgICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnWycpICYmIHAuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICBwID0gJzonICsgcC5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIC8vIFN0cmlwIHNwZWNpZmljIHNlZ21lbnRzXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmlwPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKHAgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5zdHJpcCEuc29tZShydWxlID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBydWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBwID09PSBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUudGVzdChwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXRoID0gcGFydHMuam9pbignLycpLnJlcGxhY2UoL2luZGV4JC8sICcnKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCkge1xuICAgICAgICAgICAgcGF0aCA9IG9wdGlvbnMucHJlZml4ICsgJy8nICsgcGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIERlZmluZUNvbXBvbmVudCxcbiAgICAgICAgICAgIGJlZm9yZUVudGVyOiBbXSBhcyBOYXZpZ2F0aW9uR3VhcmRbXSxcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ndWFyZHMpKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVmb3JlRW50ZXIgPSBvcHRpb25zLmd1YXJkc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIHR5cGVvZiBvcHRpb25zLmd1YXJkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHMocmVjb3JkKVxuICAgICAgICB9XG5cbiAgICAgICAgcm91dGVzLnB1c2gocmVjb3JkKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlZmluZSkge1xuICAgICAgICByb3V0ZXMgPSBvcHRpb25zLnJlZmluZShyb3V0ZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdXRlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVyKCkge1xuICAgIGNvbnN0IHNzciA9IGltcG9ydC5tZXRhLmVudi5TU1JcblxuICAgIGNvbnN0IHJvdXRlciA9IGNyZWF0ZVZ1ZVJvdXRlcih7XG4gICAgICAgIGhpc3Rvcnk6IHNzciA/IGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSA6IGNyZWF0ZVdlYkhpc3RvcnkoKSxcbiAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgc2Nyb2xsQmVoYXZpb3IodG8sIGZyb20sIHNhdmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkUG9zaXRpb25cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KSBhcyBhbnkgYXMgUm91dGVyXG5cbiAgICByb3V0ZXIuYmVmb3JlRWFjaChzZXR1cEd1YXJkKVxuXG4gICAgcm91dGVyLmF1dG8gPSAoaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGF1dG9Sb3V0ZXMgPSBhdXRvKGltcG9ydHMsIG9wdGlvbnMpXG4gICAgICAgIFxuICAgICAgICBhdXRvUm91dGVzLmZvckVhY2gocm91dGUgPT4gcm91dGVyLmFkZFJvdXRlKHJvdXRlKSlcblxuICAgICAgICByZXR1cm4gYXV0b1JvdXRlc1xuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXJcbn1cblxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdUb2FzdFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgQXV0aFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGF1dGggPSBjb250YWluZXIucHJveHk8QXV0aFNlcnZpY2U+KEF1dGhTZXJ2aWNlKVxuXG5pZiAoaW1wb3J0Lm1ldGEuZW52LkRFViAmJiAhaW1wb3J0Lm1ldGEuZW52LlNTUikge1xuICAgICh3aW5kb3cgYXMgYW55KS5hdXRoID0gYXV0aFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRoXG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBsb2dnZXIgPSBjb250YWluZXIucHJveHk8TG9nZ2VyU2VydmljZT4oTG9nZ2VyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyXG4iLCJpbXBvcnQgTWVudVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IG1lbnUgPSBjb250YWluZXIucHJveHk8TWVudVNlcnZpY2U+KE1lbnVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBtZW51XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmNvbnN0IHJvdXRlID0gY29udGFpbmVyLnByb3h5PFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYz4oJ3JvdXRlJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVcblxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXI+KCdyb3V0ZXInKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZXJcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBUb2FzdFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Ub2FzdFNlcnZpY2UudHMnXG5cbmNvbnN0IHRvYXN0ID0gY29udGFpbmVyLnByb3h5PFRvYXN0U2VydmljZT4oVG9hc3RTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCB0b2FzdFxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgIFxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHR5cGUgeyBBdXRvT3B0aW9ucyB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBhZGRQYWdlc0ZvbGRlcihpbXBvcnRzOiBhbnksIG9wdGlvbnM/OiBBdXRvT3B0aW9ucykge1xuICAgICAgICByb3V0ZXIuYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxufVxuIiwiaW1wb3J0ICRvcmlnaW5hbCBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2ZldGNoLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgJGZldGNoIGZhY2FkZSAqL1xuZXhwb3J0IGNvbnN0ICRmZXRjaCA9ICRvcmlnaW5hbDtcbiIsImltcG9ydCB7ICRmZXRjaCB9IGZyb20gJy4vZmV0Y2hlcidcblxuaW50ZXJmYWNlIFBpY2tPcHRpb25zIHtcbiAgICBhY2NlcHQ/OiBzdHJpbmdcbiAgICBtdWx0aXBsZT86IGJvb2xlYW5cbn1cblxudHlwZSBQaWNrUmVzdWx0PFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4gPSBUWydtdWx0aXBsZSddIGV4dGVuZHMgdHJ1ZSA/IEZpbGVbXSA6IEZpbGUgfCBudWxsXG5cbmZ1bmN0aW9uIHBpY2s8VCBleHRlbmRzIFBpY2tPcHRpb25zPihvcHRpb25zOiBUKTogUHJvbWlzZTxQaWNrUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXG4gICAgICAgIGlucHV0LnR5cGUgPSAnZmlsZSdcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gb3B0aW9ucy5hY2NlcHQgfHwgJyovKidcbiAgICAgICAgaW5wdXQubXVsdGlwbGUgPSBvcHRpb25zLm11bHRpcGxlIHx8IGZhbHNlXG5cbiAgICAgICAgaW5wdXQub25jaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHRhcmdldC5maWxlcyBhcyBGaWxlTGlzdCkgYXMgRmlsZVtdXG5cbiAgICAgICAgICAgIHJlc29sdmUoKG9wdGlvbnMubXVsdGlwbGUgPyBBcnJheS5mcm9tKGZpbGVzKSA6IGZpbGVzWzBdKSBhcyBQaWNrUmVzdWx0PFQ+KVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQub25jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG9wdGlvbnMubXVsdGlwbGUgPyBbXSA6IChudWxsIGFzIGFueSkpXG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC5jbGljaygpXG4gICAgfSlcbn1cblxuZnVuY3Rpb24gdG9VaW50OEFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG5cbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQ/LnJlc3VsdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShlLnRhcmdldC5yZXN1bHQpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gcmVhZCBmaWxlIGFzIEFycmF5QnVmZmVyJykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSlcbiAgICB9KVxufVxuXG5pbnRlcmZhY2UgVXBsb2FkT3B0aW9ucyB7XG4gICAgZHJpdmVJZDogc3RyaW5nXG4gICAgZmlsZTogRmlsZVxuICAgIGRpcmVjdG9yeT86IHN0cmluZ1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGxvYWQob3B0aW9uczogVXBsb2FkT3B0aW9ucyl7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgXG4gICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBvcHRpb25zLmZpbGUpXG5cbiAgICBpZiAob3B0aW9ucy5kaXJlY3RvcnkpIHtcbiAgICAgICAgZm9ybS5hcHBlbmQoJ2RpcmVjdG9yeScsIG9wdGlvbnMuZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHJldHVybiAkZmV0Y2goYC9hcGkvZHJpdmVzLyR7b3B0aW9ucy5kcml2ZUlkfS91cGxvYWRgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBmb3JtLFxuICAgICAgICBxdWVyeTogeyBkaXJlY3Rvcnk6IG9wdGlvbnMuZGlyZWN0b3J5LCB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0ICRmaWxlID0ge1xuICAgIHBpY2ssXG4gICAgdXBsb2FkLFxuICAgIHRvVWludDhBcnJheSxcbn0iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoR3VhcmRPcHRpb25zIHtcbiAgICByZWRpcmVjdDogc3RyaW5nXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoR3VhcmQob3B0aW9uczogQXV0aEd1YXJkT3B0aW9ucyk6IE5hdmlnYXRpb25HdWFyZCB7XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSB8fCBbJy9hdXRoL2xvZ2luJywgJy9hdXRoL3JlZ2lzdGVyJ11cbiAgICBcbiAgICByZXR1cm4gKHRvKSA9PiB7XG4gICAgICAgIGlmICghYXV0aC51c2VyICYmICFleGNsdWRlLmluY2x1ZGVzKHRvLnBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdXRoR3VhcmQgPSBjcmVhdGVBdXRoR3VhcmQoeyBcbiAgICByZWRpcmVjdDogJy9hdXRoL2xvZ2luJyxcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IGF1dGhHdWFyZFxuIiwiaW1wb3J0IGF1dGggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2F1dGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Vlc3RHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1ZXN0R3VhcmQob3B0aW9uczogR3Vlc3RHdWFyZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoYXV0aC51c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBndWVzdEd1YXJkID0gY3JlYXRlR3Vlc3RHdWFyZCh7XG4gICAgcmVkaXJlY3Q6ICcvJ1xufSlcblxuZXhwb3J0IGRlZmF1bHQgZ3Vlc3RHdWFyZFxuIl0sIm1hcHBpbmdzIjoibVJBWUEsZUFBc0IsRUFBK0IsRUFBMkMsQ0FDNUYsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLE1BQU0sR0FBTyxDQUNQLE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEVBSW5DLEVBQVMsS0FBTyxTQUEyQixFQUE2QixDQUNwRSxHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sR0FB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