UNPKG

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 48.3 kB
"use strict";var te=Object.create;var _=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ce=(t,r)=>{for(var n in r)_(t,n,{get:r[n],enumerable:!0})},V=(t,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let c of se(r))!oe.call(t,c)&&c!==n&&_(t,c,{get:()=>r[c],enumerable:!(i=ne(r,c))||i.enumerable});return t};var le=(t,r,n)=>(n=t!=null?te(ie(t)):{},V(r||!t||!t.__esModule?_(n,"default",{value:t,enumerable:!0}):n,t)),ae=t=>V(_({},"__esModule",{value:!0}),t);var pe={};ce(pe,{commonFilters:()=>q,distFilter:()=>J,gitFilter:()=>z,miscFilter:()=>Z,processDirectory:()=>B,useFileSystem:()=>G,useFs:()=>me});module.exports=ae(pe);var j=le(require("ignore")),o=require("react"),z=async()=>{let t=(0,j.default)({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:c}=t.test(n);return!c},shouldProcessDirectory:async(n,i)=>{let{ignored:c}=t.test(n);return n.endsWith(".git")||n.includes(".git/")?!1:!c}}},J=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)}},Z=async()=>{let t=r=>!!(r.endsWith(".DS_Store")||r.endsWith(".crswap"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},q=[J,Z,z],B=async(t,r,n,i,c)=>{if(c.has(r))return i;for(let s of n)if(await s.shouldProcessDirectory(r,t)===!1)return c.add(r),i;let I=[];for await(let s of t.values())if(s.kind==="file"){let d=`${r}/${s.name}`;c.has(d)||I.push((async()=>{let a=!0;for(let E of n)if(await E.shouldIncludeFile(d,s)===!1){a=!1,c.add(d),i.delete(d);break}a&&i.set(d,s)})())}await Promise.all(I);let b=[];for await(let s of t.values())if(s.kind==="directory"){let d=`${r}/${s.name}`;c.has(d)||b.push(B(s,d,n,i,c))}return await Promise.all(b),i},ue=(t,r)=>{let[n,i]=(0,o.useState)(t);return(0,o.useEffect)(()=>{let c=setTimeout(()=>{i(t)},r);return()=>{clearTimeout(c)}},[t,r]),n},de=100,fe=50,ge=50,Fe=5e3,G=t=>{let{onFilesAdded:r,onFilesChanged:n,onFilesDeleted:i,batchSize:c=fe,debounceInterval:I=ge}=t,b=(0,o.useRef)(new Map),s=(0,o.useRef)(new Map),d=(0,o.useRef)(new Set),a=(0,o.useRef)({}),E=(0,o.useRef)({}),x=(0,o.useRef)(null),[K,A]=(0,o.useState)(new Map),[O,L]=(0,o.useState)(!1),H=(0,o.useRef)(new Map),R=t.fileCacheTtl||Fe,W=(0,o.useCallback)(()=>{x.current&&(clearInterval(x.current),x.current=null),b.current.clear(),s.current.clear(),d.current.clear(),a.current={},E.current={},H.current.clear(),A(new Map)},[]),$=(0,o.useCallback)(async()=>{let e=new Map,u=new Set,w=t.filters||q,f=[];for(let m of w)f.push(await m());let g=[];b.current.forEach((m,F)=>{g.push(B(m,F,f,e,u))}),await Promise.all(g),e.forEach((m,F)=>{u.has(F)&&e.delete(F)}),s.current=e},[t.filters]),U=(0,o.useCallback)(async()=>{E.current={...a.current||{}};let e=new Set,u=new Map,w=new Set,f=!1,g=Date.now(),m=Array.from(s.current),F={};for(let l=0;l<m.length;l+=c){let C=m.slice(l,l+c);await Promise.all(C.map(async([p,N])=>{if(N.kind==="file"){e.add(p);try{let h=H.current.get(p);if(h&&g-h.timestamp<R){F[p]=h.content,h.content!==E.current[p]&&u.set(p,h.content);return}let T=await(await N.getFile()).text();H.current.set(p,{content:T,timestamp:g}),F[p]=T,T!==E.current[p]&&u.set(p,T)}catch{s.current.delete(p),w.add(p),H.current.delete(p),f=!0}}}))}let S=Array.from(H.current.entries());for(let[l,{timestamp:C}]of S)g-C>R&&H.current.delete(l);let y=Array.from([...Array.from(d.current),...Array.from(w)]).filter(l=>!e.has(l)),M=Array.from(e).filter(l=>!d.current.has(l)),D=new Map;for(let l of M)D.set(l,a.current[l]);let v=new Map;for(let l of y)v.set(l,a.current[l]),s.current.delete(l),delete a.current[l];let k=new Map(Array.from(d.current).map(l=>[l,a.current[l]]));u.size>0&&(f=!0,n==null||n(u,k)),y.length>0&&(f=!0,i==null||i(v,k)),M.length>0&&(f=!0,r==null||r(D,k)),d.current=e,a.current=F,f&&A(new Map(Object.entries(a.current)))},[r,n,i,c,R]),Q=ue(K,I),X=(0,o.useCallback)(()=>{let e=null;x.current||(x.current=setInterval(async()=>{O||e||(L(!0),e=(async()=>{try{await $(),await U()}finally{L(!1),e=null}})())},t.pollInterval||de))},[$,U,O,t.pollInterval]),Y=async()=>{try{let e=await window.showDirectoryPicker();if(!e)return;let u=e.name;b.current.set(u,e),X()}catch(e){console.error("Error during directory selection:"),console.error(e)}},P=(0,o.useCallback)(async(e,u,w={})=>{if(!e||typeof e!="string")throw new Error("Invalid file path");let{create:f=!0,truncate:g=!1}=w;if(!s.current.get(e)){if(!f)throw new Error(`File not found: ${e}`);let y=e.substring(0,e.lastIndexOf("/")),M=e.substring(e.lastIndexOf("/")+1);if(!(y&&M))throw new Error("Invalid file path structure");let D=b.current.get(y);if(!D)throw new Error(`Directory not found: ${y}`);let v=await D.getFileHandle(M,{create:!0});s.current.set(e,v)}let F=s.current.get(e);if(!F)throw new Error(`File not found: ${e}`);if(F.name!==e.split("/").pop())throw new Error("File path mismatch");let S=await F.createWritable({keepExistingData:!g});try{await S.write(u),await S.close();let y=typeof u=="string"?u:await new Response(u).text();H.current.set(e,{content:y,timestamp:Date.now()});let M=new Map([[e,y]]),D=new Map(Array.from(d.current).map(v=>[v,a.current[v]]));n==null||n(M,D),a.current[e]=y,A(new Map(Object.entries(a.current)))}catch(y){throw await S.abort(),y}},[n]),ee=(0,o.useCallback)(async(e,u)=>{let w=e.substring(0,e.lastIndexOf("/")),f=e.substring(e.lastIndexOf("/")+1),g=b.current.get(w);if(!g)throw new Error(`Directory not found: ${w}`);let m=await g.getFileHandle(f,{create:!0});return s.current.set(e,m),u&&await P(e,u,{truncate:!0}),m},[P]),re=(0,o.useCallback)(async e=>{if(!s.current.get(e))throw new Error(`File not found: ${e}`);let w=e.substring(0,e.lastIndexOf("/")),f=e.substring(e.lastIndexOf("/")+1),g=b.current.get(w);if(!g)throw new Error(`Directory not found: ${w}`);await g.removeEntry(f),s.current.delete(e),H.current.delete(e);let m=new Map([[e,a.current[e]]]),F=new Map(Array.from(d.current).map(S=>[S,a.current[S]]));delete a.current[e],d.current.delete(e),i==null||i(m,F),A(new Map(Object.entries(a.current)))},[i]);return ye(()=>{W()}),{handles:s.current,onDirectorySelection:Y,onClear:W,files:Q,setFiles:A,isProcessing:O,isBrowserSupported:window!==void 0&&"showDirectoryPicker"in window,writeFile:P,createFile:ee,deleteFile:re}},me=G,we=t=>{(0,o.useEffect)(t,[])},ye=t=>{let r=(0,o.useRef)(t);r.current=t,we(()=>()=>r.current())};0&&(module.exports={commonFilters,distFilter,gitFilter,miscFilter,processDirectory,useFileSystem,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+IHtcblx0dXNlRWZmZWN0KGVmZmVjdCwgW10pO1xufTtcblxuY29uc3QgdXNlVW5tb3VudCA9IChmbjogKCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xuXHRjb25zdCBmblJlZiA9IHVzZVJlZihmbik7XG5cblx0Zm5SZWYuY3VycmVudCA9IGZuO1xuXG5cdHVzZUVmZmVjdE9uY2UoKCkgPT4gKCkgPT4gZm5SZWYuY3VycmVudCgpKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAidWtCQUFBLElBQUFBLEdBQUEsR0FBQUMsR0FBQUQsR0FBQSxtQkFBQUUsRUFBQSxlQUFBQyxFQUFBLGNBQUFDLEVBQUEsZUFBQUMsRUFBQSxxQkFBQUMsRUFBQSxrQkFBQUMsRUFBQSxVQUFBQyxLQUFBLGVBQUFDLEdBQUFULElBQUEsSUFBQVUsRUFBbUIsc0JBQ25CQyxFQU1PLGlCQXdDTVAsRUFBc0IsU0FBWSxDQUM5QyxJQUFNUSxLQUFLLEVBQUFDLFNBQU8sQ0FDakIsbUJBQW9CLEVBQ3JCLENBQUMsRUFHR0MsRUFBa0IsR0FFdEIsTUFBTyxDQUNOLGtCQUFtQixNQUFPQyxFQUFrQkMsSUFBNkIsQ0FDeEUsR0FDQ0QsRUFBUyxTQUFTLFlBQVksR0FDOUIsQ0FBQ0QsR0FDREUsRUFBTyxPQUFTLE9BQ2YsQ0FHRCxJQUFNQyxFQUFPLE1BREEsTUFETUQsRUFDVyxR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S0FBS3BDLEVBQW1CLE9BQU8sRUFBRSxJQUFLZ0IsR0FBYSxDQUN4REEsRUFDQWYsRUFBWSxRQUFRZSxDQUFRLENBQzdCLENBQUMsQ0FDRixFQUVBLE9BQU9mLEVBQVksUUFBUXRCLENBQUksRUFDL0JxQixFQUFtQixRQUFRLE9BQU9yQixDQUFJLEVBRXRDZ0IsR0FBQSxNQUFBQSxFQUFlbUMsRUFBY00sR0FDN0IvQixFQUFTLElBQUksSUFBSSxPQUFPLFFBQVFKLEVBQVksT0FBTyxDQUFDLENBQUMsQ0FDdEQsRUFDQSxDQUFDTixDQUFZLENBQ2QsRUFFQSxPQUFBNkQsR0FBVyxJQUFNLENBQ2hCOUMsRUFBd0IsQ0FDekIsQ0FBQyxFQUVNLENBQ04sUUFBU1gsRUFBVyxRQUNwQixxQkFBQXlDLEVBQ0EsUUFBUzlCLEVBQ1QsTUFBTzJCLEVBQ1AsU0FBQWhDLEVBQ0EsYUFBQUMsRUFDQSxtQkFBb0IsU0FBVyxRQUFhLHdCQUF5QixPQUNyRSxVQUFBcUMsRUFDQSxXQUFBVSxHQUNBLFdBQUFFLEVBQ0QsQ0FDRCxFQUVhbEcsR0FBUUQsRUFJZnFHLEdBQWlCQyxHQUEyQixJQUNqRCxhQUFVQSxFQUFRLENBQUMsQ0FBQyxDQUNyQixFQUVNRixHQUFjRyxHQUF5QixDQUM1QyxJQUFNQyxLQUFRLFVBQU9ELENBQUUsRUFFdkJDLEVBQU0sUUFBVUQsRUFFaEJGLEdBQWMsSUFBTSxJQUFNRyxFQUFNLFFBQVEsQ0FBQyxDQUMxQyIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgImNvbW1vbkZpbHRlcnMiLCAiZGlzdEZpbHRlciIsICJnaXRGaWx0ZXIiLCAibWlzY0ZpbHRlciIsICJwcm9jZXNzRGlyZWN0b3J5IiwgInVzZUZpbGVTeXN0ZW0iLCAidXNlRnMiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9pZ25vcmUiLCAiaW1wb3J0X3JlYWN0IiwgImlnIiwgImlnbm9yZSIsICJnaXRJZ25vcmVMb2FkZWQiLCAiZmlsZXBhdGgiLCAiaGFuZGxlIiwgInRleHQiLCAiaWdub3JlZCIsICJfaGFuZGxlIiwgImlzRGlzdCIsICJpc01pc2MiLCAiZGlyZWN0b3J5SGFuZGxlIiwgImRpcmVjdG9yeVBhdGgiLCAiZmlsdGVycyIsICJpbmNsdWRlRmlsZXMiLCAiaWdub3JlRmlsZVBhdGhzIiwgImZpbHRlciIsICJmaWxlUHJvbWlzZXMiLCAiZW50cnkiLCAicGF0aCIsICJzaG91bGRJbmNsdWRlIiwgImRpclByb21pc2VzIiwgInVzZURlYm91bmNlIiwgInZhbHVlIiwgImRlbGF5IiwgImRlYm91bmNlZFZhbHVlIiwgInNldERlYm91bmNlZFZhbHVlIiwgImhhbmRsZXIiLCAiREVGQVVMVF9QT0xMX0lOVEVSVkFMIiwgIkRFRkFVTFRfQkFUQ0hfU0laRSIsICJERUZBVUxUX0RFQk9VTkNFX0lOVEVSVkFMIiwgIkRFRkFVTFRfRklMRV9DQUNIRV9UVEwiLCAicHJvcHMiLCAib25BZGRGaWxlIiwgIm9uQ2hhbmdlRmlsZSIsICJvbkRlbGV0ZUZpbGUiLCAiYmF0Y2hTaXplIiwgImRlYm91bmNlSW50ZXJ2YWwiLCAid2F0Y2hlZERpcmVjdG9yaWVzUmVmIiwgImhhbmRsZXNSZWYiLCAicHJldmlvdXNIYW5kbGVzUmVmIiwgImZpbGVzTWFwUmVmIiwgInByZXZpb3VzRmlsZXNNYXBSZWYiLCAiaW50ZXJ2YWxSZWYiLCAiZmlsZXMiLCAic2V0RmlsZXMiLCAiaXNQcm9jZXNzaW5nIiwgInNldElzUHJvY2Vzc2luZyIsICJmaWxlQ29udGVudHNDYWNoZSIsICJmaWxlQ2FjaGVUdGwiLCAiY2xlYXJXYXRjaGVkRGlyZWN0b3JpZXMiLCAicHJvY2Vzc1dhdGNoZWREaXJlY3RvcmllcyIsICJ0ZW1wb3JhcnlIYW5kbGVzIiwgImZpbHRlckZucyIsICJmaWx0ZXJGbiIsICJfIiwgImZpbGVQYXRoIiwgInByb2Nlc3NGaWxlcyIsICJzZWVuRmlsZXMiLCAiY2hhbmdlZEZpbGVzIiwgImRlbGV0ZWRGaWxlc1NldCIsICJyZXJlbmRlciIsICJub3ciLCAiaGFuZGxlcyIsICJuZXdGaWxlc01hcCIsICJpIiwgImJhdGNoIiwgImNhY2hlZCIsICJjYWNoZUVudHJpZXMiLCAidGltZXN0YW1wIiwgImRlbGV0ZWRGaWxlcyIsICJhZGRlZEZpbGVzIiwgImFkZGVkRmlsZXNNYXAiLCAiYWRkZWRGaWxlIiwgImRlbGV0ZWRGaWxlc01hcCIsICJkZWxldGVkRmlsZSIsICJwcmV2aW91c0ZpbGVzIiwgImRlYm91bmNlZEZpbGVzIiwgInN0YXJ0UG9sbGluZ1dhdGNoZWREaXJlY3RvcmllcyIsICJwcm9jZXNzaW5nUHJvbWlzZSIsICJvbkRpcmVjdG9yeVNlbGVjdGlvbiIsICJpbml0aWFsRGlyZWN0b3J5UGF0aCIsICJlcnJvciIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJvcHRpb25zIiwgImNyZWF0ZSIsICJ0cnVuY2F0ZSIsICJmaWxlTmFtZSIsICJkaXJIYW5kbGUiLCAiZmlsZUhhbmRsZSIsICJ3cml0YWJsZSIsICJjb250ZW50IiwgImNyZWF0ZUZpbGUiLCAiaW5pdGlhbERhdGEiLCAiZGVsZXRlRmlsZSIsICJ1c2VVbm1vdW50IiwgInVzZUVmZmVjdE9uY2UiLCAiZWZmZWN0IiwgImZuIiwgImZuUmVmIl0KfQo=