@iwanglang/patient-fhir-helper
Version:
Patient Fhir Helper
2 lines • 106 kB
JavaScript
"use strict";var M=Object.defineProperty;var U=(e,r,t)=>r in e?M(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var g=(e,r,t)=>(U(e,typeof r!="symbol"?r+"":r,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=globalThis||void 0||self,k=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,O=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,J=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function v(e,r){if(e==="__proto__"||e==="constructor"&&r&&typeof r=="object"&&"prototype"in r){B(e);return}return r}function B(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function Q(e,r={}){if(typeof e!="string")return e;const t=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return t.slice(1,-1);if(t.length<=9){const o=t.toLowerCase();if(o==="true")return!0;if(o==="false")return!1;if(o==="undefined")return;if(o==="null")return null;if(o==="nan")return Number.NaN;if(o==="infinity")return Number.POSITIVE_INFINITY;if(o==="-infinity")return Number.NEGATIVE_INFINITY}if(!J.test(e)){if(r.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(k.test(e)||O.test(e)){if(r.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,v)}return JSON.parse(e)}catch(o){if(r.strict)throw o;return e}}const Y=/#/g,G=/&/g,H=/\//g,W=/=/g,S=/\+/g,z=/%5e/gi,K=/%60/gi,V=/%7c/gi,X=/%20/gi;function Z(e){return encodeURI(""+e).replace(V,"|")}function R(e){return Z(typeof e=="string"?e:JSON.stringify(e)).replace(S,"%2B").replace(X,"+").replace(Y,"%23").replace(G,"%26").replace(K,"`").replace(z,"^").replace(H,"%2F")}function w(e){return R(e).replace(W,"%3D")}function p(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function x(e){return p(e.replace(S," "))}function ee(e){return p(e.replace(S," "))}function re(e=""){const r={};e[0]==="?"&&(e=e.slice(1));for(const t of e.split("&")){const o=t.match(/([^=]+)=?(.*)/)||[];if(o.length<2)continue;const n=x(o[1]);if(n==="__proto__"||n==="constructor")continue;const i=ee(o[2]||"");r[n]===void 0?r[n]=i:Array.isArray(r[n])?r[n].push(i):r[n]=[r[n],i]}return r}function te(e,r){return(typeof r=="number"||typeof r=="boolean")&&(r=String(r)),r?Array.isArray(r)?r.map(t=>`${w(e)}=${R(t)}`).join("&"):`${w(e)}=${R(r)}`:w(e)}function se(e){return Object.keys(e).filter(r=>e[r]!==void 0).map(r=>te(r,e[r])).filter(Boolean).join("&")}const oe=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,ne=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,ie=/^([/\\]\s*){2,}[^/\\]/,ce=/\/$|\/\?|\/#/,ae=/^\.?\//;function P(e,r={}){return typeof r=="boolean"&&(r={acceptRelative:r}),r.strict?oe.test(e):ne.test(e)||(r.acceptRelative?ie.test(e):!1)}function E(e="",r){return r?ce.test(e):e.endsWith("/")}function fe(e="",r){if(!r)return(E(e)?e.slice(0,-1):e)||"/";if(!E(e,!0))return e||"/";let t=e,o="";const n=e.indexOf("#");n>=0&&(t=e.slice(0,n),o=e.slice(n));const[i,...c]=t.split("?");return((i.endsWith("/")?i.slice(0,-1):i)||"/")+(c.length>0?`?${c.join("?")}`:"")+o}function he(e="",r){if(!r)return e.endsWith("/")?e:e+"/";if(E(e,!0))return e||"/";let t=e,o="";const n=e.indexOf("#");if(n>=0&&(t=e.slice(0,n),o=e.slice(n),!t))return o;const[i,...c]=t.split("?");return i+"/"+(c.length>0?`?${c.join("?")}`:"")+o}function ue(e,r){if(de(r)||P(e))return e;const t=fe(r);return e.startsWith(t)?e:ge(t,e)}function le(e,r){const t=C(e),o={...re(t.search),...r};return t.search=se(o),me(t)}function de(e){return!e||e==="/"}function ye(e){return e&&e!=="/"}function ge(e,...r){let t=e||"";for(const o of r.filter(n=>ye(n)))if(t){const n=o.replace(ae,"");t=he(t)+n}else t=o;return t}const $=Symbol.for("ufo:protocolRelative");function C(e="",r){const t=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(t){const[,u,l=""]=t;return{protocol:u.toLowerCase(),pathname:l,href:u+l,auth:"",host:"",search:"",hash:""}}if(!P(e,{acceptRelative:!0}))return r?C(r+e):_(e);const[,o="",n,i=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,c="",a=""]=i.match(/([^#/?]*)(.*)?/)||[],{pathname:h,search:f,hash:s}=_(a.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:o.toLowerCase(),auth:n?n.slice(0,Math.max(0,n.length-1)):"",host:c,pathname:h,search:f,hash:s,[$]:!o}}function _(e=""){const[r="",t="",o=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:r,search:t,hash:o}}function me(e){const r=e.pathname||"",t=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",o=e.hash||"",n=e.auth?e.auth+"@":"",i=e.host||"";return(e.protocol||e[$]?(e.protocol||"")+"//":"")+n+i+r+t+o}class N extends Error{constructor(r,t){super(r,t),this.name="FetchError",t!=null&&t.cause&&!this.cause&&(this.cause=t.cause)}}function be(e){var h,f,s,u,l;const r=((h=e.error)==null?void 0:h.message)||((f=e.error)==null?void 0:f.toString())||"",t=((s=e.request)==null?void 0:s.method)||((u=e.options)==null?void 0:u.method)||"GET",o=((l=e.request)==null?void 0:l.url)||String(e.request)||"/",n=`[${t}] ${JSON.stringify(o)}`,i=e.response?`${e.response.status} ${e.response.statusText}`:"<no response>",c=`${n}: ${i}${r?` ${r}`:""}`,a=new N(c,e.error?{cause:e.error}:void 0);for(const d of["request","options","response"])Object.defineProperty(a,d,{get(){return e[d]}});for(const[d,y]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(a,d,{get(){return e.response&&e.response[y]}});return a}const we=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function D(e="GET"){return we.has(e.toUpperCase())}function Re(e){if(e===void 0)return!1;const r=typeof e;return r==="string"||r==="number"||r==="boolean"||r===null?!0:r!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const Ee=new Set(["image/svg","application/xml","application/xhtml","application/html"]),Se=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function Te(e=""){if(!e)return"json";const r=e.split(";").shift()||"";return Se.test(r)?"json":Ee.has(r)||r.startsWith("text/")?"text":"blob"}function Ae(e,r,t=globalThis.Headers){const o={...r,...e};if(r!=null&&r.params&&(e!=null&&e.params)&&(o.params={...r==null?void 0:r.params,...e==null?void 0:e.params}),r!=null&&r.query&&(e!=null&&e.query)&&(o.query={...r==null?void 0:r.query,...e==null?void 0:e.query}),r!=null&&r.headers&&(e!=null&&e.headers)){o.headers=new t((r==null?void 0:r.headers)||{});for(const[n,i]of new t((e==null?void 0:e.headers)||{}))o.headers.set(n,i)}return o}const _e=new Set([408,409,425,429,500,502,503,504]),De=new Set([101,204,205,304]);function j(e={}){const{fetch:r=globalThis.fetch,Headers:t=globalThis.Headers,AbortController:o=globalThis.AbortController}=e;async function n(a){const h=a.error&&a.error.name==="AbortError"&&!a.options.timeout||!1;if(a.options.retry!==!1&&!h){let s;typeof a.options.retry=="number"?s=a.options.retry:s=D(a.options.method)?0:1;const u=a.response&&a.response.status||500;if(s>0&&(Array.isArray(a.options.retryStatusCodes)?a.options.retryStatusCodes.includes(u):_e.has(u))){const l=a.options.retryDelay||0;return l>0&&await new Promise(d=>setTimeout(d,l)),i(a.request,{...a.options,retry:s-1})}}const f=be(a);throw Error.captureStackTrace&&Error.captureStackTrace(f,i),f}const i=async function(h,f={}){var d;const s={request:h,options:Ae(f,e.defaults,t),response:void 0,error:void 0};s.options.method=(d=s.options.method)==null?void 0:d.toUpperCase(),s.options.onRequest&&await s.options.onRequest(s),typeof s.request=="string"&&(s.options.baseURL&&(s.request=ue(s.request,s.options.baseURL)),(s.options.query||s.options.params)&&(s.request=le(s.request,{...s.options.params,...s.options.query}))),s.options.body&&D(s.options.method)&&(Re(s.options.body)?(s.options.body=typeof s.options.body=="string"?s.options.body:JSON.stringify(s.options.body),s.options.headers=new t(s.options.headers||{}),s.options.headers.has("content-type")||s.options.headers.set("content-type","application/json"),s.options.headers.has("accept")||s.options.headers.set("accept","application/json")):("pipeTo"in s.options.body&&typeof s.options.body.pipeTo=="function"||typeof s.options.body.pipe=="function")&&("duplex"in s.options||(s.options.duplex="half")));let u;if(!s.options.signal&&s.options.timeout){const y=new o;u=setTimeout(()=>y.abort(),s.options.timeout),s.options.signal=y.signal}try{s.response=await r(s.request,s.options)}catch(y){return s.error=y,s.options.onRequestError&&await s.options.onRequestError(s),await n(s)}finally{u&&clearTimeout(u)}if(s.response.body&&!De.has(s.response.status)&&s.options.method!=="HEAD"){const y=(s.options.parseResponse?"json":s.options.responseType)||Te(s.response.headers.get("content-type")||"");switch(y){case"json":{const q=await s.response.text(),F=s.options.parseResponse||Q;s.response._data=F(q);break}case"stream":{s.response._data=s.response.body;break}default:s.response._data=await s.response[y]()}}return s.options.onResponse&&await s.options.onResponse(s),!s.options.ignoreResponseError&&s.response.status>=400&&s.response.status<600?(s.options.onResponseError&&await s.options.onResponseError(s),await n(s)):s.response},c=async function(h,f){return(await i(h,f))._data};return c.raw=i,c.native=(...a)=>r(...a),c.create=(a={})=>j({...e,defaults:{...e.defaults,...a}}),c}const T=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof A<"u")return A;throw new Error("unable to locate global object")}(),pe=T.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),Pe=T.Headers,$e=T.AbortController,Ce=j({fetch:pe,Headers:Pe,AbortController:$e});function Ne(e,r){var t,o,n,i;return e instanceof N&&Array.isArray((o=(t=e==null?void 0:e.response)==null?void 0:t._data)==null?void 0:o.issue)?(((i=(n=e==null?void 0:e.response)==null?void 0:n._data)==null?void 0:i.issue)??[]).flatMap(c=>c.diagnostics).join(", "):(e==null?void 0:e.message)||r||"Internal Server Error"}function b(e,r){var o,n,i,c,a,h;if(r&&!((o=e==null?void 0:e.name)!=null&&o.some(f=>(f==null?void 0:f.use)===r)))return"";const t=r?(n=e==null?void 0:e.name)==null?void 0:n.find(f=>(f==null?void 0:f.use)===r):(i=e==null?void 0:e.name)==null?void 0:i.find(f=>{var s;return((s=f.given)==null?void 0:s.length)||f.family});return t!=null&&t.text?t==null?void 0:t.text:(c=t==null?void 0:t.given)!=null&&c.length||t!=null&&t.family?[(a=t==null?void 0:t.prefix)==null?void 0:a.find(f=>!!f),(h=t==null?void 0:t.given)==null?void 0:h.find(f=>!!f),t==null?void 0:t.family].filter(f=>!!f).join(" "):(t==null?void 0:t.text)||"-"}function I(e,r){const{remainingAgeYears:t,remainingAgeMonths:o,remainingAgeDays:n}=m(e,r);let i=`${t||0}ปี`;return o>0&&(i+=` ${o}เดือน`),n>0&&(i+=` ${n}วัน`),i}function m(e,r){const t=new Date(e),o=r??new Date;let n=o.getFullYear()-t.getFullYear(),i=o.getMonth()-t.getMonth(),c=o.getDate()-t.getDate();return c<0&&(i--,c+=new Date(o.getFullYear(),o.getMonth(),0).getDate()),i<0&&(n--,i+=12),{remainingAgeYears:n,remainingAgeMonths:i,remainingAgeDays:c}}function L(e,r){var n,i;const t=((i=(n=e.identifier)==null?void 0:n.find(c=>{var a,h;return(h=(a=c.type)==null?void 0:a.coding)==null?void 0:h.find(f=>f.code==="MR"&&f.system==="http://terminology.hl7.org/CodeSystem/v2-0203")}))==null?void 0:i.value)??null,o=(e.photo??[]).find(c=>(c==null?void 0:c.contentType)&&(c==null?void 0:c.data));return{id:e.id??"",patientReference:`Patient/${e.id}`,identifier:e.identifier??[],deceasedBoolean:e.deceasedBoolean??!1,hospitalNumber:t,name:b(e,"official")||b(e,"usual")||b(e),gender:e.gender??"unknown",birthdate:e.birthDate??null,remainingAge:t&&e.birthDate?I(e.birthDate,r==null?void 0:r.currentDate):null,remainingAgeYears:t&&e.birthDate?m(e.birthDate,r==null?void 0:r.currentDate).remainingAgeYears:null,remainingAgeMonths:t&&e.birthDate?m(e.birthDate,r==null?void 0:r.currentDate).remainingAgeMonths:null,remainingAgeDays:t&&e.birthDate?m(e.birthDate,r==null?void 0:r.currentDate).remainingAgeDays:null,photo:o?`data:${o.contentType};base64,${o.data}`:void 0}}class je{constructor(r,t){g(this,"fhirServer");g(this,"token");g(this,"medicalRecordNumber",!0);g(this,"headers",new Headers);g(this,"currentDate",new Date);this.fhirServer=r,this.token=t}initialisation(r,t){this.fhirServer=r,this.token=t}setToken(r){this.token=r}setOption(r){r!=null&&r.medicalRecordNumber&&(this.medicalRecordNumber=r.medicalRecordNumber),r!=null&&r.headers&&r.headers instanceof Headers?this.headers=r.headers:r!=null&&r.headers&&(this.headers=new Headers(r.headers)),r!=null&&r.currentDate&&(this.currentDate=r.currentDate)}getOptions(r={}){return{medicalRecordNumber:(r==null?void 0:r.medicalRecordNumber)??this.medicalRecordNumber,headers:r!=null&&r.headers?new Headers(r.headers):this.headers??new Headers,currentDate:(r==null?void 0:r.currentDate)??this.currentDate}}setHearders(r){this.headers=r}setTiming(r){this.currentDate=r}async findPatientByIdentifier(r,t={}){var o,n;try{const{medicalRecordNumber:i,headers:c,currentDate:a}=this.getOptions(t);if(!this.fhirServer)throw new Error("FHIR server not set");this.token&&c.append("Authorization",this.token);const h=new URLSearchParams({identifier:r}).toString(),{entry:f}=await Ce(`/Patient?${h}`,{baseURL:this.fhirServer,retry:3,retryDelay:500,method:"GET",headers:c}),s=(o=f==null?void 0:f.find(u=>{var l;return((l=u.resource)==null?void 0:l.resourceType)==="Patient"}))==null?void 0:o.resource;if(!s)throw new Error(`Not found patient with identifier ${r}`);if(!(s!=null&&s.id))throw new Error("Patient resource missing id");if(i&&!((n=s==null?void 0:s.identifier)!=null&&n.some(u=>{var l,d;return(d=(l=u.type)==null?void 0:l.coding)==null?void 0:d.find(y=>y.code==="MR"&&y.system==="http://terminology.hl7.org/CodeSystem/v2-0203")})))throw new Error("Patient resource missing Medical Record Number (MR)");return L(s,{currentDate:a})}catch(i){throw new Error(Ne(i,`Not found patient with identifier ${r}`))}}}exports.PatientFhirHelper=je;exports.calculateRemainingAge=m;exports.calculateRemainingAgeString=I;exports.patientNormalizationHelper=L;exports.useFhirHumanName=b;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvZ2xvYmFsL2Rpc3QvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZGVzdHIvZGlzdC9pbmRleC5tanMiLCIuLi9ub2RlX21vZHVsZXMvdWZvL2Rpc3QvaW5kZXgubWpzIiwiLi4vbm9kZV9tb2R1bGVzL29mZXRjaC9kaXN0L3NoYXJlZC9vZmV0Y2guMzczODZiMDUubWpzIiwiLi4vbm9kZV9tb2R1bGVzL29mZXRjaC9kaXN0L2luZGV4Lm1qcyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIHx8IHZvaWQgMCB8fCBzZWxmO1xuXG5leHBvcnQgeyBnbG9iYWwgYXMgZGVmYXVsdCwgZ2xvYmFsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImNvbnN0IHN1c3BlY3RQcm90b1J4ID0gL1wiKD86X3xcXFxcdTB7Mn01W0ZmXSl7Mn0oPzpwfFxcXFx1MHsyfTcwKSg/OnJ8XFxcXHUwezJ9NzIpKD86b3xcXFxcdTB7Mn02W0ZmXSkoPzp0fFxcXFx1MHsyfTc0KSg/Om98XFxcXHUwezJ9NltGZl0pKD86X3xcXFxcdTB7Mn01W0ZmXSl7Mn1cIlxccyo6LztcbmNvbnN0IHN1c3BlY3RDb25zdHJ1Y3RvclJ4ID0gL1wiKD86Y3xcXFxcdTAwNjMpKD86b3xcXFxcdTAwNltGZl0pKD86bnxcXFxcdTAwNltFZV0pKD86c3xcXFxcdTAwNzMpKD86dHxcXFxcdTAwNzQpKD86cnxcXFxcdTAwNzIpKD86dXxcXFxcdTAwNzUpKD86Y3xcXFxcdTAwNjMpKD86dHxcXFxcdTAwNzQpKD86b3xcXFxcdTAwNltGZl0pKD86cnxcXFxcdTAwNzIpXCJcXHMqOi87XG5jb25zdCBKc29uU2lnUnggPSAvXlxccypbXCJbe118XlxccyotP1xcZHsxLDE2fShcXC5cXGR7MSwxN30pPyhbRWVdWystXT9cXGQrKT9cXHMqJC87XG5mdW5jdGlvbiBqc29uUGFyc2VUcmFuc2Zvcm0oa2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcInByb3RvdHlwZVwiIGluIHZhbHVlKSB7XG4gICAgd2FybktleURyb3BwZWQoa2V5KTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gd2FybktleURyb3BwZWQoa2V5KSB7XG4gIGNvbnNvbGUud2FybihgW2Rlc3RyXSBEcm9wcGluZyBcIiR7a2V5fVwiIGtleSB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb24uYCk7XG59XG5mdW5jdGlvbiBkZXN0cih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgY29uc3QgX3ZhbHVlID0gdmFsdWUudHJpbSgpO1xuICBpZiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWF0XG4gICAgdmFsdWVbMF0gPT09ICdcIicgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFxcXFwiKVxuICApIHtcbiAgICByZXR1cm4gX3ZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAoX3ZhbHVlLmxlbmd0aCA8PSA5KSB7XG4gICAgY29uc3QgX2x2YWwgPSBfdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoX2x2YWwgPT09IFwidHJ1ZVwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKF9sdmFsID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKF9sdmFsID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoX2x2YWwgPT09IFwibnVsbFwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF9sdmFsID09PSBcIm5hblwiKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLk5hTjtcbiAgICB9XG4gICAgaWYgKF9sdmFsID09PSBcImluZmluaXR5XCIpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgfVxuICAgIGlmIChfbHZhbCA9PT0gXCItaW5maW5pdHlcIikge1xuICAgICAgcmV0dXJuIE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICB9XG4gIH1cbiAgaWYgKCFKc29uU2lnUngudGVzdCh2YWx1ZSkpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIltkZXN0cl0gSW52YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoc3VzcGVjdFByb3RvUngudGVzdCh2YWx1ZSkgfHwgc3VzcGVjdENvbnN0cnVjdG9yUngudGVzdCh2YWx1ZSkpIHtcbiAgICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbZGVzdHJdIFBvc3NpYmxlIHByb3RvdHlwZSBwb2xsdXRpb25cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSwganNvblBhcnNlVHJhbnNmb3JtKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gc2FmZURlc3RyKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGRlc3RyKHZhbHVlLCB7IC4uLm9wdGlvbnMsIHN0cmljdDogdHJ1ZSB9KTtcbn1cblxuZXhwb3J0IHsgZGVzdHIgYXMgZGVmYXVsdCwgZGVzdHIsIHNhZmVEZXN0ciB9O1xuIiwiY29uc3QgbiA9IC9bXlxcMC1cXHg3RV0vO1xuY29uc3QgdCA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7XG5jb25zdCBvID0ge1xuICBvdmVyZmxvdzogXCJPdmVyZmxvdyBFcnJvclwiLFxuICBcIm5vdC1iYXNpY1wiOiBcIklsbGVnYWwgSW5wdXRcIixcbiAgXCJpbnZhbGlkLWlucHV0XCI6IFwiSW52YWxpZCBJbnB1dFwiXG59O1xuY29uc3QgZSA9IE1hdGguZmxvb3I7XG5jb25zdCByID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbmZ1bmN0aW9uIHMobjIpIHtcbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3Iob1tuMl0pO1xufVxuY29uc3QgYyA9IGZ1bmN0aW9uKG4yLCB0Mikge1xuICByZXR1cm4gbjIgKyAyMiArIDc1ICogKG4yIDwgMjYpIC0gKCh0MiAhPSAwKSA8PCA1KTtcbn07XG5jb25zdCB1ID0gZnVuY3Rpb24objIsIHQyLCBvMikge1xuICBsZXQgcjIgPSAwO1xuICBmb3IgKG4yID0gbzIgPyBlKG4yIC8gNzAwKSA6IG4yID4+IDEsIG4yICs9IGUobjIgLyB0Mik7IG4yID4gNDU1OyByMiArPSAzNikge1xuICAgIG4yID0gZShuMiAvIDM1KTtcbiAgfVxuICByZXR1cm4gZShyMiArIDM2ICogbjIgLyAobjIgKyAzOCkpO1xufTtcbmZ1bmN0aW9uIHRvQVNDSUkobzIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG4yLCBvMykge1xuICAgIGNvbnN0IGUyID0gbjIuc3BsaXQoXCJAXCIpO1xuICAgIGxldCByMiA9IFwiXCI7XG4gICAgZTIubGVuZ3RoID4gMSAmJiAocjIgPSBlMlswXSArIFwiQFwiLCBuMiA9IGUyWzFdKTtcbiAgICBjb25zdCBzMiA9IGZ1bmN0aW9uKG4zLCB0Mikge1xuICAgICAgY29uc3QgbzQgPSBbXTtcbiAgICAgIGxldCBlMyA9IG4zLmxlbmd0aDtcbiAgICAgIGZvciAoOyBlMy0tOyApIHtcbiAgICAgICAgbzRbZTNdID0gdDIobjNbZTNdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvNDtcbiAgICB9KChuMiA9IG4yLnJlcGxhY2UodCwgXCIuXCIpKS5zcGxpdChcIi5cIiksIG8zKS5qb2luKFwiLlwiKTtcbiAgICByZXR1cm4gcjIgKyBzMjtcbiAgfShvMiwgZnVuY3Rpb24odDIpIHtcbiAgICByZXR1cm4gbi50ZXN0KHQyKSA/IFwieG4tLVwiICsgZnVuY3Rpb24objIpIHtcbiAgICAgIGNvbnN0IHQzID0gW107XG4gICAgICBjb25zdCBvMyA9IChuMiA9IGZ1bmN0aW9uKG4zKSB7XG4gICAgICAgIGNvbnN0IHQ0ID0gW107XG4gICAgICAgIGxldCBvNCA9IDA7XG4gICAgICAgIGNvbnN0IGUyID0gbjMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgbzQgPCBlMjsgKSB7XG4gICAgICAgICAgY29uc3QgcjIgPSBuMy5jaGFyQ29kZUF0KG80KyspO1xuICAgICAgICAgIGlmIChyMiA+PSA1NTI5NiAmJiByMiA8PSA1NjMxOSAmJiBvNCA8IGUyKSB7XG4gICAgICAgICAgICBjb25zdCBlMyA9IG4zLmNoYXJDb2RlQXQobzQrKyk7XG4gICAgICAgICAgICAoNjQ1MTIgJiBlMykgPT0gNTYzMjAgPyB0NC5wdXNoKCgoMTAyMyAmIHIyKSA8PCAxMCkgKyAoMTAyMyAmIGUzKSArIDY1NTM2KSA6ICh0NC5wdXNoKHIyKSwgbzQtLSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQ0LnB1c2gocjIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDQ7XG4gICAgICB9KG4yKSkubGVuZ3RoO1xuICAgICAgbGV0IGYgPSAxMjg7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBsZXQgbCA9IDcyO1xuICAgICAgZm9yIChjb25zdCBvNCBvZiBuMikge1xuICAgICAgICBvNCA8IDEyOCAmJiB0My5wdXNoKHIobzQpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGggPSB0My5sZW5ndGg7XG4gICAgICBsZXQgcCA9IGg7XG4gICAgICBmb3IgKGggJiYgdDMucHVzaChcIi1cIik7IHAgPCBvMzsgKSB7XG4gICAgICAgIGxldCBvNCA9IDIxNDc0ODM2NDc7XG4gICAgICAgIGZvciAoY29uc3QgdDQgb2YgbjIpIHtcbiAgICAgICAgICB0NCA+PSBmICYmIHQ0IDwgbzQgJiYgKG80ID0gdDQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGEgPSBwICsgMTtcbiAgICAgICAgbzQgLSBmID4gZSgoMjE0NzQ4MzY0NyAtIGkpIC8gYSkgJiYgcyhcIm92ZXJmbG93XCIpLCBpICs9IChvNCAtIGYpICogYSwgZiA9IG80O1xuICAgICAgICBmb3IgKGNvbnN0IG81IG9mIG4yKSB7XG4gICAgICAgICAgaWYgKG81IDwgZiAmJiArK2kgPiAyMTQ3NDgzNjQ3ICYmIHMoXCJvdmVyZmxvd1wiKSwgbzUgPT0gZikge1xuICAgICAgICAgICAgbGV0IG4zID0gaTtcbiAgICAgICAgICAgIGZvciAobGV0IG82ID0gMzY7IDsgbzYgKz0gMzYpIHtcbiAgICAgICAgICAgICAgY29uc3QgczIgPSBvNiA8PSBsID8gMSA6IG82ID49IGwgKyAyNiA/IDI2IDogbzYgLSBsO1xuICAgICAgICAgICAgICBpZiAobjMgPCBzMikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHUyID0gbjMgLSBzMjtcbiAgICAgICAgICAgICAgY29uc3QgZjIgPSAzNiAtIHMyO1xuICAgICAgICAgICAgICB0My5wdXNoKHIoYyhzMiArIHUyICUgZjIsIDApKSksIG4zID0gZSh1MiAvIGYyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQzLnB1c2gocihjKG4zLCAwKSkpLCBsID0gdShpLCBhLCBwID09IGgpLCBpID0gMCwgKytwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICArK2ksICsrZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0My5qb2luKFwiXCIpO1xuICAgIH0odDIpIDogdDI7XG4gIH0pO1xufVxuXG5jb25zdCBIQVNIX1JFID0gLyMvZztcbmNvbnN0IEFNUEVSU0FORF9SRSA9IC8mL2c7XG5jb25zdCBTTEFTSF9SRSA9IC9cXC8vZztcbmNvbnN0IEVRVUFMX1JFID0gLz0vZztcbmNvbnN0IElNX1JFID0gL1xcPy9nO1xuY29uc3QgUExVU19SRSA9IC9cXCsvZztcbmNvbnN0IEVOQ19DQVJFVF9SRSA9IC8lNWUvZ2k7XG5jb25zdCBFTkNfQkFDS1RJQ0tfUkUgPSAvJTYwL2dpO1xuY29uc3QgRU5DX0NVUkxZX09QRU5fUkUgPSAvJTdiL2dpO1xuY29uc3QgRU5DX1BJUEVfUkUgPSAvJTdjL2dpO1xuY29uc3QgRU5DX0NVUkxZX0NMT1NFX1JFID0gLyU3ZC9naTtcbmNvbnN0IEVOQ19TUEFDRV9SRSA9IC8lMjAvZ2k7XG5jb25zdCBFTkNfU0xBU0hfUkUgPSAvJTJmL2dpO1xuY29uc3QgRU5DX0VOQ19TTEFTSF9SRSA9IC8lMjUyZi9naTtcbmZ1bmN0aW9uIGVuY29kZSh0ZXh0KSB7XG4gIHJldHVybiBlbmNvZGVVUkkoXCJcIiArIHRleHQpLnJlcGxhY2UoRU5DX1BJUEVfUkUsIFwifFwiKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUhhc2godGV4dCkge1xuICByZXR1cm4gZW5jb2RlKHRleHQpLnJlcGxhY2UoRU5DX0NVUkxZX09QRU5fUkUsIFwie1wiKS5yZXBsYWNlKEVOQ19DVVJMWV9DTE9TRV9SRSwgXCJ9XCIpLnJlcGxhY2UoRU5DX0NBUkVUX1JFLCBcIl5cIik7XG59XG5mdW5jdGlvbiBlbmNvZGVRdWVyeVZhbHVlKGlucHV0KSB7XG4gIHJldHVybiBlbmNvZGUodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gaW5wdXQgOiBKU09OLnN0cmluZ2lmeShpbnB1dCkpLnJlcGxhY2UoUExVU19SRSwgXCIlMkJcIikucmVwbGFjZShFTkNfU1BBQ0VfUkUsIFwiK1wiKS5yZXBsYWNlKEhBU0hfUkUsIFwiJTIzXCIpLnJlcGxhY2UoQU1QRVJTQU5EX1JFLCBcIiUyNlwiKS5yZXBsYWNlKEVOQ19CQUNLVElDS19SRSwgXCJgXCIpLnJlcGxhY2UoRU5DX0NBUkVUX1JFLCBcIl5cIikucmVwbGFjZShTTEFTSF9SRSwgXCIlMkZcIik7XG59XG5mdW5jdGlvbiBlbmNvZGVRdWVyeUtleSh0ZXh0KSB7XG4gIHJldHVybiBlbmNvZGVRdWVyeVZhbHVlKHRleHQpLnJlcGxhY2UoRVFVQUxfUkUsIFwiJTNEXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlUGF0aCh0ZXh0KSB7XG4gIHJldHVybiBlbmNvZGUodGV4dCkucmVwbGFjZShIQVNIX1JFLCBcIiUyM1wiKS5yZXBsYWNlKElNX1JFLCBcIiUzRlwiKS5yZXBsYWNlKEVOQ19FTkNfU0xBU0hfUkUsIFwiJTJGXCIpLnJlcGxhY2UoQU1QRVJTQU5EX1JFLCBcIiUyNlwiKS5yZXBsYWNlKFBMVVNfUkUsIFwiJTJCXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlUGFyYW0odGV4dCkge1xuICByZXR1cm4gZW5jb2RlUGF0aCh0ZXh0KS5yZXBsYWNlKFNMQVNIX1JFLCBcIiUyRlwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZSh0ZXh0ID0gXCJcIikge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoXCJcIiArIHRleHQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJcIiArIHRleHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlY29kZVBhdGgodGV4dCkge1xuICByZXR1cm4gZGVjb2RlKHRleHQucmVwbGFjZShFTkNfU0xBU0hfUkUsIFwiJTI1MkZcIikpO1xufVxuZnVuY3Rpb24gZGVjb2RlUXVlcnlLZXkodGV4dCkge1xuICByZXR1cm4gZGVjb2RlKHRleHQucmVwbGFjZShQTFVTX1JFLCBcIiBcIikpO1xufVxuZnVuY3Rpb24gZGVjb2RlUXVlcnlWYWx1ZSh0ZXh0KSB7XG4gIHJldHVybiBkZWNvZGUodGV4dC5yZXBsYWNlKFBMVVNfUkUsIFwiIFwiKSk7XG59XG5mdW5jdGlvbiBlbmNvZGVIb3N0KG5hbWUgPSBcIlwiKSB7XG4gIHJldHVybiB0b0FTQ0lJKG5hbWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHBhcmFtZXRlcnNTdHJpbmcgPSBcIlwiKSB7XG4gIGNvbnN0IG9iamVjdCA9IHt9O1xuICBpZiAocGFyYW1ldGVyc1N0cmluZ1swXSA9PT0gXCI/XCIpIHtcbiAgICBwYXJhbWV0ZXJzU3RyaW5nID0gcGFyYW1ldGVyc1N0cmluZy5zbGljZSgxKTtcbiAgfVxuICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzU3RyaW5nLnNwbGl0KFwiJlwiKSkge1xuICAgIGNvbnN0IHMgPSBwYXJhbWV0ZXIubWF0Y2goLyhbXj1dKyk9PyguKikvKSB8fCBbXTtcbiAgICBpZiAocy5sZW5ndGggPCAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gZGVjb2RlUXVlcnlLZXkoc1sxXSk7XG4gICAgaWYgKGtleSA9PT0gXCJfX3Byb3RvX19cIiB8fCBrZXkgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlUXVlcnlWYWx1ZShzWzJdIHx8IFwiXCIpO1xuICAgIGlmIChvYmplY3Rba2V5XSA9PT0gdm9pZCAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgIG9iamVjdFtrZXldLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3Rba2V5XSA9IFtvYmplY3Rba2V5XSwgdmFsdWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuZnVuY3Rpb24gZW5jb2RlUXVlcnlJdGVtKGtleSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICB9XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlUXVlcnlLZXkoa2V5KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChfdmFsdWUpID0+IGAke2VuY29kZVF1ZXJ5S2V5KGtleSl9PSR7ZW5jb2RlUXVlcnlWYWx1ZShfdmFsdWUpfWApLmpvaW4oXCImXCIpO1xuICB9XG4gIHJldHVybiBgJHtlbmNvZGVRdWVyeUtleShrZXkpfT0ke2VuY29kZVF1ZXJ5VmFsdWUodmFsdWUpfWA7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlRdWVyeShxdWVyeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMocXVlcnkpLmZpbHRlcigoaykgPT4gcXVlcnlba10gIT09IHZvaWQgMCkubWFwKChrKSA9PiBlbmNvZGVRdWVyeUl0ZW0oaywgcXVlcnlba10pKS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiZcIik7XG59XG5cbmNvbnN0IFBST1RPQ09MX1NUUklDVF9SRUdFWCA9IC9eW1xcc1xcd1xcMCsuLV17Mix9OihbL1xcXFxdezEsMn0pLztcbmNvbnN0IFBST1RPQ09MX1JFR0VYID0gL15bXFxzXFx3XFwwKy4tXXsyLH06KFsvXFxcXF17Mn0pPy87XG5jb25zdCBQUk9UT0NPTF9SRUxBVElWRV9SRUdFWCA9IC9eKFsvXFxcXF1cXHMqKXsyLH1bXi9cXFxcXS87XG5jb25zdCBQUk9UT0NPTF9TQ1JJUFRfUkUgPSAvXltcXHNcXDBdKihibG9ifGRhdGF8amF2YXNjcmlwdHx2YnNjcmlwdCk6JC9pO1xuY29uc3QgVFJBSUxJTkdfU0xBU0hfUkUgPSAvXFwvJHxcXC9cXD98XFwvIy87XG5jb25zdCBKT0lOX0xFQURJTkdfU0xBU0hfUkUgPSAvXlxcLj9cXC8vO1xuZnVuY3Rpb24gaXNSZWxhdGl2ZShpbnB1dFN0cmluZykge1xuICByZXR1cm4gW1wiLi9cIiwgXCIuLi9cIl0uc29tZSgoc3RyaW5nXykgPT4gaW5wdXRTdHJpbmcuc3RhcnRzV2l0aChzdHJpbmdfKSk7XG59XG5mdW5jdGlvbiBoYXNQcm90b2NvbChpbnB1dFN0cmluZywgb3B0cyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICBvcHRzID0geyBhY2NlcHRSZWxhdGl2ZTogb3B0cyB9O1xuICB9XG4gIGlmIChvcHRzLnN0cmljdCkge1xuICAgIHJldHVybiBQUk9UT0NPTF9TVFJJQ1RfUkVHRVgudGVzdChpbnB1dFN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIFBST1RPQ09MX1JFR0VYLnRlc3QoaW5wdXRTdHJpbmcpIHx8IChvcHRzLmFjY2VwdFJlbGF0aXZlID8gUFJPVE9DT0xfUkVMQVRJVkVfUkVHRVgudGVzdChpbnB1dFN0cmluZykgOiBmYWxzZSk7XG59XG5mdW5jdGlvbiBpc1NjcmlwdFByb3RvY29sKHByb3RvY29sKSB7XG4gIHJldHVybiAhIXByb3RvY29sICYmIFBST1RPQ09MX1NDUklQVF9SRS50ZXN0KHByb3RvY29sKTtcbn1cbmZ1bmN0aW9uIGhhc1RyYWlsaW5nU2xhc2goaW5wdXQgPSBcIlwiLCByZXNwZWN0UXVlcnlBbmRGcmFnbWVudCkge1xuICBpZiAoIXJlc3BlY3RRdWVyeUFuZEZyYWdtZW50KSB7XG4gICAgcmV0dXJuIGlucHV0LmVuZHNXaXRoKFwiL1wiKTtcbiAgfVxuICByZXR1cm4gVFJBSUxJTkdfU0xBU0hfUkUudGVzdChpbnB1dCk7XG59XG5mdW5jdGlvbiB3aXRob3V0VHJhaWxpbmdTbGFzaChpbnB1dCA9IFwiXCIsIHJlc3BlY3RRdWVyeUFuZEZyYWdtZW50KSB7XG4gIGlmICghcmVzcGVjdFF1ZXJ5QW5kRnJhZ21lbnQpIHtcbiAgICByZXR1cm4gKGhhc1RyYWlsaW5nU2xhc2goaW5wdXQpID8gaW5wdXQuc2xpY2UoMCwgLTEpIDogaW5wdXQpIHx8IFwiL1wiO1xuICB9XG4gIGlmICghaGFzVHJhaWxpbmdTbGFzaChpbnB1dCwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gaW5wdXQgfHwgXCIvXCI7XG4gIH1cbiAgbGV0IHBhdGggPSBpbnB1dDtcbiAgbGV0IGZyYWdtZW50ID0gXCJcIjtcbiAgY29uc3QgZnJhZ21lbnRJbmRleCA9IGlucHV0LmluZGV4T2YoXCIjXCIpO1xuICBpZiAoZnJhZ21lbnRJbmRleCA+PSAwKSB7XG4gICAgcGF0aCA9IGlucHV0LnNsaWNlKDAsIGZyYWdtZW50SW5kZXgpO1xuICAgIGZyYWdtZW50ID0gaW5wdXQuc2xpY2UoZnJhZ21lbnRJbmRleCk7XG4gIH1cbiAgY29uc3QgW3MwLCAuLi5zXSA9IHBhdGguc3BsaXQoXCI/XCIpO1xuICBjb25zdCBjbGVhblBhdGggPSBzMC5lbmRzV2l0aChcIi9cIikgPyBzMC5zbGljZSgwLCAtMSkgOiBzMDtcbiAgcmV0dXJuIChjbGVhblBhdGggfHwgXCIvXCIpICsgKHMubGVuZ3RoID4gMCA/IGA/JHtzLmpvaW4oXCI/XCIpfWAgOiBcIlwiKSArIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gd2l0aFRyYWlsaW5nU2xhc2goaW5wdXQgPSBcIlwiLCByZXNwZWN0UXVlcnlBbmRGcmFnbWVudCkge1xuICBpZiAoIXJlc3BlY3RRdWVyeUFuZEZyYWdtZW50KSB7XG4gICAgcmV0dXJuIGlucHV0LmVuZHNXaXRoKFwiL1wiKSA/IGlucHV0IDogaW5wdXQgKyBcIi9cIjtcbiAgfVxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaChpbnB1dCwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gaW5wdXQgfHwgXCIvXCI7XG4gIH1cbiAgbGV0IHBhdGggPSBpbnB1dDtcbiAgbGV0IGZyYWdtZW50ID0gXCJcIjtcbiAgY29uc3QgZnJhZ21lbnRJbmRleCA9IGlucHV0LmluZGV4T2YoXCIjXCIpO1xuICBpZiAoZnJhZ21lbnRJbmRleCA+PSAwKSB7XG4gICAgcGF0aCA9IGlucHV0LnNsaWNlKDAsIGZyYWdtZW50SW5kZXgpO1xuICAgIGZyYWdtZW50ID0gaW5wdXQuc2xpY2UoZnJhZ21lbnRJbmRleCk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IFtzMCwgLi4uc10gPSBwYXRoLnNwbGl0KFwiP1wiKTtcbiAgcmV0dXJuIHMwICsgXCIvXCIgKyAocy5sZW5ndGggPiAwID8gYD8ke3Muam9pbihcIj9cIil9YCA6IFwiXCIpICsgZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiBoYXNMZWFkaW5nU2xhc2goaW5wdXQgPSBcIlwiKSB7XG4gIHJldHVybiBpbnB1dC5zdGFydHNXaXRoKFwiL1wiKTtcbn1cbmZ1bmN0aW9uIHdpdGhvdXRMZWFkaW5nU2xhc2goaW5wdXQgPSBcIlwiKSB7XG4gIHJldHVybiAoaGFzTGVhZGluZ1NsYXNoKGlucHV0KSA/IGlucHV0LnNsaWNlKDEpIDogaW5wdXQpIHx8IFwiL1wiO1xufVxuZnVuY3Rpb24gd2l0aExlYWRpbmdTbGFzaChpbnB1dCA9IFwiXCIpIHtcbiAgcmV0dXJuIGhhc0xlYWRpbmdTbGFzaChpbnB1dCkgPyBpbnB1dCA6IFwiL1wiICsgaW5wdXQ7XG59XG5mdW5jdGlvbiBjbGVhbkRvdWJsZVNsYXNoZXMoaW5wdXQgPSBcIlwiKSB7XG4gIHJldHVybiBpbnB1dC5zcGxpdChcIjovL1wiKS5tYXAoKHN0cmluZ18pID0+IHN0cmluZ18ucmVwbGFjZSgvXFwvezIsfS9nLCBcIi9cIikpLmpvaW4oXCI6Ly9cIik7XG59XG5mdW5jdGlvbiB3aXRoQmFzZShpbnB1dCwgYmFzZSkge1xuICBpZiAoaXNFbXB0eVVSTChiYXNlKSB8fCBoYXNQcm90b2NvbChpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgY29uc3QgX2Jhc2UgPSB3aXRob3V0VHJhaWxpbmdTbGFzaChiYXNlKTtcbiAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoX2Jhc2UpKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIHJldHVybiBqb2luVVJMKF9iYXNlLCBpbnB1dCk7XG59XG5mdW5jdGlvbiB3aXRob3V0QmFzZShpbnB1dCwgYmFzZSkge1xuICBpZiAoaXNFbXB0eVVSTChiYXNlKSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBjb25zdCBfYmFzZSA9IHdpdGhvdXRUcmFpbGluZ1NsYXNoKGJhc2UpO1xuICBpZiAoIWlucHV0LnN0YXJ0c1dpdGgoX2Jhc2UpKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC5zbGljZShfYmFzZS5sZW5ndGgpO1xuICByZXR1cm4gdHJpbW1lZFswXSA9PT0gXCIvXCIgPyB0cmltbWVkIDogXCIvXCIgKyB0cmltbWVkO1xufVxuZnVuY3Rpb24gd2l0aFF1ZXJ5KGlucHV0LCBxdWVyeSkge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVVSTChpbnB1dCk7XG4gIGNvbnN0IG1lcmdlZFF1ZXJ5ID0geyAuLi5wYXJzZVF1ZXJ5KHBhcnNlZC5zZWFyY2gpLCAuLi5xdWVyeSB9O1xuICBwYXJzZWQuc2VhcmNoID0gc3RyaW5naWZ5UXVlcnkobWVyZ2VkUXVlcnkpO1xuICByZXR1cm4gc3RyaW5naWZ5UGFyc2VkVVJMKHBhcnNlZCk7XG59XG5mdW5jdGlvbiBnZXRRdWVyeShpbnB1dCkge1xuICByZXR1cm4gcGFyc2VRdWVyeShwYXJzZVVSTChpbnB1dCkuc2VhcmNoKTtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlVUkwodXJsKSB7XG4gIHJldHVybiAhdXJsIHx8IHVybCA9PT0gXCIvXCI7XG59XG5mdW5jdGlvbiBpc05vbkVtcHR5VVJMKHVybCkge1xuICByZXR1cm4gdXJsICYmIHVybCAhPT0gXCIvXCI7XG59XG5mdW5jdGlvbiBqb2luVVJMKGJhc2UsIC4uLmlucHV0KSB7XG4gIGxldCB1cmwgPSBiYXNlIHx8IFwiXCI7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBpbnB1dC5maWx0ZXIoKHVybDIpID0+IGlzTm9uRW1wdHlVUkwodXJsMikpKSB7XG4gICAgaWYgKHVybCkge1xuICAgICAgY29uc3QgX3NlZ21lbnQgPSBzZWdtZW50LnJlcGxhY2UoSk9JTl9MRUFESU5HX1NMQVNIX1JFLCBcIlwiKTtcbiAgICAgIHVybCA9IHdpdGhUcmFpbGluZ1NsYXNoKHVybCkgKyBfc2VnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gc2VnbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cbmZ1bmN0aW9uIGpvaW5SZWxhdGl2ZVVSTCguLi5faW5wdXQpIHtcbiAgY29uc3QgSk9JTl9TRUdNRU5UX1NQTElUX1JFID0gL1xcLyg/IVxcLykvO1xuICBjb25zdCBpbnB1dCA9IF9pbnB1dC5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHNlZ21lbnRzID0gW107XG4gIGxldCBzZWdtZW50c0RlcHRoID0gMDtcbiAgZm9yIChjb25zdCBpIG9mIGlucHV0KSB7XG4gICAgaWYgKCFpIHx8IGkgPT09IFwiL1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbc2luZGV4LCBzXSBvZiBpLnNwbGl0KEpPSU5fU0VHTUVOVF9TUExJVF9SRSkuZW50cmllcygpKSB7XG4gICAgICBpZiAoIXMgfHwgcyA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocyA9PT0gXCIuLlwiKSB7XG4gICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgaGFzUHJvdG9jb2woc2VnbWVudHNbMF0pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudHMucG9wKCk7XG4gICAgICAgIHNlZ21lbnRzRGVwdGgtLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2luZGV4ID09PSAxICYmIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdPy5lbmRzV2l0aChcIjovXCIpKSB7XG4gICAgICAgIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdICs9IFwiL1wiICsgcztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWdtZW50cy5wdXNoKHMpO1xuICAgICAgc2VnbWVudHNEZXB0aCsrO1xuICAgIH1cbiAgfVxuICBsZXQgdXJsID0gc2VnbWVudHMuam9pbihcIi9cIik7XG4gIGlmIChzZWdtZW50c0RlcHRoID49IDApIHtcbiAgICBpZiAoaW5wdXRbMF0/LnN0YXJ0c1dpdGgoXCIvXCIpICYmICF1cmwuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHVybCA9IFwiL1wiICsgdXJsO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRbMF0/LnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdXJsLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgICAgdXJsID0gXCIuL1wiICsgdXJsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB1cmwgPSBcIi4uL1wiLnJlcGVhdCgtMSAqIHNlZ21lbnRzRGVwdGgpICsgdXJsO1xuICB9XG4gIGlmIChpbnB1dFtpbnB1dC5sZW5ndGggLSAxXT8uZW5kc1dpdGgoXCIvXCIpICYmICF1cmwuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgdXJsICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5mdW5jdGlvbiB3aXRoSHR0cChpbnB1dCkge1xuICByZXR1cm4gd2l0aFByb3RvY29sKGlucHV0LCBcImh0dHA6Ly9cIik7XG59XG5mdW5jdGlvbiB3aXRoSHR0cHMoaW5wdXQpIHtcbiAgcmV0dXJuIHdpdGhQcm90b2NvbChpbnB1dCwgXCJodHRwczovL1wiKTtcbn1cbmZ1bmN0aW9uIHdpdGhvdXRQcm90b2NvbChpbnB1dCkge1xuICByZXR1cm4gd2l0aFByb3RvY29sKGlucHV0LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIHdpdGhQcm90b2NvbChpbnB1dCwgcHJvdG9jb2wpIHtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChQUk9UT0NPTF9SRUdFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gcHJvdG9jb2wgKyBpbnB1dDtcbiAgfVxuICByZXR1cm4gcHJvdG9jb2wgKyBpbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVVJMKGlucHV0KSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlVVJMKGlucHV0KTtcbiAgcGFyc2VkLnBhdGhuYW1lID0gZW5jb2RlUGF0aChkZWNvZGVQYXRoKHBhcnNlZC5wYXRobmFtZSkpO1xuICBwYXJzZWQuaGFzaCA9IGVuY29kZUhhc2goZGVjb2RlKHBhcnNlZC5oYXNoKSk7XG4gIHBhcnNlZC5ob3N0ID0gZW5jb2RlSG9zdChkZWNvZGUocGFyc2VkLmhvc3QpKTtcbiAgcGFyc2VkLnNlYXJjaCA9IHN0cmluZ2lmeVF1ZXJ5KHBhcnNlUXVlcnkocGFyc2VkLnNlYXJjaCkpO1xuICByZXR1cm4gc3RyaW5naWZ5UGFyc2VkVVJMKHBhcnNlZCk7XG59XG5mdW5jdGlvbiByZXNvbHZlVVJMKGJhc2UgPSBcIlwiLCAuLi5pbnB1dHMpIHtcbiAgaWYgKHR5cGVvZiBiYXNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBVUkwgaW5wdXQgc2hvdWxkIGJlIHN0cmluZyByZWNlaXZlZCAke3R5cGVvZiBiYXNlfSAoJHtiYXNlfSlgXG4gICAgKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZElucHV0cyA9IGlucHV0cy5maWx0ZXIoKGlucHV0KSA9PiBpc05vbkVtcHR5VVJMKGlucHV0KSk7XG4gIGlmIChmaWx0ZXJlZElucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICBjb25zdCB1cmwgPSBwYXJzZVVSTChiYXNlKTtcbiAgZm9yIChjb25zdCBpbnB1dFNlZ21lbnQgb2YgZmlsdGVyZWRJbnB1dHMpIHtcbiAgICBjb25zdCB1cmxTZWdtZW50ID0gcGFyc2VVUkwoaW5wdXRTZWdtZW50KTtcbiAgICBpZiAodXJsU2VnbWVudC5wYXRobmFtZSkge1xuICAgICAgdXJsLnBhdGhuYW1lID0gd2l0aFRyYWlsaW5nU2xhc2godXJsLnBhdGhuYW1lKSArIHdpdGhvdXRMZWFkaW5nU2xhc2godXJsU2VnbWVudC5wYXRobmFtZSk7XG4gICAgfVxuICAgIGlmICh1cmxTZWdtZW50Lmhhc2ggJiYgdXJsU2VnbWVudC5oYXNoICE9PSBcIiNcIikge1xuICAgICAgdXJsLmhhc2ggPSB1cmxTZWdtZW50Lmhhc2g7XG4gICAgfVxuICAgIGlmICh1cmxTZWdtZW50LnNlYXJjaCAmJiB1cmxTZWdtZW50LnNlYXJjaCAhPT0gXCI/XCIpIHtcbiAgICAgIGlmICh1cmwuc2VhcmNoICYmIHVybC5zZWFyY2ggIT09IFwiP1wiKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gc3RyaW5naWZ5UXVlcnkoe1xuICAgICAgICAgIC4uLnBhcnNlUXVlcnkodXJsLnNlYXJjaCksXG4gICAgICAgICAgLi4ucGFyc2VRdWVyeSh1cmxTZWdtZW50LnNlYXJjaClcbiAgICAgICAgfSk7XG4gICAgICAgIHVybC5zZWFyY2ggPSBxdWVyeVN0cmluZy5sZW5ndGggPiAwID8gXCI/XCIgKyBxdWVyeVN0cmluZyA6IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwuc2VhcmNoID0gdXJsU2VnbWVudC5zZWFyY2g7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmdpZnlQYXJzZWRVUkwodXJsKTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVBhdGgocDEsIHAyKSB7XG4gIHJldHVybiBkZWNvZGUod2l0aG91dFRyYWlsaW5nU2xhc2gocDEpKSA9PT0gZGVjb2RlKHdpdGhvdXRUcmFpbGluZ1NsYXNoKHAyKSk7XG59XG5mdW5jdGlvbiBpc0VxdWFsKGEsIGIsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoIW9wdGlvbnMudHJhaWxpbmdTbGFzaCkge1xuICAgIGEgPSB3aXRoVHJhaWxpbmdTbGFzaChhKTtcbiAgICBiID0gd2l0aFRyYWlsaW5nU2xhc2goYik7XG4gIH1cbiAgaWYgKCFvcHRpb25zLmxlYWRpbmdTbGFzaCkge1xuICAgIGEgPSB3aXRoTGVhZGluZ1NsYXNoKGEpO1xuICAgIGIgPSB3aXRoTGVhZGluZ1NsYXNoKGIpO1xuICB9XG4gIGlmICghb3B0aW9ucy5lbmNvZGluZykge1xuICAgIGEgPSBkZWNvZGUoYSk7XG4gICAgYiA9IGRlY29kZShiKTtcbiAgfVxuICByZXR1cm4gYSA9PT0gYjtcbn1cbmZ1bmN0aW9uIHdpdGhGcmFnbWVudChpbnB1dCwgaGFzaCkge1xuICBpZiAoIWhhc2ggfHwgaGFzaCA9PT0gXCIjXCIpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VVUkwoaW5wdXQpO1xuICBwYXJzZWQuaGFzaCA9IGhhc2ggPT09IFwiXCIgPyBcIlwiIDogXCIjXCIgKyBlbmNvZGVIYXNoKGhhc2gpO1xuICByZXR1cm4gc3RyaW5naWZ5UGFyc2VkVVJMKHBhcnNlZCk7XG59XG5mdW5jdGlvbiB3aXRob3V0RnJhZ21lbnQoaW5wdXQpIHtcbiAgcmV0dXJuIHN0cmluZ2lmeVBhcnNlZFVSTCh7IC4uLnBhcnNlVVJMKGlucHV0KSwgaGFzaDogXCJcIiB9KTtcbn1cbmZ1bmN0aW9uIHdpdGhvdXRIb3N0KGlucHV0KSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlVVJMKGlucHV0KTtcbiAgcmV0dXJuIChwYXJzZWQucGF0aG5hbWUgfHwgXCIvXCIpICsgcGFyc2VkLnNlYXJjaCArIHBhcnNlZC5oYXNoO1xufVxuXG5jb25zdCBwcm90b2NvbFJlbGF0aXZlID0gU3ltYm9sLmZvcihcInVmbzpwcm90b2NvbFJlbGF0aXZlXCIpO1xuZnVuY3Rpb24gcGFyc2VVUkwoaW5wdXQgPSBcIlwiLCBkZWZhdWx0UHJvdG8pIHtcbiAgY29uc3QgX3NwZWNpYWxQcm90b01hdGNoID0gaW5wdXQubWF0Y2goXG4gICAgL15bXFxzXFwwXSooYmxvYjp8ZGF0YTp8amF2YXNjcmlwdDp8dmJzY3JpcHQ6KSguKikvaVxuICApO1xuICBpZiAoX3NwZWNpYWxQcm90b01hdGNoKSB7XG4gICAgY29uc3QgWywgX3Byb3RvLCBfcGF0aG5hbWUgPSBcIlwiXSA9IF9zcGVjaWFsUHJvdG9NYXRjaDtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IF9wcm90by50b0xvd2VyQ2FzZSgpLFxuICAgICAgcGF0aG5hbWU6IF9wYXRobmFtZSxcbiAgICAgIGhyZWY6IF9wcm90byArIF9wYXRobmFtZSxcbiAgICAgIGF1dGg6IFwiXCIsXG4gICAgICBob3N0OiBcIlwiLFxuICAgICAgc2VhcmNoOiBcIlwiLFxuICAgICAgaGFzaDogXCJcIlxuICAgIH07XG4gIH1cbiAgaWYgKCFoYXNQcm90b2NvbChpbnB1dCwgeyBhY2NlcHRSZWxhdGl2ZTogdHJ1ZSB9KSkge1xuICAgIHJldHVybiBkZWZhdWx0UHJvdG8gPyBwYXJzZVVSTChkZWZhdWx0UHJvdG8gKyBpbnB1dCkgOiBwYXJzZVBhdGgoaW5wdXQpO1xuICB9XG4gIGNvbnN0IFssIHByb3RvY29sID0gXCJcIiwgYXV0aCwgaG9zdEFuZFBhdGggPSBcIlwiXSA9IGlucHV0LnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLm1hdGNoKC9eW1xcc1xcMF0qKFtcXHcrLi1dezIsfTopP1xcL1xcLyhbXi9AXStAKT8oLiopLykgfHwgW107XG4gIGNvbnN0IFssIGhvc3QgPSBcIlwiLCBwYXRoID0gXCJcIl0gPSBob3N0QW5kUGF0aC5tYXRjaCgvKFteIy8/XSopKC4qKT8vKSB8fCBbXTtcbiAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0gPSBwYXJzZVBhdGgoXG4gICAgcGF0aC5yZXBsYWNlKC9cXC8oPz1bQS1aYS16XTopLywgXCJcIilcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBwcm90b2NvbDogcHJvdG9jb2wudG9Mb3dlckNhc2UoKSxcbiAgICBhdXRoOiBhdXRoID8gYXV0aC5zbGljZSgwLCBNYXRoLm1heCgwLCBhdXRoLmxlbmd0aCAtIDEpKSA6IFwiXCIsXG4gICAgaG9zdCxcbiAgICBwYXRobmFtZSxcbiAgICBzZWFyY2gsXG4gICAgaGFzaCxcbiAgICBbcHJvdG9jb2xSZWxhdGl2ZV06ICFwcm90b2NvbFxuICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQYXRoKGlucHV0ID0gXCJcIikge1xuICBjb25zdCBbcGF0aG5hbWUgPSBcIlwiLCBzZWFyY2ggPSBcIlwiLCBoYXNoID0gXCJcIl0gPSAoaW5wdXQubWF0Y2goLyhbXiM/XSopKFxcP1teI10qKT8oIy4qKT8vKSB8fCBbXSkuc3BsaWNlKDEpO1xuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lLFxuICAgIHNlYXJjaCxcbiAgICBoYXNoXG4gIH07XG59XG5mdW5jdGlvbiBwYXJzZUF1dGgoaW5wdXQgPSBcIlwiKSB7XG4gIGNvbnN0IFt1c2VybmFtZSwgcGFzc3dvcmRdID0gaW5wdXQuc3BsaXQoXCI6XCIpO1xuICByZXR1cm4ge1xuICAgIHVzZXJuYW1lOiBkZWNvZGUodXNlcm5hbWUpLFxuICAgIHBhc3N3b3JkOiBkZWNvZGUocGFzc3dvcmQpXG4gIH07XG59XG5mdW5jdGlvbiBwYXJzZUhvc3QoaW5wdXQgPSBcIlwiKSB7XG4gIGNvbnN0IFtob3N0bmFtZSwgcG9ydF0gPSAoaW5wdXQubWF0Y2goLyhbXi86XSopOj8oXFxkKyk/LykgfHwgW10pLnNwbGljZSgxKTtcbiAgcmV0dXJuIHtcbiAgICBob3N0bmFtZTogZGVjb2RlKGhvc3RuYW1lKSxcbiAgICBwb3J0XG4gIH07XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlQYXJzZWRVUkwocGFyc2VkKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gcGFyc2VkLnBhdGhuYW1lIHx8IFwiXCI7XG4gIGNvbnN0IHNlYXJjaCA9IHBhcnNlZC5zZWFyY2ggPyAocGFyc2VkLnNlYXJjaC5zdGFydHNXaXRoKFwiP1wiKSA/IFwiXCIgOiBcIj9cIikgKyBwYXJzZWQuc2VhcmNoIDogXCJcIjtcbiAgY29uc3QgaGFzaCA9IHBhcnNlZC5oYXNoIHx8IFwiXCI7XG4gIGNvbnN0IGF1dGggPSBwYXJzZWQuYXV0aCA/IHBhcnNlZC5hdXRoICsgXCJAXCIgOiBcIlwiO1xuICBjb25zdCBob3N0ID0gcGFyc2VkLmhvc3QgfHwgXCJcIjtcbiAgY29uc3QgcHJvdG8gPSBwYXJzZWQucHJvdG9jb2wgfHwgcGFyc2VkW3Byb3RvY29sUmVsYXRpdmVdID8gKHBhcnNlZC5wcm90b2NvbCB8fCBcIlwiKSArIFwiLy9cIiA6IFwiXCI7XG4gIHJldHVybiBwcm90byArIGF1dGggKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufVxuY29uc3QgRklMRU5BTUVfU1RSSUNUX1JFR0VYID0gL1xcLyhbXi9dK1xcLlteL10rKSQvO1xuY29uc3QgRklMRU5BTUVfUkVHRVggPSAvXFwvKFteL10rKSQvO1xuZnVuY3Rpb24gcGFyc2VGaWxlbmFtZShpbnB1dCA9IFwiXCIsIHsgc3RyaWN0IH0pIHtcbiAgY29uc3QgeyBwYXRobmFtZSB9ID0gcGFyc2VVUkwoaW5wdXQpO1xuICBjb25zdCBtYXRjaGVzID0gc3RyaWN0ID8gcGF0aG5hbWUubWF0Y2goRklMRU5BTUVfU1RSSUNUX1JFR0VYKSA6IHBhdGhuYW1lLm1hdGNoKEZJTEVOQU1FX1JFR0VYKTtcbiAgcmV0dXJuIG1hdGNoZXMgPyBtYXRjaGVzWzFdIDogdm9pZCAwO1xufVxuXG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fcHVibGljRmllbGQgPSAob2JqLCBrZXksIHZhbHVlKSA9PiB7XG4gIF9fZGVmTm9ybWFsUHJvcChvYmosIHR5cGVvZiBrZXkgIT09IFwic3ltYm9sXCIgPyBrZXkgKyBcIlwiIDoga2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5jbGFzcyAkVVJMIHtcbiAgY29uc3RydWN0b3IoaW5wdXQgPSBcIlwiKSB7XG4gICAgX19wdWJsaWNGaWVsZCh0aGlzLCBcInByb3RvY29sXCIpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJob3N0XCIpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJhdXRoXCIpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJwYXRobmFtZVwiKTtcbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwicXVlcnlcIiwge30pO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJoYXNoXCIpO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBVUkwgaW5wdXQgc2hvdWxkIGJlIHN0cmluZyByZWNlaXZlZCAke3R5cGVvZiBpbnB1dH0gKCR7aW5wdXR9KWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVVJMKGlucHV0KTtcbiAgICB0aGlzLnByb3RvY29sID0gZGVjb2RlKHBhcnNlZC5wcm90b2NvbCk7XG4gICAgdGhpcy5ob3N0ID0gZGVjb2RlKHBhcnNlZC5ob3N0KTtcbiAgICB0aGlzLmF1dGggPSBkZWNvZGUocGFyc2VkLmF1dGgpO1xuICAgIHRoaXMucGF0aG5hbWUgPSBkZWNvZGVQYXRoKHBhcnNlZC5wYXRobmFtZSk7XG4gICAgdGhpcy5xdWVyeSA9IHBhcnNlUXVlcnkocGFyc2VkLnNlYXJjaCk7XG4gICAgdGhpcy5oYXNoID0gZGVjb2RlKHBhcnNlZC5oYXNoKTtcbiAgfVxuICBnZXQgaG9zdG5hbWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSG9zdCh0aGlzLmhvc3QpLmhvc3RuYW1lO1xuICB9XG4gIGdldCBwb3J0KCkge1xuICAgIHJldHVybiBwYXJzZUhvc3QodGhpcy5ob3N0KS5wb3J0IHx8IFwiXCI7XG4gIH1cbiAgZ2V0IHVzZXJuYW1lKCkge1xuICAgIHJldHVybiBwYXJzZUF1dGgodGhpcy5hdXRoKS51c2VybmFtZTtcbiAgfVxuICBnZXQgcGFzc3dvcmQoKSB7XG4gICAgcmV0dXJuIHBhcnNlQXV0aCh0aGlzLmF1dGgpLnBhc3N3b3JkIHx8IFwiXCI7XG4gIH1cbiAgZ2V0IGhhc1Byb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sLmxlbmd0aDtcbiAgfVxuICBnZXQgaXNBYnNvbHV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm90b2NvbCB8fCB0aGlzLnBhdGhuYW1lWzBdID09PSBcIi9cIjtcbiAgfVxuICBnZXQgc2VhcmNoKCkge1xuICAgIGNvbnN0IHEgPSBzdHJpbmdpZnlRdWVyeSh0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gcS5sZW5ndGggPiAwID8gXCI/XCIgKyBxIDogXCJcIjtcbiAgfVxuICBnZXQgc2VhcmNoUGFyYW1zKCkge1xuICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMucXVlcnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5xdWVyeVtuYW1lXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICAgICAgICBwLmFwcGVuZChuYW1lLCB2KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcC5hcHBlbmQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfVxuICBnZXQgb3JpZ2luKCkge1xuICAgIHJldHVybiAodGhpcy5wcm90b2NvbCA/IHRoaXMucHJvdG9jb2wgKyBcIi8vXCIgOiBcIlwiKSArIGVuY29kZUhvc3QodGhpcy5ob3N0KTtcbiAgfVxuICBnZXQgZnVsbHBhdGgoKSB7XG4gICAgcmV0dXJuIGVuY29kZVBhdGgodGhpcy5wYXRobmFtZSkgKyB0aGlzLnNlYXJjaCArIGVuY29kZUhhc2godGhpcy5oYXNoKTtcbiAgfVxuICBnZXQgZW5jb2RlZEF1dGgoKSB7XG4gICAgaWYgKCF0aGlzLmF1dGgpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCB7IHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcGFyc2VBdXRoKHRoaXMuYXV0aCk7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSkgKyAocGFzc3dvcmQgPyBcIjpcIiArIGVuY29kZVVSSUNvbXBvbmVudChwYXNzd29yZCkgOiBcIlwiKTtcbiAgfVxuICBnZXQgaHJlZigpIHtcbiAgICBjb25zdCBhdXRoID0gdGhpcy5lbmNvZGVkQXV0aDtcbiAgICBjb25zdCBvcmlnaW5XaXRoQXV0aCA9ICh0aGlzLnByb3RvY29sID8gdGhpcy5wcm90b2NvbCArIFwiLy9cIiA6IFwiXCIpICsgKGF1dGggPyBhdXRoICsgXCJAXCIgOiBcIlwiKSArIGVuY29kZUhvc3QodGhpcy5ob3N0KTtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm90b2NvbCAmJiB0aGlzLmlzQWJzb2x1dGUgPyBvcmlnaW5XaXRoQXV0aCArIHRoaXMuZnVsbHBhdGggOiB0aGlzLmZ1bGxwYXRoO1xuICB9XG4gIGFwcGVuZCh1cmwpIHtcbiAgICBpZiAodXJsLmhhc1Byb3RvY29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYXBwZW5kIGEgVVJMIHdpdGggcHJvdG9jb2xcIik7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5xdWVyeSwgdXJsLnF1ZXJ5KTtcbiAgICBpZiAodXJsLnBhdGhuYW1lKSB7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gd2l0aFRyYWlsaW5nU2xhc2godGhpcy5wYXRobmFtZSkgKyB3aXRob3V0TGVhZGluZ1NsYXNoKHVybC5wYXRobmFtZSk7XG4gICAgfVxuICAgIGlmICh1cmwuaGFzaCkge1xuICAgICAgdGhpcy5oYXNoID0gdXJsLmhhc2g7XG4gICAgfVxuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy5ocmVmO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVSTChpbnB1dCkge1xuICByZXR1cm4gbmV3ICRVUkwoaW5wdXQpO1xufVxuXG5leHBvcnQgeyAkVVJMLCBjbGVhbkRvdWJsZVNsYXNoZXMsIGNyZWF0ZVVSTCwgZGVjb2RlLCBkZWNvZGVQYXRoLCBkZWNvZGVRdWVyeUtleSwgZGVjb2RlUXVlcnlWYWx1ZSwgZW5jb2RlLCBlbmNvZGVIYXNoLCBlbmNvZGVIb3N0LCBlbmNvZGVQYXJhbSwgZW5jb2RlUGF0aCwgZW5jb2RlUXVlcnlJdGVtLCBlbmNvZGVRdWVyeUtleSwgZW5jb2RlUXVlcnlWYWx1ZSwgZ2V0UXVlcnksIGhhc0xlYWRpbmdTbGFzaCwgaGFzUHJvdG9jb2wsIGhhc1RyYWlsaW5nU2xhc2gsIGlzRW1wdHlVUkwsIGlzRXF1YWwsIGlzTm9uRW1wdHlVUkwsIGlzUmVsYXRpdmUsIGlzU2FtZVBhdGgsIGlzU2NyaXB0UHJvdG9jb2wsIGpvaW5SZWxhdGl2ZVVSTCwgam9pblVSTCwgbm9ybWFsaXplVVJMLCBwYXJzZUF1dGgsIHBhcnNlRmlsZW5hbWUsIHBhcnNlSG9zdCwgcGFyc2VQYXRoLCBwYXJzZVF1ZXJ5LCBwYXJzZVVSTCwgcmVzb2x2ZVVSTCwgc3RyaW5naWZ5UGFyc2VkVVJMLCBzdHJpbmdpZnlRdWVyeSwgd2l0aEJhc2UsIHdpdGhGcmFnbWVudCwgd2l0aEh0dHAsIHdpdGhIdHRwcywgd2l0aExlYWRpbmdTbGFzaCwgd2l0aFByb3RvY29sLCB3aXRoUXVlcnksIHdpdGhUcmFpbGluZ1NsYXNoLCB3aXRob3V0QmFzZSwgd2l0aG91dEZyYWdtZW50LCB3aXRob3V0SG9zdCwgd2l0aG91dExlYWRpbmdTbGFzaCwgd2l0aG91dFByb3RvY29sLCB3aXRob3V0VHJhaWxpbmdTbGFzaCB9O1xuIiwiaW1wb3J0IGRlc3RyIGZyb20gJ2Rlc3RyJztcbmltcG9ydCB7IHdpdGhCYXNlLCB3aXRoUXVlcnkgfSBmcm9tICd1Zm8nO1xuXG5jbGFzcyBGZXRjaEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRzKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgb3B0cyk7XG4gICAgdGhpcy5uYW1lID0gXCJGZXRjaEVycm9yXCI7XG4gICAgaWYgKG9wdHM/LmNhdXNlICYmICF0aGlzLmNhdXNlKSB7XG4gICAgICB0aGlzLmNhdXNlID0gb3B0cy5jYXVzZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUZldGNoRXJyb3IoY3R4KSB7XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGN0eC5lcnJvcj8ubWVzc2FnZSB8fCBjdHguZXJyb3I/LnRvU3RyaW5nKCkgfHwgXCJcIjtcbiAgY29uc3QgbWV0aG9kID0gY3R4LnJlcXVlc3Q/Lm1ldGhvZCB8fCBjdHgub3B0aW9ucz8ubWV0aG9kIHx8IFwiR0VUXCI7XG4gIGNvbnN0IHVybCA9IGN0eC5yZXF1ZXN0Py51cmwgfHwgU3RyaW5nKGN0eC5yZXF1ZXN0KSB8fCBcIi9cIjtcbiAgY29uc3QgcmVxdWVzdFN0ciA9IGBbJHttZXRob2R9XSAke0pTT04uc3RyaW5naWZ5KHVybCl9YDtcbiAgY29uc3Qgc3RhdHVzU3RyID0gY3R4LnJlc3BvbnNlID8gYCR7Y3R4LnJlc3BvbnNlLnN0YXR1c30gJHtjdHgucmVzcG9uc2Uuc3RhdHVzVGV4dH1gIDogXCI8bm8gcmVzcG9uc2U+XCI7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtyZXF1ZXN0U3RyfTogJHtzdGF0dXNTdHJ9JHtlcnJvck1lc3NhZ2UgPyBgICR7ZXJyb3JNZXNzYWdlfWAgOiBcIlwifWA7XG4gIGNvbnN0IGZldGNoRXJyb3IgPSBuZXcgRmV0Y2hFcnJvcihcbiAgICBtZXNzYWdlLFxuICAgIGN0eC5lcnJvciA/IHsgY2F1c2U6IGN0eC5lcnJvciB9IDogdm9pZCAwXG4gICk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcInJlcXVlc3RcIiwgXCJvcHRpb25zXCIsIFwicmVzcG9uc2VcIl0pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmV0Y2hFcnJvciwga2V5LCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHJlZktleV0gb2YgW1xuICAgIFtcImRhdGFcIiwgXCJfZGF0YVwiXSxcbiAgICBbXCJzdGF0dXNcIiwgXCJzdGF0dXNcIl0sXG4gICAgW1wic3RhdHVzQ29kZVwiLCBcInN0YXR1c1wiXSxcbiAgICBbXCJzdGF0dXNUZXh0XCIsIFwic3RhdHVzVGV4dFwiXSxcbiAgICBbXCJzdGF0dXNNZXNzYWdlXCIsIFwic3RhdHVzVGV4dFwiXVxuICBdKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZldGNoRXJyb3IsIGtleSwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gY3R4LnJlc3BvbnNlICYmIGN0eC5yZXNwb25zZVtyZWZLZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBmZXRjaEVycm9yO1xufVxuXG5jb25zdCBwYXlsb2FkTWV0aG9kcyA9IG5ldyBTZXQoXG4gIE9iamVjdC5mcmVlemUoW1wiUEFUQ0hcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdKVxuKTtcbmZ1bmN0aW9uIGlzUGF5bG9hZE1ldGhvZChtZXRob2QgPSBcIkdFVFwiKSB7XG4gIHJldHVybiBwYXlsb2FkTWV0aG9kcy5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpO1xufVxuZnVuY3Rpb24gaXNKU09OU2VyaWFsaXphYmxlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZS5idWZmZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiO1xufVxuY29uc3QgdGV4dFR5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcImltYWdlL3N2Z1wiLFxuICBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcImFwcGxpY2F0aW9uL3hodG1sXCIsXG4gIFwiYXBwbGljYXRpb24vaHRtbFwiXG5dKTtcbmNvbnN0IEpTT05fUkUgPSAvXmFwcGxpY2F0aW9uXFwvKD86W1xcdyEjJCUmKi5eYH4tXSpcXCspP2pzb24oOy4rKT8kL2k7XG5mdW5jdGlvbiBkZXRlY3RSZXNwb25zZVR5cGUoX2NvbnRlbnRUeXBlID0gXCJcIikge1xuICBpZiAoIV9jb250ZW50VHlwZSkge1xuICAgIHJldHVybiBcImpzb25cIjtcbiAgfVxuICBjb25zdCBjb250ZW50VHlwZSA9IF9jb250ZW50VHlwZS5zcGxpdChcIjtcIikuc2hpZnQoKSB8fCBcIlwiO1xuICBpZiAoSlNPTl9SRS50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiBcImpzb25cIjtcbiAgfVxuICBpZiAodGV4dFR5cGVzLmhhcyhjb250ZW50VHlwZSkgfHwgY29udGVudFR5cGUuc3RhcnRzV2l0aChcInRleHQvXCIpKSB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIHJldHVybiBcImJsb2JcIjtcbn1cbmZ1bmN0aW9uIG1lcmdlRmV0Y2hPcHRpb25zKGlucHV0LCBkZWZhdWx0cywgSGVhZGVycyA9IGdsb2JhbFRoaXMuSGVhZGVycykge1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uZGVmYXVsdHMsXG4gICAgLi4uaW5wdXRcbiAgfTtcbiAgaWYgKGRlZmF1bHRzPy5wYXJhbXMgJiYgaW5wdXQ/LnBhcmFtcykge1xuICAgIG1lcmdlZC5wYXJhbXMgPSB7XG4gICAgICAuLi5kZWZhdWx0cz8ucGFyYW1zLFxuICAgICAgLi4uaW5wdXQ/LnBhcmFtc1xuICAgIH07XG4gIH1cbiAgaWYgKGRlZmF1bHRzPy5xdWVyeSAmJiBpbnB1dD8ucXVlcnkpIHtcbiAgICBtZXJnZWQucXVlcnkgPSB7XG4gICAgICAuLi5kZWZhdWx0cz8ucXVlcnksXG4gICAgICAuLi5pbnB1dD8ucXVlcnlcbiAgICB9O1xuICB9XG4gIGlmIChkZWZhdWx0cz8uaGVhZGVycyAmJiBpbnB1dD8uaGVhZGVycykge1xuICAgIG1lcmdlZC5oZWFkZXJzID0gbmV3IEhlYWRlcnMoZGVmYXVsdHM/LmhlYWRlcnMgfHwge30pO1xuICAgIGZvciAoY29uc3QgW2tleSwgd