pup-recorder 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pup-recorder",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Record web pages as video",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,7 +41,7 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "commander": "latest",
44
- "electron": "latest",
44
+ "electron": "41.2.0",
45
45
  "fflate": "latest",
46
46
  "node-av": "latest",
47
47
  "tree-kill": "latest",
@@ -1,2 +0,0 @@
1
- import'source-map-support/register.js';import {createRequire}from'module';import {dirname,join}from'path';import {Log}from'node-av';import {AV_LOG_ERROR,AV_LOG_WARNING}from'node-av/constants';import {spawn}from'child_process';import Fe from'tree-kill';import m from'zod';import {ok}from'assert';import {randomUUID}from'crypto';import {rmSync}from'fs';import {mkdir}from'fs/promises';import {tmpdir,platform}from'os';import Ke from'electron';import {HardwareContext}from'node-av/api';import {EventEmitter}from'events';import {createServer}from'net';var ye=Object.create;var C=Object.defineProperty;var _e=Object.getOwnPropertyDescriptor;var O=(t,e)=>(e=Symbol[t])?e:Symbol.for("Symbol."+t),k=t=>{throw TypeError(t)};var Y=(t,e,r)=>e in t?C(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var X=t=>[,,,ye(null)],Z=["class","method","getter","setter","accessor","field","value","get","set"],S=t=>t!==void 0&&typeof t!="function"?k("Function expected"):t,Ee=(t,e,r,n,o)=>({kind:Z[t],name:e,metadata:n,addInitializer:i=>r._?k("Already initialized"):o.push(S(i||null))}),G=(t,e)=>Y(e,O("metadata"),t[3]),Q=(t,e,r,n)=>{for(var o=0,i=t[e>>1],s=i&&i.length;o<s;o++)i[o].call(r);return n},E=(t,e,r,n,o,i)=>{var c,u,p,y,a=e&7,_=false,f=false,v=2,M=Z[a+5],xe=t[v]||(t[v]=[]),h=((o=o.prototype),_e(o,r));for(var U=n.length-1;U>=0;U--)p=Ee(a,r,u={},t[3],xe),(p.static=_,p.private=f,y=p.access={has:d=>r in d},(y.get=d=>d[r]),a>2),c=(0, n[U])(h[M],p),u._=1,S(c)&&(h[M]=c);return h&&C(o,r,h),o},ee=(t,e,r)=>Y(t,e+"",r);var or=(t,e,r)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&k("Object expected");var n,o;r&&(n=e[O("asyncDispose")]),n===void 0&&(n=e[O("dispose")],r&&(o=n)),typeof n!="function"&&k("Object not disposable"),o&&(n=function(){try{o.call(this);}catch(i){return Promise.reject(i)}}),t.push([r,n,e]);}else r&&t.push([r]);return e},ir=(t,e,r)=>{var n=typeof SuppressedError=="function"?SuppressedError:function(s,c,u,p){return p=Error(u),p.name="SuppressedError",p.error=s,p.suppressed=c,p},o=s=>e=r?new n(s,e,"An error was suppressed during disposal"):(r=true,s),i=s=>{for(;s=t.pop();)try{var c=s[1]&&s[1].call(s[2]);if(s[0])return Promise.resolve(c).then(i,u=>(o(u),i()))}catch(u){o(u);}if(r)throw e};return i()};function re(t,e,r){try{return e(process.env[t])}catch{return r}}function te(t){if(typeof t=="number")return t;let e=Number(t);if(Number.isNaN(e))throw new Error(`Value ${t} is not a valid number`);return e}function ur(t){return typeof t=="string"?t:String(t)}var Ae=createRequire(import.meta.url),R=process.env,A=re("PUP_LOG_LEVEL",te,2),ne=R.PUP_USE_INNER_PROXY==="1",oe=R.PUP_DISABLE_GPU==="1",ie=R.PUP_DISABLE_HW_CODEC==="1",se=R.PUP_DETERMINISTIC==="1",De=dirname(Ae.resolve("pup-recorder/package.json")),ae=join(De,"dist","app.cjs"),gr=R.PUP_IPC_SOCKET,ce=R.PUP_WINDOW_TOLERANT==="1";var N="<pup@debug>",$="<pup@info>",B="<pup@warn>",H="<pup@error>",W="<pup@fatal>";function I(t,e){return function(...r){let n=r.map(o=>o instanceof Error?o.stack??String(o):o);return t.call(this,...n)}}var ue,pe,le,de,fe,x;fe=[I],de=[I],le=[I],pe=[I],ue=[I];var P=class{constructor(e=A){this._level=e;Q(x,5,this);ee(this,"_impl");this.impl=console;}_level;get level(){return this._level}set level(e){this._level=e,this.impl=this._impl??console;}get impl(){return this._impl}set impl(e){let r=e.debug??console.debug,n=e.info??console.info,o=e.warn??console.warn,i=e.error??console.error,s=this._level;this._impl={debug:s>=3?r:void 0,info:s>=2?n:void 0,warn:s>=1?o:void 0,error:s>=0?i:void 0};}debug(...e){this.impl?.debug?.(N,...e);}info(...e){this.impl?.info?.($,...e);}warn(...e){this.impl?.warn?.(B,...e);}error(...e){this.impl?.error?.(H,...e);}fatal(...e){this.impl?.error?.(W,...e),process.exit(1);}dispatch(e){let r=e.trimEnd();r.startsWith(N)?this.debug(r.slice(N.length+1)):r.startsWith($)?this.info(r.slice($.length+1)):r.startsWith(B)?this.warn(r.slice(B.length+1)):r.startsWith(H)?this.error(r.slice(H.length+1)):this.info(r);}attach(e,r){return new Promise((n,o)=>{this.debug(`${r}.attach`);let i="",s=c=>{let u=c.toString();u.startsWith(W)?i+=u.slice(W.length+1):this.dispatch(u);};e.stderr?.on("data",s),e.stdout?.on("data",s),e.on("message",s).on("error",c=>{i+=c.message,e.kill();}).once("close",(c,u)=>{c||u||i?(i||=`command failed: ${e.spawnargs.join(" ")}`,this.debug(`${r}.close`,{code:c,signal:u,fatal:i}),o(new Error(i))):(this.debug(`${r}.close`),n());}).on("unhandledRejection",c=>{this.error(`${r}.unhandled`,c);}).on("uncaughtExceptionMonitor",c=>{this.error(`${r}.unhandled`,c);});})}};x=X(),E(x,1,"debug",fe,P),E(x,1,"info",de,P),E(x,1,"warn",le,P),E(x,1,"error",pe,P),E(x,1,"fatal",ue,P),G(x,P);var l=new P;Log.setCallback((t,e)=>{let r=e.trimEnd();r&&(t<=AV_LOG_ERROR?l.error(r):t<=AV_LOG_WARNING&&l.warn(r));});function Er(t,e){return (...r)=>{try{let n=t(...r);return n instanceof Promise?n.catch(()=>e):n}catch{return e}}}var V="--pup-priv-args";function Ar(){let t=process.argv,e=t.find(n=>n.startsWith(V));if(!e)return l.debug("procargv",t),process.argv;let r=["exec",...t.slice(-1)];return e=Buffer.from(e.split("=")[1],"base64").toString(),r.push(...JSON.parse(e)),l.debug("pupargs",r),r}function me(t,e){let r=t.split(" ").filter(s=>s.length),[n,...o]=r;if(!n)throw new Error("empty command");let i=spawn(n,o,{stdio:"inherit",...e});return {process:i,wait:l.attach(i,n),kill(){let s=i.pid;s?Fe(s):i.kill();}}}var Ne=1920,$e=1080,Be=30,He=5,We="output.mp4",Gr=m.object({duration:m.number().describe("Duration in seconds"),width:m.number().describe("Video width"),height:m.number().describe("Video height"),fps:m.number().describe("Frames per second"),withAudio:m.boolean().describe("Capture and encode audio"),outFile:m.string().describe("Output mp4 file path"),useInnerProxy:m.boolean().describe("Use bilibili inner proxy for resource access"),deterministic:m.boolean().describe("Render by frame rather than recording"),disableGpu:m.boolean().describe("Disable GPU rendering, may reduce performance but increase stability"),disableHwCodec:m.boolean().describe("Disable hardware video encoder (NVENC/VideoToolbox), use software x265"),windowTolerant:m.boolean().describe("Fall back to dom-ready if warmup load times out")}),he={width:Ne,height:$e,fps:Be,duration:He,outFile:We,withAudio:false,useInnerProxy:ne,deterministic:se,disableGpu:oe,disableHwCodec:ie,windowTolerant:ce};var je="[HWAccel]";async function Me(){let t=HardwareContext.auto(),e=t!==null;return t?.dispose(),e}var ge=Me().then(t=>(l.debug(je,"gpu:",t),t));async function be(t){let e=["no-sandbox","disable-dev-shm-usage","disable-web-security","disable-site-isolation-trials","ignore-certificate-errors","disable-blink-features=AutomationControlled","mute-audio","autoplay-policy=no-user-gesture-required","disable-extensions","force-device-scale-factor=1","force-color-profile=srgb","ignore-gpu-blocklist","use-gl=angle","deterministic-mode","enable-begin-frame-control","disable-new-content-rendering-timeout","run-all-compositor-stages-before-draw","disable-threaded-animation","disable-threaded-scrolling","disable-checker-imaging","disable-image-animation-resync","enable-surface-synchronization","font-render-hinting=none","disable-background-networking"];A<3&&e.push("log-level=3");let r=["FontationBackend"];if(!(await ge&&!t))e.push("use-angle=swiftshader","enable-unsafe-swiftshader");else {e.push("disable-gpu-sandbox","enable-unsafe-webgpu");let o=platform();o==="darwin"?e.push("use-angle=metal"):o==="win32"?e.push("use-angle=d3d11"):(e.push("use-angle=vulkan","disable-vulkan-surface"),r.push("Vulkan"));}return e.push(`enable-features=${r.join(",")}`),e}async function qe(t){return [...await be(t),"headless=new"]}var Ye="[Electron]";async function we(t,e,r){let n=[],o=platform();o==="linux"&&n.push("xvfb-run","--auto-servernum",`--server-args="-screen 0 ${t.width}x${t.height}x24"`);let s=(await qe(e.includes("--disable-gpu"))).map(p=>`--${p}`),c=Buffer.from(JSON.stringify(e)).toString("base64");s.push(`${V}=${c}`),n.push(Ke,...s,ae);let u=n.join(" ");return l.debug(Ye,u),me(u,{stdio:["ignore","pipe","pipe"],shell:o==="linux",env:{...process.env,RUST_BACKTRACE:"full",PUP_IPC_SOCKET:r}})}var D=8;var j=class extends EventEmitter{constructor(r){super();this._socket=r;this._socket.on("data",n=>this.onData(n)),this._socket.on("error",n=>this.emit("error",n)),this._socket.on("close",()=>this.emit("close"));}_socket;_chunks=[];_buffered=0;onData(r){this._chunks.push(r),this._buffered+=r.byteLength,this.flush();}flush(){for(;;){if(this._buffered<D)return;let r=this.peek(D),n=r.readUInt32LE(0),o=r.readUInt32LE(4);if(this._buffered<D+o)return;this.consume(D);let i=this.consume(o);switch(this.emit("message",n,i),n){case 1:{this.emit("progress",Number(i.toString()));break}case 2:{this.emit("done",JSON.parse(i.toString()));break}case 3:{this.emit("error",new Error(i.toString()));break}}}}peek(r){return this._chunks[0]&&this._chunks[0].byteLength>=r?this._chunks[0]:Buffer.concat(this._chunks).subarray(0,r)}consume(r){let n=Buffer.allocUnsafe(r),o=0;for(;o<r;){let i=this._chunks[0],s=Math.min(i.byteLength,r-o);i.copy(n,o,0,s),s===i.byteLength?this._chunks.shift():this._chunks[0]=i.subarray(s),o+=s;}return this._buffered-=r,n}};function Pe(t){return new Promise((e,r)=>{let n=createServer();n.once("error",r),n.listen(t,()=>{e({waitForConnection(){return new Promise((o,i)=>{n.once("connection",s=>o(new j(s))),n.once("error",i);})},close(){n.close();}});});})}var T="[pup]";async function nr(t,e,r){l.debug(T,"runPupApp",t,e);let n=[t,"--width",`${e.width}`,"--height",`${e.height}`,"--fps",`${e.fps}`,"--duration",`${e.duration}`,"--out-file",`${e.outFile}`];return e.withAudio&&n.push("--with-audio"),e.useInnerProxy&&n.push("--use-inner-proxy"),e.deterministic&&n.push("--deterministic"),e.disableGpu&&n.push("--disable-gpu"),e.disableHwCodec&&n.push("--disable-hw-codec"),e.windowTolerant&&n.push("--window-tolerant"),we(e,n,r)}var w=he;async function bt(t,e){l.debug(T,"pup",t,e);let{signal:r}=e;r?.throwIfAborted();let n=e.outFile??w.outFile,o={width:e.width??w.width,height:e.height??w.height,fps:e.fps??w.fps,duration:e.duration??w.duration,withAudio:e.withAudio??w.withAudio,useInnerProxy:e.useInnerProxy??w.useInnerProxy,deterministic:e.deterministic??w.deterministic,disableGpu:e.disableGpu??w.disableGpu,disableHwCodec:e.disableHwCodec??w.disableHwCodec,windowTolerant:e.windowTolerant??w.windowTolerant,outFile:n},i=join(tmpdir(),"pup",randomUUID());await mkdir(i,{recursive:true});let s=join(i,"pup.sock"),c=performance.now(),u=a=>(l.info(T,`${t} progress: ${a}%`),e.onProgress?.(a)),p=await Pe(s),y=await nr(t,{...o,signal:r},s);r?.addEventListener("abort",()=>{l.debug(T,"aborted"),y.kill(),rmSync(i,{recursive:true,force:true});},{once:true});try{let a=new Promise(async(f,v)=>{(await p.waitForConnection()).on("close",()=>v(new Error("IPC closed without result"))).on("message",()=>r?.aborted&&v(r.reason)).on("progress",u).on("done",f).on("error",v);}).finally(()=>p.close());u(0);let _=await Promise.race([a,y.wait]);return ok(_,"no summary received"),u(100),l.info(T,`done ${n} in ${Math.round(performance.now()-c)}ms`),{..._,options:o}}catch(a){throw r?.throwIfAborted(),a}finally{rmSync(i,{recursive:true,force:true});}}export{he as A,bt as B,or as a,ir as b,re as c,te as d,ur as e,A as f,ne as g,oe as h,ie as i,se as j,De as k,ae as l,gr as m,ce as n,P as o,l as p,Er as q,V as r,Ar as s,me as t,Ne as u,$e as v,Be as w,He as x,We as y,Gr as z};//# sourceMappingURL=chunk-NKXGLDTD.js.map
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2Vudi50cyIsIi4uL3NyYy9iYXNlL3BhcnNlci50cyIsIi4uL3NyYy9iYXNlL2NvbnN0YW50cy50cyIsIi4uL3NyYy9iYXNlL2xvZ2dpbmcudHMiLCIuLi9zcmMvYmFzZS9ub2Vyci50cyIsIi4uL3NyYy9iYXNlL3Byb2Nlc3MudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2NoZW1hLnRzIiwiLi4vc3JjL2Jhc2UvaHdhY2NlbC50cyIsIi4uL3NyYy9iYXNlL2Nocm9taXVtLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2VsZWN0cm9uLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2lwYy50cyIsIi4uL3NyYy9wdXAudHMiXSwibmFtZXMiOlsicGVudiIsIm5hbWUiLCJwYXJzZXIiLCJkZWZhdWx0VmFsdWUiLCJwYXJzZU51bWJlciIsIngiLCJudW0iLCJwYXJzZVN0cmluZyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwiZW52IiwicHVwTG9nTGV2ZWwiLCJwdXBVc2VJbm5lclByb3h5IiwicHVwRGlzYWJsZUdQVSIsInB1cERpc2FibGVId0NvZGVjIiwicHVwRGV0ZXJtaW5pc3RpYyIsInB1cFBrZ1Jvb3QiLCJkaXJuYW1lIiwicHVwQXBwIiwiam9pbiIsInB1cElwY1NvY2tldCIsInB1cFdpbmRvd1RvbGVyYW50IiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiRkFUQUwiLCJzdGFja0hvb2siLCJ0YXJnZXQiLCJfY29udGV4dCIsIm1lc3NhZ2VzIiwicHJvY2Vzc2VkIiwibXNnIiwiX2ZhdGFsX2RlYyIsIl9lcnJvcl9kZWMiLCJfd2Fybl9kZWMiLCJfaW5mb19kZWMiLCJfZGVidWdfZGVjIiwiX2luaXQiLCJMb2dnZXIiLCJfbGV2ZWwiLCJfX3J1bkluaXRpYWxpemVycyIsIl9fcHVibGljRmllbGQiLCJ2YWx1ZSIsImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImx2IiwibWVzc2FnZSIsInByb2MiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmF0YWwiLCJkaXNwYXRjaCIsImRhdGEiLCJlcnIiLCJjb2RlIiwic2lnbmFsIiwicmVhc29uIiwiX19kZWNvcmF0b3JTdGFydCIsIl9fZGVjb3JhdGVFbGVtZW50IiwiX19kZWNvcmF0b3JNZXRhZGF0YSIsImxvZ2dlciIsIkxvZyIsImxldmVsIiwiQVZfTE9HX0VSUk9SIiwiQVZfTE9HX1dBUk5JTkciLCJub2VyciIsImZuIiwiYXJncyIsInJldCIsIlBVUF9BUkdTX0tFWSIsInBhcmdzIiwiYXJndiIsInByaXYiLCJhcmciLCJleGVjIiwiY21kIiwib3B0aW9ucyIsInBhcnRzIiwiY29tbWFuZCIsInNwYXduIiwicGlkIiwidHJlZUtpbGwiLCJERUZBVUxUX1dJRFRIIiwiREVGQVVMVF9IRUlHSFQiLCJERUZBVUxUX0ZQUyIsIkRFRkFVTFRfRFVSQVRJT04iLCJERUZBVUxUX09VVF9GSUxFIiwiUmVuZGVyU2NoZW1hIiwieiIsImRlZmF1bHRSZW5kZXJPcHRpb25zIiwiVEFHIiwiZGV0ZWN0R1BVRHJpdmVyIiwiaHciLCJIYXJkd2FyZUNvbnRleHQiLCJyZXN1bHQiLCJjYW5JVXNlR1BVIiwiY2hyb21pdW1PcHRpb25zIiwiZGlzYWJsZUdwdSIsIm9wdHMiLCJmZWF0dXJlcyIsInBsYXQiLCJwbGF0Zm9ybSIsImVsZWN0cm9uT3B0cyIsInJ1bkVsZWN0cm9uQXBwIiwic2l6ZSIsImlwY1NvY2tldFBhdGgiLCJjbWRQYXJ0cyIsImVsZWN0cm9uQXJncyIsImEiLCJiYXNlNjRBcmdzIiwiZWxlY3Ryb24iLCJIRUFERVJfU0laRSIsIklwY1JlYWRlciIsIkV2ZW50RW1pdHRlciIsIl9zb2NrZXQiLCJoZWFkZXIiLCJ0eXBlIiwibGVuIiwicGF5bG9hZCIsIm4iLCJvdXQiLCJvZmZzZXQiLCJjaHVuayIsInRha2UiLCJjcmVhdGVJcGNTZXJ2ZXIiLCJzb2NrZXRQYXRoIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib2siLCJubyIsInNvY2tldCIsInJ1blB1cEFwcCIsInNvdXJjZSIsImQiLCJwdXAiLCJvdXRGaWxlIiwicmVuZGVyT3B0cyIsInRtcERpciIsInRtcGRpciIsInJhbmRvbVVVSUQiLCJta2RpciIsInQwIiwidGljayIsInAiLCJoYW5kbGUiLCJybVN5bmMiLCJzdW1tYXJ5IiwiZSJdLCJtYXBwaW5ncyI6InFzRUFNTyxTQUFTQSxFQUFBQSxDQUFRQyxDQUFBQSxDQUFjQyxDQUFBQSxDQUFzQkMsQ0FBQUEsQ0FBaUMsQ0FDM0YsR0FBSSxDQUNGLE9BQU9ELENBQUFBLENBQU8sT0FBQSxDQUFRLEdBQUEsQ0FBSUQsQ0FBSSxDQUFDLENBQ2pDLENBQUEsS0FBUSxDQUNOLE9BQU9FLENBQ1QsQ0FDRixDQ1ZPLFNBQVNDLEVBQUFBLENBQVlDLENBQUFBLENBQW9CLENBQzlDLEdBQUksT0FBT0EsQ0FBQUEsRUFBTSxRQUFBLENBQ2YsT0FBT0EsQ0FBQUEsQ0FFVCxJQUFNQyxDQUFBQSxDQUFNLE1BQUEsQ0FBT0QsQ0FBQyxDQUFBLENBQ3BCLEdBQUksTUFBQSxDQUFPLEtBQUEsQ0FBTUMsQ0FBRyxDQUFBLENBQ2xCLE1BQU0sSUFBSSxLQUFBLENBQU0sU0FBU0QsQ0FBQyxDQUFBLHNCQUFBLENBQXdCLENBQUEsQ0FFcEQsT0FBT0MsQ0FDVCxDQUVPLFNBQVNDLEVBQUFBLENBQVlGLENBQUFBLENBQW9CLENBQzlDLE9BQUksT0FBT0EsQ0FBQUEsRUFBTSxRQUFBLENBQWlCQSxFQUMzQixNQUFBLENBQU9BLENBQUMsQ0FDakIsS0NUTUcsRUFBQUEsQ0FBVUMsYUFBQUEsQ0FBYyxNQUFBLENBQUEsSUFBQSxDQUFZLEdBQUcsQ0FBQSxDQUN2Q0MsQ0FBQUEsQ0FBTSxPQUFBLENBQVEsR0FBQSxDQUVQQyxDQUFBQSxDQUFjWCxFQUFBQSxDQUFLLGVBQUEsQ0FBaUJJLEVBQUFBLENBQWEsQ0FBQyxDQUFBLENBQ2xEUSxHQUFtQkYsQ0FBQUEsQ0FBSSxtQkFBQSxHQUEyQixHQUFBLENBQ2xERyxFQUFBQSxDQUFnQkgsQ0FBQUEsQ0FBSSxlQUFBLEdBQXVCLEdBQUEsQ0FDM0NJLEVBQUFBLENBQW9C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QyxDQUFBLEVBQUEsQ0FBSSxDQUFBLENBQ3RFLENBQUUsR0FBR0ssQ0FBQUEsQ0FBUyxPQUFBLENBQVNWLENBQVcsQ0FDM0MsQ0FBQSxNQUFTVyxDQUFBQSxDQUFHLENBQ1YsTUFBQTVGLENBQUFBLEVBQVEsY0FBQSxFQUFlLENBQ2pCNEYsQ0FDUixDQUFBLE9BQUUsQ0FDQUYsTUFBQUEsQ0FBT1IsQ0FBQUEsQ0FBUSxDQUFFLFNBQUEsQ0FBVyxJQUFBLENBQU0sS0FBQSxDQUFPLElBQUssQ0FBQyxFQUNqRCxDQUNGIiwiZmlsZSI6ImNodW5rLU5LWEdMRFRELmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNS5cblxuZXhwb3J0IHR5cGUgRW52UGFyc2VyPFQ+ID0gKHZhbHVlOiB1bmtub3duKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHBlbnY8VD4obmFtZTogc3RyaW5nLCBwYXJzZXI6IEVudlBhcnNlcjxUPiwgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlcihwcm9jZXNzLmVudltuYW1lXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlcih4OiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgY29uc3QgbnVtID0gTnVtYmVyKHgpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlICR7eH0gaXMgbm90IGEgdmFsaWQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHJldHVybiB4O1xuICByZXR1cm4gU3RyaW5nKHgpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJtb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGVudiB9IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5leHBvcnQgY29uc3QgcHVwTG9nTGV2ZWwgPSBwZW52KFwiUFVQX0xPR19MRVZFTFwiLCBwYXJzZU51bWJlciwgMik7XG5leHBvcnQgY29uc3QgcHVwVXNlSW5uZXJQcm94eSA9IGVudltcIlBVUF9VU0VfSU5ORVJfUFJPWFlcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERpc2FibGVHUFUgPSBlbnZbXCJQVVBfRElTQUJMRV9HUFVcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERpc2FibGVId0NvZGVjID0gZW52W1wiUFVQX0RJU0FCTEVfSFdfQ09ERUNcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERldGVybWluaXN0aWMgPSBlbnZbXCJQVVBfREVURVJNSU5JU1RJQ1wiXSA9PT0gXCIxXCI7XG5cbmV4cG9ydCBjb25zdCBwdXBQa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJwdXAtcmVjb3JkZXIvcGFja2FnZS5qc29uXCIpKTtcbmV4cG9ydCBjb25zdCBwdXBBcHAgPSBqb2luKHB1cFBrZ1Jvb3QsIFwiZGlzdFwiLCBcImFwcC5janNcIik7XG5leHBvcnQgY29uc3QgcHVwSXBjU29ja2V0ID0gZW52W1wiUFVQX0lQQ19TT0NLRVRcIl07XG5cbmV4cG9ydCBjb25zdCBwdXBXaW5kb3dUb2xlcmFudCA9IGVudltcIlBVUF9XSU5ET1dfVE9MRVJBTlRcIl0gPT09IFwiMVwiO1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNi5cblxuaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCB0eXBlIFNlcmlhbGl6YWJsZSB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHsgQVZfTE9HX0VSUk9SLCBBVl9MT0dfV0FSTklORyB9IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcHVwTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJMaWtlIHtcbiAgZGVidWc/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIGluZm8/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIHdhcm4/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIGVycm9yPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcbn1cblxuY29uc3QgREVCVUcgPSBcIjxwdXBAZGVidWc+XCI7XG5jb25zdCBJTkZPID0gXCI8cHVwQGluZm8+XCI7XG5jb25zdCBXQVJOID0gXCI8cHVwQHdhcm4+XCI7XG5jb25zdCBFUlJPUiA9IFwiPHB1cEBlcnJvcj5cIjtcbmNvbnN0IEZBVEFMID0gXCI8cHVwQGZhdGFsPlwiO1xuXG5mdW5jdGlvbiBzdGFja0hvb2sodGFyZ2V0OiBGdW5jdGlvbiwgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IExvZ2dlciwgLi4ubWVzc2FnZXM6IHVua25vd25bXSkge1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICByZXR1cm4gbXNnIGluc3RhbmNlb2YgRXJyb3IgPyAobXNnLnN0YWNrID8/IFN0cmluZyhtc2cpKSA6IG1zZztcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LmNhbGwodGhpcywgLi4ucHJvY2Vzc2VkKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIExvZ2dlckxpa2Uge1xuICBwcml2YXRlIF9pbXBsPzogTG9nZ2VyTGlrZTtcblxuICBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBzZXQgbGV2ZWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2xldmVsID0gdmFsdWU7XG4gICAgdGhpcy5pbXBsID0gdGhpcy5faW1wbCA/PyBjb25zb2xlO1xuICB9XG5cbiAgZ2V0IGltcGwoKTogTG9nZ2VyTGlrZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGw7XG4gIH1cblxuICBzZXQgaW1wbCh2YWx1ZTogTG9nZ2VyTGlrZSkge1xuICAgIGNvbnN0IGRlYnVnID0gdmFsdWUuZGVidWcgPz8gY29uc29sZS5kZWJ1ZztcbiAgICBjb25zdCBpbmZvID0gdmFsdWUuaW5mbyA/PyBjb25zb2xlLmluZm87XG4gICAgY29uc3Qgd2FybiA9IHZhbHVlLndhcm4gPz8gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IGVycm9yID0gdmFsdWUuZXJyb3IgPz8gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBsdiA9IHRoaXMuX2xldmVsO1xuICAgIHRoaXMuX2ltcGwgPSB7XG4gICAgICBkZWJ1ZzogbHYgPj0gMyA/IGRlYnVnIDogdW5kZWZpbmVkLFxuICAgICAgaW5mbzogbHYgPj0gMiA/IGluZm8gOiB1bmRlZmluZWQsXG4gICAgICB3YXJuOiBsdiA+PSAxID8gd2FybiA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yOiBsdiA+PSAwID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xldmVsOiBudW1iZXIgPSBwdXBMb2dMZXZlbCkge1xuICAgIHRoaXMuaW1wbCA9IGNvbnNvbGU7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGRlYnVnKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmRlYnVnPy4oREVCVUcsIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgaW5mbyguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5pbmZvPy4oSU5GTywgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICB3YXJuKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/Lndhcm4/LihXQVJOLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGVycm9yKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmVycm9yPy4oRVJST1IsIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZmF0YWwoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZXJyb3I/LihGQVRBTCwgLi4ubWVzc2FnZXMpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2gobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbXNnID0gbWVzc2FnZS50cmltRW5kKCk7XG4gICAgaWYgKG1zZy5zdGFydHNXaXRoKERFQlVHKSkge1xuICAgICAgdGhpcy5kZWJ1Zyhtc2cuc2xpY2UoREVCVUcubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobXNnLnN0YXJ0c1dpdGgoSU5GTykpIHtcbiAgICAgIHRoaXMuaW5mbyhtc2cuc2xpY2UoSU5GTy5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtc2cuc3RhcnRzV2l0aChXQVJOKSkge1xuICAgICAgdGhpcy53YXJuKG1zZy5zbGljZShXQVJOLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1zZy5zdGFydHNXaXRoKEVSUk9SKSkge1xuICAgICAgdGhpcy5lcnJvcihtc2cuc2xpY2UoRVJST1IubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluZm8obXNnKTtcbiAgICB9XG4gIH1cblxuICBhdHRhY2gocHJvYzogQ2hpbGRQcm9jZXNzLCBuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5hdHRhY2hgKTtcbiAgICAgIGxldCBmYXRhbDogc3RyaW5nID0gXCJcIjtcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gKGRhdGE6IEJ1ZmZlciB8IFNlcmlhbGl6YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBpZiAobWVzc2FnZS5zdGFydHNXaXRoKEZBVEFMKSkge1xuICAgICAgICAgIGZhdGFsICs9IG1lc3NhZ2Uuc2xpY2UoRkFUQUwubGVuZ3RoICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbihcImRhdGFcIiwgZGlzcGF0Y2gpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKFwiZGF0YVwiLCBkaXNwYXRjaCk7XG4gICAgICBwcm9jXG4gICAgICAgIC5vbihcIm1lc3NhZ2VcIiwgZGlzcGF0Y2gpXG4gICAgICAgIC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICBmYXRhbCArPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICBwcm9jLmtpbGwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uY2UoXCJjbG9zZVwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKGNvZGUgfHwgc2lnbmFsIHx8IGZhdGFsKSB7XG4gICAgICAgICAgICBmYXRhbCB8fD0gYGNvbW1hbmQgZmFpbGVkOiAke3Byb2Muc3Bhd25hcmdzLmpvaW4oXCIgXCIpfWA7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmNsb3NlYCwgeyBjb2RlLCBzaWduYWwsIGZhdGFsIH0pO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihmYXRhbCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmNsb3NlYCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIiwgKHJlYXNvbikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYCR7bmFtZX0udW5oYW5kbGVkYCwgcmVhc29uKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwidW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yKGAke25hbWV9LnVuaGFuZGxlZGAsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuLy8gUm91dGUgZmZtcGVnIG5hdGl2ZSBsb2dzIHRocm91Z2ggcHVwJ3MgbG9nZ2VyLlxuTG9nLnNldENhbGxiYWNrKChsZXZlbCwgbWVzc2FnZSkgPT4ge1xuICBjb25zdCBtc2cgPSBtZXNzYWdlLnRyaW1FbmQoKTtcbiAgaWYgKCFtc2cpIHJldHVybjtcbiAgaWYgKGxldmVsIDw9IEFWX0xPR19FUlJPUikgbG9nZ2VyLmVycm9yKG1zZyk7XG4gIGVsc2UgaWYgKGxldmVsIDw9IEFWX0xPR19XQVJOSU5HKSBsb2dnZXIud2Fybihtc2cpO1xufSk7XG5cbmV4cG9ydCB7IGxvZ2dlciB9O1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNC5cblxuZXhwb3J0IGZ1bmN0aW9uIG5vZXJyPEZuIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIEQ+KFxuICBmbjogRm4sXG4gIGRlZmF1bHRWYWx1ZTogRCxcbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEZuPikgPT4gUmV0dXJuVHlwZTxGbj4gfCBEIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJldC5jYXRjaCgoKSA9PiBkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgdHJlZUtpbGwgZnJvbSBcInRyZWUta2lsbFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG5leHBvcnQgY29uc3QgUFVQX0FSR1NfS0VZID0gXCItLXB1cC1wcml2LWFyZ3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcmdzKCkge1xuICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuICBsZXQgcHJpdiA9IGFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChQVVBfQVJHU19LRVkpKTtcbiAgaWYgKCFwcml2KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvY2FyZ3ZcIiwgYXJndik7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndjtcbiAgfVxuICBjb25zdCBhcmdzID0gW1wiZXhlY1wiLCAuLi5hcmd2LnNsaWNlKC0xKV07XG4gIHByaXYgPSBCdWZmZXIuZnJvbShwcml2LnNwbGl0KFwiPVwiKVsxXSEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gIGFyZ3MucHVzaCguLi5KU09OLnBhcnNlKHByaXYpKTtcbiAgbG9nZ2VyLmRlYnVnKFwicHVwYXJnc1wiLCBhcmdzKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0hhbmRsZSB7XG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcbiAgd2FpdDogUHJvbWlzZTx2b2lkPjtcbiAga2lsbCgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZywgb3B0aW9ucz86IFNwYXduT3B0aW9ucyk6IFByb2Nlc3NIYW5kbGUge1xuICBjb25zdCBwYXJ0cyA9IGNtZC5zcGxpdChcIiBcIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCk7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IHBhcnRzO1xuICBpZiAoIWNvbW1hbmQpIHRocm93IG5ldyBFcnJvcihcImVtcHR5IGNvbW1hbmRcIik7XG4gIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHByb2Nlc3M6IHByb2MsXG4gICAgd2FpdDogbG9nZ2VyLmF0dGFjaChwcm9jLCBjb21tYW5kKSxcbiAgICBraWxsKCkge1xuICAgICAgY29uc3QgcGlkID0gcHJvYy5waWQ7XG4gICAgICBpZiAocGlkKSB0cmVlS2lsbChwaWQpO1xuICAgICAgZWxzZSBwcm9jLmtpbGwoKTtcbiAgICB9LFxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNi5cblxuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgcHVwRGV0ZXJtaW5pc3RpYyxcbiAgcHVwRGlzYWJsZUdQVSxcbiAgcHVwRGlzYWJsZUh3Q29kZWMsXG4gIHB1cFVzZUlubmVyUHJveHksXG4gIHB1cFdpbmRvd1RvbGVyYW50LFxufSBmcm9tIFwiLi4vYmFzZS9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0lEVEggPSAxOTIwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA4MDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUX0ZJTEUgPSBcIm91dHB1dC5tcDRcIjtcblxuZXhwb3J0IGNvbnN0IFJlbmRlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZHVyYXRpb246IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJEdXJhdGlvbiBpbiBzZWNvbmRzXCIpLFxuICB3aWR0aDogei5udW1iZXIoKS5kZXNjcmliZShcIlZpZGVvIHdpZHRoXCIpLFxuICBoZWlnaHQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJWaWRlbyBoZWlnaHRcIiksXG4gIGZwczogei5udW1iZXIoKS5kZXNjcmliZShcIkZyYW1lcyBwZXIgc2Vjb25kXCIpLFxuICB3aXRoQXVkaW86IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiQ2FwdHVyZSBhbmQgZW5jb2RlIGF1ZGlvXCIpLFxuICBvdXRGaWxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiT3V0cHV0IG1wNCBmaWxlIHBhdGhcIiksXG4gIHVzZUlubmVyUHJveHk6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVXNlIGJpbGliaWxpIGlubmVyIHByb3h5IGZvciByZXNvdXJjZSBhY2Nlc3NcIiksXG4gIGRldGVybWluaXN0aWM6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiUmVuZGVyIGJ5IGZyYW1lIHJhdGhlciB0aGFuIHJlY29yZGluZ1wiKSxcbiAgZGlzYWJsZUdwdTogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJEaXNhYmxlIEdQVSByZW5kZXJpbmcsIG1heSByZWR1Y2UgcGVyZm9ybWFuY2UgYnV0IGluY3JlYXNlIHN0YWJpbGl0eVwiKSxcbiAgZGlzYWJsZUh3Q29kZWM6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiRGlzYWJsZSBoYXJkd2FyZSB2aWRlbyBlbmNvZGVyIChOVkVOQy9WaWRlb1Rvb2xib3gpLCB1c2Ugc29mdHdhcmUgeDI2NVwiKSxcbiAgd2luZG93VG9sZXJhbnQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiRmFsbCBiYWNrIHRvIGRvbS1yZWFkeSBpZiB3YXJtdXAgbG9hZCB0aW1lcyBvdXRcIiksXG59KTtcblxuZXhwb3J0IHR5cGUgUmVuZGVyT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFJlbmRlclNjaGVtYT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUmVzdWx0IHtcbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucztcbiAgd3JpdHRlbjogbnVtYmVyO1xuICBqYW5rOiBudW1iZXI7XG4gIG91dEZpbGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZW5kZXJPcHRpb25zOiBSZW5kZXJPcHRpb25zID0ge1xuICB3aWR0aDogREVGQVVMVF9XSURUSCxcbiAgaGVpZ2h0OiBERUZBVUxUX0hFSUdIVCxcbiAgZnBzOiBERUZBVUxUX0ZQUyxcbiAgZHVyYXRpb246IERFRkFVTFRfRFVSQVRJT04sXG4gIG91dEZpbGU6IERFRkFVTFRfT1VUX0ZJTEUsXG4gIHdpdGhBdWRpbzogZmFsc2UsXG4gIHVzZUlubmVyUHJveHk6IHB1cFVzZUlubmVyUHJveHksXG4gIGRldGVybWluaXN0aWM6IHB1cERldGVybWluaXN0aWMsXG4gIGRpc2FibGVHcHU6IHB1cERpc2FibGVHUFUsXG4gIGRpc2FibGVId0NvZGVjOiBwdXBEaXNhYmxlSHdDb2RlYyxcbiAgd2luZG93VG9sZXJhbnQ6IHB1cFdpbmRvd1RvbGVyYW50LFxufTtcbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjcuXG5cbmltcG9ydCB7IEhhcmR3YXJlQ29udGV4dCB9IGZyb20gXCJub2RlLWF2L2FwaVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG5jb25zdCBUQUcgPSBcIltIV0FjY2VsXVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RHUFVEcml2ZXIoKSB7XG4gIGNvbnN0IGh3ID0gSGFyZHdhcmVDb250ZXh0LmF1dG8oKTtcbiAgY29uc3QgcmVzdWx0ID0gaHcgIT09IG51bGw7XG4gIGh3Py5kaXNwb3NlKCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBjYW5JVXNlR1BVID0gZGV0ZWN0R1BVRHJpdmVyKCkudGhlbigocmVzdWx0KSA9PiB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIFwiZ3B1OlwiLCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzA0LzAzLlxuXG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgcHVwTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNhbklVc2VHUFUgfSBmcm9tIFwiLi9od2FjY2VsXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaHJvbWl1bU9wdGlvbnMoZGlzYWJsZUdwdTogYm9vbGVhbikge1xuICBjb25zdCBvcHRzID0gW1xuICAgIC8vIOWuueWZqOaymeeusVxuICAgIFwibm8tc2FuZGJveFwiLFxuICAgIFwiZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIsXG4gICAgLy8g6Leo5Z+fL+WuieWFqFxuICAgIFwiZGlzYWJsZS13ZWItc2VjdXJpdHlcIixcbiAgICBcImRpc2FibGUtc2l0ZS1pc29sYXRpb24tdHJpYWxzXCIsXG4gICAgXCJpZ25vcmUtY2VydGlmaWNhdGUtZXJyb3JzXCIsXG4gICAgLy8g5b2V5Yi26KGM5Li6XG4gICAgXCJkaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUF1dG9tYXRpb25Db250cm9sbGVkXCIsXG4gICAgXCJtdXRlLWF1ZGlvXCIsXG4gICAgXCJhdXRvcGxheS1wb2xpY3k9bm8tdXNlci1nZXN0dXJlLXJlcXVpcmVkXCIsXG4gICAgXCJkaXNhYmxlLWV4dGVuc2lvbnNcIixcbiAgICAvLyDmuLLmn5NcbiAgICBcImZvcmNlLWRldmljZS1zY2FsZS1mYWN0b3I9MVwiLFxuICAgIFwiZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiXCIsXG4gICAgXCJpZ25vcmUtZ3B1LWJsb2NrbGlzdFwiLFxuICAgIFwidXNlLWdsPWFuZ2xlXCIsXG4gICAgXCJkZXRlcm1pbmlzdGljLW1vZGVcIixcbiAgICBcImVuYWJsZS1iZWdpbi1mcmFtZS1jb250cm9sXCIsXG4gICAgXCJkaXNhYmxlLW5ldy1jb250ZW50LXJlbmRlcmluZy10aW1lb3V0XCIsXG4gICAgXCJydW4tYWxsLWNvbXBvc2l0b3Itc3RhZ2VzLWJlZm9yZS1kcmF3XCIsXG4gICAgXCJkaXNhYmxlLXRocmVhZGVkLWFuaW1hdGlvblwiLFxuICAgIFwiZGlzYWJsZS10aHJlYWRlZC1zY3JvbGxpbmdcIixcbiAgICBcImRpc2FibGUtY2hlY2tlci1pbWFnaW5nXCIsXG4gICAgXCJkaXNhYmxlLWltYWdlLWFuaW1hdGlvbi1yZXN5bmNcIixcbiAgICBcImVuYWJsZS1zdXJmYWNlLXN5bmNocm9uaXphdGlvblwiLFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wdXBwZXRlZXIvcHVwcGV0ZWVyL2lzc3Vlcy8yNDEwXG4gICAgXCJmb250LXJlbmRlci1oaW50aW5nPW5vbmVcIixcbiAgICAvLyDotYTmupDmjqfliLZcbiAgICBcImRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nXCIsXG4gIF07XG5cbiAgaWYgKHB1cExvZ0xldmVsIDwgMykge1xuICAgIG9wdHMucHVzaChcImxvZy1sZXZlbD0zXCIpO1xuICB9XG5cbiAgY29uc3QgZmVhdHVyZXMgPSBbXCJGb250YXRpb25CYWNrZW5kXCJdO1xuICBjb25zdCBlbmFibGVHcHUgPSAoYXdhaXQgY2FuSVVzZUdQVSkgJiYgIWRpc2FibGVHcHU7XG4gIGlmICghZW5hYmxlR3B1KSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPXN3aWZ0c2hhZGVyXCIsIFwiZW5hYmxlLXVuc2FmZS1zd2lmdHNoYWRlclwiKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLnB1c2goXCJkaXNhYmxlLWdwdS1zYW5kYm94XCIsIFwiZW5hYmxlLXVuc2FmZS13ZWJncHVcIik7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgaWYgKHBsYXQgPT09IFwiZGFyd2luXCIpIHtcbiAgICAgIG9wdHMucHVzaChcInVzZS1hbmdsZT1tZXRhbFwiKTtcbiAgICB9IGVsc2UgaWYgKHBsYXQgPT09IFwid2luMzJcIikge1xuICAgICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPWQzZDExXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRzLnB1c2goXCJ1c2UtYW5nbGU9dnVsa2FuXCIsIFwiZGlzYWJsZS12dWxrYW4tc3VyZmFjZVwiKTtcbiAgICAgIGZlYXR1cmVzLnB1c2goXCJWdWxrYW5cIik7XG4gICAgfVxuICB9XG5cbiAgb3B0cy5wdXNoKGBlbmFibGUtZmVhdHVyZXM9JHtmZWF0dXJlcy5qb2luKFwiLFwiKX1gKTtcbiAgcmV0dXJuIG9wdHM7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI1LlxuXG5pbXBvcnQgZWxlY3Ryb24sIHsgdHlwZSBTaXplIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgY2hyb21pdW1PcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2UvY2hyb21pdW1cIjtcbmltcG9ydCB7IHB1cEFwcCB9IGZyb20gXCIuLi9iYXNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYywgUFVQX0FSR1NfS0VZIH0gZnJvbSBcIi4uL2Jhc2UvcHJvY2Vzc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWxlY3Ryb25PcHRzKGRpc2FibGVHcHU6IGJvb2xlYW4pIHtcbiAgcmV0dXJuIFsuLi4oYXdhaXQgY2hyb21pdW1PcHRpb25zKGRpc2FibGVHcHUpKSwgXCJoZWFkbGVzcz1uZXdcIl07XG59XG5cbmNvbnN0IFRBRyA9IFwiW0VsZWN0cm9uXVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRWxlY3Ryb25BcHAoc2l6ZTogU2l6ZSwgYXJnczogdW5rbm93bltdLCBpcGNTb2NrZXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgY21kUGFydHM6IHVua25vd25bXSA9IFtdO1xuICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgaWYgKHBsYXQgPT09IFwibGludXhcIikge1xuICAgIGNtZFBhcnRzLnB1c2goYHh2ZmItcnVuYCwgYC0tYXV0by1zZXJ2ZXJudW1gLCBgLS1zZXJ2ZXItYXJncz1cIi1zY3JlZW4gMCAke3NpemUud2lkdGh9eCR7c2l6ZS5oZWlnaHR9eDI0XCJgKTtcbiAgfVxuICBjb25zdCBvcHRzID0gYXdhaXQgZWxlY3Ryb25PcHRzKGFyZ3MuaW5jbHVkZXMoXCItLWRpc2FibGUtZ3B1XCIpKTtcbiAgY29uc3QgZWxlY3Ryb25BcmdzID0gb3B0cy5tYXAoKGEpID0+IGAtLSR7YX1gKTtcbiAgY29uc3QgYmFzZTY0QXJncyA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGFyZ3MpKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgZWxlY3Ryb25BcmdzLnB1c2goYCR7UFVQX0FSR1NfS0VZfT0ke2Jhc2U2NEFyZ3N9YCk7XG4gIGNtZFBhcnRzLnB1c2goZWxlY3Ryb24sIC4uLmVsZWN0cm9uQXJncywgcHVwQXBwKTtcbiAgY29uc3QgY21kID0gY21kUGFydHMuam9pbihcIiBcIik7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGNtZCk7XG4gIHJldHVybiBleGVjKGNtZCwge1xuICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICBzaGVsbDogcGxhdCA9PT0gXCJsaW51eFwiLFxuICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgUlVTVF9CQUNLVFJBQ0U6IFwiZnVsbFwiLCBQVVBfSVBDX1NPQ0tFVDogaXBjU29ja2V0UGF0aCB9LFxuICB9KTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDQvMDEuXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbm5lY3Rpb24sIGNyZWF0ZVNlcnZlciwgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5cbmNvbnN0IEhFQURFUl9TSVpFID0gODtcblxuZXhwb3J0IGNvbnN0IGVudW0gSXBjTXNnVHlwZSB7XG4gIFBST0dSRVNTID0gMSxcbiAgRE9ORSA9IDIsXG4gIEVSUk9SID0gMyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJcGNEb25lUGF5bG9hZCB7XG4gIHdyaXR0ZW46IG51bWJlcjtcbiAgamFuazogbnVtYmVyO1xuICBvdXRGaWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBJcGNXcml0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9zb2NrZXQ6IFNvY2tldCkge31cblxuICB3cml0ZVByb2dyZXNzKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlKElwY01zZ1R5cGUuUFJPR1JFU1MsIEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApKTtcbiAgfVxuXG4gIHdyaXRlRXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMud3JpdGUoSXBjTXNnVHlwZS5FUlJPUiwgQnVmZmVyLmZyb20oZXJyb3IpKTtcbiAgICB0aGlzLl9zb2NrZXQuZW5kKCk7XG4gIH1cblxuICB3cml0ZURvbmUocGF5bG9hZDogSXBjRG9uZVBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlKElwY01zZ1R5cGUuRE9ORSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpKTtcbiAgICB0aGlzLl9zb2NrZXQuZW5kKCk7XG4gIH1cblxuICBwcml2YXRlIHdyaXRlKHR5cGU6IElwY01zZ1R5cGUsIHBheWxvYWQ6IEJ1ZmZlcik6IHZvaWQge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYyhIRUFERVJfU0laRSk7XG4gICAgaGVhZGVyLndyaXRlVUludDMyTEUodHlwZSwgMCk7XG4gICAgaGVhZGVyLndyaXRlVUludDMyTEUocGF5bG9hZC5ieXRlTGVuZ3RoLCA0KTtcbiAgICB0aGlzLl9zb2NrZXQud3JpdGUoaGVhZGVyKTtcbiAgICB0aGlzLl9zb2NrZXQud3JpdGUocGF5bG9hZCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RJcGMoc29ja2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxJcGNXcml0ZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzb2NrZXQgPSBjcmVhdGVDb25uZWN0aW9uKHNvY2tldFBhdGgpO1xuICAgIHNvY2tldC5vbmNlKFwiY29ubmVjdFwiLCAoKSA9PiByZXNvbHZlKG5ldyBJcGNXcml0ZXIoc29ja2V0KSkpO1xuICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBJcGNSZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8e1xuICBwcm9ncmVzczogW3ZhbHVlOiBudW1iZXJdO1xuICBtZXNzYWdlOiBbdHlwZTogSXBjTXNnVHlwZSwgYnVmZmVyOiBCdWZmZXJdO1xuICBkb25lOiBbcGF5bG9hZDogSXBjRG9uZVBheWxvYWRdO1xuICBlcnJvcjogW2Vycm9yOiBFcnJvcl07XG4gIGNsb3NlOiBbXTtcbn0+IHtcbiAgcHJpdmF0ZSBfY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIF9idWZmZXJlZCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfc29ja2V0OiBTb2NrZXQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3NvY2tldC5vbihcImRhdGFcIiwgKGRhdGEpID0+IHRoaXMub25EYXRhKGRhdGEpKTtcbiAgICB0aGlzLl9zb2NrZXQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnIpKTtcbiAgICB0aGlzLl9zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB0aGlzLmVtaXQoXCJjbG9zZVwiKSk7XG4gIH1cblxuICBwcml2YXRlIG9uRGF0YShkYXRhOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaHVua3MucHVzaChkYXRhKTtcbiAgICB0aGlzLl9idWZmZXJlZCArPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5mbHVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaCgpOiB2b2lkIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWQgPCBIRUFERVJfU0laRSkgcmV0dXJuO1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5wZWVrKEhFQURFUl9TSVpFKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBoZWFkZXIucmVhZFVJbnQzMkxFKDApIGFzIElwY01zZ1R5cGU7XG4gICAgICBjb25zdCBsZW4gPSBoZWFkZXIucmVhZFVJbnQzMkxFKDQpO1xuICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkIDwgSEVBREVSX1NJWkUgKyBsZW4pIHJldHVybjtcbiAgICAgIHRoaXMuY29uc3VtZShIRUFERVJfU0laRSk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jb25zdW1lKGxlbik7XG4gICAgICB0aGlzLmVtaXQoXCJtZXNzYWdlXCIsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgSXBjTXNnVHlwZS5QUk9HUkVTUzoge1xuICAgICAgICAgIHRoaXMuZW1pdChcInByb2dyZXNzXCIsIE51bWJlcihwYXlsb2FkLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIElwY01zZ1R5cGUuRE9ORToge1xuICAgICAgICAgIHRoaXMuZW1pdChcImRvbmVcIiwgSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIElwY01zZ1R5cGUuRVJST1I6IHtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBuZXcgRXJyb3IocGF5bG9hZC50b1N0cmluZygpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBlZWsobjogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fY2h1bmtzWzBdICYmIHRoaXMuX2NodW5rc1swXS5ieXRlTGVuZ3RoID49IG4pIHJldHVybiB0aGlzLl9jaHVua3NbMF07XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQodGhpcy5fY2h1bmtzKS5zdWJhcnJheSgwLCBuKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZShuOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IG91dCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0IDwgbikge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbMF0hO1xuICAgICAgY29uc3QgdGFrZSA9IE1hdGgubWluKGNodW5rLmJ5dGVMZW5ndGgsIG4gLSBvZmZzZXQpO1xuICAgICAgY2h1bmsuY29weShvdXQsIG9mZnNldCwgMCwgdGFrZSk7XG4gICAgICBpZiAodGFrZSA9PT0gY2h1bmsuYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NodW5rc1swXSA9IGNodW5rLnN1YmFycmF5KHRha2UpO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IHRha2U7XG4gICAgfVxuICAgIHRoaXMuX2J1ZmZlcmVkIC09IG47XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElwY1NlcnZlciB7XG4gIHdhaXRGb3JDb25uZWN0aW9uKCk6IFByb21pc2U8SXBjUmVhZGVyPjtcbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlwY1NlcnZlcihzb2NrZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElwY1NlcnZlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBzZXJ2ZXIubGlzdGVuKHNvY2tldFBhdGgsICgpID0+IHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SXBjUmVhZGVyPigob2ssIG5vKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXIub25jZShcImNvbm5lY3Rpb25cIiwgKHNvY2tldCkgPT4gb2sobmV3IElwY1JlYWRlcihzb2NrZXQpKSk7XG4gICAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsIG5vKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBvayB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBybVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IG1rZGlyIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBydW5FbGVjdHJvbkFwcCB9IGZyb20gXCIuL3JlbmRlcmVyL2VsZWN0cm9uXCI7XG5pbXBvcnQgeyBjcmVhdGVJcGNTZXJ2ZXIsIHR5cGUgSXBjRG9uZVBheWxvYWQgfSBmcm9tIFwiLi9yZW5kZXJlci9pcGNcIjtcbmltcG9ydCB7IGRlZmF1bHRSZW5kZXJPcHRpb25zLCB0eXBlIFJlbmRlck9wdGlvbnMsIHR5cGUgUmVuZGVyUmVzdWx0IH0gZnJvbSBcIi4vcmVuZGVyZXIvc2NoZW1hXCI7XG5cbmNvbnN0IFRBRyA9IFwiW3B1cF1cIjtcblxuZXhwb3J0IHR5cGUgUHVwUHJvZ3Jlc3NDYWxsYmFjayA9IChwcm9ncmVzczogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBQdXBPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxSZW5kZXJPcHRpb25zPiB7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBvblByb2dyZXNzPzogUHVwUHJvZ3Jlc3NDYWxsYmFjaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXBSZXN1bHQgZXh0ZW5kcyBSZW5kZXJSZXN1bHQge31cblxuaW50ZXJmYWNlIEFwcE9wdGlvbnMgZXh0ZW5kcyBSZW5kZXJPcHRpb25zIHtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blB1cEFwcChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogQXBwT3B0aW9ucywgc29ja2V0UGF0aDogc3RyaW5nKSB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGBydW5QdXBBcHBgLCBzb3VyY2UsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW1xuICAgIHNvdXJjZSxcbiAgICBgLS13aWR0aGAsXG4gICAgYCR7b3B0aW9ucy53aWR0aH1gLFxuICAgIGAtLWhlaWdodGAsXG4gICAgYCR7b3B0aW9ucy5oZWlnaHR9YCxcbiAgICBgLS1mcHNgLFxuICAgIGAke29wdGlvbnMuZnBzfWAsXG4gICAgYC0tZHVyYXRpb25gLFxuICAgIGAke29wdGlvbnMuZHVyYXRpb259YCxcbiAgICBgLS1vdXQtZmlsZWAsXG4gICAgYCR7b3B0aW9ucy5vdXRGaWxlfWAsXG4gIF07XG4gIGlmIChvcHRpb25zLndpdGhBdWRpbykgYXJncy5wdXNoKGAtLXdpdGgtYXVkaW9gKTtcbiAgaWYgKG9wdGlvbnMudXNlSW5uZXJQcm94eSkgYXJncy5wdXNoKGAtLXVzZS1pbm5lci1wcm94eWApO1xuICBpZiAob3B0aW9ucy5kZXRlcm1pbmlzdGljKSBhcmdzLnB1c2goYC0tZGV0ZXJtaW5pc3RpY2ApO1xuICBpZiAob3B0aW9ucy5kaXNhYmxlR3B1KSBhcmdzLnB1c2goYC0tZGlzYWJsZS1ncHVgKTtcbiAgaWYgKG9wdGlvbnMuZGlzYWJsZUh3Q29kZWMpIGFyZ3MucHVzaChgLS1kaXNhYmxlLWh3LWNvZGVjYCk7XG4gIGlmIChvcHRpb25zLndpbmRvd1RvbGVyYW50KSBhcmdzLnB1c2goYC0td2luZG93LXRvbGVyYW50YCk7XG5cbiAgcmV0dXJuIHJ1bkVsZWN0cm9uQXBwKG9wdGlvbnMsIGFyZ3MsIHNvY2tldFBhdGgpO1xufVxuXG5jb25zdCBkID0gZGVmYXVsdFJlbmRlck9wdGlvbnM7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8UHVwT3B0aW9ucz4pOiBQcm9taXNlPFB1cFJlc3VsdD4ge1xuICBsb2dnZXIuZGVidWcoVEFHLCBgcHVwYCwgc291cmNlLCBvcHRpb25zKTtcblxuICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGNvbnN0IG91dEZpbGUgPSBvcHRpb25zLm91dEZpbGUgPz8gZC5vdXRGaWxlO1xuICBjb25zdCByZW5kZXJPcHRzOiBSZW5kZXJPcHRpb25zID0ge1xuICAgIHdpZHRoOiBvcHRpb25zLndpZHRoID8/IGQud2lkdGgsXG4gICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCA/PyBkLmhlaWdodCxcbiAgICBmcHM6IG9wdGlvbnMuZnBzID8/IGQuZnBzLFxuICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uID8/IGQuZHVyYXRpb24sXG4gICAgd2l0aEF1ZGlvOiBvcHRpb25zLndpdGhBdWRpbyA/PyBkLndpdGhBdWRpbyxcbiAgICB1c2VJbm5lclByb3h5OiBvcHRpb25zLnVzZUlubmVyUHJveHkgPz8gZC51c2VJbm5lclByb3h5LFxuICAgIGRldGVybWluaXN0aWM6IG9wdGlvbnMuZGV0ZXJtaW5pc3RpYyA/PyBkLmRldGVybWluaXN0aWMsXG4gICAgZGlzYWJsZUdwdTogb3B0aW9ucy5kaXNhYmxlR3B1ID8/IGQuZGlzYWJsZUdwdSxcbiAgICBkaXNhYmxlSHdDb2RlYzogb3B0aW9ucy5kaXNhYmxlSHdDb2RlYyA/PyBkLmRpc2FibGVId0NvZGVjLFxuICAgIHdpbmRvd1RvbGVyYW50OiBvcHRpb25zLndpbmRvd1RvbGVyYW50ID8/IGQud2luZG93VG9sZXJhbnQsXG4gICAgb3V0RmlsZSxcbiAgfTtcblxuICBjb25zdCB0bXBEaXIgPSBqb2luKHRtcGRpcigpLCBcInB1cFwiLCByYW5kb21VVUlEKCkpO1xuICBhd2FpdCBta2Rpcih0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBzb2NrZXRQYXRoID0gam9pbih0bXBEaXIsIFwicHVwLnNvY2tcIik7XG5cbiAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgdGljayA9IChwOiBudW1iZXIpID0+IChsb2dnZXIuaW5mbyhUQUcsIGAke3NvdXJjZX0gcHJvZ3Jlc3M6ICR7cH0lYCksIG9wdGlvbnMub25Qcm9ncmVzcz8uKHApKTtcblxuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVJcGNTZXJ2ZXIoc29ja2V0UGF0aCk7XG4gIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHJ1blB1cEFwcChzb3VyY2UsIHsgLi4ucmVuZGVyT3B0cywgc2lnbmFsIH0sIHNvY2tldFBhdGgpO1xuXG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBcImFib3J0XCIsXG4gICAgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmRlYnVnKFRBRywgYGFib3J0ZWRgKTtcbiAgICAgIGhhbmRsZS5raWxsKCk7XG4gICAgICBybVN5bmModG1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSxcbiAgICB7IG9uY2U6IHRydWUgfSxcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPElwY0RvbmVQYXlsb2FkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXdhaXQgc2VydmVyLndhaXRGb3JDb25uZWN0aW9uKCkpXG4gICAgICAgIC5vbihcImNsb3NlXCIsICgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJJUEMgY2xvc2VkIHdpdGhvdXQgcmVzdWx0XCIpKSlcbiAgICAgICAgLm9uKFwibWVzc2FnZVwiLCAoKSA9PiBzaWduYWw/LmFib3J0ZWQgJiYgcmVqZWN0KHNpZ25hbC5yZWFzb24pKVxuICAgICAgICAub24oXCJwcm9ncmVzc1wiLCB0aWNrKVxuICAgICAgICAub24oXCJkb25lXCIsIHJlc29sdmUpXG4gICAgICAgIC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgfSkuZmluYWxseSgoKSA9PiBzZXJ2ZXIuY2xvc2UoKSk7XG4gICAgdGljaygwKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXN1bHQsIGhhbmRsZS53YWl0XSk7XG4gICAgb2soc3VtbWFyeSwgXCJubyBzdW1tYXJ5IHJlY2VpdmVkXCIpO1xuICAgIHRpY2soMTAwKTtcbiAgICBsb2dnZXIuaW5mbyhUQUcsIGBkb25lICR7b3V0RmlsZX0gaW4gJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpIC0gdDApfW1zYCk7XG4gICAgcmV0dXJuIHsgLi4uc3VtbWFyeSwgb3B0aW9uczogcmVuZGVyT3B0cyB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRocm93IGU7XG4gIH0gZmluYWxseSB7XG4gICAgcm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG4iXX0=