use-fs
Version:
A React hook for integrating with the File System Access API. Enables web applications to seamlessly work with files on a user's local system.
2 lines • 47.3 kB
JavaScript
import Q from"ignore";import{useCallback as E,useEffect as V,useRef as S,useState as B}from"react";var X=async()=>{let t=Q({allowRelativePaths:!0}),r=!1;return{shouldIncludeFile:async(n,i)=>{if(n.endsWith(".gitignore")&&!r&&i.kind==="file"){let s=await(await i.getFile()).text();return t.add(s),r=!0,!1}let{ignored:u}=t.test(n);return!u},shouldProcessDirectory:async(n,i)=>{let{ignored:u}=t.test(n);return n.endsWith(".git")||n.includes(".git/")?!1:!u}}},Y=async()=>{let t=r=>!!(r.includes("/dist/")||r.includes("/out/")||r.includes("/build/")||r.includes("/vendor/")||r.includes("/node_modules/")||r.includes("/.next/"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},ee=async()=>{let t=r=>!!(r.endsWith(".DS_Store")||r.endsWith(".crswap"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},re=[Y,ee,X],j=async(t,r,n,i,u)=>{if(u.has(r))return i;for(let s of n)if(await s.shouldProcessDirectory(r,t)===!1)return u.add(r),i;let x=[];for await(let s of t.values())if(s.kind==="file"){let a=`${r}/${s.name}`;u.has(a)||x.push((async()=>{let c=!0;for(let h of n)if(await h.shouldIncludeFile(a,s)===!1){c=!1,u.add(a),i.delete(a);break}c&&i.set(a,s)})())}await Promise.all(x);let p=[];for await(let s of t.values())if(s.kind==="directory"){let a=`${r}/${s.name}`;u.has(a)||p.push(j(s,a,n,i,u))}return await Promise.all(p),i},te=(t,r)=>{let[n,i]=B(t);return V(()=>{let u=setTimeout(()=>{i(t)},r);return()=>{clearTimeout(u)}},[t,r]),n},ne=100,se=50,ie=50,oe=5e3,ce=t=>{let{onFilesAdded:r,onFilesChanged:n,onFilesDeleted:i,batchSize:u=se,debounceInterval:x=ie}=t,p=S(new Map),s=S(new Map),a=S(new Set),c=S({}),h=S({}),A=S(null),[z,T]=B(new Map),[O,L]=B(!1),b=S(new Map),R=t.fileCacheTtl||oe,W=E(()=>{A.current&&(clearInterval(A.current),A.current=null),p.current.clear(),s.current.clear(),a.current.clear(),c.current={},h.current={},b.current.clear(),T(new Map)},[]),$=E(async()=>{let e=new Map,l=new Set,m=t.filters||re,d=[];for(let F of m)d.push(await F());let f=[];p.current.forEach((F,g)=>{f.push(j(F,g,d,e,l))}),await Promise.all(f),e.forEach((F,g)=>{l.has(g)&&e.delete(g)}),s.current=e},[t.filters]),U=E(async()=>{h.current={...c.current||{}};let e=new Set,l=new Map,m=new Set,d=!1,f=Date.now(),F=Array.from(s.current),g={};for(let o=0;o<F.length;o+=u){let C=F.slice(o,o+u);await Promise.all(C.map(async([y,N])=>{if(N.kind==="file"){e.add(y);try{let I=b.current.get(y);if(I&&f-I.timestamp<R){g[y]=I.content,I.content!==h.current[y]&&l.set(y,I.content);return}let _=await(await N.getFile()).text();b.current.set(y,{content:_,timestamp:f}),g[y]=_,_!==h.current[y]&&l.set(y,_)}catch{s.current.delete(y),m.add(y),b.current.delete(y),d=!0}}}))}let H=Array.from(b.current.entries());for(let[o,{timestamp:C}]of H)f-C>R&&b.current.delete(o);let w=Array.from([...Array.from(a.current),...Array.from(m)]).filter(o=>!e.has(o)),M=Array.from(e).filter(o=>!a.current.has(o)),D=new Map;for(let o of M)D.set(o,c.current[o]);let v=new Map;for(let o of w)v.set(o,c.current[o]),s.current.delete(o),delete c.current[o];let k=new Map(Array.from(a.current).map(o=>[o,c.current[o]]));l.size>0&&(d=!0,n==null||n(l,k)),w.length>0&&(d=!0,i==null||i(v,k)),M.length>0&&(d=!0,r==null||r(D,k)),a.current=e,c.current=g,d&&T(new Map(Object.entries(c.current)))},[r,n,i,u,R]),J=te(z,x),Z=E(()=>{let e=null;A.current||(A.current=setInterval(async()=>{O||e||(L(!0),e=(async()=>{try{await $(),await U()}finally{L(!1),e=null}})())},t.pollInterval||ne))},[$,U,O,t.pollInterval]),q=async()=>{try{let e=await window.showDirectoryPicker();if(!e)return;let l=e.name;p.current.set(l,e),Z()}catch(e){console.error("Error during directory selection:"),console.error(e)}},P=E(async(e,l,m={})=>{if(!e||typeof e!="string")throw new Error("Invalid file path");let{create:d=!0,truncate:f=!1}=m;if(!s.current.get(e)){if(!d)throw new Error(`File not found: ${e}`);let w=e.substring(0,e.lastIndexOf("/")),M=e.substring(e.lastIndexOf("/")+1);if(!(w&&M))throw new Error("Invalid file path structure");let D=p.current.get(w);if(!D)throw new Error(`Directory not found: ${w}`);let v=await D.getFileHandle(M,{create:!0});s.current.set(e,v)}let g=s.current.get(e);if(!g)throw new Error(`File not found: ${e}`);if(g.name!==e.split("/").pop())throw new Error("File path mismatch");let H=await g.createWritable({keepExistingData:!f});try{await H.write(l),await H.close();let w=typeof l=="string"?l:await new Response(l).text();b.current.set(e,{content:w,timestamp:Date.now()});let M=new Map([[e,w]]),D=new Map(Array.from(a.current).map(v=>[v,c.current[v]]));n==null||n(M,D),c.current[e]=w,T(new Map(Object.entries(c.current)))}catch(w){throw await H.abort(),w}},[n]),G=E(async(e,l)=>{let m=e.substring(0,e.lastIndexOf("/")),d=e.substring(e.lastIndexOf("/")+1),f=p.current.get(m);if(!f)throw new Error(`Directory not found: ${m}`);let F=await f.getFileHandle(d,{create:!0});return s.current.set(e,F),l&&await P(e,l,{truncate:!0}),F},[P]),K=E(async e=>{if(!s.current.get(e))throw new Error(`File not found: ${e}`);let m=e.substring(0,e.lastIndexOf("/")),d=e.substring(e.lastIndexOf("/")+1),f=p.current.get(m);if(!f)throw new Error(`Directory not found: ${m}`);await f.removeEntry(d),s.current.delete(e),b.current.delete(e);let F=new Map([[e,c.current[e]]]),g=new Map(Array.from(a.current).map(H=>[H,c.current[H]]));delete c.current[e],a.current.delete(e),i==null||i(F,g),T(new Map(Object.entries(c.current)))},[i]);return ae(()=>{W()}),{handles:s.current,onDirectorySelection:q,onClear:W,files:J,setFiles:T,isProcessing:O,isBrowserSupported:window!==void 0&&"showDirectoryPicker"in window,writeFile:P,createFile:G,deleteFile:K}},ge=ce,le=t=>{V(t,[])},ae=t=>{let r=S(t);r.current=t,le(()=>()=>r.current())};export{re as commonFilters,Y as distFilter,X as gitFilter,ee as miscFilter,j as processDirectory,ce as useFileSystem,ge as useFs};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgaWdub3JlIGZyb20gXCJpZ25vcmVcIjtcbmltcG9ydCB7XG5cdHR5cGUgRWZmZWN0Q2FsbGJhY2ssXG5cdHVzZUNhbGxiYWNrLFxuXHR1c2VFZmZlY3QsXG5cdHVzZVJlZixcblx0dXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgdHlwZSBGaWxlV3JpdGVPcHRpb25zID0ge1xuXHQvKiogV2hldGhlciB0byBjcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCAqL1xuXHRjcmVhdGU/OiBib29sZWFuO1xuXHQvKiogV2hldGhlciB0byB0cnVuY2F0ZSB0aGUgZmlsZSBpZiBpdCBleGlzdHMgKi9cblx0dHJ1bmNhdGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZU9wZXJhdGlvbnMgPSB7XG5cdC8qKiBXcml0ZSBkYXRhIHRvIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0d3JpdGVGaWxlOiAoXG5cdFx0cGF0aDogc3RyaW5nLFxuXHRcdGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYixcblx0XHRvcHRpb25zPzogRmlsZVdyaXRlT3B0aW9ucyxcblx0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDcmVhdGUgYSBuZXcgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0Y3JlYXRlRmlsZTogKFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRpbml0aWFsRGF0YT86IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYixcblx0KSA9PiBQcm9taXNlPEZpbGVTeXN0ZW1GaWxlSGFuZGxlPjtcblxuXHQvKiogRGVsZXRlIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0ZGVsZXRlRmlsZTogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IHtcblx0c2hvdWxkSW5jbHVkZUZpbGU6IChcblx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiAoXG5cdFx0ZmlsZXBhdGg6IHN0cmluZyxcblx0XHRoYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUsXG5cdCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZuID0gKCkgPT4gUHJvbWlzZTxGaWx0ZXI+O1xuXG5leHBvcnQgY29uc3QgZ2l0RmlsdGVyOiBGaWx0ZXJGbiA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgaWcgPSBpZ25vcmUoe1xuXHRcdGFsbG93UmVsYXRpdmVQYXRoczogdHJ1ZSxcblx0fSk7XG5cblx0Ly8gVE9ETyBzdXBwb3J0IG11bHRpcGxlIGdpdGlnbm9yZSBmaWxlc1xuXHRsZXQgZ2l0SWdub3JlTG9hZGVkID0gZmFsc2U7XG5cblx0cmV0dXJuIHtcblx0XHRzaG91bGRJbmNsdWRlRmlsZTogYXN5bmMgKGZpbGVwYXRoOiBzdHJpbmcsIGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmaWxlcGF0aC5lbmRzV2l0aChcIi5naXRpZ25vcmVcIikgJiZcblx0XHRcdFx0IWdpdElnbm9yZUxvYWRlZCAmJlxuXHRcdFx0XHRoYW5kbGUua2luZCA9PT0gXCJmaWxlXCJcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBmaWxlSGFuZGxlID0gaGFuZGxlIGFzIEZpbGVTeXN0ZW1GaWxlSGFuZGxlO1xuXHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG5cdFx0XHRcdGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcblx0XHRcdFx0aWcuYWRkKHRleHQpO1xuXHRcdFx0XHRnaXRJZ25vcmVMb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB7IGlnbm9yZWQgfSA9IGlnLnRlc3QoZmlsZXBhdGgpO1xuXG5cdFx0XHRyZXR1cm4gIWlnbm9yZWQ7XG5cdFx0fSxcblx0XHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiBhc3luYyAoXG5cdFx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdFx0X2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHsgaWdub3JlZCB9ID0gaWcudGVzdChmaWxlcGF0aCk7XG5cblx0XHRcdGlmIChmaWxlcGF0aC5lbmRzV2l0aChcIi5naXRcIikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZXBhdGguaW5jbHVkZXMoXCIuZ2l0L1wiKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhaWdub3JlZDtcblx0XHR9LFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RGaWx0ZXI6IEZpbHRlckZuID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBpc0Rpc3QgPSAoZmlsZXBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi9kaXN0L1wiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi9vdXQvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmluY2x1ZGVzKFwiL2J1aWxkL1wiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi92ZW5kb3IvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmluY2x1ZGVzKFwiL25vZGVfbW9kdWxlcy9cIikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoZmlsZXBhdGguaW5jbHVkZXMoXCIvLm5leHQvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHNob3VsZEluY2x1ZGVGaWxlOiBhc3luYyAoZmlsZXBhdGg6IHN0cmluZywgX2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSkgPT4ge1xuXHRcdFx0aWYgKGlzRGlzdChmaWxlcGF0aCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiBhc3luYyAoXG5cdFx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdFx0X2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0XHQpID0+IHtcblx0XHRcdGlmIChpc0Rpc3QoZmlsZXBhdGgpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgbWlzY0ZpbHRlcjogRmlsdGVyRm4gPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGlzTWlzYyA9IChmaWxlcGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKGZpbGVwYXRoLmVuZHNXaXRoKFwiLkRTX1N0b3JlXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmVuZHNXaXRoKFwiLmNyc3dhcFwiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRzaG91bGRJbmNsdWRlRmlsZTogYXN5bmMgKGZpbGVwYXRoOiBzdHJpbmcsIF9oYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUpID0+IHtcblx0XHRcdGlmIChpc01pc2MoZmlsZXBhdGgpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0c2hvdWxkUHJvY2Vzc0RpcmVjdG9yeTogYXN5bmMgKFxuXHRcdFx0ZmlsZXBhdGg6IHN0cmluZyxcblx0XHRcdF9oYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUsXG5cdFx0KSA9PiB7XG5cdFx0XHRpZiAoaXNNaXNjKGZpbGVwYXRoKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbW1vbkZpbHRlcnMgPSBbZGlzdEZpbHRlciwgbWlzY0ZpbHRlciwgZ2l0RmlsdGVyXTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzRGlyZWN0b3J5ID0gYXN5bmMgKFxuXHRkaXJlY3RvcnlIYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUsXG5cdGRpcmVjdG9yeVBhdGg6IHN0cmluZyxcblx0ZmlsdGVyczogRmlsdGVyW10sXG5cdGluY2x1ZGVGaWxlczogTWFwPHN0cmluZywgRmlsZVN5c3RlbUZpbGVIYW5kbGU+LFxuXHRpZ25vcmVGaWxlUGF0aHM6IFNldDxzdHJpbmc+LFxuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlU3lzdGVtRmlsZUhhbmRsZT4+ID0+IHtcblx0Ly8gRWFybHkgZXhpdCBpZiBkaXJlY3RvcnkgaXMgYWxyZWFkeSBpZ25vcmVkXG5cdGlmIChpZ25vcmVGaWxlUGF0aHMuaGFzKGRpcmVjdG9yeVBhdGgpKSB7XG5cdFx0cmV0dXJuIGluY2x1ZGVGaWxlcztcblx0fVxuXG5cdC8vIENoZWNrIGRpcmVjdG9yeSBhZ2FpbnN0IGZpbHRlcnMgZmlyc3Rcblx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuXHRcdGlmIChcblx0XHRcdChhd2FpdCBmaWx0ZXIuc2hvdWxkUHJvY2Vzc0RpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBkaXJlY3RvcnlIYW5kbGUpKSA9PT1cblx0XHRcdGZhbHNlXG5cdFx0KSB7XG5cdFx0XHRpZ25vcmVGaWxlUGF0aHMuYWRkKGRpcmVjdG9yeVBhdGgpO1xuXHRcdFx0cmV0dXJuIGluY2x1ZGVGaWxlcztcblx0XHR9XG5cdH1cblxuXHQvLyBQcm9jZXNzIGZpbGVzIGZpcnN0XG5cdGNvbnN0IGZpbGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBkaXJlY3RvcnlIYW5kbGUudmFsdWVzKCkpIHtcblx0XHRpZiAoZW50cnkua2luZCA9PT0gXCJmaWxlXCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSBgJHtkaXJlY3RvcnlQYXRofS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdGlmICghaWdub3JlRmlsZVBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRmaWxlUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHNob3VsZEluY2x1ZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGF3YWl0IGZpbHRlci5zaG91bGRJbmNsdWRlRmlsZShcblx0XHRcdFx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRyeSBhcyBGaWxlU3lzdGVtRmlsZUhhbmRsZSxcblx0XHRcdFx0XHRcdFx0XHQpKSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0c2hvdWxkSW5jbHVkZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGlnbm9yZUZpbGVQYXRocy5hZGQocGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0aW5jbHVkZUZpbGVzLmRlbGV0ZShwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNob3VsZEluY2x1ZGUpIHtcblx0XHRcdFx0XHRcdFx0aW5jbHVkZUZpbGVzLnNldChwYXRoLCBlbnRyeSBhcyBGaWxlU3lzdGVtRmlsZUhhbmRsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkoKSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0YXdhaXQgUHJvbWlzZS5hbGwoZmlsZVByb21pc2VzKTtcblxuXHQvLyBQcm9jZXNzIGRpcmVjdG9yaWVzXG5cdGNvbnN0IGRpclByb21pc2VzOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPj5bXSA9IFtdO1xuXHQvLyBAdHMtaWdub3JlXG5cdGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgZGlyZWN0b3J5SGFuZGxlLnZhbHVlcygpKSB7XG5cdFx0aWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSBgJHtkaXJlY3RvcnlQYXRofS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdGlmICghaWdub3JlRmlsZVBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRkaXJQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdHByb2Nlc3NEaXJlY3RvcnkoXG5cdFx0XHRcdFx0XHRlbnRyeSBhcyBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlLFxuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdGZpbHRlcnMsXG5cdFx0XHRcdFx0XHRpbmNsdWRlRmlsZXMsXG5cdFx0XHRcdFx0XHRpZ25vcmVGaWxlUGF0aHMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0YXdhaXQgUHJvbWlzZS5hbGwoZGlyUHJvbWlzZXMpO1xuXG5cdHJldHVybiBpbmNsdWRlRmlsZXM7XG59O1xuXG5jb25zdCB1c2VEZWJvdW5jZSA9IDxUPih2YWx1ZTogVCwgZGVsYXk6IG51bWJlcik6IFQgPT4ge1xuXHRjb25zdCBbZGVib3VuY2VkVmFsdWUsIHNldERlYm91bmNlZFZhbHVlXSA9IHVzZVN0YXRlPFQ+KHZhbHVlKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGNvbnN0IGhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHNldERlYm91bmNlZFZhbHVlKHZhbHVlKTtcblx0XHR9LCBkZWxheSk7XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KGhhbmRsZXIpO1xuXHRcdH07XG5cdH0sIFt2YWx1ZSwgZGVsYXldKTtcblxuXHRyZXR1cm4gZGVib3VuY2VkVmFsdWU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUZpbGVIYW5kbGluZ0hvb2tQcm9wcyB7XG5cdGZpbHRlcnM/OiBGaWx0ZXJGbltdO1xuXHRvbkZpbGVzQWRkZWQ/OiAoXG5cdFx0bmV3RmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRvbkZpbGVzQ2hhbmdlZD86IChcblx0XHRjaGFuZ2VkRmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRvbkZpbGVzRGVsZXRlZD86IChcblx0XHRkZWxldGVkRmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRwb2xsSW50ZXJ2YWw/OiBudW1iZXI7XG5cdGJhdGNoU2l6ZT86IG51bWJlcjtcblx0ZGVib3VuY2VJbnRlcnZhbD86IG51bWJlcjtcblx0LyoqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGNhY2hlIGZpbGUgY29udGVudHMgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLiBEZWZhdWx0cyB0byA1MDAwbXMgKDUgc2Vjb25kcykgKi9cblx0ZmlsZUNhY2hlVHRsPzogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBERUZBVUxUX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IERFRkFVTFRfREVCT1VOQ0VfSU5URVJWQUwgPSA1MDtcbmNvbnN0IERFRkFVTFRfRklMRV9DQUNIRV9UVEwgPSA1MDAwOyAvLyA1IHNlY29uZHNcblxuZXhwb3J0IGNvbnN0IHVzZUZpbGVTeXN0ZW0gPSAocHJvcHM6IFVzZUZpbGVIYW5kbGluZ0hvb2tQcm9wcykgPT4ge1xuXHRjb25zdCB7XG5cdFx0b25GaWxlc0FkZGVkOiBvbkFkZEZpbGUsXG5cdFx0b25GaWxlc0NoYW5nZWQ6IG9uQ2hhbmdlRmlsZSxcblx0XHRvbkZpbGVzRGVsZXRlZDogb25EZWxldGVGaWxlLFxuXHRcdGJhdGNoU2l6ZSA9IERFRkFVTFRfQkFUQ0hfU0laRSxcblx0XHRkZWJvdW5jZUludGVydmFsID0gREVGQVVMVF9ERUJPVU5DRV9JTlRFUlZBTCxcblx0fSA9IHByb3BzO1xuXG5cdGNvbnN0IHdhdGNoZWREaXJlY3Rvcmllc1JlZiA9IHVzZVJlZjxNYXA8c3RyaW5nLCBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlPj4oXG5cdFx0bmV3IE1hcCgpLFxuXHQpO1xuXHRjb25zdCBoYW5kbGVzUmVmID0gdXNlUmVmPE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPj4obmV3IE1hcCgpKTtcblx0Y29uc3QgcHJldmlvdXNIYW5kbGVzUmVmID0gdXNlUmVmPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXHRjb25zdCBmaWxlc01hcFJlZiA9IHVzZVJlZjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG5cdGNvbnN0IHByZXZpb3VzRmlsZXNNYXBSZWYgPSB1c2VSZWY8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXHRjb25zdCBpbnRlcnZhbFJlZiA9IHVzZVJlZjxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpO1xuXHRjb25zdCBbZmlsZXMsIHNldEZpbGVzXSA9IHVzZVN0YXRlPE1hcDxzdHJpbmcsIHN0cmluZz4+KG5ldyBNYXAoKSk7XG5cdGNvbnN0IFtpc1Byb2Nlc3NpbmcsIHNldElzUHJvY2Vzc2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cblx0Ly8gQWRkIGEgY2FjaGUgZm9yIGZpbGUgY29udGVudHNcblx0Y29uc3QgZmlsZUNvbnRlbnRzQ2FjaGUgPSB1c2VSZWY8XG5cdFx0TWFwPHN0cmluZywgeyBjb250ZW50OiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH0+XG5cdD4obmV3IE1hcCgpKTtcblx0Y29uc3QgZmlsZUNhY2hlVHRsID0gcHJvcHMuZmlsZUNhY2hlVHRsIHx8IERFRkFVTFRfRklMRV9DQUNIRV9UVEw7XG5cblx0Y29uc3QgY2xlYXJXYXRjaGVkRGlyZWN0b3JpZXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG5cdFx0aWYgKGludGVydmFsUmVmLmN1cnJlbnQpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG5cdFx0XHRpbnRlcnZhbFJlZi5jdXJyZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR3YXRjaGVkRGlyZWN0b3JpZXNSZWYuY3VycmVudC5jbGVhcigpO1xuXHRcdGhhbmRsZXNSZWYuY3VycmVudC5jbGVhcigpO1xuXHRcdHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50LmNsZWFyKCk7XG5cdFx0ZmlsZXNNYXBSZWYuY3VycmVudCA9IHt9O1xuXHRcdHByZXZpb3VzRmlsZXNNYXBSZWYuY3VycmVudCA9IHt9O1xuXHRcdGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuY2xlYXIoKTtcblx0XHRzZXRGaWxlcyhuZXcgTWFwKCkpO1xuXHR9LCBbXSk7XG5cblx0Y29uc3QgcHJvY2Vzc1dhdGNoZWREaXJlY3RvcmllcyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcblx0XHRjb25zdCB0ZW1wb3JhcnlIYW5kbGVzID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPigpO1xuXHRcdGNvbnN0IGlnbm9yZUZpbGVQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cdFx0Y29uc3QgZmlsdGVyRm5zOiBGaWx0ZXJGbltdID0gcHJvcHMuZmlsdGVycyB8fCBjb21tb25GaWx0ZXJzO1xuXHRcdGNvbnN0IGZpbHRlcnM6IEZpbHRlcltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGZpbHRlckZuIG9mIGZpbHRlckZucykge1xuXHRcdFx0ZmlsdGVycy5wdXNoKGF3YWl0IGZpbHRlckZuKCkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRpclByb21pc2VzOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPj5bXSA9IFtdO1xuXHRcdHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LmZvckVhY2goKGRpcmVjdG9yeUhhbmRsZSwgZGlyZWN0b3J5UGF0aCkgPT4ge1xuXHRcdFx0ZGlyUHJvbWlzZXMucHVzaChcblx0XHRcdFx0cHJvY2Vzc0RpcmVjdG9yeShcblx0XHRcdFx0XHRkaXJlY3RvcnlIYW5kbGUsXG5cdFx0XHRcdFx0ZGlyZWN0b3J5UGF0aCxcblx0XHRcdFx0XHRmaWx0ZXJzLFxuXHRcdFx0XHRcdHRlbXBvcmFyeUhhbmRsZXMsXG5cdFx0XHRcdFx0aWdub3JlRmlsZVBhdGhzLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKGRpclByb21pc2VzKTtcblxuXHRcdHRlbXBvcmFyeUhhbmRsZXMuZm9yRWFjaCgoXywgZmlsZVBhdGgpID0+IHtcblx0XHRcdGlmIChpZ25vcmVGaWxlUGF0aHMuaGFzKGZpbGVQYXRoKSkge1xuXHRcdFx0XHR0ZW1wb3JhcnlIYW5kbGVzLmRlbGV0ZShmaWxlUGF0aCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRoYW5kbGVzUmVmLmN1cnJlbnQgPSB0ZW1wb3JhcnlIYW5kbGVzO1xuXHR9LCBbcHJvcHMuZmlsdGVyc10pO1xuXG5cdGNvbnN0IHByb2Nlc3NGaWxlcyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcblx0XHRwcmV2aW91c0ZpbGVzTWFwUmVmLmN1cnJlbnQgPSB7XG5cdFx0XHQuLi4oZmlsZXNNYXBSZWYuY3VycmVudCB8fCB7fSksXG5cdFx0fTtcblxuXHRcdGNvbnN0IHNlZW5GaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGNoYW5nZWRGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdFx0Y29uc3QgZGVsZXRlZEZpbGVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0bGV0IHJlcmVuZGVyID0gZmFsc2U7XG5cblx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdGNvbnN0IGhhbmRsZXMgPSBBcnJheS5mcm9tKGhhbmRsZXNSZWYuY3VycmVudCk7XG5cdFx0Y29uc3QgbmV3RmlsZXNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG5cdFx0XHRjb25zdCBiYXRjaCA9IGhhbmRsZXMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0YmF0Y2gubWFwKGFzeW5jIChbZmlsZVBhdGgsIGhhbmRsZV0pID0+IHtcblx0XHRcdFx0XHRpZiAoaGFuZGxlLmtpbmQgPT09IFwiZmlsZVwiKSB7XG5cdFx0XHRcdFx0XHRzZWVuRmlsZXMuYWRkKGZpbGVQYXRoKTtcblxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2FjaGVkID0gZmlsZUNvbnRlbnRzQ2FjaGUuY3VycmVudC5nZXQoZmlsZVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoY2FjaGVkICYmIG5vdyAtIGNhY2hlZC50aW1lc3RhbXAgPCBmaWxlQ2FjaGVUdGwpIHtcblx0XHRcdFx0XHRcdFx0XHRuZXdGaWxlc01hcFtmaWxlUGF0aF0gPSBjYWNoZWQuY29udGVudDtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2FjaGVkLmNvbnRlbnQgIT09IHByZXZpb3VzRmlsZXNNYXBSZWYuY3VycmVudFtmaWxlUGF0aF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNoYW5nZWRGaWxlcy5zZXQoZmlsZVBhdGgsIGNhY2hlZC5jb250ZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGF3YWl0IChoYW5kbGUgYXMgRmlsZVN5c3RlbUZpbGVIYW5kbGUpLmdldEZpbGUoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudHNDYWNoZS5jdXJyZW50LnNldChmaWxlUGF0aCwge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRleHQsXG5cdFx0XHRcdFx0XHRcdFx0dGltZXN0YW1wOiBub3csXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdG5ld0ZpbGVzTWFwW2ZpbGVQYXRoXSA9IHRleHQ7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0ICE9PSBwcmV2aW91c0ZpbGVzTWFwUmVmLmN1cnJlbnRbZmlsZVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlZEZpbGVzLnNldChmaWxlUGF0aCwgdGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGhhbmRsZXNSZWYuY3VycmVudC5kZWxldGUoZmlsZVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVkRmlsZXNTZXQuYWRkKGZpbGVQYXRoKTtcblx0XHRcdFx0XHRcdFx0ZmlsZUNvbnRlbnRzQ2FjaGUuY3VycmVudC5kZWxldGUoZmlsZVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRyZXJlbmRlciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2xlYW4gdXAgb2xkIGNhY2hlIGVudHJpZXNcblx0XHRjb25zdCBjYWNoZUVudHJpZXMgPSBBcnJheS5mcm9tKGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuZW50cmllcygpKTtcblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB7IHRpbWVzdGFtcCB9XSBvZiBjYWNoZUVudHJpZXMpIHtcblx0XHRcdGlmIChub3cgLSB0aW1lc3RhbXAgPiBmaWxlQ2FjaGVUdGwpIHtcblx0XHRcdFx0ZmlsZUNvbnRlbnRzQ2FjaGUuY3VycmVudC5kZWxldGUocGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVsZXRlZEZpbGVzID0gQXJyYXkuZnJvbShbXG5cdFx0XHQuLi5BcnJheS5mcm9tKHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50KSxcblx0XHRcdC4uLkFycmF5LmZyb20oZGVsZXRlZEZpbGVzU2V0KSxcblx0XHRdKS5maWx0ZXIoKGZpbGVQYXRoKSA9PiAhc2VlbkZpbGVzLmhhcyhmaWxlUGF0aCkpO1xuXG5cdFx0Y29uc3QgYWRkZWRGaWxlcyA9IEFycmF5LmZyb20oc2VlbkZpbGVzKS5maWx0ZXIoXG5cdFx0XHQoZmlsZVBhdGgpID0+ICFwcmV2aW91c0hhbmRsZXNSZWYuY3VycmVudC5oYXMoZmlsZVBhdGgpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhZGRlZEZpbGVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuXHRcdGZvciAoY29uc3QgYWRkZWRGaWxlIG9mIGFkZGVkRmlsZXMpIHtcblx0XHRcdGFkZGVkRmlsZXNNYXAuc2V0KGFkZGVkRmlsZSwgZmlsZXNNYXBSZWYuY3VycmVudFthZGRlZEZpbGVdKTtcblx0XHR9XG5cblx0XHRjb25zdCBkZWxldGVkRmlsZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG5cdFx0Zm9yIChjb25zdCBkZWxldGVkRmlsZSBvZiBkZWxldGVkRmlsZXMpIHtcblx0XHRcdGRlbGV0ZWRGaWxlc01hcC5zZXQoZGVsZXRlZEZpbGUsIGZpbGVzTWFwUmVmLmN1cnJlbnRbZGVsZXRlZEZpbGVdKTtcblx0XHRcdGhhbmRsZXNSZWYuY3VycmVudC5kZWxldGUoZGVsZXRlZEZpbGUpO1xuXHRcdFx0ZGVsZXRlIGZpbGVzTWFwUmVmLmN1cnJlbnRbZGVsZXRlZEZpbGVdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByZXZpb3VzRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihcblx0XHRcdEFycmF5LmZyb20ocHJldmlvdXNIYW5kbGVzUmVmLmN1cnJlbnQpLm1hcCgoZmlsZVBhdGgpID0+IFtcblx0XHRcdFx0ZmlsZVBhdGgsXG5cdFx0XHRcdGZpbGVzTWFwUmVmLmN1cnJlbnRbZmlsZVBhdGhdLFxuXHRcdFx0XSksXG5cdFx0KTtcblxuXHRcdGlmIChjaGFuZ2VkRmlsZXMuc2l6ZSA+IDApIHtcblx0XHRcdHJlcmVuZGVyID0gdHJ1ZTtcblx0XHRcdG9uQ2hhbmdlRmlsZT8uKGNoYW5nZWRGaWxlcywgcHJldmlvdXNGaWxlcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGRlbGV0ZWRGaWxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXJlbmRlciA9IHRydWU7XG5cdFx0XHRvbkRlbGV0ZUZpbGU/LihkZWxldGVkRmlsZXNNYXAsIHByZXZpb3VzRmlsZXMpO1xuXHRcdH1cblxuXHRcdGlmIChhZGRlZEZpbGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJlcmVuZGVyID0gdHJ1ZTtcblx0XHRcdG9uQWRkRmlsZT8uKGFkZGVkRmlsZXNNYXAsIHByZXZpb3VzRmlsZXMpO1xuXHRcdH1cblxuXHRcdHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50ID0gc2VlbkZpbGVzO1xuXHRcdGZpbGVzTWFwUmVmLmN1cnJlbnQgPSBuZXdGaWxlc01hcDtcblxuXHRcdGlmIChyZXJlbmRlcikge1xuXHRcdFx0c2V0RmlsZXMobmV3IE1hcChPYmplY3QuZW50cmllcyhmaWxlc01hcFJlZi5jdXJyZW50KSkpO1xuXHRcdH1cblx0fSwgW29uQWRkRmlsZSwgb25DaGFuZ2VGaWxlLCBvbkRlbGV0ZUZpbGUsIGJhdGNoU2l6ZSwgZmlsZUNhY2hlVHRsXSk7XG5cblx0Ly8gRGVib3VuY2UgdGhlIGZpbGVzIHN0YXRlIHVwZGF0ZVxuXHRjb25zdCBkZWJvdW5jZWRGaWxlcyA9IHVzZURlYm91bmNlKGZpbGVzLCBkZWJvdW5jZUludGVydmFsKTtcblxuXHRjb25zdCBzdGFydFBvbGxpbmdXYXRjaGVkRGlyZWN0b3JpZXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG5cdFx0bGV0IHByb2Nlc3NpbmdQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cblx0XHQvLyBPbmx5IHN0YXJ0IGEgbmV3IGludGVydmFsIGlmIG9uZSBpc24ndCBhbHJlYWR5IHJ1bm5pbmdcblx0XHRpZiAoIWludGVydmFsUmVmLmN1cnJlbnQpIHtcblx0XHRcdGludGVydmFsUmVmLmN1cnJlbnQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGlmIChpc1Byb2Nlc3NpbmcgfHwgcHJvY2Vzc2luZ1Byb21pc2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZXRJc1Byb2Nlc3NpbmcodHJ1ZSk7XG5cdFx0XHRcdHByb2Nlc3NpbmdQcm9taXNlID0gKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcHJvY2Vzc1dhdGNoZWREaXJlY3RvcmllcygpO1xuXHRcdFx0XHRcdFx0YXdhaXQgcHJvY2Vzc0ZpbGVzKCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHNldElzUHJvY2Vzc2luZyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRwcm9jZXNzaW5nUHJvbWlzZSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSgpO1xuXHRcdFx0fSwgcHJvcHMucG9sbEludGVydmFsIHx8IERFRkFVTFRfUE9MTF9JTlRFUlZBTCk7XG5cdFx0fVxuXHR9LCBbXG5cdFx0cHJvY2Vzc1dhdGNoZWREaXJlY3Rvcmllcyxcblx0XHRwcm9jZXNzRmlsZXMsXG5cdFx0aXNQcm9jZXNzaW5nLFxuXHRcdHByb3BzLnBvbGxJbnRlcnZhbCxcblx0XSk7XG5cblx0Y29uc3Qgb25EaXJlY3RvcnlTZWxlY3Rpb24gPSBhc3luYyAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGNvbnN0IGRpcmVjdG9yeUhhbmRsZSA9IGF3YWl0IHdpbmRvdy5zaG93RGlyZWN0b3J5UGlja2VyKCk7XG5cblx0XHRcdGlmICghZGlyZWN0b3J5SGFuZGxlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW5pdGlhbERpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlIYW5kbGUubmFtZTtcblx0XHRcdHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LnNldChpbml0aWFsRGlyZWN0b3J5UGF0aCwgZGlyZWN0b3J5SGFuZGxlKTtcblx0XHRcdHN0YXJ0UG9sbGluZ1dhdGNoZWREaXJlY3RvcmllcygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIGRpcmVjdG9yeSBzZWxlY3Rpb246XCIpO1xuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IHdyaXRlRmlsZSA9IHVzZUNhbGxiYWNrKFxuXHRcdGFzeW5jIChcblx0XHRcdHBhdGg6IHN0cmluZyxcblx0XHRcdGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYixcblx0XHRcdG9wdGlvbnM6IEZpbGVXcml0ZU9wdGlvbnMgPSB7fSxcblx0XHQpID0+IHtcblx0XHRcdC8vIFZhbGlkYXRlIHBhdGhcblx0XHRcdGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGZpbGUgcGF0aFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgeyBjcmVhdGUgPSB0cnVlLCB0cnVuY2F0ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRcdFx0Y29uc3QgaGFuZGxlID0gaGFuZGxlc1JlZi5jdXJyZW50LmdldChwYXRoKTtcblxuXHRcdFx0aWYgKCFoYW5kbGUpIHtcblx0XHRcdFx0aWYgKCFjcmVhdGUpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGh9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQ3JlYXRlIG5ldyBmaWxlXG5cdFx0XHRcdGNvbnN0IGRpcmVjdG9yeVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdGNvbnN0IGZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblxuXHRcdFx0XHQvLyBWYWxpZGF0ZSBkaXJlY3RvcnkgcGF0aFxuXHRcdFx0XHRpZiAoIShkaXJlY3RvcnlQYXRoICYmIGZpbGVOYW1lKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZmlsZSBwYXRoIHN0cnVjdHVyZVwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpckhhbmRsZSA9IHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LmdldChkaXJlY3RvcnlQYXRoKTtcblxuXHRcdFx0XHRpZiAoIWRpckhhbmRsZSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtkaXJlY3RvcnlQYXRofWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGRpckhhbmRsZS5nZXRGaWxlSGFuZGxlKGZpbGVOYW1lLCB7XG5cdFx0XHRcdFx0Y3JlYXRlOiB0cnVlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aGFuZGxlc1JlZi5jdXJyZW50LnNldChwYXRoLCBmaWxlSGFuZGxlKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlsZUhhbmRsZSA9IGhhbmRsZXNSZWYuY3VycmVudC5nZXQocGF0aCk7XG5cdFx0XHRpZiAoIWZpbGVIYW5kbGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtwYXRofWApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEb3VibGUtY2hlY2sgd2UncmUgd3JpdGluZyB0byB0aGUgY29ycmVjdCBmaWxlXG5cdFx0XHRpZiAoZmlsZUhhbmRsZS5uYW1lICE9PSBwYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIHBhdGggbWlzbWF0Y2hcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmlsZUhhbmRsZS5jcmVhdGVXcml0YWJsZSh7XG5cdFx0XHRcdGtlZXBFeGlzdGluZ0RhdGE6ICF0cnVuY2F0ZSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB3cml0YWJsZS53cml0ZShkYXRhKTtcblx0XHRcdFx0YXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgY2FjaGUgYW5kIHRyaWdnZXIgY2hhbmdlIGV2ZW50c1xuXHRcdFx0XHRjb25zdCBjb250ZW50ID1cblx0XHRcdFx0XHR0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGRhdGEgOiBhd2FpdCBuZXcgUmVzcG9uc2UoZGF0YSkudGV4dCgpO1xuXHRcdFx0XHRmaWxlQ29udGVudHNDYWNoZS5jdXJyZW50LnNldChwYXRoLCB7XG5cdFx0XHRcdFx0Y29udGVudCxcblx0XHRcdFx0XHR0aW1lc3RhbXA6IERhdGUubm93KCksXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IGNoYW5nZWRGaWxlcyA9IG5ldyBNYXAoW1twYXRoLCBjb250ZW50XV0pO1xuXHRcdFx0XHRjb25zdCBwcmV2aW91c0ZpbGVzID0gbmV3IE1hcChcblx0XHRcdFx0XHRBcnJheS5mcm9tKHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50KS5tYXAoKGZpbGVQYXRoKSA9PiBbXG5cdFx0XHRcdFx0XHRmaWxlUGF0aCxcblx0XHRcdFx0XHRcdGZpbGVzTWFwUmVmLmN1cnJlbnRbZmlsZVBhdGhdLFxuXHRcdFx0XHRcdF0pLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdG9uQ2hhbmdlRmlsZT8uKGNoYW5nZWRGaWxlcywgcHJldmlvdXNGaWxlcyk7XG5cdFx0XHRcdGZpbGVzTWFwUmVmLmN1cnJlbnRbcGF0aF0gPSBjb250ZW50O1xuXHRcdFx0XHRzZXRGaWxlcyhuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGZpbGVzTWFwUmVmLmN1cnJlbnQpKSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRhd2FpdCB3cml0YWJsZS5hYm9ydCgpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdFtvbkNoYW5nZUZpbGVdLFxuXHQpO1xuXG5cdGNvbnN0IGNyZWF0ZUZpbGUgPSB1c2VDYWxsYmFjayhcblx0XHRhc3luYyAocGF0aDogc3RyaW5nLCBpbml0aWFsRGF0YT86IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYikgPT4ge1xuXHRcdFx0Y29uc3QgZGlyZWN0b3J5UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHRcdGNvbnN0IGRpckhhbmRsZSA9IHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LmdldChkaXJlY3RvcnlQYXRoKTtcblxuXHRcdFx0aWYgKCFkaXJIYW5kbGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke2RpcmVjdG9yeVBhdGh9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpbGVIYW5kbGUgPSBhd2FpdCBkaXJIYW5kbGUuZ2V0RmlsZUhhbmRsZShmaWxlTmFtZSwge1xuXHRcdFx0XHRjcmVhdGU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHRcdGhhbmRsZXNSZWYuY3VycmVudC5zZXQocGF0aCwgZmlsZUhhbmRsZSk7XG5cblx0XHRcdGlmIChpbml0aWFsRGF0YSkge1xuXHRcdFx0XHRhd2FpdCB3cml0ZUZpbGUocGF0aCwgaW5pdGlhbERhdGEsIHsgdHJ1bmNhdGU6IHRydWUgfSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmaWxlSGFuZGxlO1xuXHRcdH0sXG5cdFx0W3dyaXRlRmlsZV0sXG5cdCk7XG5cblx0Y29uc3QgZGVsZXRlRmlsZSA9IHVzZUNhbGxiYWNrKFxuXHRcdGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdGNvbnN0IGhhbmRsZSA9IGhhbmRsZXNSZWYuY3VycmVudC5nZXQocGF0aCk7XG5cdFx0XHRpZiAoIWhhbmRsZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGh9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRpcmVjdG9yeVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRjb25zdCBmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRjb25zdCBkaXJIYW5kbGUgPSB3YXRjaGVkRGlyZWN0b3JpZXNSZWYuY3VycmVudC5nZXQoZGlyZWN0b3J5UGF0aCk7XG5cblx0XHRcdGlmICghZGlySGFuZGxlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtkaXJlY3RvcnlQYXRofWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBkaXJIYW5kbGUucmVtb3ZlRW50cnkoZmlsZU5hbWUpO1xuXHRcdFx0aGFuZGxlc1JlZi5jdXJyZW50LmRlbGV0ZShwYXRoKTtcblx0XHRcdGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuZGVsZXRlKHBhdGgpO1xuXG5cdFx0XHRjb25zdCBkZWxldGVkRmlsZXMgPSBuZXcgTWFwKFtbcGF0aCwgZmlsZXNNYXBSZWYuY3VycmVudFtwYXRoXV1dKTtcblx0XHRcdGNvbnN0IHByZXZpb3VzRmlsZXMgPSBuZXcgTWFwKFxuXHRcdFx0XHRBcnJheS5mcm9tKHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50KS5tYXAoKGZpbGVQYXRoKSA9PiBbXG5cdFx0XHRcdFx0ZmlsZVBhdGgsXG5cdFx0XHRcdFx0ZmlsZXNNYXBSZWYuY3VycmVudFtmaWxlUGF0aF0sXG5cdFx0XHRcdF0pLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIGZpbGVzTWFwUmVmLmN1cnJlbnRbcGF0aF07XG5cdFx0XHRwcmV2aW91c0hhbmRsZXNSZWYuY3VycmVudC5kZWxldGUocGF0aCk7XG5cblx0XHRcdG9uRGVsZXRlRmlsZT8uKGRlbGV0ZWRGaWxlcywgcHJldmlvdXNGaWxlcyk7XG5cdFx0XHRzZXRGaWxlcyhuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGZpbGVzTWFwUmVmLmN1cnJlbnQpKSk7XG5cdFx0fSxcblx0XHRbb25EZWxldGVGaWxlXSxcblx0KTtcblxuXHR1c2VVbm1vdW50KCgpID0+IHtcblx0XHRjbGVhcldhdGNoZWREaXJlY3RvcmllcygpO1xuXHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdGhhbmRsZXM6IGhhbmRsZXNSZWYuY3VycmVudCxcblx0XHRvbkRpcmVjdG9yeVNlbGVjdGlvbixcblx0XHRvbkNsZWFyOiBjbGVhcldhdGNoZWREaXJlY3Rvcmllcyxcblx0XHRmaWxlczogZGVib3VuY2VkRmlsZXMsXG5cdFx0c2V0RmlsZXMsXG5cdFx0aXNQcm9jZXNzaW5nLFxuXHRcdGlzQnJvd3NlclN1cHBvcnRlZDogd2luZG93ICE9PSB1bmRlZmluZWQgJiYgXCJzaG93RGlyZWN0b3J5UGlja2VyXCIgaW4gd2luZG93LFxuXHRcdHdyaXRlRmlsZSxcblx0XHRjcmVhdGVGaWxlLFxuXHRcdGRlbGV0ZUZpbGUsXG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgdXNlRnMgPSB1c2VGaWxlU3lzdGVtO1xuXG4vLyBiZWxvdyBpcyBjb3BpZWQgZnJvbSB1c2Vob29rcy10c1xuXG5jb25zdCB1c2VFZmZlY3RPbmNlID0gKGVmZmVjdDogRWZmZWN0Q2FsbGJhY2spID0+IHtcblx0dXNlRWZmZWN0KGVmZmVjdCwgW10pO1xufTtcblxuY29uc3QgdXNlVW5tb3VudCA9IChmbjogKCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xuXHRjb25zdCBmblJlZiA9IHVzZVJlZihmbik7XG5cblx0Zm5SZWYuY3VycmVudCA9IGZuO1xuXG5cdHVzZUVmZmVjdE9uY2UoKCkgPT4gKCkgPT4gZm5SZWYuY3VycmVudCgpKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxPQUFPQSxNQUFZLFNBQ25CLE9BRUMsZUFBQUMsRUFDQSxhQUFBQyxFQUNBLFVBQUFDLEVBQ0EsWUFBQUMsTUFDTSxRQXdDQSxJQUFNQyxFQUFzQixTQUFZLENBQzlDLElBQU1DLEVBQUtOLEVBQU8sQ0FDakIsbUJBQW9CLEVBQ3JCLENBQUMsRUFHR08sRUFBa0IsR0FFdEIsTUFBTyxDQUNOLGtCQUFtQixNQUFPQyxFQUFrQkMsSUFBNkIsQ0FDeEUsR0FDQ0QsRUFBUyxTQUFTLFlBQVksR0FDOUIsQ0FBQ0QsR0FDREUsRUFBTyxPQUFTLE9BQ2YsQ0FHRCxJQUFNQyxFQUFPLE1BREEsTUFETUQsRUFDVyxRQUFRLEdBQ2QsS0FBSyxFQUM3QixPQUFBSCxFQUFHLElBQUlJLENBQUksRUFDWEgsRUFBa0IsR0FDWCxFQUNSLENBQ0EsR0FBTSxDQUFFLFFBQUFJLENB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RUFDQWYsRUFBWSxRQUFRZSxDQUFRLENBQzdCLENBQUMsQ0FDRixFQUVBLE9BQU9mLEVBQVksUUFBUXZCLENBQUksRUFDL0JzQixFQUFtQixRQUFRLE9BQU90QixDQUFJLEVBRXRDaUIsR0FBQSxNQUFBQSxFQUFlbUMsRUFBY00sR0FDN0IvQixFQUFTLElBQUksSUFBSSxPQUFPLFFBQVFKLEVBQVksT0FBTyxDQUFDLENBQUMsQ0FDdEQsRUFDQSxDQUFDTixDQUFZLENBQ2QsRUFFQSxPQUFBNkQsR0FBVyxJQUFNLENBQ2hCOUMsRUFBd0IsQ0FDekIsQ0FBQyxFQUVNLENBQ04sUUFBU1gsRUFBVyxRQUNwQixxQkFBQXlDLEVBQ0EsUUFBUzlCLEVBQ1QsTUFBTzJCLEVBQ1AsU0FBQWhDLEVBQ0EsYUFBQUMsRUFDQSxtQkFBb0IsU0FBVyxRQUFhLHdCQUF5QixPQUNyRSxVQUFBcUMsRUFDQSxXQUFBVSxFQUNBLFdBQUFFLENBQ0QsQ0FDRCxFQUVhRSxHQUFRbEUsR0FJZm1FLEdBQWlCQyxHQUEyQixDQUNqRDFHLEVBQVUwRyxFQUFRLENBQUMsQ0FBQyxDQUNyQixFQUVNSCxHQUFjSSxHQUF5QixDQUM1QyxJQUFNQyxFQUFRM0csRUFBTzBHLENBQUUsRUFFdkJDLEVBQU0sUUFBVUQsRUFFaEJGLEdBQWMsSUFBTSxJQUFNRyxFQUFNLFFBQVEsQ0FBQyxDQUMxQyIsCiAgIm5hbWVzIjogWyJpZ25vcmUiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZVJlZiIsICJ1c2VTdGF0ZSIsICJnaXRGaWx0ZXIiLCAiaWciLCAiZ2l0SWdub3JlTG9hZGVkIiwgImZpbGVwYXRoIiwgImhhbmRsZSIsICJ0ZXh0IiwgImlnbm9yZWQiLCAiX2hhbmRsZSIsICJkaXN0RmlsdGVyIiwgImlzRGlzdCIsICJtaXNjRmlsdGVyIiwgImlzTWlzYyIsICJjb21tb25GaWx0ZXJzIiwgInByb2Nlc3NEaXJlY3RvcnkiLCAiZGlyZWN0b3J5SGFuZGxlIiwgImRpcmVjdG9yeVBhdGgiLCAiZmlsdGVycyIsICJpbmNsdWRlRmlsZXMiLCAiaWdub3JlRmlsZVBhdGhzIiwgImZpbHRlciIsICJmaWxlUHJvbWlzZXMiLCAiZW50cnkiLCAicGF0aCIsICJzaG91bGRJbmNsdWRlIiwgImRpclByb21pc2VzIiwgInVzZURlYm91bmNlIiwgInZhbHVlIiwgImRlbGF5IiwgImRlYm91bmNlZFZhbHVlIiwgInNldERlYm91bmNlZFZhbHVlIiwgImhhbmRsZXIiLCAiREVGQVVMVF9QT0xMX0lOVEVSVkFMIiwgIkRFRkFVTFRfQkFUQ0hfU0laRSIsICJERUZBVUxUX0RFQk9VTkNFX0lOVEVSVkFMIiwgIkRFRkFVTFRfRklMRV9DQUNIRV9UVEwiLCAidXNlRmlsZVN5c3RlbSIsICJwcm9wcyIsICJvbkFkZEZpbGUiLCAib25DaGFuZ2VGaWxlIiwgIm9uRGVsZXRlRmlsZSIsICJiYXRjaFNpemUiLCAiZGVib3VuY2VJbnRlcnZhbCIsICJ3YXRjaGVkRGlyZWN0b3JpZXNSZWYiLCAiaGFuZGxlc1JlZiIsICJwcmV2aW91c0hhbmRsZXNSZWYiLCAiZmlsZXNNYXBSZWYiLCAicHJldmlvdXNGaWxlc01hcFJlZiIsICJpbnRlcnZhbFJlZiIsICJmaWxlcyIsICJzZXRGaWxlcyIsICJpc1Byb2Nlc3NpbmciLCAic2V0SXNQcm9jZXNzaW5nIiwgImZpbGVDb250ZW50c0NhY2hlIiwgImZpbGVDYWNoZVR0bCIsICJjbGVhcldhdGNoZWREaXJlY3RvcmllcyIsICJwcm9jZXNzV2F0Y2hlZERpcmVjdG9yaWVzIiwgInRlbXBvcmFyeUhhbmRsZXMiLCAiZmlsdGVyRm5zIiwgImZpbHRlckZuIiwgIl8iLCAiZmlsZVBhdGgiLCAicHJvY2Vzc0ZpbGVzIiwgInNlZW5GaWxlcyIsICJjaGFuZ2VkRmlsZXMiLCAiZGVsZXRlZEZpbGVzU2V0IiwgInJlcmVuZGVyIiwgIm5vdyIsICJoYW5kbGVzIiwgIm5ld0ZpbGVzTWFwIiwgImkiLCAiYmF0Y2giLCAiY2FjaGVkIiwgImNhY2hlRW50cmllcyIsICJ0aW1lc3RhbXAiLCAiZGVsZXRlZEZpbGVzIiwgImFkZGVkRmlsZXMiLCAiYWRkZWRGaWxlc01hcCIsICJhZGRlZEZpbGUiLCAiZGVsZXRlZEZpbGVzTWFwIiwgImRlbGV0ZWRGaWxlIiwgInByZXZpb3VzRmlsZXMiLCAiZGVib3VuY2VkRmlsZXMiLCAic3RhcnRQb2xsaW5nV2F0Y2hlZERpcmVjdG9yaWVzIiwgInByb2Nlc3NpbmdQcm9taXNlIiwgIm9uRGlyZWN0b3J5U2VsZWN0aW9uIiwgImluaXRpYWxEaXJlY3RvcnlQYXRoIiwgImVycm9yIiwgIndyaXRlRmlsZSIsICJkYXRhIiwgIm9wdGlvbnMiLCAiY3JlYXRlIiwgInRydW5jYXRlIiwgImZpbGVOYW1lIiwgImRpckhhbmRsZSIsICJmaWxlSGFuZGxlIiwgIndyaXRhYmxlIiwgImNvbnRlbnQiLCAiY3JlYXRlRmlsZSIsICJpbml0aWFsRGF0YSIsICJkZWxldGVGaWxlIiwgInVzZVVubW91bnQiLCAidXNlRnMiLCAidXNlRWZmZWN0T25jZSIsICJlZmZlY3QiLCAiZm4iLCAiZm5SZWYiXQp9Cg==